diff --git a/package.json b/package.json
index 47142b8c9..a2a07adc4 100644
--- a/package.json
+++ b/package.json
@@ -10,8 +10,9 @@
     "dev": "vite --host",
     "build-core": "yarn workspace @thatopen/components build",
     "build-front": "yarn workspace @thatopen/components-front build",
+    "build-libraries": "yarn build-core && yarn build-front",
     "build-examples": "vite build --config ./vite.config-examples.ts",
-    "build": "yarn build-examples && yarn build-core && yarn build-front"
+    "build": "yarn build-examples && yarn build-libraries"
   },
   "license": "MIT",
   "homepage": "https://github.com/ThatOpen/engine_components#readme",
diff --git a/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts b/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts
index 25a1c2aad..11ee605c4 100644
--- a/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts
+++ b/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts
@@ -170,7 +170,7 @@ export class FragmentStreamLoader
     const groupArrayBuffer = await groupData.arrayBuffer();
     const groupBuffer = new Uint8Array(groupArrayBuffer);
     const fragments = this.components.get(OBC.FragmentManager);
-    const group = fragments.load(groupBuffer, coordinate);
+    const group = fragments.load(groupBuffer, { coordinate });
     this.world.scene.three.add(group);
 
     const { opaque, transparent } = group.geometryIDs;
@@ -242,7 +242,7 @@ export class FragmentStreamLoader
       const fetched = await fetch(this.url + indexesFile);
       const rels = await fetched.text();
       const indexer = this.components.get(OBC.IfcRelationsIndexer);
-      indexer.relationMaps[group.uuid] = indexer.getRelationsMapFromJSON(rels);
+      indexer.setRelationMap(group, indexer.getRelationsMapFromJSON(rels));
     }
 
     this.culler.needsUpdate = true;
diff --git a/packages/components/src/fragments/FragmentManager/index.ts b/packages/components/src/fragments/FragmentManager/index.ts
index 4e20bedde..416c798cb 100644
--- a/packages/components/src/fragments/FragmentManager/index.ts
+++ b/packages/components/src/fragments/FragmentManager/index.ts
@@ -1,6 +1,9 @@
 import { Fragment, FragmentsGroup, Serializer } from "@thatopen/fragments";
 import * as THREE from "three";
+import * as FRAGS from "@thatopen/fragments";
 import { Component, Components, Event, Disposable } from "../../core";
+import { RelationsMap } from "../../ifc/IfcRelationsIndexer/src/types";
+import { IfcRelationsIndexer } from "../../ifc/IfcRelationsIndexer";
 
 /**
  * Object that can efficiently load binary files that contain
@@ -76,12 +79,28 @@ export class FragmentManager extends Component implements Disposable {
   }
 
   /**
-   * Loads one or many fragments into the scene.
-   * @param data - the bytes containing the data for the fragments to load.
-   * @param coordinate - whether this fragmentsgroup should be federated with the others.
-   * @returns the list of IDs of the loaded fragments.
+   * Loads a binar file that contain fragment geometry.
+   * @param data - The binary data to load.
+   * @param config - Optional configuration for loading.
+   * @param config.coordinate - Whether to apply coordinate transformation. Default is true.
+   * @param config.properties - Ifc properties to set on the loaded fragments. Not to be used when streaming.
+   * @returns The loaded FragmentsGroup.
    */
-  load(data: Uint8Array, coordinate = true) {
+  load(
+    data: Uint8Array,
+    config?: Partial<{
+      coordinate: boolean;
+      properties: FRAGS.IfcProperties;
+      relationsMap: RelationsMap;
+    }>,
+  ) {
+    const defaultConfig: {
+      coordinate: boolean;
+      properties?: FRAGS.IfcProperties;
+      relationsMap?: RelationsMap;
+    } = { coordinate: true };
+    const _config = { ...defaultConfig, config };
+    const { coordinate, properties, relationsMap } = _config;
     const model = this._loader.import(data);
     for (const fragment of model.items) {
       fragment.group = model;
@@ -91,6 +110,13 @@ export class FragmentManager extends Component implements Disposable {
       this.coordinate([model]);
     }
     this.groups.set(model.uuid, model);
+    if (properties) {
+      model.setLocalProperties(properties);
+    }
+    if (relationsMap) {
+      const indexer = this.components.get(IfcRelationsIndexer);
+      indexer.setRelationMap(model, relationsMap);
+    }
     this.onFragmentsLoaded.trigger(model);
     return model;
   }
diff --git a/packages/components/src/ifc/IfcRelationsIndexer/index.ts b/packages/components/src/ifc/IfcRelationsIndexer/index.ts
index 9f8ad23bf..5d4f4a50a 100644
--- a/packages/components/src/ifc/IfcRelationsIndexer/index.ts
+++ b/packages/components/src/ifc/IfcRelationsIndexer/index.ts
@@ -120,7 +120,11 @@ export class IfcRelationsIndexer extends Component implements Disposable {
     if (!model.hasProperties)
       throw new Error("FragmentsGroup properties not found");
 
-    const relationsMap: RelationsMap = new Map();
+    let relationsMap = this.relationMaps[model.uuid];
+    if (relationsMap) {
+      return relationsMap;
+    }
+    relationsMap = new Map();
 
     for (const rel of this._ifcRels) {
       await IfcPropertiesUtils.getRelationMap(
@@ -349,3 +353,5 @@ export class IfcRelationsIndexer extends Component implements Disposable {
     this.onDisposed.reset();
   }
 }
+
+export type { InverseAttribute } from "./src/types";
