Remove the now unused vtable types. In particular,
 * SettableValue
 * ProxiedWithPresence
 * FieldEntry

PiperOrigin-RevId: 629363417
diff --git a/rust/BUILD b/rust/BUILD
index 21fe525..aff4d2b 100644
--- a/rust/BUILD
+++ b/rust/BUILD
@@ -54,7 +54,6 @@
     "repeated.rs",
     "shared.rs",
     "string.rs",
-    "vtable.rs",
     "map.rs",
     "proto_macro.rs",
 ]
diff --git a/rust/cpp.rs b/rust/cpp.rs
index 06b45f6..2ad2a4a 100644
--- a/rust/cpp.rs
+++ b/rust/cpp.rs
@@ -233,31 +233,8 @@
     write!(f, "{dbg_str}")
 }
 
-pub type MessagePresentMutData<'msg, T> = crate::vtable::RawVTableOptionalMutatorData<'msg, T>;
-pub type MessageAbsentMutData<'msg, T> = crate::vtable::RawVTableOptionalMutatorData<'msg, T>;
-pub type BytesPresentMutData<'msg> = crate::vtable::RawVTableOptionalMutatorData<'msg, [u8]>;
-pub type BytesAbsentMutData<'msg> = crate::vtable::RawVTableOptionalMutatorData<'msg, [u8]>;
-pub type InnerBytesMut<'msg> = crate::vtable::RawVTableMutator<'msg, [u8]>;
 pub type RawMapIter = UntypedMapIterator;
 
-#[derive(Debug)]
-pub struct MessageVTable {
-    pub getter: unsafe extern "C" fn(msg: RawMessage) -> RawMessage,
-    pub mut_getter: unsafe extern "C" fn(msg: RawMessage) -> RawMessage,
-    pub clearer: unsafe extern "C" fn(msg: RawMessage),
-}
-
-impl MessageVTable {
-    pub const fn new(
-        _private: Private,
-        getter: unsafe extern "C" fn(msg: RawMessage) -> RawMessage,
-        mut_getter: unsafe extern "C" fn(msg: RawMessage) -> RawMessage,
-        clearer: unsafe extern "C" fn(msg: RawMessage),
-    ) -> Self {
-        MessageVTable { getter, mut_getter, clearer }
-    }
-}
-
 /// The raw contents of every generated message.
 #[derive(Debug)]
 pub struct MessageInner {
diff --git a/rust/internal.rs b/rust/internal.rs
index d9fa408..f8118c8 100644
--- a/rust/internal.rs
+++ b/rust/internal.rs
@@ -13,10 +13,6 @@
 pub use paste::paste;
 
 pub use crate::r#enum::Enum;
-pub use crate::vtable::{
-    new_vtable_field_entry, ProxiedWithRawOptionalVTable, ProxiedWithRawVTable, RawVTableMutator,
-    RawVTableOptionalMutatorData,
-};
 pub use crate::ProtoStr;
 
 // TODO: Temporarily re-export these symbols which are now under
diff --git a/rust/map.rs b/rust/map.rs
index 3677936..f63aa3b 100644
--- a/rust/map.rs
+++ b/rust/map.rs
@@ -6,7 +6,7 @@
 // https://developers.google.com/open-source/licenses/bsd
 
 use crate::{
-    Mut, MutProxied, MutProxy, Proxied, SettableValue, View, ViewProxy,
+    Mut, MutProxied, MutProxy, Proxied, View, ViewProxy,
     __internal::Private,
     __runtime::{InnerMap, InnerMapMut, RawMap, RawMapIter},
 };
@@ -101,17 +101,6 @@
     type Mut<'msg> = MapMut<'msg, K, V> where K: 'msg, V: 'msg;
 }
 
-impl<'msg, K: Proxied + ?Sized, V: ProxiedInMapValue<K> + ?Sized> SettableValue<Map<K, V>>
-    for MapView<'msg, K, V>
-{
-    fn set_on<'b>(self, _private: Private, mut mutator: Mut<'b, Map<K, V>>)
-    where
-        Map<K, V>: 'b,
-    {
-        mutator.copy_from(self);
-    }
-}
-
 impl<'msg, K: Proxied + ?Sized, V: ProxiedInMapValue<K> + ?Sized> ViewProxy<'msg>
     for MapView<'msg, K, V>
 {
diff --git a/rust/optional.rs b/rust/optional.rs
index 741f12d..1f5cb9a 100644
--- a/rust/optional.rs
+++ b/rust/optional.rs
@@ -10,9 +10,7 @@
 #![allow(unused)]
 
 use crate::__internal::Private;
-use crate::{
-    Mut, MutProxied, MutProxy, Proxied, ProxiedWithPresence, SettableValue, View, ViewProxy,
-};
+use crate::{Mut, MutProxied, MutProxy, Proxied, View, ViewProxy};
 use std::convert::{AsMut, AsRef};
 use std::fmt::{self, Debug};
 use std::panic;
@@ -23,9 +21,6 @@
 /// This can be pattern matched with `match` or `if let` to determine if the
 /// field is set and access the field data.
 ///
-/// [`FieldEntry`], a specific type alias for `Optional`, provides much of the
-/// functionality for this type.
-///
 /// Two `Optional`s are equal if they match both presence and the field values.
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub enum Optional<SetVal, UnsetVal = SetVal> {
@@ -82,673 +77,3 @@
         x.into_option()
     }
 }
