diff --git a/go.mod b/go.mod
index 015e2823f021a6c53041edfe4e00aa49616055e8..63fdbf6535517e0b1da5b55154749e8dec3b65d0 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,6 @@ go 1.13
 
 require (
 	github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
-	github.com/apsdehal/go-logger v0.0.0-20190506062552-f85330a4b532 // indirect
 	github.com/dgraph-io/badger v1.6.0
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/emicklei/dot v0.10.1
@@ -25,8 +24,6 @@ require (
 	github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341
 	github.com/rivo/uniseg v0.1.0 // indirect
 	github.com/sasha-s/go-deadlock v0.2.0 // indirect
-	github.com/spf13/pflag v1.0.5
-	github.com/stretchr/objx v0.2.0 // indirect
 	golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf
 	golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
 	golang.org/x/sys v0.0.0-20190904154756-749cb33beabd // indirect
diff --git a/go.sum b/go.sum
index 21013aaa10a237c3ee55af178ab8f640c205cbfb..1e1d9424f2c40e5e58505542caa9c35584af4513 100644
--- a/go.sum
+++ b/go.sum
@@ -9,7 +9,6 @@ github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/apsdehal/go-logger v0.0.0-20190506062552-f85330a4b532/go.mod h1:U3/8D6R9+bVpX0ORZjV+3mU9pQ86m7h1lESgJbXNvXA=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -39,7 +38,6 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/emicklei/dot v0.10.1 h1:bkzvwgIhhw/cuxxnJy5/5+ZL3GnhFxFfv0eolHtWE2w=
 github.com/emicklei/dot v0.10.1/go.mod h1:kZg82Ikwc4pqb31Ct2yb0B7RUqxh3JESIXw2uWSv/xY=
-github.com/ethereum/go-ethereum v1.9.1/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
 github.com/ethereum/go-ethereum v1.9.3 h1:v3bE4abkXknLcyWCf4TRFn+Ecmm9thPtfLFvTEQ+1+U=
 github.com/ethereum/go-ethereum v1.9.3/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
@@ -68,8 +66,6 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/open-location-code/go v0.0.0-20190723034300-2c7115db77a3 h1:qI8YeX4bVZ2HrE+kEOn12L2io7Tw/2IffULguAh3M4Q=
-github.com/google/open-location-code/go v0.0.0-20190723034300-2c7115db77a3/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk=
 github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51 h1:OdVal38kmXn0U3M3CYmPF4cpMLLvD4ioshwrooNfmxs=
 github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51/go.mod h1:eJfRN6aj+kR/rnua/rw9jAgYhqoMHldQkdTi+sePRKk=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
@@ -84,24 +80,8 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/iotaledger/hive.go v0.0.0-20191112142249-92832505dd6d h1:6n1M4lkXVlclr1z3+Ee9iSjIdWz2L9Kx87WBurof/JU=
-github.com/iotaledger/hive.go v0.0.0-20191112142249-92832505dd6d/go.mod h1:3u9aMALGTDHvpdmpODAkl6HAJ3GmDTfKIJIVSboXKLg=
-github.com/iotaledger/hive.go v0.0.0-20191118130432-89eebe8fe8eb h1:nuS/LETRJ8obUyBIZeyxeei0ZPlyOMj8YPziOgSM4Og=
-github.com/iotaledger/hive.go v0.0.0-20191118130432-89eebe8fe8eb/go.mod h1:1Thhlil4lHzuy53EVvmEbEvWBFY0Tasp4kCBfxBCPIk=
-github.com/iotaledger/hive.go v0.0.0-20191125112048-8b1784dd1bce h1:QchbydsqgH7bXWXk8zLa1PvZ0fcWRddfIXCoXuWgzt4=
-github.com/iotaledger/hive.go v0.0.0-20191125112048-8b1784dd1bce/go.mod h1:1Thhlil4lHzuy53EVvmEbEvWBFY0Tasp4kCBfxBCPIk=
-github.com/iotaledger/hive.go v0.0.0-20191202111738-357cee7a1c37 h1:Vex6W5Oae7xXvVmnCrl7J4o+PCx0FW3paMzXxQDr8H4=
-github.com/iotaledger/hive.go v0.0.0-20191202111738-357cee7a1c37/go.mod h1:1Thhlil4lHzuy53EVvmEbEvWBFY0Tasp4kCBfxBCPIk=
-github.com/iotaledger/hive.go v0.0.0-20191205211001-eafba1daa31e h1:7F9mSTDfFwMlEwkllo2yoc0p2iolrvL0I6RgMcL4h4M=
-github.com/iotaledger/hive.go v0.0.0-20191205211001-eafba1daa31e/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20=
-github.com/iotaledger/hive.go v0.0.0-20191205213014-6bee840fa69a h1:mI4GR5wcI5G6vjumuI2KH9r0mf5me3i6mWhDMtkKR04=
-github.com/iotaledger/hive.go v0.0.0-20191205213014-6bee840fa69a/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20=
-github.com/iotaledger/hive.go v0.0.0-20191206001944-418a9127c1eb h1:iMYyaySL2gEjOcPRzWZYCn4+vXkanq1b9Pr9fKSzdrI=
-github.com/iotaledger/hive.go v0.0.0-20191206001944-418a9127c1eb/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20=
 github.com/iotaledger/hive.go v0.0.0-20191208004610-567900b261bd h1:hh8iusLOBylWNHeJNiZv6atCbO7vzjCLlg53pNAMkFk=
 github.com/iotaledger/hive.go v0.0.0-20191208004610-567900b261bd/go.mod h1:7iqun29a1x0lymTrn0UJ3Z/yy0sUzUpoOZ1OYMrYN20=
-github.com/iotaledger/iota.go v1.0.0-beta.7 h1:OaUNahPvOdQz2nKcgeAfcUdxlEDlEV3xwLIkwzZ1B/U=
-github.com/iotaledger/iota.go v1.0.0-beta.7/go.mod h1:dMps6iMVU1pf5NDYNKIw4tRsPeC8W3ZWjOvYHOO1PMg=
 github.com/iotaledger/iota.go v1.0.0-beta.9 h1:c654s9pkdhMBkABUvWg+6k91MEBbdtmZXP1xDfQpajg=
 github.com/iotaledger/iota.go v1.0.0-beta.9/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
@@ -117,7 +97,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
 github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
-github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4=
 github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
 github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
 github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4=
@@ -162,7 +141,6 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk=
 github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341 h1:d2Z5U4d3fenPRFFweaMCogbXiRywM5kgYtu20/hol3M=
 github.com/rivo/tview v0.0.0-20190829161255-f8bc69b90341/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk=
 github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
@@ -191,7 +169,6 @@ github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4=
 github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
@@ -219,9 +196,6 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf
 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 h1:Gv7RPwsi3eZ2Fgewe3CBsuOebPwO27PoXzRpJPsvSSM=
-golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIoF2s4qxv0xSSS0BVZUE/ss=
 golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -234,14 +208,12 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -254,10 +226,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd h1:DBH9mDw0zluJT/R+nGuV3jWFWLFaHyYZWD4tOT+cjn0=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/packages/ledgerstate/ledgerstate.go b/packages/ledgerstate/ledgerstate.go
index 0af177c674f4ce1fcf7023d91ba981fcbaeb3119..2969a41eb218fccb5cc8d67d8ca8dfc1ee4b1a27 100644
--- a/packages/ledgerstate/ledgerstate.go
+++ b/packages/ledgerstate/ledgerstate.go
@@ -125,6 +125,14 @@ func (ledgerState *LedgerState) CreateReality(id RealityId) {
 	newReality := newReality(id, MAIN_REALITY_ID)
 	newReality.ledgerState = ledgerState
 
+	if mainReality, mainRealityErr := ledgerState.realities.Load(MAIN_REALITY_ID[:]); mainRealityErr != nil {
+		panic(mainRealityErr)
+	} else {
+		mainReality.Consume(func(object objectstorage.StorableObject) {
+			object.(*Reality).RegisterSubReality(id)
+		})
+	}
+
 	ledgerState.realities.Store(newReality).Release()
 }
 
@@ -182,14 +190,14 @@ func (ledgerState *LedgerState) GenerateRealityVisualization(pngFilename string)
 		realityNode, exists := realityNodes[reality.id]
 		if !exists {
 			if reality.IsAggregated() {
-				realityNode = graph.Node("AGGREGATED REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + ")")
+				realityNode = graph.Node("AGGREGATED REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + " / " + strconv.Itoa(len(reality.subRealityIds)) + ")")
 				realityNode.Attr("style", "filled")
 				realityNode.Attr("shape", "rect")
 				realityNode.Attr("color", "#9673A6")
 				realityNode.Attr("fillcolor", "#DAE8FC")
 				realityNode.Attr("penwidth", "2.0")
 			} else {
-				realityNode = graph.Node("REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + ")")
+				realityNode = graph.Node("REALITY\n\n" + strings.Trim(reality.id.String(), "\x00") + " (" + strconv.Itoa(int(reality.GetTransferOutputCount())) + " / " + strconv.Itoa(len(reality.subRealityIds)) + ")")
 				realityNode.Attr("style", "filled")
 				realityNode.Attr("shape", "rect")
 				realityNode.Attr("color", "#6C8EBF")
@@ -319,10 +327,16 @@ func (ledgerState *LedgerState) AggregateRealities(realityIds ...RealityId) *obj
 		aggregatedRealityId := ledgerState.generateAggregatedRealityId(ledgerState.sortRealityIds(parentConflictRealities))
 
 		newAggregatedRealityCreated := false
-		if cachedAggregatedReality, err := ledgerState.realities.ComputeIfAbsent(aggregatedRealityId[:], func(key []byte) (object objectstorage.StorableObject, e error) {
+		if newCachedAggregatedReality, err := ledgerState.realities.ComputeIfAbsent(aggregatedRealityId[:], func(key []byte) (object objectstorage.StorableObject, e error) {
 			aggregatedReality := newReality(aggregatedRealityId, aggregatedRealityParentIds...)
 			aggregatedReality.ledgerState = ledgerState
 
+			for _, parentRealityId := range aggregatedRealityParentIds {
+				ledgerState.GetReality(parentRealityId).Consume(func(object objectstorage.StorableObject) {
+					object.(*Reality).RegisterSubReality(aggregatedRealityId)
+				})
+			}
+
 			aggregatedReality.SetModified()
 
 			newAggregatedRealityCreated = true
@@ -332,14 +346,18 @@ func (ledgerState *LedgerState) AggregateRealities(realityIds ...RealityId) *obj
 			panic(err)
 		} else {
 			if !newAggregatedRealityCreated {
-				aggregatedReality := cachedAggregatedReality.Get().(*Reality)
+				aggregatedReality := newCachedAggregatedReality.Get().(*Reality)
 
 				for _, realityId := range aggregatedRealityParentIds {
-					aggregatedReality.AddParentReality(realityId)
+					if aggregatedReality.AddParentReality(realityId) {
+						ledgerState.GetReality(realityId).Consume(func(object objectstorage.StorableObject) {
+							object.(*Reality).RegisterSubReality(aggregatedRealityId)
+						})
+					}
 				}
 			}
 
-			return cachedAggregatedReality
+			return newCachedAggregatedReality
 		}
 	}
 }
diff --git a/packages/ledgerstate/ledgerstate_test.go b/packages/ledgerstate/ledgerstate_test.go
index 330db72c55b0d57d63f52bff481cfd5d79d499ea..65b4e9fdc4eb0e69ae7878d1cb6f6f33acf807da 100644
--- a/packages/ledgerstate/ledgerstate_test.go
+++ b/packages/ledgerstate/ledgerstate_test.go
@@ -6,9 +6,8 @@ import (
 	"testing"
 	"time"
 
-	"github.com/iotaledger/hive.go/parameter"
-
 	"github.com/iotaledger/hive.go/objectstorage"
+	"github.com/iotaledger/hive.go/parameter"
 )
 
 var (
@@ -237,7 +236,7 @@ func TestAggregateAggregatedRealities(t *testing.T) {
 
 	objectstorage.WaitForWritesToFlush()
 
-	ledgerState.GenerateRealityVisualization("realities1.png")
+	fmt.Println(ledgerState.GenerateRealityVisualization("realities1.png"))
 	NewVisualizer(ledgerState).RenderTransferOutputs("outputs1.png")
 
 	multiSpend(ledgerState, 2, outputs0[0], outputs1[0])
diff --git a/packages/ledgerstate/outputs1.png b/packages/ledgerstate/outputs1.png
index fd026eeb600bf9eeb11a272f134118d3a4a61f2d..b0e8fa0a96f6efa92bb38dc0ae81c0fc6f55832c 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 bda3cdf6945c579e4f8c47ff80fe033527c19bc3..cf0f4eae66fd41ae148f2647d4b21a1f6a7214bd 100644
Binary files a/packages/ledgerstate/outputs2.png and b/packages/ledgerstate/outputs2.png differ
diff --git a/packages/ledgerstate/realities1.png b/packages/ledgerstate/realities1.png
index 73be1b7f5e854ce26112b3021b8a03c534dff7f9..1bbd7dbd470da4c71f5b47b4a21b743f79bc3f6a 100644
Binary files a/packages/ledgerstate/realities1.png and b/packages/ledgerstate/realities1.png differ
diff --git a/packages/ledgerstate/realities2.png b/packages/ledgerstate/realities2.png
index 08f4b00d7bd979f5503fbfcbc0c2a62e636ab170..7989fa7230e1225473ef0716392f98a766db93b4 100644
Binary files a/packages/ledgerstate/realities2.png and b/packages/ledgerstate/realities2.png differ
diff --git a/packages/ledgerstate/reality.go b/packages/ledgerstate/reality.go
index 9bf3a9d9dce0067c02e0915a9c7db3e67473a18a..fc6b085d3909aa03053b30107375b35455e78263 100644
--- a/packages/ledgerstate/reality.go
+++ b/packages/ledgerstate/reality.go
@@ -33,6 +33,7 @@ func newReality(id RealityId, parentRealities ...RealityId) *Reality {
 	result := &Reality{
 		id:               id,
 		parentRealityIds: NewRealityIdSet(parentRealities...),
+		subRealityIds:    NewRealityIdSet(),
 		conflictIds:      NewConflictIdSet(),
 
 		storageKey: make([]byte, len(id)),
@@ -57,7 +58,7 @@ func (reality *Reality) GetParentRealityIds() (realityIdSet RealityIdSet) {
 }
 
 // Adds a new parent Reality to this Reality (it is used for aggregating aggregated Realities).
-func (reality *Reality) AddParentReality(realityId RealityId) {
+func (reality *Reality) AddParentReality(realityId RealityId) (realityAdded bool) {
 	reality.parentRealityIdsMutex.RLock()
 	if _, exists := reality.parentRealityIds[realityId]; !exists {
 		reality.parentRealityIdsMutex.RUnlock()
@@ -67,11 +68,15 @@ func (reality *Reality) AddParentReality(realityId RealityId) {
 			reality.parentRealityIds[realityId] = void
 
 			reality.SetModified()
+
+			realityAdded = true
 		}
 		reality.parentRealityIdsMutex.Unlock()
 	} else {
 		reality.parentRealityIdsMutex.RUnlock()
 	}
+
+	return
 }
 
 // Utility function that replaces the parent of a reality.
@@ -241,6 +246,8 @@ func (reality *Reality) CreateReality(id RealityId) *objectstorage.CachedObject
 	newReality := newReality(id, reality.id)
 	newReality.ledgerState = reality.ledgerState
 
+	reality.RegisterSubReality(id)
+
 	return reality.ledgerState.realities.Store(newReality)
 }
 
@@ -442,6 +449,8 @@ func (reality *Reality) createRealityForPreviouslyUnconflictingConsumers(consume
 			newReality := newReality(elevatedRealityId, reality.id)
 			newReality.ledgerState = reality.ledgerState
 
+			reality.RegisterSubReality(elevatedRealityId)
+
 			newReality.Persist()
 			newReality.SetModified()
 
@@ -518,10 +527,27 @@ func (reality *Reality) elevateTransferOutputOfCurrentReality(transferOutput *Tr
 
 // endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
+func (reality *Reality) UnregisterSubReality(realityId RealityId) {
+	reality.subRealityIdsMutex.RLock()
+	if _, subRealityIdExists := reality.subRealityIds[realityId]; subRealityIdExists {
+		reality.subRealityIdsMutex.RUnlock()
+
+		reality.subRealityIdsMutex.Lock()
+		if _, subRealityIdExists := reality.subRealityIds[realityId]; subRealityIdExists {
+			delete(reality.subRealityIds, realityId)
+
+			reality.SetModified()
+		}
+		reality.subRealityIdsMutex.Unlock()
+	} else {
+		reality.subRealityIdsMutex.RUnlock()
+	}
+}
+
 func (reality *Reality) RegisterSubReality(realityId RealityId) {
 	reality.subRealityIdsMutex.RLock()
 	if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists {
-		reality.subRealityIdsMutex.RLock()
+		reality.subRealityIdsMutex.RUnlock()
 
 		reality.subRealityIdsMutex.Lock()
 		if _, subRealityIdExists := reality.subRealityIds[realityId]; !subRealityIdExists {
@@ -572,9 +598,16 @@ func (reality *Reality) bookTransferOutput(transferOutput *TransferOutput) (err
 			transferOutput.SetRealityId(realityId)
 
 			reality.ledgerState.GetReality(transferOutputRealityId).Consume(func(object objectstorage.StorableObject) {
+				transferOutputReality := object.(*Reality)
+
 				// decrease transferOutputCount and remove reality if it is empty
-				if object.(*Reality).DecreaseTransferOutputCount() == 0 {
-					// delete reality if empty
+				if transferOutputReality.DecreaseTransferOutputCount() == 0 && len(transferOutputReality.subRealityIds) == 0 {
+					for parentRealityId := range transferOutputReality.parentRealityIds {
+						reality.ledgerState.GetReality(parentRealityId).Consume(func(obj objectstorage.StorableObject) {
+							obj.(*Reality).UnregisterSubReality(transferOutputRealityId)
+						})
+					}
+					transferOutputReality.Delete()
 				}
 			})
 
diff --git a/packages/ledgerstate/reality.objectstorage.go b/packages/ledgerstate/reality.objectstorage.go
index 7ccdc5edbcd6d2e52dca8c8ed05b5b597782d08f..6ab58486ed81ccb5d690372a8cfbf9ca2e437ad3 100644
--- a/packages/ledgerstate/reality.objectstorage.go
+++ b/packages/ledgerstate/reality.objectstorage.go
@@ -24,17 +24,29 @@ func (reality *Reality) MarshalBinary() ([]byte, error) {
 	reality.parentRealityIdsMutex.RLock()
 
 	parentRealityCount := len(reality.parentRealityIds)
+	subRealityCount := len(reality.subRealityIds)
 
-	marshaledReality := make([]byte, 4+4+parentRealityCount*realityIdLength)
+	marshaledReality := make([]byte, 4+4+4+parentRealityCount*realityIdLength+subRealityCount*realityIdLength)
+
+	offset := 0
 
 	binary.LittleEndian.PutUint32(marshaledReality, uint32(reality.GetTransferOutputCount()))
+	offset += 4
 
-	binary.LittleEndian.PutUint32(marshaledReality[4:], uint32(parentRealityCount))
-	i := 0
+	binary.LittleEndian.PutUint32(marshaledReality[offset:], uint32(parentRealityCount))
+	offset += 4
 	for parentRealityId := range reality.parentRealityIds {
-		copy(marshaledReality[4+4+i*realityIdLength:], parentRealityId[:])
+		copy(marshaledReality[offset:], parentRealityId[:])
+
+		offset += realityIdLength
+	}
+
+	binary.LittleEndian.PutUint32(marshaledReality[offset:], uint32(subRealityCount))
+	offset += 4
+	for subRealityId := range reality.subRealityIds {
+		copy(marshaledReality[offset:], subRealityId[:])
 
-		i++
+		offset += realityIdLength
 	}
 
 	reality.parentRealityIdsMutex.RUnlock()
@@ -48,18 +60,38 @@ func (reality *Reality) UnmarshalBinary(serializedObject []byte) error {
 	}
 
 	reality.parentRealityIds = NewRealityIdSet()
+	reality.subRealityIds = NewRealityIdSet()
+
+	offset := 0
 
 	reality.transferOutputCount = binary.LittleEndian.Uint32(serializedObject)
+	offset += 4
+
+	parentRealityCount := int(binary.LittleEndian.Uint32(serializedObject[offset:]))
+	offset += 4
 
-	parentRealityCount := int(binary.LittleEndian.Uint32(serializedObject[4:]))
 	for i := 0; i < parentRealityCount; i++ {
 		var restoredRealityId RealityId
-		if err := restoredRealityId.UnmarshalBinary(serializedObject[4+4+i*realityIdLength:]); err != nil {
+		if err := restoredRealityId.UnmarshalBinary(serializedObject[offset:]); err != nil {
 			return err
 		}
+		offset += realityIdLength
 
 		reality.parentRealityIds[restoredRealityId] = void
 	}
 
+	subRealityCount := int(binary.LittleEndian.Uint32(serializedObject[offset:]))
+	offset += 4
+
+	for i := 0; i < subRealityCount; i++ {
+		var restoredRealityId RealityId
+		if err := restoredRealityId.UnmarshalBinary(serializedObject[offset:]); err != nil {
+			return err
+		}
+		offset += realityIdLength
+
+		reality.subRealityIds[restoredRealityId] = void
+	}
+
 	return nil
 }