diff --git a/Cargo.toml b/Cargo.toml
index 1c5b8d8622eb58ec75ee244a7330d599c630d3a3..18c76e6a91d519ae989d1b726b6c4c264af06a55 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,7 +16,7 @@ members = ["kayak_ui_macros", "kayak_font"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-bevy = { version = "0.10", default-features = false, features = ["bevy_render", "bevy_sprite", "bevy_asset", "bevy_winit", "bevy_core_pipeline"] }
+bevy = { version = "0.11", default-features = false, features = ["bevy_render", "bevy_sprite", "bevy_asset", "bevy_winit", "bevy_core_pipeline"] }
 bevy_svg = { version="0.10.1", default-features = false }
 bitflags = "1.3.2"
 bytemuck = "1.12"
@@ -37,7 +37,7 @@ uuid = { version = "1.3", features = ["v4"] }
 [dev-dependencies]
 fastrand = "1.8"
 bevy-inspector-egui = "0.18"
-bevy = { version = "0.10", default-features = true }
+bevy = { version = "0.11", default-features = true }
 
 [[example]]
 name = "tabs"
@@ -48,4 +48,7 @@ name = "todo"
 path = "examples/todo/todo.rs"
 
 [package.metadata.docs.rs]
-features = ["bevy/x11"]
\ No newline at end of file
+features = ["bevy/x11"]
+
+[patch.crates-io]
+bevy_svg = {git = "https://github.com/NiseVoid/bevy_svg", branch="bevy_svg"}
diff --git a/examples/main_menu.rs b/examples/main_menu.rs
index 0111af0de38a09f9ab100d1bfb953bcc228a2a2e..7b33cef605f934275f3cb28e085174dcf2dd6cb5 100644
--- a/examples/main_menu.rs
+++ b/examples/main_menu.rs
@@ -215,8 +215,7 @@ fn main() {
     App::new()
         .init_resource::<PreloadResource>()
         .add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest()))
-        .add_plugin(KayakContextPlugin)
-        .add_plugin(KayakWidgets)
-        .add_startup_system(startup)
+        .add_plugins((KayakContextPlugin, KayakWidgets))
+        .add_systems(Startup, startup)
         .run()
 }
diff --git a/kayak_font/Cargo.toml b/kayak_font/Cargo.toml
index 721390f3f1482d9f10667cb31001546a39b1e9f3..105eb1138309878e78ccac0c72fc0003a2c2a713 100644
--- a/kayak_font/Cargo.toml
+++ b/kayak_font/Cargo.toml
@@ -27,11 +27,11 @@ image = "0.24"
 # Provides UAX #14 line break segmentation
 xi-unicode = "0.3"
 
-bevy = { version = "0.10", optional = true, default-features = false, features = ["bevy_asset", "bevy_render", "bevy_core_pipeline"] }
+bevy = { version = "0.11", optional = true, default-features = false, features = ["bevy_asset", "bevy_render", "bevy_core_pipeline"] }
 
 [dev-dependencies]
-bevy = { version = "0.10" }
+bevy = { version = "0.11" }
 bytemuck = "1.12.0"
 
 [package.metadata.docs.rs]
-features = ["bevy/x11"]
\ No newline at end of file
+features = ["bevy/x11"]
diff --git a/kayak_font/src/bevy/mod.rs b/kayak_font/src/bevy/mod.rs
index 97da83234b987dc4c5a330f4a1d4382327641f8a..68b9391274feaa3df2b0bbaa8ddd66f70cb2a08c 100644
--- a/kayak_font/src/bevy/mod.rs
+++ b/kayak_font/src/bevy/mod.rs
@@ -11,8 +11,8 @@ mod loader;
 mod renderer;
 
 mod plugin {
-    use bevy::prelude::{AddAsset, IntoSystemAppConfig, IntoSystemConfig, Plugin};
-    use bevy::render::{ExtractSchedule, RenderApp, RenderSet};
+    use bevy::prelude::{AddAsset, IntoSystemConfigs, Plugin, Update};
+    use bevy::render::{ExtractSchedule, Render, RenderApp, RenderSet};
 
     use crate::bevy::font_texture::init_font_texture;
     use crate::KayakFont;
@@ -26,14 +26,14 @@ mod plugin {
             app.add_asset::<KayakFont>()
                 .add_asset_loader(crate::ttf::loader::TTFLoader)
                 .add_asset_loader(KayakFontLoader)
-                .add_system(init_font_texture);
+                .add_systems(Update, init_font_texture);
 
             let render_app = app.sub_app_mut(RenderApp);
             render_app
                 .init_resource::<FontTextureCache>()
                 .init_resource::<ExtractedFonts>()
-                .add_system(extract_fonts.in_schedule(ExtractSchedule))
-                .add_system(prepare_fonts.in_set(RenderSet::Prepare));
+                .add_systems(ExtractSchedule, extract_fonts)
+                .add_systems(Render, prepare_fonts.in_set(RenderSet::Prepare));
         }
     }
 }
diff --git a/kayak_font/src/bevy/renderer/font_texture_cache.rs b/kayak_font/src/bevy/renderer/font_texture_cache.rs
index c61a329e24ef0148b4e9dc1ffbb5fac4268e0689..8a9f22fbfdaa9821b95a2f9851e92bd5cf1f971f 100644
--- a/kayak_font/src/bevy/renderer/font_texture_cache.rs
+++ b/kayak_font/src/bevy/renderer/font_texture_cache.rs
@@ -137,7 +137,7 @@ impl FontTextureCache {
             lod_min_clamp: 0.0,
             lod_max_clamp: std::f32::MAX,
             compare: None,
-            anisotropy_clamp: None,
+            anisotropy_clamp: 1,
             border_color: None,
         };
 