-
-/// A mutable view into the value of an optional field, which may be set or
-/// unset.
-pub type FieldEntry<'msg, T> = Optional<PresentField<'msg, T>, AbsentField<'msg, T>>;
-
-/// Methods for `_mut()` accessors of optional types.
-///
-/// The most common methods are [`set`] and [`or_default`].
-impl<'msg, T: ProxiedWithPresence + ?Sized + 'msg> FieldEntry<'msg, T> {
-    // is_set() is provided by `impl<T, A> Optional<T, A>`
-
-    /// Gets a mutator for this field. Sets to the default value if not set.
-    pub fn or_default(self) -> Mut<'msg, T> {
-        match self {
-            Optional::Set(x) => x.into_mut(),
-            Optional::Unset(x) => x.set_default().into_mut(),
-        }
-    }
-
-    /// Gets a mutator for this field. Sets to the given `val` if not set.
-    ///
-    /// If the field is already set, `val` is ignored.
-    pub fn or_set(self, val: impl SettableValue<T>) -> Mut<'msg, T> {
-        self.or_set_with(move || val)
-    }
-
-    /// Gets a mutator for this field. Sets using the given `val` function if
-    /// not set.
-    ///
-    /// If the field is already set, `val` is not invoked.
-    pub fn or_set_with<S>(self, val: impl FnOnce() -> S) -> Mut<'msg, T>
-    where
-        S: SettableValue<T>,
-    {
-        match self {
-            Optional::Set(x) => x.into_mut(),
-            Optional::Unset(x) => x.set(val()).into_mut(),
-        }
-    }
-
-    /// Sets the value of this field to `val`.
-    ///
-    /// Equivalent to `self.or_default().set(val)`, but does not consume `self`.
-    ///
-    /// `set` has the same parameters as in [`MutProxy`], so making a field
-    /// `optional` will switch to using this method. This makes transitioning
-    /// from implicit to explicit presence easier.
-    pub fn set(&mut self, val: impl SettableValue<T>) {
-        transform_mut(self, |mut self_| match self_ {
-            Optional::Set(ref mut present) => {
-                present.set(val);
-                self_
-            }
-            Optional::Unset(absent) => Optional::Set(absent.set(val)),
-        })
-    }
-
-    /// Clears the field; `is_set()` will return `false`.
-    pub fn clear(&mut self) {
-        transform_mut(self, |self_| match self_ {
-            Optional::Set(present) => Optional::Unset(present.clear()),
-            absent => absent,
-        })
-    }
-
-    /// Gets an immutable view of this field, using its default value if not
-    /// set. This is shorthand for `as_view`.
-    ///
-    /// This provides a shorter lifetime than `into_view` but can also be called
-    /// multiple times - if the result of `get` is not living long enough
-    /// for your use, use that instead.
-    ///
-    /// `get` has the same parameters as in [`MutProxy`], so making a field
-    /// `optional` will switch to using this method. This makes transitioning
-    /// from implicit to explicit presence easier.
-    pub fn get(&self) -> View<'_, T> {
-        self.as_view()
-    }
-
-    /// Converts to an immutable view of this optional field, preserving the
-    /// field's presence.
-    pub fn into_optional_view(self) -> Optional<View<'msg, T>> {
-        let is_set = self.is_set();
-        Optional::new(self.into_view(), is_set)
-    }
-
-    /// Returns a field mutator if the field is set.
-    ///
-    /// Returns `None` if the field is not set. This does not affect `is_set()`.
-    ///
-    /// This returns `Option` and _not_ `Optional` since returning a defaulted
-    /// `Mut` would require mutating the presence of the field - for that
-    /// behavior, use `or_default()`.
-    pub fn try_into_mut(self) -> Option<Mut<'msg, T>> {
-        match self {
-            Optional::Set(x) => Some(x.into_mut()),
-            Optional::Unset(_) => None,
-        }
-    }
-}
-
-impl<'msg, T: ProxiedWithPresence + ?Sized + 'msg> ViewProxy<'msg> for FieldEntry<'msg, T> {
-    type Proxied = T;
-
-    fn as_view(&self) -> View<'_, T> {
-        match self {
-            Optional::Set(x) => x.as_view(),
-            Optional::Unset(x) => x.as_view(),
-        }
-    }
-
-    fn into_view<'shorter>(self) -> View<'shorter, T>
-    where
-        'msg: 'shorter,
-    {
-        match self {
-            Optional::Set(x) => x.into_view(),
-            Optional::Unset(x) => x.into_view(),
-        }
-    }
-}
-
-// `MutProxy` not implemented for `FieldEntry` since the field may not be set,
-// and `as_mut`/`into_mut` should not insert.
-
-/// A field mutator capable of clearing that is statically known to point to a
-/// set field.
-pub struct PresentField<'msg, T>
-where
-    T: ProxiedWithPresence + ?Sized + 'msg,
-{
-    pub(crate) inner: T::PresentMutData<'msg>,
-}
-
-impl<'msg, T: ProxiedWithPresence + ?Sized + 'msg> Debug for PresentField<'msg, T> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        self.inner.fmt(f)
-    }
-}
-
-impl<'msg, T: ProxiedWithPresence + ?Sized + 'msg> PresentField<'msg, T> {
-    #[doc(hidden)]
-    pub fn from_inner(_private: Private, inner: T::PresentMutData<'msg>) -> Self {
-        Self { inner }
-    }
-
-    /// Gets an immutable view of this present field. This is shorthand for
-    /// `as_view`.
-    ///
-    /// This provides a shorter lifetime than `into_view` but can also be called
-    /// multiple times - if the result of `get` is not living long enough
-    /// for your use, use that instead.
-    pub fn get(&self) -> View<'_, T> {
-        self.as_view()
-    }
-
-    pub fn set(&mut self, val: impl SettableValue<T>) {
-        val.set_on(Private, self.as_mut())
-    }
-
-    /// See [`FieldEntry::clear`].
-    pub fn clear(mut self) -> AbsentField<'msg, T> {
-        AbsentField { inner: T::clear_present_field(self.inner) }
-    }
-
-    // This cannot provide `reborrow` - `clear` consumes after setting the field
-    // because it would violate a condition of `PresentField` - the field being set.
-}
-
-impl<'msg, T> ViewProxy<'msg> for PresentField<'msg, T>
-where
-    T: ProxiedWithPresence + ?Sized + 'msg,
-{
-    type Proxied = T;
-
-    fn as_view(&self) -> View<'_, T> {
-        self.inner.as_view()
-    }
-
-    fn into_view<'shorter>(self) -> View<'shorter, T>
-    where
-        'msg: 'shorter,
-    {
-        self.inner.into_view()
-    }
-}
-
-impl<'msg, T> MutProxy<'msg> for PresentField<'msg, T>
-where
-    T: ProxiedWithPresence + ?Sized + 'msg,
-{
-    fn as_mut(&mut self) -> Mut<'_, T> {
-        self.inner.as_mut()
-    }
-
-    fn into_mut<'shorter>(self) -> Mut<'shorter, T>
-    where
-        'msg: 'shorter,
-    {
-        self.inner.into_mut()
-    }
-}
-
-/// A field mutator capable of setting that is statically known to point to a
-/// non-set field.
-pub struct AbsentField<'msg, T>
-where
-    T: ProxiedWithPresence + ?Sized + 'msg,
-{
-    pub(crate) inner: T::AbsentMutData<'msg>,
-}
-
-impl<'msg, T: ProxiedWithPresence + ?Sized + 'msg> Debug for AbsentField<'msg, T> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        self.inner.fmt(f)
-    }
-}
-
-impl<'msg, T: ProxiedWithPresence + ?Sized> AbsentField<'msg, T> {
-    #[doc(hidden)]
-    pub fn from_inner(_private: Private, inner: T::AbsentMutData<'msg>) -> Self {
-        Self { inner }
-    }
-
-    /// Gets the default value for this unset field.
-    ///
-    /// This is the same value that the primitive accessor would provide, though
-    /// with the shorter lifetime of `as_view`.
-    pub fn default_value(&self) -> View<'_, T> {
-        self.as_view()
-    }
-
-    /// See [`FieldEntry::set`]. Note that this consumes and returns a
-    /// `PresentField`.
-    pub fn set(self, val: impl SettableValue<T>) -> PresentField<'msg, T> {
-        PresentField { inner: val.set_on_absent(Private, self.inner) }
-    }
-
-    /// Sets this absent field to its default value.
-    pub fn set_default(self) -> PresentField<'msg, T> {
-        PresentField { inner: T::set_absent_to_default(self.inner) }
-    }
-
-    // This cannot provide `reborrow` - `set` consumes after setting the field
-    // because it would violate a condition of `AbsentField` - the field being
-    // unset.
-}
-
-impl<'msg, T> ViewProxy<'msg> for AbsentField<'msg, T>
-where
-    T: ProxiedWithPresence + ?Sized + 'msg,
-{
-    type Proxied = T;
-
-    fn as_view(&self) -> View<'_, T> {
-        self.inner.as_view()
-    }
-
-    fn into_view<'shorter>(self) -> View<'shorter, T>
-    where
-        'msg: 'shorter,
-    {
-        self.inner.into_view()
-    }
-}
-
-/// Transforms a mutable reference in-place, treating it as if it were owned.
-///
-/// The program will abort if `transform` panics.
-///
-/// This is the same operation as provided by [`take_mut::take`].
-///
-/// [`take_mut::take`]: https://docs.rs/take_mut/latest/take_mut/fn.take.html
-fn transform_mut<T>(mut_ref: &mut T, transform: impl FnOnce(T) -> T) {
-    #[cold]
-    #[inline(never)]
-    fn panicked_in_transform_mut() -> ! {
-        use std::io::Write as _;
-        let backtrace = std::backtrace::Backtrace::force_capture();
-        let stderr = std::io::stderr();
-        let mut stderr = stderr.lock();
-        let _ = write!(&mut stderr, "BUG: A protobuf mutator panicked! Backtrace:\n{backtrace}\n");
-        let _ = stderr.flush();
-        std::process::abort()
-    }
-
-    // https://play.rust-lang.org/?edition=2021&gist=f3014e1f209013f0a38352e211f4a240
-    // provides a sample test to confirm this operation is sound in Miri.
-    // SAFETY:
-    // - `old_t` is not dropped without also replacing `*mut_ref`, preventing a
-    //   double-free.
-    // - If `transform` panics, the process aborts since `*mut_ref` has no possible
-    //   valid value.
-    // - After `ptr::write`, a valid `T` is located at `*mut_ref`
-    unsafe {
-        let p: *mut T = mut_ref;
-        let old_t = p.read();
-        let new_t = panic::catch_unwind(panic::AssertUnwindSafe(move || transform(old_t)))
-            .unwrap_or_else(|_| panicked_in_transform_mut());
-        p.write(new_t);
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use std::borrow::Cow;
-
-    /// A sample message with custom presence bits, meant to mirror a C++
-    /// message.
-    #[derive(Default, Debug)]
-    struct MyMessage {
-        /// has a default of `0`
-        a: i32,
-
-        /// has a default of `5`
-        b: i32,
-
-        /// Packed presence bitfield for `a` and `b`
-        presence: u8,
-    }
-
-    impl MyMessage {
-        fn a(&self) -> View<'_, VtableProxied> {
-            VtableProxiedView { val: get_a(self) }
-        }
-
-        fn a_opt(&self) -> Optional<View<'_, VtableProxied>> {
-            Optional::new(self.a(), has_a(self))
-        }
-
-        fn a_mut(&mut self) -> FieldEntry<'_, VtableProxied> {
-            static A_VTABLE: ProxyVtable =
-                ProxyVtable { get: get_a, set: set_a, clear: clear_a, has: has_a };
-            make_field_entry(self, &A_VTABLE)
-        }
-
-        fn b(&self) -> View<'_, VtableProxied> {
-            VtableProxiedView { val: get_b(self) }
-        }
-
-        fn b_opt(&self) -> Optional<View<'_, VtableProxied>> {
-            Optional::new(self.b(), has_b(self))
-        }
-
-        fn b_mut(&mut self) -> FieldEntry<'_, VtableProxied> {
-            static B_VTABLE: ProxyVtable =
-                ProxyVtable { get: get_b, set: set_b, clear: clear_b, has: has_b };
-            make_field_entry(self, &B_VTABLE)
-        }
-    }
-
-    fn make_field_entry<'msg>(
-        msg: &'msg mut MyMessage,
-        vtable: &'msg ProxyVtable,
-    ) -> FieldEntry<'msg, VtableProxied> {
-        if (vtable.has)(&*msg) {
-            Optional::Set(PresentField::from_inner(Private, VtableProxiedMut { msg, vtable }))
-        } else {
-            Optional::Unset(AbsentField::from_inner(Private, VtableProxiedMut { msg, vtable }))
-        }
-    }
-
-    // Thunks used for the vtable. For a C++ message these would be defined in C++
-    // and exported via a C API
-    const A_BIT: u8 = 0;
-    const B_BIT: u8 = 1;
-
-    fn get_a(msg: &MyMessage) -> i32 {
-        if has_a(msg) { msg.a } else { 0 }
-    }
-
-    fn get_b(msg: &MyMessage) -> i32 {
-        if has_b(msg) { msg.b } else { 5 }
-    }
-
-    fn set_a(msg: &mut MyMessage, val: i32) {
-        msg.presence |= (1 << A_BIT);
-        msg.a = val;
-    }
-
-    fn set_b(msg: &mut MyMessage, val: i32) {
-        msg.presence |= (1 << B_BIT);
-        msg.b = val;
-    }
-
-    fn clear_a(msg: &mut MyMessage) {
-        msg.presence &= !(1 << A_BIT);
-    }
-
-    fn clear_b(msg: &mut MyMessage) {
-        msg.presence &= !(1 << B_BIT);
-    }
-
-    fn has_a(msg: &MyMessage) -> bool {
-        msg.presence & (1 << A_BIT) != 0
-    }
-
-    fn has_b(msg: &MyMessage) -> bool {
-        msg.presence & (1 << B_BIT) != 0
-    }
-
-    #[derive(Debug)]
-    struct ProxyVtable {
-        get: fn(&MyMessage) -> i32,
-        set: fn(&mut MyMessage, val: i32),
-        clear: fn(&mut MyMessage),
-        has: fn(&MyMessage) -> bool,
-    }
-
-    /// A proxy for a `i32` that is accessed through methods on a vtable.
-    struct VtableProxied;
-
-    impl Proxied for VtableProxied {
-        type View<'msg> = VtableProxiedView;
-    }
-
-    impl MutProxied for VtableProxied {
-        type Mut<'msg> = VtableProxiedMut<'msg>;
-    }
-
-    impl ProxiedWithPresence for VtableProxied {
-        // In this case, the `PresentMutData` and `AbsentMutData` are identical to the
-        // `Mut` in layout. Other types/runtimes could require otherwise, e.g. `Mut`
-        // could be defined to only have get/set functions in its vtable, and not
-        // has/clear.
-        type PresentMutData<'msg> = VtableProxiedMut<'msg>;
-        type AbsentMutData<'msg> = VtableProxiedMut<'msg>;
-
-        fn clear_present_field<'msg>(
-            present_mutator: Self::PresentMutData<'msg>,
-        ) -> Self::AbsentMutData<'msg> {
-            (present_mutator.vtable.clear)(&mut *present_mutator.msg);
-            present_mutator
-        }
-
-        fn set_absent_to_default<'msg>(
-            absent_mutator: Self::AbsentMutData<'msg>,
-        ) -> Self::PresentMutData<'msg> {
-            SettableValue::<VtableProxied>::set_on_absent(
-                absent_mutator.as_view().val(),
-                Private,
-                absent_mutator,
-            )
-        }
-    }
-
-    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
-    struct VtableProxiedView {
-        val: i32,
-    }
-
-    impl VtableProxiedView {
-        fn val(&self) -> i32 {
-            self.val
-        }
-
-        fn read(msg: &MyMessage, vtable: &ProxyVtable) -> Self {
-            VtableProxiedView { val: (vtable.get)(msg) }
-        }
-    }
-
-    impl<'msg> ViewProxy<'msg> for VtableProxiedView {
-        type Proxied = VtableProxied;
-
-        fn as_view(&self) -> View<'msg, VtableProxied> {
-            *self
-        }
-
-        fn into_view<'shorter>(self) -> View<'shorter, VtableProxied>
-        where
-            'msg: 'shorter,
-        {
-            self
-        }
-    }
-
-    #[derive(Debug)]
-    struct VtableProxiedMut<'msg> {
-        msg: &'msg mut MyMessage,
-        vtable: &'msg ProxyVtable,
-    }
-
-    impl<'msg> ViewProxy<'msg> for VtableProxiedMut<'msg> {
-        type Proxied = VtableProxied;
-
-        fn as_view(&self) -> View<'_, VtableProxied> {
-            VtableProxiedView::read(self.msg, self.vtable)
-        }
-
-        fn into_view<'shorter>(self) -> View<'shorter, VtableProxied>
-        where
-            'msg: 'shorter,
-        {
-            VtableProxiedView::read(self.msg, self.vtable)
-        }
-    }
-
-    impl<'msg> MutProxy<'msg> for VtableProxiedMut<'msg> {
-        fn as_mut(&mut self) -> Mut<'_, VtableProxied> {
-            VtableProxiedMut { msg: self.msg, vtable: self.vtable }
-        }
-
-        fn into_mut<'shorter>(self) -> Mut<'shorter, VtableProxied>
-        where
-            'msg: 'shorter,
-        {
-            self
-        }
-    }
-
-    impl SettableValue<VtableProxied> for View<'_, VtableProxied> {
-        fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, VtableProxied>)
-        where
-            VtableProxied: 'msg,
-        {
-            SettableValue::<VtableProxied>::set_on(self.val(), Private, mutator)
-        }
-
-        fn set_on_absent<'msg>(
-            self,
-            _private: Private,
-            absent_mutator: <VtableProxied as ProxiedWithPresence>::AbsentMutData<'msg>,
-        ) -> <VtableProxied as ProxiedWithPresence>::PresentMutData<'msg> {
-            SettableValue::<VtableProxied>::set_on_absent(self.val(), Private, absent_mutator)
-        }
-    }
-
-    impl SettableValue<VtableProxied> for i32 {
-        fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, VtableProxied>)
-        where
-            VtableProxied: 'msg,
-        {
-            (mutator.vtable.set)(mutator.msg, self)
-        }
-
-        fn set_on_absent<'msg>(
-            self,
-            _private: Private,
-            absent_mutator: <VtableProxied as ProxiedWithPresence>::AbsentMutData<'msg>,
-        ) -> <VtableProxied as ProxiedWithPresence>::PresentMutData<'msg> {
-            (absent_mutator.vtable.set)(absent_mutator.msg, self);
-            absent_mutator
-        }
-    }
-
-    #[test]
-    fn test_field_entry() {
-        use googletest::prelude::*;
-        let mut m1 = MyMessage::default();
-        let mut m2 = MyMessage::default();
-
-        let mut m1_a = m1.a_mut();
-        assert_that!(m1_a, matches_pattern!(Optional::Unset(_)));
-
-        assert_that!(m1_a.as_view().val(), eq(0));
-
-        assert_that!(m2.b().val(), eq(5));
-
-        let mut m2_b = m2.b_mut();
-        assert_that!(m2_b.is_unset(), eq(true));
-        assert_that!(m2_b.as_view().val(), eq(5));
-
-        m2_b.set(10);
-        assert_that!(m2_b.is_set(), eq(true));
-        assert_that!(m2_b, matches_pattern!(Optional::Set(_)));
-        assert_that!(m2_b.as_view().val(), eq(10));
-
-        assert_that!(m1_a.or_default().as_view().val(), eq(0));
-        assert_that!(m1.a_opt(), eq(Optional::Set(VtableProxiedView { val: 0 })));
-        m1.a_mut().clear();
-
-        assert_that!(m1.a().val(), eq(0));
-        assert_that!(m1.b().val(), eq(5));
-        assert_that!(m2.a().val(), eq(0));
-        assert_that!(m2.b().val(), eq(10));
-    }
-
-    #[test]
-    fn test_or_set() {
-        use googletest::prelude::*;
-        let mut m1 = MyMessage::default();
-        let mut m2 = MyMessage::default();
-
-        assert_that!(m1.a_mut().or_set(10).get().val(), eq(10));
-        assert_that!(m1.a_opt(), eq(Optional::Set(VtableProxiedView { val: 10 })));
-        assert_that!(m1.a_mut().or_set(20).get().val(), eq(10));
-        assert_that!(m1.a_opt(), eq(Optional::Set(VtableProxiedView { val: 10 })));
-
-        assert_that!(m2.a_mut().or_set_with(|| m1.a().val() + m1.b().val()).get().val(), eq(15));
-        assert_that!(m2.a_opt(), eq(Optional::Set(VtableProxiedView { val: 15 })));
-        assert_that!(m2.a_mut().or_set_with(|| None::<i32>.unwrap()).get().val(), eq(15));
-        assert_that!(m2.a_opt(), eq(Optional::Set(VtableProxiedView { val: 15 })));
-    }
-
-    #[test]
-    fn test_into_optional_view() {
-        use googletest::prelude::*;
-        let mut m1 = MyMessage::default();
-        assert_that!(
-            m1.a_mut().into_optional_view(),
-            eq(Optional::Unset(VtableProxiedView { val: 0 }))
-        );
-        m1.a_mut().set(10);
-        assert_that!(
-            m1.a_mut().into_optional_view(),
-            eq(Optional::Set(VtableProxiedView { val: 10 }))
-        );
-        assert_that!(
-            m1.b_mut().into_optional_view(),
-            eq(Optional::Unset(VtableProxiedView { val: 5 }))
-        );
-    }
-
-    #[test]
-    fn test_try_into_mut() {
-        use googletest::prelude::*;
-        let mut m1 = MyMessage::default();
-        assert_that!(m1.a_mut().try_into_mut().is_none(), eq(true));
-        m1.a_mut().set(10);
-        let mut a_mut = m1.a_mut().try_into_mut().expect("field to be set");
-        a_mut.set(20);
-        assert_that!(m1.a().val(), eq(20));
-    }
-
-    #[test]
-    fn test_present_field() {
-        use googletest::prelude::*;
-        let mut m = MyMessage::default();
-        m.a_mut().set(10);
-        match m.a_mut() {
-            Optional::Set(mut present) => {
-                assert_that!(present.as_view().val(), eq(10));
-                present.set(20);
-                assert_that!(present.as_view().val(), eq(20));
-                present.into_mut().set(30);
-            }
-            Optional::Unset(_) => unreachable!(),
-        }
-        assert_that!(m.a_opt(), eq(Optional::Set(VtableProxiedView { val: 30 })));
-        m.b_mut().set(20);
-        match m.b_mut() {
-            Optional::Set(present) => present.clear(),
-            Optional::Unset(_) => unreachable!(),
-        };
-        assert_that!(m.b_opt(), eq(Optional::Unset(VtableProxiedView { val: 5 })));
-    }
-
-    #[test]
-    fn test_absent_field() {
-        use googletest::prelude::*;
-        let mut m = MyMessage::default();
-        match m.a_mut() {
-            Optional::Set(_) => unreachable!(),
-            Optional::Unset(absent) => {
-                assert_that!(absent.as_view().val(), eq(0));
-                absent.set(20);
-            }
-        }
-        assert_that!(m.a_opt(), eq(Optional::Set(VtableProxiedView { val: 20 })));
-        match m.b_mut() {
-            Optional::Set(_) => unreachable!(),
-            Optional::Unset(absent) => {
-                assert_that!(absent.as_view().val(), eq(5));
-                absent.set_default();
-            }
-        }
-        assert_that!(m.b_opt(), eq(Optional::Set(VtableProxiedView { val: 5 })));
-    }
-}
diff --git a/rust/proxied.rs b/rust/proxied.rs
index beef53c..3d71248 100644
--- a/rust/proxied.rs
+++ b/rust/proxied.rs
@@ -44,9 +44,7 @@
 //! implemented the concept of "proxy" types. Proxy types are a reference-like
 //! indirection between the user and the internal memory representation.
 
