diff --git a/apishim/29/com/android/networkstack/apishim/api29/EthernetManagerShimImpl.java b/apishim/29/com/android/networkstack/apishim/api29/EthernetManagerShimImpl.java
deleted file mode 100644
index 2f5fb7d..0000000
--- a/apishim/29/com/android/networkstack/apishim/api29/EthernetManagerShimImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2022 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.
- */
-
-package com.android.networkstack.apishim.api29;
-
-import android.content.Context;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.networkstack.apishim.common.EthernetManagerShim;
-
-/**
- * Implementation of {@link EthernetManagerShim} for API 29.
- *
- * Cannot actually import EthernetManager because that only became @SystemApi in API 30.
- */
-@RequiresApi(Build.VERSION_CODES.Q)
-public class EthernetManagerShimImpl implements EthernetManagerShim {
-    /**
-     * Get a new instance of {@link EthernetManagerShim}.
-     */
-    public static EthernetManagerShim newInstance(Context context) {
-        return new EthernetManagerShimImpl();
-    }
-}
diff --git a/apishim/31/com/android/networkstack/apishim/api31/EthernetManagerShimImpl.java b/apishim/31/com/android/networkstack/apishim/api31/EthernetManagerShimImpl.java
deleted file mode 100644
index 2c93d7c..0000000
--- a/apishim/31/com/android/networkstack/apishim/api31/EthernetManagerShimImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2022 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.
- */
-
-package com.android.networkstack.apishim.api31;
-
-import static com.android.modules.utils.build.SdkLevel.isAtLeastS;
-
-import android.content.Context;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.networkstack.apishim.common.EthernetManagerShim;
-
-/**
- * Implementation of {@link EthernetManagerShim} for API 31.
- *
- * Doesn't have any methods, but must exist because the stable shim API level is currently 31.
- * TODO: delete when the stable shim API level becomes 33.
- */
-@RequiresApi(Build.VERSION_CODES.S)
-public class EthernetManagerShimImpl
-        extends com.android.networkstack.apishim.api29.EthernetManagerShimImpl {
-    /**
-     * Get a new instance of {@link EthernetManagerShim}.
-     */
-    @RequiresApi(Build.VERSION_CODES.Q)
-    public static EthernetManagerShim newInstance(Context context) {
-        if (!isAtLeastS()) {
-            return com.android.networkstack.apishim.api29.EthernetManagerShimImpl
-                    .newInstance(context);
-        }
-        return new EthernetManagerShimImpl();
-    }
-}
diff --git a/apishim/33/com/android/networkstack/apishim/api33/EthernetManagerShimImpl.java b/apishim/33/com/android/networkstack/apishim/api33/EthernetManagerShimImpl.java
deleted file mode 100644
index 5bd6487..0000000
--- a/apishim/33/com/android/networkstack/apishim/api33/EthernetManagerShimImpl.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2022 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.
- */
-
-package com.android.networkstack.apishim.api33;
-
-import static com.android.modules.utils.build.SdkLevel.isAtLeastT;
-
-import android.content.Context;
-import android.net.EthernetManager;
-import android.os.Build;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-
-import com.android.networkstack.apishim.common.EthernetManagerShim;
-
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executor;
-
-/**
- * Implementation of {@link EthernetManagerShim} for API 33.
- */
-@RequiresApi(Build.VERSION_CODES.TIRAMISU)
-public class EthernetManagerShimImpl
-        extends com.android.networkstack.apishim.api31.EthernetManagerShimImpl {
-
-    protected final EthernetManager mEm;
-
-    // This is needed because callers of the shim cannot use EthernetManager.InterfaceStateListener,
-    // they need to use EthernetManagerShim.InterfaceStateListener instead. But when actually
-    // registering a callback, the callback type passed to EthernetManager must be a real
-    // listener, not a shim. This map keeps track of the mapping between the two objects so that
-    // when a caller calls removeInterfaceStateListener with a shim listener, this class knows what
-    // real listener to pass to EthernetManager.
-    private final ConcurrentHashMap<InterfaceStateListener, EthernetManager.InterfaceStateListener>
-            mListeners = new ConcurrentHashMap<>();
-
-    protected EthernetManagerShimImpl(Context context) {
-        mEm = context.getSystemService(EthernetManager.class);
-    }
-
-    /**
-     * Get a new instance of {@link EthernetManagerShim}.
-     */
-    @RequiresApi(Build.VERSION_CODES.Q)
-    public static EthernetManagerShim newInstance(Context context) {
-        if (!isAtLeastT()) {
-            return com.android.networkstack.apishim.api31.EthernetManagerShimImpl
-                    .newInstance(context);
-        }
-        return new EthernetManagerShimImpl(context);
-    }
-
-    @Override
-    public void addInterfaceStateListener(@NonNull Executor executor,
-            @NonNull InterfaceStateListener listener) {
-        final EthernetManager.InterfaceStateListener wrapper = (a, b, c, d) -> {
-            listener.onInterfaceStateChanged(a, b, c, d);
-        };
-        // EthernetManager#addInterfaceStateListener will allow registering the same listener twice,
-        // but this does not seem very useful and is difficult to support with the wrapper scheme
-        // used by this shim. Don't allow it.
-        final EthernetManager.InterfaceStateListener existing =
-                mListeners.putIfAbsent(listener, wrapper);
-        if (existing != null) {
-            throw new IllegalStateException("Attempt to register duplicate listener");
-        }
-        mEm.addInterfaceStateListener(executor, wrapper);
-    }
-
-    @Override
-    public void removeInterfaceStateListener(@NonNull InterfaceStateListener listener) {
-        final EthernetManager.InterfaceStateListener wrapper = mListeners.remove(listener);
-        if (wrapper != null) {
-            mEm.removeInterfaceStateListener(wrapper);
-        }
-    }
-
-    @Override
-    // This method existed in R and S, but as @TestApi, so should not appear in the shims before T
-    // because otherwise it could be used by production code on R and S.
-    public void setIncludeTestInterfaces(boolean include) {
-        mEm.setIncludeTestInterfaces(include);
-    }
-
-    @Override
-    @NonNull
-    public List<String> getInterfaceList() {
-        return mEm.getInterfaceList();
-    }
-}
diff --git a/apishim/34/com/android/networkstack/apishim/EthernetManagerShimImpl.java b/apishim/34/com/android/networkstack/apishim/EthernetManagerShimImpl.java
deleted file mode 100644
index e9a33a1..0000000
--- a/apishim/34/com/android/networkstack/apishim/EthernetManagerShimImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2022 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.
- */
-
-package com.android.networkstack.apishim;
-
-import android.content.Context;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
-
-import com.android.networkstack.apishim.common.EthernetManagerShim;
-
-/**
- * Implementation of {@link EthernetManagerShim} for API 34.
- */
-// TODO: when available in all active branches: @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
-@RequiresApi(Build.VERSION_CODES.CUR_DEVELOPMENT)
-public class EthernetManagerShimImpl
-        extends com.android.networkstack.apishim.api33.EthernetManagerShimImpl {
-    protected EthernetManagerShimImpl(Context context) {
-        super(context);
-    }
-}
diff --git a/apishim/common/com/android/networkstack/apishim/common/EthernetManagerShim.java b/apishim/common/com/android/networkstack/apishim/common/EthernetManagerShim.java
deleted file mode 100644
index 02a08de..0000000
--- a/apishim/common/com/android/networkstack/apishim/common/EthernetManagerShim.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2022 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.
- */
-
-package com.android.networkstack.apishim.common;
-
-import android.net.IpConfiguration;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/** API shim for EthernetManager */
-public interface EthernetManagerShim {
-    int STATE_ABSENT = 0;
-    int STATE_LINK_DOWN = 1;
-    int STATE_LINK_UP = 2;
-    int ROLE_NONE = 0;
-    int ROLE_CLIENT = 1;
-    int ROLE_SERVER = 2;
-
-    /** Shim for EthernetManager#InterfaceStateListener. */
-    interface InterfaceStateListener {
-        void onInterfaceStateChanged(@NonNull String iface, int state, int role,
-                @Nullable IpConfiguration configuration);
-    }
-
-    /** Shim for EthernetManager#addInterfaceStateListener */
-    default void addInterfaceStateListener(@NonNull Executor executor,
-            @NonNull InterfaceStateListener listener) throws UnsupportedApiLevelException {
-        throw new UnsupportedApiLevelException();
-    }
-
-    /** Shim for EthernetManager#removeInterfaceStateListener */
-    default void removeInterfaceStateListener(@NonNull InterfaceStateListener listener)
-            throws UnsupportedApiLevelException {
-        throw new UnsupportedApiLevelException("Not supported until API 33");
-    }
-
-    /** Shim for EthernetManager#setIncludeTestInterfaces */
-    default void setIncludeTestInterfaces(boolean include) throws UnsupportedApiLevelException {
-        throw new UnsupportedApiLevelException("Not supported until API 30");
-    }
-
-    /** Shim for EthernetManager#getInterfaceList */
-    default List<String> getInterfaceList() throws UnsupportedApiLevelException {
-        throw new UnsupportedApiLevelException("Not supported until API 33");
-    }
-}
