You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by dm...@apache.org on 2022/08/11 17:58:23 UTC

[trafficserver] branch 10-Dev updated: Remove traffic_manager and related code. (#8633)

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

dmeden pushed a commit to branch 10-Dev
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/10-Dev by this push:
     new 8524cda16 Remove traffic_manager and related code. (#8633)
8524cda16 is described below

commit 8524cda16a7e70a77df1e844d973d270bfb91bb1
Author: Damian Meden <dm...@apache.org>
AuthorDate: Thu Aug 11 14:58:16 2022 -0300

    Remove traffic_manager and related code. (#8633)
    
    * BREAKING: traffic_manager removal. Removing code related to:
    traffic_manager binary.
    records syncronization between TS running as client and TM running as server.
    deprecated functions, ie: mgmt_log
    legacy RPC mechanism, LocalManager, ProcessManager.
    
    Remove usage of traffic_manager from some unit tests. I had to make some
    adjustments to the way some of the tests "when" clauses were used. TS ready
    now uses the default “when” clause(FileContains) which is also checking the
     existence of the file, the latest is what was used in this test.
    
    TM removal: Remove some records used by TM and note in the docs that they are now deprecated.
    
    TM removal: Work the docs so they reflect that TM is no longer supported. This commit
    also includes some changes in the Records config file.
    
    TM Removal: Rename new traffic_ctl to the new folder(same as before). Ammend makefiles
    to just build the new version.
    
    TM: Removal. Merge mgmt2 and mgmt folders. Use the best from each folder and compile them into a single mgmt folder.
    mgmt2 was used to keep track of all new RPC code including things that can be reuse from the old mgmt folder, now with
    the clean up for the original folder we can just put the leftovers together.
    This also add some notes into some documentation.
    
    TM Removal: Remove Signal,Event and Alarms header files. This is a second part of the removal of the code related to events and alarms.
    
    TM Removal: remove Admin perl module.
    
    TM removal: Fix doc issues and missing include. Fix build issue
    
    Fix not literal string issue
    
    * Update unit test after merge from master: Use traffic_server instead of traffic_manager.
    
    * Mark legacy records as deprecated
    
    * Fix bsd build crash: Add include for unordered_map
    
    * Fix trafficserver.ext: Fix rebase issue, it looks like I was missing the
    ts args from the command line. Fixed now.
---
 .vscode/launch.json                                |   19 -
 CMakeLists.txt                                     |    1 -
 Makefile.am                                        |    3 +-
 README                                             |    5 +-
 ci/jenkins/ats_conf.pl                             |    1 -
 configure.ac                                       |   17 +-
 contrib/install_trafficserver.sh                   |    1 -
 doc/admin-guide/files/records.config.en.rst        |   73 +-
 doc/admin-guide/installation/index.en.rst          |    2 +-
 doc/admin-guide/introduction.en.rst                |   24 +-
 doc/admin-guide/logging/understanding.en.rst       |    3 +-
 doc/admin-guide/monitoring/error-messages.en.rst   |    5 -
 .../monitoring/statistics/core/general.en.rst      |   12 +-
 doc/admin-guide/security/index.en.rst              |    4 +-
 doc/appendices/command-line/traffic_ctl.en.rst     |  380 +++++--
 .../command-line/traffic_ctl_jsonrpc.en.rst        |  608 -----------
 doc/appendices/command-line/traffic_layout.en.rst  |   12 +-
 doc/appendices/command-line/traffic_manager.en.rst |   60 +-
 doc/appendices/command-line/traffic_server.en.rst  |   11 -
 doc/appendices/faq.en.rst                          |   33 +-
 doc/developer-guide/api/types/TSMgmtTypes.en.rst   |    4 +
 .../api/types/TSRecordUpdateType.en.rst            |    2 +-
 doc/developer-guide/config-vars.en.rst             |    2 +-
 doc/developer-guide/core-architecture/index.en.rst |    1 -
 doc/developer-guide/core-architecture/rpc.en.rst   |  279 -----
 .../introduction/header-file-structure.en.rst      |    6 +-
 .../jsonrpc/jsonrpc-architecture.en.rst            |    4 +-
 doc/developer-guide/layout/runroot.en.rst          |    2 +-
 doc/manpages.py                                    |    2 -
 include/shared/rpc/README.md                       |    2 +-
 include/ts/experimental.h                          |    1 +
 include/tscore/DiagsTypes.h                        |    2 +-
 iocore/cache/Cache.cc                              |    2 -
 iocore/cache/CacheHosting.cc                       |   43 +-
 iocore/cache/Store.cc                              |    1 -
 iocore/hostdb/HostDB.cc                            |    1 +
 iocore/net/P_SSLCertLookup.h                       |    2 +
 iocore/net/P_UnixNet.h                             |    7 +-
 iocore/net/SSLUtils.cc                             |    3 +-
 iocore/net/libinknet_stub.cc                       |   24 -
 iocore/net/test_certlookup.cc                      |   10 +-
 lib/perl/MANIFEST                                  |    2 -
 lib/perl/README                                    |    3 -
 lib/perl/lib/Apache/TS.pm.in                       |   12 +-
 lib/perl/lib/Apache/TS/AdminClient.pm              |  625 -----------
 lib/perl/t/Apache-TS-AdminClient.t                 |   35 -
 lib/records/I_RecAlarms.h                          |   37 -
 lib/records/I_RecCore.h                            |   25 -
 lib/records/I_RecDefs.h                            |    4 +-
 lib/records/I_RecEvents.h                          |   37 -
 lib/records/I_RecSignals.h                         |   41 -
 lib/records/Makefile.am                            |   11 +-
 lib/records/P_RecCore.cc                           |  277 +----
 lib/records/P_RecCore.h                            |    4 -
 lib/records/P_RecLocal.h                           |    2 -
 lib/records/P_RecMessage.h                         |    2 -
 lib/records/RecCore.cc                             |   16 -
 lib/records/RecLocal.cc                            |  214 ----
 lib/records/RecMessage.cc                          |   11 -
 lib/records/RecProcess.cc                          |   86 +-
 lib/records/RecRawStats.cc                         |    2 -
 lib/records/test_I_RecLocal.cc                     |    1 -
 lib/records/test_RecProcess.i                      |    2 -
 mgmt/Alarms.cc                                     |  391 -------
 mgmt/Alarms.h                                      |  103 --
 mgmt/BaseManager.cc                                |   83 --
 mgmt/BaseManager.h                                 |  145 ---
 mgmt/ConfigManager.cc                              |  127 ---
 mgmt/ConfigManager.h                               |  132 ---
 mgmt/DerivativeMetrics.cc                          |    2 +-
 mgmt/DerivativeMetrics.h                           |    3 +-
 mgmt/FileManager.cc                                |  265 -----
 mgmt/FileManager.h                                 |  101 --
 mgmt/LocalManager.cc                               | 1124 --------------------
 mgmt/LocalManager.h                                |  141 ---
 mgmt/Makefile.am                                   |   29 +-
 mgmt/MgmtDefs.h                                    |   11 -
 mgmt/ProcessManager.cc                             |  512 ---------
 mgmt/ProcessManager.h                              |  115 --
 mgmt/ProxyConfig.h                                 |   13 -
 mgmt/RecordsConfig.cc                              |   55 +-
 mgmt/WebMgmtUtils.cc                               |  670 ------------
 mgmt/WebMgmtUtils.h                                |   33 -
 mgmt/api/APITestCliRemote.cc                       | 1026 ------------------
 mgmt/api/CoreAPI.cc                                |  924 ----------------
 mgmt/api/CoreAPI.h                                 |   87 --
 mgmt/api/CoreAPIRemote.cc                          | 1071 -------------------
 mgmt/api/CoreAPIShared.cc                          |   85 --
 mgmt/api/CoreAPIShared.h                           |   28 -
 mgmt/api/EventCallback.cc                          |  348 ------
 mgmt/api/EventCallback.h                           |   78 --
 mgmt/api/EventControlMain.cc                       |  549 ----------
 mgmt/api/EventControlMain.h                        |   57 -
 mgmt/api/INKMgmtAPI.cc                             |  794 +-------------
 mgmt/api/Makefile.am                               |   48 +-
 mgmt/api/NetworkMessage.cc                         |  372 -------
 mgmt/api/NetworkMessage.h                          |   94 --
 mgmt/api/NetworkUtilsLocal.cc                      |   77 --
 mgmt/api/NetworkUtilsLocal.h                       |   32 -
 mgmt/api/NetworkUtilsRemote.cc                     |  719 -------------
 mgmt/api/NetworkUtilsRemote.h                      |   95 --
 mgmt/api/TSControlMain.cc                          | 1091 -------------------
 mgmt/api/TSControlMain.h                           |   42 -
 mgmt/api/include/mgmtapi.h                         |  249 -----
 {mgmt2 => mgmt}/config/AddConfigFilesHere.cc       |    0
 {mgmt2 => mgmt}/config/FileManager.cc              |    1 -
 {mgmt2 => mgmt}/config/FileManager.h               |    0
 {mgmt2 => mgmt}/config/Makefile.am                 |    1 -
 {mgmt2 => mgmt}/rpc/Makefile.am                    |    2 +-
 {mgmt2 => mgmt}/rpc/config/JsonRPCConfig.cc        |    0
 {mgmt2 => mgmt}/rpc/config/JsonRPCConfig.h         |    0
 {mgmt2 => mgmt}/rpc/handlers/common/ErrorUtils.h   |    0
 .../rpc/handlers/common/RecordsUtils.cc            |    0
 {mgmt2 => mgmt}/rpc/handlers/common/RecordsUtils.h |    0
 {mgmt2 => mgmt}/rpc/handlers/common/Utils.h        |    0
 {mgmt2 => mgmt}/rpc/handlers/common/convert.h      |    0
 .../rpc/handlers/config/Configuration.cc           |    0
 .../rpc/handlers/config/Configuration.h            |    0
 {mgmt2 => mgmt}/rpc/handlers/plugins/Plugins.cc    |    0
 {mgmt2 => mgmt}/rpc/handlers/plugins/Plugins.h     |    0
 {mgmt2 => mgmt}/rpc/handlers/records/Records.cc    |    0
 {mgmt2 => mgmt}/rpc/handlers/records/Records.h     |    0
 {mgmt2 => mgmt}/rpc/handlers/server/Server.cc      |    0
 {mgmt2 => mgmt}/rpc/handlers/server/Server.h       |    0
 {mgmt2 => mgmt}/rpc/handlers/storage/Storage.cc    |    0
 {mgmt2 => mgmt}/rpc/handlers/storage/Storage.h     |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/Context.cc             |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/Context.h              |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/Defs.h                 |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/JsonRPC.h              |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/JsonRPCManager.cc      |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/JsonRPCManager.h       |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/error/RPCError.cc      |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/error/RPCError.h       |    0
 {mgmt2 => mgmt}/rpc/jsonrpc/json/YAMLCodec.h       |    0
 .../rpc/jsonrpc/unit_tests/test_basic_protocol.cc  |    0
 .../rpc/jsonrpc/unit_tests/unit_test_main.cc       |    0
 .../schema/admin_lookup_records_params_schema.json |    0
 .../rpc/schema/jsonrpc_request_schema.json         |    0
 .../rpc/schema/jsonrpc_response_schema.json        |    0
 .../rpc/schema/success_response_schema.json        |    0
 {mgmt2 => mgmt}/rpc/server/CommBase.cc             |    0
 {mgmt2 => mgmt}/rpc/server/CommBase.h              |    0
 {mgmt2 => mgmt}/rpc/server/IPCSocketServer.cc      |    0
 {mgmt2 => mgmt}/rpc/server/IPCSocketServer.h       |    0
 {mgmt2 => mgmt}/rpc/server/RPCServer.cc            |    0
 {mgmt2 => mgmt}/rpc/server/RPCServer.h             |    0
 .../rpc/server/unit_tests/test_rpcserver.cc        |    0
 .../rpc/server/unit_tests/unit_test_main.cc        |    0
 mgmt/utils/Makefile.am                             |   11 +-
 mgmt/utils/MgmtLocalCleanup.cc                     |   33 -
 mgmt/utils/MgmtMarshall.cc                         |  532 ---------
 mgmt/utils/MgmtMarshall.h                          |   77 --
 mgmt/utils/MgmtProcessCleanup.cc                   |   30 -
 mgmt/utils/MgmtUtils.cc                            |  116 +-
 mgmt/utils/MgmtUtils.h                             |    6 -
 mgmt/utils/unit_tests/test_marshall.cc             |  353 ------
 proxy/ControlMatcher.cc                            |    5 +-
 proxy/ControlMatcher.h                             |    8 -
 proxy/IPAllow.cc                                   |    1 -
 proxy/ParentSelection.cc                           |    3 +-
 proxy/hdrs/HdrTSOnly.cc                            |    9 +-
 proxy/http/HttpConfig.cc                           |    1 -
 proxy/http/remap/NextHopSelectionStrategy.h        |    1 +
 proxy/http/remap/RemapConfig.cc                    |    5 +-
 proxy/http/remap/UrlRewrite.cc                     |    3 -
 proxy/http2/Http2CommonSession.h                   |    2 +
 proxy/logging/Log.cc                               |    4 +-
 proxy/logging/LogConfig.cc                         |   20 -
 proxy/logging/LogConfig.h                          |    1 -
 proxy/logging/LogFile.cc                           |    1 -
 proxy/logging/LogObject.cc                         |    5 -
 proxy/logging/LogStandalone.cc                     |   17 +-
 proxy/logging/LogUtils.cc                          |   42 -
 proxy/logging/LogUtils.h                           |    1 -
 proxy/logging/unit-tests/test_LogUtils.cc          |    6 -
 proxy/logging/unit-tests/test_RolledLogDeleter.cc  |   11 +-
 rc/trafficserver.xml.in                            |    6 -
 src/Makefile.am                                    |    7 -
 src/traffic_crashlog/Makefile.inc                  |    1 -
 .../CtrlCommands.cc                                |    0
 .../CtrlCommands.h                                 |    0
 .../CtrlPrinters.cc                                |    0
 .../CtrlPrinters.h                                 |    0
 src/traffic_ctl/Makefile.inc                       |   38 +-
 .../PrintUtils.h                                   |    2 +-
 src/traffic_ctl/alarm.cc                           |  108 --
 src/traffic_ctl/config.cc                          |  463 --------
 src/traffic_ctl/host.cc                            |  120 ---
 .../jsonrpc/CtrlRPCRequests.h                      |    0
 .../jsonrpc/ctrl_yaml_codecs.h                     |    0
 src/traffic_ctl/metric.cc                          |   95 --
 src/traffic_ctl/plugin.cc                          |   43 -
 src/traffic_ctl/server.cc                          |  136 ---
 src/traffic_ctl/storage.cc                         |   40 -
 src/traffic_ctl/traffic_ctl.cc                     |  322 ++----
 src/traffic_ctl/traffic_ctl.h                      |  220 ----
 src/traffic_ctl_jsonrpc/Makefile.inc               |   37 -
 src/traffic_ctl_jsonrpc/traffic_ctl.cc             |  195 ----
 src/traffic_layout/file_system.cc                  |   14 +-
 src/traffic_manager/AddConfigFilesHere.cc          |   97 --
 src/traffic_manager/Makefile.inc                   |   61 --
 src/traffic_manager/traffic_manager.cc             | 1096 -------------------
 src/traffic_server/EventName.cc                    |   98 +-
 src/traffic_server/HostStatus.cc                   |    1 -
 src/traffic_server/InkAPI.cc                       |   20 +-
 src/traffic_server/Makefile.inc                    |    9 +-
 src/traffic_server/traffic_server.cc               |  168 +--
 src/traffic_via/traffic_via.cc                     |   23 +-
 src/tscore/BaseLogFile.cc                          |    4 +-
 .../gold_tests/autest-site/trafficserver.test.ext  |   34 +-
 tests/gold_tests/basic/basic-manager.test.py       |   33 -
 .../gold_tests/jsonrpc/jsonrpc_api_schema.test.py  |    2 +-
 tests/gold_tests/logging/log-filenames.test.py     |   52 +-
 tests/gold_tests/logging/sigusr2.test.py           |   45 +-
 .../pluginTest/lua/lua_debug_tags.test.py          |    2 +-
 .../regex_revalidate_state.test.py                 |    2 +-
 .../remap_stats/remap_stats_post.test.py           |    2 +-
 tests/gold_tests/remap/remap_reload.test.py        |    2 +-
 tests/gold_tests/runroot/runroot_manager.test.py   |   54 -
 220 files changed, 668 insertions(+), 19336 deletions(-)

diff --git a/.vscode/launch.json b/.vscode/launch.json
index bebac7250..8117283bb 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -19,25 +19,6 @@
                     "ignoreFailures": true
                 }
             ]
-        },
-        {
-            "name": "(gdb) traffic_manager",
-            "type": "cppdbg",
-            "request": "launch",
-            "program": "${workspaceFolder}/${env:ATS_VSCODE_BUILDDIR}/src/traffic_manager/.libs/traffic_manager",
-            "args": [],
-            "stopAtEntry": false,
-            "cwd": "${workspaceFolder}",
-            "environment": [],
-            "externalConsole": false,
-            "MIMode": "gdb",
-            "setupCommands": [
-                {
-                    "description": "Enable pretty-printing for gdb",
-                    "text": "-enable-pretty-printing",
-                    "ignoreFailures": true
-                }
-            ]
         }
     ]
 }
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 918ff24e1..76a45a113 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -72,7 +72,6 @@ CC_EXEC(traffic_ctl src/traffic_ctl)
 CC_EXEC(traffic_layout src/traffic_layout)
 CC_EXEC(traffic_logcat src/traffic_logcat)
 CC_EXEC(traffic_logstats src/traffic_logstats)
-CC_EXEC(traffic_manager src/traffic_manager)
 CC_EXEC(traffic_server src/traffic_server)
 target_sources(traffic_server PRIVATE src/shared/overridable_txn_vars.cc)
 CC_EXEC(traffic_top src/traffic_top)
diff --git a/Makefile.am b/Makefile.am
index 7ead576fc..219c3d6d7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -27,7 +27,7 @@ export CCACHE_BASEDIR
 # and mgmt, hence we have to build proxy/hdrs first.
 
 # depends on the generates ts/ts.h include file.
-SUBDIRS = include src/tscpp/util lib src/tscore iocore proxy mgmt mgmt2 src plugins tools example rc configs tests
+SUBDIRS = include src/tscpp/util lib src/tscore iocore proxy mgmt src plugins tools example rc configs tests
 
 if BUILD_DOCS
 SUBDIRS += doc include
@@ -156,7 +156,6 @@ clang-format-lib:
 
 clang-format-mgmt:
 	@$(top_srcdir)/tools/clang-format.sh $(top_srcdir)/mgmt
-	@$(top_srcdir)/tools/clang-format.sh $(top_srcdir)/mgmt2
 
 clang-format-plugins:
 	@$(top_srcdir)/tools/clang-format.sh $(top_srcdir)/plugins
diff --git a/README b/README
index dee536d71..82a6f05cd 100644
--- a/README
+++ b/README
@@ -29,10 +29,10 @@ plugins to build large scale web applications.
           |-- quic/ ......... QUIC implementation
       |-- utils/ ............ Utilities
   |-- lib/ ..................
-      |-- perl/ ............. Perl libraries for e.g. mgmt access and configurations
+      |-- perl/ ............. Perl libraries for configurations
       |-- records/ .......... Library for config files
       |-- yamlcpp/ .......... Library for YAML of C++
-  |-- mgmt/ ................. Management server and tools
+  |-- mgmt/ ................. JSONRPC server/management and tools
   |-- plugins/ .............. Stable core plugins
       |-- experimental/ ..... Experimental core plugins
   |-- proxy/ ................ HTTP proxy logic
@@ -50,7 +50,6 @@ plugins to build large scale web applications.
       |-- traffic_layout/ ... Display information on the build and runtime directory structure
       |-- traffic_logcat/ ... Convert binary log file to plain text
       |-- traffic_logstats/ . Log parsing and metrics calculation utility
-      |-- traffic_manager/ .. The manager process for Traffic Server
       |-- traffic_server/ ... Main proxy server
       |-- traffic_top/ ...... Top like tool for viewing Traffic Server statistics
       |-- traffic_via/ ...... Tool for decoding the Traffic Server Via header codes
diff --git a/ci/jenkins/ats_conf.pl b/ci/jenkins/ats_conf.pl
index 38c73093e..2d5599b40 100755
--- a/ci/jenkins/ats_conf.pl
+++ b/ci/jenkins/ats_conf.pl
@@ -27,7 +27,6 @@ my $recedit = new Apache::TS::Config::Records(file => "etc/trafficserver/records
 
 $recedit->append(line => "");
 $recedit->append(line => "# My local stuff");
-$recedit->append(line => "CONFIG proxy.config.proxy_binary_opts STRING -M --disable_freelist");
 #$recedit->append(line => "CONFIG proxy.config.crash_log_helper STRING /home/admin/bin/invoker_wrap.sh");
 
 # Port setup
diff --git a/configure.ac b/configure.ac
index cedeadaef..acecbf0eb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -554,18 +554,6 @@ AC_ARG_ENABLE([example-plugins],
 AC_MSG_RESULT([$enable_example_plugins])
 AM_CONDITIONAL([BUILD_EXAMPLE_PLUGINS], [ test "x${enable_example_plugins}" = "xyes" ])
 
-#
-# JSONRPC 2.0  build options.
-#
-AC_MSG_CHECKING([whether to build & install non jsonrpc traffic_ctl])
-AC_ARG_ENABLE([legacy-traffic_ctl],
-  [AS_HELP_STRING([--enable-legacy-traffic_ctl],[build and install legacy traffic_ctl. No jsonrpc will be supported through traffic_ctl])],
-  [],
-  [enable_legacy_tc=no]
-)
-AC_MSG_RESULT([$enable_legacy_tc])
-AM_CONDITIONAL([BUILD_LEGACY_TC], [ test "x${enable_legacy_tc}" = "xyes" ])
-
 #
 # Test tools. The test tools are always built, but not always installed. Installing
 # them is useful for QA, but not useful for most users, so we default this to disabled.
@@ -2338,10 +2326,9 @@ AC_CONFIG_FILES([
   mgmt/api/Makefile
   mgmt/api/include/Makefile
   mgmt/utils/Makefile
+  mgmt/rpc/Makefile
+  mgmt/config/Makefile
   plugins/Makefile
-  mgmt2/Makefile
-  mgmt2/rpc/Makefile
-  mgmt2/config/Makefile
   proxy/Makefile
   proxy/hdrs/Makefile
   proxy/http/Makefile
diff --git a/contrib/install_trafficserver.sh b/contrib/install_trafficserver.sh
index 528ccf859..8da53cd49 100644
--- a/contrib/install_trafficserver.sh
+++ b/contrib/install_trafficserver.sh
@@ -66,7 +66,6 @@ SLACKWARE="slackware"
 
 function killAll() {
     killall traffic_cop
-    killall traffic_manager
     killall traffic_server
 }
 
diff --git a/doc/admin-guide/files/records.config.en.rst b/doc/admin-guide/files/records.config.en.rst
index 881b9ec71..23500c422 100644
--- a/doc/admin-guide/files/records.config.en.rst
+++ b/doc/admin-guide/files/records.config.en.rst
@@ -152,7 +152,7 @@ not be affected by future configuration changes made in
 For example, we could override the `proxy.config.product_company`_ variable
 like this::
 
-   $ PROXY_CONFIG_PRODUCT_COMPANY=example traffic_manager &
+   $ PROXY_CONFIG_PRODUCT_COMPANY=example traffic_server &
    $ traffic_ctl config get proxy.config.product_company
 
 .. _configuration-variables:
@@ -189,25 +189,21 @@ System Variables
 
 .. ts:cv:: CONFIG proxy.config.proxy_binary STRING traffic_server
 
-   The name of the executable that runs the :program:`traffic_server` process.
+ .. important::
 
-   If you want to set Environment Variables for :program:`traffic_server` process, use a wrapper script like below. ::
-
-     CONFIG proxy.config.proxy_binary STRING start_traffic_server.sh
-
-   ::
-
-     #!/bin/sh
-     export ASAN_OPTIONS=detect_leaks=1
-     /opt/ats/bin/traffic_server "$@"
+      This is now deprecated. traffic_manager is no longer supported.
 
 .. ts:cv:: CONFIG proxy.config.proxy_binary_opts STRING -M
 
-   The :ref:`command-line options <traffic_server>` for starting |TS|.
+   .. important::
+
+      This is now deprecated
 
 .. ts:cv:: CONFIG proxy.config.manager_binary STRING traffic_manager
 
-   The name of the executable that runs the :program:`traffic_manager` process.
+   .. important::
+
+      This is now deprecated. traffic_manager is no longer supported.
 
 .. ts:cv:: CONFIG proxy.config.memory.max_usage INT 0
    :units: bytes
@@ -217,8 +213,9 @@ System Variables
 
 .. ts:cv:: CONFIG proxy.config.env_prep STRING
 
-   The script executed before the :program:`traffic_manager` process spawns
-   the :program:`traffic_server` process.
+   .. important::
+
+      This is now deprecated. traffic_manager is no longer supported.
 
 .. ts:cv:: CONFIG proxy.config.syslog_facility STRING LOG_DAEMON
 
@@ -231,7 +228,7 @@ System Variables
 
    This is used for log rolling configuration so |TS| knows the path of the
    output file that should be rolled. This configuration takes the name of the
-   file receiving :program:`traffic_server` and :program:`traffic_manager`
+   file receiving :program:`traffic_server`
    process output that is set via the ``--bind_stdout`` and ``--bind_stderr``
    :ref:`command-line options <traffic_server>`.
    :ts:cv:`proxy.config.output.logfile` is used only to identify the name of
@@ -389,8 +386,9 @@ Thread Variables
 .. ts:cv:: CONFIG proxy.config.restart.active_client_threshold INT 0
    :reloadable:
 
-   This setting specifies the number of active client connections
-   for use by :option:`traffic_ctl server restart --drain`.
+   .. important::
+
+      Deprecated. traffic_manager is no longer supported.
 
 .. ts:cv:: CONFIG proxy.config.restart.stop_listening INT 0
    :reloadable:
@@ -556,16 +554,14 @@ Network
 
    When we trigger a throttling scenario, this how long our accept() are delayed.
 
-Local Manager
-=============
+Management
+==========
 
 .. ts:cv:: CONFIG proxy.node.config.manager_log_filename STRING manager.log
 
-   The name of the file to which :program:`traffic_manager` logs will be emitted.
-
-   If this is set to ``stdout`` or ``stderr``, then all :program:`traffic_manager`
-   logging will go to the stdout or stderr stream, respectively.
+   .. important::
 
+      This is now deprecated. traffic_manager is no longer supported.
 
 .. ts:cv:: CONFIG proxy.config.admin.user_id STRING nobody
 
@@ -591,31 +587,8 @@ Local Manager
 
 .. ts:cv:: CONFIG proxy.config.admin.api.restricted INT 0
 
-   This setting specifies whether the management API should be restricted to
-   root processes. If this is set to ``0``, then on platforms that support
-   passing process credentials, non-root processes will be allowed to make
-   read-only management API calls. Any management API calls that modify server
-   state (eg. setting a configuration variable) will still be restricted to
-   root processes.
-
-   This setting is not reloadable, since it is must be applied when
-   :program:`traffic_manager` initializes.
-
-.. ts:cv:: CONFIG proxy.node.config.manager_exponential_sleep_ceiling INT 60
-
-   In case of :program:`traffic_manager` is unable to start :program:`traffic_server`,
-   this setting specifies the maximum amount of seconds that the :program:`traffic_manager`
-   process should wait until it tries again to restart :program:`traffic_server`.
-   In case of :program:`traffic_manager` failing to start :program:`traffic_server`, it will
-   retry exponentially until it reaches the ceiling time.
-
-.. ts:cv:: CONFIG proxy.node.config.manager_retry_cap INT 5
-
-   This setting specifies the number of times that :program:`traffic_manager` will retry
-   to restart :program:`traffic_server` once the  maximum ceiling time is reached.
-
-.. note::
-   If set to ``0``, no cap will take place.
+   This is now deprecated, please refer to :ref:`admin-jsonrpc-configuration` to find
+   out about the new admin API mechanism.
 
 Alarm Configuration
 ===================
@@ -4654,7 +4627,7 @@ SOCKS Processor
 
    Enables (1) or disables (0) the SOCKS proxy option. As a SOCKS
    proxy, |TS| receives SOCKS traffic (usually on port
-   1080) and forwards all requests directly to the SOCKS server.
+   1)    and forwards all requests directly to the SOCKS server.
 
 .. ts:cv::  CONFIG proxy.config.socks.accept_port INT 1080
 
diff --git a/doc/admin-guide/installation/index.en.rst b/doc/admin-guide/installation/index.en.rst
index fed6f8a45..20dce5c22 100644
--- a/doc/admin-guide/installation/index.en.rst
+++ b/doc/admin-guide/installation/index.en.rst
@@ -226,7 +226,7 @@ Stop Traffic Server
 
 To stop Traffic Server, always use the :program:`trafficserver` command,
 passing in the attribute ``stop``. This command stops all the Traffic
-Server processes (:program:`traffic_manager` and :program:`traffic_server`).
+Server processes (:program:`traffic_server`).
 Do not manually stop processes, as this can lead to unpredictable results. ::
 
     bin/trafficserver stop
diff --git a/doc/admin-guide/introduction.en.rst b/doc/admin-guide/introduction.en.rst
index 25d5c79f3..c988ba18a 100644
--- a/doc/admin-guide/introduction.en.rst
+++ b/doc/admin-guide/introduction.en.rst
@@ -165,28 +165,14 @@ bindings in memory, DNS traffic is reduced.
 |TS| Processes
 --------------
 
-|TS| contains two processes that work together to serve
-requests and manage, control, and monitor the health of the system.
+|TS| contains a single processes to serve requests, manage administrative
+calls(JSONRPC) and handle configuration.
 
 #. The :program:`traffic_server` process is the transaction processing engine
    of |TS|. It is responsible for accepting connections,
    processing protocol requests, and serving documents from the cache or
    origin server.
 
-#. The :program:`traffic_manager` process is the command and control facility
-   of the |TS|, responsible for launching, monitoring, and
-   reconfiguring the :program:`traffic_server` process. The :program:`traffic_manager`
-   process is also responsible for the proxy autoconfiguration port, the
-   statistics interface, and virtual IP failover.
-
-   If the :program:`traffic_manager` process detects a :program:`traffic_server`
-   process failure, it instantly restarts the process but also maintains
-   a connection queue of all incoming requests. All incoming connections
-   that arrive in the several seconds before full server restart are
-   saved in the connection queue and processed in first-come,
-   first-served order. This connection queueing shields users from any
-   server restart downtime.
-
 Administration Tools
 --------------------
 
@@ -201,9 +187,9 @@ Administration Tools
    changes you make through :program:`traffic_ctl` are
    automatically made to the configuration files as well.
 
--  Finally, there is a clean C API which can be put to good use from a
-   multitude of languages. The |TS| Admin Client demonstrates
-   this for Perl.
+-  Finally, there is a JSONRPC 2.0 interface which provides access to the JSONRPC 2.0
+   Administrative endpoint which allow you to implement your own tool by just using
+   JSON or YAML. Check :ref:`jsonrpc-node` for more information.
 
 Traffic Analysis Options
 ========================
diff --git a/doc/admin-guide/logging/understanding.en.rst b/doc/admin-guide/logging/understanding.en.rst
index b78931506..1544be966 100644
--- a/doc/admin-guide/logging/understanding.en.rst
+++ b/doc/admin-guide/logging/understanding.en.rst
@@ -82,8 +82,7 @@ specifies where these messages are logged. A typical location is
 ``/var/log/messages`` (Linux).
 
 The :manpage:`syslog(8)` process works on a system-wide basis, so it serves as
-the single repository for messages from all |TS| processes (including
-:program:`traffic_server` and :program:`traffic_manager`).
+the single repository for messages from |TS| process (:program:`traffic_server`).
 
 System information logs observe a static format. Each log entry in the log
 contains information about the date and time the error was logged, the hostname
diff --git a/doc/admin-guide/monitoring/error-messages.en.rst b/doc/admin-guide/monitoring/error-messages.en.rst
index 942256954..6aa414fb7 100644
--- a/doc/admin-guide/monitoring/error-messages.en.rst
+++ b/doc/admin-guide/monitoring/error-messages.en.rst
@@ -118,11 +118,6 @@ Alarm Messages
    Check your custom log configuration file; there could be syntax
    errors. Refer to :ref:`admin-logging-fields` for correct custom log format fields.
 
-``vip_config binary is not setuid root, manager will be unable to enable virtual ip addresses``
-   The :program:`traffic_manager` process is not able to set virtual IP
-   addresses. You must ``setuid root`` for the ``vip_config`` file in
-   the Traffic Server ``bin`` directory.
-
 .. _body-factory:
 
 HTML Messages Sent to Clients
diff --git a/doc/admin-guide/monitoring/statistics/core/general.en.rst b/doc/admin-guide/monitoring/statistics/core/general.en.rst
index 7ead32c2a..01446038e 100644
--- a/doc/admin-guide/monitoring/statistics/core/general.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/general.en.rst
@@ -34,6 +34,8 @@ General
 .. ts:stat:: global proxy.node.config.restart_required.manager integer
    :type: flag
 
+   This metric is now deprecated. traffic_manager is no longer supported.
+
 .. ts:stat:: global proxy.node.config.restart_required.proxy integer
    :type: flag
 
@@ -55,8 +57,7 @@ General
    :type: gauge
    :units: seconds
 
-   Unix epoch-time value indicating the time at which the currently-running
-   :program:`traffic_manager` process was started.
+   This metric is now deprecated. traffic_manager is no longer supported.
 
 .. ts:stat:: global proxy.node.restarts.proxy.cache_ready_time integer
    :type: gauge
@@ -66,13 +67,6 @@ General
 .. ts:stat:: global proxy.node.restarts.proxy.start_time integer
 .. ts:stat:: global proxy.node.restarts.proxy.stop_time integer
 .. ts:stat:: global proxy.process.user_agent_total_bytes integer
-.. ts:stat:: global proxy.node.version.manager.build_date string
-.. ts:stat:: global proxy.node.version.manager.build_machine string
-.. ts:stat:: global proxy.node.version.manager.build_number integer
-.. ts:stat:: global proxy.node.version.manager.build_person string
-.. ts:stat:: global proxy.node.version.manager.build_time string
-.. ts:stat:: global proxy.node.version.manager.long string
-.. ts:stat:: global proxy.node.version.manager.short float
 .. ts:stat:: global proxy.process.http.tunnels integer
 .. ts:stat:: global proxy.process.update.fails integer
 .. ts:stat:: global proxy.process.update.no_actions integer
diff --git a/doc/admin-guide/security/index.en.rst b/doc/admin-guide/security/index.en.rst
index d93b918f7..97ddb6c92 100644
--- a/doc/admin-guide/security/index.en.rst
+++ b/doc/admin-guide/security/index.en.rst
@@ -150,7 +150,7 @@ Client/|TS| connections, you must do the following:
 
         CONFIG proxy.config.ssl.CA.cert.path STRING /opt/CA/certs/private-ca.pem
 
-#. Run the command :option:`traffic_ctl server restart` to restart |TS|.
+#. Restart Traffic Server.
 
 .. _traffic-server-and-origin-server-connections:
 
@@ -235,7 +235,7 @@ and origin server connections, you must do the following:
         CONFIG proxy.config.ssl.client.CA.cert.path STRING /opt/ts/etc/ssl/certs/
         CONFIG proxy.config.ssl.client.CA.cert.filename STRING CAs.pem
 
-#. Run the command :option:`traffic_ctl server restart` to restart |TS|.
+#. Restart Traffic Server.
 
 :doc:`mtls.en`
 ==============
diff --git a/doc/appendices/command-line/traffic_ctl.en.rst b/doc/appendices/command-line/traffic_ctl.en.rst
index 644ffcbba..19d250f02 100644
--- a/doc/appendices/command-line/traffic_ctl.en.rst
+++ b/doc/appendices/command-line/traffic_ctl.en.rst
@@ -13,7 +13,12 @@
 
 .. include:: ../../common.defs
 
-.. _traffic_ctl:
+.. |RPC| replace:: JSONRPC 2.0
+
+.. _JSONRPC: https://www.jsonrpc.org/specification
+.. _JSON: https://www.json.org/json-en.html
+
+.. _traffic_ctl_jsonrpc:
 
 traffic_ctl
 ***********
@@ -23,17 +28,19 @@ Synopsis
 
 :program:`traffic_ctl` [OPTIONS] SUBCOMMAND [OPTIONS]
 
-.. _traffic-ctl-commands:
+
+.. important::
+
+   :program:`traffic_ctl` uses a `JSONRPC`_ protocol to communicate with :program:`traffic_server`.
 
 Description
 ===========
 
-:program:`traffic_ctl` is used to display and manipulate configure
+:program:`traffic_ctl` is used to display, manipulate and configure
 a running Traffic Server. :program:`traffic_ctl` includes a number
 of subcommands that control different aspects of Traffic Server:
 
-:program:`traffic_ctl alarm`
-   Display and manipulate Traffic Server alarms
+
 :program:`traffic_ctl config`
    Manipulate and display configuration records
 :program:`traffic_ctl metric`
@@ -46,8 +53,11 @@ of subcommands that control different aspects of Traffic Server:
    Interact with plugins.
 :program:`traffic_ctl host`
    Manipulate host status.  parents for now but will be expanded to origins.
+:program:`traffic_ctl rpc`
+   Interact directly with the |RPC| server in |TS|
+
+
 
-To use :program:`traffic_ctl`, :ref:`traffic_manager` needs to be running.
 
 Options
 =======
@@ -61,34 +71,81 @@ Options
 
    Print version information and exit.
 
+.. option:: -f, --format
+
+   Specify the output print style.
+
+   =================== ========================================================================
+   Options             Description
+   =================== ========================================================================
+   ``legacy``          Will honour the old :program:`traffic_ctl` output messages. This is the default format type.
+   ``pretty``          <if available> will print a different output, a prettier output. This depends on the implementation,
+                       it's not required to always implement a pretty output
+   ``json``            It will show the response message formatted to `JSON`_ This is ideal if you want to redirect the stdout to a different source.
+                       It will only stream the json response, no other messages.
+   ``data:``           This is an addon to the default format style, data can be: ``{req|resp|all}`` which will make :program:`traffic_ctl`
+                       to print in json format the request or response or both.
+   =================== ========================================================================
+
+   In case of a record request(config) ``--records`` overrides this flag.
+
+   Default: ``legacy``
+
+   Example:
+
+   .. code-block::
+
+      traffic_ctl config get variable --format data:req
+      --> {request}
+
+   .. code-block::
+
+      $ traffic_ctl config get variable --format data:resp
+      <-- {response}
+
+   .. code-block::
+
+      $ traffic_ctl config get variable --format data:all
+      --> {request}
+      <-- {response}
+
+   .. code-block::
+
+      $ traffic_ctl config get variable --format json
+      {response}
+
+   There will be no print out beside the json response. This is ideal to redirect to a file.
+
+
+.. option:: --records
+
+   Option available only for records request.
+
+.. option:: --run-root
+
+   Path to the runroot file.
+
 Subcommands
 ===========
 
+.. _traffic-control-command-alarm:
+
 traffic_ctl alarm
 -----------------
-.. program:: traffic_ctl alarm
-.. option:: list
-
-   List all alarm events that have not been acknowledged (cleared).
 
-.. program:: traffic_ctl alarm
-.. option:: clear
+.. warning::
 
-   Clear (acknowledge) all current alarms.
+   Option not available in the |RPC| version.
 
-.. program:: traffic_ctl alarm
-.. option:: resolve ALARM [ALARM...]
-
-   Clear (acknowledge) an alarm event. The arguments are a specific
-   alarm number (e.g. ''1''), or an alarm string identifier (e.g.
-   ''MGMT_ALARM_PROXY_CONFIG_ERROR'').
+.. _traffic-control-command-config:
 
 traffic_ctl config
 ------------------
+
 .. program:: traffic_ctl config
 .. option:: defaults [--records]
 
-   Display the default values for all configuration records. The --records* flag has the same
+   Display the default values for all configuration records. The ``--records`` flag has the same
    behavior as :option:`traffic_ctl config get --records`.
 
 .. program:: traffic_ctl config
@@ -97,10 +154,12 @@ traffic_ctl config
    Display all the known information about a configuration record. This includes the current and
    default values, the data type, the record class and syntax checking expression.
 
+   Error output available if  ``--format pretty`` is specified.
+
 .. program:: traffic_ctl config
 .. option:: diff [--records]
 
-   Display configuration records that have non-default values. The --records* flag has the same
+   Display configuration records that have non-default values. The ``--records`` flag has the same
    behavior as :option:`traffic_ctl config get --records`.
 
 .. program:: traffic_ctl config
@@ -108,6 +167,8 @@ traffic_ctl config
 
    Display the current value of a configuration record.
 
+   Error output available if ``--format pretty`` is specified.
+
 .. program:: traffic_ctl config get
 .. option:: --records
 
@@ -118,7 +179,7 @@ traffic_ctl config
 .. option:: match [--records] REGEX [REGEX...]
 
    Display the current values of all configuration variables whose names match the given regular
-   expression. The *--records* flag has the same behavior as :option:`traffic_ctl config get
+   expression. The ``--records`` flag has the same behavior as :option:`traffic_ctl config get
    --records`.
 
 .. program:: traffic_ctl config
@@ -145,14 +206,23 @@ traffic_ctl config
    information, whether the internal configuration store is current and whether any daemon processes
    should be restarted.
 
-.. _traffic-ctl-metric:
+.. program:: traffic_ctl config
+.. option:: registry
+
+   Display information about the registered files in |TS|. This includes the full file path, config record name, parent config (if any)
+   if needs root access and if the file is required in |TS|. This command uses :ref:`filemanager.get_files_registry`
+
+
+.. _traffic-control-command-metric:
 
 traffic_ctl metric
 ------------------
 .. program:: traffic_ctl metric
 .. option:: get METRIC [METRIC...]
 
-   Display the current value of the specifies statistics.
+   Display the current value of the specified statistics.
+
+   Error output available if ``--format pretty`` is specified.
 
 .. program:: traffic_ctl metric
 .. option:: match REGEX [REGEX...]
@@ -165,55 +235,30 @@ traffic_ctl metric
 
    Reset the named statistics to zero.
 
-traffic_ctl server
-------------------
-.. program:: traffic_ctl server
-.. option:: restart
-
-   Shut down and immediately restart Traffic Server
-
-.. program:: traffic_ctl server restart
-.. option:: --drain
+.. program:: traffic_ctl metric
+.. option:: describe RECORD [RECORD...]
 
-   This option modifies the behavior of :option:`traffic_ctl server restart` such that
-   :program:`traffic_server` is not shut down until the number of active client connections drops to
-   the number given by the :ts:cv:`proxy.config.restart.active_client_threshold` configuration
-   variable.
+   Display all the known information about a metric record.
 
-.. option:: --manager
+   Error output available if ``--format pretty`` is specified.
 
-   The default behavior of :option:`traffic_ctl server restart` is to restart
-   :program:`traffic_server`. If this option is specified, :program:`traffic_manager` is also
-   restarted.
+.. _traffic-control-command-server:
 
+traffic_ctl server
+------------------
 .. program:: traffic_ctl server
-.. option:: start
-
-   Start :program:`traffic_server` if it is already running.
-
-.. program:: traffic_ctl server start
-.. option:: --clear-cache
-
-   Clear the disk cache upon startup.
-
-.. option:: --clear-hostdb
-
-   Clear the DNS resolver cache upon startup.
 
 .. program:: traffic_ctl server
-.. option:: status
+.. option:: drain
 
-   Show the current proxy server status, indicating if we're running or not.
+   Drop the number of active client connections.{
 
 .. program:: traffic_ctl server
-.. option:: stop
-
-   Stop the running :program:`traffic_server` process.
+.. option:: status
 
-.. program:: traffic_ctl server
-.. option:: backtrace
+   Option not yet available
 
-   Show a full stack trace of all the :program:`traffic_server` threads.
+.. _traffic-control-command-storage:
 
 traffic_ctl storage
 -------------------
@@ -226,18 +271,20 @@ traffic_ctl storage
    effect as a disk failure for that storage. This does not persist across restarts of the
    :program:`traffic_server` process.
 
+.. _traffic-control-command-plugin:
+
 traffic_ctl plugin
 -------------------
 .. program:: traffic_ctl plugin
 .. option:: msg TAG DATA
 
    Send a message to plugins. All plugins that have hooked the
-   :cpp:enumerator:`TSLifecycleHookID::TS_LIFECYCLE_MSG_HOOK` will receive a callback for that hook.
+   ``TSLifecycleHookID::TS_LIFECYCLE_MSG_HOOK`` will receive a callback for that hook.
    The :arg:`TAG` and :arg:`DATA` will be available to the plugin hook processing. It is expected
    that plugins will use :arg:`TAG` to select relevant messages and determine the format of the
-   :arg:`DATA`. The :arg:`DATA` is optional and may not be available to consume, if not available then size will be 0
-   and the data will be NULL. Any extra passed value beside the tag and the optional data will be ignored.
-   Check :c:type:`TSPluginMsg` for more info.
+   :arg:`DATA`.
+
+.. _traffic-control-command-host:
 
 traffic_ctl host
 ----------------
@@ -302,32 +349,211 @@ endpoint.
 
    Supports :option:`--reason`.
 
+.. _traffic_ctl_rpc:
+
+traffic_ctl rpc
+---------------
+.. program:: traffic_ctl rpc
+
+A mechanism to interact directly with the |TS| |RPC| endpoint. This means that this is not tied to any particular API
+but rather to the rpc endpoint, so you can directly send requests and receive responses from the server.
+
+.. option:: file
+
+   Reads a file or a set of files from the disc, use the content of the files as message(s) to the |RPC| endpoint. All jsonrpc messages
+   will be validated before sending them. If the file contains invalid  json|yaml format the message will not be send, in
+   case of a set of files, if a particular file is not a proper json/yaml format then that particular file will be skipped.
+
+   Example:
+
+   .. code-block:: bash
+
+      traffic_ctl rpc file jsonrpc_cmd1.json jsonrpc_cmd2.yaml
+
+.. option:: get-api
+
+   Request the entire admin api. This will retrieve all the registered methods and notifications on the server side.
+
+   Example:
+
+   .. code-block:: bash
+
+      $ traffic_ctl rpc get-api
+      Methods:
+      - admin_host_set_status
+      - admin_server_stop_drain
+      - admin_server_start_drain
+      - admin_clear_metrics_records
+      - admin_clear_all_metrics_records
+      - admin_plugin_send_basic_msg
+      - admin_lookup_records
+      - admin_config_set_records
+      - admin_storage_get_device_status
+      - admin_storage_set_device_offline
+      - admin_config_reload
+      - show_registered_handlers
+      Notifications:
+      - some_registered_notification_handler
+
+
+.. option:: input
+
+   Input mode, traffic_ctl will provide a control input from a stream buffer. Once the content is written the terminal :program:`traffic_ctl`
+   will wait for the user to press Control-D to send the request to the rpc endpoint.
+   This feature allows you to directly interact with the jsonrpc endpoint and test your API easily and without the need to know the low level
+   implementation details of the transport layer.
+   :program:`traffic_ctl` will validate the input format, not the message content. The message content will be validated by the server.
+   See example `input_example_2`_.
+
+   .. option:: --raw, -r
+
+      No json/yaml parse validation will take place, the input content will be directly send to the server.
+
+   Example:
+
+   .. code-block::
+
+      $ traffic_ctl rpc input
+      >> Ctrl-D to fire the request
+      {
+         "id":"86e59b43-185b-4a0b-b1c1-babb1a3d5401",
+         "jsonrpc":"2.0",
+         "method":"admin_lookup_records",
+         "params":[
+            {
+               "record_name":"proxy.config.diags.debug.tags",
+               "rec_types":[
+                  "1",
+                  "16"
+               ]
+            }
+         ]
+      }
+      <pressed Ctrl-D>
+
+      <-- Server's response.
+      {
+         "jsonrpc":"2.0",
+         "result":{
+            "recordList":[
+               {
+                  "record":{
+                     "record_name":"proxy.config.diags.debug.tags",
+                     "record_type":"3",
+                     "version":"0",
+                     "raw_stat_block":"0",
+                     "order":"423",
+                     "config_meta":{
+                        "access_type":"0",
+                        "update_status":"0",
+                        "update_type":"1",
+                        "checktype":"0",
+                        "source":"3",
+                        "check_expr":"null"
+                     },
+                     "record_class":"1",
+                     "overridable":"false",
+                     "data_type":"STRING",
+                     "current_value":"rpc",
+                     "default_value":"http|dns"
+                  }
+               }
+            ]
+         },
+         "id":"86e59b43-185b-4a0b-b1c1-babb1a3d5401"
+      }
+
+
+.. _input_example_2:
+
+   Example 2:
+
+   You can see a valid  json ``{}`` but an invalid |RPC| message. In this case the server is responding.
+
+   .. code-block::
+
+      $ traffic_ctl rpc input
+      >> Ctrl-D to fire the request
+      {}
+      <pressed Ctrl-D>
+      < -- Server's response
+      {
+         "jsonrpc":"2.0",
+         "error":{
+            "code":-32600,
+            "message":"Invalid Request"
+         }
+      }
+
 Examples
 ========
 
 Mark down a host with `traffic_ctl` and view the associated host stats::
 
-   $ traffic_ctl host down cdn-cache-02.foo.com --reason manual
+   .. code-block:: bash
 
-   $ /opt/trafficserver/bin/traffic_ctl metric match host_status
-   proxy.process.host_status.cdn-cache-01.foo.com HOST_STATUS_DOWN,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:DOWN:1556896844:0,SELF_DETECT:UP:0
-   proxy.process.host_status.cdn-cache-02.foo.com HOST_STATUS_UP,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:UP:0:0,SELF_DETECT:UP:0
-   proxy.process.host_status.cdn-cache-origin-01.foo.com HOST_STATUS_UP,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:UP:0:0,SELF_DETECT:UP:0
+      # traffic_ctl host down cdn-cache-02.foo.com --reason manual
+
+      # traffic_ctl metric match host_status
+      proxy.process.host_status.cdn-cache-01.foo.com HOST_STATUS_DOWN,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:DOWN:1556896844:0,SELF_DETECT:UP:0
+      proxy.process.host_status.cdn-cache-02.foo.com HOST_STATUS_UP,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:UP:0:0,SELF_DETECT:UP:0
+      proxy.process.host_status.cdn-cache-origin-01.foo.com HOST_STATUS_UP,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:UP:0:0,SELF_DETECT:UP:0
 
 In the example above, 'cdn-cache-01.foo.com' is unavailable, `HOST_STATUS_DOWN` and was marked down
 for the `manual` reason, `MANUAL:DOWN:1556896844:0`, at the time indicated by the UNIX time stamp
-`1556896844`.  To make the host available, one would have to clear the `manual` reason using ::
+`1556896844`.  To make the host available, one would have to clear the `manual` reason using:
+
+   .. code-block:: bash
+
+      # traffic_ctl host up cdn-cache-01.foo.com --reason manual
+
+Configure Traffic Server to insert ``Via`` header in the response to the client
+
+   .. code-block:: bash
+
+      # traffic_ctl config set proxy.config.http.insert_response_via_str 1
+      # traffic_ctl config reload
+
+Autest
+======
+
+If you want to interact with |TS| under a unit test, then a few things need to be considered.
+
+- Runroot needs to be configured in order to  let `traffic_ctl` knows where to find the socket.
+
+   There are currently two ways to do this:
+
+   1. Using `run-root` param.
+
+      1. Let `Test.MakeATSProcess` to create the runroot file under the |TS| config directory. This can be done by passing `dump_runroot=True` to the above function:
+
+       .. code-block:: python
+
+         ts = Test.MakeATSProcess(..., dump_runroot=True)
+
+
+      `dump_runroot` will write out some of the keys inside the runroot file, in this case the `runtimedir`.
+
+      2. Then you should specify the :option:`traffic_ctl --run-root` when invoking the command:
+
+         .. code-block:: python
+
+            tr.Processes.Default.Command = f'traffic_ctl config reload --run-root {ts.Disk.runroot_yaml.Name}'
+
+   2. Setting up the `TS_RUNROOT` environment variable.
+      This is very similar to `1` but, instead of passing the `--run-root` param to `traffic_ctl`, you just need to specify the
+      `TS_RUNROOT` environment variable. To do that, just do as 1.1 shows and then:
 
-   $ traffic_ctl host up cdn-cache-01.foo.com --reason manual
+      .. code-block:: python
 
-Configure Traffic Server to insert ``Via`` header in the response to
-the client::
+         ts.SetRunRootEnv()
 
-   $ traffic_ctl config set proxy.config.http.insert_response_via_str 1
-   $ traffic_ctl config reload
+      The above call will set the variable, please be aware that this variable will also be read by TS.
 
 See also
 ========
 
 :manpage:`records.config(5)`,
-:manpage:`storage.config(5)`
+:manpage:`storage.config(5)`,
+:ref:`admin-jsonrpc-configuration`,
+:ref:`jsonrpc-protocol`
diff --git a/doc/appendices/command-line/traffic_ctl_jsonrpc.en.rst b/doc/appendices/command-line/traffic_ctl_jsonrpc.en.rst
deleted file mode 100644
index 94f0e5667..000000000
--- a/doc/appendices/command-line/traffic_ctl_jsonrpc.en.rst
+++ /dev/null
@@ -1,608 +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.
-
-.. include:: ../../common.defs
-
-.. |RPC| replace:: JSONRPC 2.0
-
-.. _JSONRPC: https://www.jsonrpc.org/specification
-.. _JSON: https://www.json.org/json-en.html
-
-.. _traffic_ctl_jsonrpc:
-
-traffic_ctl
-***********
-
-Synopsis
-========
-
-:program:`traffic_ctl` [OPTIONS] SUBCOMMAND [OPTIONS]
-
-
-.. note::
-
-   :program:`traffic_ctl` now uses a `JSONRPC`_ endpoint instead of ``traffic_manager``. ``traffic_manager`` is not
-   required. To build this version of :program:`traffic_ctl` ``--enable-jsonrpc-tc`` should be passed when configure the build.
-
-Description
-===========
-
-:program:`traffic_ctl` is used to display,manipulate and configure
-a running Traffic Server. :program:`traffic_ctl` includes a number
-of subcommands that control different aspects of Traffic Server:
-
-
-:program:`traffic_ctl config`
-   Manipulate and display configuration records
-:program:`traffic_ctl metric`
-   Manipulate performance and status metrics
-:program:`traffic_ctl server`
-   Stop, restart and examine the server
-:program:`traffic_ctl storage`
-   Manipulate cache storage
-:program:`traffic_ctl plugin`
-   Interact with plugins.
-:program:`traffic_ctl host`
-   Manipulate host status.  parents for now but will be expanded to origins.
-:program:`traffic_ctl rpc`
-   Interact directly with the |RPC| server in |TS|
-
-
-
-
-Options
-=======
-
-.. program:: traffic_ctl
-.. option:: --debug
-
-   Enable debugging output.
-
-.. option:: -V, --version
-
-   Print version information and exit.
-
-.. option:: -f, --format
-
-   Specify the output print style.
-
-   =================== ========================================================================
-   Options             Description
-   =================== ========================================================================
-   ``legacy``          Will honour the old :program:`traffic_ctl` output messages. This is the default format type.
-   ``pretty``          <if available> will print a different output, a prettier output. This depends on the implementation,
-                       it's not required to always implement a pretty output
-   ``json``            It will show the response message formatted to `JSON`_. This is ideal if you want to redirect the stdout to a different source.
-                       It will only stream the json response, no other messages.
-   ``rpc``             Show the JSONRPC request and response + the default output.
-   =================== ========================================================================
-
-   In case of a record request(config) ``--records`` overrides this flag.
-
-   Default: ``legacy``
-
-   Example:
-
-   .. code-block::
-
-      $ traffic_ctl config get variable --format rpc
-      --> {request}
-      <-- {response}
-      variable 1234
-
-   .. code-block::
-
-      $ traffic_ctl config get variable --format json
-      {response}
-
-   There will be no print out beside the json response. This is ideal to redirect to a file.
-
-
-.. option:: --records
-
-   Option available only for records request.
-
-.. option:: --run-root
-
-   Path to the runroot file.
-
-Subcommands
-===========
-
-.. _traffic-control-command-alarm:
-
-traffic_ctl alarm
------------------
-
-.. warning::
-
-   Option not available in the |RPC| version.
-
-.. _traffic-control-command-config:
-
-traffic_ctl config
-------------------
-
-.. program:: traffic_ctl config
-.. option:: defaults [--records]
-
-   :ref:`admin_lookup_records`
-
-   Display the default values for all configuration records. The ``--records`` flag has the same
-   behavior as :option:`traffic_ctl config get --records`.
-
-.. program:: traffic_ctl config
-.. option:: describe RECORD [RECORD...]
-
-   :ref:`admin_lookup_records`
-
-   Display all the known information about a configuration record. This includes the current and
-   default values, the data type, the record class and syntax checking expression.
-
-   Error output available if  ``--format pretty`` is specified.
-
-.. program:: traffic_ctl config
-.. option:: diff [--records]
-
-   :ref:`admin_lookup_records`
-
-   Display configuration records that have non-default values. The ``--records`` flag has the same
-   behavior as :option:`traffic_ctl config get --records`.
-
-.. program:: traffic_ctl config
-.. option:: get [--records] RECORD [RECORD...]
-
-   :ref:`admin_lookup_records`
-
-   Display the current value of a configuration record.
-
-   Error output available if ``--format pretty`` is specified.
-
-.. program:: traffic_ctl config get
-.. option:: --records
-
-   If this flag is provided, :option:`traffic_ctl config get` will emit results in
-   :file:`records.config` format.
-
-.. program:: traffic_ctl config
-.. option:: match [--records] REGEX [REGEX...]
-
-   :ref:`admin_lookup_records`
-
-   Display the current values of all configuration variables whose names match the given regular
-   expression. The ``--records`` flag has the same behavior as :option:`traffic_ctl config get
-   --records`.
-
-.. program:: traffic_ctl config
-.. option:: reload
-
-   :ref:`admin_config_reload`
-
-   Initiate a Traffic Server configuration reload. Use this command to update the running
-   configuration after any configuration file modification. If no configuration files have been
-   modified since the previous configuration load, this command is a no-op.
-
-   The timestamp of the last reconfiguration event (in seconds since epoch) is published in the
-   `proxy.node.config.reconfigure_time` metric.
-
-.. program:: traffic_ctl config
-.. option:: set RECORD VALUE
-
-   :ref:`admin_config_set_records`
-
-   Set the named configuration record to the specified value. Refer to the :file:`records.config`
-   documentation for a list of the configuration variables you can specify. Note that this is not a
-   synchronous operation.
-
-.. program:: traffic_ctl config
-.. option:: status
-
-   :ref:`admin_lookup_records`
-
-   Display detailed status about the Traffic Server configuration system. This includes version
-   information, whether the internal configuration store is current and whether any daemon processes
-   should be restarted.
-
-.. program:: traffic_ctl config
-.. option:: registry
-
-   :ref:`filemanager.get_files_registry`
-
-   Display information about the registered files in |TS|. This includes the full file path, config record name, parent config (if any)
-   if needs root access and if the file is required in |TS|.
-
-.. _traffic-control-command-metric:
-
-traffic_ctl metric
-------------------
-
-.. program:: traffic_ctl metric
-.. option:: get METRIC [METRIC...]
-
-   :ref:`admin_lookup_records`
-
-   Display the current value of the specified statistics.
-
-   Error output available if ``--format pretty`` is specified.
-
-.. program:: traffic_ctl metric
-.. option:: match REGEX [REGEX...]
-
-   :ref:`admin_lookup_records`
-
-   Display the current values of all statistics whose names match
-   the given regular expression.
-
-.. program:: traffic_ctl metric
-.. option:: zero METRIC [METRIC...]
-
-   :ref:`admin_clear_metrics_records`
-
-   Reset the named statistics to zero.
-
-.. program:: traffic_ctl metric
-.. option:: describe RECORD [RECORD...]
-
-   :ref:`admin_lookup_records`
-
-   Display all the known information about a metric record.
-
-   Error output available if ``--format pretty`` is specified.
-
-.. _traffic-control-command-server:
-
-traffic_ctl server
-------------------
-
-.. program:: traffic_ctl server
-
-.. program:: traffic_ctl server
-.. option:: drain
-
-   :ref:`admin_server_start_drain`
-
-   :ref:`admin_server_stop_drain`
-
-   Drop the number of active client connections.
-
-.. program:: traffic_ctl server
-.. option:: status
-
-   Option not yet available
-
-.. _traffic-control-command-storage:
-
-traffic_ctl storage
--------------------
-
-.. program:: traffic_ctl storage
-.. option:: offline PATH [PATH ...]
-
-   :ref:`admin_storage_set_device_offline`
-
-   Mark a cache storage device as offline. The storage is identified by :arg:`PATH` which must match
-   exactly a path specified in :file:`storage.config`. This removes the storage from the cache and
-   redirects requests that would have used this storage to other storage. This has exactly the same
-   effect as a disk failure for that storage. This does not persist across restarts of the
-   :program:`traffic_server` process.
-
-.. program:: traffic_ctl storage
-.. option:: status PATH [PATH ...]
-
-   :ref:`admin_storage_get_device_status`
-
-   Show the storage configuration status.
-
-.. _traffic-control-command-plugin:
-
-traffic_ctl plugin
--------------------
-
-.. program:: traffic_ctl plugin
-.. option:: msg TAG DATA
-
-   :ref:`admin_plugin_send_basic_msg`
-
-   Send a message to plugins. All plugins that have hooked the
-   ``TSLifecycleHookID::TS_LIFECYCLE_MSG_HOOK`` will receive a callback for that hook.
-   The :arg:`TAG` and :arg:`DATA` will be available to the plugin hook processing. It is expected
-   that plugins will use :arg:`TAG` to select relevant messages and determine the format of the
-   :arg:`DATA`.
-
-.. _traffic-control-command-host:
-
-traffic_ctl host
-----------------
-.. program:: traffic_ctl host
-
-A record to track status is created for each host. The name is the host fqdn.  The value of the
-record when retrieved, is a serialized string representation of the status.
-This contains the overall status and the status for each reason.  The
-records may be viewed using the :program:`traffic_ctl host status` command.
-
-.. option:: --time count
-
-   Set the duration of an operation to ``count`` seconds. A value of ``0`` means no duration, the
-   condition persists until explicitly changed. The default is ``0`` if an operation requires a time
-   and none is provided by this option.
-
-.. option:: --reason active | local | manual
-
-   Sets the reason for the operation.
-
-   ``active``
-      Set the active health check reason.
-
-   ``local``
-      Set the local health check reason.
-
-   ``manual``
-      Set the administrative reason. This is the default reason if a reason is needed and not
-      provided by this option.
-
-   Internally the reason can be ``self_detect`` if
-   :ts:cv:`proxy.config.http.parent_proxy.self_detect` is set to the value 2 (the default). This is
-   used to prevent parent selection from creating a loop by selecting itself as the upstream by
-   marking this reason as "down" in that case.
-
-   .. note::
-
-      The up / down status values are independent, and a host is consider available if and only if
-      all of the statuses are "up".
-
-.. option:: status HOSTNAME [HOSTNAME ...]
-
-   :ref:`admin_lookup_records`
-
-   Get the current status of the specified hosts with respect to their use as targets for parent
-   selection. If the HOSTNAME arguments are omitted, all host records available are returned.
-
-.. option:: down HOSTNAME [HOSTNAME ...]
-
-   :ref:`admin_host_set_status`
-
-   Marks the listed hosts as down so that they will not be chosen as a next hop parent. If
-   :option:`--time` is included the host is marked down for the specified number of seconds after
-   which the host will automatically be marked up. A host is not marked up until all reason codes
-   are cleared by marking up the host for the specified reason code.
-
-   Supports :option:`--time`, :option:`--reason`.
-
-.. option:: up HOSTNAME [HOSTNAME ...]
-
-   :ref:`admin_host_set_status`
-
-   Marks the listed hosts as up so that they will be available for use as a next hop parent. Use
-   :option:`--reason` to mark the host reason code. The 'self_detect' is an internal reason code
-   used by parent selection to mark down a parent when it is identified as itself and
-
-
-   Supports :option:`--reason`.
-
-.. _traffic_ctl_rpc:
-
-traffic_ctl rpc
----------------
-.. program:: traffic_ctl rpc
-
-A mechanism to interact directly with the |TS| |RPC| endpoint. This means that this is not tied to any particular API
-but rather to the rpc endpoint, so you can directly send requests and receive responses from the server.
-
-.. option:: file
-
-   Reads a file or a set of files from the disc, use the content of the files as message(s) to the |RPC| endpoint. All jsonrpc messages
-   will be validated before sending them. If the file contains invalid  json|yaml format the message will not be send, in
-   case of a set of files, if a particular file is not a proper json/yaml format then that particular file will be skipped.
-
-   Example:
-
-   .. code-block:: bash
-
-      traffic_ctl rpc file jsonrpc_cmd1.json jsonrpc_cmd2.yaml
-
-.. option:: get-api
-
-   :ref:`show_registered_handlers`
-
-   Request the entire admin api. This will retrieve all the registered methods and notifications on the server side.
-
-   Example:
-
-   .. code-block:: bash
-
-      $ traffic_ctl rpc get-api
-      Methods:
-      - admin_host_set_status
-      - admin_server_stop_drain
-      - admin_server_start_drain
-      - admin_clear_metrics_records
-      - admin_clear_all_metrics_records
-      - admin_plugin_send_basic_msg
-      - admin_lookup_records
-      - admin_config_set_records
-      - admin_storage_get_device_status
-      - admin_storage_set_device_offline
-      - admin_config_reload
-      - show_registered_handlers
-      Notifications:
-      - some_registered_notification_handler
-
-
-.. option:: input
-
-   Input mode, traffic_ctl will provide a control input from a stream buffer. Once the content is written the terminal :program:`traffic_ctl`
-   will wait for the user to press Control-D to send the request to the rpc endpoint.
-   This feature allows you to directly interact with the jsonrpc endpoint and test your API easily and without the need to know the low level
-   implementation details of the transport layer.
-   :program:`traffic_ctl` will validate the input format, not the message content. The message content will be validated by the server.
-   See example `input_example_2`_.
-
-   .. option:: --raw, -r
-
-      No json/yaml parse validation will take place, the input content will be directly send to the server.
-
-   Example:
-
-   .. code-block::
-
-      $ traffic_ctl rpc input
-      >> Ctrl-D to fire the request
-      {
-         "id":"86e59b43-185b-4a0b-b1c1-babb1a3d5401",
-         "jsonrpc":"2.0",
-         "method":"admin_lookup_records",
-         "params":[
-            {
-               "record_name":"proxy.config.diags.debug.tags",
-               "rec_types":[
-                  "1",
-                  "16"
-               ]
-            }
-         ]
-      }
-      <pressed Ctrl-D>
-
-      <-- Server's response.
-      {
-         "jsonrpc":"2.0",
-         "result":{
-            "recordList":[
-               {
-                  "record":{
-                     "record_name":"proxy.config.diags.debug.tags",
-                     "record_type":"3",
-                     "version":"0",
-                     "raw_stat_block":"0",
-                     "order":"423",
-                     "config_meta":{
-                        "access_type":"0",
-                        "update_status":"0",
-                        "update_type":"1",
-                        "checktype":"0",
-                        "source":"3",
-                        "check_expr":"null"
-                     },
-                     "record_class":"1",
-                     "overridable":"false",
-                     "data_type":"STRING",
-                     "current_value":"rpc",
-                     "default_value":"http|dns"
-                  }
-               }
-            ]
-         },
-         "id":"86e59b43-185b-4a0b-b1c1-babb1a3d5401"
-      }
-
-
-.. _input_example_2:
-
-   Example 2:
-
-   You can see a valid  json ``{}`` but an invalid |RPC| message. In this case the server is responding.
-
-   .. code-block::
-
-      $ traffic_ctl rpc input
-      >> Ctrl-D to fire the request
-      {}
-      <pressed Ctrl-D>
-      < -- Server's response
-      {
-         "jsonrpc":"2.0",
-         "error":{
-            "code":-32600,
-            "message":"Invalid Request"
-         }
-      }
-
-
-.. option:: invoke
-
-   Invoke a remote call by using the method name as parameter. This could be a handy option if you are developing a new handler or you
-   just don't want to expose the method in :program:`traffic_ctl`, for instance when implementing a custom handler inside a proprietary plugin.
-
-   .. option:: --params, -p
-
-      Parameters to be passed in the request, YAML or JSON format are accepted. If JSON is passed as param it should not
-      be mixed with YAML. It's important that you follow the :ref:`jsonrpc-protocol` specs. If the passed param does not
-      follows the specs the server will reject the request.
-
-.. _rpc_invoke_example_1:
-
-   Example 1:
-
-   Call a jsonrpc method with no parameter.
-
-   .. code-block::
-
-      $ traffic_ctl rpc invoke some_jsonrpc_handler
-      --> {"id": "0dbab88d-b78f-4ebf-8aa3-f100031711a5", "jsonrpc": "2.0", "method": "some_jsonrpc_handler"}
-      <-- { response }
-
-.. _rpc_invoke_example_2:
-
-   Example 2:
-
-   Call a jsonrpc method with parameters.
-
-   .. code-block::
-
-      $ traffic_ctl rpc invoke reload_files_from_folder --params 'filenames: ["file1", "file2"]' 'folder: "/path/to/folder"'
-      --> {"id": "9ac68652-5133-4d5f-8260-421baca4c67f", "jsonrpc": "2.0", "method": "reload_files_from_folder", "params": {"filenames": ["file1", "file2"], "folder": "/path/to/folder"}}
-      <-- { response }
-
-Examples
-========
-
-Mark down a host with `traffic_ctl` and view the associated host stats::
-
-   .. code-block:: bash
-
-      # traffic_ctl host down cdn-cache-02.foo.com --reason manual
-
-      # traffic_ctl metric match host_status
-      proxy.process.host_status.cdn-cache-01.foo.com HOST_STATUS_DOWN,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:DOWN:1556896844:0,SELF_DETECT:UP:0
-      proxy.process.host_status.cdn-cache-02.foo.com HOST_STATUS_UP,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:UP:0:0,SELF_DETECT:UP:0
-      proxy.process.host_status.cdn-cache-origin-01.foo.com HOST_STATUS_UP,ACTIVE:UP:0:0,LOCAL:UP:0:0,MANUAL:UP:0:0,SELF_DETECT:UP:0
-
-In the example above, 'cdn-cache-01.foo.com' is unavailable, `HOST_STATUS_DOWN` and was marked down
-for the `manual` reason, `MANUAL:DOWN:1556896844:0`, at the time indicated by the UNIX time stamp
-`1556896844`.  To make the host available, one would have to clear the `manual` reason using:
-
-   .. code-block:: bash
-
-      # traffic_ctl host up cdn-cache-01.foo.com --reason manual
-
-Configure Traffic Server to insert ``Via`` header in the response to the client
-
-   .. code-block:: bash
-
-      # traffic_ctl config set proxy.config.http.insert_response_via_str 1
-      # traffic_ctl config reload
-
-Autest
-======
-
-Runroot needs to be configured in order to let `traffic_ctl` know where to find the socket. This is done by default
-and there is no change you have to do to interact with it, but make sure that you are not overriding the `dump_runroot=False`
-when creating the ATS Process, otherwise the `runroot.yaml` will not be set.
-
-See also
-========
-
-:manpage:`records.config(5)`,
-:manpage:`storage.config(5)`,
-:ref:`admin-jsonrpc-configuration`,
-:ref:`jsonrpc-protocol`
diff --git a/doc/appendices/command-line/traffic_layout.en.rst b/doc/appendices/command-line/traffic_layout.en.rst
index f4fa104af..2ad1a3be3 100644
--- a/doc/appendices/command-line/traffic_layout.en.rst
+++ b/doc/appendices/command-line/traffic_layout.en.rst
@@ -50,12 +50,12 @@ First we need to create a runroot. It can be created simply by calling command `
 A runroot will be created in ``/path/to/runroot``, available for other programs to use.
 If the path is not specified, the current working directory will be used.
 
-For example, to run traffic_manager, using the runroot, there are several ways:
-    #. ``/path/to/runroot/bin/traffic_manager``
-    #. ``traffic_manager --run-root=/path/to/runroot``
-    #. ``traffic_manager --run-root=/path/to/runroot/runroot.yaml``
-    #. Set :envvar:`TS_RUNROOT` to ``/path/to/runroot`` and run ``traffic_manager``
-    #. Run ``traffic_manager`` with ``/path/to/runroot`` as current working directory
+For example, to run traffic_server, using the runroot, there are several ways:
+    #. ``/path/to/runroot/bin/traffic_server``
+    #. ``traffic_server --run-root=/path/to/runroot``
+    #. ``traffic_server --run-root=/path/to/runroot/runroot.yaml``
+    #. Set :envvar:`TS_RUNROOT` to ``/path/to/runroot`` and run ``traffic_server``
+    #. Run ``traffic_server`` with ``/path/to/runroot`` as current working directory
 
 .. Note::
 
diff --git a/doc/appendices/command-line/traffic_manager.en.rst b/doc/appendices/command-line/traffic_manager.en.rst
index 90ae56d20..bf2141385 100644
--- a/doc/appendices/command-line/traffic_manager.en.rst
+++ b/doc/appendices/command-line/traffic_manager.en.rst
@@ -22,65 +22,9 @@
 traffic_manager
 ***************
 
-.. program:: traffic_manager
-
-Description
-===========
-
-.. option:: --aconfPort PORT
-.. option:: --action TAGS
-.. option:: --debug TAGS
-.. option:: --groupAddr ADDRESS
-.. option:: --help
-.. option:: --nosyslog
-.. option:: --path FILE
-.. option:: --proxyOff
-.. option:: --listenOff
-.. option:: --proxyPort PORT
-.. option:: --recordsConf FILE
-.. option:: --tsArgs ARGUMENTS
-.. option:: --maxRecords RECORDS
-.. option:: --bind_stdout FILE
-
-The file to which the stdout stream for :program:`traffic_manager` will be bound.
-
-.. option:: --bind_stderr FILE
-
-The file to which the stderr stream for :program:`traffic_manager` will be bound.
-
-.. option:: --version
-
-Signals
-=======
-
-SIGHUP
-  This signal causes a reconfiguration event, equivalent to running :program:`traffic_ctl config reload`.
-
-SIGINT, SIGTERM
-  These signals cause :program:`traffic_manager` to exit after also shutting down :program:`traffic_server`.
-
-SIGUSR2
-  This signal causes the :program:`traffic_manager` and :program:`traffic_server` processes to close
-  and reopen their file descriptors for all of their log files. This allows the use of external
-  tools to handle log rotation and retention. For instance, logrotate(8) can be configured to rotate
-  the various |ATS| logs and, via the logrotate postrotate script, send a `-SIGUSR2` to the
-  :program:`traffic_manager` process. After the signal is received, |ATS| will stop logging to the
-  now-rolled files and will reopen log files with the originally configured log names.
-
-Exponential Back-off Delay
-==========================
-
-  If :program:`traffic_server` has issues communicating with  :program:`traffic_manager` after a crash,
-  :program:`traffic_manager` will retry to start  :program:`traffic_server` using an exponential back-off delay,
-  which will make :program:`traffic_manager` to retry starting :program:`traffic_server` from ``1s`` until it
-  reaches the max ceiling time. The ceiling time is configurable  as well as the number of times that
-  :program:`traffic_manager` will keep trying to start :program:`traffic_server`. *A random variance will be
-  added to the sleep time on every retry*
-
-.. note::
-  For more information about this configuration please check :file:`records.config`
-
+.. important::
 
+  traffic_manager is deprecated. :program:`traffic_server` must be used instead.
 
 See also
 ========
diff --git a/doc/appendices/command-line/traffic_server.en.rst b/doc/appendices/command-line/traffic_server.en.rst
index edcd51d57..af88c6d33 100644
--- a/doc/appendices/command-line/traffic_server.en.rst
+++ b/doc/appendices/command-line/traffic_server.en.rst
@@ -119,11 +119,6 @@ the available tests.
 The maximum number of entries in metrics and configuration variables. The default is 1600, which is
 also the minimum. This may need to be increased if running plugins that create metrics.
 
-.. option:: -M, --remote_management
-
-Indicates the process should expect to be managed by :ref:`traffic_manager`. This option should not
-be used except by that process.
-
 .. option:: -n COUNT, --net_threads COUNT
 
 .. option:: -k, --clear_hostdb
@@ -149,11 +144,6 @@ be used except by that process.
 Environment
 ===========
 
-.. envvar:: PROXY_REMOTE_MGMT
-
-This environment variable forces :program:`traffic_server` to believe that it is being managed by
-:program:`traffic_manager`.
-
 .. envvar:: PROXY_AUTO_EXIT
 
 When this environment variable is set to an integral number of
@@ -176,4 +166,3 @@ See also
 ========
 
 :manpage:`traffic_ctl(8)`,
-:manpage:`traffic_manager(8)`
diff --git a/doc/appendices/faq.en.rst b/doc/appendices/faq.en.rst
index 1cca514e4..bdb861c0d 100644
--- a/doc/appendices/faq.en.rst
+++ b/doc/appendices/faq.en.rst
@@ -329,31 +329,14 @@ You are unable to execute Traffic Control commands
 
 :program:`traffic_ctl` commands do not execute under the following conditions:
 
-**When the traffic_manager process is not running**
-    Check to see if the :program:`traffic_manager` process is running by entering the
-    following command::
-
-        pgrep -l traffic_manager
-
-    If the :program:`traffic_manager` process is not running, then enter the
-    following command from the Traffic Server ``bin`` directory to start it::
-
-        ./traffic_manager
-
-.. XXX: this is wrong
-
-    You should always start and stop Traffic Server with the
-    :program:`trafficserver start` and :program:`trafficserver stop` commands to ensure
-    that all the processes start and stop correctly. For more information,
-    refer to :ref:`getting-started`.
-
-**When you are not executing the command from $TSHome/bin**
-    If the Traffic Server ``bin`` directory is not in your path, then prepend the
-    Traffic Control commands with ``./`` (for example, ``./traffic_ctl -h``).
-
-**When multiple Traffic Server installations are present and you are not
-executing the Traffic Control command from the active Traffic Server path
-specified in ``/etc/trafficserver``**
+**When the traffic_server process is not running**
+    :program:`traffic_ctl` needs traffic_server to be running, the former needs
+    the later to be running in order to connect to the jsonrpc endpoint. You can
+    check this :ref:`jsonrpc-node` for more information.
+
+**When :program:`traffic_ctl` is unable to locate the jsonrpc socket.**
+    The program needs to know where the path is located, this could be the default
+    build folder or the one specified by the runroot file.
 
 
 Web browsers display an error document with a 'data missing' message
diff --git a/doc/developer-guide/api/types/TSMgmtTypes.en.rst b/doc/developer-guide/api/types/TSMgmtTypes.en.rst
index 40526f1a3..8bd72e0d1 100644
--- a/doc/developer-guide/api/types/TSMgmtTypes.en.rst
+++ b/doc/developer-guide/api/types/TSMgmtTypes.en.rst
@@ -23,6 +23,10 @@ TSMgmt
 Synopsis
 ========
 
+.. important::
+
+   This is now deprecated. All new RPC communication is now done by :ref:`jsonrpc-protocol`
+
 Macros used for RPC communications.
 
 Management Signals
diff --git a/doc/developer-guide/api/types/TSRecordUpdateType.en.rst b/doc/developer-guide/api/types/TSRecordUpdateType.en.rst
index af6c1c2d2..b378aca35 100644
--- a/doc/developer-guide/api/types/TSRecordUpdateType.en.rst
+++ b/doc/developer-guide/api/types/TSRecordUpdateType.en.rst
@@ -47,7 +47,7 @@ Enumeration Members
 
 .. c:member:: TSRecordUpdateType TS_RECORDUPDATE_RESTART_TM
 
-   The value is updated if the :program:`traffic_manager` process is restarted.
+   Deprecated.
 
 Description
 ===========
diff --git a/doc/developer-guide/config-vars.en.rst b/doc/developer-guide/config-vars.en.rst
index a234a0e53..59cadd8fc 100644
--- a/doc/developer-guide/config-vars.en.rst
+++ b/doc/developer-guide/config-vars.en.rst
@@ -124,7 +124,7 @@ update:``RecUpdateT``
       The :program:`traffic_server` process must be restarted for a new value to take effect.
 
    ``RECD_RESTART_TM``
-      The :program:`traffic_manager` process must be restarted for a new value to take effect.
+      Deprecated.
 
 required:``RecordRequiredType``
    Effectively a boolean that specifies if the record is required to be present,
diff --git a/doc/developer-guide/core-architecture/index.en.rst b/doc/developer-guide/core-architecture/index.en.rst
index 97f59712d..133483ba1 100644
--- a/doc/developer-guide/core-architecture/index.en.rst
+++ b/doc/developer-guide/core-architecture/index.en.rst
@@ -27,5 +27,4 @@ Core Architecture
 
    heap.en
    hostdb.en
-   rpc.en
    url_rewrite_architecture.en.rst
diff --git a/doc/developer-guide/core-architecture/rpc.en.rst b/doc/developer-guide/core-architecture/rpc.en.rst
deleted file mode 100644
index f447b10e7..000000000
--- a/doc/developer-guide/core-architecture/rpc.en.rst
+++ /dev/null
@@ -1,279 +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.
-
-.. include:: ../../common.defs
-
-.. highlight:: cpp
-.. default-domain:: cpp
-
-.. _developer-doc-rpc:
-
-.. |TServer| replace:: :program:`traffic_server`
-.. |TManager| replace:: :program:`traffic_manager`
-.. |TCtl| replace:: :program:`traffic_ctl`
-.. |LM| replace:: :class:`LocalManager`
-.. |PM| replace:: :class:`ProcessManager`
-
-RPC
-***
-
-========
-Overview
-========
-
-In order for programs in different address spaces (remote clients and |TManager|) to communicate with |TServer|, there is a RPC mechanism in :ts:git:`mgmt/`.
-
-This is a simple serialization style RPC which runs over unix domain sockets. The following sections will detail the runtime structure, serialization mechanisms and how messages are passed from remote clients to |TServer|.
-
-
-=================
-Runtime Structure
-=================
-
-.. uml::
-   :align: center
-
-   hide empty members
-
-   node "traffic_manager"
-   node "traffic_server"
-
-   [traffic_ctl] <-d-> [traffic_manager] : Remote RPC
-   [other remote clients] <-u-> [traffic_manager] : Remote RPC
-   [traffic_manager] <-r-> [traffic_server] : Local RPC
-   [traffic_server] <-r-> [plugin] : Hook
-
-|TManager| opens a unix domain socket to receive commands from remote clients. |TManager| also has a unix domain socket connection with |TServer| to communicate.
-
-===============
-Message Passing
-===============
-
-Sequence diagram for a command sent from |TCtl| to when it is received by a plugin.
-
-.. figure:: ../../uml/images/RPC-sequence-diagram.svg
-
-.. note::
-
-    Currently a fire and forget model. traffic_manager sends out an asynchronous  signal without any acknowledgment. It then proceeds to send a response itself.
-
-=======================
-Remote RPC vs Local RPC
-=======================
-
-The RPC API for remote clients, such as |TCtl|, etc, is different from the RPC API used between |TManager| and |TServer|.
-
-|TManager| acts like a bridge for remote clients to interact with |TServer|. Thus, it is currently impossible to do things like have |TCtl| directly send messages to |TServer|. Classes suffixed with "Remote", ie. :ts:git:`CoreAPIRemote.cc`, and classes suffixed with "Local", ie. :ts:git:`NetworkUtilsLocal.cc` are for remote and local clients, respectively. The following sections will note which set of RPC's are relevant.
-
-=======================
-Serialization Mechanism
-=======================
-
-.. class:: MgmtMarshall
-
-   This is the class used to marshall data objects. It provides functions to marshall and unmarshall data. Each data object is associated with a field. Fields are of :type:`MgmtMarshallType`:
-
-    - **MGMT_MARSHALL_INT** : 4 bytes.
-    - **MGMT_MARSHALL_LONG** : 8 bytes.
-    - **MGMT_MARSHALL_STRING** : 4 bytes to indicate the string size in bytes, followed by the entire string and NULL terminator.
-    - **MGMT_MARSHALL_DATA** : 4 byt es to indicate data size in bytes, followed by the entire data object.
-
-When data is actually sent over a connection it must first be serialized. This is the general serialization mechanism for RPC communication.
-
-Generally, for remote clients sending messages to |TServer|, the message is serialized using remote RPC APIs. The serialized message is sent to |TManager| and |TManager| then simply relays the message to |TServer|. |TServer| eventually unserializes the message.
-
-Details for how |TManager| and |TServer| communicate are documented in the next section.
-
-Marshalling:
-============
-
-   .. function:: ssize_t mgmt_message_marshall(void *buf, size_t remain, const MgmtMarshallType *fields, unsigned count, ...)
-
-      Variable argument wrapper for ``mgmt_message_marshall_v``. Allows for different data types to be marshalled together as long as a field is specified for each data object. Arguments should be references to objects to be marshalled.
-
-   .. function:: ssize_t mgmt_message_marshall_v(void *buf, size_t remain, const MgmtMarshallType *fields, unsigned count, va_list ap)
-
-      This function goes through all the data objects and serializes them together into a buffer. Based on the field, the number of bytes is determined and if there is enough space, it is written into the buffer.
-
-Unmarshalling:
-==============
-
-   .. function:: ssize_t mgmt_message_parse(const void *buf, size_t len, const MgmtMarshallType *fields, unsigned count, ...)
-
-      Variable argument wrapper for ``mgmt_message_parse_v``. Reference to data object to store unmarshalled message needed for variable arguments.
-
-   .. function:: ssize_t mgmt_message_parse_v(const void *buf, size_t len, const MgmtMarshallType *fields, unsigned count, va_list ap)
-
-      This function parses all the serialized. Based on the field, the number of bytes to be read is determined and copied into a ``MgmtMarshallAnyPtr``.
-
-===================
-Local Serialization
-===================
-
-A RPC message is sent as a :class:`MgmtMessageHdr` followed by the serialized data in bytes. Serialization is very simple as the interface for communication between |TManager| and |TServer| only allows for :class:`MgmtMessageHdr`, which is a fixed size, and raw data in the form of :code:`char*` to be sent. A header specifies a :arg:`msg_id` and the :arg:`data_len`. On a read, the header is *always* first read. Based on the length of the data payload, the correct number of bytes is then r [...]
-
-.. class:: MgmtMessageHdr
-
-   .. member:: int msg_id
-
-      ID for the event or signal to be sent.
-
-   .. member:: int data_len
-
-      Length in bytes of the message.
-
-.. uml::
-
-   |Write|
-   start
-   :populate msg_id;
-   :populate data_len;
-   |#LightGreen|Socket|
-   :send MgmtMessageHdr;
-   |Write|
-   :get the raw data;
-   note left : casts from\nchar* to void*
-   |Socket|
-   :send raw data;
-   |Read|
-   :different address space;
-   : ...\nsome time later;
-   |Socket|
-   :read MgmtMessageHdr;
-   |Read|
-   :get data_len;
-   |Socket|
-   :read data_len bytes;
-   |Read|
-   :choose callback based on msg_id\nand send raw data;
-   stop
-
-==========================
-RPC API for remote clients
-==========================
-
-:ts:git:`NetworkMessage.cc` provides a set of APIs for remote clients to communicate with |TManager|.
-
-|TManager| will then send a response with the return value. The return value only indicates if the request was successfully propagated to |TServer|. Thus, there is no way currently for |TServer| to send information back to remote clients.
-
-.. function:: TSMgmtError send_mgmt_request(const mgmt_message_sender &snd, OpType optype, ...)
-.. function:: TSMgmtError send_mgmt_request(int fd, OpType optype, ...)
-
-      Send a request from a remote client to |TManager|.
-
-.. function:: TSMgmtError send_mgmt_response(int fd, OpType optype, ...)
-
-      Send a response from |TManager| to remote client.
-
-.. function:: TSMgmtError send_mgmt_error(int fd, OpType optype, TSMgmtError error)
-
-      Send err from |TManager| to remote client.
-
-.. function:: TSMgmtError recv_mgmt_request(void *buf, size_t buflen, OpType optype, ...)
-
-      Read request from remote client. Used by |TManager|.
-
-.. function:: TSMgmtError recv_mgmt_response(void *buf, size_t buflen, OpType optype, ...)
-
-      Read response from |TManager|. Used by remote clients.
-
-Using Remote RPC API Example
-============================
-
-This details how a remote client may use the :ts:git:`NetworkMessage.cc` interface to send messages to |TManager|. Leveraging :func:`send_mgmt_request` with a :class:`mgmt_message_sender` which specifies how *send* a message, a remote client can implement its own way to send messages to |TManager| to allow for things such as preprocessing messages.
-
-.. class:: mgmt_message_sender
-
-.. class:: mgmtapi_sender : public mgmt_message_sender
-
-   .. function:: TSMgmtError send(void *msg, size_t msglen) const override
-
-   Specifies how the message is to be sent. Can do things such as serialization or preprocessing based on parameters.
-
-.. code-block:: cpp
-
-   #define MGMTAPI_SEND_MESSAGE(fd, optype, ...) send_mgmt_request(mgmtapi_sender(fd), (optype), __VA_ARGS__)
-
-Now, using this macro, messages can easily be sent. For example:
-
-.. code-block:: cpp
-
-  TSMgmtError ret;
-  MgmtMarshallData reply    = {nullptr, 0};
-
-  // create and send request
-  ret = MGMTAPI_SEND_MESSAGE(main_socket_fd, op, &optype);
-  if (ret != TS_ERR_OKAY) {
-    goto done;
-  }
-
-  // get a response
-  ret = recv_mgmt_message(main_socket_fd, reply);
-  if (ret != TS_ERR_OKAY) {
-    goto done;
-  }
-
-====================================
-RPC API for |TServer| and |TManager|
-====================================
-
-.. figure:: ../../uml/images/RPC-states.svg
-   :align: center
-
-|LM| and |PM| follow similar workflows. A manager will poll the socket for any messages. If it is able to read a message, it will handle it based on the :arg:`msg_id` from the :class:`MgmtMessageHdr` and select a callback to run asynchoronously. The async callback will add a response, if any, to an outgoing event queue within the class. A manager will continue to poll and read on the socket as long as there are messages available. Two things can stop a manager from polling.
-
-1. there are no longer any messages on the socket for a *timeout* time period.
-
-#. an external event, for example, a |TCtl| command, triggers an ``eventfd`` to tell the manager to stop polling. In the case of an external event, the manager will finish reading anything on the socket, but it will not wait for any timeout period. So, if there are three pending events on the socket, all three will be processed and then immediately after, the manager will stop polling.
-
-Once a manager is done polling, it will begin to send out messages from it's outgoing event queue. It continues to do this until there are no more messages left. Note that as a manager is polling, it is unable to write anything on the socket itself so the number of messages read will always be exhaustive.
-
-.. class:: BaseManager
-
-LocalManager
-============
-
-.. class:: LocalManager :  public BaseManager
-
-   This class is used by |TManager| to communicate with |TServer|
-
-   .. function:: void pollMgmtProcessServer()
-
-      This function watches the socket and handles incoming messages from processes. Used in the main event loop of |TManager|.
-
-   .. function:: void sendMgmtMsgToProcesses(MgmtMessageHdr *mh)
-
-      This function is used by |TManager| to process the messages based on :arg:`msg_id`. It then sends the message to |TServer| over sockets.
-
-ProcessManager
-==============
-
-.. class:: ProcessManager : public BaseManager
-
-   This class is used by |TServer| to communicate with |TManager|
-
-   .. function:: int pollLMConnection()
-
-      This function periodically polls the socket to see if there are any messages from the |LM|.
-
-   .. function:: void signalManager (int msg_id, const char *data_raw, int data_len)
-
-      This function sends messages to the |LM| using sockets.
-
-.. note::
-
-   1. Both :func:`LocalManager::pollMgmtProcessServer` and :func:`ProcessManager::pollLMConnection` actually use ``select``, not ``poll`` or ``epoll``, underneath.
diff --git a/doc/developer-guide/introduction/header-file-structure.en.rst b/doc/developer-guide/introduction/header-file-structure.en.rst
index edee3b166..ae7490c28 100644
--- a/doc/developer-guide/introduction/header-file-structure.en.rst
+++ b/doc/developer-guide/introduction/header-file-structure.en.rst
@@ -34,14 +34,14 @@ are available to plugins.
    same directory). These provide functionality that is used inside the |TS| core logic but has been
    demonstrated to be useful for plugins as well [#]_. The functions are in the library
    ``libtscpputil.so``, although many of the utilities are header only. This library is linked in to
-   the ``traffic_server`` and ``traffic_manager`` binaries and so linkage may not be needed for a plugin.
+   the ``traffic_server`` binary and so linkage may not be needed for a plugin.
 
    This library is independent of the C++ API and can be used with or without that library.
 
 "tscore"
    |TS| core header files. These can only be used inside |TS| itself because they either depend on internal
-   data structures either directly or operationally. This is linked in to the ``traffic_server`` and
-   ``traffic_manager`` binaries therefore has no explicit linkage when used in the core.
+   data structures either directly or operationally. This is linked in to the ``traffic_server`` binary therefore
+   has no explicit linkage when used in the core.
 
 Historical
 ==========
diff --git a/doc/developer-guide/jsonrpc/jsonrpc-architecture.en.rst b/doc/developer-guide/jsonrpc/jsonrpc-architecture.en.rst
index 91489c5e9..5f8605456 100644
--- a/doc/developer-guide/jsonrpc/jsonrpc-architecture.en.rst
+++ b/doc/developer-guide/jsonrpc/jsonrpc-architecture.en.rst
@@ -116,7 +116,7 @@ you also can find this information in the `JSONRPC`_ link.
 Requests
 --------
 
-Please find the `jsonrpc 2.0 request` schema for reference ( `mgmt2/rpc/schema/jsonrpc_request_schema.json` ).
+Please find the `jsonrpc 2.0 request` schema for reference ( `mgmt/rpc/schema/jsonrpc_request_schema.json` ).
 
 * Mandatory fields.
 
@@ -209,7 +209,7 @@ Responses
 Although each individual API call will describe the response details and some specific errors, in this section we will describe a high
 level protocol response, some defined by the `JSONRPC`_ specs and some by |TS|
 
-Please find the `jsonrpc 2.0 response` schema for reference( `mgmt2/rpc/schema/jsonrpc_response_schema.json` ).
+Please find the `jsonrpc 2.0 response` schema for reference( `mgmt/rpc/schema/jsonrpc_response_schema.json` ).
 
 
 
diff --git a/doc/developer-guide/layout/runroot.en.rst b/doc/developer-guide/layout/runroot.en.rst
index 07c73bf93..9ad2e129e 100644
--- a/doc/developer-guide/layout/runroot.en.rst
+++ b/doc/developer-guide/layout/runroot.en.rst
@@ -52,7 +52,7 @@ Work flow:
 #. Compiler defaults in layout class
 
 Right now, the following programs are integrated with the runroot logic:
-**traffic_server**, **traffic_manager**, **traffic_ctl**, **traffic_layout**, **traffic_crashlog**, **traffic_logcat**, **traffic_logstat**.
+**traffic_server**, **traffic_ctl**, **traffic_layout**, **traffic_crashlog**, **traffic_logcat**, **traffic_logstat**.
 
 The YAML file
 =============
diff --git a/doc/manpages.py b/doc/manpages.py
index 66644997e..6ef5e0962 100644
--- a/doc/manpages.py
+++ b/doc/manpages.py
@@ -35,8 +35,6 @@ man_pages = [
         u'Traffic Server log spooler', None, '8'),
     ('appendices/command-line/traffic_logstats.en', 'traffic_logstats',
         u'Traffic Server analyzer', None, '8'),
-    ('appendices/command-line/traffic_manager.en', 'traffic_manager',
-        u'Traffic Server process manager', None, '8'),
     ('appendices/command-line/traffic_server.en', 'traffic_server',
         u'Traffic Server', None, '8'),
     ('appendices/command-line/traffic_top.en', 'traffic_top',
diff --git a/include/shared/rpc/README.md b/include/shared/rpc/README.md
index 23a72ef9c..f4b616c9c 100644
--- a/include/shared/rpc/README.md
+++ b/include/shared/rpc/README.md
@@ -5,5 +5,5 @@ are looking to interact with it in a different C++ application, like traffic_ctl
 and traffic_top.
 All this definitions under the shared::rpc namespace are a client lightweight
 version of the ones used internally by the JSONRPC node server/handlers, they
-should not be mixed with the ones defined in `mgmt2/rpc/jsonrpc` which are for
+should not be mixed with the ones defined in `mgmt/rpc/jsonrpc` which are for
 internal use only.
diff --git a/include/ts/experimental.h b/include/ts/experimental.h
index deef0ab3f..309909022 100644
--- a/include/ts/experimental.h
+++ b/include/ts/experimental.h
@@ -327,6 +327,7 @@ tsapi char *TSMatcherLineValue(TSMatcherLine ml, int element);
 /****************************************************************************
  *  Set a records.config integer variable
  ****************************************************************************/
+// DEPRECATED
 tsapi TSReturnCode TSMgmtConfigIntSet(const char *var_name, TSMgmtInt value);
 
 tsapi TSReturnCode TSMgmtConfigFileAdd(const char *parent, const char *fileName);
diff --git a/include/tscore/DiagsTypes.h b/include/tscore/DiagsTypes.h
index e1e8fd321..e199bdcc5 100644
--- a/include/tscore/DiagsTypes.h
+++ b/include/tscore/DiagsTypes.h
@@ -114,7 +114,7 @@ private:
 //      * debugging tags to selectively enable & disable diagnostics
 //      * action tags to selectively enable & disable code paths
 //      * configurable output to stdout, stderr, syslog, error logs
-//      * traffic_manager interface supporting on-the-fly reconfiguration
+//      * interface to supporting on-the-fly reconfiguration
 //
 //////////////////////////////////////////////////////////////////////////////
 
diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc
index 22b502aac..4f5c0a2da 100644
--- a/iocore/cache/Cache.cc
+++ b/iocore/cache/Cache.cc
@@ -2020,12 +2020,10 @@ AIO_Callback_handler::handle_disk_failure(int /* event ATS_UNUSED */, void *data
       if (!DISK_BAD(d)) {
         snprintf(message, sizeof(message), "Error accessing Disk %s [%d/%d]", d->path, d->num_errors, cache_config_max_disk_errors);
         Warning("%s", message);
-        RecSignalManager(REC_SIGNAL_CACHE_WARNING, message);
       } else if (!DISK_BAD_SIGNALLED(d)) {
         snprintf(message, sizeof(message), "too many errors accessing disk %s [%d/%d]: declaring disk bad", d->path, d->num_errors,
                  cache_config_max_disk_errors);
         Warning("%s", message);
-        RecSignalManager(REC_SIGNAL_CACHE_ERROR, message);
         cacheProcessor.mark_storage_offline(d); // take it out of service
       }
       break;
diff --git a/iocore/cache/CacheHosting.cc b/iocore/cache/CacheHosting.cc
index 36e8afd59..cbe665c0f 100644
--- a/iocore/cache/CacheHosting.cc
+++ b/iocore/cache/CacheHosting.cc
@@ -286,8 +286,7 @@ CacheHostTable::BuildTableFromString(const char *config_file_path, char *file_bu
       errPtr  = parseConfigLine(const_cast<char *>(tmp), current, &config_tags);
 
       if (errPtr != nullptr) {
-        RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry at line %d : %s", matcher_name, config_file_path,
-                         line_num, errPtr);
+        Warning("%s discarding %s entry at line %d : %s", matcher_name, config_file_path, line_num, errPtr);
         ats_free(current);
       } else {
         // Line parsed ok.  Figure out what the destination
@@ -366,8 +365,7 @@ CacheHostTable::BuildTableFromString(const char *config_file_path, char *file_bu
         hostMatch->NewEntry(current);
       }
     } else {
-      RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry with unknown type at line %d", matcher_name,
-                       config_file_path, current->line_num);
+      Warning("%s discarding %s entry with unknown type at line %d", matcher_name, config_file_path, current->line_num);
     }
 
     // Deallocate the parsing structure
@@ -380,9 +378,7 @@ CacheHostTable::BuildTableFromString(const char *config_file_path, char *file_bu
 
   if (!generic_rec_initd) {
     const char *cache_type = (type == CACHE_HTTP_TYPE) ? "http" : "mixt";
-    RecSignalWarning(REC_SIGNAL_CONFIG_ERROR,
-                     "No Volumes specified for Generic Hostnames for %s documents: %s cache will be disabled", cache_type,
-                     cache_type);
+    Warning("No Volumes specified for Generic Hostnames for %s documents: %s cache will be disabled", cache_type, cache_type);
   }
 
   ink_assert(second_pass == numEntries);
@@ -436,7 +432,7 @@ CacheHostRecord::Init(CacheType typ)
     }
   }
   if (!num_cachevols) {
-    RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "error: No volumes found for Cache Type %d", type);
+    Warning("error: No volumes found for Cache Type %d", type);
     return -1;
   }
   vols        = static_cast<Vol **>(ats_malloc(num_vols * sizeof(Vol *)));
@@ -485,16 +481,18 @@ CacheHostRecord::Init(matcher_line *line_info, CacheType typ)
           s++;
           if (!(*s)) {
             const char *errptr = "A volume number expected";
-            RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry at line %d :%s", "[CacheHosting]", config_file,
-                             line_info->line_num, errptr);
-            ats_free(val);
+            Warning("%s discarding %s entry at line %d :%s", "[CacheHosting]", config_file, line_info->line_num, errptr);
+            if (val != nullptr) {
+              ats_free(val);
+            }
             return -1;
           }
         }
         if ((*s < '0') || (*s > '9')) {
-          RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry at line %d : bad token [%c]", "[CacheHosting]",
-                           config_file, line_info->line_num, *s);
-          ats_free(val);
+          Warning("%s discarding %s entry at line %d : bad token [%c]", "[CacheHosting]", config_file, line_info->line_num, *s);
+          if (val != nullptr) {
+            ats_free(val);
+          }
           return -1;
         }
         s++;
@@ -528,9 +526,11 @@ CacheHostRecord::Init(matcher_line *line_info, CacheType typ)
             }
           }
           if (!is_vol_present) {
-            RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry at line %d : bad volume number [%d]",
-                             "[CacheHosting]", config_file, line_info->line_num, volume_number);
-            ats_free(val);
+            Warning("%s discarding %s entry at line %d : bad volume number [%d]", "[CacheHosting]", config_file,
+                    line_info->line_num, volume_number);
+            if (val != nullptr) {
+              ats_free(val);
+            }
             return -1;
           }
           if (c == '\0') {
@@ -545,14 +545,12 @@ CacheHostRecord::Init(matcher_line *line_info, CacheType typ)
       break;
     }
 
-    RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry at line %d : bad token [%s]", "[CacheHosting]", config_file,
-                     line_info->line_num, label);
+    Warning("%s discarding %s entry at line %d : bad token [%s]", "[CacheHosting]", config_file, line_info->line_num, label);
     return -1;
   }
 
   if (i == MATCHER_MAX_TOKENS) {
-    RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry at line %d : No volumes specified", "[CacheHosting]",
-                     config_file, line_info->line_num);
+    Warning("%s discarding %s entry at line %d : No volumes specified", "[CacheHosting]", config_file, line_info->line_num);
     return -1;
   }
 
@@ -758,8 +756,7 @@ ConfigVolumes::BuildListFromString(char *config_file_path, char *file_buf)
     }
 
     if (err) {
-      RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s discarding %s entry at line %d : %s", matcher_name, config_file_path, line_num,
-                       err);
+      Warning("%s discarding %s entry at line %d : %s", matcher_name, config_file_path, line_num, err);
     } else if (volume_number && size && scheme) {
       /* add the config */
 
diff --git a/iocore/cache/Store.cc b/iocore/cache/Store.cc
index 85a9d556b..d9e4cd6cf 100644
--- a/iocore/cache/Store.cc
+++ b/iocore/cache/Store.cc
@@ -386,7 +386,6 @@ Store::read_config()
     Debug("cache_init", "Store::read_config - ns = new Span; ns->init(\"%s\",%" PRId64 "), forced volume=%d%s%s", pp.c_str(), size,
           volume_num, seed ? " id=" : "", seed ? seed : "");
     if ((err = ns->init(pp.c_str(), size))) {
-      RecSignalWarning(REC_SIGNAL_SYSTEM_ERROR, "could not initialize storage \"%s\" [%s]", pp.c_str(), err);
       Debug("cache_init", "Store::read_config - could not initialize storage \"%s\" [%s]", pp.c_str(), err);
       delete ns;
       continue;
diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc
index 0095fd70f..d8982c493 100644
--- a/iocore/hostdb/HostDB.cc
+++ b/iocore/hostdb/HostDB.cc
@@ -29,6 +29,7 @@
 #include "tscore/ts_file.h"
 #include "tscore/ink_apidefs.h"
 #include "tscore/bwf_std_format.h"
+#include "MgmtDefs.h" // MgmtInt, MgmtFloat, etc
 
 #include <utility>
 #include <vector>
diff --git a/iocore/net/P_SSLCertLookup.h b/iocore/net/P_SSLCertLookup.h
index a36aba9db..e8ddf627d 100644
--- a/iocore/net/P_SSLCertLookup.h
+++ b/iocore/net/P_SSLCertLookup.h
@@ -25,6 +25,8 @@
 
 #include <set>
 #include <openssl/ssl.h>
+#include <mutex>
+#include <unordered_map>
 
 #include "ProxyConfig.h"
 
diff --git a/iocore/net/P_UnixNet.h b/iocore/net/P_UnixNet.h
index cff9439e9..676b28f0c 100644
--- a/iocore/net/P_UnixNet.h
+++ b/iocore/net/P_UnixNet.h
@@ -432,7 +432,7 @@ check_shedding_warning()
   ink_hrtime t = Thread::get_hrtime();
   if (t - last_shedding_warning > NET_THROTTLE_MESSAGE_EVERY) {
     last_shedding_warning = t;
-    RecSignalWarning(REC_SIGNAL_SYSTEM_ERROR, "number of connections reaching shedding limit");
+    Warning("number of connections reaching shedding limit");
   }
 }
 
@@ -454,9 +454,8 @@ check_throttle_warning(ThrottleType type)
   if (t - last_throttle_warning > NET_THROTTLE_MESSAGE_EVERY) {
     last_throttle_warning = t;
     int connections       = net_connections_to_throttle(type);
-    RecSignalWarning(REC_SIGNAL_SYSTEM_ERROR,
-                     "too many connections, throttling.  connection_type=%s, current_connections=%d, net_connections_throttle=%d",
-                     type == ACCEPT ? "ACCEPT" : "CONNECT", connections, net_connections_throttle);
+    Warning("too many connections, throttling.  connection_type=%s, current_connections=%d, net_connections_throttle=%d",
+            type == ACCEPT ? "ACCEPT" : "CONNECT", connections, net_connections_throttle);
   }
 }
 
diff --git a/iocore/net/SSLUtils.cc b/iocore/net/SSLUtils.cc
index 22f170ce8..3a0c8d0a0 100644
--- a/iocore/net/SSLUtils.cc
+++ b/iocore/net/SSLUtils.cc
@@ -2060,8 +2060,7 @@ SSLMultiCertConfigLoader::load(SSLCertLookup *lookup)
       errPtr = parseConfigLine(line, &line_info, &sslCertTags);
       Debug("ssl", "currently parsing %s", line);
       if (errPtr != nullptr) {
-        RecSignalWarning(REC_SIGNAL_CONFIG_ERROR, "%s: discarding %s entry at line %d: %s", __func__, params->configFilePath,
-                         line_num, errPtr);
+        Warning("%s: discarding %s entry at line %d: %s", __func__, params->configFilePath, line_num, errPtr);
       } else {
         if (ssl_extract_certificate(&line_info, sslMultiCertSettings.get())) {
           // There must be a certificate specified unless the tunnel action is set
diff --git a/iocore/net/libinknet_stub.cc b/iocore/net/libinknet_stub.cc
index d9771d902..64c5efee1 100644
--- a/iocore/net/libinknet_stub.cc
+++ b/iocore/net/libinknet_stub.cc
@@ -139,30 +139,6 @@ SslAPIHooks *ssl_hooks             = nullptr;
 LifecycleAPIHooks *lifecycle_hooks = nullptr;
 StatPagesManager statPagesManager;
 
-#include "ProcessManager.h"
-ProcessManager *pmgmt = nullptr;
-
-int
-BaseManager::registerMgmtCallback(int, MgmtCallback const &)
-{
-  ink_assert(false);
-  return 0;
-}
-
-void
-ProcessManager::signalManager(int, char const *, int)
-{
-  ink_assert(false);
-  return;
-}
-
-void
-ProcessManager::signalManager(int, char const *)
-{
-  ink_assert(false);
-  return;
-}
-
 #include "PreWarmManager.h"
 void
 PreWarmManager::reconfigure()
diff --git a/iocore/net/test_certlookup.cc b/iocore/net/test_certlookup.cc
index fa1d793d2..1c0e74304 100644
--- a/iocore/net/test_certlookup.cc
+++ b/iocore/net/test_certlookup.cc
@@ -43,11 +43,11 @@ REGRESSION_TEST(SSLCertificateLookup)(RegressionTest *t, int /* atype ATS_UNUSED
 
   box = REGRESSION_TEST_PASSED;
 
-  assert(wild != nullptr);
-  assert(notwild != nullptr);
-  assert(b_notwild != nullptr);
-  assert(foo != nullptr);
-  assert(all_com != nullptr);
+  ink_assert(wild != nullptr);
+  ink_assert(notwild != nullptr);
+  ink_assert(b_notwild != nullptr);
+  ink_assert(foo != nullptr);
+  ink_assert(all_com != nullptr);
 
   box.check(lookup.insert("www.foo.com", foo_cc) >= 0, "insert host context");
   // Insert the same SSL_CTX instance under another name too
diff --git a/lib/perl/MANIFEST b/lib/perl/MANIFEST
index 51aeb642d..f8a23d6ad 100644
--- a/lib/perl/MANIFEST
+++ b/lib/perl/MANIFEST
@@ -2,8 +2,6 @@ Makefile.PL
 README
 examples/forw_proxy_conf.pl
 MANIFEST
-t/Apache-TS-AdminClient.t
 lib/Apache/TS.pm
 lib/Apache/TS/Config/Records.pm
-lib/Apache/TS/AdminClient.pm
 lib/Apache/TS/Config.pm
diff --git a/lib/perl/README b/lib/perl/README
index 0b10953f5..766abd940 100644
--- a/lib/perl/README
+++ b/lib/perl/README
@@ -4,9 +4,6 @@ Apache-TS version 3.4.0
 Apache::TS - a set of perl interfaces to manage an Apache Traffic Server
              instance. This includes the following sub-modules
 
-    Apache::TS::AdminClient - access the statistics and configuration
-     			      settings stored within Apache Traffic Server
-
     Apache::TS::Config - Manage Apache Traffic Server configs
 
     Apache::TS::Config::Records - Manage records.config settings.
diff --git a/lib/perl/lib/Apache/TS.pm.in b/lib/perl/lib/Apache/TS.pm.in
index f492fea8b..e6ca7bbd7 100644
--- a/lib/perl/lib/Apache/TS.pm.in
+++ b/lib/perl/lib/Apache/TS.pm.in
@@ -50,17 +50,19 @@ Apache::TS - a collection of Perl interfaces to manage Apache Traffic Server ins
 =head1 SYNOPSIS
 
   #!/usr/bin/perl
-  use Apache::TS::AdminClient;
+  use Apache::TS::Config::Records;
 
-  my $cli = Apache::TS::AdminClient->new(%input);
-  my $string = $cli->get_stat("proxy.config.product_company");
-  print "$string\n";
+  my $recedit = new Apache::TS::Config::Records(file => "etc/trafficserver/records.config.default");
+  # Threads
+  $recedit->set(conf => "proxy.config.exec_thread.autoconfig", val => "0");
+  # ...
+  # Write it all out
+  $recedit->write(file => "etc/trafficserver/records.config");
 
 
 =head1 DESCRIPTION
 
 This is the main module for Apache::TS, in includes the following sub-modules
-  Apache::TS::AdminClient
   Apache::TS::Config
   Apache::TS::Config::Records
 
diff --git a/lib/perl/lib/Apache/TS/AdminClient.pm b/lib/perl/lib/Apache/TS/AdminClient.pm
deleted file mode 100644
index 5c3410f93..000000000
--- a/lib/perl/lib/Apache/TS/AdminClient.pm
+++ /dev/null
@@ -1,625 +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 Apache::TS::AdminClient;
-
-use warnings;
-use strict;
-
-require 5.006;
-
-use Carp;
-use IO::Socket::UNIX;
-use IO::Select;
-
-use Apache::TS;
-
-# Mgmt API command constants, should track ts/mgmtapi.h
-use constant {
-    TS_RECORD_SET                 => 0,
-    TS_RECORD_GET                 => 1,
-    TS_PROXY_STATE_GET            => 2,
-    TS_PROXY_STATE_SET            => 3,
-    TS_RECONFIGURE                => 4,
-    TS_RESTART                    => 5,
-    TS_BOUNCE                     => 6,
-    TS_EVENT_RESOLVE              => 7,
-    TS_EVENT_GET_MLT              => 8,
-    TS_EVENT_ACTIVE               => 9,
-    TS_EVENT_REG_CALLBACK         => 10,
-    TS_EVENT_UNREG_CALLBACK       => 11,
-    TS_EVENT_NOTIFY               => 12,
-    TS_STATS_RESET_NODE           => 13,
-    TS_STORAGE_DEVICE_CMD_OFFLINE => 14,
-    TS_RECORD_MATCH_GET           => 15,
-    TS_API_PING                   => 16,
-    TS_SERVER_BACKTRACE           => 17,
-    TS_RECORD_DESCRIBE_CONFIG     => 18,
-    TS_LIFECYCLE_MESSAGE          => 19,
-    TS_UNDEFINED_OP               => 20
-};
-
-use constant {
-    TS_REC_INT     => 0,
-    TS_REC_COUNTER => 1,
-    TS_REC_FLOAT   => 2,
-    TS_REC_STRING  => 3
-};
-
-use constant {
-    TS_ERR_OKAY                => 0,
-    TS_ERR_READ_FILE           => 1,
-    TS_ERR_WRITE_FILE          => 2,
-    TS_ERR_PARSE_CONFIG_RULE   => 3,
-    TS_ERR_INVALID_CONFIG_RULE => 4,
-    TS_ERR_NET_ESTABLISH       => 5,
-    TS_ERR_NET_READ            => 6,
-    TS_ERR_NET_WRITE           => 7,
-    TS_ERR_NET_EOF             => 8,
-    TS_ERR_NET_TIMEOUT         => 9,
-    TS_ERR_SYS_CALL            => 10,
-    TS_ERR_PARAMS              => 11,
-    TS_ERR_FAIL                => 12
-};
-
-# Semi-intelligent way of finding the mgmtapi socket.
-sub _find_socket
-{
-    my $path = shift || "";
-    my $name = shift || "mgmtapi.sock";
-    my @sockets_def = (
-        $path,                          Apache::TS::PREFIX . '/' . Apache::TS::REL_RUNTIMEDIR . '/' . 'mgmtapi.sock',
-        '/usr/local/var/trafficserver', '/usr/local/var/run/trafficserver',
-        '/usr/local/var/run',           '/var/trafficserver',
-        '/var/run/trafficserver',       '/var/run',
-        '/opt/ats/var/trafficserver',
-    );
-
-    foreach my $socket (@sockets_def) {
-        return $socket if (-S $socket);
-        return "${socket}/${name}" if (-S "${socket}/${name}");
-
-    }
-    return undef;
-}
-
-#
-# Constructor
-#
-sub new
-{
-    my ($class, %args) = @_;
-    my $self = {};
-
-    $self->{_socket_path} = _find_socket($args{socket_path});
-    $self->{_socket}      = undef;
-    croak "Unable to locate socket, please pass socket_path with the management api socket location to Apache::TS::AdminClient"
-      if (!$self->{_socket_path});
-    if ((!-r $self->{_socket_path}) or (!-w $self->{_socket_path}) or (!-S $self->{_socket_path})) {
-        croak "Unable to open $self->{_socket_path} for reads or writes";
-    }
-
-    $self->{_select} = IO::Select->new();
-    bless $self, $class;
-
-    $self->open_socket();
-
-    return $self;
-}
-
-#
-# Destructor
-#
-sub DESTROY
-{
-    my $self = shift;
-    return $self->close_socket();
-}
-
-#
-# Open the socket (Unix domain)
-#
-sub open_socket
-{
-    my $self = shift;
-    my %args = @_;
-
-    if (defined($self->{_socket})) {
-        if ($args{force} || $args{reopen}) {
-            $self->close_socket();
-        } else {
-            return undef;
-        }
-    }
-
-    $self->{_socket} = IO::Socket::UNIX->new(
-        Type => SOCK_STREAM,
-        Peer => $self->{_socket_path}
-    ) or croak("Error opening socket - $@");
-
-    return undef unless defined($self->{_socket});
-    $self->{_select}->add($self->{_socket});
-
-    return $self;
-}
-
-sub close_socket
-{
-    my $self = shift;
-
-    # if socket doesn't exist, return as there's nothing to do.
-    return unless defined($self->{_socket});
-
-    # gracefully close socket.
-    $self->{_select}->remove($self->{_socket});
-    $self->{_socket}->close();
-    $self->{_socket} = undef;
-
-    return $self;
-}
-
-#
-# Do reads()'s on our Unix domain socket, takes an optional timeout, in ms's.
-#
-sub _do_read
-{
-    my $self    = shift;
-    my $timeout = shift || 1 / 1000.0;    # 1ms by default
-    my $res     = "";
-
-    while ($self->{_select}->can_read($timeout)) {
-        my $rc = $self->{_socket}->sysread($res, 1024, length($res));
-
-        # If the server dies we get into a infinite loop because
-        # IO::Select::can_read keeps returning true
-        # In this condition sysread returns 0 or undef
-        # Also, we want to return an undef rather than a partial response
-        # to avoid unmarshalling errors in the callers
-        if (!defined($rc) || ($rc == 0)) {
-            $res = undef;
-            last;
-        }
-    }
-
-    return $res || undef;
-}
-
-#
-# Get (read) a stat out of the local manager. Note that the assumption is
-# that you are calling this with an existing stats "name".
-#
-sub get_stat
-{
-    my ($self, $stat) = @_;
-    my $res = "";
-
-    return undef unless defined($self->{_socket});
-    return undef unless $self->{_select}->can_write(10);
-
-    # This is a total hack for now, we need to wrap this into the proper mgmt API library.
-    # The request format is:
-    #   MGMT_MARSHALL_INT: message length
-    #   MGMT_MARSHALL_INT: TS_RECORD_GET
-    #   MGMT_MARSHALL_STRING: record name
-    my $msg = pack("ll/Z", TS_RECORD_GET, $stat);
-    $self->{_socket}->print(pack("l/a", $msg));
-    $res = $self->_do_read();
-    return undef unless defined($res);    # Don't proceed on read failure.
-
-    # The response format is:
-    #   MGMT_MARSHALL_INT: message length
-    #   MGMT_MARSHALL_INT: error code
-    #   MGMT_MARSHALL_INT: record class
-    #   MGMT_MARSHALL_INT: record type
-    #   MGMT_MARSHALL_STRING: record name
-    #   MGMT_MARSHALL_DATA: record data
-    ($msg) = unpack("l/a", $res);
-    my ($ecode, $rclass, $type, $name, $value) = unpack("l l l l/Z l/a", $msg);
-
-    if ($ecode == TS_ERR_OKAY) {
-        if ($type == TS_REC_INT || $type == TS_REC_COUNTER) {
-            my ($ival) = unpack("q", $value);
-            return $ival;
-        } elsif ($type == TS_REC_FLOAT) {
-            my ($fval) = unpack("f", $value);
-            return $fval;
-        } elsif ($type == TS_REC_STRING) {
-            my ($sval) = unpack("Z*", $value);
-            return $sval;
-        }
-    }
-
-    return undef;
-}
-*get_config = \&get_stat;
-
-1;
-
-__END__
-
-#-=-=-=-=-=-=-=-= Give us some POD please =-=-=-=-=-=-=-=-
-
-=head1 NAME:
-
-Apache::TS::AdminClient - a perl interface to the statistics and configuration settings stored within Apache Traffic Server.
-
-=head1 SYNOPSIS
-
-  #!/usr/bin/perl
-  use Apache::TS::AdminClient;
-
-  my $cli = Apache::TS::AdminClient->new(%input);
-  my $string = $cli->get_stat("proxy.config.product_company");
-  print "$string\n";
-
-
-=head1 DESCRIPTION:
-
-AdminClient opens a TCP connection to a unix domain socket on local disk.  When the connection is established,
-AdminClient will write requests to the socket and wait for Apache Traffic Server to return a response.  Valid
-request strings can be found in RecordsConfig.cc which is included with Apache Traffic Server source.
-A list of valid request strings are included with this documentation, but this included list may not be complete
-as future releases of Apache Traffic Server may include new request strings or remove existing ones.
-
-=head1 CONSTRUCTOR
-
-When the object is created for this module, it assumes the 'Unix Domain Socket' is at the default location from
-the Apache Traffic Server installation. This can be changed when creating the object by setting B<'socket_path'>.
-For example:
-
-=over 4
-
-=item my $cli = AdminClient->new(socket_path=> "/var/trafficserver");
-
-
-This would make the module look for the 'Unix Domain Socket' in the directory '/var/trafficserver'. The path
-can optionally include the name of the Socket file, without it the constructor defaults to 'mgmtapi.sock'.
-
-=back
-
-=head1 PUBLIC METHODS
-
-To read a single metric (or configuration), two APIs are available:
-
-=over 4
-
-=item $cli->get_stat($stats_name);
-
-=item $cli->get_config($config_name);
-
-This will return a (scalar) value for this metric or configuration.
-
-=back
-
-=head1 traffic_ctl
-
-There is a command line tool included with Apache Traffic Server called traffic_ctl which overlaps with this module.  traffic_ctl
-can be used to read and write statistics or config settings that this module can.  Hence if you don't want to write a perl one-liner to
-get to this information, traffic_ctl is your tool.
-
-=head1 List of configurations
-
-The Apache Traffic Server Administration Manual will explain what these strings represent.  (https://docs.trafficserver.apache.org/en/latest/)
-
- proxy.config.accept_threads
- proxy.config.task_threads
- proxy.config.admin.synthetic_port
- proxy.config.admin.cli_path
- proxy.config.admin.user_id
- proxy.config.alarm.abs_path
- proxy.config.alarm.bin
- proxy.config.alarm.script_runtime
- proxy.config.bandwidth_mgmt.filename
- proxy.config.bin_path
- proxy.config.body_factory.enable_customizations
- proxy.config.body_factory.enable_logging
- proxy.config.body_factory.response_max_size
- proxy.config.body_factory.response_suppression_mode
- proxy.config.body_factory.template_sets_dir
- proxy.config.cache.agg_write_backlog
- proxy.config.cache.alt_rewrite_max_size
- proxy.config.cache.control.filename
- proxy.config.cache.dir.sync_frequency
- proxy.config.cache.enable_checksum
- proxy.config.cache.enable_read_while_writer
- proxy.config.cache.hostdb.disable_reverse_lookup
- proxy.config.cache.hostdb.sync_frequency
- proxy.config.cache.hosting_filename
- proxy.config.cache.ip_allow.filename
- proxy.config.cache.limits.http.max_alts
- proxy.config.cache.log.alternate.eviction
- proxy.config.cache.max_disk_errors
- proxy.config.cache.max_doc_size
- proxy.config.cache.min_average_object_size
- proxy.config.cache.volume_filename
- proxy.config.cache.permit.pinning
- proxy.config.cache.ram_cache_cutoff
- proxy.config.cache.ram_cache.size
- proxy.config.cache.select_alternate
- proxy.config.cache.threads_per_disk
- proxy.config.cache.mutex_retry_delay
- proxy.config.cop.core_signal
- proxy.config.cop.linux_min_memfree_kb
- proxy.config.cop.linux_min_swapfree_kb
- proxy.config.core_limit
- proxy.config.diags.action.enabled
- proxy.config.diags.action.tags
- proxy.config.diags.debug.enabled
- proxy.config.diags.debug.tags
- proxy.config.diags.output.alert
- proxy.config.diags.output.debug
- proxy.config.diags.output.diag
- proxy.config.diags.output.emergency
- proxy.config.diags.output.error
- proxy.config.diags.output.fatal
- proxy.config.diags.output.note
- proxy.config.diags.output.status
- proxy.config.diags.output.warning
- proxy.config.diags.show_location
- proxy.config.dns.failover_number
- proxy.config.dns.failover_period
- proxy.config.dns.lookup_timeout
- proxy.config.dns.max_dns_in_flight
- proxy.config.dns.nameservers
- proxy.config.dns.resolv_conf
- proxy.config.dns.retries
- proxy.config.dns.round_robin_nameservers
- proxy.config.dns.search_default_domains
- proxy.config.dns.splitDNS.enabled
- proxy.config.dns.splitdns.filename
- proxy.config.dump_mem_info_frequency
- proxy.config.env_prep
- proxy.config.exec_thread.autoconfig
- proxy.config.exec_thread.autoconfig.scale
- proxy.config.exec_thread.limit
- proxy.config.header.parse.no_host_url_redirect
- proxy.config.hostdb
- proxy.config.hostdb.fail.timeout
- proxy.config.hostdb.filename
- proxy.config.hostdb.lookup_timeout
- proxy.config.hostdb.migrate_on_demand
- proxy.config.hostdb.re_dns_on_reload
- proxy.config.hostdb.serve_stale_for
- proxy.config.hostdb.size
- proxy.config.hostdb.storage_path
- proxy.config.hostdb.storage_size
- proxy.config.hostdb.strict_round_robin
- proxy.config.hostdb.timeout
- proxy.config.hostdb.ttl_mode
- proxy.config.hostdb.verify_after
- proxy.config.http.accept_encoding_filter.filename
- proxy.config.http.accept_no_activity_timeout
- proxy.config.http.insert_client_ip
- proxy.config.http.anonymize_other_header_list
- proxy.config.http.anonymize_remove_client_ip
- proxy.config.http.anonymize_remove_cookie
- proxy.config.http.anonymize_remove_from
- proxy.config.http.anonymize_remove_referer
- proxy.config.http.anonymize_remove_user_agent
- proxy.config.http.background_fill_active_timeout
- proxy.config.http.background_fill_completed_threshold
- proxy.config.http.cache.cache_responses_to_cookies
- proxy.config.http.cache.cache_urls_that_look_dynamic
- proxy.config.http.cache.guaranteed_max_lifetime
- proxy.config.http.cache.guaranteed_min_lifetime
- proxy.config.http.cache.heuristic_lm_factor
- proxy.config.http.cache.heuristic_max_lifetime
- proxy.config.http.cache.heuristic_min_lifetime
- proxy.config.http.cache.http
- proxy.config.http.cache.ignore_accept_charset_mismatch
- proxy.config.http.cache.ignore_accept_encoding_mismatch
- proxy.config.http.cache.ignore_accept_language_mismatch
- proxy.config.http.cache.ignore_accept_mismatch
- proxy.config.http.cache.ignore_authentication
- proxy.config.http.cache.ignore_client_cc_max_age
- proxy.config.http.cache.ignore_client_no_cache
- proxy.config.http.cache.ignore_server_no_cache
- proxy.config.http.cache.ims_on_client_no_cache
- proxy.config.http.cache.max_open_read_retries
- proxy.config.http.cache.max_open_write_retries
- proxy.config.http.cache.max_stale_age
- proxy.config.http.cache.open_read_retry_time
- proxy.config.http.cache.range.lookup
- proxy.config.http.cache.range.write
- proxy.config.http.cache.required_headers
- proxy.config.http.cache.when_to_revalidate
- proxy.config.http.chunking_enabled
- proxy.config.http.connect_attempts_max_retries
- proxy.config.http.connect_attempts_max_retries_dead_server
- proxy.config.http.connect_attempts_rr_retries
- proxy.config.http.connect_attempts_timeout
- proxy.config.http.connect_ports
- proxy.config.http.default_buffer_size
- proxy.config.http.default_buffer_water_mark
- proxy.config.http.doc_in_cache_skip_dns
- proxy.config.http.down_server.cache_time
- proxy.config.http.enabled
- proxy.config.http.enable_http_info
- proxy.config.http.enable_http_stats
- proxy.config.http.errors.log_error_pages
- proxy.config.http.forward.proxy_auth_to_parent
- proxy.config.http.global_user_agent_header
- proxy.config.http.insert_age_in_response
- proxy.config.http.insert_request_via_str
- proxy.config.http.insert_response_via_str
- proxy.config.http.insert_squid_x_forwarded_for
- proxy.config.http.keep_alive_enabled_in
- proxy.config.http.keep_alive_enabled_out
- proxy.config.http.keep_alive_no_activity_timeout_in
- proxy.config.http.keep_alive_no_activity_timeout_out
- proxy.config.http.keep_alive_post_out
- proxy.config.http.negative_caching_enabled
- proxy.config.http.negative_caching_list
- proxy.config.http.negative_caching_lifetime
- proxy.config.http.negative_revalidating_enabled
- proxy.config.http.negative_revalidating_lifetime
- proxy.config.http.no_dns_just_forward_to_parent
- proxy.config.http.no_origin_server_dns
- proxy.config.http.normalize_ae_gzip
- proxy.config.http.number_of_redirections
- proxy.config.http.per_server.connection.max
- proxy.config.http.origin_min_keep_alive_connections
- proxy.config.http.parent_proxies
- proxy.config.http.parent_proxy.fail_threshold
- proxy.config.http.parent_proxy.file
- proxy.config.http.parent_proxy.per_parent_connect_attempts
- proxy.config.http.parent_proxy.retry_time
- proxy.config.http.parent_proxy.total_connect_attempts
- proxy.config.http.post_copy_size
- proxy.config.http.push_method_enabled
- proxy.config.http.quick_filter.mask
- proxy.config.http.record_heartbeat
- proxy.config.http.referer_default_redirect
- proxy.config.http.referer_filter
- proxy.config.http.referer_format_redirect
- proxy.config.http.request_header_max_size
- proxy.config.http.request_via_str
- proxy.config.http.response_header_max_size
- proxy.config.http.response_server_enabled
- proxy.config.http.response_server_str
- proxy.config.http.response_via_str
- proxy.config.http.send_http11_requests
- proxy.config.http.server_max_connections
- proxy.config.http.server_port
- proxy.config.http.slow.log.threshold
- proxy.config.http.connect_ports
- proxy.config.http.transaction_active_timeout_in
- proxy.config.http.transaction_active_timeout_out
- proxy.config.http.transaction_no_activity_timeout_in
- proxy.config.http.transaction_no_activity_timeout_out
- proxy.config.http_ui_enabled
- proxy.config.http.uncacheable_requests_bypass_parent
- proxy.config.io.max_buffer_size
- proxy.config.lm.pserver_timeout_msecs
- proxy.config.lm.pserver_timeout_secs
- proxy.config.local_state_dir
- proxy.config.log.ascii_buffer_size
- proxy.config.log.auto_delete_rolled_files
- proxy.config.log.file_stat_frequency
- proxy.config.log.hostname
- proxy.config.log.log_buffer_size
- proxy.config.log.logfile_dir
- proxy.config.log.logfile_perm
- proxy.config.log.logging_enabled
- proxy.config.log.max_line_size
- proxy.config.log.max_secs_per_buffer
- proxy.config.log.max_space_mb_for_logs
- proxy.config.log.max_space_mb_headroom
- proxy.config.log.overspill_report_count
- proxy.config.log.rolling_enabled
- proxy.config.log.rolling_interval_sec
- proxy.config.log.rolling_offset_hr
- proxy.config.log.rolling_size_mb
- proxy.config.log.sampling_frequency
- proxy.config.log.space_used_frequency
- proxy.config.log.config.filename
- proxy.config.manager_binary
- proxy.config.net.connections_throttle
- proxy.config.net.listen_backlog
- proxy.config.net.sock_mss_in
- proxy.config.net.sock_option_flag_in
- proxy.config.net.sock_option_flag_out
- proxy.config.net.sock_recv_buffer_size_in
- proxy.config.net.sock_recv_buffer_size_out
- proxy.config.net.sock_send_buffer_size_in
- proxy.config.net.sock_send_buffer_size_out
- proxy.config.net.defer_accept
- proxy.config.output.logfile
- proxy.config.plugin.plugin_dir
- proxy.config.process_manager.mgmt_port
- proxy.config.process_manager.timeout
- proxy.config.product_company
- proxy.config.product_name
- proxy.config.product_vendor
- proxy.config.proxy.authenticate.basic.realm
- proxy.config.proxy_binary
- proxy.config.proxy_binary_opts
- proxy.config.proxy_name
- proxy.config.remap.num_remap_threads
- proxy.config.res_track_memory
- proxy.config.reverse_proxy.enabled
- proxy.config.reverse_proxy.oldasxbehavior
- proxy.config.socks.accept_enabled
- proxy.config.socks.accept_port
- proxy.config.socks.connection_attempts
- proxy.config.socks.default_servers
- proxy.config.socks.http_port
- proxy.config.socks.per_server_connection_attempts
- proxy.config.socks.server_connect_timeout
- proxy.config.socks.server_fail_threshold
- proxy.config.socks.server_retry_time
- proxy.config.socks.server_retry_timeout
- proxy.config.socks.socks_config_file
- proxy.config.socks.socks_needed
- proxy.config.socks.socks_timeout
- proxy.config.socks.socks_version
- proxy.config.srv_enabled
- proxy.config.ssl.CA.cert.filename
- proxy.config.ssl.CA.cert.path
- proxy.config.ssl.client.CA.cert.filename
- proxy.config.ssl.client.CA.cert.path
- proxy.config.ssl.client.cert.filename
- proxy.config.ssl.client.certification_level
- proxy.config.ssl.client.cert.path
- proxy.config.ssl.client.private_key.filename
- proxy.config.ssl.client.private_key.path
- proxy.config.ssl.server.cert_chain.filename
- proxy.config.ssl.server.cert.path
- proxy.config.ssl.server.cipher_suite
- proxy.config.ssl.server.honor_cipher_order
- proxy.config.ssl.server.dhparams_file
- proxy.config.ssl.TLSv1
- proxy.config.ssl.TLSv1_1
- proxy.config.ssl.TLSv1_2
- proxy.config.ssl.TLSv1_3
- proxy.config.ssl.server.multicert.filename
- proxy.config.ssl.server.private_key.path
- proxy.config.ssl.keylog_file
- proxy.config.stat_collector.interval
- proxy.config.stat_collector.port
- proxy.config.syslog_facility
- proxy.config.system.file_max_pct
- proxy.config.thread.default.stacksize
- proxy.config.udp.free_cancelled_pkts_sec
- proxy.config.udp.periodic_cleanup
- proxy.config.udp.send_retries
- proxy.config.url_remap.filename
- proxy.config.url_remap.pristine_host_hdr
- proxy.config.url_remap.remap_required
-
-=head1 LICENSE
-
- Simple Apache Traffic Server client object, to communicate with the local manager.
-
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-=cut
-
-#-=-=-=-=-=-=-=-= No more POD for you =-=-=-=-=-=-=-=-
diff --git a/lib/perl/t/Apache-TS-AdminClient.t b/lib/perl/t/Apache-TS-AdminClient.t
deleted file mode 100644
index 53aeacee9..000000000
--- a/lib/perl/t/Apache-TS-AdminClient.t
+++ /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.
-
-# Before `make install' is performed this script should be runnable with
-# `make test'. After `make install' it should work as `perl Apache-TS-AdminClient.t'
-
-#########################
-
-# change 'tests => 1' to 'tests => last_test_to_print';
-
-
-use Test::More tests => 2;
-BEGIN { use_ok('Apache::TS::AdminClient') };
-
-#########################
-
-# Insert your test code below, the Test::More module is use()ed here so read
-# its man page ( perldoc Test::More ) for help writing this test script.
-
-#----- is this right or do we need to use Test::MockObject as well?
-our @methods = qw(new DESTROY open_socket close_socket get_stat);
-can_ok('Apache::TS::AdminClient', @methods);
diff --git a/lib/records/I_RecAlarms.h b/lib/records/I_RecAlarms.h
deleted file mode 100644
index f4843c9bb..000000000
--- a/lib/records/I_RecAlarms.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/** @file
-
-  Public REC_ALARM defines
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-// copy from mgmt/Alarms.h
-#define REC_ALARM_UNDEFINED 0
-
-#define REC_ALARM_PROXY_PROCESS_DIED 1
-#define REC_ALARM_PROXY_PROCESS_BORN 2
-#define REC_ALARM_PROXY_CONFIG_ERROR 3
-#define REC_ALARM_PROXY_SYSTEM_ERROR 4
-#define REC_ALARM_PROXY_CACHE_ERROR 5
-#define REC_ALARM_PROXY_CACHE_WARNING 6
-#define REC_ALARM_PROXY_LOGGING_ERROR 7
-#define REC_ALARM_PROXY_LOGGING_WARNING 8
-#define REC_ALARM_CONFIG_UPDATE_FAILED 9
diff --git a/lib/records/I_RecCore.h b/lib/records/I_RecCore.h
index 061ebb8db..90b0a03df 100644
--- a/lib/records/I_RecCore.h
+++ b/lib/records/I_RecCore.h
@@ -28,9 +28,6 @@
 #include "tscore/Diags.h"
 
 #include "I_RecDefs.h"
-#include "I_RecAlarms.h"
-#include "I_RecSignals.h"
-#include "I_RecEvents.h"
 #include "tscpp/util/MemSpan.h"
 
 struct RecRecord;
@@ -176,22 +173,6 @@ RecErrT RecGetRecordSource(const char *name, RecSourceT *source, bool lock = tru
 RecErrT RecGetRecordAccessType(const char *name, RecAccessT *secure, bool lock = true);
 RecErrT RecSetRecordAccessType(const char *name, RecAccessT secure, bool lock = true);
 
-//------------------------------------------------------------------------
-// Signal and Alarms
-//------------------------------------------------------------------------
-
-// RecSignalManager always sends a management signal up to traffic_manager.
-void RecSignalManager(int id, const char *, size_t);
-
-static inline void
-RecSignalManager(int id, const char *str)
-{
-  RecSignalManager(id, str, strlen(str) + 1);
-}
-
-// Format a message, and send it to the manager and to the Warning diagnostic.
-void RecSignalWarning(int sig, const char *fmt, ...) TS_PRINTFLIKE(2, 3);
-
 /// Generate a warning if any configuration name/value is not registered.
 void RecConfigWarnIfUnregistered();
 
@@ -300,9 +281,3 @@ RecErrT RecResetStatRecord(RecT type = RECT_NULL, bool all = false);
 // Set RecRecord attributes
 //------------------------------------------------------------------------
 RecErrT RecSetSyncRequired(char *name, bool lock = true);
-
-//------------------------------------------------------------------------
-// Manager Callback
-//------------------------------------------------------------------------
-using RecManagerCb = std::function<void(ts::MemSpan<void>)>;
-int RecRegisterManagerCb(int _signal, RecManagerCb const &_fn);
diff --git a/lib/records/I_RecDefs.h b/lib/records/I_RecDefs.h
index cfe920634..5baf5d968 100644
--- a/lib/records/I_RecDefs.h
+++ b/lib/records/I_RecDefs.h
@@ -100,7 +100,7 @@ enum RecUpdateT {
   RECU_NULL,       // default: don't know the behavior
   RECU_DYNAMIC,    // config can be updated dynamically w/ "traffic_ctl config reload"
   RECU_RESTART_TS, // config requires TS to be restarted to take effect
-  RECU_RESTART_TM, // config requires TM/TS to be restarted to take effect
+  RECU_RESTART_TM, // deprecated
 };
 
 enum RecCheckT {
@@ -125,7 +125,7 @@ enum RecModeT {
   RECM_NULL,
   RECM_CLIENT,
   RECM_SERVER,
-  RECM_STAND_ALONE,
+  RECM_STAND_ALONE, ///< The only option now as traffic_manager is no longer supported.
 };
 
 enum RecAccessT {
diff --git a/lib/records/I_RecEvents.h b/lib/records/I_RecEvents.h
deleted file mode 100644
index 3e3c47680..000000000
--- a/lib/records/I_RecEvents.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/** @file
-
-  Public REC_EVENT defines
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-// copy from mgmt/BaseManager.h
-#define REC_EVENT_SYNC_KEY 10000
-#define REC_EVENT_SHUTDOWN 10001
-#define REC_EVENT_RESTART 10002
-#define REC_EVENT_BOUNCE 10003
-#define REC_EVENT_CLEAR_STATS 10004
-#define REC_EVENT_CONFIG_FILE_UPDATE 10005
-#define REC_EVENT_PLUGIN_CONFIG_UPDATE 10006
-#define REC_EVENT_ROLL_LOG_FILES 10008
-#define REC_EVENT_LIBRECORDS 10009
-
-#define REC_EVENT_CACHE_DISK_CONTROL 10011
diff --git a/lib/records/I_RecSignals.h b/lib/records/I_RecSignals.h
deleted file mode 100644
index 2f1d5ab3c..000000000
--- a/lib/records/I_RecSignals.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/** @file
-
-  Public REC_SIGNAL defines
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-// copy from mgmt/BaseManager.h
-#define REC_SIGNAL_PID 0
-
-#define REC_SIGNAL_PROXY_PROCESS_DIED 1
-#define REC_SIGNAL_PROXY_PROCESS_BORN 2
-#define REC_SIGNAL_CONFIG_ERROR 3
-#define REC_SIGNAL_SYSTEM_ERROR 4
-#define REC_SIGNAL_CACHE_ERROR 5
-#define REC_SIGNAL_CACHE_WARNING 6
-#define REC_SIGNAL_LOGGING_ERROR 7
-#define REC_SIGNAL_LOGGING_WARNING 8
-#define REC_SIGNAL_PLUGIN_SET_CONFIG 9
-
-// This are additional on top of the ones defined in Alarms.h. Que?
-#define REC_SIGNAL_LIBRECORDS 10
-#define REC_SIGNAL_CONFIG_FILE_CHILD 11
diff --git a/lib/records/Makefile.am b/lib/records/Makefile.am
index 2dd0ca530..426b2bc9c 100644
--- a/lib/records/Makefile.am
+++ b/lib/records/Makefile.am
@@ -30,16 +30,13 @@ AM_CPPFLAGS += \
 	-I$(abs_top_srcdir)/lib \
 	$(TS_INCLUDES)
 
-noinst_LIBRARIES = librecords_lm.a librecords_p.a
+noinst_LIBRARIES = librecords_p.a
 
 librecords_COMMON = \
-	I_RecAlarms.h \
 	I_RecCore.h \
 	I_RecDefs.h \
-	I_RecEvents.h \
 	I_RecHttp.h \
 	I_RecMutex.h \
-	I_RecSignals.h \
 	P_RecCore.cc \
 	P_RecCore.h \
 	P_RecDefs.h \
@@ -56,12 +53,6 @@ librecords_COMMON = \
 	RecRawStats.cc \
 	RecUtils.cc
 
-librecords_lm_a_SOURCES = \
-	$(librecords_COMMON) \
-	I_RecLocal.h \
-	P_RecLocal.h \
-	RecLocal.cc
-
 librecords_p_a_SOURCES = \
 	$(librecords_COMMON) \
 	I_RecProcess.h \
diff --git a/lib/records/P_RecCore.cc b/lib/records/P_RecCore.cc
index 717011daf..d768f25ce 100644
--- a/lib/records/P_RecCore.cc
+++ b/lib/records/P_RecCore.cc
@@ -38,228 +38,6 @@
 
 RecModeT g_mode_type = RECM_NULL;
 
-//-------------------------------------------------------------------------
-// send_reset_message
-//-------------------------------------------------------------------------
-static RecErrT
-send_reset_message(RecRecord *record)
-{
-  RecMessage *m;
-
-  rec_mutex_acquire(&(record->lock));
-  m = RecMessageAlloc(RECG_RESET);
-  m = RecMessageMarshal_Realloc(m, record);
-  RecDebug(DL_Note, "[send] RECG_RESET [%d bytes]", sizeof(RecMessageHdr) + m->o_write - m->o_start);
-  RecMessageSend(m);
-  RecMessageFree(m);
-  rec_mutex_release(&(record->lock));
-
-  return REC_ERR_OKAY;
-}
-
-//-------------------------------------------------------------------------
-// send_set_message
-//-------------------------------------------------------------------------
-static RecErrT
-send_set_message(RecRecord *record)
-{
-  RecMessage *m;
-
-  rec_mutex_acquire(&(record->lock));
-  m = RecMessageAlloc(RECG_SET);
-  m = RecMessageMarshal_Realloc(m, record);
-  RecDebug(DL_Note, "[send] RECG_SET [%d bytes]", sizeof(RecMessageHdr) + m->o_write - m->o_start);
-  RecMessageSend(m);
-  RecMessageFree(m);
-  rec_mutex_release(&(record->lock));
-
-  return REC_ERR_OKAY;
-}
-
-//-------------------------------------------------------------------------
-// send_register_message
-//-------------------------------------------------------------------------
-RecErrT
-send_register_message(RecRecord *record)
-{
-  RecMessage *m;
-
-  rec_mutex_acquire(&(record->lock));
-  m = RecMessageAlloc(RECG_REGISTER);
-  m = RecMessageMarshal_Realloc(m, record);
-  RecDebug(DL_Note, "[send] RECG_REGISTER [%d bytes]", sizeof(RecMessageHdr) + m->o_write - m->o_start);
-  RecMessageSend(m);
-  RecMessageFree(m);
-  rec_mutex_release(&(record->lock));
-
-  return REC_ERR_OKAY;
-}
-
-//-------------------------------------------------------------------------
-// send_push_message
-//-------------------------------------------------------------------------
-RecErrT
-send_push_message()
-{
-  RecRecord *r;
-  RecMessage *m;
-  int i, num_records;
-  bool send_msg = false;
-
-  m           = RecMessageAlloc(RECG_PUSH);
-  num_records = g_num_records;
-  for (i = 0; i < num_records; i++) {
-    r = &(g_records[i]);
-    rec_mutex_acquire(&(r->lock));
-    if (i_am_the_record_owner(r->rec_type)) {
-      if (r->sync_required & REC_PEER_SYNC_REQUIRED) {
-        m = RecMessageMarshal_Realloc(m, r);
-        r->sync_required &= ~REC_PEER_SYNC_REQUIRED;
-        send_msg = true;
-      }
-    }
-    rec_mutex_release(&(r->lock));
-  }
-  if (send_msg) {
-    RecDebug(DL_Note, "[send] RECG_PUSH [%d bytes]", sizeof(RecMessageHdr) + m->o_write - m->o_start);
-    RecMessageSend(m);
-  }
-  RecMessageFree(m);
-
-  return REC_ERR_OKAY;
-}
-
-//-------------------------------------------------------------------------
-// send_pull_message
-//-------------------------------------------------------------------------
-RecErrT
-send_pull_message(RecMessageT msg_type)
-{
-  RecRecord *r;
-  RecMessage *m;
-  int i, num_records;
-
-  m = RecMessageAlloc(msg_type);
-  switch (msg_type) {
-  case RECG_PULL_REQ:
-    // We're requesting all of the records from our peer.  No payload
-    // here, just send the message.
-    RecDebug(DL_Note, "[send] RECG_PULL_REQ [%d bytes]", sizeof(RecMessageHdr) + m->o_write - m->o_start);
-    break;
-
-  case RECG_PULL_ACK:
-    // Respond to a RECG_PULL_REQ message from our peer.  Send ALL
-    // records!  Also be sure to send a response even if it has no
-    // payload.  Our peer may be blocking and waiting for a response!
-    num_records = g_num_records;
-    for (i = 0; i < num_records; i++) {
-      r = &(g_records[i]);
-      if (i_am_the_record_owner(r->rec_type) || (REC_TYPE_IS_STAT(r->rec_type) && !(r->registered)) ||
-          (REC_TYPE_IS_STAT(r->rec_type) && (r->stat_meta.persist_type == RECP_NON_PERSISTENT))) {
-        rec_mutex_acquire(&(r->lock));
-        m = RecMessageMarshal_Realloc(m, r);
-        r->sync_required &= ~REC_PEER_SYNC_REQUIRED;
-        rec_mutex_release(&(r->lock));
-      }
-    }
-    RecDebug(DL_Note, "[send] RECG_PULL_ACK [%d bytes]", sizeof(RecMessageHdr) + m->o_write - m->o_start);
-    break;
-
-  default:
-    RecMessageFree(m);
-    return REC_ERR_FAIL;
-  }
-
-  RecMessageSend(m);
-  RecMessageFree(m);
-
-  return REC_ERR_OKAY;
-}
-
-//-------------------------------------------------------------------------
-// recv_message_cb
-//-------------------------------------------------------------------------
-RecErrT
-recv_message_cb(RecMessage *msg, RecMessageT msg_type, void * /* cookie */)
-{
-  RecRecord *r;
-  RecMessageItr itr;
-
-  switch (msg_type) {
-  case RECG_SET:
-
-    RecDebug(DL_Note, "[recv] RECG_SET [%d bytes]", sizeof(RecMessageHdr) + msg->o_end - msg->o_start);
-    if (RecMessageUnmarshalFirst(msg, &itr, &r) != REC_ERR_FAIL) {
-      do {
-        if (REC_TYPE_IS_STAT(r->rec_type)) {
-          RecSetRecord(r->rec_type, r->name, r->data_type, &(r->data), &(r->stat_meta.data_raw), REC_SOURCE_EXPLICIT);
-        } else {
-          RecSetRecord(r->rec_type, r->name, r->data_type, &(r->data), nullptr, REC_SOURCE_EXPLICIT);
-        }
-      } while (RecMessageUnmarshalNext(msg, &itr, &r) != REC_ERR_FAIL);
-    }
-    break;
-
-  case RECG_RESET:
-
-    RecDebug(DL_Note, "[recv] RECG_RESET [%d bytes]", sizeof(RecMessageHdr) + msg->o_end - msg->o_start);
-    if (RecMessageUnmarshalFirst(msg, &itr, &r) != REC_ERR_FAIL) {
-      do {
-        if (REC_TYPE_IS_STAT(r->rec_type)) {
-          RecResetStatRecord(r->name);
-        } else {
-          RecSetRecord(r->rec_type, r->name, r->data_type, &(r->data), nullptr, REC_SOURCE_EXPLICIT);
-        }
-      } while (RecMessageUnmarshalNext(msg, &itr, &r) != REC_ERR_FAIL);
-    }
-    break;
-
-  case RECG_REGISTER:
-    RecDebug(DL_Note, "[recv] RECG_REGISTER [%d bytes]", sizeof(RecMessageHdr) + msg->o_end - msg->o_start);
-    if (RecMessageUnmarshalFirst(msg, &itr, &r) != REC_ERR_FAIL) {
-      do {
-        if (REC_TYPE_IS_STAT(r->rec_type)) {
-          RecRegisterStat(r->rec_type, r->name, r->data_type, r->data_default, r->stat_meta.persist_type);
-        } else if (REC_TYPE_IS_CONFIG(r->rec_type)) {
-          RecRegisterConfig(r->rec_type, r->name, r->data_type, r->data_default, r->config_meta.update_type,
-                            r->config_meta.check_type, r->config_meta.check_expr, r->config_meta.source,
-                            r->config_meta.access_type);
-        }
-      } while (RecMessageUnmarshalNext(msg, &itr, &r) != REC_ERR_FAIL);
-    }
-    break;
-
-  case RECG_PUSH:
-    RecDebug(DL_Note, "[recv] RECG_PUSH [%d bytes]", sizeof(RecMessageHdr) + msg->o_end - msg->o_start);
-    if (RecMessageUnmarshalFirst(msg, &itr, &r) != REC_ERR_FAIL) {
-      do {
-        RecForceInsert(r);
-      } while (RecMessageUnmarshalNext(msg, &itr, &r) != REC_ERR_FAIL);
-    }
-    break;
-
-  case RECG_PULL_ACK:
-    RecDebug(DL_Note, "[recv] RECG_PULL_ACK [%d bytes]", sizeof(RecMessageHdr) + msg->o_end - msg->o_start);
-    if (RecMessageUnmarshalFirst(msg, &itr, &r) != REC_ERR_FAIL) {
-      do {
-        RecForceInsert(r);
-      } while (RecMessageUnmarshalNext(msg, &itr, &r) != REC_ERR_FAIL);
-    }
-    break;
-
-  case RECG_PULL_REQ:
-    RecDebug(DL_Note, "[recv] RECG_PULL_REQ [%d bytes]", sizeof(RecMessageHdr) + msg->o_end - msg->o_start);
-    send_pull_message(RECG_PULL_ACK);
-    break;
-
-  default:
-    ink_assert(!"Unexpected RecG type");
-    return REC_ERR_FAIL;
-  }
-
-  return REC_ERR_OKAY;
-}
-
 //-------------------------------------------------------------------------
 // RecRegisterStatXXX
 //-------------------------------------------------------------------------
@@ -271,8 +49,6 @@ recv_message_cb(RecMessage *msg, RecMessageT msg_type, void * /* cookie */)
   if ((r = RecRegisterStat(rec_type, name, B, my_data_default, persist_type)) != nullptr) {                                   \
     if (i_am_the_record_owner(r->rec_type)) {                                                                                 \
       r->sync_required = r->sync_required | REC_PEER_SYNC_REQUIRED;                                                           \
-    } else {                                                                                                                  \
-      send_register_message(r);                                                                                               \
     }                                                                                                                         \
     return REC_ERR_OKAY;                                                                                                      \
   } else {                                                                                                                    \
@@ -314,8 +90,6 @@ _RecRegisterStatCounter(RecT rec_type, const char *name, RecCounter data_default
       nullptr) {                                                                                                                \
     if (i_am_the_record_owner(r->rec_type)) {                                                                                   \
       r->sync_required = r->sync_required | REC_PEER_SYNC_REQUIRED;                                                             \
-    } else {                                                                                                                    \
-      send_register_message(r);                                                                                                 \
     }                                                                                                                           \
     return REC_ERR_OKAY;                                                                                                        \
   } else {                                                                                                                      \
@@ -400,23 +174,6 @@ RecSetRecord(RecT rec_type, const char *name, RecDataT data_type, RecData *data,
         }
       }
       rec_mutex_release(&(r1->lock));
-    } else {
-      // We don't need to ats_strdup() here as we will make copies of any
-      // strings when we marshal them into our RecMessage buffer.
-      RecRecord r2;
-
-      RecRecordInit(&r2);
-      r2.rec_type  = rec_type;
-      r2.name      = name;
-      r2.data_type = (data_type != RECD_NULL) ? data_type : r1->data_type;
-      r2.data      = *data;
-      if (REC_TYPE_IS_STAT(r2.rec_type) && (data_raw != nullptr)) {
-        r2.stat_meta.data_raw = *data_raw;
-      } else if (REC_TYPE_IS_CONFIG(r2.rec_type)) {
-        r2.config_meta.source = source;
-      }
-      err = send_set_message(&r2);
-      RecRecordFree(&r2);
     }
   } else {
     // Add the record but do not set the 'registered' flag, as this
@@ -437,9 +194,8 @@ RecSetRecord(RecT rec_type, const char *name, RecDataT data_type, RecData *data,
     }
     if (i_am_the_record_owner(r1->rec_type)) {
       r1->sync_required = r1->sync_required | REC_PEER_SYNC_REQUIRED;
-    } else {
-      err = send_set_message(r1);
     }
+    // else, error if  from rec_type?
     g_records_ht.emplace(name, r1);
   }
 
@@ -693,24 +449,13 @@ RecExecConfigUpdateCbs(unsigned int update_required_type)
 static RecErrT
 reset_stat_record(RecRecord *rec)
 {
-  RecErrT err;
+  RecErrT err = REC_ERR_FAIL;
 
   if (i_am_the_record_owner(rec->rec_type)) {
     rec_mutex_acquire(&(rec->lock));
     ++(rec->version);
     err = RecDataSet(rec->data_type, &(rec->data), &(rec->data_default)) ? REC_ERR_OKAY : REC_ERR_FAIL;
     rec_mutex_release(&(rec->lock));
-  } else {
-    RecRecord r2;
-
-    RecRecordInit(&r2);
-    r2.rec_type  = rec->rec_type;
-    r2.name      = rec->name;
-    r2.data_type = rec->data_type;
-    r2.data      = rec->data_default;
-
-    err = send_reset_message(&r2);
-    RecRecordFree(&r2);
   }
 
   return err;
@@ -785,24 +530,6 @@ RecSetSyncRequired(char *name, bool lock)
       }
       rec_mutex_release(&(r1->lock));
       err = REC_ERR_OKAY;
-    } else {
-      // No point of doing the following because our peer will
-      // set the value with RecDataSet. However, since
-      // r2.name == r1->name, the sync_required bit will not be
-      // set.
-
-      /*
-         RecRecord r2;
-
-         RecRecordInit(&r2);
-         r2.rec_type  = r1->rec_type;
-         r2.name      = r1->name;
-         r2.data_type = r1->data_type;
-         r2.data      = r1->data_default;
-
-         err = send_set_message(&r2);
-         RecRecordFree(&r2);
-       */
     }
   }
 
diff --git a/lib/records/P_RecCore.h b/lib/records/P_RecCore.h
index 5840f5d7e..9613222d8 100644
--- a/lib/records/P_RecCore.h
+++ b/lib/records/P_RecCore.h
@@ -84,10 +84,6 @@ RecErrT RecReadConfigFile();
 //-------------------------------------------------------------------------
 
 bool i_am_the_record_owner(RecT rec_type);
-RecErrT send_push_message();
-RecErrT send_pull_message(RecMessageT msg_type);
-RecErrT send_register_message(RecRecord *record);
-RecErrT recv_message_cb(RecMessage *msg, RecMessageT msg_type, void *cookie);
 RecUpdateT RecExecConfigUpdateCbs(unsigned int update_required_type);
 
 void RecDumpRecordsHt(RecT rec_type = RECT_NULL);
diff --git a/lib/records/P_RecLocal.h b/lib/records/P_RecLocal.h
index e9caf32c3..1a8381264 100644
--- a/lib/records/P_RecLocal.h
+++ b/lib/records/P_RecLocal.h
@@ -22,5 +22,3 @@
  */
 
 #pragma once
-
-#include "I_RecLocal.h"
diff --git a/lib/records/P_RecMessage.h b/lib/records/P_RecMessage.h
index 24930feb5..802c7b3c4 100644
--- a/lib/records/P_RecMessage.h
+++ b/lib/records/P_RecMessage.h
@@ -43,9 +43,7 @@ RecMessage *RecMessageMarshal_Realloc(RecMessage *msg, const RecRecord *record);
 int RecMessageUnmarshalFirst(RecMessage *msg, RecMessageItr *itr, RecRecord **record);
 int RecMessageUnmarshalNext(RecMessage *msg, RecMessageItr *itr, RecRecord **record);
 
-int RecMessageSend(RecMessage *msg);
 int RecMessageRegisterRecvCb(RecMessageRecvCb recv_cb, void *cookie);
-void RecMessageRecvThis(ts::MemSpan<void>);
 
 RecMessage *RecMessageReadFromDisk(const char *fpath);
 int RecMessageWriteToDisk(RecMessage *msg, const char *fpath);
diff --git a/lib/records/RecCore.cc b/lib/records/RecCore.cc
index 4fa791d1e..23de562d3 100644
--- a/lib/records/RecCore.cc
+++ b/lib/records/RecCore.cc
@@ -1262,22 +1262,6 @@ RecConfigReadPersistentStatsPath()
   return Layout::relative_to(rundir, ts::filename::RECORDS_STATS);
 }
 
-void
-RecSignalWarning(int sig, const char *fmt, ...)
-{
-  char msg[1024];
-  va_list args;
-
-  va_start(args, fmt);
-  WarningV(fmt, args);
-  va_end(args);
-
-  va_start(args, fmt);
-  vsnprintf(msg, sizeof(msg), fmt, args);
-  RecSignalManager(sig, msg);
-  va_end(args);
-}
-
 //-------------------------------------------------------------------------
 // RecConfigWarnIfUnregistered
 //-------------------------------------------------------------------------
diff --git a/lib/records/RecLocal.cc b/lib/records/RecLocal.cc
deleted file mode 100644
index 4604ef2b0..000000000
--- a/lib/records/RecLocal.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-/** @file
-
-  Record local definitions
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "tscore/ink_platform.h"
-#include "ConfigManager.h"
-#include "tscore/ParseRules.h"
-#include "P_RecCore.h"
-#include "P_RecLocal.h"
-#include "P_RecMessage.h"
-#include "P_RecUtils.h"
-#include "P_RecFile.h"
-#include "LocalManager.h"
-#include "FileManager.h"
-#include <tscore/TSSystemState.h>
-
-// Marks whether the message handler has been initialized.
-static bool message_initialized_p = false;
-
-//-------------------------------------------------------------------------
-// i_am_the_record_owner, only used for libreclocal.a
-//-------------------------------------------------------------------------
-bool
-i_am_the_record_owner(RecT rec_type)
-{
-  switch (rec_type) {
-  case RECT_CONFIG:
-  case RECT_NODE:
-  case RECT_LOCAL:
-    return true;
-  case RECT_PROCESS:
-  case RECT_PLUGIN:
-    return false;
-  default:
-    ink_assert(!"Unexpected RecT type");
-    return false;
-  }
-}
-
-//-------------------------------------------------------------------------
-// sync_thr
-//-------------------------------------------------------------------------
-static void *
-sync_thr(void *data)
-{
-  FileManager *configFiles = static_cast<FileManager *>(data);
-
-  while (!TSSystemState::is_event_system_shut_down()) {
-    RecBool check = true;
-
-    send_push_message();
-    RecSyncStatsFile();
-
-    // If we didn't successfully sync to disk, check whether we need to update ....
-    if (check) {
-      if (configFiles->isConfigStale()) {
-        RecSetRecordInt("proxy.node.config.reconfigure_required", 1, REC_SOURCE_DEFAULT);
-      }
-    }
-
-    usleep(REC_REMOTE_SYNC_INTERVAL_MS * 1000);
-  }
-
-  return nullptr;
-}
-
-//-------------------------------------------------------------------------
-// config_update_thr
-//-------------------------------------------------------------------------
-static void *
-config_update_thr(void * /* data */)
-{
-  while (!TSSystemState::is_event_system_shut_down()) {
-    switch (RecExecConfigUpdateCbs(REC_LOCAL_UPDATE_REQUIRED)) {
-    case RECU_RESTART_TS:
-      RecSetRecordInt("proxy.node.config.restart_required.proxy", 1, REC_SOURCE_DEFAULT);
-      break;
-    case RECU_RESTART_TM:
-      RecSetRecordInt("proxy.node.config.restart_required.proxy", 1, REC_SOURCE_DEFAULT);
-      RecSetRecordInt("proxy.node.config.restart_required.manager", 1, REC_SOURCE_DEFAULT);
-      break;
-    case RECU_NULL:
-    case RECU_DYNAMIC:
-      break;
-    }
-
-    usleep(REC_CONFIG_UPDATE_INTERVAL_MS * 1000);
-  }
-  return nullptr;
-}
-
-//-------------------------------------------------------------------------
-// RecMessageInit
-//-------------------------------------------------------------------------
-void
-RecMessageInit()
-{
-  ink_assert(g_mode_type != RECM_NULL);
-  lmgmt->registerMgmtCallback(MGMT_SIGNAL_LIBRECORDS, &RecMessageRecvThis);
-  message_initialized_p = true;
-}
-
-//-------------------------------------------------------------------------
-// RecLocalInit
-//-------------------------------------------------------------------------
-int
-RecLocalInit(Diags *_diags)
-{
-  static bool initialized_p = false;
-  ;
-
-  if (initialized_p) {
-    return REC_ERR_OKAY;
-  }
-
-  g_mode_type = RECM_SERVER;
-
-  if (RecCoreInit(RECM_SERVER, _diags) == REC_ERR_FAIL) {
-    return REC_ERR_FAIL;
-  }
-
-  initialized_p = true;
-
-  return REC_ERR_OKAY;
-}
-
-//-------------------------------------------------------------------------
-// RecLocalInitMessage
-//-------------------------------------------------------------------------
-int
-RecLocalInitMessage()
-{
-  static bool initialized_p = false;
-
-  if (initialized_p) {
-    return REC_ERR_OKAY;
-  }
-
-  RecMessageInit();
-  if (RecMessageRegisterRecvCb(recv_message_cb, nullptr)) {
-    return REC_ERR_FAIL;
-  }
-
-  initialized_p = true;
-
-  return REC_ERR_OKAY;
-}
-
-//-------------------------------------------------------------------------
-// RecLocalStart
-//-------------------------------------------------------------------------
-int
-RecLocalStart(FileManager *configFiles)
-{
-  ink_thread_create(nullptr, sync_thr, configFiles, 0, 0, nullptr);
-  ink_thread_create(nullptr, config_update_thr, nullptr, 0, 0, nullptr);
-  return REC_ERR_OKAY;
-}
-
-int
-RecRegisterManagerCb(int id, RecManagerCb const &_fn)
-{
-  return lmgmt->registerMgmtCallback(id, _fn);
-}
-
-void
-RecSignalManager(int id, const char *, size_t)
-{
-  // Signals are messages sent across the management pipe, so by definition,
-  // you can't send a signal if you are a local process manager.
-  RecDebug(DL_Debug, "local manager dropping signal %d", id);
-}
-
-//-------------------------------------------------------------------------
-// RecMessageSend
-//-------------------------------------------------------------------------
-
-int
-RecMessageSend(RecMessage *msg)
-{
-  int msg_size;
-
-  if (!message_initialized_p) {
-    return REC_ERR_OKAY;
-  }
-
-  // Make a copy of the record, but truncate it to the size actually used
-  if (g_mode_type == RECM_CLIENT || g_mode_type == RECM_SERVER) {
-    msg->o_end = msg->o_write;
-    msg_size   = sizeof(RecMessageHdr) + (msg->o_write - msg->o_start);
-    lmgmt->signalEvent(MGMT_EVENT_LIBRECORDS, reinterpret_cast<char *>(msg), msg_size);
-  }
-
-  return REC_ERR_OKAY;
-}
diff --git a/lib/records/RecMessage.cc b/lib/records/RecMessage.cc
index b51aa4d59..a4afd8e8c 100644
--- a/lib/records/RecMessage.cc
+++ b/lib/records/RecMessage.cc
@@ -240,17 +240,6 @@ RecMessageRegisterRecvCb(RecMessageRecvCb recv_cb, void *cookie)
   return REC_ERR_OKAY;
 }
 
-//-------------------------------------------------------------------------
-// RecMessageRecvThis
-//-------------------------------------------------------------------------
-
-void
-RecMessageRecvThis(ts::MemSpan<void> span)
-{
-  RecMessage *msg = static_cast<RecMessage *>(span.data());
-  g_recv_cb(msg, msg->msg_type, g_recv_cookie);
-}
-
 //-------------------------------------------------------------------------
 // RecMessageReadFromDisk
 //-------------------------------------------------------------------------
diff --git a/lib/records/RecProcess.cc b/lib/records/RecProcess.cc
index 970f2284b..c1bbe72bb 100644
--- a/lib/records/RecProcess.cc
+++ b/lib/records/RecProcess.cc
@@ -33,9 +33,6 @@
 #include "P_RecUtils.h"
 #include "P_RecFile.h"
 
-#include "mgmtapi.h"
-#include "ProcessManager.h"
-
 // Marks whether the message handler has been initialized.
 static bool message_initialized_p = false;
 static bool g_started             = false;
@@ -53,20 +50,7 @@ static Event *sync_cont_event;
 bool
 i_am_the_record_owner(RecT rec_type)
 {
-  if (g_mode_type == RECM_CLIENT) {
-    switch (rec_type) {
-    case RECT_PROCESS:
-    case RECT_PLUGIN:
-      return true;
-    case RECT_CONFIG:
-    case RECT_NODE:
-    case RECT_LOCAL:
-      return false;
-    default:
-      ink_assert(!"Unexpected RecT type");
-      return false;
-    }
-  } else if (g_mode_type == RECM_STAND_ALONE) {
+  if (g_mode_type == RECM_STAND_ALONE) {
     switch (rec_type) {
     case RECT_CONFIG:
     case RECT_PROCESS:
@@ -117,24 +101,6 @@ RecProcess_set_remote_sync_interval_ms(int ms)
   }
 }
 
-//-------------------------------------------------------------------------
-// recv_message_cb__process
-//-------------------------------------------------------------------------
-static RecErrT
-recv_message_cb__process(RecMessage *msg, RecMessageT msg_type, void *cookie)
-{
-  RecErrT err;
-
-  if ((err = recv_message_cb(msg, msg_type, cookie)) == REC_ERR_OKAY) {
-    if (msg_type == RECG_PULL_ACK) {
-      g_force_req_notify.lock();
-      g_force_req_notify.signal();
-      g_force_req_notify.unlock();
-    }
-  }
-  return err;
-}
-
 //-------------------------------------------------------------------------
 // raw_stat_sync_cont
 //-------------------------------------------------------------------------
@@ -188,7 +154,6 @@ struct sync_cont : public Continuation {
   int
   sync(int /* event */, Event * /* e */)
   {
-    send_push_message();
     RecSyncStatsFile();
 
     Debug("statsproc", "sync_cont() processed");
@@ -224,10 +189,8 @@ void
 RecMessageInit()
 {
   ink_assert(g_mode_type != RECM_NULL);
-  pmgmt->registerMgmtCallback(MGMT_EVENT_LIBRECORDS, &RecMessageRecvThis);
   message_initialized_p = true;
 }
-
 //-------------------------------------------------------------------------
 // RecProcessInitMessage
 //-------------------------------------------------------------------------
@@ -241,17 +204,6 @@ RecProcessInitMessage(RecModeT mode_type)
   }
 
   RecMessageInit();
-  if (RecMessageRegisterRecvCb(recv_message_cb__process, nullptr)) {
-    return REC_ERR_FAIL;
-  }
-
-  if (mode_type == RECM_CLIENT) {
-    send_pull_message(RECG_PULL_REQ);
-    g_force_req_notify.lock();
-    g_force_req_notify.wait();
-    g_force_req_notify.unlock();
-  }
-
   initialized_p = true;
 
   return REC_ERR_OKAY;
@@ -284,39 +236,3 @@ RecProcessStart()
 
   return REC_ERR_OKAY;
 }
-
-void
-RecSignalManager(int id, const char *msg, size_t msgsize)
-{
-  ink_assert(pmgmt);
-  pmgmt->signalManager(id, msg, msgsize);
-}
-
-int
-RecRegisterManagerCb(int _signal, RecManagerCb const &_fn)
-{
-  return pmgmt->registerMgmtCallback(_signal, _fn);
-}
-
-//-------------------------------------------------------------------------
-// RecMessageSend
-//-------------------------------------------------------------------------
-
-int
-RecMessageSend(RecMessage *msg)
-{
-  int msg_size;
-
-  if (!message_initialized_p) {
-    return REC_ERR_OKAY;
-  }
-
-  // Make a copy of the record, but truncate it to the size actually used
-  if (g_mode_type == RECM_CLIENT || g_mode_type == RECM_SERVER) {
-    msg->o_end = msg->o_write;
-    msg_size   = sizeof(RecMessageHdr) + (msg->o_write - msg->o_start);
-    pmgmt->signalManager(MGMT_SIGNAL_LIBRECORDS, reinterpret_cast<char *>(msg), msg_size);
-  }
-
-  return REC_ERR_OKAY;
-}
diff --git a/lib/records/RecRawStats.cc b/lib/records/RecRawStats.cc
index 9d87cbaa8..840308327 100644
--- a/lib/records/RecRawStats.cc
+++ b/lib/records/RecRawStats.cc
@@ -267,8 +267,6 @@ _RecRegisterRawStat(RecRawStatBlock *rsb, RecT rec_type, const char *name, RecDa
   r->rsb_id = id; // This is the index within the RSB raw block for this stat, used for lookups by name.
   if (i_am_the_record_owner(r->rec_type)) {
     r->sync_required = r->sync_required | REC_PEER_SYNC_REQUIRED;
-  } else {
-    send_register_message(r);
   }
 
   // store a pointer to our record->stat_meta.data_raw in our rsb
diff --git a/lib/records/test_I_RecLocal.cc b/lib/records/test_I_RecLocal.cc
index 056f1d1c1..4cba95a87 100644
--- a/lib/records/test_I_RecLocal.cc
+++ b/lib/records/test_I_RecLocal.cc
@@ -21,7 +21,6 @@
   limitations under the License.
  */
 
-#include "I_RecLocal.h"
 #include "P_RecUtils.h"
 #include "test_RecordsConfig.h"
 
diff --git a/lib/records/test_RecProcess.i b/lib/records/test_RecProcess.i
index e9c3c918e..70c756b96 100644
--- a/lib/records/test_RecProcess.i
+++ b/lib/records/test_RecProcess.i
@@ -593,8 +593,6 @@ main(int argc, char **argv)
   eventProcessor.start(4);
   RecProcessStart();
 
-  RecSignalManager(1, "This is a signal, signaled by RecSignalManager");
-
   // See if we're sync'd okay
   RecDumpRecordsHt(RECT_NULL);
 
diff --git a/mgmt/Alarms.cc b/mgmt/Alarms.cc
deleted file mode 100644
index 35f7d6415..000000000
--- a/mgmt/Alarms.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-/** @file
-
-  Function defs for the Alarms keeper.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "tscore/ink_platform.h"
-#include "tscore/ink_string.h"
-#include "tscore/ink_file.h"
-#include "tscore/ink_time.h"
-#include "MgmtUtils.h"
-#include "Alarms.h"
-
-#include "records/P_RecCore.h"
-
-const char *alarmText[] = {
-  "Unknown Alarm",                                        // 0
-  "[TrafficManager] Traffic Server process was reset.",   // 1
-  "[TrafficManager] Traffic Server process established.", // 2
-  "Invalid Configuration",                                // 3
-  "System Error",                                         // 4
-  "Cache Error",                                          // 5
-  "Cache Warning",                                        // 6
-  "Logging Error",                                        // 7
-  "Logging Warning",                                      // 8
-  "Alarms configuration update failed",                   // 9
-  "Librecords",                                           // 10 (unclear if needed / used)
-  "Plugin set configuration",                             // 11 (unclear if needed / used)
-};
-
-const int alarmTextNum = sizeof(alarmText) / sizeof(char *);
-
-// Return the alarm script directory. Use proxy.config.alarm.abs_path if it is
-// set, falling back to proxy.config.bin_path otherwise.
-static char *
-alarm_script_dir()
-{
-  char *path;
-
-  path = REC_readString("proxy.config.alarm.abs_path", nullptr);
-  if (path && *path) {
-    return path;
-  }
-
-  return ats_stringdup(RecConfigReadBinDir());
-}
-
-Alarms::Alarms()
-{
-  cur_cb = 0;
-  ink_mutex_init(&mutex);
-} /* End Alarms::Alarms */
-
-Alarms::~Alarms()
-{
-  for (auto &&it : local_alarms) {
-    ats_free(it.second);
-  }
-  for (auto &&it : remote_alarms) {
-    ats_free(it.second);
-  }
-  ink_mutex_destroy(&mutex);
-} /* End Alarms::Alarms */
-
-void
-Alarms::registerCallback(AlarmCallbackFunc func)
-{
-  char cb_buf[80];
-
-  ink_mutex_acquire(&mutex);
-  snprintf(cb_buf, sizeof(cb_buf), "%d", cur_cb++);
-  Debug("alarm", "[Alarms::registerCallback] Registering Alarms callback");
-  cblist.emplace(cb_buf, func);
-  ink_mutex_release(&mutex);
-} /* End Alarms::registerCallback */
-
-bool
-Alarms::isCurrentAlarm(alarm_t a, char *ip)
-{
-  bool ret = false;
-  char buf[80];
-
-  ink_mutex_acquire(&mutex);
-  if (!ip) {
-    snprintf(buf, sizeof(buf), "%d", a);
-  } else {
-    snprintf(buf, sizeof(buf), "%d-%s", a, ip);
-  }
-
-  if (!ip && local_alarms.find(buf) != local_alarms.end()) {
-    ret = true;
-  } else if (ip && remote_alarms.find(buf) != remote_alarms.end()) {
-    ret = true;
-  }
-  ink_mutex_release(&mutex);
-  return ret;
-} /* End Alarms::isCurrentAlarm */
-
-void
-Alarms::resolveAlarm(alarm_t a, char *ip)
-{
-  char buf[80];
-
-  ink_mutex_acquire(&mutex);
-  if (!ip) {
-    snprintf(buf, sizeof(buf), "%d", a);
-  } else {
-    snprintf(buf, sizeof(buf), "%d-%s", a, ip);
-  }
-
-  if (!ip && local_alarms.find(buf) != local_alarms.end()) {
-    Alarm *hash_value = local_alarms[buf];
-    local_alarms.erase(buf);
-    ats_free(hash_value->description);
-    ats_free(hash_value);
-  } else if (ip && remote_alarms.find(buf) != remote_alarms.end()) {
-    Alarm *hash_value = remote_alarms[buf];
-    remote_alarms.erase(buf);
-    ats_free(hash_value->description);
-    ats_free(hash_value);
-  }
-  ink_mutex_release(&mutex);
-
-  return;
-} /* End Alarms::resolveAlarm */
-
-void
-Alarms::signalAlarm(alarm_t a, const char *desc, const char *ip)
-{
-  static time_t last_sent           = 0;
-  static char prev_alarm_text[2048] = "";
-
-  int priority;
-  char buf[80];
-  Alarm *atmp;
-
-  /* Assign correct priorities */
-  switch (a) {
-  case MGMT_ALARM_PROXY_CACHE_ERROR:
-    priority = 1; // INKqa07595
-    break;
-  case MGMT_ALARM_PROXY_CACHE_WARNING:
-    return;
-  case MGMT_ALARM_PROXY_PROCESS_DIED:
-    priority = 1;
-    break;
-  case MGMT_ALARM_PROXY_PROCESS_BORN:
-    mgmt_log("[Alarms::signalAlarm] Server Process born\n");
-    return;
-  default:
-    priority = 2;
-    break;
-  }
-
-  /* Quick hack to buffer repeat alarms and only send every 15 min */
-  if (desc && (priority == 1 || priority == 2) && !ip) {
-    if (strcmp(prev_alarm_text, desc) == 0) { /* a repeated alarm */
-      time_t time_delta = time(nullptr) - last_sent;
-      if (time_delta < 900) {
-        mgmt_log("[Alarms::signalAlarm] Skipping Alarm: '%s'\n", desc);
-        return;
-      } else {
-        last_sent = time(nullptr);
-      }
-    } else {
-      ink_strlcpy(prev_alarm_text, desc, sizeof(prev_alarm_text));
-      last_sent = time(nullptr);
-    }
-  }
-
-  Debug("alarm", "[Alarms::signalAlarm] Sending Alarm: '%s'", desc);
-
-  if (!desc) {
-    desc = const_cast<char *>(getAlarmText(a));
-  }
-
-  /*
-   * Exec alarm bin for priority alarms every time, regardless if they are
-   * potentially duplicates. However, only exec this for you own alarms,
-   * don't want every node in the cluster reporting the same alarm.
-   */
-  if (priority == 1 && !ip) {
-    execAlarmBin(desc);
-  }
-
-  ink_mutex_acquire(&mutex);
-  if (!ip) {
-    snprintf(buf, sizeof(buf), "%d", a);
-    if (local_alarms.find(buf) != local_alarms.end()) {
-      ink_mutex_release(&mutex);
-      return;
-    }
-  } else {
-    snprintf(buf, sizeof(buf), "%d-%s", a, ip);
-    if (auto it = remote_alarms.find(buf); it != remote_alarms.end()) {
-      // Reset the seen flag so that we know the remote alarm is
-      //   still active
-      atmp       = it->second;
-      atmp->seen = true;
-      ink_mutex_release(&mutex);
-      return;
-    }
-  }
-
-  atmp              = static_cast<Alarm *>(ats_malloc(sizeof(Alarm)));
-  atmp->type        = a;
-  atmp->linger      = true;
-  atmp->seen        = true;
-  atmp->priority    = priority;
-  atmp->description = nullptr;
-
-  if (!ip) {
-    atmp->local        = true;
-    atmp->inet_address = 0;
-    local_alarms.emplace(buf, atmp);
-  } else {
-    atmp->local        = false;
-    atmp->inet_address = inet_addr(ip);
-    local_alarms.emplace(buf, atmp);
-  }
-
-  // Swap desc with time-stamped description.  Kinda hackish
-  // Temporary until we get a new
-  // alarm system in place.  TS 5.0.0, 02/08/2001
-  time_t my_time_t;
-  char my_ctime_str[32];
-  time(&my_time_t);
-  ink_ctime_r(&my_time_t, my_ctime_str);
-  char *p = my_ctime_str;
-  while (*p != '\n' && *p != '\0') {
-    p++;
-  }
-  if (*p == '\n') {
-    *p = '\0';
-  }
-  const size_t sz = sizeof(char) * (strlen(desc) + strlen(my_ctime_str) + 4);
-  ats_free(atmp->description);
-  atmp->description = static_cast<char *>(ats_malloc(sz));
-  snprintf(atmp->description, sz, "[%s] %s", my_ctime_str, desc);
-
-  ink_mutex_release(&mutex);
-
-  for (auto &&it : cblist) {
-    AlarmCallbackFunc func = it.second;
-    Debug("alarm", "[Alarms::signalAlarm] invoke callback for %d", a);
-    (*(func))(a, ip, desc);
-  }
-
-  /* Priority 2 alarms get signaled if they are the first unsolved occurrence. */
-  if (priority == 2 && !ip) {
-    execAlarmBin(desc);
-  }
-
-} /* End Alarms::signalAlarm */
-
-/*
- * resetSeenFlag(...)
- *   Function resets the "seen" flag for a given peer's alarms. This allows
- * us to flush alarms that may have expired naturally or were dealt.
- */
-void
-Alarms::resetSeenFlag(char *ip)
-{
-  ink_mutex_acquire(&mutex);
-  for (auto &&it : remote_alarms) {
-    std::string const &key = it.first;
-    Alarm *tmp             = it.second;
-    if (key.find(ip) != std::string::npos) {
-      tmp->seen = false;
-    }
-  }
-  ink_mutex_release(&mutex);
-  return;
-} /* End Alarms::resetSeenFlag */
-
-/*
- * clearUnSeen(...)
- *   This function is a sweeper function to clean up those alarms that have
- * been taken care of through other local managers or at the peer itself.
- */
-void
-Alarms::clearUnSeen(char *ip)
-{
-  ink_mutex_acquire(&mutex);
-  for (auto &&it : remote_alarms) {
-    std::string const &key = it.first;
-    Alarm *tmp             = it.second;
-
-    if (key.find(ip) != std::string::npos) { /* Make sure alarm is for correct ip */
-      if (!tmp->seen) {                      /* Make sure we did not see it in peer's report */
-        remote_alarms.erase(key);
-        ats_free(tmp->description);
-        ats_free(tmp);
-      }
-    }
-  }
-  ink_mutex_release(&mutex);
-  return;
-} /* End Alarms::clearUnSeen */
-
-void
-Alarms::execAlarmBin(const char *desc)
-{
-  ats_scoped_str bindir(alarm_script_dir());
-  char cmd_line[MAXPATHLEN];
-
-  ats_scoped_str alarm_bin(REC_readString("proxy.config.alarm.bin", nullptr));
-  ats_scoped_str alarm_email_from_name;
-  ats_scoped_str alarm_email_from_addr;
-  ats_scoped_str alarm_email_to_addr;
-
-  pid_t pid;
-
-  // If there's no alarm script configured, don't even bother.
-  if (!alarm_bin || *alarm_bin == '\0') {
-    return;
-  }
-
-  ink_filepath_make(cmd_line, sizeof(cmd_line), bindir, alarm_bin);
-
-#ifdef POSIX_THREAD
-  if ((pid = fork()) < 0)
-#else
-  if ((pid = fork1()) < 0)
-#endif
-  {
-    mgmt_elog(errno, "[Alarms::execAlarmBin] Unable to fork1 process\n");
-  } else if (pid > 0) { /* Parent */
-    int status;
-    bool script_done = false;
-    time_t timeout   = static_cast<time_t>(REC_readInteger("proxy.config.alarm.script_runtime", nullptr));
-    if (!timeout) {
-      timeout = 5; // default time = 5 secs
-    }
-    time_t time_delta = 0;
-    time_t first_time = time(nullptr);
-    while (time_delta <= timeout) {
-      // waitpid will return child's pid if status is available
-      // or -1 if there is some problem; returns 0 if child status
-      // is not available
-      if (waitpid(pid, &status, WNOHANG) != 0) {
-        Debug("alarm", "[Alarms::execAlarmBin] child pid %" PRId64 " has status", (int64_t)pid);
-        script_done = true;
-        break;
-      }
-      time_delta = time(nullptr) - first_time;
-    }
-    // need to kill the child script process if it's not complete
-    if (!script_done) {
-      Debug("alarm", "[Alarms::execAlarmBin] kill child pid %" PRId64 "", (int64_t)pid);
-      kill(pid, SIGKILL);
-      waitpid(pid, &status, 0); // to reap the thread
-    }
-  } else {
-    int res = execl(cmd_line, (const char *)alarm_bin, desc, (char *)nullptr);
-
-    _exit(res);
-  }
-}
-
-//
-// getAlarmText
-//
-// returns the corresponding text for the alarm id
-//
-const char *
-Alarms::getAlarmText(alarm_t id)
-{
-  if (id < alarmTextNum) {
-    return alarmText[id];
-  } else {
-    return alarmText[0]; // "Unknown Alarm";
-  }
-}
diff --git a/mgmt/Alarms.h b/mgmt/Alarms.h
deleted file mode 100644
index d42da3105..000000000
--- a/mgmt/Alarms.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/** @file
-
-  Class definitions for alarms keeper, class keeps a queue of Alarm
-  objects. Can be polled on status of alarms.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include "tscore/ink_mutex.h"
-#include <unordered_map>
-#include <string>
-
-class AppVersionInfo;
-
-/***********************************************************************
- *
- * MODULARIZATION: if you are adding new alarms, please be sure to add
- *                 the corresponding alarms in lib/records/I_RecAlarms.h
- *
- ***********************************************************************/
-
-// When adding new alarms, please make sure add the
-//   corresponding alarm text
-//
-#define MGMT_ALARM_UNDEFINED 0
-
-#define MGMT_ALARM_PROXY_PROCESS_DIED 1
-#define MGMT_ALARM_PROXY_PROCESS_BORN 2
-#define MGMT_ALARM_PROXY_CONFIG_ERROR 3
-#define MGMT_ALARM_PROXY_SYSTEM_ERROR 4
-#define MGMT_ALARM_PROXY_CACHE_ERROR 5
-#define MGMT_ALARM_PROXY_CACHE_WARNING 6
-#define MGMT_ALARM_PROXY_LOGGING_ERROR 7
-#define MGMT_ALARM_PROXY_LOGGING_WARNING 8
-#define MGMT_ALARM_CONFIG_UPDATE_FAILED 9
-
-extern const char *alarmText[];
-extern const int alarmTextNum;
-
-typedef int alarm_t;
-typedef void (*AlarmCallbackFunc)(alarm_t, const char *, const char *);
-
-typedef struct _alarm {
-  alarm_t type;
-  int priority;
-  bool linger;
-  bool local;
-  bool seen;
-  unsigned long inet_address; /* If not local */
-  char *description;
-} Alarm;
-
-class Alarms
-{
-public:
-  Alarms();
-  ~Alarms();
-
-  void registerCallback(AlarmCallbackFunc func);
-  bool isCurrentAlarm(alarm_t a, char *ip = nullptr);
-
-  void signalAlarm(alarm_t t, const char *desc, const char *ip = nullptr);
-  void resolveAlarm(alarm_t a, char *ip = nullptr);
-
-  void constructAlarmMessage(const AppVersionInfo &version, char *ip, char *message, int max);
-  void resetSeenFlag(char *ip);
-  void clearUnSeen(char *ip);
-
-  void execAlarmBin(const char *desc);
-
-  const char *getAlarmText(alarm_t id);
-  std::unordered_map<std::string, Alarm *> const &
-  getLocalAlarms()
-  {
-    return local_alarms;
-  }
-
-private:
-  int cur_cb;
-  ink_mutex mutex;
-
-  std::unordered_map<std::string, AlarmCallbackFunc> cblist;
-  std::unordered_map<std::string, Alarm *> local_alarms;
-  std::unordered_map<std::string, Alarm *> remote_alarms;
-}; /* End class Alarms */
diff --git a/mgmt/BaseManager.cc b/mgmt/BaseManager.cc
deleted file mode 100644
index 0f3d8a1e0..000000000
--- a/mgmt/BaseManager.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/** @file
-
-  Member function definitions for Base Manager class.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.
-  See the NOTICE file distributed with this work for additional information regarding copyright
-  ownership.  The ASF licenses this file to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance with the License.  You may obtain a
-  copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software distributed under the License
-  is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-  or implied. See the License for the specific language governing permissions and limitations under
-  the License.
- */
-
-#include "tscore/ink_memory.h"
-#include "tscore/ink_mutex.h"
-#include "BaseManager.h"
-
-BaseManager::BaseManager()
-{
-  ink_sem_init(&q_sem, 0);
-}
-
-BaseManager::~BaseManager()
-{
-  while (!queue.empty()) {
-    ats_free(queue.front());
-    queue.pop();
-  }
-}
-
-void
-BaseManager::enqueue(MgmtMessageHdr *mh)
-{
-  std::lock_guard lock(q_mutex);
-  queue.emplace(mh);
-  ink_sem_post(&q_sem);
-}
-
-bool
-BaseManager::queue_empty()
-{
-  std::lock_guard lock(q_mutex);
-  return queue.empty();
-}
-
-MgmtMessageHdr *
-BaseManager::dequeue()
-{
-  MgmtMessageHdr *msg{nullptr};
-
-  ink_sem_wait(&q_sem);
-  {
-    std::lock_guard lock(q_mutex);
-    msg = queue.front();
-    queue.pop();
-  }
-  return msg;
-}
-
-int
-BaseManager::registerMgmtCallback(int msg_id, MgmtCallback const &cb)
-{
-  auto &cb_list{mgmt_callback_table[msg_id]};
-  cb_list.emplace_back(cb);
-  return msg_id;
-}
-
-void
-BaseManager::executeMgmtCallback(int msg_id, ts::MemSpan<void> span)
-{
-  if (auto it = mgmt_callback_table.find(msg_id); it != mgmt_callback_table.end()) {
-    for (auto &&cb : it->second) {
-      cb(span);
-    }
-  }
-}
diff --git a/mgmt/BaseManager.h b/mgmt/BaseManager.h
deleted file mode 100644
index 322b6542e..000000000
--- a/mgmt/BaseManager.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/** @file
-
-  Base Manager Class, base class for all managers.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include <list>
-#include <queue>
-#include <mutex>
-#include <unordered_map>
-
-#include "tscore/ink_thread.h"
-#include "tscore/ink_mutex.h"
-#include "tscpp/util/MemSpan.h"
-
-#include "MgmtDefs.h"
-#include "MgmtMarshall.h"
-
-/*
- * MgmtEvent defines.
- */
-
-// Event flows: traffic manager -> traffic server
-#define MGMT_EVENT_SYNC_KEY 10000
-#define MGMT_EVENT_SHUTDOWN 10001
-#define MGMT_EVENT_RESTART 10002
-#define MGMT_EVENT_BOUNCE 10003
-#define MGMT_EVENT_CLEAR_STATS 10004
-#define MGMT_EVENT_CONFIG_FILE_UPDATE 10005
-#define MGMT_EVENT_PLUGIN_CONFIG_UPDATE 10006
-#define MGMT_EVENT_ROLL_LOG_FILES 10008
-#define MGMT_EVENT_LIBRECORDS 10009
-// 10010 is unused
-// cache storage operations - each is a distinct event.
-// this is done because the code paths share nothing but boilerplate logic
-// so it's easier to do this than to try to encode an opcode and yet another
-// case statement.
-#define MGMT_EVENT_STORAGE_DEVICE_CMD_OFFLINE 10011
-#define MGMT_EVENT_LIFECYCLE_MESSAGE 10012
-#define MGMT_EVENT_DRAIN 10013
-#define MGMT_EVENT_HOST_STATUS_UP 10014
-#define MGMT_EVENT_HOST_STATUS_DOWN 10015
-
-/***********************************************************************
- *
- * MODULARIZATION: if you are adding new signals, please ensure to add
- *                 the corresponding signals in librecords/I_RecSignals.h
- *
- *
- ***********************************************************************/
-
-// Signal flows: traffic server -> traffic manager
-#define MGMT_SIGNAL_PID 0
-
-#define MGMT_SIGNAL_PROXY_PROCESS_DIED 1
-#define MGMT_SIGNAL_PROXY_PROCESS_BORN 2
-#define MGMT_SIGNAL_CONFIG_ERROR 3
-#define MGMT_SIGNAL_SYSTEM_ERROR 4
-#define MGMT_SIGNAL_CACHE_ERROR 5
-#define MGMT_SIGNAL_CACHE_WARNING 6
-#define MGMT_SIGNAL_LOGGING_ERROR 7
-#define MGMT_SIGNAL_LOGGING_WARNING 8
-#define MGMT_SIGNAL_PLUGIN_SET_CONFIG 9
-
-// This are additional on top of the ones defined in Alarms.h. Que?
-#define MGMT_SIGNAL_LIBRECORDS 10
-#define MGMT_SIGNAL_CONFIG_FILE_CHILD 11
-
-struct MgmtMessageHdr {
-  int msg_id;
-  int data_len;
-  ts::MemSpan<void>
-  payload()
-  {
-    return {this + 1, static_cast<size_t>(data_len)};
-  }
-};
-
-class BaseManager
-{
-  using MgmtCallbackList = std::list<MgmtCallback>;
-
-public:
-  BaseManager();
-
-  ~BaseManager();
-
-  /** Associate a callback function @a func with message identifier @a msg_id.
-   *
-   * @param msg_id Message identifier for the callback.
-   * @param func The callback function.
-   * @return @a msg_id on success, -1 on failure.
-   *
-   * @a msg_id should be one of the @c MGMT_EVENT_... values.
-   *
-   * If a management message with @a msg is received, the callbacks for that message id
-   * are invoked and passed the message payload (not including the header).
-   */
-  int registerMgmtCallback(int msg_id, MgmtCallback const &func);
-
-  /// Add a @a msg to the queue.
-  /// This must be the entire message as read off the wire including the header.
-  void enqueue(MgmtMessageHdr *msg);
-
-  /// Current size of the queue.
-  /// @note This does not block on the semaphore.
-  bool queue_empty();
-
-  /// Dequeue a msg.
-  /// This waits on the semaphore for a message to arrive.
-  MgmtMessageHdr *dequeue();
-
-protected:
-  void executeMgmtCallback(int msg_id, ts::MemSpan<void> span);
-
-  /// The mapping from an event type to a list of callbacks to invoke.
-  std::unordered_map<int, MgmtCallbackList> mgmt_callback_table;
-
-  /// Message queue.
-  // These holds the entire message object, including the header.
-  std::queue<MgmtMessageHdr *> queue;
-  /// Locked access to the queue.
-  std::mutex q_mutex;
-  /// Semaphore to signal queue state.
-  ink_semaphore q_sem;
-};
diff --git a/mgmt/ConfigManager.cc b/mgmt/ConfigManager.cc
deleted file mode 100644
index 2f2a83063..000000000
--- a/mgmt/ConfigManager.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/** @file
-
-  This file contains code for class to allow management of configuration files
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "tscore/ink_platform.h"
-#include "tscore/ink_memory.h"
-#include "tscore/ink_time.h"
-#include "Alarms.h"
-#include "LocalManager.h"
-#include "ConfigManager.h"
-#include "WebMgmtUtils.h"
-#include "ExpandingArray.h"
-#include "MgmtSocket.h"
-#include "tscore/I_Layout.h"
-#include "FileManager.h"
-#include "ProxyConfig.h"
-
-#if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
-#define TS_ARCHIVE_STAT_MTIME(t) ((t).st_mtime * 1000000000 + (t).st_mtimespec.tv_nsec)
-#elif HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
-#define TS_ARCHIVE_STAT_MTIME(t) ((t).st_mtime * 1000000000 + (t).st_mtim.tv_nsec)
-#else
-#define TS_ARCHIVE_STAT_MTIME(t) ((t).st_mtime * 1000000000)
-#endif
-
-ConfigManager::ConfigManager(const char *fileName_, const char *configName_, bool root_access_needed_, bool isRequired_,
-                             ConfigManager *parentConfig_)
-  : root_access_needed(root_access_needed_), isRequired(isRequired_), parentConfig(parentConfig_)
-{
-  ExpandingArray existVer(25, true); // Existing versions
-  struct stat fileInfo;
-  ink_assert(fileName_ != nullptr);
-
-  // parent must not also have a parent
-  if (parentConfig) {
-    ink_assert(parentConfig->parentConfig == nullptr);
-  }
-
-  // Copy the file name.
-  fileName   = std::string{fileName_};
-  configName = std::string{configName_};
-
-  ink_mutex_init(&fileAccessLock);
-  // Check to make sure that our configuration file exists
-  //
-  if (statFile(&fileInfo) < 0) {
-    mgmt_log("[ConfigManager::ConfigManager] %s Unable to load: %s", fileName.c_str(), strerror(errno));
-
-    if (isRequired) {
-      mgmt_fatal(0, "[ConfigManager::ConfigManager] Unable to open required configuration file %s.\n\tStat failed : %s\n",
-                 fileName.c_str(), strerror(errno));
-    }
-  } else {
-    fileLastModified = TS_ARCHIVE_STAT_MTIME(fileInfo);
-  }
-}
-
-//
-//
-// int ConfigManager::statFile()
-//
-//  A wrapper for stat()
-//
-int
-ConfigManager::statFile(struct stat *buf)
-{
-  int statResult;
-  std::string sysconfdir(RecConfigReadConfigDir());
-  std::string filePath = Layout::get()->relative_to(sysconfdir, fileName);
-
-  statResult = root_access_needed ? elevating_stat(filePath.c_str(), buf) : stat(filePath.c_str(), buf);
-
-  return statResult;
-}
-
-// bool ConfigManager::checkForUserUpdate(RollBackCheckType how)
-//
-//  Called to check if the file has been changed  by the user.
-//  Timestamps are compared to see if a change occurred
-bool
-ConfigManager::checkForUserUpdate(RollBackCheckType how)
-{
-  struct stat fileInfo;
-  bool result;
-
-  ink_mutex_acquire(&fileAccessLock);
-
-  if (this->statFile(&fileInfo) < 0) {
-    ink_mutex_release(&fileAccessLock);
-    return false;
-  }
-
-  if (fileLastModified < TS_ARCHIVE_STAT_MTIME(fileInfo)) {
-    if (how == ROLLBACK_CHECK_AND_UPDATE) {
-      fileLastModified = TS_ARCHIVE_STAT_MTIME(fileInfo);
-      if (!this->isChildManaged()) {
-        configFiles->fileChanged(fileName.c_str(), configName.c_str());
-      }
-      mgmt_log("User has changed config file %s\n", fileName.c_str());
-    }
-    result = true;
-  } else {
-    result = false;
-  }
-
-  ink_mutex_release(&fileAccessLock);
-  return result;
-}
diff --git a/mgmt/ConfigManager.h b/mgmt/ConfigManager.h
deleted file mode 100644
index f9210616a..000000000
--- a/mgmt/ConfigManager.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/** @file
-
-  Interface for class to allow management of configuration files
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include "tscore/ink_mutex.h"
-#include "tscore/List.h"
-
-#include <string>
-
-class FileManager;
-class TextBuffer;
-
-class ExpandingArray;
-
-enum RollBackCheckType {
-  ROLLBACK_CHECK_AND_UPDATE,
-  ROLLBACK_CHECK_ONLY,
-};
-
-//
-//  class ConfigManager
-//
-//  public functions
-//
-//  checkForUserUpdate() - compares the last known modification time
-//    of the active version of the file with that files current modification
-//    time.  Returns true if the file has been changed manually or false
-//    if it hasn't
-//
-// private functions
-//
-//  statFile(struct stat*) - a wrapper for stat(), using layout engine
-//
-class ConfigManager
-{
-public:
-  // fileName_ should be rooted or a base file name.
-  ConfigManager(const char *fileName_, const char *configName_, bool root_access_needed, bool isRequired_,
-                ConfigManager *parentConfig_);
-  ~ConfigManager() = default;
-
-  // Manual take out of lock required
-  void
-  acquireLock()
-  {
-    ink_mutex_acquire(&fileAccessLock);
-  };
-
-  void
-  releaseLock()
-  {
-    ink_mutex_release(&fileAccessLock);
-  };
-
-  // Check if a file has changed, automatically holds the lock. Used by FileManager.
-  bool checkForUserUpdate(RollBackCheckType);
-
-  // These are getters, for FileManager to get info about a particular configuration.
-  const char *
-  getFileName() const
-  {
-    return fileName.c_str();
-  }
-
-  const char *
-  getConfigName() const
-  {
-    return configName.c_str();
-  }
-
-  bool
-  isChildManaged() const
-  {
-    return parentConfig != nullptr;
-  }
-
-  ConfigManager *
-  getParentConfig() const
-  {
-    return parentConfig;
-  }
-
-  bool
-  rootAccessNeeded() const
-  {
-    return root_access_needed;
-  }
-
-  bool
-  getIsRequired() const
-  {
-    return isRequired;
-  }
-
-  FileManager *configFiles = nullptr; // Manager to notify on an update.
-
-  // noncopyable
-  ConfigManager(const ConfigManager &) = delete;
-  ConfigManager &operator=(const ConfigManager &) = delete;
-
-private:
-  int statFile(struct stat *buf);
-
-  ink_mutex fileAccessLock;
-  std::string fileName;
-  std::string configName;
-  bool root_access_needed;
-  bool isRequired;
-  ConfigManager *parentConfig;
-  time_t fileLastModified = 0;
-};
diff --git a/mgmt/DerivativeMetrics.cc b/mgmt/DerivativeMetrics.cc
index 16572db43..3a3987517 100644
--- a/mgmt/DerivativeMetrics.cc
+++ b/mgmt/DerivativeMetrics.cc
@@ -30,7 +30,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // This currently only supports one type of derivative metrics: Sums() of other, existing metrics. It's ok to add
-// additional metrics here, and we prefer to call them proxy.process (since, hopefully in the future, traffic_manager dies).
+// additional metrics here, and we prefer to call them proxy.process now that traffic_manager died.
 //
 static const std::vector<DerivativeSum> sum_metrics = {
   // Total bytes of client request body + headers
diff --git a/mgmt/DerivativeMetrics.h b/mgmt/DerivativeMetrics.h
index 2109f02ee..cc8db1bdc 100644
--- a/mgmt/DerivativeMetrics.h
+++ b/mgmt/DerivativeMetrics.h
@@ -24,8 +24,7 @@
 #pragma once
 
 #include <tuple>
-
-#include "records/I_RecLocal.h"
+#include "records/I_RecDefs.h"
 
 using DerivativeSum = std::tuple<const char *, RecDataT, std::vector<const char *>>;
 
diff --git a/mgmt/FileManager.cc b/mgmt/FileManager.cc
deleted file mode 100644
index fce09a0dc..000000000
--- a/mgmt/FileManager.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-/** @file
-
-  Code for class to manage configuration updates
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "FileManager.h"
-#include "tscore/ink_platform.h"
-#include "tscore/ink_file.h"
-#include "ConfigManager.h"
-#include "WebMgmtUtils.h"
-
-#include <vector>
-#include <algorithm>
-
-FileManager::FileManager()
-{
-  ink_mutex_init(&accessLock);
-  ink_mutex_init(&cbListLock);
-}
-
-// FileManager::~FileManager
-//
-//  There is only FileManager object in the process and it
-//     should never need to be destructed except at
-//     program exit
-//
-FileManager::~FileManager()
-{
-  callbackListable *cb;
-
-  // Let other operations finish and do not start any new ones
-  ink_mutex_acquire(&accessLock);
-
-  for (cb = cblist.pop(); cb != nullptr; cb = cblist.pop()) {
-    delete cb;
-  }
-  for (auto &&it : bindings) {
-    delete it.second;
-  }
-
-  ink_mutex_release(&accessLock);
-  ink_mutex_destroy(&accessLock);
-  ink_mutex_destroy(&cbListLock);
-}
-
-// void FileManager::registerCallback(FileCallbackFunc func)
-//
-//  Adds a new callback function
-//    callbacks are made whenever a configuration file has
-//    changed
-//
-//  The callback function is responsible for free'ing
-//    the string the string it is passed
-//
-void
-FileManager::registerCallback(FileCallbackFunc func)
-{
-  callbackListable *newcb = new callbackListable();
-  ink_assert(newcb != nullptr);
-  newcb->func = func;
-  ink_mutex_acquire(&cbListLock);
-  cblist.push(newcb);
-  ink_mutex_release(&cbListLock);
-}
-
-// void FileManager::addFile(char* fileName, const configFileInfo* file_info,
-//  ConfigManager* parentConfig)
-//
-//  for the baseFile, creates a ConfigManager object for it
-//
-//  if file_info is not null, a WebFileEdit object is also created for
-//    the file
-//
-//  Pointers to the new objects are stored in the bindings hashtable
-//
-void
-FileManager::addFile(const char *fileName, const char *configName, bool root_access_needed, bool isRequired,
-                     ConfigManager *parentConfig)
-{
-  ink_mutex_acquire(&accessLock);
-  addFileHelper(fileName, configName, root_access_needed, isRequired, parentConfig);
-  ink_mutex_release(&accessLock);
-}
-
-// caller must hold the lock
-void
-FileManager::addFileHelper(const char *fileName, const char *configName, bool root_access_needed, bool isRequired,
-                           ConfigManager *parentConfig)
-{
-  ink_assert(fileName != nullptr);
-
-  ConfigManager *rb = new ConfigManager(fileName, configName, root_access_needed, isRequired, parentConfig);
-  rb->configFiles   = this;
-
-  bindings.emplace(rb->getFileName(), rb);
-}
-
-// bool FileManager::getConfigManagerObj(char* fileName, ConfigManager** rbPtr)
-//
-//  Sets rbPtr to the ConfigManager object associated
-//    with the passed in fileName.
-//
-//  If there is no binding, false is returned
-//
-bool
-FileManager::getConfigObj(const char *fileName, ConfigManager **rbPtr)
-{
-  ink_mutex_acquire(&accessLock);
-  auto it    = bindings.find(fileName);
-  bool found = it != bindings.end();
-  ink_mutex_release(&accessLock);
-
-  *rbPtr = found ? it->second : nullptr;
-  return found;
-}
-
-// bool FileManager::fileChanged(const char* fileName)
-//
-//  Called by the ConfigManager class whenever a config has changed
-//     Initiates callbacks
-//
-//
-void
-FileManager::fileChanged(const char *fileName, const char *configName)
-{
-  callbackListable *cb;
-  char *filenameCopy, *confignameCopy;
-  Debug("lm", "filename changed %s", fileName);
-  ink_mutex_acquire(&cbListLock);
-
-  for (cb = cblist.head; cb != nullptr; cb = cb->link.next) {
-    // Dup the string for each callback to be
-    //  defensive in case it's modified when it's not supposed to be
-    confignameCopy = ats_strdup(configName);
-    filenameCopy   = ats_strdup(fileName);
-    (*cb->func)(filenameCopy, confignameCopy);
-    ats_free(filenameCopy);
-    ats_free(confignameCopy);
-  }
-  ink_mutex_release(&cbListLock);
-}
-
-// void FileManger::rereadConfig()
-//
-//   Iterates through the list of managed files and
-//     calls ConfigManager::checkForUserUpdate on them
-//
-//   although it is tempting, DO NOT CALL FROM SIGNAL HANDLERS
-//      This function is not Async-Signal Safe.  It
-//      is thread safe
-void
-FileManager::rereadConfig()
-{
-  ConfigManager *rb;
-
-  std::vector<ConfigManager *> changedFiles;
-  std::vector<ConfigManager *> parentFileNeedChange;
-  size_t n;
-  ink_mutex_acquire(&accessLock);
-  for (auto &&it : bindings) {
-    rb = it.second;
-    // ToDo: rb->isVersions() was always true before, because numberBackups was always >= 1. So ROLLBACK_CHECK_ONLY could not
-    // happen at all...
-    if (rb->checkForUserUpdate(ROLLBACK_CHECK_AND_UPDATE)) {
-      changedFiles.push_back(rb);
-      if (rb->isChildManaged()) {
-        if (std::find(parentFileNeedChange.begin(), parentFileNeedChange.end(), rb->getParentConfig()) ==
-            parentFileNeedChange.end()) {
-          parentFileNeedChange.push_back(rb->getParentConfig());
-        }
-      }
-    }
-  }
-
-  std::vector<ConfigManager *> childFileNeedDelete;
-  n = changedFiles.size();
-  for (size_t i = 0; i < n; i++) {
-    if (changedFiles[i]->isChildManaged()) {
-      continue;
-    }
-    // for each parent file, if it is changed, then delete all its children
-    for (auto &&it : bindings) {
-      rb = it.second;
-      if (rb->getParentConfig() == changedFiles[i]) {
-        if (std::find(childFileNeedDelete.begin(), childFileNeedDelete.end(), rb) == childFileNeedDelete.end()) {
-          childFileNeedDelete.push_back(rb);
-        }
-      }
-    }
-  }
-  n = childFileNeedDelete.size();
-  for (size_t i = 0; i < n; i++) {
-    bindings.erase(childFileNeedDelete[i]->getFileName());
-    delete childFileNeedDelete[i];
-  }
-  ink_mutex_release(&accessLock);
-
-  n = parentFileNeedChange.size();
-  for (size_t i = 0; i < n; i++) {
-    if (std::find(changedFiles.begin(), changedFiles.end(), parentFileNeedChange[i]) == changedFiles.end()) {
-      fileChanged(parentFileNeedChange[i]->getFileName(), parentFileNeedChange[i]->getConfigName());
-    }
-  }
-  // INKqa11910
-  // need to first check that enable_customizations is enabled
-  bool found;
-  int enabled = static_cast<int>(REC_readInteger("proxy.config.body_factory.enable_customizations", &found));
-
-  if (found && enabled) {
-    fileChanged("proxy.config.body_factory.template_sets_dir", "proxy.config.body_factory.template_sets_dir");
-  }
-  fileChanged("proxy.config.ssl.server.ticket_key.filename", "proxy.config.ssl.server.ticket_key.filename");
-}
-
-bool
-FileManager::isConfigStale()
-{
-  ConfigManager *rb;
-  bool stale = false;
-
-  ink_mutex_acquire(&accessLock);
-  for (auto &&it : bindings) {
-    rb = it.second;
-    if (rb->checkForUserUpdate(ROLLBACK_CHECK_ONLY)) {
-      stale = true;
-      break;
-    }
-  }
-
-  ink_mutex_release(&accessLock);
-  return stale;
-}
-
-// void configFileChild(const char *parent, const char *child)
-//
-// Add child to the bindings with parentConfig
-void
-FileManager::configFileChild(const char *parent, const char *child)
-{
-  ConfigManager *parentConfig = nullptr;
-  ink_mutex_acquire(&accessLock);
-  if (auto it = bindings.find(parent); it != bindings.end()) {
-    parentConfig = it->second;
-    addFileHelper(child, "", parentConfig->rootAccessNeeded(), parentConfig->getIsRequired(), parentConfig);
-  }
-  ink_mutex_release(&accessLock);
-}
diff --git a/mgmt/FileManager.h b/mgmt/FileManager.h
deleted file mode 100644
index 64725b620..000000000
--- a/mgmt/FileManager.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/** @file
-
-  Interface for class to manage configuration updates
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include "tscore/ink_mutex.h"
-#include "tscore/List.h"
-
-#include <unordered_map>
-
-class ExpandingArray;
-class ConfigManager;
-
-typedef void (*FileCallbackFunc)(char *, char *);
-
-struct callbackListable {
-public:
-  FileCallbackFunc func;
-  LINK(callbackListable, link);
-};
-
-enum lockAction_t {
-  ACQUIRE_LOCK,
-  RELEASE_LOCK,
-};
-
-//  class FileManager
-//
-//  public functions:
-//
-//  addFile(char*, char *, bool, configFileInfo*) - adds a new config file to be
-//       managed.  A ConfigManager object is created for the file.
-//       if the file_info ptr is not NULL, a WebFileEdit object
-//       is also created
-//
-//  getRollbckObj(char* , ConfigManagerPtr**) - sets *rbPtr to ConfigManager
-//       object bound to fileName.  Returns true if there is
-//       a binding and false otherwise
-//
-//  getWFEObj(char*, WebFileEdit**)  - sets *wfePtr to WebFileEdit
-//       object bound to fileName.  Returns true if there is
-//       a binding and false otherwise
-//
-//  registerCallback(FileCallbackFunc) - registers a callback function
-//       which will get called every time a managed file changes.  The
-//       callback function should NOT use the calling thread to
-//       access any ConfigManager objects or block for a long time
-//
-//  fileChanged(const char* fileName, const char *configName) - called by ConfigManager objects
-//       when their contents change.  Triggers callbacks to FileCallbackFuncs
-//
-//  isConfigStale() - returns whether the in-memory files might be stale
-//       compared to what is on disk.
-//
-//  rereadConfig() - Checks all managed files to see if they have been
-//       updated
-//  addConfigFileGroup(char* data_str, int data_size) - update config file group infos
-class FileManager
-{
-public:
-  FileManager();
-  ~FileManager();
-  void addFile(const char *fileName, const char *configName, bool root_access_needed, bool isRequired,
-               ConfigManager *parentConfig = nullptr);
-  bool getConfigObj(const char *fileName, ConfigManager **rbPtr);
-  void registerCallback(FileCallbackFunc func);
-  void fileChanged(const char *fileName, const char *configName);
-  void rereadConfig();
-  bool isConfigStale();
-  void configFileChild(const char *parent, const char *child);
-
-private:
-  ink_mutex accessLock; // Protects bindings hashtable
-  ink_mutex cbListLock; // Protects the CallBack List
-  DLL<callbackListable> cblist;
-  std::unordered_map<std::string_view, ConfigManager *> bindings;
-  void addFileHelper(const char *fileName, const char *configName, bool root_access_needed, bool isRequired,
-                     ConfigManager *parentConfig);
-};
-
-void initializeRegistry(); // implemented in AddConfigFilesHere.cc
diff --git a/mgmt/LocalManager.cc b/mgmt/LocalManager.cc
deleted file mode 100644
index 9a1a0d2f4..000000000
--- a/mgmt/LocalManager.cc
+++ /dev/null
@@ -1,1124 +0,0 @@
-/** @file
-
-  The Local Manager process of the management system.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "tscore/ink_platform.h"
-#include "tscore/ink_sock.h"
-#include "tscore/ink_file.h"
-#include "tscore/ink_error.h"
-#include "Alarms.h"
-#include "MgmtUtils.h"
-#include "tscore/I_Layout.h"
-#include "tscore/runroot.h"
-#include "LocalManager.h"
-#include "MgmtSocket.h"
-#include "tscore/ink_cap.h"
-#include "FileManager.h"
-#include <string_view>
-#include <algorithm>
-#include "tscpp/util/TextView.h"
-#include "tscore/BufferWriter.h"
-#include "tscore/bwf_std_format.h"
-#include "tscore/Filenames.h"
-
-#if TS_USE_POSIX_CAP
-#include <sys/capability.h>
-#endif
-
-using namespace std::literals;
-static const std::string_view MGMT_OPT{"-M"};
-static const std::string_view RUNROOT_OPT{"--run-root="};
-
-void
-LocalManager::mgmtCleanup()
-{
-  close_socket(process_server_sockfd);
-  process_server_sockfd = ts::NO_FD;
-
-#if HAVE_EVENTFD
-  if (wakeup_fd != ts::NO_FD) {
-    close_socket(wakeup_fd);
-    wakeup_fd = ts::NO_FD;
-  }
-#endif
-
-  // fix me for librecords
-
-  closelog();
-  return;
-}
-
-void
-LocalManager::mgmtShutdown()
-{
-  mgmt_log("[LocalManager::mgmtShutdown] Executing shutdown request.\n");
-  processShutdown(true);
-  // WCCP TBD: Send a shutdown message to routers.
-
-  if (processRunning()) {
-    waitpid(watched_process_pid, nullptr, 0);
-#if defined(linux)
-    /* Avert race condition, wait for the thread to complete,
-       before getting one more restart process */
-    /* Workaround for bugid INKqa10060 */
-    mgmt_sleep_msec(1);
-#endif
-  }
-  mgmtCleanup();
-}
-
-void
-LocalManager::processShutdown(bool mainThread)
-{
-  mgmt_log("[LocalManager::processShutdown] Executing process shutdown request.\n");
-  if (mainThread) {
-    sendMgmtMsgToProcesses(MGMT_EVENT_SHUTDOWN, "processShutdown[main]");
-  } else {
-    signalEvent(MGMT_EVENT_SHUTDOWN, "processShutdown");
-  }
-  return;
-}
-
-void
-LocalManager::processRestart()
-{
-  mgmt_log("[LocalManager::processRestart] Executing process restart request.\n");
-  signalEvent(MGMT_EVENT_RESTART, "processRestart");
-  return;
-}
-
-void
-LocalManager::processBounce()
-{
-  mgmt_log("[LocalManager::processBounce] Executing process bounce request.\n");
-  signalEvent(MGMT_EVENT_BOUNCE, "processBounce");
-  return;
-}
-
-void
-LocalManager::processDrain(int to_drain)
-{
-  mgmt_log("[LocalManager::processDrain] Executing process drain request.\n");
-  signalEvent(MGMT_EVENT_DRAIN, to_drain ? "1" : "0");
-  return;
-}
-
-void
-LocalManager::rollLogFiles()
-{
-  mgmt_log("[LocalManager::rollLogFiles] Log files are being rolled.\n");
-  signalEvent(MGMT_EVENT_ROLL_LOG_FILES, "rollLogs");
-  return;
-}
-
-void
-LocalManager::hostStatusSetDown(const char *marshalled_req, int len)
-{
-  signalEvent(MGMT_EVENT_HOST_STATUS_DOWN, marshalled_req, len);
-  return;
-}
-
-void
-LocalManager::hostStatusSetUp(const char *marshalled_req, int len)
-{
-  signalEvent(MGMT_EVENT_HOST_STATUS_UP, marshalled_req, len);
-  return;
-}
-
-void
-LocalManager::clearStats(const char *name)
-{
-  // Clear our records and then send the signal.  There is a race condition
-  //  here where our stats could get re-updated from the proxy
-  //  before the proxy clears them, but this should be rare.
-  //
-  //  Doing things in the opposite order prevents that race
-  //   but exacerbates the race between the node and cluster
-  //   stats getting cleared by propagation of clearing the
-  //   cluster stats
-  //
-  if (name && *name) {
-    RecResetStatRecord(name);
-  } else {
-    RecResetStatRecord(RECT_NULL, true);
-  }
-
-  // If the proxy is not running, sending the signal does
-  //   not do anything.  Remove the stats file to make sure
-  //   that operation works even when the proxy is off
-  //
-  if (this->proxy_running == 0) {
-    ats_scoped_str statsPath(RecConfigReadPersistentStatsPath());
-    if (unlink(statsPath) < 0) {
-      if (errno != ENOENT) {
-        mgmt_log("[LocalManager::clearStats] Unlink of %s failed : %s\n", (const char *)statsPath, strerror(errno));
-      }
-    }
-  }
-}
-
-bool
-LocalManager::processRunning()
-{
-  if (watched_process_fd != ts::NO_FD && watched_process_pid != -1) {
-    return true;
-  } else {
-    return false;
-  }
-}
-
-LocalManager::LocalManager(bool proxy_on, bool listen) : BaseManager(), run_proxy(proxy_on), listen_for_proxy(listen)
-{
-  bool found;
-  std::string bindir(RecConfigReadBinDir());
-  std::string sysconfdir(RecConfigReadConfigDir());
-
-  manager_started_at = time(nullptr);
-
-  RecRegisterStatInt(RECT_NODE, "proxy.node.proxy_running", 0, RECP_NON_PERSISTENT);
-
-  RecInt http_enabled = REC_readInteger("proxy.config.http.enabled", &found);
-  ink_assert(found);
-  if (http_enabled && found) {
-    HttpProxyPort::loadConfig(m_proxy_ports);
-  }
-  HttpProxyPort::loadDefaultIfEmpty(m_proxy_ports);
-
-  // Get the default IP binding values.
-  RecHttpLoadIp("proxy.local.incoming_ip_to_bind", m_inbound_ip4, m_inbound_ip6);
-
-  if (access(sysconfdir.c_str(), R_OK) == -1) {
-    mgmt_log("[LocalManager::LocalManager] unable to access() directory '%s': %d, %s\n", sysconfdir.c_str(), errno,
-             strerror(errno));
-    mgmt_fatal(0, "[LocalManager::LocalManager] please set the 'TS_ROOT' environment variable\n");
-  }
-
-#if TS_HAS_WCCP
-  // Bind the WCCP address if present.
-  ats_scoped_str wccp_addr_str(REC_readString("proxy.config.wccp.addr", &found));
-  if (found && wccp_addr_str && *wccp_addr_str) {
-    wccp_cache.setAddr(inet_addr(wccp_addr_str));
-    mgmt_log("[LocalManager::LocalManager] WCCP identifying address set to %s.\n", static_cast<char *>(wccp_addr_str));
-  }
-
-  ats_scoped_str wccp_config_str(RecConfigReadConfigPath("proxy.config.wccp.services"));
-  if (wccp_config_str && strlen(wccp_config_str) > 0) {
-    bool located = true;
-    if (access(wccp_config_str, R_OK) == -1) {
-      located = false;
-    }
-
-    if (located) {
-      wccp_cache.loadServicesFromFile(wccp_config_str);
-    } else { // not located
-      mgmt_log("[LocalManager::LocalManager] WCCP service configuration file '%s' was specified but could not be found in the file "
-               "system.\n",
-               static_cast<char *>(wccp_config_str));
-    }
-  }
-#endif
-
-  process_server_timeout_secs  = REC_readInteger("proxy.config.lm.pserver_timeout_secs", &found);
-  process_server_timeout_msecs = REC_readInteger("proxy.config.lm.pserver_timeout_msecs", &found);
-  proxy_name                   = REC_readString("proxy.config.proxy_name", &found);
-  proxy_binary                 = REC_readString("proxy.config.proxy_binary", &found);
-  env_prep                     = REC_readString("proxy.config.env_prep", &found);
-
-  // Calculate proxy_binary from the absolute bin_path
-  absolute_proxy_binary = ats_stringdup(Layout::relative_to(bindir, proxy_binary));
-
-  // coverity[fs_check_call]
-  if (access(absolute_proxy_binary, R_OK | X_OK) == -1) {
-    mgmt_log("[LocalManager::LocalManager] Unable to access() '%s': %d, %s\n", absolute_proxy_binary, errno, strerror(errno));
-    mgmt_fatal(0, "[LocalManager::LocalManager] please set bin path 'proxy.config.bin_path' \n");
-  }
-
-  return;
-}
-
-LocalManager::~LocalManager()
-{
-  delete alarm_keeper;
-  ats_free(absolute_proxy_binary);
-  ats_free(proxy_name);
-  ats_free(proxy_binary);
-  ats_free(env_prep);
-}
-
-void
-LocalManager::initAlarm()
-{
-  alarm_keeper = new Alarms();
-}
-
-/*
- * initMgmtProcessServer()
- *   sets up the server socket that proxy processes connect to.
- */
-void
-LocalManager::initMgmtProcessServer()
-{
-  std::string rundir(RecConfigReadRuntimeDir());
-  std::string sockpath(Layout::relative_to(rundir, LM_CONNECTION_SERVER));
-  mode_t oldmask = umask(0);
-
-#if TS_HAS_WCCP
-  if (wccp_cache.isConfigured()) {
-    if (0 > wccp_cache.open())
-      mgmt_log("Failed to open WCCP socket\n");
-  }
-#endif
-
-  process_server_sockfd = bind_unix_domain_socket(sockpath.c_str(), 00700);
-  if (process_server_sockfd == -1) {
-    mgmt_fatal(errno, "[LocalManager::initMgmtProcessServer] failed to bind socket at %s\n", sockpath.c_str());
-  }
-
-#if HAVE_EVENTFD
-  wakeup_fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
-  if (wakeup_fd < 0) {
-    mgmt_fatal(errno, "[LocalManager::initMgmtProcessServer] failed to create eventfd. errno : %s\n", strerror(errno));
-  }
-#endif
-
-  umask(oldmask);
-  RecSetRecordInt("proxy.node.restarts.manager.start_time", manager_started_at, REC_SOURCE_DEFAULT);
-}
-
-/*
- * pollMgmtProcessServer()
- * -  Function checks the mgmt process server for new processes
- *    and any requests sent from processes. It handles processes sent.
- */
-void
-LocalManager::pollMgmtProcessServer()
-{
-  struct timeval timeout;
-  fd_set fdlist;
-
-  while (true) {
-#if TS_HAS_WCCP
-    int wccp_fd = wccp_cache.getSocket();
-#endif
-
-    timeout.tv_sec  = process_server_timeout_secs;
-    timeout.tv_usec = process_server_timeout_msecs * 1000;
-
-    FD_ZERO(&fdlist);
-
-    if (process_server_sockfd != ts::NO_FD) {
-      FD_SET(process_server_sockfd, &fdlist);
-    }
-
-    if (watched_process_fd != ts::NO_FD) {
-      FD_SET(watched_process_fd, &fdlist);
-    }
-
-#if TS_HAS_WCCP
-    // Only run WCCP housekeeping while we have a server process.
-    // Note: The WCCP socket is opened iff WCCP is configured.
-    if (wccp_fd != ts::NO_FD && watched_process_fd != ts::NO_FD) {
-      wccp_cache.housekeeping();
-      time_t wccp_wait = wccp_cache.waitTime();
-      if (wccp_wait < process_server_timeout_secs)
-        timeout.tv_sec = wccp_wait;
-
-      if (wccp_fd != ts::NO_FD) {
-        FD_SET(wccp_fd, &fdlist);
-      }
-    }
-#endif
-
-#if HAVE_EVENTFD
-    if (wakeup_fd != ts::NO_FD) {
-      FD_SET(wakeup_fd, &fdlist);
-    }
-#endif
-
-    int num = mgmt_select(FD_SETSIZE, &fdlist, nullptr, nullptr, &timeout);
-
-    switch (num) {
-    case 0:
-      // Timed out, nothing to do.
-      return;
-    case -1:
-      if (mgmt_transient_error()) {
-        continue;
-      }
-
-      mgmt_log("[LocalManager::pollMgmtProcessServer] select failed: %s (%d)\n", ::strerror(errno), errno);
-      return;
-
-    default:
-      // if we get a wakeup_fd event, we may not want to follow it
-      // because there may be more data to be read on the socket.
-      bool keep_polling = false;
-#if TS_HAS_WCCP
-      if (wccp_fd != ts::NO_FD && FD_ISSET(wccp_fd, &fdlist)) {
-        wccp_cache.handleMessage();
-        --num;
-        keep_polling = true;
-      }
-#endif
-
-      if (process_server_sockfd != ts::NO_FD && FD_ISSET(process_server_sockfd, &fdlist)) { /* New connection */
-        struct sockaddr_in clientAddr;
-        socklen_t clientLen = sizeof(clientAddr);
-        int new_sockfd      = mgmt_accept(process_server_sockfd, reinterpret_cast<struct sockaddr *>(&clientAddr), &clientLen);
-
-        mgmt_log("[LocalManager::pollMgmtProcessServer] New process connecting fd '%d'\n", new_sockfd);
-
-        if (new_sockfd < 0) {
-          mgmt_elog(errno, "[LocalManager::pollMgmtProcessServer] ==> ");
-        } else if (!processRunning()) {
-          watched_process_fd = new_sockfd;
-        } else {
-          close_socket(new_sockfd);
-        }
-        --num;
-        keep_polling = true;
-      }
-
-      if (ts::NO_FD != watched_process_fd && FD_ISSET(watched_process_fd, &fdlist)) {
-        int res;
-        MgmtMessageHdr mh_hdr;
-
-        keep_polling = true;
-
-        // read the message
-        if ((res = mgmt_read_pipe(watched_process_fd, reinterpret_cast<char *>(&mh_hdr), sizeof(MgmtMessageHdr))) > 0) {
-          MgmtMessageHdr *mh_full = static_cast<MgmtMessageHdr *>(malloc(sizeof(MgmtMessageHdr) + mh_hdr.data_len));
-          memcpy(mh_full, &mh_hdr, sizeof(MgmtMessageHdr));
-          char *data_raw = reinterpret_cast<char *>(mh_full) + sizeof(MgmtMessageHdr);
-          if ((res = mgmt_read_pipe(watched_process_fd, data_raw, mh_hdr.data_len)) > 0) {
-            handleMgmtMsgFromProcesses(mh_full);
-          } else if (res < 0) {
-            mgmt_fatal(0, "[LocalManager::pollMgmtProcessServer] Error in read (errno: %d)\n", -res);
-          }
-          free(mh_full);
-        } else if (res < 0) {
-          mgmt_fatal(0, "[LocalManager::pollMgmtProcessServer] Error in read (errno: %d)\n", -res);
-        }
-
-        // handle EOF
-        if (res == 0) {
-          int estatus;
-          pid_t tmp_pid = watched_process_pid;
-
-          Debug("lm", "[LocalManager::pollMgmtProcessServer] Lost process EOF!");
-
-          close_socket(watched_process_fd);
-
-          waitpid(watched_process_pid, &estatus, 0); /* Reap child */
-          if (WIFSIGNALED(estatus)) {
-            int sig = WTERMSIG(estatus);
-            mgmt_log("[LocalManager::pollMgmtProcessServer] Server Process terminated due to Sig %d: %s\n", sig, strsignal(sig));
-          } else if (WIFEXITED(estatus)) {
-            int return_code = WEXITSTATUS(estatus);
-
-            // traffic_server's exit code will be UNRECOVERABLE_EXIT if it calls
-            // ink_emergency() or ink_emergency_va(). The call signals that traffic_server
-            // cannot be recovered with a reboot. In other words, catastrophic failure.
-            if (return_code == UNRECOVERABLE_EXIT) {
-              proxy_recoverable = false;
-            }
-          }
-
-          if (lmgmt->run_proxy) {
-            mgmt_log("[Alarms::signalAlarm] Server Process was reset\n");
-            lmgmt->alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_PROCESS_DIED, nullptr);
-          } else {
-            mgmt_log("[TrafficManager] Server process shutdown\n");
-          }
-
-          watched_process_fd = watched_process_pid = -1;
-          if (tmp_pid != -1) { /* Incremented after a pid: message is sent */
-            proxy_running--;
-          }
-          proxy_started_at = -1;
-          RecSetRecordInt("proxy.node.proxy_running", 0, REC_SOURCE_DEFAULT);
-        }
-
-        --num;
-      }
-
-#if HAVE_EVENTFD
-      if (wakeup_fd != ts::NO_FD && FD_ISSET(wakeup_fd, &fdlist)) {
-        if (!keep_polling) {
-          // read or else fd will always be set.
-          uint64_t ignore;
-          ATS_UNUSED_RETURN(read(wakeup_fd, &ignore, sizeof(uint64_t)));
-          return;
-        }
-        --num;
-      }
-#else
-      (void)keep_polling; // suppress compiler warning
-#endif
-
-      ink_assert(num == 0); /* Invariant */
-    }
-  }
-}
-
-void
-LocalManager::handleMgmtMsgFromProcesses(MgmtMessageHdr *mh)
-{
-  char *data_raw = reinterpret_cast<char *>(mh) + sizeof(MgmtMessageHdr);
-  switch (mh->msg_id) {
-  case MGMT_SIGNAL_PID:
-    watched_process_pid = *(reinterpret_cast<pid_t *>(data_raw));
-    lmgmt->alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_PROCESS_BORN, nullptr);
-    proxy_running++;
-    proxy_launch_pid         = -1;
-    proxy_launch_outstanding = false;
-    RecSetRecordInt("proxy.node.proxy_running", 1, REC_SOURCE_DEFAULT);
-    break;
-
-  // FIX: This is very messy need to correlate mgmt signals and
-  // alarms better
-  case MGMT_SIGNAL_CONFIG_ERROR:
-    alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_CONFIG_ERROR, data_raw);
-    break;
-  case MGMT_SIGNAL_SYSTEM_ERROR:
-    alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_SYSTEM_ERROR, data_raw);
-    break;
-  case MGMT_SIGNAL_CACHE_ERROR:
-    alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_CACHE_ERROR, data_raw);
-    break;
-  case MGMT_SIGNAL_CACHE_WARNING:
-    alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_CACHE_WARNING, data_raw);
-    break;
-  case MGMT_SIGNAL_LOGGING_ERROR:
-    alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_LOGGING_ERROR, data_raw);
-    break;
-  case MGMT_SIGNAL_LOGGING_WARNING:
-    alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_LOGGING_WARNING, data_raw);
-    break;
-  case MGMT_SIGNAL_PLUGIN_SET_CONFIG: {
-    char var_name[256];
-    char var_value[256];
-    MgmtType stype;
-    // stype is an enum type, so cast to an int* to avoid warnings. /leif
-    int tokens = sscanf(data_raw, "%255s %d %255s", var_name, reinterpret_cast<int *>(&stype), var_value);
-    if (tokens != 3) {
-      stype = MGMT_INVALID;
-    }
-    switch (stype) {
-    case MGMT_INT:
-      RecSetRecordInt(var_name, ink_atoi64(var_value), REC_SOURCE_EXPLICIT);
-      break;
-    case MGMT_COUNTER:
-    case MGMT_FLOAT:
-    case MGMT_STRING:
-    case MGMT_INVALID:
-    default:
-      mgmt_log("[LocalManager::handleMgmtMsgFromProcesses] "
-               "Invalid plugin set-config msg '%s'\n",
-               data_raw);
-      break;
-    }
-  } break;
-  case MGMT_SIGNAL_LIBRECORDS:
-    if (mh->data_len > 0) {
-      executeMgmtCallback(MGMT_SIGNAL_LIBRECORDS, {data_raw, static_cast<size_t>(mh->data_len)});
-    } else {
-      executeMgmtCallback(MGMT_SIGNAL_LIBRECORDS, {});
-    }
-    break;
-  case MGMT_SIGNAL_CONFIG_FILE_CHILD: {
-    static const MgmtMarshallType fields[] = {MGMT_MARSHALL_STRING, MGMT_MARSHALL_STRING};
-    char *parent                           = nullptr;
-    char *child                            = nullptr;
-    if (mgmt_message_parse(data_raw, mh->data_len, fields, countof(fields), &parent, &child) != -1) {
-      configFiles->configFileChild(parent, child);
-    } else {
-      mgmt_log("[LocalManager::handleMgmtMsgFromProcesses] "
-               "MGMT_SIGNAL_CONFIG_FILE_CHILD mgmt_message_parse error\n");
-    }
-    // Output pointers are guaranteed to be NULL or valid.
-    ats_free_null(parent);
-    ats_free_null(child);
-  } break;
-
-  default:
-    break;
-  }
-}
-
-void
-LocalManager::sendMgmtMsgToProcesses(int msg_id, const char *data_str)
-{
-  sendMgmtMsgToProcesses(msg_id, data_str, strlen(data_str) + 1);
-  return;
-}
-
-void
-LocalManager::sendMgmtMsgToProcesses(int msg_id, const char *data_raw, int data_len)
-{
-  MgmtMessageHdr *mh;
-
-  mh           = static_cast<MgmtMessageHdr *>(alloca(sizeof(MgmtMessageHdr) + data_len));
-  mh->msg_id   = msg_id;
-  mh->data_len = data_len;
-  memcpy(reinterpret_cast<char *>(mh) + sizeof(MgmtMessageHdr), data_raw, data_len);
-  sendMgmtMsgToProcesses(mh);
-  return;
-}
-
-void
-LocalManager::sendMgmtMsgToProcesses(MgmtMessageHdr *mh)
-{
-  switch (mh->msg_id) {
-  case MGMT_EVENT_SHUTDOWN: {
-    run_proxy = false;
-    this->closeProxyPorts();
-    break;
-  }
-  case MGMT_EVENT_RESTART:
-    run_proxy = true;
-    listenForProxy();
-    return;
-  case MGMT_EVENT_BOUNCE: /* Just bouncing the cluster, have it exit well restart */
-    mh->msg_id = MGMT_EVENT_SHUTDOWN;
-    break;
-  case MGMT_EVENT_ROLL_LOG_FILES:
-    mgmt_log("[LocalManager::SendMgmtMsgsToProcesses]Event is being constructed .\n");
-    break;
-  case MGMT_EVENT_CONFIG_FILE_UPDATE:
-    bool found;
-    char *fname = nullptr;
-    ConfigManager *rb;
-    char *data_raw;
-
-    data_raw = reinterpret_cast<char *>(mh) + sizeof(MgmtMessageHdr);
-    fname    = REC_readString(data_raw, &found);
-
-    RecT rec_type;
-    if (RecGetRecordType(data_raw, &rec_type) == REC_ERR_OKAY && rec_type == RECT_CONFIG) {
-      RecSetSyncRequired(data_raw);
-    } else {
-      mgmt_log("[LocalManager:sendMgmtMsgToProcesses] Unknown file change: '%s'\n", data_raw);
-    }
-    ink_assert(found);
-    if (!(fname && configFiles && configFiles->getConfigObj(fname, &rb)) &&
-        (strcmp(data_raw, "proxy.config.body_factory.template_sets_dir") != 0) &&
-        (strcmp(data_raw, "proxy.config.ssl.server.ticket_key.filename") != 0)) {
-      mgmt_fatal(0, "[LocalManager::sendMgmtMsgToProcesses] "
-                    "Invalid 'data_raw' for MGMT_EVENT_CONFIG_FILE_UPDATE\n");
-    }
-    ats_free(fname);
-    break;
-  }
-
-  if (watched_process_fd != -1) {
-    if (mgmt_write_pipe(watched_process_fd, reinterpret_cast<char *>(mh), sizeof(MgmtMessageHdr) + mh->data_len) <= 0) {
-      // In case of Linux, sometimes when the TS dies, the connection between TS and TM
-      // is not closed properly. the socket does not receive an EOF. So, the TM does
-      // not detect that the connection and hence TS has gone down. Hence it still
-      // tries to send a message to TS, but encounters an error and enters here
-      // Also, ensure that this whole thing is done only once because there will be a
-      // deluge of message in the traffic.log otherwise
-
-      static pid_t check_prev_pid    = watched_process_pid;
-      static pid_t check_current_pid = watched_process_pid;
-      if (check_prev_pid != watched_process_pid) {
-        check_prev_pid    = watched_process_pid;
-        check_current_pid = watched_process_pid;
-      }
-
-      if (check_prev_pid == check_current_pid) {
-        check_current_pid = -1;
-        int lerrno        = errno;
-        mgmt_elog(errno, "[LocalManager::sendMgmtMsgToProcesses] Error writing message\n");
-        if (lerrno == ECONNRESET || lerrno == EPIPE) { // Connection closed by peer or Broken pipe
-          if ((kill(watched_process_pid, 0) < 0) && (errno == ESRCH)) {
-            // TS is down
-            pid_t tmp_pid = watched_process_pid;
-            close_socket(watched_process_fd);
-            mgmt_log("[LocalManager::pollMgmtProcessServer] "
-                     "Server Process has been terminated\n");
-            if (lmgmt->run_proxy) {
-              mgmt_log("[Alarms::signalAlarm] Server Process was reset\n");
-              lmgmt->alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_PROCESS_DIED, nullptr);
-            } else {
-              mgmt_log("[TrafficManager] Server process shutdown\n");
-            }
-            watched_process_fd = watched_process_pid = -1;
-            if (tmp_pid != -1) { /* Incremented after a pid: message is sent */
-              proxy_running--;
-            }
-            proxy_started_at = -1;
-            RecSetRecordInt("proxy.node.proxy_running", 0, REC_SOURCE_DEFAULT);
-            // End of TS down
-          } else {
-            // TS is still up, but the connection is lost
-            const char *err_msg = "The TS-TM connection is broken for some reason. Either restart TS and TM or correct this error "
-                                  "for TM to display TS statistics correctly";
-            lmgmt->alarm_keeper->signalAlarm(MGMT_ALARM_PROXY_SYSTEM_ERROR, err_msg);
-          }
-
-          // check if the TS is down, by checking the pid
-          // if TS is down, then,
-          //     raise an alarm
-          //     set the variables so that TS is restarted later
-          // else (TS is still up)
-          //     raise an alarm stating the problem
-        }
-      }
-    }
-  }
-}
-
-void
-LocalManager::signalFileChange(const char *var_name)
-{
-  signalEvent(MGMT_EVENT_CONFIG_FILE_UPDATE, var_name);
-
-  return;
-}
-
-void
-LocalManager::signalEvent(int msg_id, const char *data_str)
-{
-  signalEvent(msg_id, data_str, strlen(data_str) + 1);
-  return;
-}
-
-void
-LocalManager::signalEvent(int msg_id, const char *data_raw, int data_len)
-{
-  MgmtMessageHdr *mh;
-  size_t n = sizeof(MgmtMessageHdr) + data_len;
-
-  mh           = static_cast<MgmtMessageHdr *>(ats_malloc(n));
-  mh->msg_id   = msg_id;
-  mh->data_len = data_len;
-  auto payload = mh->payload();
-  memcpy(payload.data(), data_raw, data_len);
-  this->enqueue(mh);
-  //  ink_assert(enqueue(mgmt_event_queue, mh));
-
-#if HAVE_EVENTFD
-  // we don't care about the actual value of wakeup_fd, so just keep adding 1. just need to
-  // wakeup the fd. also, note that wakeup_fd was initialized to non-blocking so we can
-  // directly write to it without any timeout checking.
-  //
-  // don't trigger if MGMT_EVENT_LIBRECORD because they happen all the time
-  // and don't require a quick response. for MGMT_EVENT_LIBRECORD, rely on timeouts so
-  // traffic_server can spend more time doing other things
-  uint64_t one = 1;
-  if (wakeup_fd != ts::NO_FD && mh->msg_id != MGMT_EVENT_LIBRECORDS) {
-    ATS_UNUSED_RETURN(write(wakeup_fd, &one, sizeof(uint64_t))); // trigger to stop polling
-  }
-#endif
-}
-
-/*
- * processEventQueue()
- *   Function drains and processes the mgmt event queue
- * notifying any registered callback functions and performing
- * any mgmt tasks for each event.
- */
-void
-LocalManager::processEventQueue()
-{
-  while (!this->queue_empty()) {
-    bool handled_by_mgmt = false;
-
-    MgmtMessageHdr *mh = this->dequeue();
-    auto payload       = mh->payload().rebind<char>();
-
-    // check if we have a local file update
-    if (mh->msg_id == MGMT_EVENT_CONFIG_FILE_UPDATE) {
-      // records.config
-      if (!(strcmp(payload.begin(), ts::filename::RECORDS))) {
-        if (RecReadConfigFile() != REC_ERR_OKAY) {
-          mgmt_elog(errno, "[fileUpdated] Config update failed for %s\n", ts::filename::RECORDS);
-        } else {
-          RecConfigWarnIfUnregistered();
-        }
-        handled_by_mgmt = true;
-      }
-    }
-
-    if (!handled_by_mgmt) {
-      if (processRunning() == false) {
-        // Fix INKqa04984
-        // If traffic server hasn't completely come up yet,
-        // we will hold off until next round.
-        this->enqueue(mh);
-        return;
-      }
-      Debug("lm", "[TrafficManager] ==> Sending signal event '%d' %s payload=%d", mh->msg_id, payload.begin(), int(payload.size()));
-      lmgmt->sendMgmtMsgToProcesses(mh);
-    }
-    ats_free(mh);
-  }
-}
-
-/*
- * startProxy()
- *   Function fires up a proxy process.
- *
- * Args:
- *   onetime_options: one time options that traffic_server should be started with (ie
- *                    these options do not persist across reboots)
- */
-static const size_t OPTIONS_SIZE = 16384; // Arbitrary max size for command line option string
-
-bool
-LocalManager::startProxy(const char *onetime_options)
-{
-  if (proxy_launch_outstanding) {
-    return false;
-  }
-  mgmt_log("[LocalManager::startProxy] Launching ts process\n");
-
-  pid_t pid;
-
-  // Before we do anything lets check for the existence of
-  // the traffic server binary along with it's execute permissions
-  if (access(absolute_proxy_binary, F_OK) < 0) {
-    // Error can't find traffic_server
-    mgmt_elog(errno, "[LocalManager::startProxy] Unable to find traffic server at %s\n", absolute_proxy_binary);
-    return false;
-  }
-  // traffic server binary exists, check permissions
-  else if (access(absolute_proxy_binary, R_OK | X_OK) < 0) {
-    // Error don't have proper permissions
-    mgmt_elog(errno, "[LocalManager::startProxy] Unable to access %s due to bad permissions \n", absolute_proxy_binary);
-    return false;
-  }
-
-  if (env_prep) {
-#ifdef POSIX_THREAD
-    if ((pid = fork()) < 0)
-#else
-    if ((pid = fork1()) < 0)
-#endif
-    {
-      mgmt_elog(errno, "[LocalManager::startProxy] Unable to fork1 prep process\n");
-      return false;
-    } else if (pid > 0) {
-      int estatus;
-      waitpid(pid, &estatus, 0);
-    } else {
-      int res;
-
-      char env_prep_bin[MAXPATHLEN];
-      std::string bindir(RecConfigReadBinDir());
-
-      ink_filepath_make(env_prep_bin, sizeof(env_prep_bin), bindir.c_str(), env_prep);
-      res = execl(env_prep_bin, env_prep_bin, (char *)nullptr);
-      _exit(res);
-    }
-  }
-#ifdef POSIX_THREAD
-  if ((pid = fork()) < 0)
-#else
-  if ((pid = fork1()) < 0)
-#endif
-  {
-    mgmt_elog(errno, "[LocalManager::startProxy] Unable to fork1 process\n");
-    return false;
-  } else if (pid > 0) { /* Parent */
-    proxy_launch_pid         = pid;
-    proxy_launch_outstanding = true;
-    proxy_started_at         = time(nullptr);
-    ++proxy_launch_count;
-    RecSetRecordInt("proxy.node.restarts.proxy.start_time", proxy_started_at, REC_SOURCE_DEFAULT);
-    RecSetRecordInt("proxy.node.restarts.proxy.restart_count", proxy_launch_count, REC_SOURCE_DEFAULT);
-  } else {
-    int i = 0;
-    char *options[32], *last, *tok;
-    char options_buffer[OPTIONS_SIZE];
-    ts::FixedBufferWriter w{options_buffer, OPTIONS_SIZE};
-
-    w.clip(1);
-    w.print("{}{}", ts::bwf::OptionalAffix(proxy_options), ts::bwf::OptionalAffix(onetime_options));
-
-    // Make sure we're starting the proxy in mgmt mode
-    if (w.view().find(MGMT_OPT) == std::string_view::npos) {
-      w.write(MGMT_OPT);
-      w.write(' ');
-    }
-
-    // pass the runroot option to traffic_server
-    std::string_view runroot_arg = get_runroot();
-    if (!runroot_arg.empty()) {
-      w.write(RUNROOT_OPT);
-      w.write(runroot_arg);
-      w.write(' ');
-    }
-
-    // Pass down port/fd information to traffic_server if there are any open ports.
-    if (std::any_of(m_proxy_ports.begin(), m_proxy_ports.end(), [](HttpProxyPort &p) { return ts::NO_FD != p.m_fd; })) {
-      char portbuf[128];
-      bool need_comma_p = false;
-
-      w.write("--httpport "sv);
-      for (auto &p : m_proxy_ports) {
-        if (ts::NO_FD != p.m_fd) {
-          if (need_comma_p) {
-            w.write(',');
-          }
-          need_comma_p = true;
-          p.print(portbuf, sizeof(portbuf));
-          w.write(portbuf);
-        }
-      }
-    }
-
-    w.extend(1);
-    w.write('\0'); // null terminate.
-
-    Debug("lm", "[LocalManager::startProxy] Launching %s '%s'", absolute_proxy_binary, w.data());
-
-    // Unfortunately the normally obnoxious null writing of strtok is in this case a required
-    // side effect and other alternatives are noticeably more clunky.
-    ink_zero(options);
-    options[0] = absolute_proxy_binary;
-    i          = 1;
-    tok        = strtok_r(options_buffer, " ", &last);
-    Debug("lm", "opt %d = '%s'", i, tok);
-    options[i++] = tok;
-    while (i < 32 && (tok = strtok_r(nullptr, " ", &last))) {
-      Debug("lm", "opt %d = '%s'", i, tok);
-      options[i++] = tok;
-    }
-
-    EnableDeathSignal(SIGTERM);
-
-    execv(absolute_proxy_binary, options);
-    mgmt_fatal(errno, "[LocalManager::startProxy] Exec of %s failed\n", absolute_proxy_binary);
-  }
-  return true;
-}
-
-/** Close all open ports.
- */
-void
-LocalManager::closeProxyPorts()
-{
-  for (auto &p : lmgmt->m_proxy_ports) {
-    if (ts::NO_FD != p.m_fd) {
-      close_socket(p.m_fd);
-      p.m_fd = ts::NO_FD;
-    }
-  }
-}
-/*
- * listenForProxy()
- *  Function listens on the accept port of the proxy, so users aren't dropped.
- */
-void
-LocalManager::listenForProxy()
-{
-  if (!run_proxy || !listen_for_proxy) {
-    return;
-  }
-
-  // We are not already bound, bind the port
-  for (auto &p : lmgmt->m_proxy_ports) {
-    if (ts::NO_FD == p.m_fd) {
-      // Check the protocol (TCP or UDP) and create an appropriate socket
-      if (p.isQUIC()) {
-        this->bindUdpProxyPort(p);
-      } else {
-        this->bindTcpProxyPort(p);
-      }
-    }
-
-    std::string_view fam{ats_ip_family_name(p.m_family)};
-    if (p.isQUIC()) {
-      // Can we do something like listen backlog for QUIC(UDP) ??
-      // Do nothing for now
-    } else {
-      // read backlog configuration value and overwrite the default value if found
-      bool found;
-      RecInt backlog = REC_readInteger("proxy.config.net.listen_backlog", &found);
-      backlog        = (found && backlog >= 0) ? backlog : ats_tcp_somaxconn();
-
-      if ((listen(p.m_fd, backlog)) < 0) {
-        mgmt_fatal(errno, "[LocalManager::listenForProxy] Unable to listen on port: %d (%.*s)\n", p.m_port, fam.size(), fam.data());
-      }
-    }
-
-    mgmt_log("[LocalManager::listenForProxy] Listening on port: %d (%.*s)\n", p.m_port, fam.size(), fam.data());
-  }
-  return;
-}
-
-/*
- * bindUdpProxyPort()
- *  Function binds the accept port of the proxy
- */
-void
-LocalManager::bindUdpProxyPort(HttpProxyPort &port)
-{
-  int one  = 1;
-  int priv = (port.m_port < 1024 && 0 != geteuid()) ? ElevateAccess::LOW_PORT_PRIVILEGE : 0;
-
-  ElevateAccess access(priv);
-
-  if ((port.m_fd = socket(port.m_family, SOCK_DGRAM, 0)) < 0) {
-    mgmt_fatal(0, "[bindProxyPort] Unable to create socket : %s\n", strerror(errno));
-  }
-
-  if (port.m_family == AF_INET6) {
-    if (setsockopt(port.m_fd, IPPROTO_IPV6, IPV6_V6ONLY, SOCKOPT_ON, sizeof(int)) < 0) {
-      mgmt_log("[bindProxyPort] Unable to set socket options: %d : %s\n", port.m_port, strerror(errno));
-    }
-  }
-  if (setsockopt(port.m_fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char *>(&one), sizeof(int)) < 0) {
-    mgmt_fatal(0, "[bindProxyPort] Unable to set socket options: %d : %s\n", port.m_port, strerror(errno));
-  }
-
-  IpEndpoint ip;
-  if (port.m_inbound_ip.isValid()) {
-    ip.assign(port.m_inbound_ip);
-  } else if (AF_INET6 == port.m_family) {
-    if (m_inbound_ip6.isValid()) {
-      ip.assign(m_inbound_ip6);
-    } else {
-      ip.setToAnyAddr(AF_INET6);
-    }
-  } else if (AF_INET == port.m_family) {
-    if (m_inbound_ip4.isValid()) {
-      ip.assign(m_inbound_ip4);
-    } else {
-      ip.setToAnyAddr(AF_INET);
-    }
-  } else {
-    mgmt_fatal(0, "[bindProxyPort] Proxy port with invalid address type %d\n", port.m_family);
-  }
-  ip.network_order_port() = htons(port.m_port);
-  if (bind(port.m_fd, &ip.sa, ats_ip_size(&ip)) < 0) {
-    mgmt_fatal(0, "[bindProxyPort] Unable to bind socket: %d : %s\n", port.m_port, strerror(errno));
-  }
-
-  Debug("lm", "[bindProxyPort] Successfully bound proxy port %d", port.m_port);
-}
-
-/*
- * bindTcpProxyPort()
- *  Function binds the accept port of the proxy
- */
-void
-LocalManager::bindTcpProxyPort(HttpProxyPort &port)
-{
-  int one  = 1;
-  int priv = (port.m_port < 1024 && 0 != geteuid()) ? ElevateAccess::LOW_PORT_PRIVILEGE : 0;
-
-  ElevateAccess access(priv);
-
-  /* Setup reliable connection, for large config changes */
-  if ((port.m_fd = socket(port.m_family, SOCK_STREAM, 0)) < 0) {
-    mgmt_fatal(0, "[bindProxyPort] Unable to create socket : %s\n", strerror(errno));
-  }
-
-  if (port.m_type == HttpProxyPort::TRANSPORT_DEFAULT) {
-    int should_filter_int = 0;
-    bool found;
-    should_filter_int = REC_readInteger("proxy.config.net.defer_accept", &found);
-    if (found && should_filter_int > 0) {
-#if defined(SOL_FILTER) && defined(FIL_ATTACH)
-      (void)setsockopt(port.m_fd, SOL_FILTER, FIL_ATTACH, "httpfilt", 9);
-#endif
-    }
-  }
-
-  if (port.m_mptcp) {
-#if MPTCP_ENABLED
-    int err;
-
-    err = setsockopt(port.m_fd, IPPROTO_TCP, MPTCP_ENABLED, &one, sizeof(one));
-    if (err < 0) {
-      mgmt_log("[bindProxyPort] Unable to enable MPTCP: %s\n", strerror(errno));
-      Debug("lm_mptcp", "[bindProxyPort] Unable to enable MPTCP: %s", strerror(errno));
-    } else {
-      mgmt_log("[bindProxyPort] Successfully enabled MPTCP on %d\n", port.m_port);
-      Debug("lm_mptcp", "[bindProxyPort] Successfully enabled MPTCP on %d\n", port.m_port);
-    }
-#else
-    Debug("lm_mptcp", "[bindProxyPort] Multipath TCP requested but not configured on this host");
-#endif
-  }
-
-  if (port.m_family == AF_INET6) {
-    if (setsockopt(port.m_fd, IPPROTO_IPV6, IPV6_V6ONLY, SOCKOPT_ON, sizeof(int)) < 0) {
-      mgmt_log("[bindProxyPort] Unable to set socket options: %d : %s\n", port.m_port, strerror(errno));
-    }
-  }
-  if (setsockopt(port.m_fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char *>(&one), sizeof(int)) < 0) {
-    mgmt_fatal(0, "[bindProxyPort] Unable to set socket options: %d : %s\n", port.m_port, strerror(errno));
-  }
-
-  if (port.m_proxy_protocol) {
-    Debug("lm", "[bindProxyPort] Proxy Protocol enabled");
-  }
-
-  if (port.m_inbound_transparent_p) {
-#if TS_USE_TPROXY
-    Debug("http_tproxy", "Listen port %d inbound transparency enabled.", port.m_port);
-    if (setsockopt(port.m_fd, SOL_IP, TS_IP_TRANSPARENT, &one, sizeof(one)) == -1) {
-      mgmt_fatal(0, "[bindProxyPort] Unable to set transparent socket option [%d] %s\n", errno, strerror(errno));
-    }
-#else
-    Debug("lm", "[bindProxyPort] Transparency requested but TPROXY not configured");
-#endif
-  }
-
-  IpEndpoint ip;
-  if (port.m_inbound_ip.isValid()) {
-    ip.assign(port.m_inbound_ip);
-  } else if (AF_INET6 == port.m_family) {
-    if (m_inbound_ip6.isValid()) {
-      ip.assign(m_inbound_ip6);
-    } else {
-      ip.setToAnyAddr(AF_INET6);
-    }
-  } else if (AF_INET == port.m_family) {
-    if (m_inbound_ip4.isValid()) {
-      ip.assign(m_inbound_ip4);
-    } else {
-      ip.setToAnyAddr(AF_INET);
-    }
-  } else {
-    mgmt_fatal(0, "[bindProxyPort] Proxy port with invalid address type %d\n", port.m_family);
-  }
-  ip.network_order_port() = htons(port.m_port);
-  if (bind(port.m_fd, &ip.sa, ats_ip_size(&ip)) < 0) {
-    mgmt_fatal(0, "[bindProxyPort] Unable to bind socket: %d : %s\n", port.m_port, strerror(errno));
-  }
-
-  Debug("lm", "[bindProxyPort] Successfully bound proxy port %d", port.m_port);
-}
-
-void
-LocalManager::signalAlarm(int alarm_id, const char *desc, const char *ip)
-{
-  if (alarm_keeper) {
-    alarm_keeper->signalAlarm(static_cast<alarm_t>(alarm_id), desc, ip);
-  }
-}
diff --git a/mgmt/LocalManager.h b/mgmt/LocalManager.h
deleted file mode 100644
index f5121a41e..000000000
--- a/mgmt/LocalManager.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/** @file
-
-  Definitions for the LocalManager class.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include <string>
-
-#include "BaseManager.h"
-#include "records/I_RecHttp.h"
-#include "tscore/I_Version.h"
-
-#include <syslog.h>
-#if TS_HAS_WCCP
-#include <wccp/Wccp.h>
-#endif
-#if HAVE_EVENTFD
-#include <sys/eventfd.h>
-#endif
-
-class Alarms;
-class FileManager;
-
-enum ManagementPendingOperation {
-  MGMT_PENDING_NONE,         // Do nothing
-  MGMT_PENDING_RESTART,      // Restart TS and TM
-  MGMT_PENDING_BOUNCE,       // Restart TS
-  MGMT_PENDING_STOP,         // Stop TS
-  MGMT_PENDING_DRAIN,        // Drain TS
-  MGMT_PENDING_IDLE_RESTART, // Restart TS and TM when TS is idle
-  MGMT_PENDING_IDLE_BOUNCE,  // Restart TS when TS is idle
-  MGMT_PENDING_IDLE_STOP,    // Stop TS when TS is idle
-  MGMT_PENDING_IDLE_DRAIN,   // Drain TS when TS is idle from new connections
-  MGMT_PENDING_UNDO_DRAIN,   // Recover TS from drain
-};
-
-class LocalManager : public BaseManager
-{
-public:
-  explicit LocalManager(bool proxy_on, bool listen);
-  ~LocalManager();
-
-  void initAlarm();
-  void initCCom(const AppVersionInfo &version, FileManager *files, int mcport, char *addr, int rsport);
-  void initMgmtProcessServer();
-  void pollMgmtProcessServer();
-  void handleMgmtMsgFromProcesses(MgmtMessageHdr *mh);
-  void sendMgmtMsgToProcesses(int msg_id, const char *data_str);
-  void sendMgmtMsgToProcesses(int msg_id, const char *data_raw, int data_len);
-  void sendMgmtMsgToProcesses(MgmtMessageHdr *mh);
-
-  void signalFileChange(const char *var_name);
-  void signalEvent(int msg_id, const char *data_str);
-  void signalEvent(int msg_id, const char *data_raw, int data_len);
-  void signalAlarm(int alarm_id, const char *desc = nullptr, const char *ip = nullptr);
-
-  void processEventQueue();
-  bool startProxy(const char *onetime_options);
-  void listenForProxy();
-  void bindUdpProxyPort(HttpProxyPort &);
-  void bindTcpProxyPort(HttpProxyPort &);
-  void closeProxyPorts();
-
-  void mgmtCleanup();
-  void mgmtShutdown();
-  void processShutdown(bool mainThread = false);
-  void processRestart();
-  void processBounce();
-  void processDrain(int to_drain = 1);
-  void rollLogFiles();
-  void clearStats(const char *name = nullptr);
-  void hostStatusSetDown(const char *marshalled_req, int len);
-  void hostStatusSetUp(const char *marshalled_req, int len);
-
-  bool processRunning();
-
-  bool run_proxy;
-  bool listen_for_proxy;
-  bool proxy_recoverable = true; // false if traffic_server cannot recover with a reboot
-  time_t manager_started_at;
-  time_t proxy_started_at                              = -1;
-  int proxy_launch_count                               = 0;
-  bool proxy_launch_outstanding                        = false;
-  ManagementPendingOperation mgmt_shutdown_outstanding = MGMT_PENDING_NONE;
-  time_t mgmt_shutdown_triggered_at;
-  time_t mgmt_drain_triggered_at;
-  int proxy_running = 0;
-  HttpProxyPort::Group m_proxy_ports;
-  // Local inbound addresses to bind, if set.
-  IpAddr m_inbound_ip4;
-  IpAddr m_inbound_ip6;
-
-  int process_server_timeout_secs;
-  int process_server_timeout_msecs;
-
-  char *absolute_proxy_binary;
-  char *proxy_name;
-  char *proxy_binary;
-  std::string proxy_options; // These options should persist across proxy reboots
-  char *env_prep;
-
-  int process_server_sockfd = ts::NO_FD;
-  int watched_process_fd    = ts::NO_FD;
-#if HAVE_EVENTFD
-  int wakeup_fd = ts::NO_FD; // external trigger to stop polling
-#endif
-  pid_t proxy_launch_pid = -1;
-
-  Alarms *alarm_keeper     = nullptr;
-  FileManager *configFiles = nullptr;
-
-  pid_t watched_process_pid = -1;
-
-  int syslog_facility = LOG_DAEMON;
-
-#if TS_HAS_WCCP
-  wccp::Cache wccp_cache;
-#endif
-private:
-}; /* End class LocalManager */
-
-extern LocalManager *lmgmt;
diff --git a/mgmt/Makefile.am b/mgmt/Makefile.am
index b200946a7..93a26fe57 100644
--- a/mgmt/Makefile.am
+++ b/mgmt/Makefile.am
@@ -17,19 +17,17 @@
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
 
-SUBDIRS = utils api
+SUBDIRS = utils api config rpc
 
 # Decoder ring:
 # 	libmgmt_c.la 	Configuration records (defaults).
-# 	libmgmt_lm.la	libmgmt for Local Manager applications (traffic_manager)
 # 	libmgmt_p.la	libmgmt for Process Manager applications (everything else)
-noinst_LTLIBRARIES = libmgmt_c.la libmgmt_p.la libmgmt_lm.la
+noinst_LTLIBRARIES = libmgmt_c.la libmgmt_p.la
 
 AM_CPPFLAGS += \
 	$(iocore_include_dirs) \
 	-I$(abs_top_srcdir)/include \
 	-I$(abs_top_srcdir)/lib \
-	-I$(abs_top_srcdir)/mgmt/api/include \
 	-I$(abs_top_srcdir)/mgmt/utils \
 	-I$(abs_top_srcdir)/proxy \
 	-I$(abs_top_srcdir)/proxy/http \
@@ -42,39 +40,16 @@ libmgmt_c_la_SOURCES = \
 	RecordsConfig.h
 
 libmgmt_COMMON = \
-	BaseManager.cc \
-	BaseManager.h \
 	MgmtDefs.h \
 	RecordsConfigUtils.cc
 
 libmgmt_p_la_SOURCES = \
 	$(libmgmt_COMMON) \
-	ProcessManager.cc \
-	ProcessManager.h \
 	ProxyConfig.cc \
 	ProxyConfig.h \
 	YamlCfg.cc \
 	YamlCfg.h
 
-libmgmt_lm_la_SOURCES = \
-	$(libmgmt_COMMON) \
-	Alarms.cc \
-	Alarms.h \
-	DerivativeMetrics.cc \
-	DerivativeMetrics.h \
-	FileManager.cc \
-	FileManager.h \
-	LocalManager.cc \
-	LocalManager.h \
-	ConfigManager.cc \
-	ConfigManager.h \
-	WebMgmtUtils.cc \
-	WebMgmtUtils.h
-
-libmgmt_lm_la_LIBADD = \
-	libmgmt_c.la \
-	$(top_builddir)/mgmt/utils/libutils_lm.la
-
 libmgmt_p_la_LIBADD = \
 	libmgmt_c.la \
 	$(top_builddir)/mgmt/utils/libutils_p.la
diff --git a/mgmt/MgmtDefs.h b/mgmt/MgmtDefs.h
index 2245ee5b9..b62588ff2 100644
--- a/mgmt/MgmtDefs.h
+++ b/mgmt/MgmtDefs.h
@@ -39,15 +39,6 @@ typedef int8_t MgmtByte;
 typedef float MgmtFloat;
 typedef char *MgmtString;
 
-enum MgmtType {
-  MGMT_INVALID  = -1,
-  MGMT_INT      = 0,
-  MGMT_FLOAT    = 1,
-  MGMT_STRING   = 2,
-  MGMT_COUNTER  = 3,
-  MGMT_TYPE_MAX = 4,
-};
-
 /// Management callback signature.
 /// The memory span is the message payload for the callback.
 /// This can be a lambda, which should be used if additional context information is needed.
@@ -145,5 +136,3 @@ inline MgmtConverter::MgmtConverter(MgmtInt (*_load_int)(const void *), void (*_
     store_string(_store_string)
 {
 }
-
-constexpr ts::TextView LM_CONNECTION_SERVER{"processerver.sock"};
diff --git a/mgmt/ProcessManager.cc b/mgmt/ProcessManager.cc
deleted file mode 100644
index b8661eebb..000000000
--- a/mgmt/ProcessManager.cc
+++ /dev/null
@@ -1,512 +0,0 @@
-/** @file
-
-  File contains the member function defs and thread loop for the process manager.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#include "InkAPIInternal.h"
-#include "ProcessManager.h"
-
-#include "tscore/ink_apidefs.h"
-#include "tscore/TSSystemState.h"
-#include "MgmtSocket.h"
-#include "tscore/I_Layout.h"
-
-/*
- * Global ProcessManager
- */
-ProcessManager *pmgmt = nullptr;
-
-// read_management_message attempts to read a message from the management
-// socket. Returns -errno on error, otherwise 0. If a message was read the
-// *msg pointer will be filled in with the message that was read.
-static int
-read_management_message(int sockfd, MgmtMessageHdr **msg)
-{
-  MgmtMessageHdr hdr;
-  int ret;
-
-  *msg = nullptr;
-
-  // We have a message, try to read the message header.
-  ret = mgmt_read_pipe(sockfd, reinterpret_cast<char *>(&hdr), sizeof(MgmtMessageHdr));
-  switch (ret) {
-  case 0:
-    // Received EOF.
-    return 0;
-  case sizeof(MgmtMessageHdr):
-    break;
-  default:
-    // Received -errno.
-    return -errno;
-  }
-
-  size_t msg_size          = sizeof(MgmtMessageHdr) + hdr.data_len;
-  MgmtMessageHdr *full_msg = static_cast<MgmtMessageHdr *>(ats_malloc(msg_size));
-
-  memcpy(full_msg, &hdr, sizeof(MgmtMessageHdr));
-  char *data_raw = reinterpret_cast<char *>(full_msg) + sizeof(MgmtMessageHdr);
-
-  ret = mgmt_read_pipe(sockfd, data_raw, hdr.data_len);
-  if (ret == 0) {
-    // Received EOF.
-    ats_free(full_msg);
-    return 0;
-  } else if (ret < 0) {
-    // Received -errno.
-    ats_free(full_msg);
-    return ret;
-  } else {
-    ink_release_assert(ret == hdr.data_len);
-    // Received the message.
-    *msg = full_msg;
-    return 0;
-  }
-}
-
-void
-ProcessManager::start(std::function<TSThread()> const &cb_init, std::function<void(TSThread)> const &cb_destroy)
-{
-  Debug("pmgmt", "starting process manager");
-
-  init    = cb_init;
-  destroy = cb_destroy;
-
-  ink_release_assert(running == 0);
-  ink_atomic_increment(&running, 1);
-  ink_thread_create(&poll_thread, processManagerThread, nullptr, 0, 0, nullptr);
-}
-
-void
-ProcessManager::stop()
-{
-  Debug("pmgmt", "stopping process manager");
-
-  ink_release_assert(running == 1);
-  ink_atomic_decrement(&running, 1);
-
-  int tmp;
-
-  if (local_manager_sockfd != ts::NO_FD) {
-    tmp                  = local_manager_sockfd;
-    local_manager_sockfd = ts::NO_FD;
-    close_socket(tmp);
-  }
-
-#if HAVE_EVENTFD
-  if (wakeup_fd != ts::NO_FD) {
-    tmp       = wakeup_fd;
-    wakeup_fd = ts::NO_FD;
-    close_socket(tmp);
-  }
-#endif
-
-  ink_thread_kill(poll_thread, SIGINT);
-
-  ink_thread_join(poll_thread);
-  poll_thread = ink_thread_null();
-
-  while (!queue_is_empty(mgmt_signal_queue)) {
-    char *sig = static_cast<char *>(::dequeue(mgmt_signal_queue));
-    ats_free(sig);
-  }
-
-  LLQ *tmp_queue    = mgmt_signal_queue;
-  mgmt_signal_queue = nullptr;
-  delete_queue(tmp_queue);
-}
-
-/*
- * processManagerThread(...)
- *   The start function and thread loop for the process manager.
- */
-void *
-ProcessManager::processManagerThread(void *arg)
-{
-  void *ret = arg;
-
-  while (!pmgmt) { /* Avert race condition, thread spun during constructor */
-    Debug("pmgmt", "waiting for initialization");
-    mgmt_sleep_sec(1);
-  }
-
-  if (pmgmt->require_lm) { /* Allow p. process to run w/o a lm */
-    pmgmt->initLMConnection();
-  } else {
-    return ret;
-  }
-
-  if (pmgmt->init) {
-    pmgmt->managerThread = pmgmt->init();
-  }
-
-  // Start pumping messages between the local process and the process
-  // manager. This will terminate when the process manager terminates
-  // or the local process calls stop(). In either case, it is likely
-  // that we will first notice because we got a socket error, but in
-  // the latter case, the `running` flag has already been toggled so
-  // we know that we are really doing a shutdown.
-  while (pmgmt->running) {
-    int ret;
-
-    if (pmgmt->require_lm) {
-      ret = pmgmt->pollLMConnection();
-      if (ret < 0 && pmgmt->running && !TSSystemState::is_event_system_shut_down()) {
-        Alert("exiting with read error from process manager: %s", strerror(-ret));
-      }
-    }
-
-    ret = pmgmt->processSignalQueue();
-    if (ret < 0 && pmgmt->running && !TSSystemState::is_event_system_shut_down()) {
-      Alert("exiting with write error from process manager: %s", strerror(-ret));
-    }
-  }
-
-  if (pmgmt->destroy && pmgmt->managerThread != nullptr) {
-    pmgmt->destroy(pmgmt->managerThread);
-    pmgmt->managerThread = nullptr;
-  }
-
-  return ret;
-}
-
-ProcessManager::ProcessManager(bool rlm)
-  : BaseManager(), require_lm(rlm), pid(getpid()), local_manager_sockfd(0), cbtable(nullptr), max_msgs_in_a_row(1)
-{
-  mgmt_signal_queue = create_queue();
-
-  local_manager_sockfd = ts::NO_FD;
-#if HAVE_EVENTFD
-  wakeup_fd = ts::NO_FD;
-#endif
-
-  // Set temp. process/manager timeout. Will be reconfigure later.
-  // Making the process_manager thread a spinning thread to start traffic server
-  // as quickly as possible. Will reset this timeout when reconfigure()
-  timeout = 0;
-}
-
-ProcessManager::~ProcessManager()
-{
-  if (running) {
-    stop();
-  }
-}
-
-void
-ProcessManager::reconfigure()
-{
-  max_msgs_in_a_row = MAX_MSGS_IN_A_ROW;
-
-  if (RecGetRecordInt("proxy.config.process_manager.timeout", &timeout) != REC_ERR_OKAY) {
-    // Default to 5sec if the timeout is unspecified.
-    timeout = 5;
-  }
-}
-
-void
-ProcessManager::signalConfigFileChild(const char *parent, const char *child)
-{
-  static const MgmtMarshallType fields[] = {MGMT_MARSHALL_STRING, MGMT_MARSHALL_STRING};
-
-  size_t len   = mgmt_message_length(fields, countof(fields), &parent, &child);
-  void *buffer = ats_malloc(len);
-
-  mgmt_message_marshall(buffer, len, fields, countof(fields), &parent, &child);
-  signalManager(MGMT_SIGNAL_CONFIG_FILE_CHILD, static_cast<const char *>(buffer), len);
-
-  ats_free(buffer);
-}
-
-void
-ProcessManager::signalManager(int msg_id, const char *data_str)
-{
-  signalManager(msg_id, data_str, strlen(data_str) + 1);
-}
-
-void
-ProcessManager::signalManager(int msg_id, const char *data_raw, int data_len)
-{
-  MgmtMessageHdr *mh;
-
-  mh           = static_cast<MgmtMessageHdr *>(ats_malloc(sizeof(MgmtMessageHdr) + data_len));
-  mh->msg_id   = msg_id;
-  mh->data_len = data_len;
-  memcpy(reinterpret_cast<char *>(mh) + sizeof(MgmtMessageHdr), data_raw, data_len);
-  this->signalManager(mh);
-}
-
-void
-ProcessManager::signalManager(int msg_id, std::string_view text)
-{
-  MgmtMessageHdr *mh;
-
-  // Make space for the extra null terminator.
-  mh           = static_cast<MgmtMessageHdr *>(ats_malloc(sizeof(MgmtMessageHdr) + text.size() + 1));
-  auto body    = reinterpret_cast<char *>(mh + 1); // start of the message body.
-  mh->msg_id   = msg_id;
-  mh->data_len = text.size() + 1;
-  memcpy(body, text.data(), text.size());
-  body[text.size()] = '\0';
-
-  this->signalManager(mh);
-}
-
-void
-ProcessManager::signalManager(MgmtMessageHdr *mh)
-{
-  if (!this->running) {
-    Warning("MgmtMessageHdr is ignored. Because ProcessManager is not running");
-    return;
-  }
-  ink_release_assert(::enqueue(mgmt_signal_queue, mh));
-
-#if HAVE_EVENTFD
-  // we don't care about the actual value of wakeup_fd, so just keep adding 1. just need to
-  // wakeup the fd. also, note that wakeup_fd was initialized to non-blocking so we can
-  // directly write to it without any timeout checking.
-  //
-  // don't trigger if MGMT_EVENT_LIBRECORD because they happen all the time
-  // and don't require a quick response. for MGMT_EVENT_LIBRECORD, rely on timeouts so
-  // traffic_server can spend more time doing other things/
-  uint64_t one = 1;
-  if (wakeup_fd != ts::NO_FD && mh->msg_id != MGMT_SIGNAL_LIBRECORDS) {
-    ATS_UNUSED_RETURN(write(wakeup_fd, &one, sizeof(uint64_t))); // trigger to stop polling
-  }
-#endif
-}
-
-int
-ProcessManager::processSignalQueue()
-{
-  while (!queue_is_empty(mgmt_signal_queue)) {
-    MgmtMessageHdr *mh = static_cast<MgmtMessageHdr *>(::dequeue(mgmt_signal_queue));
-
-    Debug("pmgmt", "signaling local manager with message ID %d", mh->msg_id);
-
-    if (require_lm) {
-      int ret = mgmt_write_pipe(local_manager_sockfd, reinterpret_cast<char *>(mh), sizeof(MgmtMessageHdr) + mh->data_len);
-      ats_free(mh);
-
-      if (ret < 0) {
-        return ret;
-      }
-    }
-  }
-
-  return 0;
-}
-
-void
-ProcessManager::initLMConnection()
-{
-  std::string rundir(RecConfigReadRuntimeDir());
-  std::string sockpath(Layout::relative_to(rundir, LM_CONNECTION_SERVER));
-
-  MgmtMessageHdr *mh_full;
-  int data_len;
-
-  int servlen;
-  struct sockaddr_un serv_addr;
-
-  if (sockpath.length() > sizeof(serv_addr.sun_path) - 1) {
-    errno = ENAMETOOLONG;
-    Fatal("Unable to create socket '%s': %s", sockpath.c_str(), strerror(errno));
-  }
-
-  /* Setup Connection to LocalManager */
-  memset(reinterpret_cast<char *>(&serv_addr), 0, sizeof(serv_addr));
-  serv_addr.sun_family = AF_UNIX;
-
-  ink_strlcpy(serv_addr.sun_path, sockpath.c_str(), sizeof(serv_addr.sun_path));
-#if defined(darwin) || defined(freebsd)
-  servlen = sizeof(sockaddr_un);
-#else
-  servlen = strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);
-#endif
-
-  if ((local_manager_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
-    Fatal("Unable to create socket '%s': %s", sockpath.c_str(), strerror(errno));
-  }
-
-  if (fcntl(local_manager_sockfd, F_SETFD, FD_CLOEXEC) < 0) {
-    Fatal("unable to set close-on-exec flag: %s", strerror(errno));
-  }
-
-  if ((connect(local_manager_sockfd, reinterpret_cast<struct sockaddr *>(&serv_addr), servlen)) < 0) {
-    Fatal("failed to connect management socket '%s': %s", sockpath.c_str(), strerror(errno));
-  }
-
-#if HAVE_EVENTFD
-  wakeup_fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
-  if (wakeup_fd < 0) {
-    Fatal("unable to create wakeup eventfd. errno: %s", strerror(errno));
-  }
-#endif
-
-  data_len          = sizeof(pid_t);
-  mh_full           = static_cast<MgmtMessageHdr *>(alloca(sizeof(MgmtMessageHdr) + data_len));
-  mh_full->msg_id   = MGMT_SIGNAL_PID;
-  mh_full->data_len = data_len;
-
-  memcpy(reinterpret_cast<char *>(mh_full) + sizeof(MgmtMessageHdr), &(pid), data_len);
-
-  if (mgmt_write_pipe(local_manager_sockfd, reinterpret_cast<char *>(mh_full), sizeof(MgmtMessageHdr) + data_len) <= 0) {
-    Fatal("error writing message: %s", strerror(errno));
-  }
-}
-
-int
-ProcessManager::pollLMConnection()
-{
-  int count;
-  int ready;
-  struct timeval timeout;
-  fd_set fdlist;
-
-  // Avoid getting stuck enqueuing too many requests in a row, limit to MAX_MSGS_IN_A_ROW.
-  for (count = 0; running && count < max_msgs_in_a_row; ++count) {
-    timeout.tv_sec  = 1;
-    timeout.tv_usec = 0;
-
-    FD_ZERO(&fdlist);
-
-    if (local_manager_sockfd != ts::NO_FD) {
-      FD_SET(local_manager_sockfd, &fdlist);
-    }
-
-#if HAVE_EVENTFD
-    if (wakeup_fd != ts::NO_FD) {
-      FD_SET(wakeup_fd, &fdlist);
-    }
-#endif
-
-    // wait for data on socket
-    ready = mgmt_select(FD_SETSIZE, &fdlist, nullptr, nullptr, &timeout);
-
-    switch (ready) {
-    case 0:
-      // Timed out.
-      return 0;
-    case -1:
-      if (mgmt_transient_error()) {
-        continue;
-      }
-      return -errno;
-    }
-
-    if (local_manager_sockfd != ts::NO_FD && FD_ISSET(local_manager_sockfd, &fdlist)) { /* Message from manager */
-      MgmtMessageHdr *msg;
-
-      int ret = read_management_message(local_manager_sockfd, &msg);
-      if (ret < 0) {
-        return ret;
-      }
-
-      // No message, we are done polling. */
-      if (msg == nullptr) {
-        return 0;
-      }
-
-      Debug("pmgmt", "received message ID %d", msg->msg_id);
-      handleMgmtMsgFromLM(msg);
-    }
-#if HAVE_EVENTFD
-    else if (wakeup_fd != ts::NO_FD && FD_ISSET(wakeup_fd, &fdlist)) { /* if msg, keep polling for more */
-      // read or else fd will always be set.
-      uint64_t ignore;
-      ATS_UNUSED_RETURN(read(wakeup_fd, &ignore, sizeof(uint64_t)));
-      break;
-    }
-#endif
-  }
-  Debug("pmgmt", "enqueued %d of max %d messages in a row", count, max_msgs_in_a_row);
-  return 0;
-}
-
-void
-ProcessManager::handleMgmtMsgFromLM(MgmtMessageHdr *mh)
-{
-  ink_assert(mh != nullptr);
-
-  auto payload = mh->payload();
-
-  Debug("pmgmt", "processing event id '%d' payload=%d", mh->msg_id, mh->data_len);
-  switch (mh->msg_id) {
-  case MGMT_EVENT_SHUTDOWN:
-    executeMgmtCallback(MGMT_EVENT_SHUTDOWN, {});
-    Alert("exiting on shutdown message");
-    break;
-  case MGMT_EVENT_RESTART:
-    executeMgmtCallback(MGMT_EVENT_RESTART, {});
-    break;
-  case MGMT_EVENT_DRAIN:
-    executeMgmtCallback(MGMT_EVENT_DRAIN, payload);
-    break;
-  case MGMT_EVENT_CLEAR_STATS:
-    executeMgmtCallback(MGMT_EVENT_CLEAR_STATS, {});
-    break;
-  case MGMT_EVENT_HOST_STATUS_UP:
-    executeMgmtCallback(MGMT_EVENT_HOST_STATUS_UP, payload);
-    break;
-  case MGMT_EVENT_HOST_STATUS_DOWN:
-    executeMgmtCallback(MGMT_EVENT_HOST_STATUS_DOWN, payload);
-    break;
-  case MGMT_EVENT_ROLL_LOG_FILES:
-    executeMgmtCallback(MGMT_EVENT_ROLL_LOG_FILES, {});
-    break;
-  case MGMT_EVENT_PLUGIN_CONFIG_UPDATE: {
-    auto msg{payload.rebind<char>()};
-    if (!msg.empty() && msg[0] != '\0' && this->cbtable) {
-      this->cbtable->invoke(msg.data());
-    }
-  } break;
-  case MGMT_EVENT_CONFIG_FILE_UPDATE:
-    /*
-      librecords -- we don't do anything in here because we are traffic_server
-      and we are not the owner of proxy.config.* variables.
-      Even if we trigger the sync_required bit, by
-      RecSetSynRequired, the sync. message will send back to
-      traffic_manager. And traffic_manager founds out that, the
-      actual value of the config variable didn't changed.
-      At the end, the sync_required bit is not set and we will
-      never get notified and callbacks are never invoked.
-
-      The solution is to set the sync_required bit on the
-      manager side. See LocalManager::sendMgmtMsgToProcesses()
-      for details.
-    */
-    break;
-  case MGMT_EVENT_LIBRECORDS:
-    executeMgmtCallback(MGMT_EVENT_LIBRECORDS, payload);
-    break;
-  case MGMT_EVENT_STORAGE_DEVICE_CMD_OFFLINE:
-    executeMgmtCallback(MGMT_EVENT_STORAGE_DEVICE_CMD_OFFLINE, payload);
-    break;
-  case MGMT_EVENT_LIFECYCLE_MESSAGE:
-    executeMgmtCallback(MGMT_EVENT_LIFECYCLE_MESSAGE, payload);
-    break;
-  default:
-    Warning("received unknown message ID %d\n", mh->msg_id);
-    break;
-  }
-
-  ats_free(mh);
-}
diff --git a/mgmt/ProcessManager.h b/mgmt/ProcessManager.h
deleted file mode 100644
index 926d22904..000000000
--- a/mgmt/ProcessManager.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/** @file
-
-  Process Manager Class, derived from BaseManager. Class provides callback
-  registration for management events as well as the interface to the outside
-  world.
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-#pragma once
-
-#include <functional>
-#include <string_view>
-
-#include <ts/apidefs.h>
-
-#include "MgmtUtils.h"
-#include "BaseManager.h"
-#include "tscore/ink_sock.h"
-#include "tscore/ink_llqueue.h"
-#include "tscore/ink_apidefs.h"
-
-#if HAVE_EVENTFD
-#include <sys/eventfd.h>
-#endif
-
-class ConfigUpdateCbTable;
-
-class ProcessManager : public BaseManager
-{
-public:
-  ProcessManager(bool rlm);
-  ~ProcessManager();
-
-  // Start a thread for the process manager. If @a cb is set then it
-  // is called after the thread is started and before any messages are
-  // processed.
-  void start(std::function<TSThread()> const &cb_init        = std::function<TSThread()>(),
-             std::function<void(TSThread)> const &cb_destroy = std::function<void(TSThread)>());
-
-  // Stop the process manager, dropping any unprocessed messages.
-  void stop();
-
-  void signalConfigFileChild(const char *parent, const char *child);
-  void signalManager(int msg_id, const char *data_str);
-  void signalManager(int msg_id, const char *data_raw, int data_len);
-
-  /** Send a management message of type @a msg_id with @a text.
-   *
-   * @param msg_id ID for the message.
-   * @param text Content for the message.
-   *
-   * A terminating null character is added automatically.
-   */
-  void signalManager(int msg_id, std::string_view text);
-
-  void signalManager(MgmtMessageHdr *mh);
-
-  void reconfigure();
-  void initLMConnection();
-  void handleMgmtMsgFromLM(MgmtMessageHdr *mh);
-
-  void
-  registerPluginCallbacks(ConfigUpdateCbTable *_cbtable)
-  {
-    cbtable = _cbtable;
-  }
-
-private:
-  int pollLMConnection();
-  int processSignalQueue();
-  bool processEventQueue();
-
-  bool require_lm;
-  RecInt timeout;
-  LLQ *mgmt_signal_queue;
-  pid_t pid;
-
-  ink_thread poll_thread = ink_thread_null();
-  int running            = 0;
-
-  /// Thread initialization callback.
-  /// This allows @c traffic_server and @c traffic_manager to perform different initialization in the thread.
-  std::function<TSThread()> init;
-  std::function<void(TSThread)> destroy;
-  TSThread managerThread = nullptr;
-
-  int local_manager_sockfd;
-#if HAVE_EVENTFD
-  int wakeup_fd; // external trigger to stop polling
-#endif
-  ConfigUpdateCbTable *cbtable;
-  int max_msgs_in_a_row;
-
-  static const int MAX_MSGS_IN_A_ROW = 10000;
-  static void *processManagerThread(void *arg);
-};
-
-extern ProcessManager *pmgmt;
diff --git a/mgmt/ProxyConfig.h b/mgmt/ProxyConfig.h
index 493dec230..e55be7178 100644
--- a/mgmt/ProxyConfig.h
+++ b/mgmt/ProxyConfig.h
@@ -25,23 +25,10 @@
 
 #include <atomic>
 
-#include "ProcessManager.h"
 #include "I_Tasks.h"
 
 class ProxyMutex;
 
-//
-// Macros that spin waiting for the data to be bound
-//
-#define SignalManager(_n, _d) pmgmt->signalManager(_n, (char *)_d)
-#define SignalWarning(_n, _s) \
-  {                           \
-    Warning("%s", _s);        \
-    SignalManager(_n, _s);    \
-  }
-
-#define RegisterMgmtCallback(_signal, _fn, _data) pmgmt->registerMgmtCallback(_signal, _fn, _data)
-
 #define MAX_CONFIGS 100
 
 typedef RefCountObj ConfigInfo;
diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
index 73d6b519e..bb80a5745 100644
--- a/mgmt/RecordsConfig.cc
+++ b/mgmt/RecordsConfig.cc
@@ -53,12 +53,6 @@ static const RecordElement RecordsConfig[] =
   ,
   {RECT_CONFIG, "proxy.config.bin_path", RECD_STRING, TS_BUILD_BINDIR, RECU_NULL, RR_REQUIRED, RECC_NULL, nullptr, RECA_READ_ONLY}
   ,
-  {RECT_CONFIG, "proxy.config.proxy_binary", RECD_STRING, "traffic_server", RECU_NULL, RR_REQUIRED, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_CONFIG, "proxy.config.manager_binary", RECD_STRING, "traffic_manager", RECU_NULL, RR_REQUIRED, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_CONFIG, "proxy.config.proxy_binary_opts", RECD_STRING, "-M", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
   {RECT_CONFIG, "proxy.config.env_prep", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
   ,
   // Jira TS-21
@@ -246,22 +240,11 @@ static const RecordElement RecordsConfig[] =
 
   //##############################################################################
   //#
-  //# Local Manager
+  //# Management
   //#
   //##############################################################################
-  {RECT_CONFIG, "proxy.config.lm.pserver_timeout_secs", RECD_INT, "1", RECU_RESTART_TM, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_CONFIG, "proxy.config.lm.pserver_timeout_msecs", RECD_INT, "0", RECU_RESTART_TM, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_CONFIG, "proxy.config.admin.autoconf.localhost_only", RECD_INT, "1", RECU_RESTART_TM, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
-  ,
   {RECT_CONFIG, "proxy.config.admin.user_id", RECD_STRING, TS_PKGSYSUSER, RECU_NULL, RR_REQUIRED, RECC_NULL, nullptr, RECA_READ_ONLY}
   ,
-  {RECT_CONFIG, "proxy.config.admin.cli_path", RECD_STRING, "cli", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_CONFIG, "proxy.config.admin.api.restricted", RECD_INT, "0", RECU_RESTART_TM, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
-  ,
-
   //##############################################################################
   //#
   //# UDP configuration stuff: hidden variables
@@ -276,14 +259,6 @@ static const RecordElement RecordsConfig[] =
   {RECT_CONFIG, "proxy.config.udp.threads", RECD_INT, "0", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
   ,
 
-  //##############################################################################
-  //#
-  //# Process Manager
-  //#
-  //##############################################################################
-  {RECT_CONFIG, "proxy.config.process_manager.timeout", RECD_INT, "5", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-
   //##############################################################################
   //#
   //# Alarm Configuration
@@ -1284,8 +1259,6 @@ static const RecordElement RecordsConfig[] =
   //#
   //# Restart Stats
   //#
-  {RECT_NODE, "proxy.node.restarts.manager.start_time", RECD_INT, "0", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
   {RECT_NODE, "proxy.node.restarts.proxy.start_time", RECD_INT, "0", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
   ,
   {RECT_NODE, "proxy.node.restarts.proxy.cache_ready_time", RECD_INT, "0", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
@@ -1294,32 +1267,6 @@ static const RecordElement RecordsConfig[] =
   ,
   {RECT_NODE, "proxy.node.restarts.proxy.restart_count", RECD_INT, "0", RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
   ,
-  //#
-  //# Manager Version Info
-  //#
-  {RECT_NODE, "proxy.node.version.manager.short", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_NODE, "proxy.node.version.manager.long", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_NODE, "proxy.node.version.manager.build_number", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_NODE, "proxy.node.version.manager.build_time", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_NODE, "proxy.node.version.manager.build_date", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_NODE, "proxy.node.version.manager.build_machine", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_NODE, "proxy.node.version.manager.build_person", RECD_STRING, nullptr, RECU_NULL, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  //# manager: backoff configuration.
-  {RECT_CONFIG, "proxy.node.config.manager_exponential_sleep_ceiling", RECD_INT, "60", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  {RECT_CONFIG, "proxy.node.config.manager_retry_cap", RECD_INT, "5", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
-  ,
-  //# manager: log filename
-  {RECT_CONFIG, "proxy.node.config.manager_log_filename", RECD_STRING, "manager.log", RECU_DYNAMIC, RR_NULL, RECC_STR, "^[^[:space:]]+$", RECA_NULL}
-  ,
-
   //#
   //# SSL parent proxying info
   //#
diff --git a/mgmt/WebMgmtUtils.cc b/mgmt/WebMgmtUtils.cc
index da3458c65..b587ab6dc 100644
--- a/mgmt/WebMgmtUtils.cc
+++ b/mgmt/WebMgmtUtils.cc
@@ -28,76 +28,6 @@
 #include "WebMgmtUtils.h"
 #include "tscore/Regex.h"
 
-// bool varSetFromStr(const char*, const char* )
-//
-// Sets the named local manager variable from the value string
-// passed in.  Does the appropriate type conversion on
-// value string to get it to the type of the local manager
-// variable
-//
-//  returns true if the variable was successfully set
-//   and false otherwise
-//
-bool
-varSetFromStr(const char *varName, const char *value)
-{
-  RecDataT varDataType = RECD_NULL;
-  bool found           = true;
-  int err              = REC_ERR_FAIL;
-  RecData data;
-
-  memset(&data, 0, sizeof(RecData));
-
-  err = RecGetRecordDataType(const_cast<char *>(varName), &varDataType);
-  if (err != REC_ERR_OKAY) {
-    return found;
-  }
-  // Use any empty string if we get a NULL so
-  //  sprintf does puke.  However, we need to
-  //  switch this back to NULL for STRING types
-  if (value == nullptr) {
-    value = "";
-  }
-
-  switch (varDataType) {
-  case RECD_INT:
-    if (sscanf(value, "%" PRId64 "", &data.rec_int) == 1) {
-      RecSetRecordInt(const_cast<char *>(varName), data.rec_int, REC_SOURCE_EXPLICIT);
-    } else {
-      found = false;
-    }
-    break;
-  case RECD_COUNTER:
-    if (sscanf(value, "%" PRId64 "", &data.rec_counter) == 1) {
-      RecSetRecordCounter(const_cast<char *>(varName), data.rec_counter, REC_SOURCE_EXPLICIT);
-    } else {
-      found = false;
-    }
-    break;
-  case RECD_FLOAT:
-    // coverity[secure_coding]
-    if (sscanf(value, "%f", &data.rec_float) == 1) {
-      RecSetRecordFloat(const_cast<char *>(varName), data.rec_float, REC_SOURCE_EXPLICIT);
-    } else {
-      found = false;
-    }
-    break;
-  case RECD_STRING:
-    if (*value == '\0') {
-      RecSetRecordString(const_cast<char *>(varName), nullptr, REC_SOURCE_EXPLICIT);
-    } else {
-      RecSetRecordString(const_cast<char *>(varName), const_cast<char *>(value), REC_SOURCE_EXPLICIT);
-    }
-    break;
-  case RECD_NULL:
-  default:
-    found = false;
-    break;
-  }
-
-  return found;
-}
-
 // bool varSetFloat(const char* varName, RecFloat value)
 //
 //  Sets the variable specified by varName to value.  varName
@@ -292,154 +222,6 @@ varDataFromName(RecDataT varType, const char *varName, RecData *value)
   return (err == REC_ERR_OKAY);
 }
 
-// bool varCounterFromName (const char*, RecFloat* )
-//
-//   Sets the *value to value of the varName.
-//
-//  return true if bufVal was successfully set
-//    and false otherwise
-//
-bool
-varCounterFromName(const char *varName, RecCounter *value)
-{
-  RecDataT varDataType = RECD_NULL;
-  bool found           = true;
-  int err              = REC_ERR_FAIL;
-
-  err = RecGetRecordDataType(const_cast<char *>(varName), &varDataType);
-
-  if (err == REC_ERR_FAIL) {
-    return false;
-  }
-
-  switch (varDataType) {
-  case RECD_INT: {
-    RecInt tempInt = 0;
-    RecGetRecordInt(const_cast<char *>(varName), &tempInt);
-    *value = static_cast<RecCounter>(tempInt);
-    break;
-  }
-  case RECD_COUNTER: {
-    *value = 0;
-    RecGetRecordCounter(const_cast<char *>(varName), value);
-    break;
-  }
-  case RECD_FLOAT: {
-    RecFloat tempFloat = 0.0;
-    RecGetRecordFloat(const_cast<char *>(varName), &tempFloat);
-    *value = static_cast<RecCounter>(tempFloat);
-    break;
-  }
-  case RECD_STRING:
-  case RECD_NULL:
-  default:
-    *value = -1;
-    found  = false;
-    break;
-  }
-
-  return found;
-}
-
-// bool varFloatFromName (const char*, RecFloat* )
-//
-//   Sets the *value to value of the varName.
-//
-//  return true if bufVal was successfully set
-//    and false otherwise
-//
-bool
-varFloatFromName(const char *varName, RecFloat *value)
-{
-  RecDataT varDataType = RECD_NULL;
-  bool found           = true;
-
-  int err = REC_ERR_FAIL;
-
-  err = RecGetRecordDataType(const_cast<char *>(varName), &varDataType);
-
-  if (err == REC_ERR_FAIL) {
-    return false;
-  }
-
-  switch (varDataType) {
-  case RECD_INT: {
-    RecInt tempInt = 0;
-    RecGetRecordInt(const_cast<char *>(varName), &tempInt);
-    *value = static_cast<RecFloat>(tempInt);
-    break;
-  }
-  case RECD_COUNTER: {
-    RecCounter tempCounter = 0;
-    RecGetRecordCounter(const_cast<char *>(varName), &tempCounter);
-    *value = static_cast<RecFloat>(tempCounter);
-    break;
-  }
-  case RECD_FLOAT: {
-    *value = 0.0;
-    RecGetRecordFloat(const_cast<char *>(varName), value);
-    break;
-  }
-  case RECD_STRING:
-  case RECD_NULL:
-  default:
-    *value = -1.0;
-    found  = false;
-    break;
-  }
-
-  return found;
-}
-
-// bool varIntFromName (const char*, RecInt* )
-//
-//   Sets the *value to value of the varName.
-//
-//  return true if bufVal was successfully set
-//    and false otherwise
-//
-bool
-varIntFromName(const char *varName, RecInt *value)
-{
-  RecDataT varDataType = RECD_NULL;
-  bool found           = true;
-  int err              = REC_ERR_FAIL;
-
-  err = RecGetRecordDataType(const_cast<char *>(varName), &varDataType);
-
-  if (err != REC_ERR_OKAY) {
-    return false;
-  }
-
-  switch (varDataType) {
-  case RECD_INT: {
-    *value = 0;
-    RecGetRecordInt(const_cast<char *>(varName), value);
-    break;
-  }
-  case RECD_COUNTER: {
-    RecCounter tempCounter = 0;
-    RecGetRecordCounter(const_cast<char *>(varName), &tempCounter);
-    *value = static_cast<RecInt>(tempCounter);
-    break;
-  }
-  case RECD_FLOAT: {
-    RecFloat tempFloat = 0.0;
-    RecGetRecordFloat(const_cast<char *>(varName), &tempFloat);
-    *value = static_cast<RecInt>(tempFloat);
-    break;
-  }
-  case RECD_STRING:
-  case RECD_NULL:
-  default:
-    *value = -1;
-    found  = false;
-    break;
-  }
-
-  return found;
-}
-
 // void percentStrFromFloat(MgmtFloat, char* bufVal)
 //
 //  Converts a float to a percent string
@@ -543,252 +325,6 @@ bytesFromInt(RecInt bytes, char *bufVal)
   }
 }
 
-// bool varStrFromName (const char*, char*, int)
-//
-//   Sets the bufVal string to the value of the local manager
-//     named by varName.  bufLen is size of bufVal
-//
-//  return true if bufVal was successfully set
-//    and false otherwise
-//
-//  EVIL ALERT: overviewRecord::varStrFromName is extremely
-//    similar to this function except in how it gets it's
-//    data.  Changes to this function must be propagated
-//    to its twin.  Cut and Paste sucks but there is not
-//    an easy way to merge the functions
-//
-bool
-varStrFromName(const char *varNameConst, char *bufVal, int bufLen)
-{
-  char *varName        = nullptr;
-  RecDataT varDataType = RECD_NULL;
-  bool found           = true;
-  int varNameLen       = 0;
-  char formatOption    = '\0';
-  RecData data;
-  int err = REC_ERR_FAIL;
-
-  memset(&data, 0, sizeof(RecData));
-
-  // Check to see if there is a \ option on the end of variable
-  //   \ options indicate that we need special formatting
-  //   of the results.  Supported \ options are
-  //
-  ///  b - bytes.  Ints and Counts only.  Amounts are
-  //       transformed into one of GB, MB, KB, or B
-  //
-  varName    = ats_strdup(varNameConst);
-  varNameLen = strlen(varName);
-  if (varNameLen > 3 && varName[varNameLen - 2] == '\\') {
-    formatOption = varName[varNameLen - 1];
-
-    // Now that we know the format option, terminate the string
-    //   to make the option disappear
-    varName[varNameLen - 2] = '\0';
-
-    // Return not found for unknown format options
-    if (formatOption != 'b' && formatOption != 'm' && formatOption != 'c' && formatOption != 'p') {
-      ats_free(varName);
-      return false;
-    }
-  }
-
-  err = RecGetRecordDataType(varName, &varDataType);
-  if (err == REC_ERR_FAIL) {
-    ats_free(varName);
-    return false;
-  }
-
-  switch (varDataType) {
-  case RECD_INT:
-    RecGetRecordInt(varName, &data.rec_int);
-    if (formatOption == 'b') {
-      bytesFromInt(data.rec_int, bufVal);
-    } else if (formatOption == 'm') {
-      MbytesFromInt(data.rec_int, bufVal);
-    } else if (formatOption == 'c') {
-      commaStrFromInt(data.rec_int, bufVal);
-    } else {
-      snprintf(bufVal, bufLen, "%" PRId64 "", data.rec_int);
-    }
-    break;
-
-  case RECD_COUNTER:
-    RecGetRecordCounter(varName, &data.rec_counter);
-    if (formatOption == 'b') {
-      bytesFromInt(static_cast<MgmtInt>(data.rec_counter), bufVal);
-    } else if (formatOption == 'm') {
-      MbytesFromInt(static_cast<MgmtInt>(data.rec_counter), bufVal);
-    } else if (formatOption == 'c') {
-      commaStrFromInt(data.rec_counter, bufVal);
-    } else {
-      snprintf(bufVal, bufLen, "%" PRId64 "", data.rec_counter);
-    }
-    break;
-  case RECD_FLOAT:
-    RecGetRecordFloat(varName, &data.rec_float);
-    if (formatOption == 'p') {
-      percentStrFromFloat(data.rec_float, bufVal);
-    } else {
-      snprintf(bufVal, bufLen, "%.2f", data.rec_float);
-    }
-    break;
-  case RECD_STRING:
-    RecGetRecordString_Xmalloc(varName, &data.rec_string);
-    if (data.rec_string == nullptr) {
-      bufVal[0] = '\0';
-    } else if (strlen(data.rec_string) < static_cast<size_t>(bufLen - 1)) {
-      ink_strlcpy(bufVal, data.rec_string, bufLen);
-    } else {
-      ink_strlcpy(bufVal, data.rec_string, bufLen);
-    }
-    ats_free(data.rec_string);
-    break;
-  default:
-    found = false;
-    break;
-  }
-
-  ats_free(varName);
-  return found;
-}
-
-// bool MgmtData::setFromName(const char*)
-//
-//    Fills in class variables from the given
-//      variable name
-//
-//    Returns true if the information could be set
-//     and false otherwise
-//
-bool
-MgmtData::setFromName(const char *varName)
-{
-  bool found = true;
-  int err;
-
-  err = RecGetRecordDataType(const_cast<char *>(varName), &this->type);
-
-  if (err == REC_ERR_FAIL) {
-    return found;
-  }
-
-  switch (this->type) {
-  case RECD_INT:
-    RecGetRecordInt(const_cast<char *>(varName), &this->data.rec_int);
-    break;
-  case RECD_COUNTER:
-    RecGetRecordCounter(const_cast<char *>(varName), &this->data.rec_counter);
-    break;
-  case RECD_FLOAT:
-    RecGetRecordFloat(const_cast<char *>(varName), &this->data.rec_float);
-    break;
-  case RECD_STRING:
-    RecGetRecordString_Xmalloc(const_cast<char *>(varName), &this->data.rec_string);
-    break;
-  case RECD_NULL:
-  default:
-    found = false;
-    break;
-  }
-
-  return found;
-}
-
-MgmtData::MgmtData()
-{
-  type = RECD_NULL;
-  memset(&data, 0, sizeof(RecData));
-}
-
-MgmtData::~MgmtData()
-{
-  if (type == RECD_STRING) {
-    ats_free(data.rec_string);
-  }
-}
-
-// MgmtData::compareFromString(const char* str, strLen)
-//
-//  Compares the value of string converted to
-//    data type of this_>type with value
-//    held in this->data
-//
-bool
-MgmtData::compareFromString(const char *str)
-{
-  RecData compData;
-  bool compare = false;
-  float floatDiff;
-
-  switch (this->type) {
-  case RECD_INT:
-    // TODO: Add SI decimal multipliers rule ?
-    if (str && recordRegexCheck("^[0-9]+$", str)) {
-      compData.rec_int = ink_atoi64(str);
-      if (data.rec_int == compData.rec_int) {
-        compare = true;
-      }
-    }
-    break;
-  case RECD_COUNTER:
-    if (str && recordRegexCheck("^[0-9]+$", str)) {
-      compData.rec_counter = ink_atoi64(str);
-      if (data.rec_counter == compData.rec_counter) {
-        compare = true;
-      }
-    }
-    break;
-  case RECD_FLOAT:
-    compData.rec_float = atof(str);
-    // HACK - There are some rounding problems with
-    //   floating point numbers so say we have a match if there difference
-    //   is small
-    floatDiff = data.rec_float - compData.rec_float;
-    if (floatDiff > -0.001 && floatDiff < 0.001) {
-      compare = true;
-    }
-    break;
-  case RECD_STRING:
-    if (str == nullptr || *str == '\0') {
-      if (data.rec_string == nullptr) {
-        compare = true;
-      }
-    } else {
-      if ((data.rec_string != nullptr) && (strcmp(str, data.rec_string) == 0)) {
-        compare = true;
-      }
-    }
-    break;
-  case RECD_NULL:
-  default:
-    compare = false;
-    break;
-  }
-
-  return compare;
-}
-
-// void RecDataT varType(const char* varName)
-//
-//   Simply return the variable type
-//
-RecDataT
-varType(const char *varName)
-{
-  RecDataT data_type;
-  int err;
-
-  err = RecGetRecordDataType(const_cast<char *>(varName), &data_type);
-
-  if (err == REC_ERR_FAIL) {
-    return RECD_NULL;
-  }
-
-  Debug("RecOp", "[varType] %s is of type %d", varName, data_type);
-  return data_type;
-}
-
 //
 // Removes any cr/lf line breaks from the text data
 //
@@ -899,209 +435,3 @@ substituteForHTMLChars(const char *buffer)
   *safeCurrent = '\0';
   return safeBuf;
 }
-
-//
-//
-//  Sets the LocalManager variable:  proxy.node.hostname
-//
-//    To the fully qualified hostname for the machine
-//       that we are running on
-int
-setHostnameVar()
-{
-  char ourHostName[MAXDNAME];
-  char *firstDot;
-
-  // Get Our HostName
-  if (gethostname(ourHostName, MAXDNAME) < 0) {
-    mgmt_fatal(errno, "[setHostnameVar] Can not determine our hostname");
-  }
-
-  res_init();
-  appendDefaultDomain(ourHostName, MAXDNAME);
-
-  // FQ is a Fully Qualified hostname (ie: proxydev.example.com)
-  varSetFromStr("proxy.node.hostname_FQ", ourHostName);
-
-  // non-FQ is just the hostname (ie: proxydev)
-  firstDot = strchr(ourHostName, '.');
-  if (firstDot != nullptr) {
-    *firstDot = '\0';
-  }
-  varSetFromStr("proxy.node.hostname", ourHostName);
-
-  return 0;
-}
-
-// void appendDefaultDomain(char* hostname, int bufLength)
-//
-//   Appends the pasted in hostname with the default
-//     domain if the hostname is an unqualified name
-//
-//   The default domain is obtained from the resolver libraries
-//    data structure
-//
-//   Truncates the domain name if bufLength is too small
-//
-//
-void
-appendDefaultDomain(char *hostname, int bufLength)
-{
-  int len                 = strlen(hostname);
-  const char msg[]        = "Nodes will be know by their unqualified host name";
-  static int error_before = 0; // Race ok since effect is multiple error msg
-
-  ink_assert(len < bufLength);
-  ink_assert(bufLength >= 64);
-
-  // Ensure null termination of the result string
-  hostname[bufLength - 1] = '\0';
-
-  if (strchr(hostname, '.') == nullptr) {
-    if (_res.defdname[0] != '\0') {
-      if (bufLength - 2 >= static_cast<int>(strlen(hostname) + strlen(_res.defdname))) {
-        ink_strlcat(hostname, ".", bufLength);
-        ink_strlcat(hostname, _res.defdname, bufLength);
-      } else {
-        if (error_before == 0) {
-          mgmt_log("%s %s\n", "[appendDefaultDomain] Domain name is too long.", msg);
-          error_before++;
-        }
-      }
-    } else {
-      if (error_before == 0) {
-        mgmt_log("%s %s\n", "[appendDefaultDomain] Unable to determine default domain name.", msg);
-        error_before++;
-      }
-    }
-  }
-}
-
-bool
-recordValidityCheck(const char *varName, const char *value)
-{
-  RecCheckT check_t;
-  char *pattern;
-
-  if (RecGetRecordCheckType(const_cast<char *>(varName), &check_t) != REC_ERR_OKAY) {
-    return false;
-  }
-  if (RecGetRecordCheckExpr(const_cast<char *>(varName), &pattern) != REC_ERR_OKAY) {
-    return false;
-  }
-
-  switch (check_t) {
-  case RECC_STR:
-    if (recordRegexCheck(pattern, value)) {
-      return true;
-    }
-    break;
-  case RECC_INT:
-    if (recordRangeCheck(pattern, value)) {
-      return true;
-    }
-    break;
-  case RECC_IP:
-    if (recordIPCheck(pattern, value)) {
-      return true;
-    }
-    break;
-  case RECC_NULL:
-    // skip checking
-    return true;
-  default:
-    // unknown RecordCheckType...
-    mgmt_log("[WebMgmtUtil] error, unknown RecordCheckType for record %s\n", varName);
-  }
-
-  return false;
-}
-
-bool
-recordRegexCheck(const char *pattern, const char *value)
-{
-  pcre *regex;
-  const char *error;
-  int erroffset;
-
-  regex = pcre_compile(pattern, 0, &error, &erroffset, nullptr);
-  if (!regex) {
-    return false;
-  } else {
-    int r = pcre_exec(regex, nullptr, value, strlen(value), 0, 0, nullptr, 0);
-
-    pcre_free(regex);
-    return (r != -1) ? true : false;
-  }
-
-  return false; // no-op
-}
-
-bool
-recordRangeCheck(const char *pattern, const char *value)
-{
-  char *p = const_cast<char *>(pattern);
-  Tokenizer dashTok("-");
-
-  if (recordRegexCheck("^[0-9]+$", value)) {
-    while (*p != '[') {
-      p++;
-    } // skip to '['
-    if (dashTok.Initialize(++p, COPY_TOKS) == 2) {
-      int l_limit = atoi(dashTok[0]);
-      int u_limit = atoi(dashTok[1]);
-      int val     = atoi(value);
-      if (val >= l_limit && val <= u_limit) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-bool
-recordIPCheck(const char *pattern, const char *value)
-{
-  //  regex_t regex;
-  //  int result;
-  bool check;
-  const char *range_pattern = R"(\[[0-9]+\-[0-9]+\]\\\.\[[0-9]+\-[0-9]+\]\\\.\[[0-9]+\-[0-9]+\]\\\.\[[0-9]+\-[0-9]+\])";
-  const char *ip_pattern    = "[0-9]*[0-9]*[0-9].[0-9]*[0-9]*[0-9].[0-9]*[0-9]*[0-9].[0-9]*[0-9]*[0-9]";
-
-  Tokenizer dotTok1(".");
-  Tokenizer dotTok2(".");
-
-  check = true;
-  if (recordRegexCheck(range_pattern, pattern) && recordRegexCheck(ip_pattern, value)) {
-    if (dotTok1.Initialize(const_cast<char *>(pattern), COPY_TOKS) == 4 &&
-        dotTok2.Initialize(const_cast<char *>(value), COPY_TOKS) == 4) {
-      for (int i = 0; i < 4 && check; i++) {
-        if (!recordRangeCheck(dotTok1[i], dotTok2[i])) {
-          check = false;
-        }
-      }
-      if (check) {
-        return true;
-      }
-    }
-  } else if (strcmp(value, "") == 0) {
-    return true;
-  }
-  return false;
-}
-
-bool
-recordRestartCheck(const char *varName)
-{
-  RecUpdateT update_t;
-
-  if (RecGetRecordUpdateType(const_cast<char *>(varName), &update_t) != REC_ERR_OKAY) {
-    return false;
-  }
-
-  if (update_t == RECU_RESTART_TS || update_t == RECU_RESTART_TM) {
-    return true;
-  }
-
-  return false;
-}
diff --git a/mgmt/WebMgmtUtils.h b/mgmt/WebMgmtUtils.h
index 26cb01d91..ce7630381 100644
--- a/mgmt/WebMgmtUtils.h
+++ b/mgmt/WebMgmtUtils.h
@@ -26,20 +26,6 @@
 #include "MgmtDefs.h"
 #include "records/P_RecCore.h"
 
-// class MgmtData - stores information from local manager
-//    variables in its native type
-//
-class MgmtData
-{
-public:
-  MgmtData();
-  ~MgmtData();
-  bool compareFromString(const char *str);
-  bool setFromName(const char *varName);
-  RecDataT type;
-  RecData data;
-};
-
 // Convert to byte units (GB, MB, KB)
 void bytesFromInt(RecInt bytes, char *bufVal);
 
@@ -52,14 +38,7 @@ void commaStrFromInt(RecInt bytes, char *bufVal);
 // Create percent string from float
 void percentStrFromFloat(RecFloat val, char *bufVal);
 
-// All types converted to/from strings where appropriate
-bool varStrFromName(const char *varName, char *bufVal, int bufLen);
-bool varSetFromStr(const char *varName, const char *value);
-
 // Converts where applicable to specified type
-bool varIntFromName(const char *varName, RecInt *value);
-bool varFloatFromName(const char *varName, RecFloat *value);
-bool varCounterFromName(const char *varName, RecCounter *value);
 bool varDataFromName(RecDataT varType, const char *varName, RecData *value);
 
 // No conversion done.  varName must represent a value of the appropriate
@@ -70,18 +49,6 @@ bool varSetCounter(const char *varName, RecCounter value, bool convert = false);
 bool varSetFloat(const char *varName, RecFloat value, bool convert = false);
 bool varSetData(RecDataT varType, const char *varName, RecData value);
 
-// Return the type of the variable named
-RecDataT varType(const char *varName);
-
 int convertHtmlToUnix(char *buffer);
 int substituteUnsafeChars(char *buffer);
 char *substituteForHTMLChars(const char *buffer);
-
-int setHostnameVar();
-void appendDefaultDomain(char *hostname, int bufLength);
-
-bool recordValidityCheck(const char *varName, const char *value);
-bool recordRegexCheck(const char *pattern, const char *value);
-bool recordRangeCheck(const char *pattern, const char *value);
-bool recordIPCheck(const char *pattern, const char *value);
-bool recordRestartCheck(const char *varName);
diff --git a/mgmt/api/APITestCliRemote.cc b/mgmt/api/APITestCliRemote.cc
deleted file mode 100644
index 8778b2028..000000000
--- a/mgmt/api/APITestCliRemote.cc
+++ /dev/null
@@ -1,1026 +0,0 @@
-/** @file
-
-  A brief file description
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-/*****************************************************************************
- * Filename: APITestCliRemote.cc
- * Purpose: An interactive cli to test remote mgmt API; UNIT TEST for mgmtAPI
- * Created: lant
- *
- ***************************************************************************/
-
-/***************************************************************************
- * Possible Commands:
- ***************************************************************************
- * Control Operations:
- * -------------------
- * state:   returns ON (proxy is on) or OFF (proxy is off)
- * start:<tsArgs>  -   turns Proxy on, the tsArgs is optional;
- *                     it can either be  "hostdb" or "all",
- *                 eg. start, start:hostdb, start:all
- * stop:    turns Proxy off
- * restart: restarts Traffic Manager (Traffic Cop must be running)
- *
- * File operations:
- * ---------------
- * read_file:  reads hosting.config file
- * proxy.config.xxx (a records.config variable): returns value of that record
- * records: tests get/set/get a record of each different type
- *          (int, float, counter, string)
- * err_recs: stress test record get/set functions by purposely entering
- *              invalid record names and/or values
- * get_mlt: tests TSRecordGetMlt
- * set_mlt: tests TSRecordSetMlt
- *
- * read_url: tests TSReadFromUrl works by retrieving two valid urls
- * test_url: tests robustness of TSReadFromUrl using invalid urls
- *
- * Event Operations:
- * ----------------
- * active_events: lists the names of all currently active events
- * MGMT_ALARM_xxx (event_name specified in CoreAPIShared.h or Alarms.h):
- *                 resolves the specified event
- * register: registers a generic callback (=eventCallbackFn) which
- *           prints out the event name whenever an event is signalled
- * unregister: unregisters the generic callback function eventCallbackFn
- *
- * Diags
- * ----
- * diags - uses STATUS, NOTE, FATAL, ERROR diags
- *
- * Statistics
- * ----------
- * set_stats - sets dummy values for selected group of NODE, PROCESS
- *             records
- * print_stats - prints the values for the same selected group of records
- * reset_stats - resets all statistics to default values
- */
-
-#include "tscore/ink_config.h"
-#include "tscore/ink_defs.h"
-#include "tscore/ink_memory.h"
-#include <cstdlib>
-#include <cstring>
-#include <cstdio>
-#include <strings.h>
-#include "tscore/ink_string.h"
-
-#include "mgmtapi.h"
-
-// refer to test_records() function
-#define TEST_STRING 1
-#define TEST_FLOAT 1
-#define TEST_INT 1
-#define TEST_COUNTER 1
-#define TEST_REC_SET 1
-#define TEST_REC_GET 0
-#define TEST_REC_GET_2 0
-
-#define SET_INT 0
-
-/***************************************************************************
- * Printing Helper Functions
- ***************************************************************************/
-
-/* ------------------------------------------------------------------------
- * print_err
- * ------------------------------------------------------------------------
- * used to print the error description associated with the TSMgmtError err
- */
-void
-print_err(const char *module, TSMgmtError err)
-{
-  char *err_msg;
-
-  err_msg = TSGetErrorMessage(err);
-  printf("(%s) ERROR: %s\n", module, err_msg);
-
-  if (err_msg) {
-    TSfree(err_msg);
-  }
-}
-
-/*-------------------------------------------------------------
- * print_string_list
- *-------------------------------------------------------------*/
-void
-print_string_list(TSStringList list)
-{
-  int i, count, buf_pos = 0;
-  char buf[1000];
-
-  if (!list) {
-    return;
-  }
-  count = TSStringListLen(list);
-  for (i = 0; i < count; i++) {
-    char *str = TSStringListDequeue(list);
-    snprintf(buf + buf_pos, sizeof(buf) - buf_pos, "%s,", str);
-    buf_pos = strlen(buf);
-    TSStringListEnqueue(list, str);
-  }
-  printf("%s \n", buf);
-}
-
-/*-------------------------------------------------------------
- * print_int_list
- *-------------------------------------------------------------*/
-void
-print_int_list(TSIntList list)
-{
-  int i, count, buf_pos = 0;
-  char buf[1000];
-
-  count = TSIntListLen(list);
-  for (i = 0; i < count; i++) {
-    int *elem = TSIntListDequeue(list);
-    snprintf(buf + buf_pos, sizeof(buf) - buf_pos, "%d:", *elem);
-    buf_pos = strlen(buf);
-    TSIntListEnqueue(list, elem);
-  }
-  printf("Int List: %s \n", buf);
-}
-
-/***************************************************************************
- * Control Testing
- ***************************************************************************/
-void
-print_proxy_state()
-{
-  TSProxyStateT state = TSProxyStateGet();
-
-  switch (state) {
-  case TS_PROXY_ON:
-    printf("Proxy State = ON\n");
-    break;
-  case TS_PROXY_OFF:
-    printf("Proxy State = OFF\n");
-    break;
-  default:
-    printf("ERROR: Proxy State Undefined!\n");
-    break;
-  }
-}
-
-// starts Traffic Server (turns proxy on)
-void
-start_TS(char *tsArgs)
-{
-  TSMgmtError ret;
-  TSCacheClearT clear = TS_CACHE_CLEAR_NONE;
-  char *args;
-
-  strtok(tsArgs, ":");
-  args = strtok(nullptr, ":");
-  if (args) {
-    if (strcmp(args, "all\n") == 0) {
-      clear = TS_CACHE_CLEAR_CACHE;
-    } else if (strcmp(args, "hostdb\n") == 0) {
-      clear = TS_CACHE_CLEAR_HOSTDB;
-    }
-  } else {
-    clear = TS_CACHE_CLEAR_NONE;
-  }
-
-  printf("STARTING PROXY with cache: %d\n", clear);
-  if ((ret = TSProxyStateSet(TS_PROXY_ON, clear)) != TS_ERR_OKAY) {
-    printf("[TSProxyStateSet] turn on FAILED\n");
-  }
-  print_err("start_TS", ret);
-}
-
-// stops Traffic Server (turns proxy off)
-void
-stop_TS()
-{
-  TSMgmtError ret;
-
-  printf("STOPPING PROXY\n");
-  if ((ret = TSProxyStateSet(TS_PROXY_OFF, TS_CACHE_CLEAR_NONE)) != TS_ERR_OKAY) {
-    printf("[TSProxyStateSet] turn off FAILED\n");
-  }
-  print_err("stop_TS", ret);
-}
-
-// restarts Traffic Manager (Traffic Cop must be running)
-void
-restart()
-{
-  TSMgmtError ret;
-
-  printf("RESTART\n");
-  if ((ret = TSRestart(true)) != TS_ERR_OKAY) {
-    printf("[TSRestart] FAILED\n");
-  }
-
-  print_err("restart", ret);
-}
-
-// rereads all the configuration files
-void
-reconfigure()
-{
-  TSMgmtError ret;
-
-  printf("RECONFIGURE\n");
-  if ((ret = TSReconfigure()) != TS_ERR_OKAY) {
-    printf("[TSReconfigure] FAILED\n");
-  }
-
-  print_err("reconfigure", ret);
-}
-
-/* ------------------------------------------------------------------------
- * test_action_need
- * ------------------------------------------------------------------------
- * tests if correct action need is returned when requested record is set
- */
-void
-test_action_need()
-{
-  TSActionNeedT action;
-
-  // RU_NULL record
-  TSRecordSetString("proxy.config.proxy_name", "proxy_dorky", &action);
-  printf("[TSRecordSetString] proxy.config.proxy_name \n\tAction Should: [%d]\n\tAction is    : [%d]\n", TS_ACTION_UNDEFINED,
-         action);
-}
-
-/* Bouncer the traffic_server process(es) */
-void
-bounce()
-{
-  TSMgmtError ret;
-
-  printf("BOUNCER\n");
-  if ((ret = TSBounce(true)) != TS_ERR_OKAY) {
-    printf("[TSBounce] FAILED\n");
-  }
-
-  print_err("bounce", ret);
-}
-
-/***************************************************************************
- * Record Testing
- ***************************************************************************/
-
-/* ------------------------------------------------------------------------
- * test_error_records
- * ------------------------------------------------------------------------
- * stress test error handling by purposely being dumb; send requests to
- * get invalid record names
- */
-void
-test_error_records()
-{
-  TSInt port1, new_port = 8080;
-  TSActionNeedT action;
-  TSMgmtError ret;
-  TSCounter ctr1;
-
-  printf("\n");
-  // test get integer
-  fprintf(stderr, "Test invalid record names\n");
-
-  ret = TSRecordGetInt("proy.config.cop.core_signal", &port1);
-  if (ret != TS_ERR_OKAY) {
-    print_err("TSRecordGetInt", ret);
-  } else {
-    printf("[TSRecordGetInt] proxy.config.cop.core_signal=%" PRId64 " \n", port1);
-  }
-
-  // test set integer
-  ret = TSRecordSetInt("proy.config.cop.core_signal", new_port, &action);
-  print_err("TSRecordSetInt", ret);
-
-  printf("\n");
-  if (TSRecordGetCounter("proxy.press.socks.connections_successful", &ctr1) != TS_ERR_OKAY) {
-    printf("TSRecordGetCounter FAILED!\n");
-  } else {
-    printf("[TSRecordGetCounter]proxy.process.socks.connections_successful=%" PRId64 " \n", ctr1);
-  }
-}
-
-/* ------------------------------------------------------------------------
- * test_records
- * ------------------------------------------------------------------------
- * stress test record functionality by getting and setting different
- * records types; use the #defines defined above to determine which
- * type of tests you'd like turned on/off
- */
-void
-test_records()
-{
-  TSActionNeedT action;
-  char *rec_value;
-  char new_str[] = "new_record_value";
-  TSInt port1, port2, new_port  = 52432;
-  TSCounter ctr1, ctr2, new_ctr = 6666;
-  TSMgmtError err;
-
-  /********************* START TEST SECTION *****************/
-  printf("\n\n");
-
-#if SET_INT
-  // test set integer
-  if (TSRecordSetInt("proxy.config.cop.core_signal", new_port, &action) != TS_ERR_OKAY)
-    printf("TSRecordSetInt FAILED!\n");
-  else
-    printf("[TSRecordSetInt] proxy.config.cop.core_signal=%" PRId64 " \n", new_port);
-#endif
-
-#if TEST_REC_GET
-  TSRecordEle *rec_ele;
-  // retrieve a string value record using generic RecordGet
-  rec_ele = TSRecordEleCreate();
-  if (TSRecordGet("proxy.config.http.cache.vary_default_other", rec_ele) != TS_ERR_OKAY)
-    printf("TSRecordGet FAILED!\n");
-  else
-    printf("[TSRecordGet] proxy.config.http.cache.vary_default_other=%s\n", rec_ele->string_val);
-
-  TSRecordEleDestroy(rec_ele);
-  printf("\n\n");
-#endif
-
-#if TEST_REC_GET_2
-  // retrieve a string value record using generic RecordGet
-  rec_ele = TSRecordEleCreate();
-  if (TSRecordGet("proxy.config.proxy_name", rec_ele) != TS_ERR_OKAY)
-    printf("TSRecordGet FAILED!\n");
-  else
-    printf("[TSRecordGet] proxy.config.proxy_name=%s\n", rec_ele->string_val);
-
-  TSRecordEleDestroy(rec_ele);
-  printf("\n\n");
-#endif
-
-#if TEST_STRING
-  // retrieve an string value record using GetString
-  err = TSRecordGetString("proxy.config.proxy_name", &rec_value);
-  if (err != TS_ERR_OKAY) {
-    print_err("TSRecordGetString", err);
-  } else {
-    printf("[TSRecordGetString] proxy.config.proxy_name=%s\n", rec_value);
-  }
-  TSfree(rec_value);
-  rec_value = nullptr;
-
-  // test RecordSet
-  err = TSRecordSetString("proxy.config.proxy_name", (TSString)new_str, &action);
-  if (err != TS_ERR_OKAY) {
-    print_err("TSRecordSetString", err);
-  } else {
-    printf("[TSRecordSetString] proxy.config.proxy_name=%s\n", new_str);
-  }
-
-  // get
-  err = TSRecordGetString("proxy.config.proxy_name", &rec_value);
-  if (err != TS_ERR_OKAY) {
-    print_err("TSRecordGetString", err);
-  } else {
-    printf("[TSRecordGetString] proxy.config.proxy_name=%s\n", rec_value);
-  }
-  printf("\n");
-  TSfree(rec_value);
-#endif
-
-#if TEST_INT
-  printf("\n");
-  // test get integer
-  if (TSRecordGetInt("proxy.config.cop.core_signal", &port1) != TS_ERR_OKAY) {
-    printf("TSRecordGetInt FAILED!\n");
-  } else {
-    printf("[TSRecordGetInt] proxy.config.cop.core_signal=%" PRId64 " \n", port1);
-  }
-
-  // test set integer
-  if (TSRecordSetInt("proxy.config.cop.core_signal", new_port, &action) != TS_ERR_OKAY) {
-    printf("TSRecordSetInt FAILED!\n");
-  } else {
-    printf("[TSRecordSetInt] proxy.config.cop.core_signal=%" PRId64 " \n", new_port);
-  }
-
-  if (TSRecordGetInt("proxy.config.cop.core_signal", &port2) != TS_ERR_OKAY) {
-    printf("TSRecordGetInt FAILED!\n");
-  } else {
-    printf("[TSRecordGetInt] proxy.config.cop.core_signal=%" PRId64 " \n", port2);
-  }
-  printf("\n");
-#endif
-
-#if TEST_COUNTER
-  printf("\n");
-
-  if (TSRecordGetCounter("proxy.process.socks.connections_successful", &ctr1) != TS_ERR_OKAY) {
-    printf("TSRecordGetCounter FAILED!\n");
-  } else {
-    printf("[TSRecordGetCounter]proxy.process.socks.connections_successful=%" PRId64 " \n", ctr1);
-  }
-
-  if (TSRecordSetCounter("proxy.process.socks.connections_successful", new_ctr, &action) != TS_ERR_OKAY) {
-    printf("TSRecordSetCounter FAILED!\n");
-  } else {
-    printf("[TSRecordSetCounter] proxy.process.socks.connections_successful=%" PRId64 " \n", new_ctr);
-  }
-
-  if (TSRecordGetCounter("proxy.process.socks.connections_successful", &ctr2) != TS_ERR_OKAY) {
-    printf("TSRecordGetCounter FAILED!\n");
-  } else {
-    printf("[TSRecordGetCounter]proxy.process.socks.connections_successful=%" PRId64 " \n", ctr2);
-  }
-  printf("\n");
-#endif
-}
-
-// retrieves the value of the "proxy.config.xxx" record requested at input
-void
-test_rec_get(char *rec_name)
-{
-  TSRecordEle *rec_ele;
-  TSMgmtError ret;
-  char *name;
-
-  name = ats_strdup(rec_name);
-  printf("[test_rec_get] Get Record: %s\n", name);
-
-  // retrieve a string value record using generic RecordGet
-  rec_ele = TSRecordEleCreate();
-  if ((ret = TSRecordGet(name, rec_ele)) != TS_ERR_OKAY) {
-    printf("TSRecordGet FAILED!\n");
-  } else {
-    switch (rec_ele->rec_type) {
-    case TS_REC_INT:
-      printf("[TSRecordGet] %s=%" PRId64 "\n", name, rec_ele->valueT.int_val);
-      break;
-    case TS_REC_COUNTER:
-      printf("[TSRecordGet] %s=%" PRId64 "\n", name, rec_ele->valueT.counter_val);
-      break;
-    case TS_REC_FLOAT:
-      printf("[TSRecordGet] %s=%f\n", name, rec_ele->valueT.float_val);
-      break;
-    case TS_REC_STRING:
-      printf("[TSRecordGet] %s=%s\n", name, rec_ele->valueT.string_val);
-      break;
-    default:
-      // Handled here:
-      // TS_REC_UNDEFINED
-      break;
-    }
-  }
-
-  print_err("TSRecordGet", ret);
-
-  TSRecordEleDestroy(rec_ele);
-  TSfree(name);
-}
-
-/* ------------------------------------------------------------------------
- * test_record_get_mlt
- * ------------------------------------------------------------------------
- * Creates a list of record names to retrieve, and then batch request to
- * get list of records
- */
-void
-test_record_get_mlt()
-{
-  TSStringList name_list;
-  TSList rec_list;
-  int i, num;
-  char *v1, *v2, *v3, *v6, *v7;
-  TSMgmtError ret;
-
-  name_list = TSStringListCreate();
-  rec_list  = TSListCreate();
-
-  const size_t v1_size = (sizeof(char) * (strlen("proxy.config.proxy_name") + 1));
-  v1                   = static_cast<char *>(TSmalloc(v1_size));
-  ink_strlcpy(v1, "proxy.config.proxy_name", v1_size);
-  const size_t v2_size = (sizeof(char) * (strlen("proxy.config.bin_path") + 1));
-  v2                   = static_cast<char *>(TSmalloc(v2_size));
-  ink_strlcpy(v2, "proxy.config.bin_path", v2_size);
-  const size_t v3_size = (sizeof(char) * (strlen("proxy.config.manager_binary") + 1));
-  v3                   = static_cast<char *>(TSmalloc(v3_size));
-  ink_strlcpy(v3, "proxy.config.manager_binary", v3_size);
-  const size_t v6_size = (sizeof(char) * (strlen("proxy.config.env_prep") + 1));
-  v6                   = static_cast<char *>(TSmalloc(v6_size));
-  ink_strlcpy(v6, "proxy.config.env_prep", v6_size);
-  const size_t v7_size = (sizeof(char) * (strlen("proxy.config.cop.core_signal") + 1));
-  v7                   = static_cast<char *>(TSmalloc(v7_size));
-  ink_strlcpy(v7, "proxy.config.cop.core_signal", v7_size);
-
-  // add the names to the get_list
-  TSStringListEnqueue(name_list, v1);
-  TSStringListEnqueue(name_list, v2);
-  TSStringListEnqueue(name_list, v3);
-  TSStringListEnqueue(name_list, v6);
-  TSStringListEnqueue(name_list, v7);
-
-  num = TSStringListLen(name_list);
-  printf("Num Records to Get: %d\n", num);
-  ret = TSRecordGetMlt(name_list, rec_list);
-  // free the string list
-  TSStringListDestroy(name_list);
-  if (ret != TS_ERR_OKAY) {
-    print_err("TSStringListDestroy", ret);
-  }
-
-  for (i = 0; i < num; i++) {
-    TSRecordEle *rec_ele = static_cast<TSRecordEle *>(TSListDequeue(rec_list));
-    if (!rec_ele) {
-      printf("ERROR\n");
-      break;
-    }
-    printf("Record: %s = ", rec_ele->rec_name);
-    switch (rec_ele->rec_type) {
-    case TS_REC_INT:
-      printf("%" PRId64 "\n", rec_ele->valueT.int_val);
-      break;
-    case TS_REC_COUNTER:
-      printf("%" PRId64 "\n", rec_ele->valueT.counter_val);
-      break;
-    case TS_REC_FLOAT:
-      printf("%f\n", rec_ele->valueT.float_val);
-      break;
-    case TS_REC_STRING:
-      printf("%s\n", rec_ele->valueT.string_val);
-      break;
-    default:
-      // Handled here:
-      // TS_REC_UNDEFINED
-      break;
-    }
-    TSRecordEleDestroy(rec_ele);
-  }
-
-  TSListDestroy(rec_list); // must dequeue and free each string individually
-
-  return;
-}
-
-/* ------------------------------------------------------------------------
- * test_record_set_mlt
- * ------------------------------------------------------------------------
- * Creates a list of TSRecordEle's, and then batch request to set records
- * Also checks to make sure correct action_need type is set.
- */
-void
-test_record_set_mlt()
-{
-  TSList list;
-  TSRecordEle *ele1, *ele2;
-  TSActionNeedT action = TS_ACTION_UNDEFINED;
-  TSMgmtError err;
-
-  list = TSListCreate();
-
-  ele1                    = TSRecordEleCreate(); // TS_TYPE_UNDEFINED action
-  ele1->rec_name          = TSstrdup("proxy.config.cli_binary");
-  ele1->rec_type          = TS_REC_STRING;
-  ele1->valueT.string_val = TSstrdup(ele1->rec_name);
-
-  ele2                 = TSRecordEleCreate(); // undefined action
-  ele2->rec_name       = TSstrdup("proxy.config.cop.core_signal");
-  ele2->rec_type       = TS_REC_INT;
-  ele2->valueT.int_val = -4;
-
-  TSListEnqueue(list, ele1);
-  TSListEnqueue(list, ele2);
-
-  err = TSRecordSetMlt(list, &action);
-  print_err("TSRecordSetMlt", err);
-  fprintf(stderr, "[TSRecordSetMlt] Action Required: %d\n", action);
-
-  // cleanup: need to iterate through list and delete each ele
-  int count = TSListLen(list);
-  for (int i = 0; i < count; i++) {
-    TSRecordEle *ele = static_cast<TSRecordEle *>(TSListDequeue(list));
-    TSRecordEleDestroy(ele);
-  }
-  TSListDestroy(list);
-}
-
-/***************************************************************************
- * File I/O Testing
- ***************************************************************************/
-
-// if valid==true, then use a valid url to read
-void
-test_read_url(bool valid)
-{
-  char *header = nullptr;
-  int headerSize;
-  char *body = nullptr;
-  int bodySize;
-  TSMgmtError err;
-
-  if (!valid) {
-    // first try
-
-    err = TSReadFromUrlEx("hsdfasdf.com:80/index.html", &header, &headerSize, &body, &bodySize, 50000);
-    if (err != TS_ERR_OKAY) {
-      print_err("TSReadFromUrlEx", err);
-    } else {
-      printf("--------------------------------------------------------------\n");
-      //  printf("The header...\n%s\n%d\n", *header, *headerSize);
-      printf("--------------------------------------------------------------\n");
-      printf("The body...\n%s\n%d\n", body, bodySize);
-    }
-    if (body) {
-      TSfree(body);
-    }
-    if (header) {
-      TSfree(header);
-    }
-
-    err = TSReadFromUrlEx("http://sadfasdfi.com:80/", &header, &headerSize, &body, &bodySize, 50000);
-    if (err != TS_ERR_OKAY) {
-      print_err("TSReadFromUrlEx", err);
-    } else {
-      printf("---------------------------------------------------------------\n");
-      printf("The header...\n%s\n%d\n", header, headerSize);
-      printf("-------------------------------------------------------------\n");
-      printf("The body...\n%s\n%d\n", body, bodySize);
-    }
-    if (header) {
-      TSfree(header);
-    }
-    if (body) {
-      TSfree(body);
-    }
-
-  } else { // use valid urls
-    err = TSReadFromUrlEx("lakota.example.com:80/", &header, &headerSize, &body, &bodySize, 50000);
-
-    if (err != TS_ERR_OKAY) {
-      print_err("TSReadFromUrlEx", err);
-    } else {
-      printf("---------------------------------------------------------------\n");
-      printf("The header...\n%s\n%d\n", header, headerSize);
-      printf("-------------------------------------------------------------\n");
-      printf("The body...\n%s\n%d\n", body, bodySize);
-    }
-    if (header) {
-      TSfree(header);
-    }
-    if (body) {
-      TSfree(body);
-    }
-
-    // read second url
-    err = TSReadFromUrlEx("http://www.apache.org:80/index.html", &header, &headerSize, &body, &bodySize, 50000);
-    if (err != TS_ERR_OKAY) {
-      print_err("TSReadFromUrlEx", err);
-    } else {
-      printf("---------------------------------------------------------------\n");
-      printf("The header...\n%s\n%d\n", header, headerSize);
-      printf("-------------------------------------------------------------\n");
-      printf("The body...\n%s\n%d\n", body, bodySize);
-    }
-    if (header) {
-      TSfree(header);
-    }
-    if (body) {
-      TSfree(body);
-    }
-  }
-}
-
-/***************************************************************************
- * Events Testing
- ***************************************************************************/
-/* ------------------------------------------------------------------------
- * print_active_events
- * ------------------------------------------------------------------------
- * retrieves a list of all active events and prints out each event name,
- * one event per line
- */
-void
-print_active_events()
-{
-  TSList events;
-  TSMgmtError ret;
-  int count, i;
-  char *name;
-
-  printf("[print_active_events]\n");
-
-  events = TSListCreate();
-  ret    = TSActiveEventGetMlt(events);
-  if (ret != TS_ERR_OKAY) {
-    print_err("TSActiveEventGetMlt", ret);
-    goto END;
-  } else { // successful get
-    count = TSListLen(events);
-    for (i = 0; i < count; i++) {
-      name = static_cast<char *>(TSListDequeue(events));
-      printf("\t%s\n", name);
-      TSfree(name);
-    }
-  }
-
-END:
-  TSListDestroy(events);
-  return;
-}
-
-/* ------------------------------------------------------------------------
- * check_active
- * ------------------------------------------------------------------------
- * returns true if the event named event_name is currently active (unresolved)
- * returns false otherwise
- */
-bool
-check_active(char *event_name)
-{
-  bool active;
-  TSMgmtError ret;
-
-  ret = TSEventIsActive(event_name, &active);
-  print_err("TSEventIsActive", ret);
-
-  if (active) {
-    printf("%s is ACTIVE\n", event_name);
-  } else {
-    printf("%s is NOT-ACTIVE\n", event_name);
-  }
-
-  return active;
-}
-
-/* ------------------------------------------------------------------------
- * try_resolve
- * ------------------------------------------------------------------------
- * checks if the event_name is still unresolved; if it is, it then
- * resolves it, and checks the status of the event again to make sure
- * the event was actually resolved
- *
- * NOTE: all the special string manipulation is needed because the CLI
- * appends extra newline character to end of the user input; normally
- * do not have to do all this special string manipulation
- */
-void
-try_resolve(char *event_name)
-{
-  TSMgmtError ret;
-  char *name;
-
-  name = TSstrdup(event_name);
-  printf("[try_resolve] Resolving event: %s\n", name);
-
-  if (check_active(name)) { // resolve events
-    ret = TSEventResolve(name);
-    print_err("TSEventResolve", ret);
-    check_active(name); // should be non-active now
-  }
-
-  TSfree(name);
-}
-
-/* ------------------------------------------------------------------------
- * eventCallbackFn
- * ------------------------------------------------------------------------
- * the callback function; when called, it just prints out the name
- * of the event that was signalled
- */
-void
-eventCallbackFn(char *name, char *msg, int /* pri ATS_UNUSED */, void * /* data ATS_UNUSED */)
-{
-  printf("[eventCallbackFn] EVENT: %s, %s\n", name, msg);
-  return;
-}
-
-/* ------------------------------------------------------------------------
- * register_event_callback
- * ------------------------------------------------------------------------
- * registers the eventCallbackFn above for all events; this just means
- * that for any event that's signalled, the callback fn will also be called
- */
-void
-register_event_callback()
-{
-  TSMgmtError err;
-
-  printf("\n[register_event_callback] \n");
-  err = TSEventSignalCbRegister(nullptr, eventCallbackFn, nullptr);
-  print_err("TSEventSignalCbRegister", err);
-}
-
-/* ------------------------------------------------------------------------
- * unregister_event_callback
- * ------------------------------------------------------------------------
- * unregisters the eventCallbackFn above for all events; this just means
- * that it will remove this eventCallbackFn entirely so that for any
- * event called, the eventCallbackFn will NOT be called
- */
-void
-unregister_event_callback()
-{
-  TSMgmtError err;
-
-  printf("\n[unregister_event_callback]\n");
-  err = TSEventSignalCbUnregister(nullptr, eventCallbackFn);
-  print_err("TSEventSignalCbUnregister", err);
-}
-
-/***************************************************************************
- * Statistics
- ***************************************************************************/
-
-// generate dummy values for statistics
-void
-set_stats()
-{
-  TSActionNeedT action;
-
-  fprintf(stderr, "[set_stats] Set Dummy Stat Values\n");
-
-  TSRecordSetInt("proxy.process.http.user_agent_response_document_total_size", 100, &action);
-  TSRecordSetInt("proxy.process.http.user_agent_response_header_total_size", 100, &action);
-  TSRecordSetInt("proxy.process.http.current_client_connections", 100, &action);
-  TSRecordSetInt("proxy.process.http.current_client_transactions", 100, &action);
-  TSRecordSetInt("proxy.process.http.origin_server_response_document_total_size", 100, &action);
-  TSRecordSetInt("proxy.process.http.origin_server_response_header_total_size", 100, &action);
-  TSRecordSetInt("proxy.process.http.current_server_connections", 100, &action);
-  TSRecordSetInt("proxy.process.http.current_server_transactions", 100, &action);
-
-  TSRecordSetInt("proxy.node.proxy_running", 110, &action);
-  TSRecordSetInt("proxy.node.proxy_running", 110, &action);
-}
-
-void
-print_stats()
-{
-  TSInt i1, i2, i3, i4, i5, i6, i7, i8;
-
-  fprintf(stderr, "[print_stats]\n");
-
-  TSRecordGetInt("proxy.process.http.user_agent_response_document_total_size", &i1);
-  TSRecordGetInt("proxy.process.http.user_agent_response_header_total_size", &i2);
-  TSRecordGetInt("proxy.process.http.current_client_connections", &i3);
-  TSRecordGetInt("proxy.process.http.current_client_transactions", &i4);
-  TSRecordGetInt("proxy.process.http.origin_server_response_document_total_size", &i5);
-  TSRecordGetInt("proxy.process.http.origin_server_response_header_total_size", &i6);
-  TSRecordGetInt("proxy.process.http.current_server_connections", &i7);
-  TSRecordGetInt("proxy.process.http.current_server_transactions", &i8);
-
-  fprintf(stderr, "%" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 "\n", i1,
-          i2, i3, i4, i5, i6, i7, i8);
-
-  TSRecordGetInt("proxy.node.proxy_running", &i4);
-  TSRecordGetInt("proxy.node.proxy_running", &i6);
-
-  fprintf(stderr, "%" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 "\n", i1, i7, i2, i3, i4,
-          i5, i6);
-
-  fprintf(stderr, "PROCESS stats: \n");
-  fprintf(stderr, "%" PRId64 ", %" PRId64 ", %" PRId64 ", %" PRId64 "\n", i1, i2, i3, i4);
-}
-
-void
-reset_stats()
-{
-  TSMgmtError err = TSStatsReset(nullptr);
-  print_err("TSStatsReset", err);
-  return;
-}
-
-void
-sync_test()
-{
-  TSActionNeedT action;
-
-  TSRecordSetString("proxy.config.proxy_name", "dorkface", &action);
-  printf("[TSRecordSetString] proxy.config.proxy_name \n\tAction Should: [%d]\n\tAction is    : [%d]\n", TS_ACTION_UNDEFINED,
-         action);
-
-  TSMgmtError ret;
-  if ((ret = TSProxyStateSet(TS_PROXY_OFF, TS_CACHE_CLEAR_NONE)) != TS_ERR_OKAY) {
-    printf("[TSProxyStateSet] turn off FAILED\n");
-  }
-  print_err("stop_TS", ret);
-}
-
-/* ########################################################################*/
-/* ------------------------------------------------------------------------
- * runInteractive
- * ------------------------------------------------------------------------
- * the loop that processes the commands inputted by user
- */
-static void
-runInteractive()
-{
-  char buf[512]; // holds request from interactive prompt
-
-  // process input from command line
-  while (true) {
-    // Display a prompt
-    printf("api_cli-> ");
-
-    // get input from command line
-    ATS_UNUSED_RETURN(fgets(buf, 512, stdin));
-
-    // check status of 'stdin' after reading
-    if (feof(stdin) != 0) {
-      printf("EXIT api_cli_remote\n");
-      return;
-    } else if (ferror(stdin) != 0) {
-      printf("EXIT api_cli_remote\n");
-      return;
-    }
-    // continue on newline
-    if (strcmp(buf, "\n") == 0) {
-      continue;
-    }
-    // exiting/quitting?
-    if (strcasecmp("quit\n", buf) == 0 || strcasecmp("exit\n", buf) == 0) {
-      // Don't wait for response LM
-      // exit(0);
-      return;
-    }
-    // check what operation user typed in
-    if (strstr(buf, "state")) {
-      print_proxy_state();
-    } else if (strncmp(buf, "start", 5) == 0) {
-      start_TS(buf);
-    } else if (strstr(buf, "stop")) {
-      stop_TS();
-    } else if (strstr(buf, "restart")) {
-      restart();
-    } else if (strstr(buf, "reconfig")) {
-      reconfigure();
-    } else if (strstr(buf, "records")) {
-      test_records();
-    } else if (strstr(buf, "err_recs")) {
-      test_error_records();
-    } else if (strstr(buf, "get_mlt")) {
-      test_record_get_mlt();
-    } else if (strstr(buf, "set_mlt")) {
-      test_record_set_mlt();
-    } else if (strstr(buf, "proxy.")) {
-      test_rec_get(buf);
-    } else if (strstr(buf, "active_events")) {
-      print_active_events();
-    } else if (strstr(buf, "MGMT_ALARM_")) {
-      try_resolve(buf);
-    } else if (strncmp(buf, "register", 8) == 0) {
-      register_event_callback();
-    } else if (strstr(buf, "unregister")) {
-      unregister_event_callback();
-    } else if (strstr(buf, "read_url")) {
-      test_read_url(true);
-    } else if (strstr(buf, "test_url")) {
-      test_read_url(false);
-    } else if (strstr(buf, "reset_stats")) {
-      reset_stats();
-    } else if (strstr(buf, "set_stats")) {
-      set_stats();
-    } else if (strstr(buf, "print_stats")) {
-      print_stats();
-    } else {
-      sync_test();
-    }
-
-  } // end while(1)
-
-} // end runInteractive
-
-/* ------------------------------------------------------------------------
- * main
- * ------------------------------------------------------------------------
- * Main entry point which connects the client to the API, does any
- * clean up on exit, and gets the interactive command-line running
- */
-int
-main(int /* argc ATS_UNUSED */, char ** /* argv ATS_UNUSED */)
-{
-  TSMgmtError ret;
-
-  if ((ret = TSInit(nullptr, TS_MGMT_OPT_DEFAULTS)) == TS_ERR_OKAY) {
-    runInteractive();
-    TSTerminate();
-    printf("END REMOTE API TEST\n");
-  } else {
-    print_err("main", ret);
-  }
-
-  return 0;
-} // end main()
diff --git a/mgmt/api/CoreAPI.cc b/mgmt/api/CoreAPI.cc
deleted file mode 100644
index 35cd82677..000000000
--- a/mgmt/api/CoreAPI.cc
+++ /dev/null
@@ -1,924 +0,0 @@
-/** @file
-
-  A brief file description
-
-  @section license License
-
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
- */
-
-/*****************************************************************************
- * CoreAPI.cc
- *
- * Implementation of many of TSMgmtAPI functions, but from local side.
- *
- *
- ***************************************************************************/
-#include <vector>
-
-#include "tscore/ink_platform.h"
-#include "tscore/ink_file.h"
-#include "tscore/ParseRules.h"
-#include "RecordsConfig.h"
-#include "Alarms.h"
-#include "MgmtUtils.h"
-#include "LocalManager.h"
-#include "FileManager.h"
-#include "ConfigManager.h"
-#include "WebMgmtUtils.h"
-#include "tscore/Diags.h"
-#include "ExpandingArray.h"
-
-#include "CoreAPI.h"
-#include "CoreAPIShared.h"
-#include "EventCallback.h"
-#include "tscore/I_Layout.h"
-#include "tscore/ink_cap.h"
-
-// global variable
-static CallbackTable *local_event_callbacks;
-
-extern FileManager *configFiles; // global in traffic_manager
-
-/*-------------------------------------------------------------------------
- * Init
- *-------------------------------------------------------------------------
- * performs any necessary initializations for the local API client,
- * eg. set up global structures; called by the TSMgmtAPI::TSInit()
- */
-TSMgmtError
-Init(const char * /* socket_path ATS_UNUSED */, TSInitOptionT options)
-{
-  // socket_path should be null; only applies to remote clients
-  if (0 == (options & TS_MGMT_OPT_NO_EVENTS)) {
-    local_event_callbacks = create_callback_table("local_callbacks");
-    if (!local_event_callbacks) {
-      return TS_ERR_SYS_CALL;
-    }
-  } else {
-    local_event_callbacks = nullptr;
-  }
-
-  return TS_ERR_OKAY;
-}
-
-/*-------------------------------------------------------------------------
- * Terminate
- *-------------------------------------------------------------------------
- * performs any necessary cleanup of global structures, etc,
- * for the local API client,
- */
-TSMgmtError
-Terminate()
-{
-  delete_callback_table(local_event_callbacks);
-
-  return TS_ERR_OKAY;
-}
-
-/***************************************************************************
- * Control Operations
- ***************************************************************************/
-
-// bool ProxyShutdown()
-//
-//  Attempts to turn the proxy off.  Returns
-//    true if the proxy is off when the call returns
-//    and false if it is still on
-//
-static bool
-ProxyShutdown()
-{
-  int i = 0;
-
-  // Check to make sure that we are not already down
-  if (!lmgmt->processRunning()) {
-    return true;
-  }
-
-  lmgmt->processShutdown(false /* only shut down the proxy*/);
-
-  // Wait for awhile for shutdown to happen
-  do {
-    mgmt_sleep_sec(1);
-    i++;
-  } while (i < 10 && lmgmt->processRunning());
-
-  // See if we succeeded
-  if (lmgmt->processRunning()) {
-    return false;
-  } else {
-    return true;
-  }
-}
-/*-------------------------------------------------------------------------
- * ProxyStateGet
- *-------------------------------------------------------------------------
- * return TS_PROXY_OFF if  Traffic Server is off.
- * return TS_PROXY_ON if Traffic Server is on.
- */
... 13350 lines suppressed ...