-use crate::RepeatedMut;
 use crate::__internal::Private;
-use crate::repeated::ProxiedInRepeated;
 use std::fmt::Debug;
 
 /// A type that can be accessed through a reference-like proxy.
@@ -167,13 +165,6 @@
         self.as_view()
     }
 
-    /// Sets this field to the given `val`.
-    ///
-    /// Any borrowed data from `val` will be cloned.
-    fn set(&mut self, val: impl SettableValue<Self::Proxied>) {
-        val.set_on(Private, self.as_mut())
-    }
-
     /// Converts a borrow into a `Mut` with the lifetime of that borrow.
     ///
     /// This function enables calling multiple methods consuming `self`, for
@@ -216,85 +207,6 @@
         'msg: 'shorter;
 }
 
-// TODO: move this to `optional.rs` as it's only used for optionals
-/// `Proxied` types that can be optionally set or unset.
-///
-/// All scalar and message types implement `ProxiedWithPresence`, while repeated
-/// types don't.
-pub trait ProxiedWithPresence: MutProxied {
-    /// The data necessary to store a present field mutator proxying `Self`.
-    /// This is the contents of `PresentField<'msg, Self>`.
-    type PresentMutData<'msg>: MutProxy<'msg, Proxied = Self>;
-
-    /// The data necessary to store an absent field mutator proxying `Self`.
-    /// This is the contents of `AbsentField<'msg, Self>`.
-    type AbsentMutData<'msg>: ViewProxy<'msg, Proxied = Self>;
-
-    /// Clears a present field.
-    fn clear_present_field(present_mutator: Self::PresentMutData<'_>) -> Self::AbsentMutData<'_>;
-
-    /// Sets an absent field to its default value.
-    ///
-    /// This can be more efficient than setting with a default value, e.g.
-    /// a default submessage could share resources with the parent message.
-    fn set_absent_to_default(absent_mutator: Self::AbsentMutData<'_>) -> Self::PresentMutData<'_>;
-}
-
-/// Values that can be used to set a field of `T`.
-pub trait SettableValue<T>: Sized
-where
-    T: MutProxied + ?Sized,
-{
-    /// Consumes `self` to set the given mutator to the value of `self`.
-    #[doc(hidden)]
-    fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, T>)
-    where
-        T: 'msg;
-
-    /// Consumes `self` and `absent_mutator` to set the given empty field to
-    /// the value of `self`.
-    #[doc(hidden)]
-    fn set_on_absent(
-        self,
-        _private: Private,
-        absent_mutator: T::AbsentMutData<'_>,
-    ) -> T::PresentMutData<'_>
-    where
-        T: ProxiedWithPresence,
-    {
-        let mut present = T::set_absent_to_default(absent_mutator);
-        self.set_on(Private, present.as_mut());
-        present
-    }
-
-    /// Consumes `self` and `present_mutator` to set the given present field
-    /// to the value of `self`.
-    #[doc(hidden)]
-    fn set_on_present(self, _private: Private, mut present_mutator: T::PresentMutData<'_>)
-    where
-        T: ProxiedWithPresence,
-    {
-        self.set_on(Private, present_mutator.as_mut())
-    }
-
-    /// Consumes `self` and `repeated_mutator` to set the value at the
-    /// given index to the value of `self`.
-    ///
-    /// # Safety
-    /// `index` must be less than `repeated_mutator.len()`
-    #[doc(hidden)]
-    unsafe fn set_on_repeated_unchecked(
-        self,
-        _private: Private,
-        mut _repeated_mutator: RepeatedMut<T>,
-        _index: usize,
-    ) where
-        T: ProxiedInRepeated,
-    {
-        unimplemented!()
-    }
-}
-
 /// A value to `Proxied`-value conversion that consumes the input value.
 ///
 /// All setter functions accept types that implement `IntoProxied`. The purpose
@@ -395,45 +307,6 @@
         }
     }
 
