diff --git a/src/lib/c_wrapper.cpp b/src/lib/c_wrapper.cpp
index 1074843a97d52ad4cab2aedd280ac8bfe6819cb5..e383a86e47de1f32794d4d3102492da6b98c4cf1 100644
--- a/src/lib/c_wrapper.cpp
+++ b/src/lib/c_wrapper.cpp
@@ -161,6 +161,14 @@ ADM_deploy_adhoc_storage(ADM_server_t server,
             srv, scord::adhoc_storage{adhoc_storage});
 }
 
+ADM_return_t
+ADM_tear_down_adhoc_storage(ADM_server_t server,
+                            ADM_adhoc_storage_t adhoc_storage) {
+
+    return scord::detail::tear_down_adhoc_storage(
+            scord::server{server}, scord::adhoc_storage{adhoc_storage});
+}
+
 ADM_return_t
 ADM_register_pfs_storage(ADM_server_t server, const char* name,
                          ADM_pfs_storage_type_t type, ADM_pfs_context_t ctx,
diff --git a/src/lib/detail/impl.cpp b/src/lib/detail/impl.cpp
index 6f3bc40d82e359ebc7cc73e8c4153d92885ebf56..ec28bcb799929b100b8e22d959948da019917fb5 100644
--- a/src/lib/detail/impl.cpp
+++ b/src/lib/detail/impl.cpp
@@ -479,6 +479,43 @@ deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) {
     return scord::error_code::other;
 }
 
+scord::error_code
+tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) {
+
+    scord::network::client rpc_client{srv.protocol()};
+
+    const auto rpc_id = ::api::remote_procedure::new_id();
+
+    if(const auto lookup_rv = rpc_client.lookup(srv.address());
+       lookup_rv.has_value()) {
+        const auto& endp = lookup_rv.value();
+
+        LOGGER_INFO("rpc id: {} name: {} from: {} => "
+                    "body: {{adhoc_id: {}}}",
+                    rpc_id, std::quoted("ADM_"s + __FUNCTION__),
+                    std::quoted(rpc_client.self_address()), adhoc_storage.id());
+
+        if(const auto call_rv =
+                   endp.call("ADM_"s + __FUNCTION__, adhoc_storage.id());
+           call_rv.has_value()) {
+
+            const scord::network::generic_response resp{call_rv.value()};
+
+            LOGGER_EVAL(resp.error_code(), INFO, ERROR,
+                        "rpc id: {} name: {} from: {} <= "
+                        "body: {{retval: {}}} [op_id: {}]",
+                        rpc_id, std::quoted("ADM_"s + __FUNCTION__),
+                        std::quoted(endp.address()), resp.error_code(),
+                        resp.op_id());
+
+            return resp.error_code();
+        }
+    }
+
+    LOGGER_ERROR("rpc call failed");
+    return scord::error_code::other;
+}
+
 tl::expected<transfer, error_code>
 transfer_datasets(const server& srv, const job& job,
                   const std::vector<dataset>& sources,
diff --git a/src/lib/detail/impl.hpp b/src/lib/detail/impl.hpp
index 40bb30c9132521941f7cec8b19f180a1db53a805..d87539086ac90ef9a2f4fa15948fdf9bfd2c5297 100644
--- a/src/lib/detail/impl.hpp
+++ b/src/lib/detail/impl.hpp
@@ -62,6 +62,9 @@ remove_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage);
 scord::error_code
 deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage);
 
+scord::error_code
+tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage);
+
 tl::expected<scord::pfs_storage, scord::error_code>
 register_pfs_storage(const server& srv, const std::string& name,
                      enum pfs_storage::type type, const pfs_storage::ctx& ctx);
diff --git a/src/lib/libscord.cpp b/src/lib/libscord.cpp
index cbe3b47c37195774ca3bbe2c88132c66d27f42c8..a73c7738fdd19cc7211b16c8660fcb6638e07ec9 100644
--- a/src/lib/libscord.cpp
+++ b/src/lib/libscord.cpp
@@ -299,6 +299,17 @@ deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) {
     }
 }
 
