diff --git a/Cargo.toml b/Cargo.toml
index 9e0aeb968f7f653f9e4ba466f1250861c0e65858..f126af3c6e404ec734e98079ed0fb72749b3f5fc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "micro_musicbox"
-version = "0.5.1"
+version = "0.6.0"
 edition = "2021"
 license = "Apache-2.0"
 authors = ["Louis Capitanchik <louis@microhacks.co.uk>"]
@@ -19,10 +19,10 @@ wav = ["bevy_kira_audio/wav"]
 ogg = ["bevy_kira_audio/ogg"]
 
 [dependencies]
-bevy = { version = "0.9.1", default-features = false }
-bevy_kira_audio = { version = "0.13.0", default-features = false }
+bevy = { version = "0.10.0", default-features = false }
+bevy_kira_audio = { version = "0.15.0", default-features = false }
 serde = { version = "1", optional = true }
 
 [dev_dependencies]
-bevy = "0.9.1"
+bevy = "0.10.0"
 log = "0.4"
diff --git a/README.md b/README.md
index f03d22efdfd450d254a1cb500bcc0d2c7fb8ce3b..9a23019fe9337bac31a114c2fa5bcfb908faa89e 100644
--- a/README.md
+++ b/README.md
@@ -139,5 +139,6 @@ The examples in this repository use assets available under the following license
 
 | musicbox version | bevy version | bka version |
 |------------------|--------------|-------------|
+| 0.6              | 0.10         | 0.15        |
 | 0.5              | 0.9          | 0.13        |
 | 0.4              | 0.8.0        | 0.12        |
\ No newline at end of file
diff --git a/examples/basic.rs b/examples/basic.rs
index ee5f2950be03bf5a2b0437bfe30cd6389588fd75..22b0886bd5a298fe81f33f655b0e7c143915dcc5 100644
--- a/examples/basic.rs
+++ b/examples/basic.rs
@@ -1,10 +1,18 @@
 use bevy::prelude::*;
