diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp
index c6ce576..b230943 100644
--- a/libs/binder/Android.bp
+++ b/libs/binder/Android.bp
@@ -70,7 +70,6 @@
         "ProcessInfoService.cpp",
         "ProcessState.cpp",
         "Static.cpp",
-        "Stability.cpp",
         "Status.cpp",
         "TextOutput.cpp",
         "IpPrefix.cpp",
diff --git a/libs/binder/Binder.cpp b/libs/binder/Binder.cpp
index 268c85e..bdf0f8e 100644
--- a/libs/binder/Binder.cpp
+++ b/libs/binder/Binder.cpp
@@ -124,7 +124,6 @@
     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
 {
     data.setDataPosition(0);
-    data.setTransactingBinder(this);
 
     status_t err = NO_ERROR;
     switch (code) {
@@ -136,10 +135,8 @@
             break;
     }
 
-    // In case this is being transacted on in the same process.
     if (reply != nullptr) {
         reply->setDataPosition(0);
-        reply->setTransactingBinder(this);
     }
 
     return err;
diff --git a/libs/binder/BpBinder.cpp b/libs/binder/BpBinder.cpp
index 57440d5..5ceb218 100644
--- a/libs/binder/BpBinder.cpp
+++ b/libs/binder/BpBinder.cpp
@@ -216,11 +216,6 @@
         status_t status = IPCThreadState::self()->transact(
             mHandle, code, data, reply, flags);
         if (status == DEAD_OBJECT) mAlive = 0;
-
-        if (reply != nullptr) {
-            reply->setTransactingBinder(this);
-        }
-
         return status;
     }
 
diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp
index 0b9849a..5537430 100644
--- a/libs/binder/Parcel.cpp
+++ b/libs/binder/Parcel.cpp
@@ -164,34 +164,14 @@
     ALOGE("Invalid object type 0x%08x", obj.hdr.type);
 }
 
-status_t Parcel::finishFlattenBinder(
-    const sp<IBinder>& binder, const flat_binder_object& flat)
+inline static status_t finish_flatten_binder(
+    const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out)
 {
-    status_t status = writeObject(flat, false);
-    if (status != OK) return status;
-
-    return writeInt32(internal::Stability::get(binder.get()));
+    return out->writeObject(flat, false);
 }
 
-status_t Parcel::finishUnflattenBinder(
-    const sp<IBinder>& binder, sp<IBinder>* out) const
-{
-    int32_t stability;
-    status_t status = readInt32(&stability);
-    if (status != OK) return status;
-
-    if (!internal::Stability::check(stability, mRequiredStability)) {
-        return BAD_TYPE;
-    }
-
-    status = internal::Stability::set(binder.get(), stability);
-    if (status != OK) return status;
-
-    *out = binder;
-    return OK;
-}
-
-status_t Parcel::flattenBinder(const sp<IBinder>& binder)
+static status_t flatten_binder(const sp<ProcessState>& /*proc*/,
+    const sp<IBinder>& binder, Parcel* out)
 {
     flat_binder_object obj;
 
@@ -229,24 +209,30 @@
         obj.cookie = 0;
     }
 
-    return finishFlattenBinder(binder, obj);
+    return finish_flatten_binder(binder, obj, out);
 }
 
