diff --git a/packages/ledgerstate/color.go b/packages/ledgerstate/coloredcoins/color.go
similarity index 78%
rename from packages/ledgerstate/color.go
rename to packages/ledgerstate/coloredcoins/color.go
index f358be897fe487ed2132e9517951a4b5eab177c3..9ff9559400132de925c58fcb0ccf7b40bc0b2d37 100644
--- a/packages/ledgerstate/color.go
+++ b/packages/ledgerstate/coloredcoins/color.go
@@ -1,4 +1,4 @@
-package ledgerstate
+package coloredcoins
 
 import (
 	"unicode/utf8"
@@ -6,7 +6,7 @@ import (
 	"github.com/iotaledger/goshimmer/packages/stringify"
 )
 
-type Color [colorLength]byte
+type Color [ColorLength]byte
 
 func NewColor(color string) (result Color) {
 	copy(result[:], color)
@@ -15,7 +15,7 @@ func NewColor(color string) (result Color) {
 }
 
 func (color *Color) UnmarshalBinary(data []byte) error {
-	copy(color[:], data[:colorLength])
+	copy(color[:], data[:ColorLength])
 
 	return nil
 }
@@ -28,4 +28,4 @@ func (color Color) String() string {
 	}
 }
 
-const colorLength = 32
+const ColorLength = 32
diff --git a/packages/ledgerstate/colored_balance.go b/packages/ledgerstate/coloredcoins/colored_balance.go
similarity index 77%
rename from packages/ledgerstate/colored_balance.go
rename to packages/ledgerstate/coloredcoins/colored_balance.go
index 961531f7298136c20d1c00f199f2437fca87813a..898a0d9a58840220b64c0a0513925173796f0160 100644
--- a/packages/ledgerstate/colored_balance.go
+++ b/packages/ledgerstate/coloredcoins/colored_balance.go
@@ -1,4 +1,4 @@
-package ledgerstate
+package coloredcoins
 
 import (
 	"encoding/binary"
@@ -21,7 +21,7 @@ func (balance *ColoredBalance) GetColor() Color {
 	return balance.color
 }
 
-func (balance *ColoredBalance) GetValue() uint64 {
+func (balance *ColoredBalance) GetBalance() uint64 {
 	return balance.balance
 }
 
@@ -31,7 +31,7 @@ func (balance *ColoredBalance) UnmarshalBinary(data []byte) error {
 		return err
 	}
 
-	balance.balance = binary.LittleEndian.Uint64(data[colorLength:])
+	balance.balance = binary.LittleEndian.Uint64(data[ColorLength:])
 
 	return nil
 }
@@ -41,5 +41,5 @@ func (coloredBalance *ColoredBalance) String() string {
 }
 
 const (
-	coloredBalanceLength = colorLength + 8 // color + 64 Bit / 8 Byte value
+	BalanceLength = ColorLength + 8 // color + 64 Bit / 8 Byte value
 )
diff --git a/packages/ledgerstate/ledgerstate.go b/packages/ledgerstate/ledgerstate.go
index b77199731ec8ee778bef5bba3174164ab845b424..0635956e1069feeef5e81f31d6b6542c091f9512 100644
--- a/packages/ledgerstate/ledgerstate.go
+++ b/packages/ledgerstate/ledgerstate.go
@@ -7,13 +7,13 @@ import (
 	"strings"
 	"time"
 
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+
 	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/graphviz"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/conflict"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput"
-
-	"github.com/iotaledger/goshimmer/packages/graphviz"
 
 	"golang.org/x/crypto/blake2b"
 
@@ -48,7 +48,7 @@ func NewLedgerState(storageId string) *LedgerState {
 	return result
 }
 
-func (ledgerState *LedgerState) AddTransferOutput(transferHash transfer.Hash, addressHash address.Address, balances ...*ColoredBalance) *LedgerState {
+func (ledgerState *LedgerState) AddTransferOutput(transferHash transfer.Hash, addressHash address.Address, balances ...*coloredcoins.ColoredBalance) *LedgerState {
 	ledgerState.GetReality(MAIN_REALITY_ID).Consume(func(object objectstorage.StorableObject) {
 		mainReality := object.(*Reality)
 
@@ -58,7 +58,7 @@ func (ledgerState *LedgerState) AddTransferOutput(transferHash transfer.Hash, ad
 	return ledgerState
 }
 
-func (ledgerState *LedgerState) GetTransferOutput(transferOutputReference *transferoutput.Reference) *objectstorage.CachedObject {
+func (ledgerState *LedgerState) GetTransferOutput(transferOutputReference *transfer.OutputReference) *objectstorage.CachedObject {
 	if cachedTransferOutput, err := ledgerState.transferOutputs.Load(transferOutputReference.GetStorageKey()); err != nil {
 		panic(err)
 	} else {
@@ -98,7 +98,7 @@ func (ledgerState *LedgerState) ForEachTransferOutput(callback func(object *obje
 				booking := cachedObject.Get().(*TransferOutputBooking)
 				cachedObject.Release()
 
-				return callback(ledgerState.GetTransferOutput(transferoutput.NewTransferOutputReference(booking.GetTransferHash(), booking.GetAddressHash())))
+				return callback(ledgerState.GetTransferOutput(transfer.NewOutputReference(booking.GetTransferHash(), booking.GetAddressHash())))
 			}, prefix); err != nil {
 				panic(err)
 			}
@@ -155,7 +155,7 @@ func (ledgerState *LedgerState) GetReality(id reality.Id) *objectstorage.CachedO
 	}
 }
 
-func (ledgerState *LedgerState) BookTransfer(transfer *Transfer) (err error) {
+func (ledgerState *LedgerState) BookTransfer(transfer *transfer.Transfer) (err error) {
 	inputs := ledgerState.getTransferInputs(transfer)
 
 	ledgerState.getTargetReality(inputs).Consume(func(object objectstorage.StorableObject) {
@@ -534,7 +534,7 @@ func (ledgerState *LedgerState) getTargetReality(inputs []*objectstorage.CachedO
 	return ledgerState.AggregateRealities(realityIds...)
 }
 
-func (ledgerState *LedgerState) getTransferInputs(transfer *Transfer) []*objectstorage.CachedObject {
+func (ledgerState *LedgerState) getTransferInputs(transfer *transfer.Transfer) []*objectstorage.CachedObject {
 	inputs := transfer.GetInputs()
 	result := make([]*objectstorage.CachedObject, len(inputs))
 
diff --git a/packages/ledgerstate/ledgerstate_test.go b/packages/ledgerstate/ledgerstate_test.go
index 2a06ee70554f91ffd8f08c95c7dc5dc574be2bf6..9f187dc15c6c69d4cc55d3a3e6ba26a51e01368a 100644
--- a/packages/ledgerstate/ledgerstate_test.go
+++ b/packages/ledgerstate/ledgerstate_test.go
@@ -6,18 +6,18 @@ import (
 	"testing"
 	"time"
 
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+
 	"github.com/iotaledger/goshimmer/packages/binary/address"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput"
-
 	"github.com/iotaledger/hive.go/objectstorage"
 	"github.com/iotaledger/hive.go/parameter"
 )
 
 var (
-	iota_          = NewColor("IOTA")
-	eth            = NewColor("ETH")
+	iota_          = coloredcoins.NewColor("IOTA")
+	eth            = coloredcoins.NewColor("ETH")
 	transferHash1  = transfer.NewHash("TRANSFER1")
 	transferHash2  = transfer.NewHash("TRANSFER2")
 	transferHash3  = transfer.NewHash("TRANSFER3")
@@ -41,7 +41,7 @@ func init() {
 
 func Benchmark(b *testing.B) {
 	ledgerState := NewLedgerState("testLedger").Prune().AddTransferOutput(
-		transferHash1, addressHash1, NewColoredBalance(eth, 1024),
+		transferHash1, addressHash1, coloredcoins.NewColoredBalance(eth, 1024),
 	)
 
 	b.ResetTimer()
@@ -51,10 +51,10 @@ func Benchmark(b *testing.B) {
 	for i := 0; i < b.N; i++ {
 		newTransferHash := transfer.NewHash(strconv.Itoa(i))
 
-		if err := ledgerState.BookTransfer(NewTransfer(newTransferHash).AddInput(
-			transferoutput.NewTransferOutputReference(lastTransferHash, addressHash1),
+		if err := ledgerState.BookTransfer(transfer.NewTransfer(newTransferHash).AddInput(
+			transfer.NewOutputReference(lastTransferHash, addressHash1),
 		).AddOutput(
-			addressHash1, NewColoredBalance(eth, 1024),
+			addressHash1, coloredcoins.NewColoredBalance(eth, 1024),
 		)); err != nil {
 			b.Error(err)
 		}
@@ -65,37 +65,37 @@ func Benchmark(b *testing.B) {
 
 func Test(t *testing.T) {
 	ledgerState := NewLedgerState("testLedger").Prune().AddTransferOutput(
-		transferHash1, addressHash1, NewColoredBalance(eth, 1337), NewColoredBalance(iota_, 1338),
+		transferHash1, addressHash1, coloredcoins.NewColoredBalance(eth, 1337), coloredcoins.NewColoredBalance(iota_, 1338),
 	)
 
 	ledgerState.CreateReality(pendingReality)
 
-	transfer := NewTransfer(transferHash2).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash1, addressHash1),
+	transfer1 := transfer.NewTransfer(transferHash2).AddInput(
+		transfer.NewOutputReference(transferHash1, addressHash1),
 	).AddOutput(
-		addressHash3, NewColoredBalance(iota_, 338),
+		addressHash3, coloredcoins.NewColoredBalance(iota_, 338),
 	).AddOutput(
-		addressHash3, NewColoredBalance(eth, 337),
+		addressHash3, coloredcoins.NewColoredBalance(eth, 337),
 	).AddOutput(
-		addressHash4, NewColoredBalance(iota_, 1000),
+		addressHash4, coloredcoins.NewColoredBalance(iota_, 1000),
 	).AddOutput(
-		addressHash4, NewColoredBalance(eth, 1000),
+		addressHash4, coloredcoins.NewColoredBalance(eth, 1000),
 	)
 
-	if err := ledgerState.BookTransfer(transfer); err != nil {
+	if err := ledgerState.BookTransfer(transfer1); err != nil {
 		t.Error(err)
 	}
 
-	if err := ledgerState.BookTransfer(NewTransfer(transferHash3).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash1, addressHash1),
+	if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash3).AddInput(
+		transfer.NewOutputReference(transferHash1, addressHash1),
 	).AddOutput(
-		addressHash3, NewColoredBalance(iota_, 338),
+		addressHash3, coloredcoins.NewColoredBalance(iota_, 338),
 	).AddOutput(
-		addressHash3, NewColoredBalance(eth, 337),
+		addressHash3, coloredcoins.NewColoredBalance(eth, 337),
 	).AddOutput(
-		addressHash4, NewColoredBalance(iota_, 1000),
+		addressHash4, coloredcoins.NewColoredBalance(iota_, 1000),
 	).AddOutput(
-		addressHash4, NewColoredBalance(eth, 1000),
+		addressHash4, coloredcoins.NewColoredBalance(eth, 1000),
 	)); err != nil {
 		t.Error(err)
 	}
@@ -129,22 +129,22 @@ func generateRandomAddressHash() address.Address {
 	return address.New([]byte("ADDRESS" + strconv.Itoa(addressHashCounter)))
 }
 
-func initializeLedgerStateWithBalances(numberOfBalances int) (ledgerState *LedgerState, result []*transferoutput.Reference) {
+func initializeLedgerStateWithBalances(numberOfBalances int) (ledgerState *LedgerState, result []*transfer.OutputReference) {
 	ledgerState = NewLedgerState("testLedger").Prune()
 
 	for i := 0; i < numberOfBalances; i++ {
 		transferHash := generateRandomTransferHash()
 		addressHash := generateRandomAddressHash()
 
-		ledgerState.AddTransferOutput(transferHash, addressHash, NewColoredBalance(iota_, 1024))
+		ledgerState.AddTransferOutput(transferHash, addressHash, coloredcoins.NewColoredBalance(iota_, 1024))
 
-		result = append(result, transferoutput.NewTransferOutputReference(transferHash, addressHash))
+		result = append(result, transfer.NewOutputReference(transferHash, addressHash))
 	}
 
 	return
 }
 
-func doubleSpend(ledgerState *LedgerState, transferOutputReference *transferoutput.Reference) (result []*transferoutput.Reference) {
+func doubleSpend(ledgerState *LedgerState, transferOutputReference *transfer.OutputReference) (result []*transfer.OutputReference) {
 	for i := 0; i < 2; i++ {
 		result = append(result, spend(ledgerState, transferOutputReference))
 	}
@@ -152,41 +152,41 @@ func doubleSpend(ledgerState *LedgerState, transferOutputReference *transferoutp
 	return
 }
 
-func spend(ledgerState *LedgerState, transferOutputReferences ...*transferoutput.Reference) (result *transferoutput.Reference) {
+func spend(ledgerState *LedgerState, transferOutputReferences ...*transfer.OutputReference) (result *transfer.OutputReference) {
 	transferHash := generateRandomTransferHash()
 	addressHash := generateRandomAddressHash()
 
 	totalInputBalance := uint64(0)
 
-	transfer := NewTransfer(transferHash)
+	transfer1 := transfer.NewTransfer(transferHash)
 	for _, transferOutputReference := range transferOutputReferences {
 		ledgerState.GetTransferOutput(transferOutputReference).Consume(func(object objectstorage.StorableObject) {
 			transferOutput := object.(*TransferOutput)
 
 			for _, coloredBalance := range transferOutput.GetBalances() {
-				totalInputBalance += coloredBalance.GetValue()
+				totalInputBalance += coloredBalance.GetBalance()
 			}
 		})
 
-		transfer.AddInput(transferOutputReference)
+		transfer1.AddInput(transferOutputReference)
 	}
-	transfer.AddOutput(
-		addressHash, NewColoredBalance(iota_, totalInputBalance),
+	transfer1.AddOutput(
+		addressHash, coloredcoins.NewColoredBalance(iota_, totalInputBalance),
 	)
 
-	if err := ledgerState.BookTransfer(transfer); err != nil {
+	if err := ledgerState.BookTransfer(transfer1); err != nil {
 		panic(err)
 	}
 
-	result = transferoutput.NewTransferOutputReference(transferHash, addressHash)
+	result = transfer.NewOutputReference(transferHash, addressHash)
 
 	return
 }
 
-func multiSpend(ledgerState *LedgerState, outputCount int, transferOutputReferences ...*transferoutput.Reference) (result []*transferoutput.Reference) {
+func multiSpend(ledgerState *LedgerState, outputCount int, transferOutputReferences ...*transfer.OutputReference) (result []*transfer.OutputReference) {
 	transferHash := generateRandomTransferHash()
 
-	transfer := NewTransfer(transferHash)
+	transfer1 := transfer.NewTransfer(transferHash)
 
 	totalInputBalance := uint64(0)
 	for _, transferOutputReference := range transferOutputReferences {
@@ -194,24 +194,24 @@ func multiSpend(ledgerState *LedgerState, outputCount int, transferOutputReferen
 			transferOutput := object.(*TransferOutput)
 
 			for _, coloredBalance := range transferOutput.GetBalances() {
-				totalInputBalance += coloredBalance.GetValue()
+				totalInputBalance += coloredBalance.GetBalance()
 			}
 		})
 
-		transfer.AddInput(transferOutputReference)
+		transfer1.AddInput(transferOutputReference)
 	}
 
 	for i := 0; i < outputCount; i++ {
 		addressHash := generateRandomAddressHash()
 
-		transfer.AddOutput(
-			addressHash, NewColoredBalance(iota_, totalInputBalance/uint64(outputCount)),
+		transfer1.AddOutput(
+			addressHash, coloredcoins.NewColoredBalance(iota_, totalInputBalance/uint64(outputCount)),
 		)
 
-		result = append(result, transferoutput.NewTransferOutputReference(transferHash, addressHash))
+		result = append(result, transfer.NewOutputReference(transferHash, addressHash))
 	}
 
-	if err := ledgerState.BookTransfer(transfer); err != nil {
+	if err := ledgerState.BookTransfer(transfer1); err != nil {
 		panic(err)
 	}
 
@@ -291,61 +291,61 @@ func TestElevateAggregatedReality(t *testing.T) {
 
 func TestElevate(t *testing.T) {
 	ledgerState := NewLedgerState("testLedger").Prune().AddTransferOutput(
-		transferHash1, addressHash1, NewColoredBalance(eth, 1337), NewColoredBalance(iota_, 1338),
+		transferHash1, addressHash1, coloredcoins.NewColoredBalance(eth, 1337), coloredcoins.NewColoredBalance(iota_, 1338),
 	)
 
 	// create first legit spend
-	if err := ledgerState.BookTransfer(NewTransfer(transferHash2).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash1, addressHash1),
+	if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash2).AddInput(
+		transfer.NewOutputReference(transferHash1, addressHash1),
 	).AddOutput(
-		addressHash2, NewColoredBalance(iota_, 1338),
+		addressHash2, coloredcoins.NewColoredBalance(iota_, 1338),
 	).AddOutput(
-		addressHash2, NewColoredBalance(eth, 1337),
+		addressHash2, coloredcoins.NewColoredBalance(eth, 1337),
 	)); err != nil {
 		t.Error(err)
 	}
 
 	// send funds further
-	if err := ledgerState.BookTransfer(NewTransfer(transferHash3).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash2, addressHash2),
+	if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash3).AddInput(
+		transfer.NewOutputReference(transferHash2, addressHash2),
 	).AddOutput(
-		addressHash4, NewColoredBalance(iota_, 1338),
+		addressHash4, coloredcoins.NewColoredBalance(iota_, 1338),
 	).AddOutput(
-		addressHash4, NewColoredBalance(eth, 1337),
+		addressHash4, coloredcoins.NewColoredBalance(eth, 1337),
 	)); err != nil {
 		t.Error(err)
 	}
 
-	if err := ledgerState.BookTransfer(NewTransfer(transferHash4).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash2, addressHash2),
+	if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash4).AddInput(
+		transfer.NewOutputReference(transferHash2, addressHash2),
 	).AddOutput(
-		addressHash4, NewColoredBalance(iota_, 1338),
+		addressHash4, coloredcoins.NewColoredBalance(iota_, 1338),
 	).AddOutput(
-		addressHash4, NewColoredBalance(eth, 1337),
+		addressHash4, coloredcoins.NewColoredBalance(eth, 1337),
 	)); err != nil {
 		t.Error(err)
 	}
 
 	// aggregate realities
-	if err := ledgerState.BookTransfer(NewTransfer(transferHash6).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash3, addressHash4),
+	if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash6).AddInput(
+		transfer.NewOutputReference(transferHash3, addressHash4),
 	).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash4, addressHash4),
+		transfer.NewOutputReference(transferHash4, addressHash4),
 	).AddOutput(
-		addressHash6, NewColoredBalance(iota_, 2676),
+		addressHash6, coloredcoins.NewColoredBalance(iota_, 2676),
 	).AddOutput(
-		addressHash6, NewColoredBalance(eth, 2674),
+		addressHash6, coloredcoins.NewColoredBalance(eth, 2674),
 	)); err != nil {
 		t.Error(err)
 	}
 
 	// create double spend for first transfer
-	if err := ledgerState.BookTransfer(NewTransfer(transferHash5).AddInput(
-		transferoutput.NewTransferOutputReference(transferHash1, addressHash1),
+	if err := ledgerState.BookTransfer(transfer.NewTransfer(transferHash5).AddInput(
+		transfer.NewOutputReference(transferHash1, addressHash1),
 	).AddOutput(
-		addressHash5, NewColoredBalance(iota_, 1338),
+		addressHash5, coloredcoins.NewColoredBalance(iota_, 1338),
 	).AddOutput(
-		addressHash5, NewColoredBalance(eth, 1337),
+		addressHash5, coloredcoins.NewColoredBalance(eth, 1337),
 	)); err != nil {
 		t.Error(err)
 	}
diff --git a/packages/ledgerstate/outputs.png b/packages/ledgerstate/outputs.png
index 4f396a60bd9ff563f8c114e18503e0e8861136c4..ce7f548b9857d355346331a8008d96e8f6de8cb7 100644
Binary files a/packages/ledgerstate/outputs.png and b/packages/ledgerstate/outputs.png differ
diff --git a/packages/ledgerstate/outputs1.png b/packages/ledgerstate/outputs1.png
index 32cba365ac6243874aec87794a9b37f383187ff7..a6229704104a7d5650f31e3e0cb29f9f48ae1680 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 c899a4d0b89b37819f232d6f2bc86f1ccd9d1ab6..519d74e560be00d067d74190b6235e40afbad358 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 d609e9e948bbac68fd6d792e4123d839fbf0f62f..de16e625c002c23cb6810d90ee9dde926e08d363 100644
--- a/packages/ledgerstate/reality.go
+++ b/packages/ledgerstate/reality.go
@@ -4,13 +4,14 @@ import (
 	"sync"
 	"sync/atomic"
 
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+
 	"github.com/iotaledger/goshimmer/packages/binary/address"
 	"github.com/iotaledger/goshimmer/packages/binary/types"
 	"github.com/iotaledger/goshimmer/packages/errors"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/conflict"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 
 	"github.com/iotaledger/hive.go/objectstorage"
@@ -422,7 +423,7 @@ func (mreality *Reality) CreateReality(id reality.Id) *objectstorage.CachedObjec
 }
 
 // Books a transfer into this reality (wrapper for the private bookTransfer function).
-func (mreality *Reality) BookTransfer(transfer *Transfer) (err error) {
+func (mreality *Reality) BookTransfer(transfer *transfer.Transfer) (err error) {
 	err = mreality.bookTransfer(transfer.GetHash(), mreality.ledgerState.getTransferInputs(transfer), transfer.GetOutputs())
 
 	return
@@ -449,7 +450,7 @@ func (mreality *Reality) String() (result string) {
 }
 
 // Books a transfer into this reality (contains the dispatcher for the actual tasks).
-func (mreality *Reality) bookTransfer(transferHash transfer.Hash, inputs objectstorage.CachedObjects, outputs map[address.Address][]*ColoredBalance) (err error) {
+func (mreality *Reality) bookTransfer(transferHash transfer.Hash, inputs objectstorage.CachedObjects, outputs map[address.Address][]*coloredcoins.ColoredBalance) (err error) {
 	if err = mreality.verifyTransfer(inputs, outputs); err != nil {
 		return
 	}
@@ -470,8 +471,8 @@ func (mreality *Reality) bookTransfer(transferHash transfer.Hash, inputs objects
 }
 
 // Internal utility function that verifies the transfer and checks if it is valid (inputs exist + the net balance is 0).
-func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, outputs map[address.Address][]*ColoredBalance) error {
-	totalColoredBalances := make(map[Color]uint64)
+func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, outputs map[address.Address][]*coloredcoins.ColoredBalance) error {
+	totalColoredBalances := make(map[coloredcoins.Color]uint64)
 
 	for _, cachedInput := range inputs {
 		if !cachedInput.Exists() {
@@ -484,7 +485,7 @@ func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, ou
 		}
 
 		for _, balance := range input.GetBalances() {
-			totalColoredBalances[balance.GetColor()] += balance.GetValue()
+			totalColoredBalances[balance.GetColor()] += balance.GetBalance()
 		}
 	}
 
@@ -492,7 +493,7 @@ func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, ou
 		for _, balance := range transferOutput {
 			color := balance.GetColor()
 
-			totalColoredBalances[color] -= balance.GetValue()
+			totalColoredBalances[color] -= balance.GetBalance()
 
 			if totalColoredBalances[color] == 0 {
 				delete(totalColoredBalances, color)
@@ -510,7 +511,7 @@ func (mreality *Reality) verifyTransfer(inputs []*objectstorage.CachedObject, ou
 
 // Internal utility function that marks the consumed inputs as spent and returns the corresponding conflicts if the
 // inputs have been consumed before.
-func (mreality *Reality) consumeInputs(inputs objectstorage.CachedObjects, transferHash transfer.Hash, outputs map[address.Address][]*ColoredBalance) (conflicts objectstorage.CachedObjects, err error) {
+func (mreality *Reality) consumeInputs(inputs objectstorage.CachedObjects, transferHash transfer.Hash, outputs map[address.Address][]*coloredcoins.ColoredBalance) (conflicts objectstorage.CachedObjects, err error) {
 	conflicts = make(objectstorage.CachedObjects, 0)
 
 	for _, input := range inputs {
@@ -538,7 +539,7 @@ func (mreality *Reality) consumeInputs(inputs objectstorage.CachedObjects, trans
 //
 // If the inputs have been used before and we consequently have a non-empty list of conflicts, we first create a new
 // reality for the inputs and then book the transfer outputs into the correct reality.
-func (mreality *Reality) createTransferOutputs(transferHash transfer.Hash, outputs map[address.Address][]*ColoredBalance, conflicts objectstorage.CachedObjects) (err error) {
+func (mreality *Reality) createTransferOutputs(transferHash transfer.Hash, outputs map[address.Address][]*coloredcoins.ColoredBalance, conflicts objectstorage.CachedObjects) (err error) {
 	if len(conflicts) >= 1 {
 		targetRealityId := transferHash.ToRealityId()
 
@@ -639,7 +640,7 @@ func (mreality *Reality) createRealityForPreviouslyUnconflictingConsumers(consum
 				// Reality is created the first time).
 				if realityIsNew {
 					for _, addressHash := range addressHashes {
-						if err = mreality.elevateTransferOutput(transferoutput.NewTransferOutputReference(transferHash, addressHash), elevatedReality); err != nil {
+						if err = mreality.elevateTransferOutput(transfer.NewOutputReference(transferHash, addressHash), elevatedReality); err != nil {
 							return
 						}
 					}
@@ -652,7 +653,7 @@ func (mreality *Reality) createRealityForPreviouslyUnconflictingConsumers(consum
 }
 
 // Private utility function that elevates a transfer output to the given reality.
-func (mreality *Reality) elevateTransferOutput(transferOutputReference *transferoutput.Reference, newReality *Reality) (err error) {
+func (mreality *Reality) elevateTransferOutput(transferOutputReference *transfer.OutputReference, newReality *Reality) (err error) {
 	if cachedTransferOutputToElevate := mreality.ledgerState.GetTransferOutput(transferOutputReference); !cachedTransferOutputToElevate.Exists() {
 		err = errors.New("could not find TransferOutput to elevate")
 	} else {
@@ -678,7 +679,7 @@ func (mreality *Reality) elevateTransferOutput(transferOutputReference *transfer
 func (mreality *Reality) elevateTransferOutputOfCurrentReality(transferOutput *TransferOutput, newReality *Reality) (err error) {
 	for transferHash, addresses := range transferOutput.GetConsumers() {
 		for _, addressHash := range addresses {
-			if elevateErr := mreality.elevateTransferOutput(transferoutput.NewTransferOutputReference(transferHash, addressHash), newReality); elevateErr != nil {
+			if elevateErr := mreality.elevateTransferOutput(transfer.NewOutputReference(transferHash, addressHash), newReality); elevateErr != nil {
 				err = elevateErr
 
 				return
diff --git a/packages/ledgerstate/transfer.go b/packages/ledgerstate/transfer.go
deleted file mode 100644
index 591dc2aa143e5595b73f9605f923a3609b49cc50..0000000000000000000000000000000000000000
--- a/packages/ledgerstate/transfer.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package ledgerstate
-
-import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput"
-)
-
-type Transfer struct {
-	hash    transfer.Hash
-	inputs  []*transferoutput.Reference
-	outputs map[address.Address][]*ColoredBalance
-}
-
-func NewTransfer(transferHash transfer.Hash) *Transfer {
-	return &Transfer{
-		hash:    transferHash,
-		inputs:  make([]*transferoutput.Reference, 0),
-		outputs: make(map[address.Address][]*ColoredBalance),
-	}
-}
-
-func (transfer *Transfer) GetHash() transfer.Hash {
-	return transfer.hash
-}
-
-func (transfer *Transfer) GetInputs() []*transferoutput.Reference {
-	return transfer.inputs
-}
-
-func (transfer *Transfer) AddInput(input *transferoutput.Reference) *Transfer {
-	transfer.inputs = append(transfer.inputs, input)
-
-	return transfer
-}
-
-func (transfer *Transfer) AddOutput(address address.Address, balance *ColoredBalance) *Transfer {
-	if _, addressExists := transfer.outputs[address]; !addressExists {
-		transfer.outputs[address] = make([]*ColoredBalance, 0)
-	}
-
-	transfer.outputs[address] = append(transfer.outputs[address], balance)
-
-	return transfer
-}
-
-func (transfer *Transfer) GetOutputs() map[address.Address][]*ColoredBalance {
-	return transfer.outputs
-}
-
-func (transfer *Transfer) MarshalBinary() (data []byte, err error) {
-	return
-}
-
-func (transfer *Transfer) UnmarshalBinary(data []byte) (err error) {
-	return
-}
diff --git a/packages/ledgerstate/transferoutput/reference.go b/packages/ledgerstate/transfer/output_reference.go
similarity index 59%
rename from packages/ledgerstate/transferoutput/reference.go
rename to packages/ledgerstate/transfer/output_reference.go
index 988553f7f73555640b3aed8ed8cc56bf1d35bff8..bbdcef2f5555d6717b564e700294c6ad4f00317e 100644
--- a/packages/ledgerstate/transferoutput/reference.go
+++ b/packages/ledgerstate/transfer/output_reference.go
@@ -1,30 +1,29 @@
-package transferoutput
+package transfer
 
 import (
 	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
 	"github.com/iotaledger/goshimmer/packages/stringify"
 )
 
-type Reference struct {
+type OutputReference struct {
 	storageKey   []byte
-	transferHash transfer.Hash
+	transferHash Hash
 	addressHash  address.Address
 }
 
-func NewTransferOutputReference(transferHash transfer.Hash, addressHash address.Address) *Reference {
-	return &Reference{
+func NewOutputReference(transferHash Hash, addressHash address.Address) *OutputReference {
+	return &OutputReference{
 		storageKey:   append(transferHash[:], addressHash[:]...),
 		transferHash: transferHash,
 		addressHash:  addressHash,
 	}
 }
 
-func (reference *Reference) GetStorageKey() []byte {
+func (reference *OutputReference) GetStorageKey() []byte {
 	return reference.storageKey
 }
 
-func (reference *Reference) String() string {
+func (reference *OutputReference) String() string {
 	return stringify.Struct("TransferOutputReference",
 		stringify.StructField("transferHash", reference.transferHash),
 		stringify.StructField("addressHash", reference.addressHash),
diff --git a/packages/ledgerstate/transfer/transfer.go b/packages/ledgerstate/transfer/transfer.go
new file mode 100644
index 0000000000000000000000000000000000000000..ee91c1ebf67db1a3fa27172d1eb44f370ea617b7
--- /dev/null
+++ b/packages/ledgerstate/transfer/transfer.go
@@ -0,0 +1,56 @@
+package transfer
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/address"
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+)
+
+type Transfer struct {
+	hash    Hash
+	inputs  []*OutputReference
+	outputs map[address.Address][]*coloredcoins.ColoredBalance
+}
+
+func NewTransfer(transferHash Hash) *Transfer {
+	return &Transfer{
+		hash:    transferHash,
+		inputs:  make([]*OutputReference, 0),
+		outputs: make(map[address.Address][]*coloredcoins.ColoredBalance),
+	}
+}
+
+func (transfer *Transfer) GetHash() Hash {
+	return transfer.hash
+}
+
+func (transfer *Transfer) GetInputs() []*OutputReference {
+	return transfer.inputs
+}
+
+func (transfer *Transfer) AddInput(input *OutputReference) *Transfer {
+	transfer.inputs = append(transfer.inputs, input)
+
+	return transfer
+}
+
+func (transfer *Transfer) AddOutput(address address.Address, balance *coloredcoins.ColoredBalance) *Transfer {
+	if _, addressExists := transfer.outputs[address]; !addressExists {
+		transfer.outputs[address] = make([]*coloredcoins.ColoredBalance, 0)
+	}
+
+	transfer.outputs[address] = append(transfer.outputs[address], balance)
+
+	return transfer
+}
+
+func (transfer *Transfer) GetOutputs() map[address.Address][]*coloredcoins.ColoredBalance {
+	return transfer.outputs
+}
+
+func (transfer *Transfer) MarshalBinary() (data []byte, err error) {
+	return
+}
+
+func (transfer *Transfer) UnmarshalBinary(data []byte) (err error) {
+	return
+}
diff --git a/packages/ledgerstate/transfer_output.go b/packages/ledgerstate/transfer_output.go
index 09e3b136c47bf674b9db41e62179f9e9014f1e18..1d6cabff4458ddff0b5a7ca23c6faa5fd6d829b1 100644
--- a/packages/ledgerstate/transfer_output.go
+++ b/packages/ledgerstate/transfer_output.go
@@ -4,6 +4,8 @@ import (
 	"encoding/binary"
 	"sync"
 
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
@@ -19,7 +21,7 @@ type TransferOutput struct {
 
 	transferHash transfer.Hash
 	addressHash  address.Address
-	balances     []*ColoredBalance
+	balances     []*coloredcoins.ColoredBalance
 	realityId    reality.Id
 	consumers    map[transfer.Hash][]address.Address
 
@@ -31,7 +33,7 @@ type TransferOutput struct {
 	bookingMutex   sync.Mutex
 }
 
-func NewTransferOutput(ledgerState *LedgerState, realityId reality.Id, transferHash transfer.Hash, addressHash address.Address, balances ...*ColoredBalance) *TransferOutput {
+func NewTransferOutput(ledgerState *LedgerState, realityId reality.Id, transferHash transfer.Hash, addressHash address.Address, balances ...*coloredcoins.ColoredBalance) *TransferOutput {
 	return &TransferOutput{
 		transferHash: transferHash,
 		addressHash:  addressHash,
@@ -79,7 +81,7 @@ func (transferOutput *TransferOutput) SetRealityId(realityId reality.Id) {
 	}
 }
 
-func (transferOutput *TransferOutput) GetBalances() []*ColoredBalance {
+func (transferOutput *TransferOutput) GetBalances() []*coloredcoins.ColoredBalance {
 	return transferOutput.balances
 }
 
@@ -96,7 +98,7 @@ func (transferOutput *TransferOutput) GetConsumers() (consumers map[transfer.Has
 	return
 }
 
-func (transferOutput *TransferOutput) addConsumer(consumer transfer.Hash, outputs map[address.Address][]*ColoredBalance) (consumersToElevate map[transfer.Hash][]address.Address, err error) {
+func (transferOutput *TransferOutput) addConsumer(consumer transfer.Hash, outputs map[address.Address][]*coloredcoins.ColoredBalance) (consumersToElevate map[transfer.Hash][]address.Address, err error) {
 	transferOutput.consumersMutex.RLock()
 	if _, exist := transferOutput.consumers[consumer]; exist {
 		transferOutput.consumersMutex.RUnlock()
@@ -181,7 +183,7 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 	balanceCount := len(transferOutput.balances)
 	consumerCount := len(transferOutput.consumers)
 
-	serializedLength := reality.IdLength + 4 + balanceCount*coloredBalanceLength + 4 + consumerCount*transfer.HashLength
+	serializedLength := reality.IdLength + 4 + balanceCount*coloredcoins.BalanceLength + 4 + consumerCount*transfer.HashLength
 	for _, addresses := range transferOutput.consumers {
 		serializedLength += 4
 		for range addresses {
@@ -195,10 +197,12 @@ func (transferOutput *TransferOutput) MarshalBinary() ([]byte, error) {
 
 	binary.LittleEndian.PutUint32(result[reality.IdLength:], uint32(balanceCount))
 	for i := 0; i < balanceCount; i++ {
-		copy(result[reality.IdLength+4+i*coloredBalanceLength:], transferOutput.balances[i].color[:colorLength])
-		binary.LittleEndian.PutUint64(result[reality.IdLength+4+i*coloredBalanceLength+colorLength:], transferOutput.balances[i].balance)
+		color := transferOutput.balances[i].GetColor()
+
+		copy(result[reality.IdLength+4+i*coloredcoins.BalanceLength:], color[:coloredcoins.ColorLength])
+		binary.LittleEndian.PutUint64(result[reality.IdLength+4+i*coloredcoins.BalanceLength+coloredcoins.ColorLength:], transferOutput.balances[i].GetBalance())
 	}
-	offset := reality.IdLength + 4 + balanceCount*coloredBalanceLength
+	offset := reality.IdLength + 4 + balanceCount*coloredcoins.BalanceLength
 
 	binary.LittleEndian.PutUint32(result[offset:], uint32(consumerCount))
 	offset += 4
@@ -240,7 +244,7 @@ func (transferOutput *TransferOutput) UnmarshalBinary(serializedObject []byte) e
 		transferOutput.balances = balances
 	}
 
-	if consumers, err := transferOutput.unmarshalConsumers(serializedObject[reality.IdLength+4+len(transferOutput.balances)*coloredBalanceLength:]); err != nil {
+	if consumers, err := transferOutput.unmarshalConsumers(serializedObject[reality.IdLength+4+len(transferOutput.balances)*coloredcoins.BalanceLength:]); err != nil {
 		return err
 	} else {
 		transferOutput.consumers = consumers
@@ -249,13 +253,13 @@ func (transferOutput *TransferOutput) UnmarshalBinary(serializedObject []byte) e
 	return nil
 }
 
-func (transferOutput *TransferOutput) unmarshalBalances(serializedBalances []byte) ([]*ColoredBalance, error) {
+func (transferOutput *TransferOutput) unmarshalBalances(serializedBalances []byte) ([]*coloredcoins.ColoredBalance, error) {
 	balanceCount := int(binary.LittleEndian.Uint32(serializedBalances))
 
-	balances := make([]*ColoredBalance, balanceCount)
+	balances := make([]*coloredcoins.ColoredBalance, balanceCount)
 	for i := 0; i < balanceCount; i++ {
-		coloredBalance := ColoredBalance{}
-		if err := coloredBalance.UnmarshalBinary(serializedBalances[4+i*coloredBalanceLength:]); err != nil {
+		coloredBalance := coloredcoins.ColoredBalance{}
+		if err := coloredBalance.UnmarshalBinary(serializedBalances[4+i*coloredcoins.BalanceLength:]); err != nil {
 			return nil, err
 		}
 
diff --git a/packages/ledgerstate/transfer_output_reference.go b/packages/ledgerstate/transfer_output_reference.go
deleted file mode 100644
index cb8e885c8971415d0ee0b2ac1ead04fd6ca5db96..0000000000000000000000000000000000000000
--- a/packages/ledgerstate/transfer_output_reference.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package ledgerstate
-
-/*
-import (
-	"github.com/iotaledger/goshimmer/packages/binary/address"
-	"github.com/iotaledger/goshimmer/packages/binary/transfer"
-	"github.com/iotaledger/goshimmer/packages/stringify"
-)
-
-type TransferOutputReference struct {
-	storageKey   []byte
-	transferHash transfer.Hash
-	addressHash  address.Address
-}
-
-func NewTransferOutputReference(transferHash transfer.Hash, addressHash address.Address) *TransferOutputReference {
-	return &TransferOutputReference{
-		storageKey:   append(transferHash[:], addressHash[:]...),
-		transferHash: transferHash,
-		addressHash:  addressHash,
-	}
-}
-
-func (transferOutputReference *TransferOutputReference) GetStorageKey() []byte {
-	return transferOutputReference.storageKey
-}
-
-func (transferOutputReference *TransferOutputReference) String() string {
-	return stringify.Struct("TransferOutputReference",
-		stringify.StructField("transferHash", transferOutputReference.transferHash),
-		stringify.StructField("addressHash", transferOutputReference.addressHash),
-	)
-}
-
-*/
diff --git a/packages/ledgerstate/transfer_output_test.go b/packages/ledgerstate/transfer_output_test.go
index ef061b0bf359bd5348cd06d21af656a61f36e8d4..c808933b83b4a87c66b3c687584822a0d71e89fa 100644
--- a/packages/ledgerstate/transfer_output_test.go
+++ b/packages/ledgerstate/transfer_output_test.go
@@ -3,6 +3,8 @@ package ledgerstate
 import (
 	"testing"
 
+	"github.com/iotaledger/goshimmer/packages/ledgerstate/coloredcoins"
+
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
 
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
@@ -13,7 +15,7 @@ import (
 )
 
 func TestTransferOutput_MarshalUnmarshal(t *testing.T) {
-	transferOutput := NewTransferOutput(nil, reality.NewId("REALITY"), transfer.NewHash("RECEIVE"), address.New([]byte("ADDRESS1")), NewColoredBalance(NewColor("IOTA"), 44), NewColoredBalance(NewColor("BTC"), 88))
+	transferOutput := NewTransferOutput(nil, reality.NewId("REALITY"), transfer.NewHash("RECEIVE"), address.New([]byte("ADDRESS1")), coloredcoins.NewColoredBalance(coloredcoins.NewColor("IOTA"), 44), coloredcoins.NewColoredBalance(coloredcoins.NewColor("BTC"), 88))
 	transferOutput.consumers = make(map[transfer.Hash][]address.Address)
 
 	spendTransferHash := transfer.NewHash("SPEND")
diff --git a/packages/ledgerstate/visualizer.go b/packages/ledgerstate/visualizer.go
index ada4c919155f878197a9f52eb65532911348d6c2..b9bc8b13e8d4ab1b66ac99dc28f2c7390022f2da 100644
--- a/packages/ledgerstate/visualizer.go
+++ b/packages/ledgerstate/visualizer.go
@@ -3,13 +3,11 @@ package ledgerstate
 import (
 	"strings"
 
+	"github.com/emicklei/dot"
 	"github.com/iotaledger/goshimmer/packages/binary/address"
 	"github.com/iotaledger/goshimmer/packages/graphviz"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/reality"
 	"github.com/iotaledger/goshimmer/packages/ledgerstate/transfer"
-	"github.com/iotaledger/goshimmer/packages/ledgerstate/transferoutput"
-
-	"github.com/emicklei/dot"
 	"github.com/iotaledger/hive.go/objectstorage"
 )
 
@@ -64,7 +62,7 @@ func (visualizer *Visualizer) drawTransferOutput(transferOutput *TransferOutput)
 
 		for transferHash, addresses := range transferOutput.GetConsumers() {
 			for _, addressHash := range addresses {
-				visualizer.ledgerState.GetTransferOutput(transferoutput.NewTransferOutputReference(transferHash, addressHash)).Consume(func(object objectstorage.StorableObject) {
+				visualizer.ledgerState.GetTransferOutput(transfer.NewOutputReference(transferHash, addressHash)).Consume(func(object objectstorage.StorableObject) {
 					transferOutputNode.Edge(visualizer.drawTransferOutput(object.(*TransferOutput)))
 				})
 			}