-    impl SettableValue<MyProxied> for MyProxiedView<'_> {
-        fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, MyProxied>)
-        where
-            MyProxied: 'msg,
-        {
-            mutator.my_proxied_ref.val = self.my_proxied_ref.val.clone();
-        }
-    }
-
-    impl SettableValue<MyProxied> for String {
-        fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, MyProxied>)
-        where
-            MyProxied: 'msg,
-        {
-            mutator.my_proxied_ref.val = self;
-        }
-    }
-
-    impl SettableValue<MyProxied> for &'_ str {
-        fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, MyProxied>)
-        where
-            MyProxied: 'msg,
-        {
-            mutator.my_proxied_ref.val.replace_range(.., self);
-        }
-    }
-
-    impl SettableValue<MyProxied> for Cow<'_, str> {
-        fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, MyProxied>)
-        where
-            MyProxied: 'msg,
-        {
-            match self {
-                Cow::Owned(x) => <String as SettableValue<MyProxied>>::set_on(x, Private, mutator),
-                Cow::Borrowed(x) => <&str as SettableValue<MyProxied>>::set_on(x, Private, mutator),
-            }
-        }
-    }
-
     #[test]
     fn test_as_view() {
         let my_proxied = MyProxied { val: "Hello World".to_string() };
@@ -443,18 +316,6 @@
         assert_that!(my_view.val(), eq(&my_proxied.val));
     }
 
