diff --git a/packages/ledgerstate/ledgerstate_test.go b/packages/ledgerstate/ledgerstate_test.go
index 61ad15e871a030a7192bf777a6dcd84975a2e79b..330db72c55b0d57d63f52bff481cfd5d79d499ea 100644
--- a/packages/ledgerstate/ledgerstate_test.go
+++ b/packages/ledgerstate/ledgerstate_test.go
@@ -237,13 +237,8 @@ func TestAggregateAggregatedRealities(t *testing.T) {
 
 	objectstorage.WaitForWritesToFlush()
 
-	if err := ledgerState.GenerateRealityVisualization("realities1.png"); err != nil {
-		t.Error(err)
-	}
-
-	if err := NewVisualizer(ledgerState).RenderTransferOutputs("outputs1.png"); err != nil {
-		t.Error(err)
-	}
+	ledgerState.GenerateRealityVisualization("realities1.png")
+	NewVisualizer(ledgerState).RenderTransferOutputs("outputs1.png")
 
 	multiSpend(ledgerState, 2, outputs0[0], outputs1[0])
 
@@ -251,13 +246,8 @@ func TestAggregateAggregatedRealities(t *testing.T) {
 
 	objectstorage.WaitForWritesToFlush()
 
-	if err := ledgerState.GenerateRealityVisualization("realities2.png"); err != nil {
-		t.Error(err)
-	}
-
-	if err := NewVisualizer(ledgerState).RenderTransferOutputs("outputs2.png"); err != nil {
-		t.Error(err)
-	}
+	ledgerState.GenerateRealityVisualization("realities2.png")
+	NewVisualizer(ledgerState).RenderTransferOutputs("outputs2.png")
 }
 
 func TestElevateAggregatedReality(t *testing.T) {
@@ -291,13 +281,8 @@ func TestElevateAggregatedReality(t *testing.T) {
 
 	objectstorage.WaitForWritesToFlush()
 
-	if err := ledgerState.GenerateRealityVisualization("realities.png"); err != nil {
-		t.Error(err)
-	}
-
-	if err := NewVisualizer(ledgerState).RenderTransferOutputs("outputs.png"); err != nil {
-		t.Error(err)
-	}
+	ledgerState.GenerateRealityVisualization("realities.png")
+	NewVisualizer(ledgerState).RenderTransferOutputs("outputs.png")
 }
 
 func TestElevate(t *testing.T) {
diff --git a/packages/ledgerstate/outputs1.png b/packages/ledgerstate/outputs1.png
index fbb292ef06d60e9e6ddf1bf269990516a389fcb7..fd026eeb600bf9eeb11a272f134118d3a4a61f2d 100644
Binary files a/packages/ledgerstate/outputs1.png and b/packages/ledgerstate/outputs1.png differ
diff --git a/packages/ledgerstate/outputs2.png b/packages/ledgerstate/outputs2.png
index 60319a10e56e7846b93dd8889d864649f4514ba3..bda3cdf6945c579e4f8c47ff80fe033527c19bc3 100644
Binary files a/packages/ledgerstate/outputs2.png and b/packages/ledgerstate/outputs2.png differ
diff --git a/packages/ledgerstate/reality.go b/packages/ledgerstate/reality.go
index b163d718083c2985e0dbf50a3e4180cc2212e6f5..9bf3a9d9dce0067c02e0915a9c7db3e67473a18a 100644
--- a/packages/ledgerstate/reality.go
+++ b/packages/ledgerstate/reality.go
@@ -16,6 +16,8 @@ type Reality struct {
 	id                    RealityId
 	parentRealityIds      RealityIdSet
 	parentRealityIdsMutex sync.RWMutex
+	subRealityIds         RealityIdSet
+	subRealityIdsMutex    sync.RWMutex
 	conflictIds           ConflictIdSet
 	conflictIdsMutex      sync.RWMutex
 	transferOutputCount   uint32
@@ -499,23 +501,40 @@ func (reality *Reality) elevateTransferOutput(transferOutputReference *TransferO
 
 // Private utility function that elevates the transfer output from the current reality to the new reality.
 func (reality *Reality) elevateTransferOutputOfCurrentReality(transferOutput *TransferOutput, newReality *Reality) (err error) {
-	if err = newReality.bookTransferOutput(transferOutput); err == nil {
-		for transferHash, addresses := range transferOutput.GetConsumers() {
-			for _, addressHash := range addresses {
-				if elevateErr := reality.elevateTransferOutput(NewTransferOutputReference(transferHash, addressHash), newReality); elevateErr != nil {
-					err = elevateErr
+	for transferHash, addresses := range transferOutput.GetConsumers() {
+		for _, addressHash := range addresses {
+			if elevateErr := reality.elevateTransferOutput(NewTransferOutputReference(transferHash, addressHash), newReality); elevateErr != nil {
+				err = elevateErr
 
-					return
-				}
+				return
 			}
 		}
 	}
 
+	err = newReality.bookTransferOutput(transferOutput)
+
 	return
 }
 
 // endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
+func (reality *Reality) RegisterSubReality(realityId RealityId) {
+	reality.subRealityIdsMutex.RLock()
+	if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists {
+		reality.subRealityIdsMutex.RLock()
+
+		reality.subRealityIdsMutex.Lock()
+		if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists {
+			reality.subRealityIds[realityId] = void
+
+			reality.SetModified()
+		}
+		reality.subRealityIdsMutex.Unlock()
+	} else {
+		reality.subRealityIdsMutex.RUnlock()
+	}
+}
+
 func (reality *Reality) elevateTransferOutputOfNestedReality(transferOutput *TransferOutput, oldParentRealityId RealityId, newParentRealityId RealityId) (err error) {
 	if !reality.IsAggregated() {
 		reality.replaceParentReality(oldParentRealityId, newParentRealityId)