diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
index ee5bda3..3a4aaa7 100644
--- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
+++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java
@@ -28,7 +28,6 @@
 import android.net.NetworkRequest;
 import android.net.metrics.ConnectStats;
 import android.net.metrics.DnsEvent;
-import android.net.metrics.INetdEventListener;
 import android.net.metrics.NetworkMetrics;
 import android.net.metrics.WakeupEvent;
 import android.net.metrics.WakeupStats;
@@ -44,6 +43,7 @@
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.RingBuffer;
 import com.android.internal.util.TokenBucket;
+import com.android.net.module.util.BaseNetdEventListener;
 import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent;
 
 import java.io.PrintWriter;
@@ -54,7 +54,7 @@
 /**
  * Implementation of the INetdEventListener interface.
  */
-public class NetdEventListenerService extends INetdEventListener.Stub {
+public class NetdEventListenerService extends BaseNetdEventListener {
 
     public static final String SERVICE_NAME = "netd_listener";
 
@@ -208,15 +208,18 @@
     // Called concurrently by multiple binder threads.
     // This method must not block or perform long-running operations.
     public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs,
-            String hostname, String[] ipAddresses, int ipAddressesCount, int uid)
-            throws RemoteException {
+            String hostname, String[] ipAddresses, int ipAddressesCount, int uid) {
         long timestamp = System.currentTimeMillis();
         getMetricsForNetwork(timestamp, netId).addDnsResult(eventType, returnCode, latencyMs);
 
         for (INetdEventCallback callback : mNetdEventCallbackList) {
             if (callback != null) {
-                callback.onDnsEvent(netId, eventType, returnCode, hostname, ipAddresses,
-                        ipAddressesCount, timestamp, uid);
+                try {
+                    callback.onDnsEvent(netId, eventType, returnCode, hostname, ipAddresses,
+                            ipAddressesCount, timestamp, uid);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
             }
         }
     }
@@ -225,11 +228,14 @@
     // Called concurrently by multiple binder threads.
     // This method must not block or perform long-running operations.
     public synchronized void onNat64PrefixEvent(int netId,
-            boolean added, String prefixString, int prefixLength)
-            throws RemoteException {
+            boolean added, String prefixString, int prefixLength) {
         for (INetdEventCallback callback : mNetdEventCallbackList) {
             if (callback != null) {
-                callback.onNat64PrefixEvent(netId, added, prefixString, prefixLength);
+                try {
+                    callback.onNat64PrefixEvent(netId, added, prefixString, prefixLength);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
             }
         }
     }
@@ -238,11 +244,14 @@
     // Called concurrently by multiple binder threads.
     // This method must not block or perform long-running operations.
     public synchronized void onPrivateDnsValidationEvent(int netId,
-            String ipAddress, String hostname, boolean validated)
-            throws RemoteException {
+            String ipAddress, String hostname, boolean validated) {
         for (INetdEventCallback callback : mNetdEventCallbackList) {
             if (callback != null) {
-                callback.onPrivateDnsValidationEvent(netId, ipAddress, hostname, validated);
+                try {
+                    callback.onPrivateDnsValidationEvent(netId, ipAddress, hostname, validated);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
             }
         }
     }
@@ -251,13 +260,17 @@
     // Called concurrently by multiple binder threads.
     // This method must not block or perform long-running operations.
     public synchronized void onConnectEvent(int netId, int error, int latencyMs, String ipAddr,
-            int port, int uid) throws RemoteException {
+            int port, int uid) {
         long timestamp = System.currentTimeMillis();
         getMetricsForNetwork(timestamp, netId).addConnectResult(error, latencyMs, ipAddr);
 
         for (INetdEventCallback callback : mNetdEventCallbackList) {
             if (callback != null) {
-                callback.onConnectEvent(ipAddr, port, timestamp, uid);
+                try {
+                    callback.onConnectEvent(ipAddr, port, timestamp, uid);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
             }
         }
     }
@@ -315,7 +328,7 @@
     }
 
     @Override
-    public int getInterfaceVersion() throws RemoteException {
+    public int getInterfaceVersion() {
         return this.VERSION;
     }
 