-    #[test]
-    fn test_as_mut() {
-        let mut my_proxied = MyProxied { val: "Hello World".to_string() };
-
-        let mut my_mut = my_proxied.as_mut();
-        my_mut.set("Hello indeed".to_string());
-
-        let val_after_set = my_mut.as_view().val().to_string();
-        assert_that!(my_proxied.val, eq(val_after_set));
-        assert_that!(my_proxied.val, eq("Hello indeed"));
-    }
-
     fn reborrow_mut_into_view<'msg>(x: Mut<'msg, MyProxied>) -> View<'msg, MyProxied> {
         // x.as_view() fails to compile with:
         //   `ERROR: attempt to return function-local borrowed content`
@@ -578,17 +439,4 @@
             reborrow_generic_mut_into_mut::<MyProxied>(my_mut, other_mut);
         }
     }
-
-    #[test]
-    fn test_set() {
-        let mut my_proxied = MyProxied::default();
-        my_proxied.as_mut().set("hello");
-        assert_that!(my_proxied.as_view().val(), eq("hello"));
-
-        my_proxied.as_mut().set(String::from("hello2"));
-        assert_that!(my_proxied.as_view().val(), eq("hello2"));
-
-        my_proxied.as_mut().set(Cow::Borrowed("hello3"));
-        assert_that!(my_proxied.as_view().val(), eq("hello3"));
-    }
 }
diff --git a/rust/repeated.rs b/rust/repeated.rs
index 7253307..edc5947 100644
--- a/rust/repeated.rs
+++ b/rust/repeated.rs
@@ -15,7 +15,7 @@
 use std::marker::PhantomData;
 
 use crate::{
-    Mut, MutProxied, MutProxy, Proxied, SettableValue, View, ViewProxy,
+    Mut, MutProxied, MutProxy, Proxied, View, ViewProxy,
     __internal::Private,
     __runtime::{InnerRepeated, InnerRepeatedMut, RawRepeatedField},
 };
@@ -375,18 +375,6 @@
     }
 }
 
-impl<'msg, T> SettableValue<Repeated<T>> for RepeatedView<'msg, T>
-where
-    T: ProxiedInRepeated + ?Sized + 'msg,
-{
-    fn set_on<'b>(self, _private: Private, mutator: Mut<'b, Repeated<T>>)
-    where
-        Repeated<T>: 'b,
-    {
-        T::repeated_copy_from(self, mutator)
-    }
-}
-
 impl<'msg, T> iter::Iterator for RepeatedIter<'msg, T>
 where
     T: ProxiedInRepeated + ?Sized + 'msg,