@@ -152,7 +152,7 @@ impl FontTextureCache {
             base_mip_level: 0,
             base_array_layer: 0,
             mip_level_count: None,
-            array_layer_count: std::num::NonZeroU32::new(MAX_CHARACTERS),
+            array_layer_count: Some(MAX_CHARACTERS),
         });
 
         let image = GpuImage {
@@ -199,7 +199,7 @@ impl FontTextureCache {
             base_mip_level: 0,
             base_array_layer: 0,
             mip_level_count: None,
-            array_layer_count: std::num::NonZeroU32::new(MAX_CHARACTERS),
+            array_layer_count: Some(MAX_CHARACTERS),
         });
 
         GpuImage {
diff --git a/kayak_font/src/font.rs b/kayak_font/src/font.rs
index b5c11872667df47565c8eedfad328af073d09fa9..da5d4f60fa5f720bea5213854242bcc94b97880c 100644
--- a/kayak_font/src/font.rs
+++ b/kayak_font/src/font.rs
@@ -1,7 +1,11 @@
 use std::collections::HashMap;
 
 #[cfg(feature = "bevy_renderer")]
-use bevy::{prelude::Handle, reflect::TypeUuid, render::texture::Image};
+use bevy::{
+    prelude::Handle,
+    reflect::{TypePath, TypeUuid},
+    render::texture::Image,
+};
 use unicode_segmentation::UnicodeSegmentation;
 
 use crate::utility::{BreakableWord, MISSING, SPACE};
@@ -10,7 +14,7 @@ use crate::{
 };
 
 #[cfg(feature = "bevy_renderer")]
-#[derive(Debug, Clone, TypeUuid, PartialEq)]
+#[derive(Debug, Clone, TypeUuid, TypePath, PartialEq)]
 #[uuid = "4fe4732c-6731-49bb-bafc-4690d636b848"]
 pub struct KayakFont {
     pub sdf: Sdf,
diff --git a/kayak_font/src/layout/glyph.rs b/kayak_font/src/layout/glyph.rs
index a7d7f8429634d18e409ad23cbfa7cdb29f96151f..65b1baea64b93fc8a624793231a38d4e849757a9 100644
--- a/kayak_font/src/layout/glyph.rs
+++ b/kayak_font/src/layout/glyph.rs
@@ -1,7 +1,7 @@
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 /// Layout information for a renderable glyph.
-#[derive(Default, Reflect, FromReflect, Debug, Clone, Copy, PartialEq)]
+#[derive(Default, Reflect, Debug, Clone, Copy, PartialEq)]
 pub struct GlyphRect {
     pub position: (f32, f32),
     pub size: (f32, f32),
diff --git a/kayak_font/src/layout/grapheme.rs b/kayak_font/src/layout/grapheme.rs
index df0ce15308f14e0dc548cdb1558b17415aa106cc..c578275cba5102a6051eafca253fac3bfc471f8b 100644
--- a/kayak_font/src/layout/grapheme.rs
+++ b/kayak_font/src/layout/grapheme.rs
@@ -1,11 +1,11 @@
 use std::cmp::Ordering;
 
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 /// A representation of a grapheme cluster, as defined by [Unicode UAX #29].
 ///
 /// [Unicode UAX #29]: https://unicode.org/reports/tr29/
-#[derive(Default, Debug, Reflect, FromReflect, Copy, Clone, PartialEq)]
+#[derive(Default, Debug, Reflect, Copy, Clone, PartialEq)]
 pub struct Grapheme {
     /// The index of the starting char within this grapheme, relative to the entire text content.
     pub char_index: usize,
diff --git a/kayak_font/src/layout/line.rs b/kayak_font/src/layout/line.rs
index 41e07030599b773aa1bb757189c6f3bbf2482f72..0bbe3938497085f90975113dcd75fbeaa4596b4c 100644
--- a/kayak_font/src/layout/line.rs
+++ b/kayak_font/src/layout/line.rs
@@ -1,4 +1,4 @@
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 use crate::layout::grapheme::Grapheme;
 use std::cmp::Ordering;
@@ -6,7 +6,7 @@ use std::ops::Index;
 use std::slice::SliceIndex;
 
 /// Contains details for a calculated line of text.
-#[derive(Clone, Reflect, FromReflect, Debug, PartialEq)]
+#[derive(Clone, Reflect, Debug, PartialEq)]
 pub struct Line {
     grapheme_index: usize,
     graphemes: Vec<Grapheme>,
diff --git a/kayak_font/src/layout/text.rs b/kayak_font/src/layout/text.rs
index 8d5a59031799cf9979a846bcf526b518e2dd116d..2a80a28bdcd84594f1cf0a9c8e490e198a5f9ba0 100644
--- a/kayak_font/src/layout/text.rs
+++ b/kayak_font/src/layout/text.rs
@@ -1,10 +1,10 @@
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 use crate::{GlyphRect, Line, RowCol};
 use std::cmp::Ordering;
 
 /// The text alignment.
-#[derive(Copy, Clone, Reflect, FromReflect, Debug, PartialEq, Eq)]
+#[derive(Copy, Clone, Reflect, Debug, PartialEq, Eq)]
 pub enum Alignment {
     Start,
     Middle,
@@ -12,7 +12,7 @@ pub enum Alignment {
 }
 
 /// Properties to control text layout.
-#[derive(Copy, Clone, Reflect, FromReflect, Debug, PartialEq)]
+#[derive(Copy, Clone, Reflect, Debug, PartialEq)]
 pub struct TextProperties {
     /// The font size (in pixels).
     pub font_size: f32,
@@ -41,7 +41,7 @@ impl Default for TextProperties {
 /// Calculated text layout.
 ///
 /// This can be retrieved using [`measure`](crate::KayakFont::measure).
-#[derive(Clone, Reflect, FromReflect, Debug, Default, PartialEq)]
+#[derive(Clone, Reflect, Debug, Default, PartialEq)]
 pub struct TextLayout {
     glyphs: Vec<GlyphRect>,
     lines: Vec<Line>,
diff --git a/src/camera/mod.rs b/src/camera/mod.rs
index 1e02a5305fe0ec7bc3a67965ec61dbeef937294b..f887086963603e71534f8a9da8f853c08247d3b4 100644
--- a/src/camera/mod.rs
+++ b/src/camera/mod.rs
@@ -19,6 +19,6 @@ impl ExtractComponent for CameraUIKayak {
 pub struct KayakUICameraPlugin;
 impl Plugin for KayakUICameraPlugin {
     fn build(&self, app: &mut bevy::prelude::App) {
-        app.add_plugin(ExtractComponentPlugin::<CameraUIKayak>::default());
+        app.add_plugins(ExtractComponentPlugin::<CameraUIKayak>::default());
     }
 }
diff --git a/src/context.rs b/src/context.rs
index c51cadc472adae47e24f23dad6bb3cb6514d54a4..ffe96d155338a9b8f92ba8225d293b87ef228892 100644
--- a/src/context.rs
+++ b/src/context.rs
@@ -667,11 +667,11 @@ pub fn update_widgets_sys(world: &mut World) {
 
         for (key, system) in context.systems.iter_mut() {
             if let Some(new_tick) = new_ticks.get(key) {
-                system.0.set_last_change_tick(*new_tick);
-                system.1.set_last_change_tick(*new_tick);
+                system.0.set_last_run(*new_tick);
+                system.1.set_last_run(*new_tick);
             } else {
-                system.0.set_last_change_tick(tick);
-                system.1.set_last_change_tick(tick);
+                system.0.set_last_run(tick);
+                system.1.set_last_run(tick);
             }
         }
 
@@ -694,7 +694,7 @@ fn update_widgets(
     clone_systems: &Arc<RwLock<EntityCloneSystems>>,
     cloned_widget_entities: &Arc<DashMap<Entity, Entity>>,
     widget_state: &WidgetState,
-    new_ticks: &mut HashMap<String, u32>,
+    new_ticks: &mut HashMap<String, bevy::ecs::component::Tick>,
     order_tree: &Arc<RwLock<Tree>>,
     index: &Arc<DashMap<Entity, usize>>,
     unique_ids: &Arc<DashMap<Entity, DashMap<String, Entity>>>,
@@ -1114,7 +1114,7 @@ fn update_widget(
     clone_systems: &Arc<RwLock<EntityCloneSystems>>,
     cloned_widget_entities: &DashMap<Entity, Entity>,
     widget_state: &WidgetState,
-    new_ticks: &mut HashMap<String, u32>,
+    new_ticks: &mut HashMap<String, bevy::ecs::component::Tick>,
 ) -> (Tree, bool) {
     // Check if we should update this widget
     let should_rerender = {
@@ -1164,15 +1164,15 @@ fn update_widget(
                 )
             })
             .0;
-        let old_tick = widget_update_system.get_last_change_tick();
+        let old_tick = widget_update_system.get_last_run();
 
         // Insert context as a bevy resource.
         world.insert_resource(widget_context);
         let should_rerender = widget_update_system.run((entity.0, old_props_entity), world);
-        let new_tick = widget_update_system.get_last_change_tick();
+        let new_tick = widget_update_system.get_last_run();
         new_ticks.insert(widget_type.clone(), new_tick);
-        widget_update_system.set_last_change_tick(old_tick);
-        widget_update_system.apply_buffers(world);
+        widget_update_system.set_last_run(old_tick);
+        widget_update_system.apply_deferred(world);
 
         // Extract context
         widget_context = world.remove_resource::<KayakWidgetContext>().unwrap();
@@ -1247,14 +1247,14 @@ fn update_widget(
         // Remove children from previous render.
         widget_context.remove_children(previous_children);
         let widget_render_system = &mut systems.get_mut(&widget_type).unwrap().1;
-        let old_tick = widget_render_system.get_last_change_tick();
+        let old_tick = widget_render_system.get_last_run();
         world.insert_resource(widget_context.clone());
         world.insert_resource(focus_tree.clone());
         should_update_children = widget_render_system.run(entity.0, world);
-        let new_tick = widget_render_system.get_last_change_tick();
+        let new_tick = widget_render_system.get_last_run();
         new_ticks.insert(widget_type.clone(), new_tick);
-        widget_render_system.set_last_change_tick(old_tick);
-        widget_render_system.apply_buffers(world);
+        widget_render_system.set_last_run(old_tick);
+        widget_render_system.apply_deferred(world);
         world.remove_resource::<KayakWidgetContext>();
         world.remove_resource::<FocusTree>();
 
@@ -1300,16 +1300,18 @@ impl Plugin for KayakContextPlugin {
             .insert_resource(CustomEventReader(ManualEventReader::<
                 bevy::input::keyboard::KeyboardInput,
             >::default()))
-            .add_plugin(crate::camera::KayakUICameraPlugin)
-            .add_plugin(crate::render::BevyKayakUIRenderPlugin)
-            .add_system(crate::input::process_events.in_base_set(CoreSet::Update))
-            .add_system(update_widgets_sys.in_base_set(CoreSet::PostUpdate))
-            .add_system(
-                calculate_ui
-                    .after(update_widgets_sys)
-                    .in_base_set(CoreSet::PostUpdate),
+            .add_plugins((
+                crate::camera::KayakUICameraPlugin,
+                crate::render::BevyKayakUIRenderPlugin,
+            ))
+            .add_systems(
+                Update,
+                (
+                    crate::input::process_events,
+                    crate::window_size::update_window_size,
+                ),
             )
-            .add_system(crate::window_size::update_window_size);
+            .add_systems(PostUpdate, (calculate_ui, update_widgets_sys).chain());
 
         // Register reflection types.
         // A bit annoying..
@@ -1360,10 +1362,10 @@ fn calculate_ui(world: &mut World) {
 
         for _ in 0..2 {
             context = node_system.run(context, world);
-            node_system.apply_buffers(world);
+            node_system.apply_deferred(world);
 
             context = layout_system.run(context, world);
-            layout_system.apply_buffers(world);
+            layout_system.apply_deferred(world);
             LayoutEventDispatcher::dispatch(&mut context, world);
         }
 
diff --git a/src/cursor.rs b/src/cursor.rs
index b3df333cc497d41e653d6f4e4973ea23acf92010..220e92424155d954dc0556c0ada9881bb8901b0d 100644
--- a/src/cursor.rs
+++ b/src/cursor.rs
@@ -1,7 +1,7 @@
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 /// Controls how the cursor interacts on a given node
-#[derive(Debug, Reflect, FromReflect, Copy, Clone, PartialEq, Eq)]
+#[derive(Debug, Reflect, Copy, Clone, PartialEq, Eq)]
 pub enum PointerEvents {
     /// Allow all pointer events on this node and its children
     All,
diff --git a/src/event_dispatcher.rs b/src/event_dispatcher.rs
index 4c9f4bb93e1759be710b8a0ba8666894c86bbac8..35b174753f1176b68d941a7d0d30a7c60c4a9109 100644
--- a/src/event_dispatcher.rs
+++ b/src/event_dispatcher.rs
@@ -700,16 +700,16 @@ impl EventDispatcher {
                 InputEvent::Keyboard { key, is_pressed } => {
                     // === Modifers === //
                     match key {
-                        KeyCode::LControl | KeyCode::RControl => {
+                        KeyCode::ControlLeft | KeyCode::ControlRight => {
                             self.keyboard_modifiers.is_ctrl_pressed = *is_pressed
                         }
-                        KeyCode::LShift | KeyCode::RShift => {
+                        KeyCode::ShiftLeft | KeyCode::ShiftRight => {
                             self.keyboard_modifiers.is_shift_pressed = *is_pressed
                         }
-                        KeyCode::LAlt | KeyCode::RAlt => {
+                        KeyCode::AltLeft | KeyCode::AltRight => {
                             self.keyboard_modifiers.is_alt_pressed = *is_pressed
                         }
-                        KeyCode::LWin | KeyCode::RWin => {
+                        KeyCode::SuperLeft | KeyCode::SuperRight => {
                             self.keyboard_modifiers.is_meta_pressed = *is_pressed
                         }
                         _ => {}
diff --git a/src/input.rs b/src/input.rs
index cf51b47ab4b5093f05b7e63e17d674d4e3e37cd1..13947a09d6f218e21394643ce461f26119ee7ac5 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -78,7 +78,13 @@ pub(crate) fn process_events(world: &mut World) {
                 }
             }
 
-            for MouseWheel { x, y, unit } in custom_event_mouse_wheel.0.iter(&mouse_wheel_events) {
+            for MouseWheel {
+                x,
+                y,
+                unit,
+                window: _,
+            } in custom_event_mouse_wheel.0.iter(&mouse_wheel_events)
+            {
                 input_events.push(InputEvent::Scroll {
                     dx: *x,
                     dy: *y,
diff --git a/src/layout.rs b/src/layout.rs
index 52e546aacf0234da77a3e048db7ea4eef2de0812..63fdf66626b35e543655ac2080b608fd686521eb 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -3,14 +3,14 @@ use std::collections::HashMap;
 
 use bevy::{
     prelude::{Entity, Query},
-    reflect::{FromReflect, Reflect},
+    reflect::Reflect,
 };
 use morphorm::Cache;
 pub use morphorm::GeometryChanged;
 
 use crate::node::WrappedIndex;
 
-#[derive(Debug, Reflect, FromReflect, Default, Clone, Copy, PartialEq)]
+#[derive(Debug, Reflect, Default, Clone, Copy, PartialEq)]
 pub struct Rect {
     pub posx: f32,
     pub posy: f32,
diff --git a/src/node.rs b/src/node.rs
index 680154b6ff3ef0c0cf539a78d5ad180ccade6e91..dd3c5f485b47012b68d1c16b9ffc9c3fcf28ff95 100644
--- a/src/node.rs
+++ b/src/node.rs
@@ -1,7 +1,4 @@
-use bevy::{
-    prelude::{Component, Entity, Query, Reflect, ReflectComponent},
-    reflect::FromReflect,
-};
+use bevy::prelude::{Component, Entity, Query, Reflect, ReflectComponent};
 
 use crate::styles::{KStyle, StyleProp};
 
@@ -106,7 +103,7 @@ impl NodeBuilder {
     }
 }
 
-#[derive(Debug, Reflect, FromReflect, Clone, Copy, Hash, PartialEq, Eq)]
+#[derive(Debug, Reflect, Clone, Copy, Hash, PartialEq, Eq)]
 pub struct WrappedIndex(pub Entity);
 
 impl<'a> morphorm::Node<'a> for WrappedIndex {
diff --git a/src/on_change.rs b/src/on_change.rs
index ae8058a17131a50875f768b20912a001772e2a39..3cb9073379376f4dcffbe158b752e69595628bf7 100644
--- a/src/on_change.rs
+++ b/src/on_change.rs
@@ -57,7 +57,7 @@ impl OnChange {
                     }
                     world.insert_resource(widget_context);
                     system.run((entity, value.clone()), world);
-                    system.apply_buffers(world);
+                    system.apply_deferred(world);
                 }
             }
         }
diff --git a/src/on_event.rs b/src/on_event.rs
index 6fd441a92c5c3a611317db72e627b5f38f95266f..eb0fd54d6af3097743f7530cd8765f514aba5206 100644
--- a/src/on_event.rs
+++ b/src/on_event.rs
@@ -62,7 +62,7 @@ impl OnEvent {
             world.insert_resource(focus_tree);
 
             system.run(entity, world);
-            system.apply_buffers(world);
+            system.apply_deferred(world);
 
             event_dispatcher_context = world.remove_resource::<EventDispatcherContext>().unwrap();
             event = world.remove_resource::<KEvent>().unwrap();
diff --git a/src/on_layout.rs b/src/on_layout.rs
index 43b483a47fc1b4e06f3e3c41d536098be124216a..253db5cbb9944e8610809648fc2eb2cf579457b5 100644
--- a/src/on_layout.rs
+++ b/src/on_layout.rs
@@ -50,7 +50,7 @@ impl OnLayout {
                 self.has_initialized = true;
             }
             event = system.run((event, entity), world);
-            system.apply_buffers(world);
+            system.apply_deferred(world);
         }
         event
     }
diff --git a/src/render/extract.rs b/src/render/extract.rs
index f9942d8cc14f07030e8715c16c9fdd9d217bfb94..affd6750ee6c97491bef70e13593e5904e2fc35b 100644
--- a/src/render/extract.rs
+++ b/src/render/extract.rs
@@ -10,7 +10,7 @@ use bevy::{
         render_resource::{DynamicUniformBuffer, ShaderType},
         renderer::{RenderDevice, RenderQueue},
         view::ColorGrading,
-        Extract, ExtractSchedule, RenderApp, RenderSet,
+        Extract, ExtractSchedule, Render, RenderApp, RenderSet,
     },
     window::{PrimaryWindow, Window, WindowRef},
 };
@@ -28,15 +28,15 @@ impl Plugin for BevyKayakUIExtractPlugin {
         let render_app = app.sub_app_mut(RenderApp);
         render_app
             .init_resource::<UIViewUniforms>()
-            .add_system(extract.in_schedule(ExtractSchedule))
             .add_systems(
+                ExtractSchedule,
                 (
+                    extract,
                     extract_default_ui_camera_view::<Camera2d>,
                     extract_default_ui_camera_view::<Camera3d>,
-                )
-                    .in_schedule(ExtractSchedule),
+                ),
             )
-            .add_system(prepare_view_uniforms.in_set(RenderSet::Prepare));
+            .add_systems(Render, prepare_view_uniforms.in_set(RenderSet::Prepare));
     }
 }
 
diff --git a/src/render/font/mod.rs b/src/render/font/mod.rs
index 86e02cb7a3fa388c1405cb3bf9ca3da4072cbb1f..41c693ae8b1b0d710070f7897d3abcbff887f1a9 100644
--- a/src/render/font/mod.rs
+++ b/src/render/font/mod.rs
@@ -1,4 +1,4 @@
-use bevy::prelude::{Added, Entity, Plugin, Query, ResMut};
+use bevy::prelude::{Added, Entity, Plugin, Query, ResMut, Update};
 
 mod extract;
 mod font_mapping;
@@ -14,7 +14,7 @@ pub struct TextRendererPlugin;
 impl Plugin for TextRendererPlugin {
     fn build(&self, app: &mut bevy::prelude::App) {
         app.init_resource::<FontMapping>()
-            .add_system(process_loaded_fonts);
+            .add_systems(Update, process_loaded_fonts);
     }
 }
 
diff --git a/src/render/material/mod.rs b/src/render/material/mod.rs
index 665988bc3a96a299ef13470f516629b91239ddc1..68866dfc3b1d0bd986b521aaecca442d8112a845 100644
--- a/src/render/material/mod.rs
+++ b/src/render/material/mod.rs
@@ -6,7 +6,7 @@ use std::sync::Arc;
 
 use bevy::{
     prelude::{Commands, Entity},
-    reflect::{FromReflect, Reflect, TypeUuid},
+    reflect::{Reflect, TypePath, TypeUuid},
     render::render_resource::{AsBindGroup, RenderPipelineDescriptor, ShaderRef},
 };
 
@@ -14,7 +14,9 @@ pub use key::*;
 pub use pipeline::*;
 pub use plugin::*;
 
-pub trait MaterialUI: AsBindGroup + Send + Sync + Clone + TypeUuid + Sized + 'static {
+pub trait MaterialUI:
+    AsBindGroup + Send + Sync + Clone + TypeUuid + TypePath + Sized + 'static
+{
     /// Returns this material's vertex shader. If [`ShaderRef::Default`] is returned, the default mesh vertex shader
     /// will be used.
     fn vertex_shader() -> ShaderRef {
@@ -33,7 +35,7 @@ pub trait MaterialUI: AsBindGroup + Send + Sync + Clone + TypeUuid + Sized + 'st
     fn specialize(descriptor: &mut RenderPipelineDescriptor, key: MaterialUIKey<Self>) {}
 }
 
-#[derive(Default, Clone, Reflect, FromReflect)]
+#[derive(Default, Clone, Reflect)]
 pub struct MaterialHandle {
     uuid: String,
     #[reflect(ignore)]
diff --git a/src/render/material/plugin.rs b/src/render/material/plugin.rs
index ba98dd2b3ee71ecbb701fcaefcaff9095e83f329..897a4d9f62d269bfbfbc12e96a0514e9601bb4e4 100644
--- a/src/render/material/plugin.rs
+++ b/src/render/material/plugin.rs
@@ -2,8 +2,8 @@ use bevy::{
     prelude::*,
     render::{
         extract_component::ExtractComponentPlugin, render_asset::PrepareAssetSet,
-        render_phase::AddRenderCommand, render_resource::SpecializedRenderPipelines, RenderApp,
-        RenderSet,
+        render_phase::AddRenderCommand, render_resource::SpecializedRenderPipelines, Render,
+        RenderApp, RenderSet,
     },
 };
 use std::hash::Hash;
@@ -35,7 +35,7 @@ where
 {
     fn build(&self, app: &mut App) {
         app.add_asset::<M>()
-            .add_plugin(ExtractComponentPlugin::<Handle<M>>::extract_visible());
+            .add_plugins(ExtractComponentPlugin::<Handle<M>>::extract_visible());
 
         if let Ok(render_app) = app.get_sub_app_mut(RenderApp) {
             render_app
@@ -45,15 +45,18 @@ where
                 .init_resource::<ExtractedMaterialsUI<M>>()
                 .init_resource::<RenderMaterialsUI<M>>()
                 .init_resource::<SpecializedRenderPipelines<MaterialUIPipeline<M>>>()
-                .add_system(extract_materials_ui::<M>.in_schedule(ExtractSchedule))
-                .add_systems((
-                    prepare_materials_ui::<M>
-                        .in_set(RenderSet::Prepare)
-                        .after(PrepareAssetSet::PreAssetPrepare),
-                    queue_material_ui_quads::<M>
-                        .in_set(RenderSet::Queue)
-                        .after(crate::render::unified::pipeline::queue_quads),
-                ));
+                .add_systems(ExtractSchedule, extract_materials_ui::<M>)
+                .add_systems(
+                    Render,
+                    (
+                        prepare_materials_ui::<M>
+                            .in_set(RenderSet::Prepare)
+                            .after(PrepareAssetSet::PreAssetPrepare),
+                        queue_material_ui_quads::<M>
+                            .in_set(RenderSet::Queue)
+                            .after(crate::render::unified::pipeline::queue_quads),
+                    ),
+                );
         }
     }
 }
diff --git a/src/render/mod.rs b/src/render/mod.rs
index f1da1813f7c1c44d65bec395dc8192ca69eb385d..49a7bca4ab4b35612212f72006bd97f97d25f999 100644
--- a/src/render/mod.rs
+++ b/src/render/mod.rs
@@ -3,9 +3,9 @@ use bevy::{
     render::{
         camera::RenderTarget,
         render_asset::RenderAssets,
-        render_graph::{RenderGraph, RunGraphOnViewNode, SlotInfo, SlotType},
+        render_graph::{RenderGraph, RunGraphOnViewNode},
         render_phase::{batch_phase_system, sort_phase_system, DrawFunctions, RenderPhase},
-        Extract, ExtractSchedule, RenderApp, RenderSet,
+        Extract, ExtractSchedule, Render, RenderApp, RenderSet,
     },
     window::{PrimaryWindow, Window, WindowRef},
 };
@@ -53,26 +53,26 @@ pub struct BevyKayakUIRenderPlugin;
 impl Plugin for BevyKayakUIRenderPlugin {
     fn build(&self, app: &mut bevy::prelude::App) {
         app.init_resource::<OpacityLayerManager>()
-            .add_system(update_opacity_layer_cameras);
+            .add_systems(Update, update_opacity_layer_cameras);
 
         let render_app = app.sub_app_mut(RenderApp);
         render_app
             .init_resource::<DrawFunctions<TransparentUI>>()
             .init_resource::<DrawFunctions<TransparentOpacityUI>>()
-            .add_system(extract_core_pipeline_camera_phases.in_schedule(ExtractSchedule))
-            .add_system(
+            .add_systems(ExtractSchedule, extract_core_pipeline_camera_phases)
+            .add_systems(
+                Render,
                 prepare_opacity_layers
                     .in_set(RenderSet::Queue)
                     .before(unified::pipeline::queue_quads),
             )
-            .add_system(
-                batch_phase_system::<TransparentUI>
-                    .after(sort_phase_system::<TransparentUI>)
-                    .in_set(RenderSet::PhaseSort),
-            )
-            .add_system(
-                batch_phase_system::<TransparentOpacityUI>
-                    .after(sort_phase_system::<TransparentOpacityUI>)
+            .add_systems(
+                Render,
+                (
+                    batch_phase_system::<TransparentUI>.after(sort_phase_system::<TransparentUI>),
+                    batch_phase_system::<TransparentOpacityUI>
+                        .after(sort_phase_system::<TransparentOpacityUI>),
+                )
                     .in_set(RenderSet::PhaseSort),
             );
 
@@ -81,18 +81,6 @@ impl Plugin for BevyKayakUIRenderPlugin {
 
         // let mut draw_ui_graph = RenderGraph::default();
         // draw_ui_graph.add_node(draw_ui_graph::node::MAIN_PASS, pass_node_ui);
-        // let input_node_id = draw_ui_graph.set_input(vec![SlotInfo::new(
-        //     draw_ui_graph::input::VIEW_ENTITY,
-        //     SlotType::Entity,
-        // )]);
-        // draw_ui_graph
-        //     .add_slot_edge(
-        //         input_node_id,
-        //         draw_ui_graph::input::VIEW_ENTITY,
-        //         draw_ui_graph::node::MAIN_PASS,
-        //         MainPassUINode::IN_VIEW,
-        //     )
-        //     .unwrap();
         // graph.add_sub_graph(draw_ui_graph::NAME, draw_ui_graph);
 
         // // graph.add_node_edge(MAIN_PASS, draw_ui_graph::NAME).unwrap();
@@ -112,12 +100,6 @@ impl Plugin for BevyKayakUIRenderPlugin {
                 bevy::core_pipeline::core_2d::graph::node::MAIN_PASS,
                 draw_ui_graph::node::MAIN_PASS,
             );
-            graph_2d.add_slot_edge(
-                graph_2d.input_node().id,
-                bevy::core_pipeline::core_2d::graph::input::VIEW_ENTITY,
-                draw_ui_graph::node::MAIN_PASS,
-                RunGraphOnViewNode::IN_VIEW,
-            );
             graph_2d.add_node_edge(
                 bevy::core_pipeline::core_2d::graph::node::TONEMAPPING,
                 draw_ui_graph::node::MAIN_PASS,
@@ -135,7 +117,7 @@ impl Plugin for BevyKayakUIRenderPlugin {
                 RunGraphOnViewNode::new(draw_ui_graph::NAME),
             );
             graph_3d.add_node_edge(
-                bevy::core_pipeline::core_3d::graph::node::MAIN_PASS,
+                bevy::core_pipeline::core_3d::graph::node::END_MAIN_PASS,
                 draw_ui_graph::node::MAIN_PASS,
             );
             graph_3d.add_node_edge(
@@ -146,17 +128,13 @@ impl Plugin for BevyKayakUIRenderPlugin {
                 draw_ui_graph::node::MAIN_PASS,
                 bevy::core_pipeline::core_3d::graph::node::UPSCALING,
             );
-            graph_3d.add_slot_edge(
-                graph_3d.input_node().id,
-                bevy::core_pipeline::core_3d::graph::input::VIEW_ENTITY,
-                draw_ui_graph::node::MAIN_PASS,
-                RunGraphOnViewNode::IN_VIEW,
-            );
         }
 
-        app.add_plugin(font::TextRendererPlugin)
-            .add_plugin(UnifiedRenderPlugin)
-            .add_plugin(BevyKayakUIExtractPlugin);
+        app.add_plugins((
+            font::TextRendererPlugin,
+            UnifiedRenderPlugin,
+            BevyKayakUIExtractPlugin,
+        ));
     }
 }
 
@@ -164,16 +142,6 @@ fn get_ui_graph(render_app: &mut App) -> RenderGraph {
     let ui_pass_node = MainPassUINode::new(&mut render_app.world);
     let mut ui_graph = RenderGraph::default();
     ui_graph.add_node(draw_ui_graph::node::MAIN_PASS, ui_pass_node);
-    let input_node_id = ui_graph.set_input(vec![SlotInfo::new(
-        draw_ui_graph::input::VIEW_ENTITY,
-        SlotType::Entity,
-    )]);
-    ui_graph.add_slot_edge(
-        input_node_id,
-        draw_ui_graph::input::VIEW_ENTITY,
-        draw_ui_graph::node::MAIN_PASS,
-        MainPassUINode::IN_VIEW,
-    );
     ui_graph
 }
 
diff --git a/src/render/unified/mod.rs b/src/render/unified/mod.rs
index febfbc25a2fabd8d4f5cffaf74df482fd4b2bc11..678161fcb833d013d56ddf69516a27411957ea70 100644
--- a/src/render/unified/mod.rs
+++ b/src/render/unified/mod.rs
@@ -1,14 +1,14 @@
 use bevy::{
     prelude::{
-        AddAsset, Assets, Commands, HandleUntyped, IntoSystemAppConfig, IntoSystemConfig, Plugin,
-        Query, Res, ResMut, Resource, With,
+        AddAsset, Assets, Commands, HandleUntyped, IntoSystemConfigs, Plugin, Query, Res, ResMut,
+        Resource, With,
     },
     reflect::TypeUuid,
     render::{
         render_phase::AddRenderCommand,
         render_resource::{Shader, SpecializedRenderPipelines},
         renderer::{RenderDevice, RenderQueue},
-        Extract, ExtractSchedule, RenderApp, RenderSet,
+        Extract, ExtractSchedule, Render, RenderApp, RenderSet,
     },
     window::{PrimaryWindow, Window},
 };
@@ -47,16 +47,26 @@ pub const VERTEX_OUTPUT_HANDLE: HandleUntyped =
 pub struct UnifiedRenderPlugin;
 impl Plugin for UnifiedRenderPlugin {
     fn build(&self, app: &mut bevy::prelude::App) {
-        app.add_asset::<Svg>().add_plugin(text::TextRendererPlugin);
+        app.add_asset::<Svg>().add_plugins(text::TextRendererPlugin);
 
         let mut shaders = app.world.get_resource_mut::<Assets<Shader>>().unwrap();
-        let bindings_include = Shader::from_wgsl(include_str!("shaders/bindings.wgsl"));
+        let bindings_include = Shader::from_wgsl(
+            include_str!("shaders/bindings.wgsl"),
+            "shaders/bindings.wgsl",
+        );
         shaders.set_untracked(UNIFIED_BINDINGS_HANDLE, bindings_include);
-        let sample_quad_include = Shader::from_wgsl(include_str!("shaders/sample_quad.wgsl"));
+        let sample_quad_include = Shader::from_wgsl(
+            include_str!("shaders/sample_quad.wgsl"),
+            "shaders/sample_quad.wgsl",
+        );
         shaders.set_untracked(SAMPLE_QUAD_HANDLE, sample_quad_include);
-        let vertex_output_include = Shader::from_wgsl(include_str!("shaders/vertex_output.wgsl"));
+        let vertex_output_include = Shader::from_wgsl(
+            include_str!("shaders/vertex_output.wgsl"),
+            "shaders/vertex_output.wgsl",
+        );
         shaders.set_untracked(VERTEX_OUTPUT_HANDLE, vertex_output_include);
-        let unified_shader = Shader::from_wgsl(include_str!("shaders/shader.wgsl"));
+        let unified_shader =
+            Shader::from_wgsl(include_str!("shaders/shader.wgsl"), "shaders/shader.wgsl");
         shaders.set_untracked(UNIFIED_SHADER_HANDLE, unified_shader);
 
         let render_app = app.sub_app_mut(RenderApp);
@@ -64,30 +74,34 @@ impl Plugin for UnifiedRenderPlugin {
             .init_resource::<QuadTypeOffsets>()
             .init_resource::<ExtractedQuads>()
             .init_resource::<ImageBindGroups>()
-            .init_resource::<UnifiedPipeline>()
-            .init_resource::<SpecializedRenderPipelines<UnifiedPipeline>>()
             .init_resource::<QuadMeta>()
             .init_resource::<RenderSvgs>()
             .init_resource::<PreviousClip>()
             .init_resource::<PreviousIndex>()
-            .add_system(super::svg::extract_svg_asset.in_schedule(ExtractSchedule))
-            .add_system(extract_baseline.in_schedule(ExtractSchedule))
-            .add_system(queue_quad_types.in_set(RenderSet::Queue))
-            .add_system(
-                pipeline::queue_quads
-                    .in_set(RenderSet::Queue)
-                    .after(queue_quad_types),
+            .add_systems(
+                ExtractSchedule,
+                (super::svg::extract_svg_asset, extract_baseline),
             )
-            .add_system(
-                queue_ui_view_bind_groups
-                    .in_set(RenderSet::Queue)
-                    .after(pipeline::queue_quads),
+            .add_systems(
+                Render,
+                (
+                    queue_quad_types,
+                    (pipeline::queue_quads, queue_ui_view_bind_groups),
+                )
+                    .chain()
+                    .in_set(RenderSet::Queue),
             )
-            .add_system(queue_vertices.in_set(RenderSet::QueueFlush));
+            .add_systems(Render, queue_vertices.in_set(RenderSet::QueueFlush));
 
         render_app.add_render_command::<TransparentUI, DrawUI>();
         render_app.add_render_command::<TransparentOpacityUI, DrawUITransparent>();
     }
+
+    fn finish(&self, app: &mut bevy::prelude::App) {
+        app.sub_app_mut(RenderApp)
+            .init_resource::<UnifiedPipeline>()
+            .init_resource::<SpecializedRenderPipelines<UnifiedPipeline>>();
+    }
 }
 
 #[derive(Resource)]
diff --git a/src/render/unified/pipeline.rs b/src/render/unified/pipeline.rs
index 33febefa614692ce05e4d694964f7bde38b96ca0..0c862353abf3fd966ae8e911dd80baaf695ce9da 100644
--- a/src/render/unified/pipeline.rs
+++ b/src/render/unified/pipeline.rs
@@ -87,7 +87,7 @@ pub struct UnifiedPipelineKey {
 impl FromWorld for UnifiedPipeline {
     fn from_world(world: &mut World) -> Self {
         let world = world.cell();
-        let render_device = world.get_resource::<RenderDevice>().unwrap();
+        let render_device = world.resource::<RenderDevice>();
 
         let view_layout = render_device.create_bind_group_layout(&BindGroupLayoutDescriptor {
             entries: &[
diff --git a/src/render/unified/shaders/bindings.wgsl b/src/render/unified/shaders/bindings.wgsl
index 1acc02bd545085094c7d7d7dc1c4adcbdfe1a142..ff02245ed819811dc0aee948e01c24ed728b3ef8 100644
--- a/src/render/unified/shaders/bindings.wgsl
+++ b/src/render/unified/shaders/bindings.wgsl
@@ -7,8 +7,8 @@
 // @group(0) @binding(0)
 // var<uniform> view: View;
 
-#import bevy_render::view
-#import bevy_render::globals
+#import bevy_render::view View
+#import bevy_render::globals Globals
 
 @group(0) @binding(0)
 var<uniform> view: View;
@@ -18,9 +18,6 @@ var<uniform> globals: Globals;
 
 struct QuadType {
     t: i32,
-    _padding_1: i32,
-    _padding_2: i32,
-    _padding_3: i32,
 };
 
 @group(2) @binding(0)
@@ -34,4 +31,4 @@ var image_sampler: sampler;
 @group(1) @binding(2)
 var font_texture: texture_2d_array<f32>;
 @group(1) @binding(3)
-var font_sampler: sampler;
\ No newline at end of file
+var font_sampler: sampler;
diff --git a/src/render/unified/shaders/sample_quad.wgsl b/src/render/unified/shaders/sample_quad.wgsl
index 65f11b2f8b482c1f29eac100acc06ff94ec13848..7a8adee5d46b7e8e1a956695cd1a617272cbdf7c 100644
--- a/src/render/unified/shaders/sample_quad.wgsl
+++ b/src/render/unified/shaders/sample_quad.wgsl
@@ -1,5 +1,13 @@
 #define_import_path kayak_ui::sample_quad
 
+#import kayak_ui::bindings font_texture
+#import kayak_ui::bindings font_sampler
+#import kayak_ui::bindings image_texture
+#import kayak_ui::bindings image_sampler
+#import kayak_ui::bindings quad_type
+
+#import kayak_ui::vertex_output VertexOutput
+
 // Where P is the position in pixel space, B is the size of the box adn R is the radius of the current corner.
 fn sdRoundBox(p: vec2<f32>, b: vec2<f32>, r: f32) -> f32 {
     var q = abs(p) - b + r;
@@ -94,4 +102,4 @@ fn sample_quad(in: VertexOutput) -> vec4<f32> {
     }
 
     return output_color;
-}
\ No newline at end of file
+}
diff --git a/src/render/unified/shaders/shader.wgsl b/src/render/unified/shaders/shader.wgsl
index 569bc4b404ba49b4359cfa34fcb23ee6ba2a7a64..de7b77442a5e7c31a60a006f5765257f78aee54b 100644
--- a/src/render/unified/shaders/shader.wgsl
+++ b/src/render/unified/shaders/shader.wgsl
@@ -1,6 +1,6 @@
 #import kayak_ui::bindings
 
-#import kayak_ui::vertex_output
+#import kayak_ui::vertex_output VertexOutput
 
 @vertex
 fn vertex(
diff --git a/src/render/unified/text.rs b/src/render/unified/text.rs
index 00c0366563312135db05298172298fbf739521b2..71f3301f8da3d48d7468093f5e0c68b49f0f6f3c 100644
--- a/src/render/unified/text.rs
+++ b/src/render/unified/text.rs
@@ -1,10 +1,10 @@
 use bevy::{
-    prelude::{IntoSystemConfig, Plugin, Res, ResMut},
+    prelude::{IntoSystemConfigs, Plugin, Res, ResMut},
     render::{
         render_asset::RenderAssets,
         renderer::{RenderDevice, RenderQueue},
         texture::Image,
-        RenderApp, RenderSet,
+        Render, RenderApp, RenderSet,
     },
 };
 use kayak_font::bevy::{FontTextureCache, KayakFontPlugin};
@@ -14,10 +14,13 @@ pub struct TextRendererPlugin;
 
 impl Plugin for TextRendererPlugin {
     fn build(&self, app: &mut bevy::prelude::App) {
-        app.add_plugin(KayakFontPlugin);
+        app.add_plugins(KayakFontPlugin);
 
         let render_app = app.sub_app_mut(RenderApp);
-        render_app.add_system(create_and_update_font_cache_texture.in_set(RenderSet::Queue));
+        render_app.add_systems(
+            Render,
+            create_and_update_font_cache_texture.in_set(RenderSet::Queue),
+        );
     }
 }
 fn create_and_update_font_cache_texture(
diff --git a/src/styles/corner.rs b/src/styles/corner.rs
index fa02cdd1f73f6542bce7e84fced2185c68ab332a..4ffbf158299760f743de185d1941a771705d3f84 100644
--- a/src/styles/corner.rs
+++ b/src/styles/corner.rs
@@ -1,11 +1,11 @@
 use std::ops::{Mul, MulAssign};
 
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 /// A struct for defining properties related to the corners of widgets
 ///
 /// This is useful for things like border radii, etc.
-#[derive(Debug, Default, Reflect, FromReflect, Copy, Clone, PartialEq, Eq)]
+#[derive(Debug, Default, Reflect, Copy, Clone, PartialEq, Eq)]
 pub struct Corner<T>
 where
     T: Copy + Default + PartialEq + Reflect,
diff --git a/src/styles/edge.rs b/src/styles/edge.rs
index b11e1bc2de636b494bfbdf7e04807179ecdf784e..744c56f83cc02901e987e2ded1d32797872eabbd 100644
--- a/src/styles/edge.rs
+++ b/src/styles/edge.rs
@@ -1,11 +1,11 @@
 use std::ops::{Mul, MulAssign};
 
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 /// A struct for defining properties related to the edges of widgets
 ///
 /// This is useful for things like borders, padding, etc.
-#[derive(Debug, Default, Reflect, FromReflect, Copy, Clone, PartialEq, Eq)]
+#[derive(Debug, Default, Reflect, Copy, Clone, PartialEq, Eq)]
 pub struct Edge<T>
 where
     T: Copy + Default + PartialEq + Reflect,
diff --git a/src/styles/mod.rs b/src/styles/mod.rs
index 5a084d9a59b3105c9c53606678911e9fd19ee0ca..e9260db11e743dbb65605bd603fd639048d977ae 100644
--- a/src/styles/mod.rs
+++ b/src/styles/mod.rs
@@ -1,6 +1,6 @@
 use bevy::{
     prelude::{Color, Component, Vec2},
-    reflect::{FromReflect, Reflect},
+    reflect::Reflect,
 };
 
 mod corner;
@@ -27,7 +27,7 @@ impl From<KStyle> for ComputedStyles {
     }
 }
 
-#[derive(FromReflect, Reflect, Clone, Copy, Default, Debug, PartialEq)]
+#[derive(Reflect, Clone, Copy, Default, Debug, PartialEq)]
 pub struct BoxShadow {
     pub color: Color,
     pub radius: f32,
diff --git a/src/styles/render_command.rs b/src/styles/render_command.rs
index 41150acd9fffcd9bd2cf8c38dd85f966e29b9ca1..199c5196a5af82aafbc8c2ac77cb84a5607a3da0 100644
--- a/src/styles/render_command.rs
+++ b/src/styles/render_command.rs
@@ -1,13 +1,13 @@
 use bevy::{
     prelude::{Handle, Image, Vec2},
-    reflect::{FromReflect, Reflect},
+    reflect::Reflect,
 };
 use bevy_svg::prelude::Svg;
 use kayak_font::{Alignment, TextLayout, TextProperties};
 
 use super::Edge;
 
-#[derive(Debug, Reflect, FromReflect, Clone, PartialEq)]
+#[derive(Debug, Reflect, Clone, PartialEq)]
 pub enum RenderCommand {
     Empty,
     /// Represents a node that has no renderable object but contributes to the layout.
diff --git a/src/styles/style.rs b/src/styles/style.rs
index 60b697d5caa0e0bf3852adca62bc2f19afaf0e0c..2e987fd43834eaa0a53e2ad385f93cbf13c08a27 100644
--- a/src/styles/style.rs
+++ b/src/styles/style.rs
@@ -26,12 +26,6 @@ use super::RenderCommand;
 #[derive(Debug, Reflect, Clone, PartialEq, Eq)]
 pub struct KCursorIcon(#[reflect(ignore)] pub CursorIcon);
 
-impl FromReflect for KCursorIcon {
-    fn from_reflect(_reflect: &dyn Reflect) -> Option<Self> {
-        None
-    }
-}
-
 impl Default for KCursorIcon {
     fn default() -> Self {
         Self(CursorIcon::Default)
@@ -41,7 +35,7 @@ impl Default for KCursorIcon {
 /// The base container of all style properties
 ///
 /// The default value for this enum is [`StyleProp::Unset`].
-#[derive(Debug, Reflect, FromReflect, Clone, PartialEq, Eq)]
+#[derive(Debug, Reflect, Clone, PartialEq, Eq)]
 pub enum StyleProp<T: Default + Clone + Reflect + FromReflect> {
     /// This prop is unset, meaning its actual value is not determined until style resolution,
     /// wherein it will be set to the property's default value.
@@ -265,7 +259,7 @@ define_styles! {
     ///   // Applied second (sets any remaining `StyleProp::Unset` fields)
     ///   .with_style(&style_b);
     /// ```
-    #[derive(Component, Reflect, FromReflect, Debug, Default, Clone, PartialEq)]
+    #[derive(Component, Reflect, Debug, Default, Clone, PartialEq)]
     #[reflect(Component)]
     pub struct KStyle {
         /// The background color of this widget
diff --git a/src/styles/units.rs b/src/styles/units.rs
index 439ab70acb6e1202cf4c5b9d3622e9ef8dba4037..a3d21d12194087d6a11fc1f17ceca3e23308a6d6 100644
--- a/src/styles/units.rs
+++ b/src/styles/units.rs
@@ -1,7 +1,7 @@
-use bevy::reflect::{FromReflect, Reflect};
+use bevy::reflect::Reflect;
 
 /// The layout type determines how nodes will be positioned when directed by the parent
-#[derive(Default, Debug, FromReflect, Reflect, Clone, Copy, PartialEq)]
+#[derive(Default, Debug, Reflect, Clone, Copy, PartialEq)]
 pub enum LayoutType {
     /// Stack child elements horizontally
     Row,
@@ -23,7 +23,7 @@ impl From<LayoutType> for morphorm::LayoutType {
 }
 
 /// The position type determines whether a node will be positioned in-line with its siblings or seperate
-#[derive(Default, Debug, Reflect, FromReflect, Clone, Copy, PartialEq)]
+#[derive(Default, Debug, Reflect, Clone, Copy, PartialEq)]
 pub enum KPositionType {
     /// Node is positioned relative to parent but ignores its siblings
     SelfDirected,
@@ -42,7 +42,7 @@ impl From<KPositionType> for morphorm::PositionType {
 }
 
 /// Units which describe spacing and size
-#[derive(Default, Debug, FromReflect, Reflect, Clone, Copy, PartialEq)]
+#[derive(Default, Debug, Reflect, Clone, Copy, PartialEq)]
 pub enum Units {
     /// A number of pixels
     Pixels(f32),
diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs
index 6a76cdaef529d117543ed27695173ec6b79f499c..7df50cb41ff8a3c1d7fc13f2510c45ac14e789f9 100644
--- a/src/widgets/mod.rs
+++ b/src/widgets/mod.rs
@@ -101,13 +101,12 @@ pub struct KayakWidgets;
 
 impl Plugin for KayakWidgets {
     fn build(&self, app: &mut bevy::prelude::App) {
-        app.add_plugin(icons::IconsPlugin);
-        app.add_system(
-            transition::update_transitions
-                .after(update_widgets_sys)
-                .in_base_set(CoreSet::PostUpdate),
+        app.add_plugins(icons::IconsPlugin);
+        app.add_systems(
+            PostUpdate,
+            transition::update_transitions.after(update_widgets_sys),
         )
-        .add_system(text_box::cursor_animation_system);
+        .add_systems(Update, text_box::cursor_animation_system);
     }
 }