-status_t Parcel::unflattenBinder(sp<IBinder>* out) const
+inline static status_t finish_unflatten_binder(
+    BpBinder* /*proxy*/, const flat_binder_object& /*flat*/,
+    const Parcel& /*in*/)
 {
-    const flat_binder_object* flat = readObject(false);
+    return NO_ERROR;
+}
+
+static status_t unflatten_binder(const sp<ProcessState>& proc,
+    const Parcel& in, sp<IBinder>* out)
+{
+    const flat_binder_object* flat = in.readObject(false);
 
     if (flat) {
         switch (flat->hdr.type) {
-            case BINDER_TYPE_BINDER: {
-                sp<IBinder> binder = reinterpret_cast<IBinder*>(flat->cookie);
-                return finishUnflattenBinder(binder, out);
-            }
-            case BINDER_TYPE_HANDLE: {
-                sp<IBinder> binder =
-                    ProcessState::self()->getStrongProxyForHandle(flat->handle);
-                return finishUnflattenBinder(binder, out);
-            }
+            case BINDER_TYPE_BINDER:
+                *out = reinterpret_cast<IBinder*>(flat->cookie);
+                return finish_unflatten_binder(nullptr, *flat, in);
+            case BINDER_TYPE_HANDLE:
+                *out = proc->getStrongProxyForHandle(flat->handle);
+                return finish_unflatten_binder(
+                    static_cast<BpBinder*>(out->get()), *flat, in);
         }
     }
     return BAD_TYPE;
@@ -351,10 +337,6 @@
     return NO_ERROR;
 }
 
-void Parcel::setTransactingBinder(const sp<IBinder>& binder) const {
-    mRequiredStability = internal::Stability::get(binder.get());
-}
-
 status_t Parcel::setData(const uint8_t* buffer, size_t len)
 {
     if (len > INT32_MAX) {
@@ -1050,7 +1032,7 @@
 
 status_t Parcel::writeStrongBinder(const sp<IBinder>& val)
 {
-    return flattenBinder(val);
+    return flatten_binder(ProcessState::self(), val, this);
 }
 
 status_t Parcel::writeStrongBinderVector(const std::vector<sp<IBinder>>& val)
@@ -1996,7 +1978,7 @@
 
 status_t Parcel::readNullableStrongBinder(sp<IBinder>* val) const
 {
-    return unflattenBinder(val);
+    return unflatten_binder(ProcessState::self(), *this, val);
 }
 
 sp<IBinder> Parcel::readStrongBinder() const
@@ -2700,10 +2682,9 @@
     mObjectsCapacity = 0;
     mNextObjectHint = 0;
     mObjectsSorted = false;
-    mAllowFds = true;
     mHasFds = false;
     mFdsKnown = true;
-    mRequiredStability = internal::Stability::UNDECLARED;
+    mAllowFds = true;
     mOwner = nullptr;
     mOpenAshmemSize = 0;
     mWorkSourceRequestHeaderPosition = 0;
diff --git a/libs/binder/Stability.cpp b/libs/binder/Stability.cpp
deleted file mode 100644
index d6d312a..0000000
--- a/libs/binder/Stability.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 <binder/Stability.h>
-
-namespace android {
-namespace internal {
-
-void Stability::markCompilationUnit(IBinder* binder) {
-#ifdef __ANDROID_VNDK__
-constexpr Stability::Level kLocalStability = Stability::Level::VENDOR;
-#else
-constexpr Stability::Level kLocalStability = Stability::Level::SYSTEM;
-#endif
-
-    status_t result = set(binder, kLocalStability);
-    LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
-}
-
-void Stability::markVintf(IBinder* binder) {
-    status_t result = set(binder, Level::VINTF);
-    LOG_ALWAYS_FATAL_IF(result != OK, "Should only mark known object.");
-}
-
-status_t Stability::set(IBinder* binder, int32_t stability) {
-    Level currentStability = get(binder);
-
-    // null binder is always written w/ 'UNDECLARED' stability
-    if (binder == nullptr) {
-        if (stability == UNDECLARED) {
-            return OK;
-        } else {
-            ALOGE("Null binder written with stability %s.", stabilityString(stability).c_str());
-            return BAD_TYPE;
-        }
-    }
-
-    if (!isDeclaredStability(stability)) {
-        // There are UNDECLARED sets because some binder interfaces don't set their stability, and
-        // then UNDECLARED stability is sent on the other side.
-        if (stability != UNDECLARED) {
-            ALOGE("Can only set known stability, not %d.", stability);
-            return BAD_TYPE;
-        }
-    }
-
-    if (currentStability != Level::UNDECLARED && currentStability != stability) {
-        ALOGE("Interface being set with %s but it is already marked as %s.",
-            stabilityString(stability).c_str(), stabilityString(stability).c_str());
-        return BAD_TYPE;
-    }
-
-    if (currentStability == stability) return OK;
-
-    binder->attachObject(
-        reinterpret_cast<void*>(&Stability::get),
-        reinterpret_cast<void*>(stability),
-        nullptr /*cleanupCookie*/,
-        nullptr /*cleanup function*/);
-
-    return OK;
-}
-
-Stability::Level Stability::get(IBinder* binder) {
-    if (binder == nullptr) return UNDECLARED;
-
-    return static_cast<Level>(reinterpret_cast<intptr_t>(
-        binder->findObject(reinterpret_cast<void*>(&Stability::get))));
-}
-
-bool Stability::check(int32_t provided, Level required) {
-    bool stable = (provided & required) == required;
-
-    if (!isDeclaredStability(provided) && provided != UNDECLARED) {
-        ALOGE("Unknown stability when checking interface stability %d.", provided);
-
-        stable = false;
-    }
-
-    if (!stable) {
-        ALOGE("Interface with %s cannot accept interface with %s.",
-            stabilityString(required).c_str(),
-            stabilityString(provided).c_str());
-    }
-
-    return stable;
-}
-
-bool Stability::isDeclaredStability(int32_t stability) {
-    return stability == VENDOR || stability == SYSTEM || stability == VINTF;
-}
-
-std::string Stability::stabilityString(int32_t stability) {
-    switch (stability) {
-        case Level::UNDECLARED: return "undeclared stability";
-        case Level::VENDOR: return "vendor stability";
-        case Level::SYSTEM: return "system stability";
-        case Level::VINTF: return "vintf stability";
-    }
-    return "unknown stability " + std::to_string(stability);
-}
-
-}  // namespace internal
-}  // namespace stability
\ No newline at end of file
diff --git a/libs/binder/TEST_MAPPING b/libs/binder/TEST_MAPPING
index 136bdb0..01e57d3 100644
--- a/libs/binder/TEST_MAPPING
+++ b/libs/binder/TEST_MAPPING
@@ -11,9 +11,6 @@
     },
     {
       "name": "binderLibTest"
-    },
-    {
-      "name": "binderStabilityTest"
     }
   ]
 }