diff --git a/rust/shared.rs b/rust/shared.rs
index c4aaef7..1e0c645 100644
--- a/rust/shared.rs
+++ b/rust/shared.rs
@@ -24,12 +24,9 @@
 pub mod __public {
     pub use crate::r#enum::UnknownEnumValue;
     pub use crate::map::{Map, MapIter, MapMut, MapView, ProxiedInMapValue};
-    pub use crate::optional::{AbsentField, FieldEntry, Optional, PresentField};
+    pub use crate::optional::Optional;
     pub use crate::proto;
-    pub use crate::proxied::{
-        IntoProxied, Mut, MutProxied, MutProxy, Proxied, ProxiedWithPresence, SettableValue, View,
-        ViewProxy,
-    };
+    pub use crate::proxied::{IntoProxied, Mut, MutProxied, MutProxy, Proxied, View, ViewProxy};
     pub use crate::repeated::{
         ProxiedInRepeated, Repeated, RepeatedIter, RepeatedMut, RepeatedView,
     };
@@ -63,7 +60,6 @@
 mod proxied;
 mod repeated;
 mod string;
-mod vtable;
 
 /// An error that happened during deserialization.
 #[derive(Debug, Clone)]
diff --git a/rust/string.rs b/rust/string.rs
index ed1cfdc..9272c8d 100644
--- a/rust/string.rs
+++ b/rust/string.rs
@@ -10,13 +10,8 @@
 #![allow(unused)]
 
 use crate::__internal::Private;
-use crate::__runtime::{
-    BytesAbsentMutData, BytesPresentMutData, InnerBytesMut, PtrAndLen, RawMessage,
-};
-use crate::{
-    AbsentField, FieldEntry, Mut, MutProxied, MutProxy, Optional, PresentField, Proxied,
-    ProxiedWithPresence, SettableValue, View, ViewProxy,
-};
+use crate::__runtime::{PtrAndLen, RawMessage};
+use crate::{Mut, MutProxied, MutProxy, Optional, Proxied, View, ViewProxy};
 use std::borrow::Cow;
 use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
 use std::convert::{AsMut, AsRef};
diff --git a/rust/test/shared/BUILD b/rust/test/shared/BUILD
index 460542b..fe7eae4 100644
--- a/rust/test/shared/BUILD
+++ b/rust/test/shared/BUILD
@@ -14,35 +14,7 @@
 # Once we have a couple of these tests we will investigate ways to remove boilerplate (for example
 # by introducing a build macro that registers 2 rust_test targets).
 
-load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
-
-rust_library(
-    name = "matchers_upb",
-    testonly = True,
-    srcs = ["matchers.rs"],
-    aliases = {
-        "//rust:protobuf_upb_export": "protobuf",
-    },
-    visibility = ["//rust/test/shared:__subpackages__"],
-    deps = [
-        "//rust:protobuf_upb_export",
-        "@crate_index//:googletest",
-    ],
-)
-
-rust_library(
-    name = "matchers_cpp",
-    testonly = True,
-    srcs = ["matchers.rs"],
-    aliases = {
-        "//rust:protobuf_cpp_export": "protobuf",
-    },
-    visibility = ["//rust/test/shared:__subpackages__"],
-    deps = [
-        "//rust:protobuf_cpp_export",
-        "@crate_index//:googletest",
-    ],
-)
+load("@rules_rust//rust:defs.bzl", "rust_test")
 
 rust_test(
     name = "child_parent_upb_test",
@@ -197,7 +169,6 @@
     srcs = ["accessors_test.rs"],
     aliases = {
         "//rust:protobuf_cpp_export": "protobuf",
-        "//rust/test/shared:matchers_cpp": "matchers",
     },
     proc_macro_deps = [
         "@crate_index//:paste",
@@ -205,7 +176,6 @@
     deps = [
         "//rust:protobuf_cpp_export",
         "//rust/test:unittest_cc_rust_proto",
-        "//rust/test/shared:matchers_cpp",
         "@crate_index//:googletest",
     ],
 )
@@ -215,7 +185,6 @@
     srcs = ["accessors_test.rs"],
     aliases = {
         "//rust:protobuf_upb_export": "protobuf",
-        "//rust/test/shared:matchers_upb": "matchers",
     },
     proc_macro_deps = [
         "@crate_index//:paste",
@@ -223,7 +192,6 @@
     deps = [
         "//rust:protobuf_upb_export",
         "//rust/test:unittest_upb_rust_proto",
-        "//rust/test/shared:matchers_upb",
         "@crate_index//:googletest",
     ],
 )
@@ -233,13 +201,11 @@
     srcs = ["accessors_proto3_test.rs"],
     aliases = {
         "//rust:protobuf_cpp_export": "protobuf",
-        "//rust/test/shared:matchers_cpp": "matchers",
     },
     deps = [
         "//rust:protobuf_cpp_export",
         "//rust/test:unittest_proto3_cc_rust_proto",
         "//rust/test:unittest_proto3_optional_cc_rust_proto",
-        "//rust/test/shared:matchers_cpp",
         "@crate_index//:googletest",
     ],
 )
@@ -249,13 +215,11 @@
     srcs = ["accessors_proto3_test.rs"],
     aliases = {
         "//rust:protobuf_upb_export": "protobuf",
-        "//rust/test/shared:matchers_upb": "matchers",
     },
     deps = [
         "//rust:protobuf_upb_export",
         "//rust/test:unittest_proto3_optional_upb_rust_proto",
         "//rust/test:unittest_proto3_upb_rust_proto",
-        "//rust/test/shared:matchers_upb",
         "@crate_index//:googletest",
     ],
 )
@@ -407,12 +371,10 @@
     srcs = ["proto_macro_test.rs"],
     aliases = {
         "//rust:protobuf_cpp": "protobuf",
-        "//rust/test/shared:matchers_cpp": "matchers",
     },
     deps = [
         "//rust:protobuf_cpp",
         "//rust/test:unittest_cc_rust_proto",
-        "//rust/test/shared:matchers_cpp",
         "@crate_index//:googletest",
     ],
 )
@@ -422,12 +384,10 @@
     srcs = ["proto_macro_test.rs"],
     aliases = {
         "//rust:protobuf_upb": "protobuf",
-        "//rust/test/shared:matchers_upb": "matchers",
     },
     deps = [
         "//rust:protobuf_upb",
         "//rust/test:unittest_upb_rust_proto",
-        "//rust/test/shared:matchers_upb",
         "@crate_index//:googletest",
     ],
 )
diff --git a/rust/test/shared/matchers.rs b/rust/test/shared/matchers.rs
deleted file mode 100644
index 70bea18..0000000
--- a/rust/test/shared/matchers.rs
+++ /dev/null
@@ -1,59 +0,0 @@
-use googletest::description::Description;
-use googletest::matcher::MatcherResult;
-use googletest::prelude::*;
-use protobuf::{AbsentField, Optional, PresentField, ProxiedWithPresence};
-use std::marker::PhantomData;
-
-/// ===============================
-///               IS_UNSET
-/// ===============================
-pub fn is_unset<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized + 'a>()
--> impl Matcher<ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>> {
-    UnsetMatcher::<T> { _phantom: PhantomData }
-}
-
-struct UnsetMatcher<'a, T: ProxiedWithPresence + ?Sized> {
-    _phantom: PhantomData<PresentField<'a, T>>,
-}
-
-impl<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized> Matcher for UnsetMatcher<'a, T> {
-    type ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>;
-
-    fn matches(&self, actual: &Self::ActualT) -> MatcherResult {
-        actual.is_unset().into()
-    }
-
-    fn describe(&self, matcher_result: MatcherResult) -> Description {
-        match matcher_result {
-            MatcherResult::Match => "is not set".into(),
-            MatcherResult::NoMatch => "is set".into(),
-        }
-    }
-}
-
-/// ===============================
-///               IS_SET
-/// ===============================
-pub fn is_set<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized + 'a>()
--> impl Matcher<ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>> {
-    SetMatcher::<T> { _phantom: PhantomData }
-}
-
-struct SetMatcher<'a, T: ProxiedWithPresence + ?Sized> {
-    _phantom: PhantomData<PresentField<'a, T>>,
-}
-
-impl<'a, T: std::fmt::Debug + ProxiedWithPresence + ?Sized> Matcher for SetMatcher<'a, T> {
-    type ActualT = Optional<PresentField<'a, T>, AbsentField<'a, T>>;
-
-    fn matches(&self, actual: &Self::ActualT) -> MatcherResult {
-        actual.is_set().into()
-    }
-
-    fn describe(&self, matcher_result: MatcherResult) -> Description {
-        match matcher_result {
-            MatcherResult::Match => "is set".into(),
-            MatcherResult::NoMatch => "is not set".into(),
-        }
-    }
-}
diff --git a/rust/test/shared/utf8/BUILD b/rust/test/shared/utf8/BUILD
index a0ffd15..7ff1551 100644
--- a/rust/test/shared/utf8/BUILD
+++ b/rust/test/shared/utf8/BUILD
@@ -9,14 +9,12 @@
     srcs = ["utf8_test.rs"],
     aliases = {
         "//rust:protobuf_cpp": "protobuf",
-        "//rust/test/shared:matchers_cpp": "matchers",
     },
     deps = [
         ":feature_verify_cc_rust_proto",
         ":no_features_proto2_cc_rust_proto",
         ":no_features_proto3_cc_rust_proto",
         "//rust:protobuf_cpp",
-        "//rust/test/shared:matchers_cpp",
         "@crate_index//:googletest",
     ],
 )
@@ -26,14 +24,12 @@
     srcs = ["utf8_test.rs"],
     aliases = {
         "//rust:protobuf_upb": "protobuf",
-        "//rust/test/shared:matchers_upb": "matchers",
     },
     deps = [
         ":feature_verify_upb_rust_proto",
         ":no_features_proto2_upb_rust_proto",
         ":no_features_proto3_upb_rust_proto",
         "//rust:protobuf_upb",
-        "//rust/test/shared:matchers_upb",
         "@crate_index//:googletest",
     ],
 )
