diff --git a/vmkit/examples/binarytrees.rs b/vmkit/examples/binarytrees.rs
index 2572b7a..da39de9 100644
--- a/vmkit/examples/binarytrees.rs
+++ b/vmkit/examples/binarytrees.rs
@@ -32,6 +32,7 @@ static METADATA: GCMetadata<BenchVM> = GCMetadata {
     instance_size: size_of::<Node>(),
     compute_size: None,
     alignment: 16,
+    compute_alignment: None,
 };
 
 struct BenchVM {
diff --git a/vmkit/src/bdwgc_shim.rs b/vmkit/src/bdwgc_shim.rs
index 8697479..76e087a 100644
--- a/vmkit/src/bdwgc_shim.rs
+++ b/vmkit/src/bdwgc_shim.rs
@@ -33,7 +33,7 @@ use crate::{
 };
 use easy_bitfield::*;
 use mmtk::{
-    util::Address,
+    util::{options::PlanSelector, Address},
     vm::{
         slot::{SimpleSlot, UnimplementedMemorySlice},
         ObjectTracer,
@@ -326,6 +326,7 @@ struct MarkStackMeta<'a> {
 static CONSERVATIVE_METADATA: GCMetadata<BDWGC> = GCMetadata {
     alignment: 8,
     instance_size: 0,
+    compute_alignment: None,
     compute_size: Some(|object| {
         let header = object.header::<BDWGC>().metadata();
         ObjectSize::decode(header.meta) * BDWGC::MIN_ALIGNMENT
@@ -508,10 +509,10 @@ pub static mut GC_VERBOSE: i32 = 0;
 static BUILDER: LazyLock<Mutex<MMTKBuilder>> = LazyLock::new(|| {
     Mutex::new({
         let mut builder = MMTKBuilder::new();
-        builder
-            .options
-            .plan
-            .set(mmtk::util::options::PlanSelector::Immix);
+        builder.options.read_env_var_settings();
+        if !matches!(*builder.options.plan, PlanSelector::Immix | PlanSelector::MarkSweep) {
+            builder.options.plan.set(PlanSelector::Immix);
+        }
         builder
     })
 });
diff --git a/vmkit/src/object_model/metadata.rs b/vmkit/src/object_model/metadata.rs
index 93915a8..d49fee4 100644
--- a/vmkit/src/object_model/metadata.rs
+++ b/vmkit/src/object_model/metadata.rs
@@ -14,6 +14,7 @@ pub struct GCMetadata<VM: VirtualMachine> {
     pub instance_size: usize,
     pub compute_size: Option<fn(VMKitObject) -> usize>,
     pub alignment: usize,
+    pub compute_alignment: Option<fn(VMKitObject) -> usize>,
 }
 
 #[derive(Debug)]
diff --git a/vmkit/src/object_model/object.rs b/vmkit/src/object_model/object.rs
index fdbc6ed..ce54e3e 100644
--- a/vmkit/src/object_model/object.rs
+++ b/vmkit/src/object_model/object.rs
@@ -3,12 +3,12 @@ use crate::threading::Thread;
 use crate::{mm::MemoryManager, VirtualMachine};
 use atomic::Atomic;
 use core::ops::Range;
-use std::hash::Hash;
 use mmtk::util::{
     constants::LOG_BYTES_IN_ADDRESS, conversions::raw_align_up, Address, ObjectReference,
 };
 use mmtk::vm::slot::{MemorySlice, SimpleSlot, Slot};
 use std::fmt;
+use std::hash::Hash;
 use std::marker::PhantomData;
 
 use super::{
@@ -127,8 +127,18 @@ impl VMKitObject {
     /// # Returns
     ///
     /// * `usize` - The alignment of the object.
-    pub fn alignment<VM: VirtualMachine>(&self) -> usize {
-        self.header::<VM>().metadata().gc_metadata().alignment
+    pub fn alignment<VM: VirtualMachine>(self) -> usize {
+        let alignment = self.header::<VM>().metadata().gc_metadata().alignment;
+        if alignment == 0 {
+            return self
+                .header::<VM>()
+                .metadata()
+                .gc_metadata()
+                .compute_alignment
+                .map(|f| f(self))
+                .unwrap_or(VM::MAX_ALIGNMENT);
+        }
+        alignment
     }
 
     /// Returns the number of bytes used by the `VMKitObject`.
@@ -644,12 +654,12 @@ impl<SL: SlotExtra> Eq for SimpleMemorySlice<SL> {}
 
 impl<SL: SlotExtra> Clone for SimpleMemorySlice<SL> {
     fn clone(&self) -> Self {
-        Self { range: self.range.clone() }
+        Self {
+            range: self.range.clone(),
+        }
     }
 }
 
-
-
 pub struct SimpleMemorySliceRangeIterator<SL: SlotExtra = SimpleSlot> {
     cursor: Address,
     end: Address,