diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp
index c9937f1..db70438 100644
--- a/transport/HidlTransportSupport.cpp
+++ b/transport/HidlTransportSupport.cpp
@@ -42,6 +42,20 @@
     return handleBinderPoll();
 }
 
+// TODO(b/122472540): only store one data item per object
+template <typename V>
+static void pruneMapLocked(ConcurrentMap<wp<IBase>, V>& map) {
+    std::vector<wp<IBase>> toDelete;
+    for (const auto& kv : map) {
+        if (kv.first.promote() == nullptr) {
+            toDelete.push_back(kv.first);
+        }
+    }
+    for (const auto& k : toDelete) {
+        map.eraseLocked(k);
+    }
+}
+
 bool setMinSchedulerPolicy(const sp<IBase>& service, int policy, int priority) {
     if (service->isRemote()) {
         LOG(ERROR) << "Can't set scheduler policy on remote service.";
@@ -71,24 +85,29 @@
     // Due to ABI considerations, IBase cannot have a destructor to clean this up.
     // So, because this API is so infrequently used, (expected to be usually only
     // one time for a process, but it can be more), we are cleaning it up here.
-    // TODO(b/37794345): if ever we update the HIDL ABI for launches in an Android
-    // release in the meta-version sense, we should remove this.
     std::unique_lock<std::mutex> lock = details::gServicePrioMap.lock();
-
-    std::vector<wp<IBase>> toDelete;
-    for (const auto& kv : details::gServicePrioMap) {
-        if (kv.first.promote() == nullptr) {
-            toDelete.push_back(kv.first);
-        }
-    }
-    for (const auto& k : toDelete) {
-        details::gServicePrioMap.eraseLocked(k);
-    }
+    pruneMapLocked(details::gServicePrioMap);
     details::gServicePrioMap.setLocked(service, {policy, priority});
 
     return true;
 }
 
+bool setRequestingSid(const sp<IBase>& service, bool requesting) {
+    if (service->isRemote()) {
+        LOG(ERROR) << "Can't set requesting sid on remote service.";
+        return false;
+    }
+
+    // Due to ABI considerations, IBase cannot have a destructor to clean this up.
+    // So, because this API is so infrequently used, (expected to be usually only
+    // one time for a process, but it can be more), we are cleaning it up here.
+    std::unique_lock<std::mutex> lock = details::gServiceSidMap.lock();
+    pruneMapLocked(details::gServiceSidMap);
+    details::gServiceSidMap.setLocked(service, requesting);
+
+    return true;
+}
+
 bool interfacesEqual(const sp<IBase>& left, const sp<IBase>& right) {
     if (left == nullptr || right == nullptr || !left->isRemote() || !right->isRemote()) {
         return left == right;
diff --git a/transport/Static.cpp b/transport/Static.cpp
index 45ae27c..0bbd48d 100644
--- a/transport/Static.cpp
+++ b/transport/Static.cpp
@@ -33,7 +33,9 @@
 ConcurrentMap<const ::android::hidl::base::V1_0::IBase*, wp<::android::hardware::BHwBinder>>
     gBnMap{};
 
+// TODO(b/122472540): replace with single, hidden map
 ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio> gServicePrioMap{};
+ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, bool> gServiceSidMap{};
 
 // Deprecated; kept for ABI compatibility. Use getBsConstructorMap.
 BsConstructorMap gBsConstructorMap{};
diff --git a/transport/include/hidl/ConcurrentMap.h b/transport/include/hidl/ConcurrentMap.h
index 54c1a32..1b06dfd 100644
--- a/transport/include/hidl/ConcurrentMap.h
+++ b/transport/include/hidl/ConcurrentMap.h
@@ -67,6 +67,7 @@
     std::unique_lock<std::mutex> lock() { return std::unique_lock<std::mutex>(mMutex); }
 
     void setLocked(K&& k, V&& v) { mMap[std::forward<K>(k)] = std::forward<V>(v); }
+    void setLocked(K&& k, const V& v) { mMap[std::forward<K>(k)] = v; }
 
     const V& getLocked(const K& k, const V& def) const {
         const_iterator iter = mMap.find(k);
diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h
index 69f3291..a132bfa 100644
--- a/transport/include/hidl/HidlTransportSupport.h
+++ b/transport/include/hidl/HidlTransportSupport.h
@@ -85,6 +85,18 @@
                            int policy, int priority);
 
 /**
+ * Sets whether or not this object should request security contexts to be populatd for incoming
+ * calls (e.g. with getCallingSid).
+ *
+ * This method MUST be called before passing this service to another process
+ * and/or registering it with registerAsService().
+ *
+ * @param service the service to set the policy for
+ * @param requesting whether or not to request sid (default is false)
+ */
+bool setRequestingSid(const sp<::android::hidl::base::V1_0::IBase>& service, bool requesting);
+
+/**
  * Returns whether two interfaces represent the same interface. References to interfaces in the same
  * process will always be equivalent. However, in order to compare a service that is a proxy to a
  * different process, its underlying structure may have to be checked.
diff --git a/transport/include/hidl/Static.h b/transport/include/hidl/Static.h
index b50c173..cc711b7 100644
--- a/transport/include/hidl/Static.h
+++ b/transport/include/hidl/Static.h
@@ -38,6 +38,7 @@
 };
 
 extern ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio> gServicePrioMap;
+extern ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, bool> gServiceSidMap;
 
 // For HidlBinderSupport and autogenerated code
 extern ConcurrentMap<const ::android::hidl::base::V1_0::IBase*, wp<::android::hardware::BHwBinder>>