+use bevy::window::WindowResolution;
 use micro_musicbox::prelude::*;
 use micro_musicbox::CombinedAudioPlugins;
 
 fn main() {
 	App::new()
-		.add_plugins(DefaultPlugins)
+		.add_plugins(DefaultPlugins.set(WindowPlugin {
+			primary_window: Some(Window {
+				resolution: WindowResolution::new(800.0, 600.0),
+				title: String::from("Kitchen Sink Example"),
+				..Default::default()
+			}),
+			..Default::default()
+		}))
 		.add_plugins(CombinedAudioPlugins::<AssetServer>::new())
 		.add_startup_system(play_audio)
 		.run();
diff --git a/examples/kitchen_sink.rs b/examples/kitchen_sink.rs
index cf4dff5e4784d569583d57eab6fcf1b0aec8ab8d..6199a44a61fb4b6a150f71109cfc36026fee06bc 100644
--- a/examples/kitchen_sink.rs
+++ b/examples/kitchen_sink.rs
@@ -5,9 +5,8 @@
 
 use std::time::Duration;
 
-use bevy::ecs::schedule::ShouldRun;
 use bevy::prelude::*;
-use micro_musicbox::prelude::AudioSource;
+use bevy::window::WindowResolution;
 use micro_musicbox::prelude::*;
 use micro_musicbox::CombinedAudioPlugins;
 
@@ -18,22 +17,34 @@ mod utilities;
 pub fn main() {
 	App::new()
 		.add_plugin(utilities::SetupPlugin) // Loads resources
-		.add_plugins(DefaultPlugins)
-		.add_plugins(CombinedAudioPlugins::<AssetServer>::new())
-		.add_system_set(SystemSet::on_enter(AppState::Running).with_system(setup_audio).with_system(set_instructions))
-		.add_system_set(SystemSet::on_update(AppState::Running).with_run_criteria(has_music_state).with_system(cross_fade_tracks))
+		.add_plugins(DefaultPlugins.set(WindowPlugin {
+			primary_window: Some(Window {
+				resolution: WindowResolution::new(800.0, 600.0),
+				title: String::from("Kitchen Sink Example"),
+				..Default::default()
+			}),
+			..Default::default()
+		}))		.add_plugins(CombinedAudioPlugins::<AssetServer>::new())
+		.add_system(
+			setup_audio.in_schedule(OnEnter(AppState::Running))
+		)
+		.add_system(
+			set_instructions.in_schedule(OnEnter(AppState::Running))
+		)
+		.add_system(cross_fade_tracks.run_if(resource_exists::<MusicState>()))
 		.run();
 }
 
 /// A resource that we'll use to keep track of which track is currently the active one, for fading
 /// in and out
+#[derive(Resource)]
 pub struct MusicState {
 	pub playing_first: bool,
 }
 
-pub fn has_music_state(state: Option<Res<MusicState>>) -> ShouldRun {
-	state.is_some().into()
-}
+// pub fn has_music_state(state: Option<Res<MusicState>>) -> ShouldRun {
+// 	state.is_some().into()
+// }
 
 pub fn set_instructions(
 	mut instructions: Query<&mut Text, (With<TextMarker>, Without<DetailsMarker>)>,
diff --git a/examples/utilities/mod.rs b/examples/utilities/mod.rs
index 554f5661e3673d3e539e7e57f943e971e0affe66..3f82ecc083fe1edf39840bcadf383635f3078b6f 100644
--- a/examples/utilities/mod.rs
+++ b/examples/utilities/mod.rs
@@ -1,17 +1,17 @@
 use bevy::app::Plugin;
 use bevy::asset::{Handle, LoadState};
-use bevy::ecs::schedule::ShouldRun;
 use bevy::prelude::*;
 use bevy_kira_audio::AudioSource;
 
 /// We store our asset handles in this to avoid Bevy from dropping the assets and reloading
 /// when we switch tracks
+#[derive(Resource)]
 pub struct AudioResources {
 	pub white_kitty: Handle<AudioSource>,
 	pub great_madeja: Handle<AudioSource>,
 }
 
-#[derive(Default, Eq, PartialEq, Debug, Clone, Hash)]
+#[derive(Default, Eq, PartialEq, Debug, Clone, Hash, States)]
 pub enum AppState {
 	#[default]
 	Loading,
@@ -31,14 +31,18 @@ pub fn load_resources(mut commands: Commands, assets: Res<AssetServer>) {
 pub fn check_load_state(
 	assets: Res<AssetServer>,
 	resources: Res<AudioResources>,
-	mut appstate: ResMut<State<AppState>>,
+	appstate: Res<State<AppState>>,
+	mut next_state: ResMut<NextState<AppState>>,
 ) {
-	let load_state =
-		assets.get_group_load_state(vec![resources.white_kitty.id, resources.great_madeja.id]);
+	let load_state = assets.get_group_load_state(vec![
+		resources.white_kitty.id(),
+		resources.great_madeja.id(),
+	]);
 
 	match load_state {
 		LoadState::Loaded => {
-			appstate.set(AppState::Running);
+			log::info!("STATE {:?}", appstate);
+			*next_state = NextState(Some(AppState::Running)); // appstate.set(AppState::Running);
 		}
 		LoadState::Loading => {}
 		_ => {
@@ -47,15 +51,15 @@ pub fn check_load_state(
 	}
 }
 
-pub fn has_audio_resources(res: Option<Res<AudioResources>>) -> ShouldRun {
-	res.is_some().into()
-}
-pub fn is_state_loading(state: Res<AppState>) -> ShouldRun {
-	(*state == AppState::Loading).into()
-}
-pub fn is_state_running(state: Res<AppState>) -> ShouldRun {
-	(*state == AppState::Running).into()
-}
+// pub fn has_audio_resources(res: Option<Res<AudioResources>>) -> ShouldRun {
+// 	res.is_some().into()
+// }
+// pub fn is_state_loading(state: Res<AppState>) -> ShouldRun {
+// 	(*state == AppState::Loading).into()
+// }
+// pub fn is_state_running(state: Res<AppState>) -> ShouldRun {
+// 	(*state == AppState::Running).into()
+// }
 
 /// This component allows us to easily grab the on screen text
 #[derive(Component)]
@@ -65,9 +69,9 @@ pub struct TextMarker;
 pub struct DetailsMarker;
 
 pub fn create_ui(mut commands: Commands, assets: Res<AssetServer>) {
-	commands.spawn_bundle(Camera2dBundle::default());
+	commands.spawn(Camera2dBundle::default());
 	commands
-		.spawn_bundle(NodeBundle {
+		.spawn(NodeBundle {
 			style: Style {
 				size: Size::new(Val::Percent(100.0), Val::Percent(100.0)),
 				justify_content: JustifyContent::Center,
@@ -79,7 +83,7 @@ pub fn create_ui(mut commands: Commands, assets: Res<AssetServer>) {
 		})
 		.with_children(|children| {
 			children
-				.spawn_bundle(TextBundle {
+				.spawn(TextBundle {
 					text: Text::from_section(
 						"Loading Audio Tracks",
 						TextStyle {
@@ -92,7 +96,7 @@ pub fn create_ui(mut commands: Commands, assets: Res<AssetServer>) {
 				})
 				.insert(TextMarker);
 			children
-				.spawn_bundle(TextBundle {
+				.spawn(TextBundle {
 					text: Text::from_section(
 						"...",
 						TextStyle {
@@ -110,19 +114,13 @@ pub fn create_ui(mut commands: Commands, assets: Res<AssetServer>) {
 pub struct SetupPlugin;
 impl Plugin for SetupPlugin {
 	fn build(&self, app: &mut App) {
-		app.add_state(AppState::Loading)
-			.insert_resource(WindowDescriptor {
-				width: 800.0,
-				height: 600.0,
-				title: String::from("Kitchen Sink Example"),
-				..Default::default()
-			})
+		app.add_state::<AppState>()
 			.add_startup_system(load_resources)
 			.add_startup_system(create_ui)
-			.add_system_set(
-				SystemSet::on_update(AppState::Loading)
-					.with_run_criteria(has_audio_resources)
-					.with_system(check_load_state),
+			.add_system(
+				check_load_state
+					.run_if(resource_exists::<AudioResources>())
+					.run_if(in_state(AppState::Loading)),
 			);
 	}
 }
diff --git a/src/lib.rs b/src/lib.rs
index 9e59e4ed0c3f82398da305bd37b2c15561fe0796..543855b8d5e1a132b8e76c34d43e2cf566596db7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -25,7 +25,8 @@
 
 use std::marker::PhantomData;
 
-use bevy::app::{App, CoreStage, Plugin, PluginGroup, PluginGroupBuilder};
+use bevy::app::{App, CoreSet, Plugin, PluginGroup, PluginGroupBuilder};
+use bevy::prelude::{IntoSystemConfig, SystemSet};
 use bevy_kira_audio::{AudioApp, AudioPlugin};
 
 use crate::channels::{
@@ -81,7 +82,7 @@ impl<T: SuppliesAudio> Plugin for MusicBoxPlugin<T> {
 			.add_audio_channel::<UiSfxAudioChannel>()
 			.insert_resource(AudioSettings::default())
 			.insert_resource(MusicBoxState::default())
-			.add_system_to_stage(CoreStage::Last, utilities::sync_music_volume::<T>);
+			.add_system(utilities::sync_music_volume::<T>.in_base_set(CoreSet::Last));
 	}
 }