diff --git a/crates/configuration/src/global_settings.rs b/crates/configuration/src/global_settings.rs
index 607951e8934e88c6f602533158e28fc11d7f03bc..0e27f18861fae89e44bf554c049a6532ba585c60 100644
--- a/crates/configuration/src/global_settings.rs
+++ b/crates/configuration/src/global_settings.rs
@@ -17,6 +17,7 @@ pub struct GlobalSettings {
     // TODO: parse both case in zombienet node version to avoid renamed ?
     #[serde(rename = "timeout")]
     network_spawn_timeout: Duration,
+    #[serde(default)]
     node_spawn_timeout: Duration,
     local_ip: Option<IpAddr>,
 }
@@ -189,6 +190,38 @@ mod tests {
         );
     }
 
+    #[test]
+    fn global_settings_config_builder_should_succeeds_when_node_spawn_timeout_is_missing() {
+        let global_settings_config = GlobalSettingsBuilder::new()
+            .with_bootnodes_addresses(vec![
+                "/ip4/10.41.122.55/tcp/45421",
+                "/ip4/51.144.222.10/tcp/2333",
+            ])
+            .with_network_spawn_timeout(600)
+            .with_local_ip("10.0.0.1")
+            .build()
+            .unwrap();
+
+        let bootnodes_addresses: Vec<Multiaddr> = vec![
+            "/ip4/10.41.122.55/tcp/45421".try_into().unwrap(),
+            "/ip4/51.144.222.10/tcp/2333".try_into().unwrap(),
+        ];
+        assert_eq!(
+            global_settings_config.bootnodes_addresses(),
+            bootnodes_addresses.iter().collect::<Vec<_>>()
+        );
+        assert_eq!(global_settings_config.network_spawn_timeout(), 600);
+        assert_eq!(global_settings_config.node_spawn_timeout(), 300);
+        assert_eq!(
+            global_settings_config
+                .local_ip()
+                .unwrap()
+                .to_string()
+                .as_str(),
+            "10.0.0.1"
+        );
+    }
+
     #[test]
     fn global_settings_builder_should_fails_and_returns_an_error_if_one_bootnode_address_is_invalid(
     ) {
diff --git a/crates/configuration/src/network.rs b/crates/configuration/src/network.rs
index 9569f6fdf64dfb5ec1d06e5f2725ccf2f04ec964..d0a976b2fba083ed2b80a98bebe44c5271a73f68 100644
--- a/crates/configuration/src/network.rs
+++ b/crates/configuration/src/network.rs
@@ -81,9 +81,12 @@ impl NetworkConfig {
         }
 
         // retrieve the defaults relaychain for assigning to nodes if needed
-        let relaychain_default_command: Option<Command> =
+        let mut relaychain_default_command: Option<Command> =
             network_config.relaychain().default_command().cloned();
 
+        if relaychain_default_command.is_none() {
+            relaychain_default_command = network_config.relaychain().command().cloned();
+        }
         let relaychain_default_image: Option<Image> =
             network_config.relaychain().default_image().cloned();
 
@@ -144,14 +147,6 @@ impl NetworkConfig {
 
         // Validation checks for parachains
         network_config.parachains().iter().for_each(|parachain| {
-            let _ = TryInto::<Chain>::try_into(
-                parachain
-                    .chain()
-                    .ok_or("chain name must exist")
-                    .unwrap()
-                    .as_str(),
-            );
-
             if parachain.default_image().is_some() {
                 let _ = TryInto::<Image>::try_into(parachain.default_image().unwrap().as_str());
             }
diff --git a/crates/configuration/src/parachain.rs b/crates/configuration/src/parachain.rs
index 8dd9c9bcd9a8c3f01041ce59794ff395c4ed690e..ca29aa0b443fd78ab215ffeb6dd781d2bc5236d8 100644
--- a/crates/configuration/src/parachain.rs
+++ b/crates/configuration/src/parachain.rs
@@ -105,7 +105,7 @@ pub struct ParachainConfig {
         default = "default_as_true"
     )]
     onboard_as_parachain: bool,
-    #[serde(rename = "balance")]
+    #[serde(rename = "balance", default)]
     initial_balance: U128,
     default_command: Option<Command>,
     default_image: Option<Image>,
@@ -118,7 +118,7 @@ pub struct ParachainConfig {
     genesis_state_path: Option<AssetLocation>,
     genesis_state_generator: Option<Command>,
     chain_spec_path: Option<AssetLocation>,
-    #[serde(rename = "cumulus_based")]
+    #[serde(rename = "cumulus_based", default = "default_as_true")]
     is_cumulus_based: bool,
     #[serde(skip_serializing_if = "std::vec::Vec::is_empty", default)]
     bootnodes_addresses: Vec<Multiaddr>,
diff --git a/crates/configuration/src/relaychain.rs b/crates/configuration/src/relaychain.rs
index f226b79d7ba985e3042989ce3bbf746f37bee898..f5bc906212d6e36814f9caac8c04f575640b7e68 100644
--- a/crates/configuration/src/relaychain.rs
+++ b/crates/configuration/src/relaychain.rs
@@ -28,6 +28,7 @@ pub struct RelaychainConfig {
     #[serde(skip_serializing_if = "std::vec::Vec::is_empty", default)]
     nodes: Vec<NodeConfig>,
     genesis_overrides: Option<serde_json::Value>,
+    command: Option<Command>,
 }
 
 impl RelaychainConfig {
@@ -66,6 +67,11 @@ impl RelaychainConfig {
         self.chain_spec_path.as_ref()
     }
 
+    /// The non-default command used for nodes.
+    pub fn command(&self) -> Option<&Command> {
+        self.command.as_ref()
+    }
+
     /// The number of `random nominators` to create for chains using staking, this is used in tandem with `max_nominations` to simulate the amount of nominators and nominations.
     pub fn random_nominators_count(&self) -> Option<u32> {
         self.random_nominators_count
@@ -118,6 +124,7 @@ impl Default for RelaychainConfigBuilder<Initial> {
                 default_db_snapshot: None,
                 default_args: vec![],
                 chain_spec_path: None,
+                command: None,
                 random_nominators_count: None,
                 max_nominations: None,
                 genesis_overrides: None,
diff --git a/crates/configuration/src/shared/node.rs b/crates/configuration/src/shared/node.rs
index 9b11d2709222ae90287996521859e0a9be78d4ad..cbfa72473d8c5ca7c30d9ab85f7e27a2477c815c 100644
--- a/crates/configuration/src/shared/node.rs
+++ b/crates/configuration/src/shared/node.rs
@@ -66,7 +66,7 @@ pub struct NodeConfig {
     pub(crate) is_validator: bool,
     #[serde(alias = "invulnerable", default = "default_as_true")]
     pub(crate) is_invulnerable: bool,
-    #[serde(alias = "bootnode")]
+    #[serde(alias = "bootnode", default)]
     pub(crate) is_bootnode: bool,
     #[serde(alias = "balance")]
     #[serde(default)]
diff --git a/crates/examples/examples/0001-simple.toml b/crates/examples/examples/0001-simple.toml
new file mode 100644
index 0000000000000000000000000000000000000000..3a0bc70840f658e87a2f2b7dd2d4de71ba0cf6c3
--- /dev/null
+++ b/crates/examples/examples/0001-simple.toml
@@ -0,0 +1,30 @@
+[settings]
+timeout = 1000
+
+[relaychain]
+default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}"
+chain = "rococo-local"
+command = "polkadot"
+
+  [[relaychain.nodes]]
+  name = "alice"
+  args = [ "--alice", "-lruntime=debug,parachain=trace" ]
+
+  [[relaychain.nodes]]
+  name = "bob"
+  args = [ "--bob", "-lruntime=debug,parachain=trace" ]
+
+[[parachains]]
+id = 100
+addToGenesis = false
+
+  [parachains.collator]
+  name = "collator01"
+  image = "{{COL_IMAGE}}"
+  command = "adder-collator"
+  args = [ "-lruntime=debug,parachain=trace" ]
+
+[types.Header]
+number = "u64"
+parent_hash = "Hash"
+post_state = "Hash"
\ No newline at end of file
diff --git a/crates/examples/examples/simple_network_example.rs b/crates/examples/examples/simple_network_example.rs
new file mode 100644
index 0000000000000000000000000000000000000000..676511ce5184003e2fd3a19844debb5194106803
--- /dev/null
+++ b/crates/examples/examples/simple_network_example.rs
@@ -0,0 +1,23 @@
+// use std::time::Duration;
+
+use configuration::NetworkConfig;
+use orchestrator::Orchestrator;
+use provider::NativeProvider;
+use support::fs::local::LocalFileSystem;
+
+#[tokio::main]
+async fn main() -> Result<(), Box<dyn std::error::Error>> {
+    let config = NetworkConfig::load_from_toml("./crates/examples/examples/0001-simple.toml")
+        .expect("errored?");
+
+    let fs = LocalFileSystem;
+    let provider = NativeProvider::new(fs.clone());
+    let orchestrator = Orchestrator::new(fs, provider);
+    orchestrator.spawn(config).await?;
+    println!("🚀🚀🚀🚀 network deployed");
+    // For now let just loop....
+    #[allow(clippy::empty_loop)]
+    loop {}
+
+    // Ok(())
+}