diff --git a/rust/upb.rs b/rust/upb.rs
index 98e1c84..6072349 100644
--- a/rust/upb.rs
+++ b/rust/upb.rs
@@ -60,31 +60,6 @@
 
 pub type SerializedData = upb::OwnedArenaBox<[u8]>;
 
-// TODO: Investigate replacing this with direct access to UPB bits.
-pub type MessagePresentMutData<'msg, T> = crate::vtable::RawVTableOptionalMutatorData<'msg, T>;
-pub type MessageAbsentMutData<'msg, T> = crate::vtable::RawVTableOptionalMutatorData<'msg, T>;
-pub type BytesPresentMutData<'msg> = crate::vtable::RawVTableOptionalMutatorData<'msg, [u8]>;
-pub type BytesAbsentMutData<'msg> = crate::vtable::RawVTableOptionalMutatorData<'msg, [u8]>;
-pub type InnerBytesMut<'msg> = crate::vtable::RawVTableMutator<'msg, [u8]>;
-
-#[derive(Debug)]
-pub struct MessageVTable {
-    pub getter: unsafe extern "C" fn(msg: RawMessage) -> Option<RawMessage>,
-    pub mut_getter: unsafe extern "C" fn(msg: RawMessage, arena: RawArena) -> RawMessage,
-    pub clearer: unsafe extern "C" fn(msg: RawMessage),
-}
-
-impl MessageVTable {
-    pub const fn new(
-        _private: Private,
-        getter: unsafe extern "C" fn(msg: RawMessage) -> Option<RawMessage>,
-        mut_getter: unsafe extern "C" fn(msg: RawMessage, arena: RawArena) -> RawMessage,
-        clearer: unsafe extern "C" fn(msg: RawMessage),
-    ) -> Self {
-        MessageVTable { getter, mut_getter, clearer }
-    }
-}
-
 /// The raw contents of every generated message.
 #[derive(Debug)]
 pub struct MessageInner {
diff --git a/rust/vtable.rs b/rust/vtable.rs
deleted file mode 100644
index 83d6c05..0000000
--- a/rust/vtable.rs
+++ /dev/null
@@ -1,257 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2023 Google LLC.  All rights reserved.
-//
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file or at
-// https://developers.google.com/open-source/licenses/bsd
-
-use crate::__internal::Private;
-use crate::__runtime::MutatorMessageRef;
-use crate::{
-    AbsentField, FieldEntry, Mut, MutProxied, MutProxy, Optional, PresentField,
-    ProxiedWithPresence, View, ViewProxy,
-};
-use std::fmt::{self, Debug};
-use std::marker::PhantomData;
-use std::ptr::NonNull;
-
-/// A proxied type that can use a vtable to provide get/set access for a
-/// present field.
-///
-/// This vtable should consist of `unsafe fn`s that call thunks that operate on
-/// `RawMessage`. The structure of this vtable is different per proxied type.
-pub trait ProxiedWithRawVTable: MutProxied {
-    /// The vtable for get/set access, stored in static memory.
-    type VTable: Debug + 'static;
-
-    fn make_view(_private: Private, mut_inner: RawVTableMutator<'_, Self>) -> View<'_, Self>;
-    fn make_mut(_private: Private, inner: RawVTableMutator<'_, Self>) -> Mut<'_, Self>;
-}
-
-/// A proxied type that can use a vtable to provide get/set/clear access for
-/// an optional field.
-///
-/// This vtable should consist of `unsafe fn`s that call thunks that operate on
-/// `RawMessage`. The structure of this vtable is different per-proxied type.
-pub trait ProxiedWithRawOptionalVTable: ProxiedWithRawVTable + ProxiedWithPresence {
-    /// The vtable for get/set/clear, must contain `Self::VTable`.
-    type OptionalVTable: Debug + 'static;
-
-    /// Cast from a static reference of `OptionalVTable` to `VTable`.
-    /// This should mean `OptionalVTable` contains a `VTable`.
-    fn upcast_vtable(
-        _private: Private,
-        optional_vtable: &'static Self::OptionalVTable,
-    ) -> &'static Self::VTable;
-}
-
-/// Constructs a new field entry from a raw message, a vtable for manipulation,
-/// and an eager check for whether the value is present or not.
-///
-/// # Safety
-/// - `msg_ref` must be valid to provide as an argument for `vtable`'s methods
-///   for `'msg`.
-/// - If given `msg_ref` as an argument, any values returned by `vtable` methods
-///   must be valid for `'msg`.
-/// - Operations on the vtable must be thread-compatible.
-#[doc(hidden)]
-pub unsafe fn new_vtable_field_entry<'msg, T: ProxiedWithRawOptionalVTable + ?Sized>(
-    _private: Private,
-    msg_ref: MutatorMessageRef<'msg>,
-    optional_vtable: &'static T::OptionalVTable,
-    is_set: bool,
-) -> FieldEntry<'msg, T>
-where
-    T: ProxiedWithPresence<
-            PresentMutData<'msg> = RawVTableOptionalMutatorData<'msg, T>,
-            AbsentMutData<'msg> = RawVTableOptionalMutatorData<'msg, T>,
-        >,
-{
-    // SAFETY: safe as promised by the caller of the function
-    let data = unsafe { RawVTableOptionalMutatorData::new(Private, msg_ref, optional_vtable) };
-    if is_set {
-        Optional::Set(PresentField::from_inner(Private, data))
-    } else {
-        Optional::Unset(AbsentField::from_inner(Private, data))
-    }
-}
-
-/// The internal implementation type for a vtable-based `protobuf::Mut<T>`.
-///
-/// This stores the two components necessary to mutate the field:
-/// borrowed message data and a vtable reference.
-///
-/// The borrowed message data varies per runtime: C++ needs a message pointer,
-/// while UPB needs a message pointer and an `&Arena`.
-///
-/// Implementations of `ProxiedWithRawVTable` implement get/set
-/// on top of `RawVTableMutator<T>`, and the top-level mutator (e.g.
-/// `BytesMut`) calls these methods.
-///
-/// [`RawVTableOptionalMutatorData`] is similar, but also includes the
-/// capability to has/clear.
-pub struct RawVTableMutator<'msg, T: ?Sized> {
-    msg_ref: MutatorMessageRef<'msg>,
-    /// Stores `&'static <T as ProxiedWithRawVTable>::Vtable`
-    /// as a type-erased pointer to avoid a bound on the struct.
-    vtable: NonNull<()>,
-    _phantom: PhantomData<&'msg T>,
-}
-
-// These use manual impls instead of derives to avoid unnecessary bounds on `T`.
-// This problem is referred to as "perfect derive".
-// https://smallcultfollowing.com/babysteps/blog/2022/04/12/implied-bounds-and-perfect-derive/
-impl<'msg, T: ?Sized> Clone for RawVTableMutator<'msg, T> {
-    fn clone(&self) -> Self {
-        *self
-    }
-}
-impl<'msg, T: ?Sized> Copy for RawVTableMutator<'msg, T> {}
-
-impl<'msg, T: ProxiedWithRawVTable + ?Sized> Debug for RawVTableMutator<'msg, T> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        f.debug_struct("RawVTableMutator")
-            .field("msg_ref", &self.msg_ref)
-            .field("vtable", self.vtable())
-            .finish()
-    }
-}
-
-impl<'msg, T: ProxiedWithRawVTable + ?Sized> RawVTableMutator<'msg, T> {
-    /// # Safety
-    /// - `msg_ref` must be valid to provide as an argument for `vtable`'s
-    ///   methods for `'msg`.
-    /// - If given `msg_ref` as an argument, any values returned by `vtable`
-    ///   methods must be valid for `'msg`.
-    #[doc(hidden)]
-    pub unsafe fn new(
-        _private: Private,
-        msg_ref: MutatorMessageRef<'msg>,
-        vtable: &'static T::VTable,
-    ) -> Self {
-        RawVTableMutator { msg_ref, vtable: NonNull::from(vtable).cast(), _phantom: PhantomData }
-    }
-
-    pub fn vtable(self) -> &'static T::VTable {
-        // SAFETY: This was cast from `&'static T::VTable`.
-        unsafe { self.vtable.cast().as_ref() }
-    }
-
-    pub fn msg_ref(self) -> MutatorMessageRef<'msg> {
-        self.msg_ref
-    }
-}
-
-/// [`RawVTableMutator`], but also includes has/clear.
-///
-/// This is used as the `PresentData` and `AbsentData` for `impl
-/// ProxiedWithPresence for T`. In that implementation, `clear_present_field`
-/// and `set_absent_to_default` will use methods implemented on
-/// `RawVTableOptionalMutatorData<T>` to do the setting and clearing.
-///
-/// This has the same representation for "present" and "absent" data;
-/// differences like default values are obviated by the vtable.
-pub struct RawVTableOptionalMutatorData<'msg, T: ?Sized> {
-    msg_ref: MutatorMessageRef<'msg>,
-    /// Stores `&'static <T as ProxiedWithRawOptionalVTable>::Vtable`
-    /// as a type-erased pointer to avoid a bound on the struct.
-    optional_vtable: NonNull<()>,
-    _phantom: PhantomData<&'msg T>,
-}
-
-// SAFETY: all `T` that can perform mutations don't mutate through a shared
-// reference.
-unsafe impl<'msg, T: ?Sized> Sync for RawVTableOptionalMutatorData<'msg, T> {}
-
-// These use manual impls instead of derives to avoid unnecessary bounds on `T`.
-// This problem is referred to as "perfect derive".
-// https://smallcultfollowing.com/babysteps/blog/2022/04/12/implied-bounds-and-perfect-derive/
-impl<'msg, T: ?Sized> Clone for RawVTableOptionalMutatorData<'msg, T> {
-    fn clone(&self) -> Self {
-        *self
-    }
-}
-impl<'msg, T: ?Sized> Copy for RawVTableOptionalMutatorData<'msg, T> {}
-
-impl<'msg, T: ProxiedWithRawOptionalVTable + ?Sized> Debug
-    for RawVTableOptionalMutatorData<'msg, T>
-{
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        f.debug_struct("RawVTableOptionalMutatorData")
-            .field("msg_ref", &self.msg_ref)
-            .field("vtable", self.optional_vtable())
-            .finish()
-    }
-}
-
-impl<'msg, T: ProxiedWithRawOptionalVTable + ?Sized> RawVTableOptionalMutatorData<'msg, T> {
-    /// # Safety
-    /// - `msg_ref` must be valid to provide as an argument for `vtable`'s
-    ///   methods for `'msg`.
-    /// - If given `msg_ref` as an argument, any values returned by `vtable`
-    ///   methods must be valid for `'msg`.
-    #[doc(hidden)]
-    pub unsafe fn new(
-        _private: Private,
-        msg_ref: MutatorMessageRef<'msg>,
-        vtable: &'static T::OptionalVTable,
-    ) -> Self {
-        Self { msg_ref, optional_vtable: NonNull::from(vtable).cast(), _phantom: PhantomData }
-    }
-
-    pub fn msg_ref(self) -> MutatorMessageRef<'msg> {
-        self.msg_ref
-    }
-
-    pub fn optional_vtable(self) -> &'static T::OptionalVTable {
-        // SAFETY: This was cast from `&'static T::OptionalVTable` in `new`.
-        unsafe { self.optional_vtable.cast().as_ref() }
-    }
-
-    fn into_raw_mut(self) -> RawVTableMutator<'msg, T> {
-        // SAFETY: the safety requirements have been met by the caller of `new`.
-        unsafe {
-            RawVTableMutator::new(
-                Private,
-                self.msg_ref,
-                T::upcast_vtable(Private, self.optional_vtable()),
-            )
-        }
-    }
-}
-
-impl<'msg, T: ProxiedWithRawOptionalVTable + ?Sized + 'msg> ViewProxy<'msg>
-    for RawVTableOptionalMutatorData<'msg, T>
-{
-    type Proxied = T;
-
-    fn as_view(&self) -> View<'_, T> {
-        T::make_view(Private, self.into_raw_mut())
-    }
-
-    fn into_view<'shorter>(self) -> View<'shorter, T>
-    where
-        'msg: 'shorter,
-    {
-        T::make_view(Private, self.into_raw_mut())
-    }
-}
-
-// Note: though this raw value implements `MutProxy`, the `as_mut` is only valid
-// when the field is known to be present. `FieldEntry` enforces this in its
-// design: `AbsentField { inner: RawVTableOptionalMutatorData<T> }` does not
-// implement `MutProxy`.
-impl<'msg, T: ProxiedWithRawOptionalVTable + ?Sized + 'msg> MutProxy<'msg>
-    for RawVTableOptionalMutatorData<'msg, T>
-{
-    fn as_mut(&mut self) -> Mut<'_, T> {
-        T::make_mut(Private, self.into_raw_mut())
-    }
-
-    fn into_mut<'shorter>(self) -> Mut<'shorter, T>
-    where
-        'msg: 'shorter,
-    {
-        T::make_mut(Private, self.into_raw_mut())
-    }
-}
diff --git a/src/google/protobuf/compiler/rust/message.cc b/src/google/protobuf/compiler/rust/message.cc
index 67c569f..ec0ab96 100644
--- a/src/google/protobuf/compiler/rust/message.cc
+++ b/src/google/protobuf/compiler/rust/message.cc
@@ -924,64 +924,6 @@
           }
         }
 
