|  | 1 | +diff --git a/components/support/nimbus-fml/src/intermediate_representation.rs b/components/support/nimbus-fml/src/intermediate_representation.rs
 | 
|  | 2 | +index e61f8a728..c1e396cab 100644
 | 
|  | 3 | +--- a/components/support/nimbus-fml/src/intermediate_representation.rs
 | 
|  | 4 | ++++ b/components/support/nimbus-fml/src/intermediate_representation.rs
 | 
|  | 5 | +@@ -8,7 +8,7 @@ use crate::util::loaders::FilePath;
 | 
|  | 6 | + use anyhow::{bail, Error, Result as AnyhowResult};
 | 
|  | 7 | + use serde::{Deserialize, Serialize};
 | 
|  | 8 | + use serde_json::{Map, Value};
 | 
|  | 9 | +-use std::collections::{BTreeSet, HashMap, HashSet};
 | 
|  | 10 | ++use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
 | 
|  | 11 | + use std::fmt::Display;
 | 
|  | 12 | + use std::slice::Iter;
 | 
|  | 13 | + 
 | 
|  | 14 | +@@ -191,10 +191,10 @@ pub struct FeatureManifest {
 | 
|  | 15 | +     pub(crate) about: AboutBlock,
 | 
|  | 16 | + 
 | 
|  | 17 | +     #[serde(default)]
 | 
|  | 18 | +-    pub(crate) imported_features: HashMap<ModuleId, BTreeSet<String>>,
 | 
|  | 19 | ++    pub(crate) imported_features: BTreeMap<ModuleId, BTreeSet<String>>,
 | 
|  | 20 | + 
 | 
|  | 21 | +     #[serde(default)]
 | 
|  | 22 | +-    pub(crate) all_imports: HashMap<ModuleId, FeatureManifest>,
 | 
|  | 23 | ++    pub(crate) all_imports: BTreeMap<ModuleId, FeatureManifest>,
 | 
|  | 24 | + }
 | 
|  | 25 | + 
 | 
|  | 26 | + impl TypeFinder for FeatureManifest {
 | 
| 1 | 27 |  diff --git a/components/support/nimbus-fml/src/parser.rs b/components/support/nimbus-fml/src/parser.rs
 | 
| 2 |  | -index bb676f827..d00b1b6ef 100644
 | 
|  | 28 | +index bb676f827..0d7e78583 100644
 | 
| 3 | 29 |  --- a/components/support/nimbus-fml/src/parser.rs
 | 
| 4 | 30 |  +++ b/components/support/nimbus-fml/src/parser.rs
 | 
| 5 | 31 |  @@ -26,7 +26,7 @@ pub(crate) struct EnumVariantBody {
 | 
| ... | ... | @@ -41,6 +67,33 @@ index bb676f827..d00b1b6ef 100644 | 
| 41 | 67 |   
 | 
| 42 | 68 |       #[serde(default)]
 | 
| 43 | 69 |       #[serde(alias = "include")]
 | 
|  | 70 | +@@ -785,7 +785,7 @@ impl Parser {
 | 
|  | 71 | +         &self,
 | 
|  | 72 | +         current: &FilePath,
 | 
|  | 73 | +         channel: &str,
 | 
|  | 74 | +-        imports: &mut HashMap<ModuleId, FeatureManifest>,
 | 
|  | 75 | ++        imports: &mut BTreeMap<ModuleId, FeatureManifest>,
 | 
|  | 76 | +     ) -> Result<ModuleId> {
 | 
|  | 77 | +         let id = current.try_into()?;
 | 
|  | 78 | +         if imports.contains_key(&id) {
 | 
|  | 79 | +@@ -814,7 +814,7 @@ impl Parser {
 | 
|  | 80 | +         // This loop does the work of merging the default blocks back into the imported manifests.
 | 
|  | 81 | +         // We'll then attach all the manifests to the root (i.e. the one we're generating code for today), in `imports`.
 | 
|  | 82 | +         // We associate only the feature ids with the manifest we're loading in this method.
 | 
|  | 83 | +-        let mut imported_feature_id_map = HashMap::new();
 | 
|  | 84 | ++        let mut imported_feature_id_map = BTreeMap::new();
 | 
|  | 85 | + 
 | 
|  | 86 | +         for block in &frontend.imports {
 | 
|  | 87 | +             // 1. Load the imported manifests in to the hash map.
 | 
|  | 88 | +@@ -888,7 +888,7 @@ impl Parser {
 | 
|  | 89 | +         &self,
 | 
|  | 90 | +         channel: &str,
 | 
|  | 91 | +     ) -> Result<FeatureManifest, FMLError> {
 | 
|  | 92 | +-        let mut manifests = HashMap::new();
 | 
|  | 93 | ++        let mut manifests = BTreeMap::new();
 | 
|  | 94 | +         let id = self.load_imports(&self.source, channel, &mut manifests)?;
 | 
|  | 95 | +         let mut fm = manifests
 | 
|  | 96 | +             .remove(&id)
 | 
| 44 | 97 |  @@ -1009,12 +1009,12 @@ impl Parser {
 | 
| 45 | 98 |   }
 | 
| 46 | 99 |   
 |