diff --git a/libs/binder/include/binder/Parcel.h b/libs/binder/include/binder/Parcel.h
index 4e5f1aa..f5eee87 100644
--- a/libs/binder/include/binder/Parcel.h
+++ b/libs/binder/include/binder/Parcel.h
@@ -33,7 +33,6 @@
 
 #include <binder/IInterface.h>
 #include <binder/Parcelable.h>
-#include <binder/Stability.h>
 
 // ---------------------------------------------------------------------------
 namespace android {
@@ -68,9 +67,7 @@
     status_t            setDataSize(size_t size);
     void                setDataPosition(size_t pos) const;
     status_t            setDataCapacity(size_t size);
-
-    void                setTransactingBinder(const sp<IBinder>& binder) const;
-
+    
     status_t            setData(const uint8_t* buffer, size_t len);
 
     status_t            appendFrom(const Parcel *parcel,
@@ -422,13 +419,7 @@
     void                scanForFds() const;
     status_t            validateReadData(size_t len) const;
     void                updateWorkSourceRequestHeaderPosition() const;
-
-    status_t            finishFlattenBinder(const sp<IBinder>& binder,
-                                            const flat_binder_object& flat);
-    status_t            finishUnflattenBinder(const sp<IBinder>& binder, sp<IBinder>* out) const;
-    status_t            flattenBinder(const sp<IBinder>& binder);
-    status_t            unflattenBinder(sp<IBinder>* out) const;
-
+                        
     template<class T>
     status_t            readAligned(T *pArg) const;
 
@@ -475,15 +466,13 @@
     size_t              mObjectsCapacity;
     mutable size_t      mNextObjectHint;
     mutable bool        mObjectsSorted;
-    bool                mAllowFds;
 
     mutable bool        mRequestHeaderPresent;
     mutable size_t      mWorkSourceRequestHeaderPosition;
 
     mutable bool        mFdsKnown;
     mutable bool        mHasFds;
-
-    mutable internal::Stability::Level mRequiredStability;
+    bool                mAllowFds;
 
     release_func        mOwner;
     void*               mOwnerCookie;
diff --git a/libs/binder/include/binder/Stability.h b/libs/binder/include/binder/Stability.h
deleted file mode 100644
index 77f0667..0000000
--- a/libs/binder/include/binder/Stability.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 <binder/IBinder.h>
-#include <string>
-
-namespace android {
-namespace internal {
-
-// WARNING: These APIs are only ever expected to be called by auto-generated code.
-//     Instead of calling them, you should set the stability of a .aidl interface
-class Stability final {
-public:
-    // WARNING: This is only ever expected to be called by auto-generated code. You likely want to
-    // change or modify the stability class of the interface you are using.
-    // This must be called as soon as the binder in question is constructed. No thread safety
-    // is provided.
-    // E.g. stability is according to libbinder compilation unit
-    static void markCompilationUnit(IBinder* binder);
-    // WARNING: This is only ever expected to be called by auto-generated code. You likely want to
-    // change or modify the stability class of the interface you are using.
-    // This must be called as soon as the binder in question is constructed. No thread safety
-    // is provided.
-    // E.g. stability is according to libbinder_ndk or Java SDK AND the interface
-    //     expressed here is guaranteed to be stable for multiple years (Stable AIDL)
-    static void markVintf(IBinder* binder);
-
-private:
-    // Parcel needs to store stability level since this is more efficient than storing and looking
-    // up the efficiency level of a binder object. So, we expose the underlying type.
-    friend ::android::Parcel;
-
-    enum Level : int32_t {
-        UNDECLARED = 0,
-
-        VENDOR = 0b000011,
-        SYSTEM = 0b001100,
-        VINTF = 0b111111,
-    };
-
-    // applies stability to binder if stability level is known
-    __attribute__((warn_unused_result))
-    static status_t set(IBinder* binder, int32_t stability);
-
-    static Level get(IBinder* binder);
-
-    static bool check(int32_t provided, Level required);
-
-    static bool isDeclaredStability(int32_t stability);
-    static std::string stabilityString(int32_t stability);
-
-    Stability();
-};
-
-}  // namespace internal
-}  // namespace android
diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp
index 05db81e..44a691d 100644
--- a/libs/binder/tests/Android.bp
+++ b/libs/binder/tests/Android.bp
@@ -137,18 +137,3 @@
     ],
     test_suites: ["device-tests"],
 }
