diff --git a/crates/configuration/src/global_settings.rs b/crates/configuration/src/global_settings.rs
index 0e27f18861fae89e44bf554c049a6532ba585c60..f6e73028979536592c44c68851f1bdef68c6cd1f 100644
--- a/crates/configuration/src/global_settings.rs
+++ b/crates/configuration/src/global_settings.rs
@@ -3,10 +3,13 @@ use std::{error::Error, fmt::Display, net::IpAddr, str::FromStr};
 use multiaddr::Multiaddr;
 use serde::{Deserialize, Serialize};
 
-use crate::shared::{
-    errors::{ConfigError, FieldError},
-    helpers::{merge_errors, merge_errors_vecs},
-    types::Duration,
+use crate::{
+    shared::{
+        errors::{ConfigError, FieldError},
+        helpers::{merge_errors, merge_errors_vecs},
+        types::Duration,
+    },
+    utils::default_node_spawn_timeout,
 };
 
 /// Global settings applied to an entire network.
@@ -17,7 +20,7 @@ pub struct GlobalSettings {
     // TODO: parse both case in zombienet node version to avoid renamed ?
     #[serde(rename = "timeout")]
     network_spawn_timeout: Duration,
-    #[serde(default)]
+    #[serde(default = "default_node_spawn_timeout")]
     node_spawn_timeout: Duration,
     local_ip: Option<IpAddr>,
 }
diff --git a/crates/configuration/src/network.rs b/crates/configuration/src/network.rs
index d0a976b2fba083ed2b80a98bebe44c5271a73f68..ee67b191e8ae6f59b1f005322479b629d06ccb56 100644
--- a/crates/configuration/src/network.rs
+++ b/crates/configuration/src/network.rs
@@ -107,6 +107,9 @@ impl NetworkConfig {
             .cloned()
             .collect();
 
+        let mut parachains: Vec<ParachainConfig> =
+            network_config.parachains().into_iter().cloned().collect();
+
         // Validation checks for relay
         TryInto::<Chain>::try_into(network_config.relaychain().chain().as_str())?;
         if relaychain_default_image.is_some() {
@@ -139,6 +142,43 @@ impl NetworkConfig {
             }
         }
 
+        for para in parachains.iter_mut() {
+            // retrieve the defaults parachain for assigning to collators if needed
+            let parachain_default_command: Option<Command> = para.default_command().cloned();
+
+            let parachain_default_image: Option<Image> = para.default_image().cloned();
+
+            let parachain_default_db_snapshot: Option<AssetLocation> =
+                para.default_db_snapshot().cloned();
+
+            let default_args: Vec<Arg> = para.default_args().into_iter().cloned().collect();
+
+            let mut collators: Vec<NodeConfig> = para.collators().into_iter().cloned().collect();
+
+            for collator in collators.iter_mut() {
+                if parachain_default_command.is_some() {
+                    // we modify only nodes which don't already have a command
+                    if collator.command.is_none() {
+                        collator.command = parachain_default_command.clone();
+                    }
+                }
+
+                if parachain_default_image.is_some() && collator.image.is_none() {
+                    collator.image = parachain_default_image.clone();
+                }
+
+                if parachain_default_db_snapshot.is_some() && collator.db_snapshot.is_none() {
+                    collator.db_snapshot = parachain_default_db_snapshot.clone();
+                }
+
+                if !default_args.is_empty() && collator.args().is_empty() {
+                    collator.set_args(default_args.clone());
+                }
+            }
+
+            para.collators = collators;
+        }
+
         network_config
             .relaychain
             .as_mut()
@@ -968,7 +1008,7 @@ mod tests {
                     .with_chain("rococo-local")
                     .with_default_command("polkadot")
                     .with_default_image("docker.io/parity/polkadot:latest")
-                    .with_default_args(vec![("-lparachain", "debug").into()])
+                    .with_default_args(vec![("-lparachain=debug").into()])
                     .with_node(|node| {
                         node.with_name("alice")
                             .validator(true)
diff --git a/crates/configuration/src/parachain.rs b/crates/configuration/src/parachain.rs
index ca29aa0b443fd78ab215ffeb6dd781d2bc5236d8..58cd23c863f48f40d630bd98efdf3a2bf732941a 100644
--- a/crates/configuration/src/parachain.rs
+++ b/crates/configuration/src/parachain.rs
@@ -18,7 +18,7 @@ use crate::{
             Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext, U128,
         },
     },
-    utils::default_as_true,
+    utils::{default_as_true, default_initial_balance},
 };
 
 #[derive(Debug, Clone, PartialEq)]
@@ -61,8 +61,8 @@ impl<'de> Visitor<'de> for RegistrationStrategyVisitor {
 
         while let Some(key) = map.next_key::<String>()? {
             match key.as_str() {
-                "add_to_genesis" => add_to_genesis = map.next_value()?,
-                "register_para" => register_para = map.next_value()?,
+                "addToGenesis" | "add_to_genesis" => add_to_genesis = map.next_value()?,
+                "registerPara" | "register_para" => register_para = map.next_value()?,
                 _ => {
                     return Err(de::Error::unknown_field(
                         &key,
@@ -105,7 +105,7 @@ pub struct ParachainConfig {
         default = "default_as_true"
     )]
     onboard_as_parachain: bool,
-    #[serde(rename = "balance", default)]
+    #[serde(rename = "balance", default = "default_initial_balance")]
     initial_balance: U128,
     default_command: Option<Command>,
     default_image: Option<Image>,
@@ -124,7 +124,7 @@ pub struct ParachainConfig {
     bootnodes_addresses: Vec<Multiaddr>,
     genesis_overrides: Option<serde_json::Value>,
     #[serde(skip_serializing_if = "std::vec::Vec::is_empty", default)]
-    collators: Vec<NodeConfig>,
+    pub collators: Vec<NodeConfig>,
 }
 
 impl ParachainConfig {
diff --git a/crates/configuration/src/relaychain.rs b/crates/configuration/src/relaychain.rs
index f5bc906212d6e36814f9caac8c04f575640b7e68..a3782cda2798152a2fab1c687fbe3bf6d2582973 100644
--- a/crates/configuration/src/relaychain.rs
+++ b/crates/configuration/src/relaychain.rs
@@ -2,20 +2,26 @@ use std::{cell::RefCell, error::Error, fmt::Debug, marker::PhantomData, rc::Rc};
 
 use serde::{Deserialize, Serialize};
 
-use crate::shared::{
-    constants::{DEFAULT_TYPESTATE, THIS_IS_A_BUG},
-    errors::{ConfigError, FieldError},
-    helpers::{merge_errors, merge_errors_vecs},
-    macros::states,
-    node::{self, NodeConfig, NodeConfigBuilder},
-    resources::{Resources, ResourcesBuilder},
-    types::{Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext},
+use crate::{
+    shared::{
+        constants::{DEFAULT_TYPESTATE, THIS_IS_A_BUG},
+        errors::{ConfigError, FieldError},
+        helpers::{merge_errors, merge_errors_vecs},
+        macros::states,
+        node::{self, NodeConfig, NodeConfigBuilder},
+        resources::{Resources, ResourcesBuilder},
+        types::{
+            Arg, AssetLocation, Chain, ChainDefaultContext, Command, Image, ValidationContext,
+        },
+    },
+    utils::default_command_polkadot,
 };
 
 /// A relay chain configuration, composed of nodes and fine-grained configuration options.
 #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 pub struct RelaychainConfig {
     chain: Chain,
+    #[serde(default = "default_command_polkadot")]
     default_command: Option<Command>,
     default_image: Option<Image>,
     default_resources: Option<Resources>,
diff --git a/crates/configuration/src/shared/node.rs b/crates/configuration/src/shared/node.rs
index cbfa72473d8c5ca7c30d9ab85f7e27a2477c815c..16b3905e9b0ea4cbfe039ce200f167988d8e19de 100644
--- a/crates/configuration/src/shared/node.rs
+++ b/crates/configuration/src/shared/node.rs
@@ -15,7 +15,7 @@ use crate::{
         resources::Resources,
         types::{Arg, Port},
     },
-    utils::default_as_true,
+    utils::{default_as_true, default_initial_balance},
 };
 
 /// An environment variable with a name and a value.
@@ -69,7 +69,7 @@ pub struct NodeConfig {
     #[serde(alias = "bootnode", default)]
     pub(crate) is_bootnode: bool,
     #[serde(alias = "balance")]
-    #[serde(default)]
+    #[serde(default = "default_initial_balance")]
     initial_balance: U128,
     #[serde(default)]
     env: Vec<EnvVar>,
diff --git a/crates/configuration/src/shared/types.rs b/crates/configuration/src/shared/types.rs
index 2cdf29c7489b52886e2ec69614ce43567e6af6ad..201e198cfc1465f9e779f95b5a7e67fe5b5bc0bb 100644
--- a/crates/configuration/src/shared/types.rs
+++ b/crates/configuration/src/shared/types.rs
@@ -355,9 +355,13 @@ impl<'de> de::Visitor<'de> for ArgVisitor {
     where
         E: de::Error,
     {
+        // covers the "-lruntime=debug,parachain=trace" case
+        // TODO: Make this more generic by adding the scenario in the regex below
+        if v.starts_with("-l") || v.starts_with("-log") {
+            return Ok(Arg::Flag(v.to_string()));
+        }
         let re = Regex::new("^(?<name_prefix>(?<prefix>-{1,2})(?<name>[a-zA-Z]+(-[a-zA-Z]+)*))((?<separator>=| )(?<value>.+))?$").unwrap();
         let captures = re.captures(v);
-
         if let Some(captures) = captures {
             if let Some(value) = captures.name("value") {
                 return Ok(Arg::Option(
@@ -369,7 +373,6 @@ impl<'de> de::Visitor<'de> for ArgVisitor {
                     value.as_str().to_string(),
                 ));
             }
-
             if let Some(name_prefix) = captures.name("name_prefix") {
                 return Ok(Arg::Flag(name_prefix.as_str().to_string()));
             }
diff --git a/crates/configuration/src/utils.rs b/crates/configuration/src/utils.rs
index ced19103e822498612d8b4a13f702329f2b70ce5..5f68d883c647eb208cd614bc83dc833adf9554af 100644
--- a/crates/configuration/src/utils.rs
+++ b/crates/configuration/src/utils.rs
@@ -1,3 +1,5 @@
+use crate::types::{Command, Duration};
+
 pub(crate) fn is_true(value: &bool) -> bool {
     *value
 }
@@ -5,3 +7,15 @@ pub(crate) fn is_true(value: &bool) -> bool {
 pub(crate) fn default_as_true() -> bool {
     true
 }
+
+pub(crate) fn default_initial_balance() -> crate::types::U128 {
+    2_000_000_000_000.into()
+}
+
+pub(crate) fn default_node_spawn_timeout() -> Duration {
+    300
+}
+
+pub(crate) fn default_command_polkadot() -> Option<Command> {
+    TryInto::<Command>::try_into("polkadot").ok()
+}