diff --git a/go.mod b/go.mod
index 8b68a9a7cf9eb1382ed9c028e6ab22776996ffcf..afa2906d340690bd313143758cb9eebea0bae2a2 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.13
 require (
 	github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
 	github.com/dgraph-io/badger v1.6.0
-	github.com/dgraph-io/badger/v2 v2.0.0
+	github.com/dgraph-io/badger/v2 v2.0.1
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/emicklei/dot v0.10.1
 	github.com/ethereum/go-ethereum v1.9.3
@@ -15,7 +15,7 @@ require (
 	github.com/golang/protobuf v1.3.2 // indirect
 	github.com/google/open-location-code/go v0.0.0-20190903173953-119bc96a3a51
 	github.com/gorilla/websocket v1.4.1
-	github.com/iotaledger/hive.go v0.0.0-20200107105553-d35f44074aa2
+	github.com/iotaledger/hive.go v0.0.0-20200131164002-e50853dd9172
 	github.com/iotaledger/iota.go v1.0.0-beta.9
 	github.com/kr/text v0.1.0
 	github.com/labstack/echo v3.3.10+incompatible
diff --git a/go.sum b/go.sum
index 867562cddd4cdf3925b5dc7a1ee90f9c242231fe..ab78d117665377fc563d08c1760d5f0fe70d16f8 100644
--- a/go.sum
+++ b/go.sum
@@ -33,6 +33,8 @@ github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Ev
 github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
 github.com/dgraph-io/badger/v2 v2.0.0 h1:Cr05o2TUd2IcLbEY0aGd8mbjm1YyQpy+dswo3BcDXrE=
 github.com/dgraph-io/badger/v2 v2.0.0/go.mod h1:YoRSIp1LmAJ7zH7tZwRvjNMUYLxB4wl3ebYkaIruZ04=
+github.com/dgraph-io/badger/v2 v2.0.1 h1:+D6dhIqC6jIeCclnxMHqk4HPuXgrRN5UfBsLR4dNQ3A=
+github.com/dgraph-io/badger/v2 v2.0.1/go.mod h1:YoRSIp1LmAJ7zH7tZwRvjNMUYLxB4wl3ebYkaIruZ04=
 github.com/dgraph-io/ristretto v0.0.0-20191025175511-c1f00be0418e h1:aeUNgwup7PnDOBAD1BOKAqzb/W/NksOj6r3dwKKuqfg=
 github.com/dgraph-io/ristretto v0.0.0-20191025175511-c1f00be0418e/go.mod h1:edzKIzGvqUCMzhTVWbiTSe75zD9Xxq0GtSBtFmaUTZs=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
@@ -77,6 +79,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 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/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
 github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
@@ -107,6 +110,10 @@ github.com/iotaledger/hive.go v0.0.0-20200106003337-d78637b86bf2 h1:HBQKEP6PnaEh
 github.com/iotaledger/hive.go v0.0.0-20200106003337-d78637b86bf2/go.mod h1:vrZrvGaWT1o5kz3Jj2B/PcUtqsFzZnLWrO3zEsGSuwk=
 github.com/iotaledger/hive.go v0.0.0-20200107105553-d35f44074aa2 h1:o4jOpCuNXSRhbiSJHPR2SuN/qGkKt/LpX+DIQ0rUMSY=
 github.com/iotaledger/hive.go v0.0.0-20200107105553-d35f44074aa2/go.mod h1:vrZrvGaWT1o5kz3Jj2B/PcUtqsFzZnLWrO3zEsGSuwk=
+github.com/iotaledger/hive.go v0.0.0-20200131142821-bdca7883742d h1:3uYitVVvpt/vW1XRLxodkvsiNMjxHHz5HbSkvuqaOoU=
+github.com/iotaledger/hive.go v0.0.0-20200131142821-bdca7883742d/go.mod h1:wj3bFHlcX0NiEOWu5+WOg/MI/5N7PKCFnyaziaylB64=
+github.com/iotaledger/hive.go v0.0.0-20200131164002-e50853dd9172 h1:QuckesiAtCzfxkxndNaerpeW0AKmxciZtApyjNwe7s4=
+github.com/iotaledger/hive.go v0.0.0-20200131164002-e50853dd9172/go.mod h1:wj3bFHlcX0NiEOWu5+WOg/MI/5N7PKCFnyaziaylB64=
 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=
@@ -178,6 +185,7 @@ github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6Z
 github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/sasha-s/go-deadlock v0.2.0 h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y=
 github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10=
@@ -223,16 +231,28 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.mongodb.org/mongo-driver v1.0.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba h1:9bFeDpN3gTqNanMVqNcoR/pJQuP5uroC3t1D7eXozTE=
 golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -272,6 +292,13 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -281,6 +308,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/h2non/gock.v1 v1.0.14/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE=
@@ -296,3 +324,4 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/zeromq/goczmq.v4 v4.1.0 h1:CE+FE81mGVs2aSlnbfLuS1oAwdcVywyMM2AC1g33imI=
 gopkg.in/zeromq/goczmq.v4 v4.1.0/go.mod h1:h4IlfePEYMpFdywGr5gAwKhBBj+hiBl/nF4VoSE4k+0=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
diff --git a/packages/binary/tangle/events.go b/packages/binary/tangle/events.go
index 23df13656ff31bbaf9d7561bd6d10c912558c4cd..00f33b4842729a3031ad08bc8e477522e5b5665c 100644
--- a/packages/binary/tangle/events.go
+++ b/packages/binary/tangle/events.go
@@ -1,9 +1,10 @@
 package tangle
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
 	"github.com/iotaledger/hive.go/events"
+
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
 )
 
 type Events struct {
@@ -34,8 +35,5 @@ func cachedTransactionEvent(handler interface{}, params ...interface{}) {
 	cachedTransaction := params[0].(*transaction.CachedTransaction)
 	cachedTransactionMetadata := params[1].(*transactionmetadata.CachedTransactionMetadata)
 
-	cachedTransaction.RegisterConsumer()
-	cachedTransactionMetadata.RegisterConsumer()
-
-	handler.(func(*transaction.CachedTransaction, *transactionmetadata.CachedTransactionMetadata))(cachedTransaction, cachedTransactionMetadata)
+	handler.(func(*transaction.CachedTransaction, *transactionmetadata.CachedTransactionMetadata))(cachedTransaction.Retain().(*transaction.CachedTransaction), cachedTransactionMetadata.Retain().(*transactionmetadata.CachedTransactionMetadata))
 }
diff --git a/packages/binary/tangle/approvers/approvers.go b/packages/binary/tangle/model/approvers/approvers.go
similarity index 98%
rename from packages/binary/tangle/approvers/approvers.go
rename to packages/binary/tangle/model/approvers/approvers.go
index 90014e143ddb071753f2cf9aadb42ffe33166b56..178faf9157078196515ba231bcea3d8c05ebe24f 100644
--- a/packages/binary/tangle/approvers/approvers.go
+++ b/packages/binary/tangle/model/approvers/approvers.go
@@ -4,9 +4,9 @@ import (
 	"encoding/binary"
 	"sync"
 
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/goshimmer/packages/binary/types"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/packages/binary/tangle/approvers/cached_approvers.go b/packages/binary/tangle/model/approvers/cached_approvers.go
similarity index 93%
rename from packages/binary/tangle/approvers/cached_approvers.go
rename to packages/binary/tangle/model/approvers/cached_approvers.go
index 99ed8ad0de9fba2efc49978ecf28dd7c5f55cff0..55e225ba24aa427f2b0252e41519492532e1dd6f 100644
--- a/packages/binary/tangle/approvers/cached_approvers.go
+++ b/packages/binary/tangle/model/approvers/cached_approvers.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedApprovers struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedApprovers) Unwrap() *Approvers {
diff --git a/packages/binary/tangle/missingtransaction/cached_missingtransaction.go b/packages/binary/tangle/model/missingtransaction/cached_missingtransaction.go
similarity index 93%
rename from packages/binary/tangle/missingtransaction/cached_missingtransaction.go
rename to packages/binary/tangle/model/missingtransaction/cached_missingtransaction.go
index c64e3df3bbf501dde269dfabf20e2204ccee8272..f50f532127ba98e5f9baaaa5bd1095ba0c9d4216 100644
--- a/packages/binary/tangle/missingtransaction/cached_missingtransaction.go
+++ b/packages/binary/tangle/model/missingtransaction/cached_missingtransaction.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedMissingTransaction struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedMissingTransaction) Unwrap() *MissingTransaction {
diff --git a/packages/binary/tangle/missingtransaction/missingtransaction.go b/packages/binary/tangle/model/missingtransaction/missingtransaction.go
similarity index 94%
rename from packages/binary/tangle/missingtransaction/missingtransaction.go
rename to packages/binary/tangle/model/missingtransaction/missingtransaction.go
index 8ab086318dd288612957930da8ac8e2adbca55c4..ea1715c8d0a127324dd5f6a82ac9b2e2719bd0c0 100644
--- a/packages/binary/tangle/missingtransaction/missingtransaction.go
+++ b/packages/binary/tangle/model/missingtransaction/missingtransaction.go
@@ -3,8 +3,7 @@ package missingtransaction
 import (
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/packages/binary/transaction/cached_transaction.go b/packages/binary/tangle/model/transaction/cached_transaction.go
similarity index 72%
rename from packages/binary/transaction/cached_transaction.go
rename to packages/binary/tangle/model/transaction/cached_transaction.go
index 63a61f7edcfa59d61aee1cb2e24f22fdd2cefbc1..5b9bc6a2bc9e0bc3daaf042dc56ef35472421d57 100644
--- a/packages/binary/transaction/cached_transaction.go
+++ b/packages/binary/tangle/model/transaction/cached_transaction.go
@@ -5,7 +5,11 @@ import (
 )
 
 type CachedTransaction struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
+}
+
+func (cachedTransaction *CachedTransaction) Retain() objectstorage.CachedObject {
+	return &CachedTransaction{cachedTransaction.CachedObject.Retain()}
 }
 
 func (cachedTransaction *CachedTransaction) Unwrap() *Transaction {
diff --git a/packages/binary/transaction/id.go b/packages/binary/tangle/model/transaction/id.go
similarity index 93%
rename from packages/binary/transaction/id.go
rename to packages/binary/tangle/model/transaction/id.go
index 1c0c5165f19ffa69249cdb8d99c1cd9022eaffba..dd5ca1544b311f85740893dd416a04358cb74267 100644
--- a/packages/binary/transaction/id.go
+++ b/packages/binary/tangle/model/transaction/id.go
@@ -25,7 +25,7 @@ func (id *Id) UnmarshalBinary(data []byte) (err error) {
 	return
 }
 
-func (id *Id) String() string {
+func (id Id) String() string {
 	return base58.Encode(id[:])
 }
 
diff --git a/packages/binary/tangle/model/transaction/init.go b/packages/binary/tangle/model/transaction/init.go
new file mode 100644
index 0000000000000000000000000000000000000000..5805588c0b6309d978159aa094c6c4966f73a8c9
--- /dev/null
+++ b/packages/binary/tangle/model/transaction/init.go
@@ -0,0 +1,10 @@
+package transaction
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
+)
+
+func init() {
+	payload.SetGenericUnmarshalerFactory(data.GenericPayloadUnmarshalerFactory)
+}
diff --git a/packages/binary/transaction/payload/data/data.go b/packages/binary/tangle/model/transaction/payload/data/data.go
similarity index 91%
rename from packages/binary/transaction/payload/data/data.go
rename to packages/binary/tangle/model/transaction/payload/data/data.go
index a701c64122db7d40db2dcf12d2cca9e6057a2708..8b41b99ce062ee65fee8cbd25b5561bc50b7a538 100644
--- a/packages/binary/transaction/payload/data/data.go
+++ b/packages/binary/tangle/model/transaction/payload/data/data.go
@@ -1,7 +1,7 @@
 package data
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
 )
 
 type Data struct {
diff --git a/packages/binary/transaction/payload/data/init.go b/packages/binary/tangle/model/transaction/payload/data/init.go
similarity index 56%
rename from packages/binary/transaction/payload/data/init.go
rename to packages/binary/tangle/model/transaction/payload/data/init.go
index 4f403d296bbb000478b6605b57cda20124e23807..547bca2c68e3ad3ac12adc1b97ab82ae3878a764 100644
--- a/packages/binary/transaction/payload/data/init.go
+++ b/packages/binary/tangle/model/transaction/payload/data/init.go
@@ -1,7 +1,7 @@
 package data
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
 )
 
 func init() {
diff --git a/packages/binary/transaction/payload/id.go b/packages/binary/tangle/model/transaction/payload/id.go
similarity index 100%
rename from packages/binary/transaction/payload/id.go
rename to packages/binary/tangle/model/transaction/payload/id.go
diff --git a/packages/binary/transaction/payload/payload.go b/packages/binary/tangle/model/transaction/payload/payload.go
similarity index 100%
rename from packages/binary/transaction/payload/payload.go
rename to packages/binary/tangle/model/transaction/payload/payload.go
diff --git a/packages/binary/transaction/payload/type.go b/packages/binary/tangle/model/transaction/payload/type.go
similarity index 100%
rename from packages/binary/transaction/payload/type.go
rename to packages/binary/tangle/model/transaction/payload/type.go
diff --git a/packages/binary/transaction/payload/type_register.go b/packages/binary/tangle/model/transaction/payload/type_register.go
similarity index 100%
rename from packages/binary/transaction/payload/type_register.go
rename to packages/binary/tangle/model/transaction/payload/type_register.go
diff --git a/packages/binary/transaction/payload/valuetransfer/valuetransfer.go b/packages/binary/tangle/model/transaction/payload/valuetransfer/valuetransfer.go
similarity index 98%
rename from packages/binary/transaction/payload/valuetransfer/valuetransfer.go
rename to packages/binary/tangle/model/transaction/payload/valuetransfer/valuetransfer.go
index d9fa48ceca6a0e761e25dfdef8a77ac84d04e0bc..b50fc60249b9273ead4f816f767b2c174a0920d5 100644
--- a/packages/binary/transaction/payload/valuetransfer/valuetransfer.go
+++ b/packages/binary/tangle/model/transaction/payload/valuetransfer/valuetransfer.go
@@ -4,14 +4,11 @@ import (
 	"encoding/binary"
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/types"
-
 	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
-
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/types"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
 )
 
diff --git a/packages/binary/transaction/test/transaction_test.go b/packages/binary/tangle/model/transaction/test/transaction_test.go
similarity index 94%
rename from packages/binary/transaction/test/transaction_test.go
rename to packages/binary/tangle/model/transaction/test/transaction_test.go
index d94c14b09388d51d11345a435c1a3ad85c82826d..3cfd978d308889fe359a4366894783b18e71954e 100644
--- a/packages/binary/transaction/test/transaction_test.go
+++ b/packages/binary/tangle/model/transaction/test/transaction_test.go
@@ -6,21 +6,19 @@ import (
 	"sync"
 	"testing"
 
-	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
 	"github.com/iotaledger/hive.go/async"
 
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-
 	"github.com/panjf2000/ants/v2"
 
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
 	"github.com/iotaledger/goshimmer/packages/binary/address"
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+
 	"github.com/stretchr/testify/assert"
 )
 
diff --git a/packages/binary/transaction/transaction.go b/packages/binary/tangle/model/transaction/transaction.go
similarity index 98%
rename from packages/binary/transaction/transaction.go
rename to packages/binary/tangle/model/transaction/transaction.go
index 5b36af5881a2aa9e3109d498fe15b49175c61829..98893ffcec345d93a5727405e4ee23e88adcc0cd 100644
--- a/packages/binary/transaction/transaction.go
+++ b/packages/binary/tangle/model/transaction/transaction.go
@@ -5,7 +5,7 @@ import (
 	"sync"
 
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 
 	"github.com/iotaledger/hive.go/objectstorage"
diff --git a/packages/binary/transactionmetadata/cached_transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
similarity index 73%
rename from packages/binary/transactionmetadata/cached_transactionmetadata.go
rename to packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
index 83912b7c295118b528d9f686f6187ce8e7cdad5c..8b327806525d359f39dcbf0dd54e699cdc195f61 100644
--- a/packages/binary/transactionmetadata/cached_transactionmetadata.go
+++ b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
@@ -5,7 +5,11 @@ import (
 )
 
 type CachedTransactionMetadata struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
+}
+
+func (cachedObject *CachedTransactionMetadata) Retain() objectstorage.CachedObject {
+	return &CachedTransactionMetadata{cachedObject}
 }
 
 func (cachedObject *CachedTransactionMetadata) Unwrap() *TransactionMetadata {
diff --git a/packages/binary/transactionmetadata/transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
similarity index 95%
rename from packages/binary/transactionmetadata/transactionmetadata.go
rename to packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
index 5ef63dbea00e4e73e88abe144faf891faa6f3489..7c1728da9cd194589b9ed2ca1e326971f822e6a9 100644
--- a/packages/binary/transactionmetadata/transactionmetadata.go
+++ b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
@@ -4,8 +4,9 @@ import (
 	"sync"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 	"github.com/iotaledger/hive.go/objectstorage"
+
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 )
 
 type TransactionMetadata struct {
diff --git a/packages/binary/tangle/snapshot.go b/packages/binary/tangle/snapshot.go
index 1c1d560921bfa6ebf3a55f4d0f74242afa305ec4..8f1babe400d39898a68f7f69e17d3fe423fa3fdf 100644
--- a/packages/binary/tangle/snapshot.go
+++ b/packages/binary/tangle/snapshot.go
@@ -1,8 +1,8 @@
 package tangle
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
 )
 
diff --git a/packages/binary/tangle/tangle.go b/packages/binary/tangle/tangle.go
index 0e8d062bf4e39827ae00cae600ee10657ef68176..b1941ce24969aed8489c41376145c2a54383ad07 100644
--- a/packages/binary/tangle/tangle.go
+++ b/packages/binary/tangle/tangle.go
@@ -4,14 +4,14 @@ import (
 	"container/list"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/tangle/approvers"
-	"github.com/iotaledger/goshimmer/packages/binary/tangle/missingtransaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/approvers"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/missingtransaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
 	"github.com/iotaledger/goshimmer/packages/storageprefix"
+
 	"github.com/iotaledger/hive.go/async"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
diff --git a/packages/binary/tangle/tangle_test.go b/packages/binary/tangle/tangle_test.go
index bdeeaa40fc87c436574605cc71e573edab6b9078..5b629ceb409ab3ae2105af7163f1f337b2d2a248 100644
--- a/packages/binary/tangle/tangle_test.go
+++ b/packages/binary/tangle/tangle_test.go
@@ -8,8 +8,8 @@ import (
 	"github.com/iotaledger/hive.go/events"
 
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
 )
 
 func BenchmarkTangle_AttachTransaction(b *testing.B) {
diff --git a/packages/binary/transaction/init.go b/packages/binary/transaction/init.go
deleted file mode 100644
index 36b74b8e37d45f8ecf3e1c3bdb0aedbabc84ed7e..0000000000000000000000000000000000000000
--- a/packages/binary/transaction/init.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package transaction
-
-import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
-)
-
-func init() {
-	payload.SetGenericUnmarshalerFactory(data.GenericPayloadUnmarshalerFactory)
-}
diff --git a/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go b/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go
index 6862426cc273a059867fb4a25e6b651d328ff114..b3ae899952afe986ec0579fc69c5673b2b1edd5d 100644
--- a/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go
+++ b/packages/binary/transactionparser/builtinfilters/transaction_signature_filter.go
@@ -3,8 +3,7 @@ package builtinfilters
 import (
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/hive.go/async"
 )
 
diff --git a/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go b/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go
index 5c8cc14c39814b77af4cb2dd0e86c11ee25855a9..10e4dbeb471bd801a14f4532858fe783ccdf476b 100644
--- a/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go
+++ b/packages/binary/transactionparser/builtinfilters/value_transaction_signature_filter.go
@@ -3,10 +3,10 @@ package builtinfilters
 import (
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 	"github.com/iotaledger/hive.go/async"
+
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
 )
 
 type ValueTransferSignatureFilter struct {
diff --git a/packages/binary/transactionparser/transaction_filter.go b/packages/binary/transactionparser/transaction_filter.go
index 39f15788ee33ca4905360013b9ad0fd2e5e9cc5d..39dfc277c5932c6f6ce1ee8cca2d525605c04235 100644
--- a/packages/binary/transactionparser/transaction_filter.go
+++ b/packages/binary/transactionparser/transaction_filter.go
@@ -1,7 +1,7 @@
 package transactionparser
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 )
 
 type TransactionFilter interface {
diff --git a/packages/binary/transactionparser/transactionparser.go b/packages/binary/transactionparser/transactionparser.go
index 66e3bb3ae91f9e8560af14a589606574615586fc..7632506dc0b295e448d57b89c4fab859948e8e54 100644
--- a/packages/binary/transactionparser/transactionparser.go
+++ b/packages/binary/transactionparser/transactionparser.go
@@ -3,12 +3,11 @@ package transactionparser
 import (
 	"sync"
 
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/goshimmer/packages/binary/transactionparser/builtinfilters"
 
 	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/typeutils"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
 )
 
 type TransactionParser struct {
diff --git a/packages/binary/transactionparser/transactionparser_test.go b/packages/binary/transactionparser/transactionparser_test.go
index 8043fc59d4b31fce00aa3e221d26d6cc6d536f9b..c7dc3b18a91c82260b4196d7794e499cabec13c1 100644
--- a/packages/binary/transactionparser/transactionparser_test.go
+++ b/packages/binary/transactionparser/transactionparser_test.go
@@ -8,8 +8,8 @@ import (
 	"github.com/iotaledger/hive.go/events"
 
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/data"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/data"
 )
 
 func BenchmarkTransactionParser_ParseBytesSame(b *testing.B) {
diff --git a/packages/binary/address/address.go b/packages/binary/valuetangle/model/address/address.go
similarity index 100%
rename from packages/binary/address/address.go
rename to packages/binary/valuetangle/model/address/address.go
diff --git a/packages/binary/valuetangle/model/cached_consumers.go b/packages/binary/valuetangle/model/cached_consumers.go
index c570571a73ccde07771dbd9235330b3def6b9a02..7bff29ee87def9028ce778d6a14e1785e5d9679e 100644
--- a/packages/binary/valuetangle/model/cached_consumers.go
+++ b/packages/binary/valuetangle/model/cached_consumers.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedConsumers struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedConsumers) Unwrap() *Consumers {
diff --git a/packages/binary/valuetangle/model/cached_missing_transfer.go b/packages/binary/valuetangle/model/cached_missing_transfer.go
index 6e885c2bf0fccfcf7432644c1b8b796ca4599318..a91c80e5adff7655f7243380ae399523085a628b 100644
--- a/packages/binary/valuetangle/model/cached_missing_transfer.go
+++ b/packages/binary/valuetangle/model/cached_missing_transfer.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedMissingTransfer struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedMissingTransfer) Unwrap() *MissingTransfer {
diff --git a/packages/binary/valuetangle/model/cached_transfermetadata.go b/packages/binary/valuetangle/model/cached_transfermetadata.go
index bce48511c388337e3cb14d8580a1e7bc2c023d42..968523323508ffb03d44797881ecc36ddc4688a3 100644
--- a/packages/binary/valuetangle/model/cached_transfermetadata.go
+++ b/packages/binary/valuetangle/model/cached_transfermetadata.go
@@ -5,7 +5,7 @@ import (
 )
 
 type CachedTransferMetadata struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedTransferMetadata) Unwrap() *TransferMetadata {
diff --git a/packages/binary/valuetangle/model/cached_valuetransfer.go b/packages/binary/valuetangle/model/cached_valuetransfer.go
index 7a6ade84636baf9e234857aedf7a5acf62ee3228..9cc50c0a292605e9847ba52cf015fadfa7284df5 100644
--- a/packages/binary/valuetangle/model/cached_valuetransfer.go
+++ b/packages/binary/valuetangle/model/cached_valuetransfer.go
@@ -1,8 +1,8 @@
 package model
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
 )
 
 type CachedValueTransfer struct {
diff --git a/packages/binary/valuetangle/model/consumer/consumer.go b/packages/binary/valuetangle/model/consumer/consumer.go
new file mode 100644
index 0000000000000000000000000000000000000000..58f850aeb20cf854040000d99b04da387ebbcc8a
--- /dev/null
+++ b/packages/binary/valuetangle/model/consumer/consumer.go
@@ -0,0 +1,31 @@
+package consumer
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/transferoutput"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+	"github.com/iotaledger/hive.go/objectstorage"
+)
+
+type Consumer struct {
+	objectstorage.StorableObjectFlags
+
+	transferOutputId   transferoutput.Id
+	consumerTransferId transfer.Id
+}
+
+func New(transferOutput transferoutput.Id, consumerTransfer transfer.Id) *Consumer {
+	return &Consumer{
+		transferOutputId:   transferOutput,
+		consumerTransferId: consumerTransfer,
+	}
+}
+
+func (consumer *Consumer) GetTransferOutputId() transferoutput.Id {
+	return consumer.transferOutputId
+}
+
+func (consumer *Consumer) GetConsumerTransferId() transfer.Id {
+	return consumer.consumerTransferId
+}
+
+var _ objectstorage.StorableObject = &Consumer{}
diff --git a/packages/binary/valuetangle/model/transferoutput/id.go b/packages/binary/valuetangle/model/transferoutput/id.go
new file mode 100644
index 0000000000000000000000000000000000000000..01e4de3fb80d3deb8d679abfcbe91fe2f9f5d2c3
--- /dev/null
+++ b/packages/binary/valuetangle/model/transferoutput/id.go
@@ -0,0 +1,46 @@
+package transferoutput
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+)
+
+type Id [transfer.IdLength + address.Length]byte
+
+func NewId(addr address.Address, transferId transfer.Id) (result Id) {
+	copy(result[:address.Length], addr[:])
+	copy(result[address.Length:], transferId[:])
+
+	return
+}
+
+func (id Id) GetAddress() (result address.Address) {
+	copy(result[:], id[:address.Length])
+
+	return
+}
+
+func (id Id) GetTransferId() (result transfer.Id) {
+	copy(result[:], id[address.Length:])
+
+	return
+}
+
+func (id *Id) UnmarshalBinary(data []byte) error {
+	copy(id[:], data[:IdLength])
+
+	return nil
+}
+
+func (id *Id) MarshalBinary() (data []byte, err error) {
+	data = make([]byte, IdLength)
+	copy(data[:], id[:])
+
+	return
+}
+
+func (id Id) String() string {
+	return id.GetAddress().String() + " :: " + id.GetTransferId().String()
+}
+
+const IdLength = address.Length + transfer.IdLength
diff --git a/packages/binary/valuetangle/model/transferoutput/transferoutput.go b/packages/binary/valuetangle/model/transferoutput/transferoutput.go
index ae825b77c3578698565211693a1adf6d7dff55f6..1bf34bc5cd7d54b763ba546195144d45b46d09b9 100644
--- a/packages/binary/valuetangle/model/transferoutput/transferoutput.go
+++ b/packages/binary/valuetangle/model/transferoutput/transferoutput.go
@@ -4,11 +4,7 @@ import (
 	"encoding/binary"
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/types"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
@@ -16,23 +12,17 @@ import (
 type TransferOutput struct {
 	objectstorage.StorableObjectFlags
 
-	transactionId transaction.Id
-	address       address.Address
-	realityId     reality.Id
-	balances      []*coloredcoins.ColoredBalance
-	consumers     map[transaction.Id]types.Empty
+	id       Id
+	spent    bool
+	balances []*coloredcoins.ColoredBalance
 
 	realityIdMutex sync.RWMutex
-	consumersMutex sync.RWMutex
 }
 
-func NewTransferOutput(transactionId transaction.Id, address address.Address, balances ...*coloredcoins.ColoredBalance) *TransferOutput {
+func New(id Id, balances ...*coloredcoins.ColoredBalance) *TransferOutput {
 	return &TransferOutput{
-		transactionId: transactionId,
-		address:       address,
-		balances:      balances,
-		realityId:     reality.EmptyId,
-		consumers:     make(map[transaction.Id]types.Empty),
+		id:       id,
+		balances: balances,
 	}
 }
 
@@ -40,117 +30,37 @@ func FromStorage(key []byte) objectstorage.StorableObject {
 	result := &TransferOutput{}
 	offset := 0
 
-	if err := result.transactionId.UnmarshalBinary(key[offset:]); err != nil {
-		panic(err)
-	}
-	offset += transaction.IdLength
-
-	if err := result.address.UnmarshalBinary(key[offset:]); err != nil {
+	if err := result.id.UnmarshalBinary(key[offset:]); err != nil {
 		panic(err)
 	}
 
 	return result
 }
 
-func (transferOutput *TransferOutput) GetTransactionId() (transactionId transaction.Id) {
-	transactionId = transferOutput.transactionId
-
-	return
-}
-
-func (transferOutput *TransferOutput) GetAddress() (address address.Address) {
-	return transferOutput.address
-}
-
-func (transferOutput *TransferOutput) GetRealityId() (realityId reality.Id) {
-	transferOutput.realityIdMutex.RLock()
-	realityId = transferOutput.realityId
-	transferOutput.realityIdMutex.RUnlock()
-
-	return
-}
-
-func (transferOutput *TransferOutput) SetRealityId(realityId reality.Id) (modified bool) {
-	transferOutput.realityIdMutex.RLock()
-	if transferOutput.realityId != realityId {
-		transferOutput.realityIdMutex.RUnlock()
-
-		transferOutput.realityIdMutex.Lock()
-		if transferOutput.realityId != realityId {
-			transferOutput.realityId = realityId
-
-			transferOutput.SetModified()
-
-			modified = true
-		}
-		transferOutput.realityIdMutex.Unlock()
-	} else {
-		transferOutput.realityIdMutex.RUnlock()
-	}
-
-	return
+func (transferOutput *TransferOutput) GetId() Id {
+	return transferOutput.id
 }
 
 func (transferOutput *TransferOutput) GetBalances() []*coloredcoins.ColoredBalance {
 	return transferOutput.balances
 }
 
-func (transferOutput *TransferOutput) GetConsumers() (consumers map[transaction.Id]types.Empty) {
-	consumers = make(map[transaction.Id]types.Empty)
-
-	transferOutput.consumersMutex.RLock()
-	for transferHash := range transferOutput.consumers {
-		consumers[transferHash] = types.Void
-	}
-	transferOutput.consumersMutex.RUnlock()
-
-	return
-}
-
 func (transferOutput *TransferOutput) IsSpent() (result bool) {
-	transferOutput.consumersMutex.RLock()
-	result = len(transferOutput.consumers) >= 1
-	transferOutput.consumersMutex.RUnlock()
-
-	return
-}
-
-func (transferOutput *TransferOutput) AddConsumer(consumer transaction.Id) (previousConsumers map[transaction.Id]types.Empty) {
-	transferOutput.consumersMutex.RLock()
-	if _, exist := transferOutput.consumers[consumer]; !exist {
-		transferOutput.consumersMutex.RUnlock()
-
-		transferOutput.consumersMutex.Lock()
-		if _, exist := transferOutput.consumers[consumer]; !exist {
-			previousConsumers = make(map[transaction.Id]types.Empty)
-			for transactionId := range transferOutput.consumers {
-				previousConsumers[transactionId] = types.Void
-			}
-
-			transferOutput.consumers[consumer] = types.Void
-
-			transferOutput.SetModified()
-		}
-		transferOutput.consumersMutex.Unlock()
-	} else {
-		transferOutput.consumersMutex.RUnlock()
-	}
+	// TODO: IMPLEMENT
 
 	return
 }
 
 func (transferOutput *TransferOutput) String() string {
 	return stringify.Struct("TransferOutput",
-		stringify.StructField("transactionId", transferOutput.GetTransactionId().String()),
-		stringify.StructField("address", transferOutput.GetAddress().String()),
-		stringify.StructField("realityId", transferOutput.GetRealityId().String()),
+		stringify.StructField("id", transferOutput.GetId().String()),
 		stringify.StructField("balances", transferOutput.GetBalances()),
-		stringify.StructField("spent", len(transferOutput.GetConsumers()) >= 1),
+		// TODO: IS SPENT
 	)
 }
 
 func (transferOutput *TransferOutput) GetStorageKey() []byte {
-	return append(transferOutput.transactionId[:], transferOutput.address[:]...)
+	return transferOutput.id[:]
 }
 
 func (transferOutput *TransferOutput) Update(other objectstorage.StorableObject) {
@@ -159,17 +69,12 @@ func (transferOutput *TransferOutput) Update(other objectstorage.StorableObject)
 
 func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 	transferOutput.realityIdMutex.RLock()
-	transferOutput.consumersMutex.RLock()
 
 	balanceCount := len(transferOutput.balances)
-	consumerCount := len(transferOutput.consumers)
 
-	result := make([]byte, reality.IdLength+4+balanceCount*coloredcoins.BalanceLength+4+consumerCount*transaction.IdLength)
+	result := make([]byte, 4+balanceCount*coloredcoins.BalanceLength)
 	offset := 0
 
-	copy(result[0:], transferOutput.realityId[:])
-	offset += reality.IdLength
-
 	binary.LittleEndian.PutUint32(result[offset:], uint32(balanceCount))
 	offset += 4
 
@@ -182,15 +87,6 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 		}
 	}
 
-	binary.LittleEndian.PutUint32(result[offset:], uint32(consumerCount))
-	offset += 4
-
-	for transactionId := range transferOutput.consumers {
-		copy(result[offset:], transactionId[:])
-		offset += transaction.IdLength
-	}
-
-	transferOutput.consumersMutex.RUnlock()
 	transferOutput.realityIdMutex.RUnlock()
 
 	return result, nil
@@ -199,23 +95,12 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 func (transferOutput *TransferOutput) UnmarshalBinary(serializedObject []byte) error {
 	offset := 0
 
-	if err := transferOutput.realityId.UnmarshalBinary(serializedObject[offset:]); err != nil {
-		return err
-	}
-	offset += reality.IdLength
-
 	if balances, err := transferOutput.unmarshalBalances(serializedObject, &offset); err != nil {
 		return err
 	} else {
 		transferOutput.balances = balances
 	}
 
-	if consumers, err := transferOutput.unmarshalConsumers(serializedObject, &offset); err != nil {
-		return err
-	} else {
-		transferOutput.consumers = consumers
-	}
-
 	return nil
 }
 
@@ -237,24 +122,8 @@ func (transferOutput *TransferOutput) unmarshalBalances(serializedBalances []byt
 	return balances, nil
 }
 
-func (transferOutput *TransferOutput) unmarshalConsumers(serializedConsumers []byte, offset *int) (map[transaction.Id]types.Empty, error) {
-	consumerCount := int(binary.LittleEndian.Uint32(serializedConsumers[*offset:]))
-	*offset += 4
-
-	consumers := make(map[transaction.Id]types.Empty, consumerCount)
-	for i := 0; i < consumerCount; i++ {
-		var transactionId transaction.Id
-		if err := transactionId.UnmarshalBinary(serializedConsumers[*offset:]); err != nil {
-			return nil, err
-		}
-		*offset += transaction.IdLength
-	}
-
-	return consumers, nil
-}
-
 type CachedTransferOutput struct {
-	*objectstorage.CachedObject
+	objectstorage.CachedObject
 }
 
 func (cachedObject *CachedTransferOutput) Unwrap() *TransferOutput {
diff --git a/packages/binary/valuetangle/model/valuetransfer.go b/packages/binary/valuetangle/model/valuetransfer.go
index fa614d48361b3a6b4d5299bd41d86bc0aad34d97..ef2fa7220820a3403e643520879539ad00ca270e 100644
--- a/packages/binary/valuetangle/model/valuetransfer.go
+++ b/packages/binary/valuetangle/model/valuetransfer.go
@@ -4,8 +4,8 @@ import (
 	"sync"
 
 	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
 	"github.com/iotaledger/goshimmer/packages/binary/types"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
 )
diff --git a/packages/binary/valuetangle/valuetangle.go b/packages/binary/valuetangle/valuetangle.go
index e8e16a9a9d3b8da0a52e32c5f448fca81999e14f..faf76f223a48226b5d46309eca807198387a3d5f 100644
--- a/packages/binary/valuetangle/valuetangle.go
+++ b/packages/binary/valuetangle/valuetangle.go
@@ -5,18 +5,21 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-
-	"github.com/iotaledger/goshimmer/packages/binary/types"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/transferoutput"
 
-	"github.com/iotaledger/goshimmer/packages/storageprefix"
+	"github.com/iotaledger/hive.go/syncutils"
 
+	"github.com/iotaledger/goshimmer/packages/binary/address"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
+	"github.com/iotaledger/goshimmer/packages/binary/types"
 	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/consumer"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+	"github.com/iotaledger/goshimmer/packages/storageprefix"
+
 	"github.com/iotaledger/hive.go/async"
 	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/objectstorage"
@@ -40,6 +43,8 @@ type ValueTangle struct {
 	solidifierWorkerPool        async.WorkerPool
 	cleanupWorkerPool           async.WorkerPool
 
+	tangleMutex syncutils.MultiMutex
+
 	Events Events
 }
 
@@ -157,11 +162,24 @@ func (valueTangle *ValueTangle) storeTransactionWorker(cachedTx *transaction.Cac
 
 	transferId := valueTransfer.GetId()
 
-	cachedTransferMetadata := &model.CachedTransferMetadata{CachedObject: valueTangle.transferMetadataStorage.Store(model.NewTransferMetadata(transferId))}
-	for referencedTransferId := range valueTransfer.GetInputs() {
-		addTransferToConsumers(transferId, referencedTransferId)
+	lockBuilder := syncutils.MultiMutexLockBuilder{}.AddLock(transferId)
+	consumers := make(map[transferoutput.Id]*consumer.Consumer)
+	for referencedTransferId, referencedAddresses := range valueTransfer.GetInputs() {
+		for referencedAddress := range referencedAddresses {
+			transferOutputId := transferoutput.NewId(referencedAddress, referencedTransferId)
+
+			lockBuilder.AddLock(transferOutputId)
+			consumers[transferOutputId] = consumer.New(transferOutputId, transferId)
+		}
 	}
 
+	// lock: own transfer outputs, consumers of inputs,
+	valueTangle.tangleMutex.Lock(lockBuilder.Build()...)
+
+	valueTangle.tangleMutex.Unlock(lockBuilder.Build()...)
+
+	cachedTransferMetadata := &model.CachedTransferMetadata{CachedObject: valueTangle.transferMetadataStorage.Store(model.NewTransferMetadata(transferId))}
+
 	if valueTangle.missingTransferStorage.DeleteIfPresent(transferId[:]) {
 		valueTangle.Events.MissingTransferReceived.Trigger(transferId)
 	}
diff --git a/packages/binary/valuetangle/valuetangle_test.go b/packages/binary/valuetangle/valuetangle_test.go
index d4e954bbc2e457fe9e44d37aaa9b056bbb0eef73..0ce267004671e2130c566a6ce7cda218467e1bcd 100644
--- a/packages/binary/valuetangle/valuetangle_test.go
+++ b/packages/binary/valuetangle/valuetangle_test.go
@@ -8,19 +8,16 @@ import (
 	"github.com/mr-tron/base58"
 
 	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transactionmetadata"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-
-	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
-
-	"github.com/iotaledger/goshimmer/packages/binary/transaction/payload/valuetransfer"
-
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
-	"github.com/iotaledger/goshimmer/packages/binary/transaction"
-
+	"github.com/iotaledger/goshimmer/packages/binary/signature/ed25119"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction/payload/valuetransfer"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
 	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
+
 	"github.com/iotaledger/hive.go/events"
 )
 
diff --git a/packages/ledgerstate/transfer/constants.go b/packages/ledgerstate/transfer/constants.go
index c3a690bd4eaf5c859933112a0d5893acf5224f2f..d98cdb15c1df1cf4366dc99ce415d8050539e833 100644
--- a/packages/ledgerstate/transfer/constants.go
+++ b/packages/ledgerstate/transfer/constants.go
@@ -1,7 +1,7 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 )
 
diff --git a/packages/ledgerstate/transfer/output.go b/packages/ledgerstate/transfer/output.go
index 8c7f5b06b981bfa13a94d7e9429dddd4b80ffab4..fd59934f5763c7a308de02acc4c8cb7edf3aed7c 100644
--- a/packages/ledgerstate/transfer/output.go
+++ b/packages/ledgerstate/transfer/output.go
@@ -4,7 +4,7 @@ import (
 	"encoding/binary"
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/stringify"
diff --git a/packages/ledgerstate/transfer/output_booking.go b/packages/ledgerstate/transfer/output_booking.go
index e268015151c3eb1437bd584fb729aa86262981d8..7a387c2337aa72d703e1df165f428b6d4e44af9d 100644
--- a/packages/ledgerstate/transfer/output_booking.go
+++ b/packages/ledgerstate/transfer/output_booking.go
@@ -1,8 +1,9 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
+
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/packages/ledgerstate/transfer/output_reference.go b/packages/ledgerstate/transfer/output_reference.go
index d990f7bedcbbd5e6ef3da11eb8e412a519c2a404..70b3b11a24d60fe594a7ccfbf09bf8fdbec0e3a0 100644
--- a/packages/ledgerstate/transfer/output_reference.go
+++ b/packages/ledgerstate/transfer/output_reference.go
@@ -1,7 +1,7 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 )
 
diff --git a/packages/ledgerstate/transfer/transfer.go b/packages/ledgerstate/transfer/transfer.go
index 70c27381af06daed26523fc53f4e25e120f24e0f..6d6392b401b5465a2c57c33fdfdbf6db5b1fb2fb 100644
--- a/packages/ledgerstate/transfer/transfer.go
+++ b/packages/ledgerstate/transfer/transfer.go
@@ -1,7 +1,7 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
 )
 
diff --git a/packages/ledgerstate/transfer/transfer_output_booking.go b/packages/ledgerstate/transfer/transfer_output_booking.go
index 01238c133c0f6843d097bb362d61305417f17b9c..7e872b43b2080b190bef9a17f5dd6814b558da57 100644
--- a/packages/ledgerstate/transfer/transfer_output_booking.go
+++ b/packages/ledgerstate/transfer/transfer_output_booking.go
@@ -1,10 +1,11 @@
 package transfer
 
 import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/binary/valuetangle/model/address"
 	"github.com/iotaledger/goshimmer/packages/errors"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/stringify"
+
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
diff --git a/plugins/tangle/solidifier.go b/plugins/tangle/solidifier.go
index e0408a957a40a2b346f4796a56ed7a07a1c55924..13b6fc7b1609ef362f9060f3bd7e285d7fa1d3af 100644
--- a/plugins/tangle/solidifier.go
+++ b/plugins/tangle/solidifier.go
@@ -3,6 +3,8 @@ package tangle
 import (
 	"runtime"
 
+	"github.com/iotaledger/iota.go/trinary"
+
 	"github.com/iotaledger/goshimmer/packages/daemon"
 	"github.com/iotaledger/goshimmer/packages/errors"
 	"github.com/iotaledger/goshimmer/packages/events"
@@ -13,7 +15,6 @@ import (
 	"github.com/iotaledger/goshimmer/packages/node"
 	"github.com/iotaledger/goshimmer/packages/workerpool"
 	"github.com/iotaledger/goshimmer/plugins/gossip"
-	"github.com/iotaledger/iota.go/trinary"
 )
 
 // region plugin module setup //////////////////////////////////////////////////////////////////////////////////////////