diff --git a/staticlibs/Android.bp b/staticlibs/Android.bp
index 03296e7..a3bfbce 100644
--- a/staticlibs/Android.bp
+++ b/staticlibs/Android.bp
@@ -60,9 +60,6 @@
         "//packages/modules/CaptivePortalLogin",
         "//frameworks/libs/net/common/tests:__subpackages__",
   ],
-  static_libs: [
-      "net-utils-framework-common",
-  ],
   libs: [
       "androidx.annotation_annotation",
   ],
@@ -149,7 +146,6 @@
         "//packages/modules/NetworkStack:__subpackages__",
         "//packages/modules/CaptivePortalLogin",
         "//frameworks/libs/net/common/tests:__subpackages__",
-        "//frameworks/libs/net/common/device",
         "//packages/modules/Wifi/framework/tests:__subpackages__",
     ]
 }
diff --git a/staticlibs/device/com/android/net/module/util/Ipv6Utils.java b/staticlibs/device/com/android/net/module/util/Ipv6Utils.java
deleted file mode 100644
index 73c2431..0000000
--- a/staticlibs/device/com/android/net/module/util/Ipv6Utils.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util;
-
-import static android.system.OsConstants.IPPROTO_ICMPV6;
-
-import static com.android.net.module.util.IpUtils.icmpv6Checksum;
-import static com.android.net.module.util.NetworkStackConstants.ETHER_TYPE_IPV6;
-import static com.android.net.module.util.NetworkStackConstants.ICMPV6_NEIGHBOR_ADVERTISEMENT;
-import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_ADVERTISEMENT;
-import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ROUTER_SOLICITATION;
-
-import android.net.MacAddress;
-
-import com.android.net.module.util.structs.EthernetHeader;
-import com.android.net.module.util.structs.Icmpv6Header;
-import com.android.net.module.util.structs.Ipv6Header;
-import com.android.net.module.util.structs.NaHeader;
-import com.android.net.module.util.structs.RaHeader;
-import com.android.net.module.util.structs.RsHeader;
-
-import java.net.Inet6Address;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Utilities for IPv6 packets.
- */
-public class Ipv6Utils {
-    /**
-     * Build a generic ICMPv6 packet(e.g., packet used in the neighbor discovery protocol).
-     */
-    public static ByteBuffer buildIcmpv6Packet(final MacAddress srcMac, final MacAddress dstMac,
-            final Inet6Address srcIp, final Inet6Address dstIp, short type, short code,
-            final ByteBuffer... options) {
-        final int etherHeaderLen = Struct.getSize(EthernetHeader.class);
-        final int ipv6HeaderLen = Struct.getSize(Ipv6Header.class);
-        final int icmpv6HeaderLen = Struct.getSize(Icmpv6Header.class);
-        int payloadLen = 0;
-        for (ByteBuffer option: options) {
-            payloadLen += option.limit();
-        }
-        final ByteBuffer packet = ByteBuffer.allocate(etherHeaderLen + ipv6HeaderLen
-                + icmpv6HeaderLen + payloadLen);
-        final EthernetHeader ethHeader =
-                new EthernetHeader(dstMac, srcMac, (short) ETHER_TYPE_IPV6);
-        final Ipv6Header ipv6Header =
-                new Ipv6Header((int) 0x60000000 /* version, traffic class, flowlabel */,
-                icmpv6HeaderLen + payloadLen /* payload length */,
-                (byte) IPPROTO_ICMPV6 /* next header */, (byte) 0xff /* hop limit */, srcIp, dstIp);
-        final Icmpv6Header icmpv6Header = new Icmpv6Header(type, code, (short) 0 /* checksum */);
-
-        ethHeader.writeToByteBuffer(packet);
-        ipv6Header.writeToByteBuffer(packet);
-        icmpv6Header.writeToByteBuffer(packet);
-        for (ByteBuffer option : options) {
-            packet.put(option);
-            // in case option might be reused by caller, restore the position and
-            // limit of bytebuffer.
-            option.clear();
-        }
-        packet.flip();
-
-        // Populate the ICMPv6 checksum field.
-        packet.putShort(etherHeaderLen + ipv6HeaderLen + 2, icmpv6Checksum(packet,
-                etherHeaderLen /* ipOffset */,
-                (int) (etherHeaderLen + ipv6HeaderLen) /* transportOffset */,
-                (short) (icmpv6HeaderLen + payloadLen) /* transportLen */));
-        return packet;
-    }
-
-    /**
-     * Build the ICMPv6 packet payload including payload header and specific options.
-     */
-    private static ByteBuffer[] buildIcmpv6Payload(final ByteBuffer payloadHeader,
-            final ByteBuffer... options) {
-        final ByteBuffer[] payload = new ByteBuffer[options.length + 1];
-        payload[0] = payloadHeader;
-        System.arraycopy(options, 0, payload, 1, options.length);
-        return payload;
-    }
-
-    /**
-     * Build an ICMPv6 Router Advertisement packet from the required specified parameters.
-     */
-    public static ByteBuffer buildRaPacket(final MacAddress srcMac, final MacAddress dstMac,
-            final Inet6Address srcIp, final Inet6Address dstIp, final byte flags,
-            final int lifetime, final long reachableTime, final long retransTimer,
-            final ByteBuffer... options) {
-        final RaHeader raHeader = new RaHeader((byte) 0 /* hopLimit, unspecified */,
-                flags, lifetime, reachableTime, retransTimer);
-        final ByteBuffer[] payload = buildIcmpv6Payload(
-                ByteBuffer.wrap(raHeader.writeToBytes(ByteOrder.BIG_ENDIAN)), options);
-        return buildIcmpv6Packet(srcMac, dstMac, srcIp, dstIp,
-                (byte) ICMPV6_ROUTER_ADVERTISEMENT /* type */, (byte) 0 /* code */, payload);
-    }
-
-    /**
-     * Build an ICMPv6 Neighbor Advertisement packet from the required specified parameters.
-     */
-    public static ByteBuffer buildNaPacket(final MacAddress srcMac, final MacAddress dstMac,
-            final Inet6Address srcIp, final Inet6Address dstIp, final int flags,
-            final Inet6Address target, final ByteBuffer... options) {
-        final NaHeader naHeader = new NaHeader(flags, target);
-        final ByteBuffer[] payload = buildIcmpv6Payload(
-                ByteBuffer.wrap(naHeader.writeToBytes(ByteOrder.BIG_ENDIAN)), options);
-        return buildIcmpv6Packet(srcMac, dstMac, srcIp, dstIp,
-                (byte) ICMPV6_NEIGHBOR_ADVERTISEMENT /* type */, (byte) 0 /* code */, payload);
-    }
-
-    /**
-     * Build an ICMPv6 Router Solicitation packet from the required specified parameters.
-     */
-    public static ByteBuffer buildRsPacket(final MacAddress srcMac, final MacAddress dstMac,
-            final Inet6Address srcIp, final Inet6Address dstIp, final ByteBuffer... options) {
-        final RsHeader rsHeader = new RsHeader((int) 0 /* reserved */);
-        final ByteBuffer[] payload = buildIcmpv6Payload(
-                ByteBuffer.wrap(rsHeader.writeToBytes(ByteOrder.BIG_ENDIAN)), options);
-        return buildIcmpv6Packet(srcMac, dstMac, srcIp, dstIp,
-                (byte) ICMPV6_ROUTER_SOLICITATION /* type */, (byte) 0 /* code */, payload);
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/EthernetHeader.java b/staticlibs/device/com/android/net/module/util/structs/EthernetHeader.java
deleted file mode 100644
index d895cfa..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/EthernetHeader.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import android.net.MacAddress;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-/**
- * L2 ethernet header as per IEEE 802.3. Does not include a 802.1Q tag.
- *
- * 0                   1
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |          Destination          |
- * +-                             -+
- * |            Ethernet           |
- * +-                             -+
- * |            Address            |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |             Source            |
- * +-                             -+
- * |            Ethernet           |
- * +-                             -+
- * |            Address            |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1|
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-public class EthernetHeader extends Struct {
-    @Field(order = 0, type = Type.EUI48)
-    public final MacAddress dstMac;
-    @Field(order = 1, type = Type.EUI48)
-    public final MacAddress srcMac;
-    @Field(order = 2, type = Type.U16)
-    public final int etherType;
-
-    public EthernetHeader(final MacAddress dstMac, final MacAddress srcMac,
-            final int etherType) {
-        this.dstMac = dstMac;
-        this.srcMac = srcMac;
-        this.etherType = etherType;
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/Icmpv6Header.java b/staticlibs/device/com/android/net/module/util/structs/Icmpv6Header.java
deleted file mode 100644
index c82ae02..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/Icmpv6Header.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-/**
- * ICMPv6 header as per https://tools.ietf.org/html/rfc4443.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |     Code      |          Checksum             |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-public class Icmpv6Header extends Struct {
-    @Field(order = 0, type = Type.U8)
-    public short type;
-    @Field(order = 1, type = Type.U8)
-    public short code;
-    @Field(order = 2, type = Type.S16)
-    public short checksum;
-
-    public Icmpv6Header(final short type, final short code, final short checksum) {
-        this.type = type;
-        this.code = code;
-        this.checksum = checksum;
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/Ipv6Header.java b/staticlibs/device/com/android/net/module/util/structs/Ipv6Header.java
deleted file mode 100644
index 3ad8157..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/Ipv6Header.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-import java.net.Inet6Address;
-
-/**
- * L3 IPv6 header as per https://tools.ietf.org/html/rfc8200.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |Version| Traffic Class |           Flow Label                  |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |         Payload Length        |  Next Header  |   Hop Limit   |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +                         Source Address                        +
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +                      Destination Address                      +
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-public class Ipv6Header extends Struct {
-    @Field(order = 0, type = Type.S32)
-    public int vtf;
-    @Field(order = 1, type = Type.U16)
-    public int length;
-    @Field(order = 2, type = Type.S8)
-    public byte nextHeader;
-    @Field(order = 3, type = Type.U8)
-    public short hopLimit;
-    @Field(order = 4, type = Type.Ipv6Address)
-    public Inet6Address srcIp;
-    @Field(order = 5, type = Type.Ipv6Address)
-    public Inet6Address dstIp;
-
-    public Ipv6Header(final int vtf, final int length, final byte nextHeader, final short hopLimit,
-            final Inet6Address srcIp, final Inet6Address dstIp) {
-        this.vtf = vtf;
-        this.length = length;
-        this.nextHeader = nextHeader;
-        this.hopLimit = hopLimit;
-        this.srcIp = srcIp;
-        this.dstIp = dstIp;
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/LlaOption.java b/staticlibs/device/com/android/net/module/util/structs/LlaOption.java
deleted file mode 100644
index 2cdeefb..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/LlaOption.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import android.net.MacAddress;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * ICMPv6 source/target link-layer address option, as per https://tools.ietf.org/html/rfc4861.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |    Length     |    Link-Layer Address ...
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-public class LlaOption extends Struct {
-    @Field(order = 0, type = Type.S8)
-    // 1 for Source Link-layer Address; 2 for Target Link-layer Address.
-    public final byte type;
-    @Field(order = 1, type = Type.S8)
-    public final byte length; // Length in 8-byte units
-    @Field(order = 2, type = Type.EUI48)
-    public final MacAddress linkLayerAddress;
-
-    public LlaOption(final byte type, final byte length, final MacAddress linkLayerAddress) {
-        this.type = type;
-        this.length = length;
-        this.linkLayerAddress = linkLayerAddress;
-    }
-
-    /**
-     * Build a target link-layer address option from the required specified parameters.
-     */
-    public static ByteBuffer build(final byte type, final MacAddress linkLayerAddress) {
-        final LlaOption option = new LlaOption(type, (byte) 1 /* option len */, linkLayerAddress);
-        return ByteBuffer.wrap(option.writeToBytes(ByteOrder.nativeOrder()));
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/MtuOption.java b/staticlibs/device/com/android/net/module/util/structs/MtuOption.java
deleted file mode 100644
index a35b576..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/MtuOption.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_MTU;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * ICMPv6 MTU option, as per https://tools.ietf.org/html/rfc4861.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |    Length     |           Reserved            |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                              MTU                              |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-public class MtuOption extends Struct {
-    @Field(order = 0, type = Type.S8)
-    public final byte type;
-    @Field(order = 1, type = Type.S8)
-    public final byte length; // Length in 8-byte units
-    @Field(order = 2, type = Type.S16)
-    public final short reserved;
-    @Field(order = 3, type = Type.U32)
-    public final long mtu;
-
-    public MtuOption(final byte type, final byte length, final short reserved,
-            final long mtu) {
-        this.type = type;
-        this.length = length;
-        this.reserved = reserved;
-        this.mtu = mtu;
-    }
-
-    /**
-     * Build a MTU option from the required specified parameters.
-     */
-    public static ByteBuffer build(final long mtu) {
-        final MtuOption option = new MtuOption((byte) ICMPV6_ND_OPTION_MTU,
-                (byte) 1 /* option len */, (short) 0 /* reserved */, mtu);
-        return ByteBuffer.wrap(option.writeToBytes(ByteOrder.nativeOrder()));
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/NaHeader.java b/staticlibs/device/com/android/net/module/util/structs/NaHeader.java
deleted file mode 100644
index 8101b06..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/NaHeader.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-import java.net.Inet6Address;
-
-/**
- * ICMPv6 Neighbor Advertisement header, follow [Icmpv6Header], as per
- * https://tools.ietf.org/html/rfc4861. This does not contain any option.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |     Code      |          Checksum             |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |R|S|O|                     Reserved                            |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +                       Target Address                          +
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |   Options ...
- * +-+-+-+-+-+-+-+-+-+-+-+-
- */
-public class NaHeader extends Struct {
-    @Field(order = 0, type = Type.S32)
-    public int flags; // Router flag, Solicited flag, Override flag and 29 Reserved bits.
-    @Field(order = 1, type = Type.Ipv6Address)
-    public Inet6Address target;
-
-    public NaHeader(final int flags, final Inet6Address target) {
-        this.flags = flags;
-        this.target = target;
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/PrefixInformationOption.java b/staticlibs/device/com/android/net/module/util/structs/PrefixInformationOption.java
deleted file mode 100644
index 7dc0192..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/PrefixInformationOption.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_PIO;
-
-import android.annotation.NonNull;
-import android.net.IpPrefix;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * ICMPv6 prefix information option, as per https://tools.ietf.org/html/rfc4861.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |    Length     | Prefix Length |L|A| Reserved1 |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                         Valid Lifetime                        |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                       Preferred Lifetime                      |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                           Reserved2                           |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +                            Prefix                             +
- * |                                                               |
- * +                                                               +
- * |                                                               |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-public class PrefixInformationOption extends Struct {
-    @Field(order = 0, type = Type.S8)
-    public final byte type;
-    @Field(order = 1, type = Type.S8)
-    public final byte length; // Length in 8-byte units
-    @Field(order = 2, type = Type.S8)
-    public final byte prefixLen;
-    @Field(order = 3, type = Type.S8)
-    // On-link flag, Autonomous address configuration flag, 6-reserved bits
-    public final byte flags;
-    @Field(order = 4, type = Type.U32)
-    public final long validLifetime;
-    @Field(order = 5, type = Type.U32)
-    public final long preferredLifetime;
-    @Field(order = 6, type = Type.S32)
-    public final int reserved;
-    @Field(order = 7, type = Type.ByteArray, arraysize = 16)
-    public final byte[] prefix;
-
-    public PrefixInformationOption(final byte type, final byte length, final byte prefixLen,
-            final byte flags, final long validLifetime, final long preferredLifetime,
-            final int reserved, @NonNull final byte[] prefix) {
-        this.type = type;
-        this.length = length;
-        this.prefixLen = prefixLen;
-        this.flags = flags;
-        this.validLifetime = validLifetime;
-        this.preferredLifetime = preferredLifetime;
-        this.reserved = reserved;
-        this.prefix = prefix;
-    }
-
-    /**
-     * Build a Prefix Information option from the required specified parameters.
-     */
-    public static ByteBuffer build(final IpPrefix prefix, final byte flags,
-            final long validLifetime, final long preferredLifetime) {
-        final PrefixInformationOption option = new PrefixInformationOption(
-                (byte) ICMPV6_ND_OPTION_PIO, (byte) 4 /* option len */,
-                (byte) prefix.getPrefixLength(), flags, validLifetime, preferredLifetime,
-                (int) 0, prefix.getRawAddress());
-        return ByteBuffer.wrap(option.writeToBytes(ByteOrder.nativeOrder()));
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/RaHeader.java b/staticlibs/device/com/android/net/module/util/structs/RaHeader.java
deleted file mode 100644
index 31a5cb7..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/RaHeader.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-/**
- * ICMPv6 Router Advertisement header, follow [Icmpv6Header], as per
- * https://tools.ietf.org/html/rfc4861. This does not contain any option.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |     Code      |          Checksum             |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Cur Hop Limit |M|O|  Reserved |       Router Lifetime         |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                         Reachable Time                        |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                          Retrans Timer                        |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |   Options ...
- * +-+-+-+-+-+-+-+-+-+-+-+-
- */
-public class RaHeader extends Struct {
-    @Field(order = 0, type = Type.S8)
-    public final byte hopLimit;
-    // "Managed address configuration", "Other configuration" bits, and 6 reserved bits
-    @Field(order = 1, type = Type.S8)
-    public final byte flags;
-    @Field(order = 2, type = Type.U16)
-    public final int lifetime;
-    @Field(order = 3, type = Type.U32)
-    public final long reachableTime;
-    @Field(order = 4, type = Type.U32)
-    public final long retransTimer;
-
-    public RaHeader(final byte hopLimit, final byte flags, final int lifetime,
-            final long reachableTime, final long retransTimer) {
-        this.hopLimit = hopLimit;
-        this.flags = flags;
-        this.lifetime = lifetime;
-        this.reachableTime = reachableTime;
-        this.retransTimer = retransTimer;
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/RdnssOption.java b/staticlibs/device/com/android/net/module/util/structs/RdnssOption.java
deleted file mode 100644
index de55e66..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/RdnssOption.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import static com.android.net.module.util.NetworkStackConstants.ICMPV6_ND_OPTION_RDNSS;
-
-import android.net.InetAddresses;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-import java.net.Inet6Address;
-import java.nio.ByteBuffer;
-
-/**
- * IPv6 RA recursive DNS server option, as per https://tools.ietf.org/html/rfc8106.
- * This should be followed by a series of DNSv6 server addresses.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |     Length    |           Reserved            |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                           Lifetime                            |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                                                               |
- * :            Addresses of IPv6 Recursive DNS Servers            :
- * |                                                               |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-public class RdnssOption extends Struct {
-    @Field(order = 0, type = Type.S8)
-    public final byte type;
-    @Field(order = 1, type = Type.S8)
-    public final byte length; // Length in 8-byte units
-    @Field(order = 2, type = Type.S16)
-    public final short reserved;
-    @Field(order = 3, type = Type.U32)
-    public final long lifetime;
-
-    public RdnssOption(final byte type, final byte length, final short reserved,
-            final long lifetime) {
-        this.type = type;
-        this.length = length;
-        this.reserved = reserved;
-        this.lifetime = lifetime;
-    }
-
-    /**
-     * Build a RDNSS option from the required specified Inet6Address parameters.
-     */
-    public static ByteBuffer build(final long lifetime, final Inet6Address... servers) {
-        final byte length = (byte) (1 + 2 * servers.length);
-        final RdnssOption option = new RdnssOption((byte) ICMPV6_ND_OPTION_RDNSS,
-                length, (short) 0, lifetime);
-        final ByteBuffer buffer = ByteBuffer.allocate(length * 8);
-        option.writeToByteBuffer(buffer);
-        for (Inet6Address server : servers) {
-            buffer.put(server.getAddress());
-        }
-        buffer.flip();
-        return buffer;
-    }
-
-    /**
-     * Build a RDNSS option from the required specified String parameters.
-     */
-    public static ByteBuffer build(final long lifetime, final String... servers) {
-        final Inet6Address[] serverArray = new Inet6Address[servers.length];
-        for (int i = 0; i < servers.length; i++) {
-            serverArray[i] = (Inet6Address) InetAddresses.parseNumericAddress(servers[i]);
-        }
-        return build(lifetime, serverArray);
-    }
-}
diff --git a/staticlibs/device/com/android/net/module/util/structs/RsHeader.java b/staticlibs/device/com/android/net/module/util/structs/RsHeader.java
deleted file mode 100644
index 0b51ff2..0000000
--- a/staticlibs/device/com/android/net/module/util/structs/RsHeader.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2021 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.net.module.util.structs;
-
-import com.android.net.module.util.Struct;
-import com.android.net.module.util.Struct.Field;
-import com.android.net.module.util.Struct.Type;
-
-/**
- * ICMPv6 Router Solicitation header, follow [Icmpv6Header], as per
- * https://tools.ietf.org/html/rfc4861. This does not contain any option.
- *
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |     Type      |     Code      |          Checksum             |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                            Reserved                           |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |   Options ...
- * +-+-+-+-+-+-+-+-+-+-+-+-
- */
-public class RsHeader extends Struct {
-    @Field(order = 0, type = Type.S32)
-    public final int reserved;
-
-    public RsHeader(final int reserved) {
-        this.reserved = reserved;
-    }
-}
