diff --git a/Binder.cpp b/Binder.cpp
index 1471c9c..e7701c6 100644
--- a/Binder.cpp
+++ b/Binder.cpp
@@ -45,7 +45,7 @@
     return NULL;
 }
 
-BBinder* IBinder::localBinder()
+BHwBinder* IBinder::localBinder()
 {
     return NULL;
 }
@@ -62,7 +62,7 @@
 
 // ---------------------------------------------------------------------------
 
-class BBinder::Extras
+class BHwBinder::Extras
 {
 public:
     Mutex mLock;
@@ -71,30 +71,30 @@
 
 // ---------------------------------------------------------------------------
 
-BBinder::BBinder() : mExtras(nullptr)
+BHwBinder::BHwBinder() : mExtras(nullptr)
 {
 }
 
-bool BBinder::isBinderAlive() const
+bool BHwBinder::isBinderAlive() const
 {
     return true;
 }
 
-status_t BBinder::pingBinder()
+status_t BHwBinder::pingBinder()
 {
     return NO_ERROR;
 }
 
-const String16& BBinder::getInterfaceDescriptor() const
+const String16& BHwBinder::getInterfaceDescriptor() const
 {
     // This is a local static rather than a global static,
     // to avoid static initializer ordering issues.
     static String16 sEmptyDescriptor;
-    ALOGW("reached BBinder::getInterfaceDescriptor (this=%p)", this);
+    ALOGW("reached BHwBinder::getInterfaceDescriptor (this=%p)", this);
     return sEmptyDescriptor;
 }
 
-status_t BBinder::transact(
+status_t BHwBinder::transact(
     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags, TransactCallback callback)
 {
     data.setDataPosition(0);
@@ -122,26 +122,26 @@
     return err;
 }
 
-status_t BBinder::linkToDeath(
+status_t BHwBinder::linkToDeath(
     const sp<DeathRecipient>& /*recipient*/, void* /*cookie*/,
     uint32_t /*flags*/)
 {
     return INVALID_OPERATION;
 }
 
-status_t BBinder::unlinkToDeath(
+status_t BHwBinder::unlinkToDeath(
     const wp<DeathRecipient>& /*recipient*/, void* /*cookie*/,
     uint32_t /*flags*/, wp<DeathRecipient>* /*outRecipient*/)
 {
     return INVALID_OPERATION;
 }
 
-status_t BBinder::dump(int /*fd*/, const Vector<String16>& /*args*/)
+status_t BHwBinder::dump(int /*fd*/, const Vector<String16>& /*args*/)
 {
     return NO_ERROR;
 }
 
-void BBinder::attachObject(
+void BHwBinder::attachObject(
     const void* objectID, void* object, void* cleanupCookie,
     object_cleanup_func func)
 {
@@ -163,7 +163,7 @@
     e->mObjects.attach(objectID, object, cleanupCookie, func);
 }
 
-void* BBinder::findObject(const void* objectID) const
+void* BHwBinder::findObject(const void* objectID) const
 {
     Extras* e = mExtras.load(std::memory_order_acquire);
     if (!e) return NULL;
@@ -172,7 +172,7 @@
     return e->mObjects.find(objectID);
 }
 
-void BBinder::detachObject(const void* objectID)
+void BHwBinder::detachObject(const void* objectID)
 {
     Extras* e = mExtras.load(std::memory_order_acquire);
     if (!e) return;
@@ -181,19 +181,19 @@
     e->mObjects.detach(objectID);
 }
 
-BBinder* BBinder::localBinder()
+BHwBinder* BHwBinder::localBinder()
 {
     return this;
 }
 
-BBinder::~BBinder()
+BHwBinder::~BHwBinder()
 {
     Extras* e = mExtras.load(std::memory_order_relaxed);
     if (e) delete e;
 }
 
 
-status_t BBinder::onTransact(
+status_t BHwBinder::onTransact(
     uint32_t code, const Parcel& data, Parcel* reply, uint32_t /*flags*/, TransactCallback callback)
 {
     switch (code) {