+void
+tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage) {
+
+    const auto ec = detail::tear_down_adhoc_storage(srv, adhoc_storage);
+
+    if(!ec) {
+        throw std::runtime_error(fmt::format(
+                "ADM_deploy_adhoc_storage() error: {}", ec.message()));
+    }
+}
+
 scord::pfs_storage
 register_pfs_storage(const server& srv, const std::string& name,
                      enum pfs_storage::type type, const pfs_storage::ctx& ctx) {
diff --git a/src/lib/scord/scord.h b/src/lib/scord/scord.h
index 1693a3ba5a2c20112add750d5d1728812cca3e61..4733624aab84c149ec7e32db369b165241b59418 100644
--- a/src/lib/scord/scord.h
+++ b/src/lib/scord/scord.h
@@ -158,6 +158,18 @@ ADM_return_t
 ADM_deploy_adhoc_storage(ADM_server_t server,
                          ADM_adhoc_storage_t adhoc_storage);
 
+/**
+ * Tear down a previously deployed adhoc storage system instance
+ *
+ * @param[in] server The server to which the request is directed
+ * @param[in] adhoc_storage An ADM_STORAGE referring to the adhoc storage
+ * instance of interest.
+ * @return Returns ADM_SUCCESS if the remote procedure has completed
+ */
+ADM_return_t
+ADM_tear_down_adhoc_storage(ADM_server_t server,
+                            ADM_adhoc_storage_t adhoc_storage);
+
 /**
  * Register a PFS storage tier.
  *
diff --git a/src/lib/scord/scord.hpp b/src/lib/scord/scord.hpp
index 1a9a5c560b18a6df818a26b69f6b261ef48cee3b..1325b5c617b95919e608864d1ce9d6c73d498a66 100644
--- a/src/lib/scord/scord.hpp
+++ b/src/lib/scord/scord.hpp
@@ -73,6 +73,9 @@ remove_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage);
 void
 deploy_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage);
 
+void
+tear_down_adhoc_storage(const server& srv, const adhoc_storage& adhoc_storage);
+
 scord::pfs_storage
 register_pfs_storage(const server& srv, const std::string& name,
                      enum scord::pfs_storage::type type,
diff --git a/src/scord/rpc_handlers.cpp b/src/scord/rpc_handlers.cpp
index 9c4045bc00bd88af52cf23c50cb377bc41747285..329f4c716b9eaeb6ce9e932257e1f0ea4601432d 100644
--- a/src/scord/rpc_handlers.cpp
+++ b/src/scord/rpc_handlers.cpp
@@ -401,6 +401,32 @@ deploy_adhoc_storage(const request& req, std::uint64_t adhoc_id) {
     req.respond(resp);
 }
 
+void
+tear_down_adhoc_storage(const request& req, std::uint64_t adhoc_id) {
+
+    using scord::network::generic_response;
+    using scord::network::get_address;
+
+    const auto rpc_name = "ADM_"s + __FUNCTION__;
+    const auto rpc_id = remote_procedure::new_id();
+
+    LOGGER_INFO("rpc id: {} name: {} from: {} => "
+                "body: {{adhoc_id: {}}}",
+                rpc_id, std::quoted(rpc_name), std::quoted(get_address(req)),
+                adhoc_id);
+
+    // TODO: actually tear down the adhoc storage instance
+
+    const auto resp = generic_response{rpc_id, scord::error_code::success};
+
+    LOGGER_INFO("rpc id: {} name: {} to: {} <= "
+                "body: {{retval: {}}}",
+                rpc_id, std::quoted(rpc_name), std::quoted(get_address(req)),
+                scord::error_code::success);
+
+    req.respond(resp);
+}
+
 void
 register_pfs_storage(const request& req, const std::string& name,
                      enum scord::pfs_storage::type type,
diff --git a/src/scord/rpc_handlers.hpp b/src/scord/rpc_handlers.hpp
index c0bc39638518673053a2ed16633b4b461e3c827b..1ccc493dcfd43be900b74a4f70e13fed7b41509d 100644
--- a/src/scord/rpc_handlers.hpp
+++ b/src/scord/rpc_handlers.hpp
@@ -62,6 +62,9 @@ remove_adhoc_storage(const request& req, std::uint64_t adhoc_id);
 void
 deploy_adhoc_storage(const request& req, std::uint64_t adhoc_id);
 
+void
+tear_down_adhoc_storage(const request& req, std::uint64_t adhoc_id);
+
 void
 register_pfs_storage(const request& req, const std::string& name,
                      enum scord::pfs_storage::type type,
diff --git a/src/scord/scord.cpp b/src/scord/scord.cpp
index 3615a8bfeb16647eb5add0acbd15cb28faf8863d..bdace7a7180bcd592f61174b258376700251795f 100644
--- a/src/scord/scord.cpp
+++ b/src/scord/scord.cpp
@@ -192,6 +192,7 @@ main(int argc, char* argv[]) {
         daemon.set_handler(EXPAND(update_adhoc_storage));
         daemon.set_handler(EXPAND(remove_adhoc_storage));
         daemon.set_handler(EXPAND(deploy_adhoc_storage));
+        daemon.set_handler(EXPAND(tear_down_adhoc_storage));
         daemon.set_handler(EXPAND(register_pfs_storage));
         daemon.set_handler(EXPAND(update_pfs_storage));
         daemon.set_handler(EXPAND(remove_pfs_storage));