-        impl $pbi$::ProxiedWithRawVTable for $Msg$ {
-          type VTable = $pbr$::MessageVTable;
-
-          fn make_view(_private: $pbi$::Private,
-                      mut_inner: $pbi$::RawVTableMutator<'_, Self>)
-                      -> $pb$::View<'_, Self> {
-            let msg = unsafe {
-              (mut_inner.vtable().getter)(mut_inner.msg_ref().msg())
-            };
-            $Msg$View::new($pbi$::Private, msg$unwrap_upb$)
-          }
-
-          fn make_mut(_private: $pbi$::Private,
-                      inner: $pbi$::RawVTableMutator<'_, Self>)
-                      -> $pb$::Mut<'_, Self> {
-            let raw_submsg = unsafe {
-              (inner.vtable().mut_getter)(inner.msg_ref().msg()$upb_arena$)
-            };
-            $Msg$Mut::from_parent($pbi$::Private, inner.msg_ref(), raw_submsg)
-          }
-        }
-
-        impl $pbi$::ProxiedWithRawOptionalVTable for $Msg$ {
-          type OptionalVTable = $pbr$::MessageVTable;
-
-          fn upcast_vtable(_private: $pbi$::Private,
-                           optional_vtable: &'static Self::OptionalVTable)
-                          -> &'static Self::VTable {
-            &optional_vtable
-          }
-        }
-
-        impl $pb$::ProxiedWithPresence for $Msg$ {
-          type PresentMutData<'a> = $pbr$::MessagePresentMutData<'a, $Msg$>;
-          type AbsentMutData<'a> = $pbr$::MessageAbsentMutData<'a, $Msg$>;
-
-          fn clear_present_field(present_mutator: Self::PresentMutData<'_>)
-             -> Self::AbsentMutData<'_> {
-             // SAFETY: The raw ptr msg_ref is valid
-            unsafe {
-              (present_mutator.optional_vtable().clearer)(present_mutator.msg_ref().msg());
-
-             $pbi$::RawVTableOptionalMutatorData::new($pbi$::Private,
-               present_mutator.msg_ref(),
-               present_mutator.optional_vtable())
-            }
-          }
-
-          fn set_absent_to_default(absent_mutator: Self::AbsentMutData<'_>)
-             -> Self::PresentMutData<'_> {
-           unsafe {
-             $pbi$::RawVTableOptionalMutatorData::new($pbi$::Private,
-               absent_mutator.msg_ref(),
-               absent_mutator.optional_vtable())
-           }
-          }
-        }
-
         $into_proxied_impl$
 
         $repeated_impl$