diff --git a/server/NetworkController.cpp b/server/NetworkController.cpp
index ed5156f..ac709a0 100644
--- a/server/NetworkController.cpp
+++ b/server/NetworkController.cpp
@@ -149,12 +149,12 @@
 }
 
 unsigned NetworkController::getDefaultNetwork() const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return mDefaultNetId;
 }
 
 int NetworkController::setDefaultNetwork(unsigned netId) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
 
     if (netId == mDefaultNetId) {
         return 0;
@@ -241,14 +241,14 @@
 }
 
 uint32_t NetworkController::getNetworkForDns(unsigned* netId, uid_t uid) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return getNetworkForDnsLocked(netId, uid);
 }
 
 // Returns the NetId that a given UID would use if no network is explicitly selected. Specifically,
 // the VPN that applies to the UID if any; otherwise, the default network.
 unsigned NetworkController::getNetworkForUser(uid_t uid) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     if (VirtualNetwork* virtualNetwork = getVirtualNetworkForUserLocked(uid)) {
         return virtualNetwork->getNetId();
     }
@@ -278,13 +278,13 @@
 }
 
 unsigned NetworkController::getNetworkForConnect(uid_t uid) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return getNetworkForConnectLocked(uid);
 }
 
 void NetworkController::getNetworkContext(
         unsigned netId, uid_t uid, struct android_net_context* netcontext) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
 
     struct android_net_context nc = {
             .app_netid = netId,
@@ -341,12 +341,12 @@
 }
 
 unsigned NetworkController::getNetworkForInterface(const char* interface) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return getNetworkForInterfaceLocked(interface);
 }
 
 bool NetworkController::isVirtualNetwork(unsigned netId) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return isVirtualNetworkLocked(netId);
 }
 
@@ -382,7 +382,7 @@
 }
 
 int NetworkController::createPhysicalNetwork(unsigned netId, Permission permission) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     return createPhysicalNetworkLocked(netId, permission);
 }
 
@@ -391,7 +391,7 @@
         return -EINVAL;
     }
 
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     for (*pNetId = MIN_OEM_ID; *pNetId <= MAX_OEM_ID; (*pNetId)++) {
         if (!isValidNetworkLocked(*pNetId)) {
             break;
@@ -413,7 +413,7 @@
 }
 
 int NetworkController::createVirtualNetwork(unsigned netId, bool hasDns, bool secure) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
 
     if (!(MIN_NET_ID <= netId && netId <= MAX_NET_ID)) {
         ALOGE("invalid netId %u", netId);
@@ -433,7 +433,7 @@
 }
 
 int NetworkController::destroyNetwork(unsigned netId) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
 
     if (netId == LOCAL_NET_ID) {
         ALOGE("cannot destroy local network");
@@ -486,7 +486,7 @@
 }
 
 int NetworkController::addInterfaceToNetwork(unsigned netId, const char* interface) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
 
     if (!isValidNetworkLocked(netId)) {
         ALOGE("no such netId %u", netId);
@@ -513,7 +513,7 @@
 }
 
 int NetworkController::removeInterfaceFromNetwork(unsigned netId, const char* interface) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
 
     if (!isValidNetworkLocked(netId)) {
         ALOGE("no such netId %u", netId);
@@ -524,26 +524,26 @@
 }
 
 Permission NetworkController::getPermissionForUser(uid_t uid) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return getPermissionForUserLocked(uid);
 }
 
 void NetworkController::setPermissionForUsers(Permission permission,
                                               const std::vector<uid_t>& uids) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     for (uid_t uid : uids) {
         mUsers[uid] = permission;
     }
 }
 
 int NetworkController::checkUserNetworkAccess(uid_t uid, unsigned netId) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return checkUserNetworkAccessLocked(uid, netId);
 }
 
 int NetworkController::setPermissionForNetworks(Permission permission,
                                                 const std::vector<unsigned>& netIds) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     for (unsigned netId : netIds) {
         Network* network = getNetworkLocked(netId);
         if (!network) {
@@ -563,7 +563,7 @@
 }
 
 int NetworkController::addUsersToNetwork(unsigned netId, const UidRanges& uidRanges) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     Network* network = getNetworkLocked(netId);
     if (!network) {
         ALOGE("no such netId %u", netId);
@@ -580,7 +580,7 @@
 }
 
 int NetworkController::removeUsersFromNetwork(unsigned netId, const UidRanges& uidRanges) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     Network* network = getNetworkLocked(netId);
     if (!network) {
         ALOGE("no such netId %u", netId);
@@ -608,8 +608,7 @@
 }
 
 void NetworkController::addInterfaceAddress(unsigned ifIndex, const char* address) {
-    android::RWLock::AutoWLock lock(mRWLock);
-
+    ScopedWLock lock(mRWLock);
     if (ifIndex == 0) {
         ALOGE("Attempting to add address %s without ifindex", address);
         return;
@@ -619,7 +618,7 @@
 
 // Returns whether we should call SOCK_DESTROY on the removed address.
 bool NetworkController::removeInterfaceAddress(unsigned ifindex, const char* address) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     // First, update mAddressToIfindices map
     auto ifindicesIter = mAddressToIfindices.find(address);
     if (ifindicesIter == mAddressToIfindices.end()) {
@@ -660,24 +659,24 @@
 }
 
 bool NetworkController::canProtect(uid_t uid) const {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
     return canProtectLocked(uid);
 }
 
 void NetworkController::allowProtect(const std::vector<uid_t>& uids) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     mProtectableUsers.insert(uids.begin(), uids.end());
 }
 
 void NetworkController::denyProtect(const std::vector<uid_t>& uids) {
-    android::RWLock::AutoWLock lock(mRWLock);
+    ScopedWLock lock(mRWLock);
     for (uid_t uid : uids) {
         mProtectableUsers.erase(uid);
     }
 }
 
 void NetworkController::dump(DumpWriter& dw) {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
 
     dw.incIndent();
     dw.println("NetworkController");
@@ -782,7 +781,7 @@
 
 int NetworkController::modifyRoute(unsigned netId, const char* interface, const char* destination,
                                    const char* nexthop, bool add, bool legacy, uid_t uid) {
-    android::RWLock::AutoRLock lock(mRWLock);
+    ScopedRLock lock(mRWLock);
 
     if (!isValidNetworkLocked(netId)) {
         ALOGE("no such netId %u", netId);