-
-cc_test {
-    name: "binderStabilityTest",
-    defaults: ["binder_test_defaults"],
-    srcs: [
-        "binderStabilityTest.cpp",
-        "IBinderStabilityTest.aidl",
-    ],
-
-    shared_libs: [
-        "libbinder",
-        "libutils",
-    ],
-    test_suites: ["device-tests"],
-}
diff --git a/libs/binder/tests/IBinderStabilityTest.aidl b/libs/binder/tests/IBinderStabilityTest.aidl
deleted file mode 100644
index 7540ec9..0000000
--- a/libs/binder/tests/IBinderStabilityTest.aidl
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// DO NOT EVER IN A MILLION YEARS WRITE AN INTERFACE LIKE THIS!
-// THIS IS ONLY FOR TESTING!
-interface IBinderStabilityTest {
-    // DO NOT EVER IN A MILLION YEARS WRITE AN INTERFACE LIKE THIS!
-    // THIS IS ONLY FOR TESTING!
-    void sendBinder(IBinder binder);
-
-    // DO NOT EVER IN A MILLION YEARS WRITE AN INTERFACE LIKE THIS!
-    // THIS IS ONLY FOR TESTING!
-    IBinder returnNoStabilityBinder();
-
-    // DO NOT EVER IN A MILLION YEARS WRITE AN INTERFACE LIKE THIS!
-    // THIS IS ONLY FOR TESTING!
-    IBinder returnLocalStabilityBinder();
-
-    // DO NOT EVER IN A MILLION YEARS WRITE AN INTERFACE LIKE THIS!
-    // THIS IS ONLY FOR TESTING!
-    IBinder returnVintfStabilityBinder();
-}
-// DO NOT EVER IN A MILLION YEARS WRITE AN INTERFACE LIKE THIS!
-// THIS IS ONLY FOR TESTING!
-// Construct and return a binder with a specific stability
diff --git a/libs/binder/tests/binderStabilityTest.cpp b/libs/binder/tests/binderStabilityTest.cpp
deleted file mode 100644
index 2b27a81..0000000
--- a/libs/binder/tests/binderStabilityTest.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 <android/os/IServiceManager.h>
-#include <binder/Binder.h>
-#include <binder/IBinder.h>
-#include <binder/IPCThreadState.h>
-#include <binder/IServiceManager.h>
-#include <binder/Parcel.h>
-#include <binder/Stability.h>
-#include <gtest/gtest.h>
-
-#include <sys/prctl.h>
-
-#include "BnBinderStabilityTest.h"
-#include "BpBinderStabilityTest.h"
-
-using namespace android;
-using android::binder::Status;
-using android::os::IServiceManager;
-
-const String16 kNoStabilityServer = String16("binder_stability_test_service_low");
-const String16 kCompilationUnitServer = String16("binder_stability_test_service_compl");
-const String16 kVintfServer = String16("binder_stability_test_service_vintf");
-
-sp<IBinder> getCompilationUnitStability() {
-    sp<IBinder> binder = new BBinder();
-    // NO! NO! NO! NO! DO NOT EVERY DO SOMETHING LIKE THIS?
-    // WHAT ARE YOU CRAZY? IT'S VERY DANGEROUS
-    internal::Stability::markCompilationUnit(binder.get()); // <- BAD, NO! DO NOT COPY
-    return binder;
-}
-
-sp<IBinder> getVintfStability() {
-    sp<IBinder> binder = new BBinder();
-    // NO! NO! NO! NO! DO NOT EVERY DO SOMETHING LIKE THIS?
-    // WHAT ARE YOU CRAZY? IT'S VERY DANGEROUS
-    internal::Stability::markVintf(binder.get()); // <- BAD, NO! DO NOT COPY
-    return binder;
-}
-
-// NO! NO! NO! Do not even think of doing something like this!
-// This is for testing! If a class like this was actually used in production,
-// it would ruin everything!
-class BadStabilityTester : public BnBinderStabilityTest {
-public:
-    Status sendBinder(const sp<IBinder>& /*binder*/) override {
-        return Status::ok();
-    }
-    Status returnNoStabilityBinder(sp<IBinder>* _aidl_return) override {
-        *_aidl_return = new BBinder();
-        return Status::ok();
-    }
-    Status returnLocalStabilityBinder(sp<IBinder>* _aidl_return) override {
-        *_aidl_return = getCompilationUnitStability();
-        return Status::ok();
-    }
-    Status returnVintfStabilityBinder(sp<IBinder>* _aidl_return) override {
-        *_aidl_return = getVintfStability();
-        return Status::ok();
-    }
-
-    static sp<IBinderStabilityTest> getNoStabilityServer() {
-        sp<IBinder> remote = new BadStabilityTester;
-        return new BpBinderStabilityTest(remote);
-    }
-    static sp<IBinderStabilityTest> getCompilationUnitStabilityServer() {
-        sp<IBinder> remote = new BadStabilityTester;
-        internal::Stability::markCompilationUnit(remote.get());
-        return new BpBinderStabilityTest(remote);
-    }
-    static sp<IBinderStabilityTest> getVintfStabilityServer() {
-        sp<IBinder> remote = new BadStabilityTester;
-        internal::Stability::markVintf(remote.get()); // <- BAD, NO! DO NOT COPY
-        return new BpBinderStabilityTest(remote);
-    }
-};
-
-void checkNoStabilityServer(const sp<IBinderStabilityTest>& unkemptServer) {
-    EXPECT_TRUE(unkemptServer->sendBinder(new BBinder()).isOk());
-    EXPECT_TRUE(unkemptServer->sendBinder(getCompilationUnitStability()).isOk());
-    EXPECT_TRUE(unkemptServer->sendBinder(getVintfStability()).isOk());
-
-    sp<IBinder> out;
-    EXPECT_TRUE(unkemptServer->returnNoStabilityBinder(&out).isOk());
-    EXPECT_NE(nullptr, out.get());
-
-    EXPECT_TRUE(unkemptServer->returnLocalStabilityBinder(&out).isOk());
-    EXPECT_NE(nullptr, out.get());
-
-    EXPECT_TRUE(unkemptServer->returnVintfStabilityBinder(&out).isOk());
-    EXPECT_NE(nullptr, out.get());
-}
-
-void checkLowStabilityServer(const sp<IBinderStabilityTest>& complServer) {
-    EXPECT_FALSE(complServer->sendBinder(new BBinder()).isOk());
-    EXPECT_TRUE(complServer->sendBinder(getCompilationUnitStability()).isOk());
-    EXPECT_TRUE(complServer->sendBinder(getVintfStability()).isOk());
-
-    sp<IBinder> out;
-    EXPECT_FALSE(complServer->returnNoStabilityBinder(&out).isOk());
-    EXPECT_EQ(nullptr, out.get());
-
-    EXPECT_TRUE(complServer->returnLocalStabilityBinder(&out).isOk());
-    EXPECT_NE(nullptr, out.get());
-
-    EXPECT_TRUE(complServer->returnVintfStabilityBinder(&out).isOk());
-    EXPECT_NE(nullptr, out.get());
-}
-
-void checkHighStabilityServer(const sp<IBinderStabilityTest>& highStability) {
-    EXPECT_FALSE(highStability->sendBinder(new BBinder()).isOk());
-    EXPECT_FALSE(highStability->sendBinder(getCompilationUnitStability()).isOk());
-    EXPECT_TRUE(highStability->sendBinder(getVintfStability()).isOk());
-
-    sp<IBinder> out;
-    EXPECT_FALSE(highStability->returnNoStabilityBinder(&out).isOk());
-    EXPECT_EQ(nullptr, out.get());
-
-    EXPECT_FALSE(highStability->returnLocalStabilityBinder(&out).isOk());
-    EXPECT_EQ(nullptr, out.get());
-
-    EXPECT_TRUE(highStability->returnVintfStabilityBinder(&out).isOk());
-    EXPECT_NE(nullptr, out.get());
-}
-
-TEST(BinderStability, LocalNoStabilityServer) {
-    // in practice, a low stability server is probably one that hasn't been rebuilt
-    // or was written by hand.
-    auto server = BadStabilityTester::getNoStabilityServer();
-    ASSERT_NE(nullptr, IInterface::asBinder(server)->localBinder());
-    checkNoStabilityServer(server);
-}
-
-TEST(BinderStability, LocalLowStabilityServer) {
-    auto server = BadStabilityTester::getCompilationUnitStabilityServer();
-    ASSERT_NE(nullptr, IInterface::asBinder(server)->localBinder());
-    checkLowStabilityServer(server);
-}
-
-TEST(BinderStability, LocalHighStabilityServer) {
-    auto server = BadStabilityTester::getVintfStabilityServer();
-    ASSERT_NE(nullptr, IInterface::asBinder(server)->localBinder());
-    checkHighStabilityServer(server);
-}
-
-TEST(BinderStability, RemoteNoStabilityServer) {
-    sp<IBinder> remoteBinder = android::defaultServiceManager()->getService(kNoStabilityServer);
-    auto remoteServer = interface_cast<IBinderStabilityTest>(remoteBinder);
-
-    ASSERT_NE(nullptr, remoteServer.get());
-    ASSERT_NE(nullptr, IInterface::asBinder(remoteServer)->remoteBinder());
-
-    checkNoStabilityServer(remoteServer);
-}
-
-TEST(BinderStability, RemoteLowStabilityServer) {
-    sp<IBinder> remoteBinder = android::defaultServiceManager()->getService(kCompilationUnitServer);
-    auto remoteServer = interface_cast<IBinderStabilityTest>(remoteBinder);
-
-    ASSERT_NE(nullptr, remoteServer.get());
-    ASSERT_NE(nullptr, IInterface::asBinder(remoteServer)->remoteBinder());
-
-    checkLowStabilityServer(remoteServer);
-}
-
-TEST(BinderStability, RemoteVintfServer) {
-    sp<IBinder> remoteBinder = android::defaultServiceManager()->getService(kVintfServer);
-    auto remoteServer = interface_cast<IBinderStabilityTest>(remoteBinder);
-
-    ASSERT_NE(nullptr, remoteServer.get());
-    ASSERT_NE(nullptr, IInterface::asBinder(remoteServer)->remoteBinder());
-
-    checkHighStabilityServer(remoteServer);
-}
-
-class MarksStabilityInConstructor : public BBinder {
-public:
-    static bool gDestructed;
-
-    MarksStabilityInConstructor() {
-        internal::Stability::markCompilationUnit(this);
-    }
-    ~MarksStabilityInConstructor() {
-        gDestructed = true;
-    }
-};
-bool MarksStabilityInConstructor::gDestructed = false;
-
-TEST(BinderStability, MarkingObjectNoDestructTest) {
-    ASSERT_FALSE(MarksStabilityInConstructor::gDestructed);
-
-    // best practice is to put this directly in an sp, but for this test, we
-    // want to explicitly check what happens before that happens
-    MarksStabilityInConstructor* binder = new MarksStabilityInConstructor();
-    ASSERT_FALSE(MarksStabilityInConstructor::gDestructed);
-
-    sp<MarksStabilityInConstructor> binderSp = binder;
-    ASSERT_FALSE(MarksStabilityInConstructor::gDestructed);
-
-    binderSp = nullptr;
-    ASSERT_TRUE(MarksStabilityInConstructor::gDestructed);
-}
-
-int main(int argc, char** argv) {
-    ::testing::InitGoogleTest(&argc, argv);
-
-    if (fork() == 0) {
-        // child process
-        prctl(PR_SET_PDEATHSIG, SIGHUP);
-
-        sp<IBinder> noStability = new BadStabilityTester;
-        android::defaultServiceManager()->addService(kNoStabilityServer, noStability);
-
-        sp<IBinder> compil = new BadStabilityTester;
-        internal::Stability::markCompilationUnit(compil.get());
-        android::defaultServiceManager()->addService(kCompilationUnitServer, compil);
-
-        sp<IBinder> vintf = new BadStabilityTester;
-        internal::Stability::markVintf(vintf.get());
-        android::defaultServiceManager()->addService(kVintfServer, vintf);
-
-        IPCThreadState::self()->joinThreadPool(true);
-        exit(1);  // should not reach
-    }
-
-    // This is not racey. Just giving these services some time to register before we call
-    // getService which sleeps for much longer...
-    usleep(10000);
-
-    return RUN_ALL_TESTS();
-}
