diff --git a/packages/curl/batch_hasher.go b/packages/curl/batch_hasher.go
index af38a90bcad20cd951c464384adea3e5e0c574fc..367ff8e0c64618265a420fd0c3725d1ad7b12994 100644
--- a/packages/curl/batch_hasher.go
+++ b/packages/curl/batch_hasher.go
@@ -117,5 +117,5 @@ func (this *BatchHasher) Hash(trits ternary.Trits) chan ternary.Trits {
 }
 
 const (
-	NUMBER_OF_WORKERS = 100
+	NUMBER_OF_WORKERS = 1000
 )
diff --git a/packages/model/approvers/approvers.go b/packages/model/approvers/approvers.go
index cd7e66c4ed8db52178f13936f0840b7194d275a1..a733922ac3b537bb193c07b68eb0b63d5758f139 100644
--- a/packages/model/approvers/approvers.go
+++ b/packages/model/approvers/approvers.go
@@ -63,10 +63,10 @@ func (approvers *Approvers) SetModified(modified bool) {
 }
 
 func (approvers *Approvers) Marshal() (result []byte) {
-	result = make([]byte, MARSHALED_APPROVERS_MIN_SIZE+len(approvers.hashes)*MARSHALED_APPROVERS_HASH_SIZE)
-
 	approvers.hashesMutex.RLock()
 
+	result = make([]byte, MARSHALED_APPROVERS_MIN_SIZE+len(approvers.hashes)*MARSHALED_APPROVERS_HASH_SIZE)
+
 	binary.BigEndian.PutUint64(result[MARSHALED_APPROVERS_HASHES_COUNT_START:MARSHALED_APPROVERS_HASHES_COUNT_END], uint64(len(approvers.hashes)))
 
 	copy(result[MARSHALED_APPROVERS_HASH_START:MARSHALED_APPROVERS_HASH_END], approvers.hash.CastToBytes())
diff --git a/packages/model/meta_transaction/constants.go b/packages/model/meta_transaction/constants.go
index 48fe6869ea278e148d4a477a0af614004f72a472..8676b4c9a478d567f95fab38804c695a232df027 100644
--- a/packages/model/meta_transaction/constants.go
+++ b/packages/model/meta_transaction/constants.go
@@ -29,7 +29,7 @@ const (
 	TRANSACTION_TYPE_END        = TRANSACTION_TYPE_OFFSET + TRANSACTION_TYPE_SIZE
 	DATA_END                    = DATA_OFFSET + DATA_SIZE
 
-	MARSHALLED_TOTAL_SIZE = DATA_END
+	MARSHALED_TOTAL_SIZE = DATA_END
 
 	BRANCH_NULL_HASH = ternary.Trytes("999999999999999999999999999999999999999999999999999999999999999999999999999999999")
 )
diff --git a/packages/model/meta_transaction/meta_transaction.go b/packages/model/meta_transaction/meta_transaction.go
index 82bb790c31ba802e1df8eb16b4c099856cc090bf..f949915eeac1faec7e7c5746789267125ca111b0 100644
--- a/packages/model/meta_transaction/meta_transaction.go
+++ b/packages/model/meta_transaction/meta_transaction.go
@@ -37,7 +37,7 @@ type MetaTransaction struct {
 }
 
 func New() *MetaTransaction {
-	return FromTrits(make(ternary.Trits, MARSHALLED_TOTAL_SIZE))
+	return FromTrits(make(ternary.Trits, MARSHALED_TOTAL_SIZE))
 }
 
 func FromTrits(trits ternary.Trits) *MetaTransaction {
@@ -47,7 +47,7 @@ func FromTrits(trits ternary.Trits) *MetaTransaction {
 }
 
 func FromBytes(bytes []byte) (result *MetaTransaction) {
-	result = FromTrits(ternary.BytesToTrits(bytes)[:MARSHALLED_TOTAL_SIZE])
+	result = FromTrits(ternary.BytesToTrits(bytes)[:MARSHALED_TOTAL_SIZE])
 	result.bytes = bytes
 
 	return
diff --git a/packages/model/value_transaction/value_transaction.go b/packages/model/value_transaction/value_transaction.go
index 2d9b0cd8b8f3d553e0e9684b86e11da079877ef4..b014d3ceb3a8da0ca02359236d552481a089c30f 100644
--- a/packages/model/value_transaction/value_transaction.go
+++ b/packages/model/value_transaction/value_transaction.go
@@ -43,7 +43,7 @@ func FromMetaTransaction(metaTransaction *meta_transaction.MetaTransaction) *Val
 
 func FromBytes(bytes []byte) (result *ValueTransaction) {
 	result = &ValueTransaction{
-		MetaTransaction: meta_transaction.FromTrits(ternary.BytesToTrits(bytes)[:meta_transaction.MARSHALLED_TOTAL_SIZE]),
+		MetaTransaction: meta_transaction.FromTrits(ternary.BytesToTrits(bytes)[:meta_transaction.MARSHALED_TOTAL_SIZE]),
 	}
 
 	result.trits = result.MetaTransaction.GetData()
@@ -192,6 +192,24 @@ func (this *ValueTransaction) SetTimestamp(timestamp uint) bool {
 	return false
 }
 
+func (this *ValueTransaction) GetBundleEssence() (result ternary.Trytes) {
+	this.addressMutex.RLock()
+	this.valueMutex.RLock()
+	this.signatureMessageFragmentMutex.RLock()
+
+	if this.GetValue() < 0 {
+		result = this.trits[ADDRESS_OFFSET:VALUE_END].ToTrytes() + this.trits[SIGNATURE_MESSAGE_FRAGMENT_OFFSET:SIGNATURE_MESSAGE_FRAGMENT_END].ToTrytes()
+	} else {
+		result = this.trits[ADDRESS_OFFSET:VALUE_END].ToTrytes()
+	}
+
+	this.signatureMessageFragmentMutex.RUnlock()
+	this.valueMutex.RUnlock()
+	this.addressMutex.RUnlock()
+
+	return
+}
+
 // getter for the nonce (supports concurrency)
 func (this *ValueTransaction) GetNonce() (result ternary.Trytes) {
 	this.nonceMutex.RLock()
diff --git a/packages/model/valuebundle/metabundle.go b/packages/model/valuebundle/metabundle.go
index 18d78f6ab1cc5b0b4f6e1cb1cabde58b32ec0a82..a5714d8920226ac7d8f3c8659838ff71a25380d4 100644
--- a/packages/model/valuebundle/metabundle.go
+++ b/packages/model/valuebundle/metabundle.go
@@ -27,6 +27,10 @@ func (bundle *MetaBundle) GetHash() ternary.Trytes {
 }
 
 func CalculateBundleHash(transactions []*value_transaction.ValueTransaction) ternary.Trytes {
+	transactions[0].GetAddress()
+	transactions[0].GetSignatureMessageFragment()
+	transactions[0].GetTimestamp()
+	transactions[0].GetValue()
 	//transactions[0].GetData()[value_transaction.SIGNATURE_MESSAGE_FRAGMENT_OFFSET]
 	return ternary.Trytes("A")
 }
diff --git a/plugins/gossip/protocol_v1.go b/plugins/gossip/protocol_v1.go
index b0adc6addc6ce15fd4029e9acad0009fca7b805e..ac5939a62a3485f0e3cd35331ca0fe8df3bea57d 100644
--- a/plugins/gossip/protocol_v1.go
+++ b/plugins/gossip/protocol_v1.go
@@ -303,7 +303,7 @@ type transactionStateV1 struct {
 func newTransactionStateV1(protocol *protocol) *transactionStateV1 {
 	return &transactionStateV1{
 		protocol: protocol,
-		buffer:   make([]byte, meta_transaction.MARSHALLED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE),
+		buffer:   make([]byte, meta_transaction.MARSHALED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE),
 		offset:   0,
 	}
 }
@@ -312,10 +312,10 @@ func (state *transactionStateV1) Receive(data []byte, offset int, length int) (i
 	bytesRead := byteutils.ReadAvailableBytesToBuffer(state.buffer, state.offset, data, offset, length)
 
 	state.offset += bytesRead
-	if state.offset == meta_transaction.MARSHALLED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE {
+	if state.offset == meta_transaction.MARSHALED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE {
 		protocol := state.protocol
 
-		transactionData := make([]byte, meta_transaction.MARSHALLED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE)
+		transactionData := make([]byte, meta_transaction.MARSHALED_TOTAL_SIZE/ternary.NUMBER_OF_TRITS_IN_A_BYTE)
 		copy(transactionData, state.buffer)
 
 		protocol.Events.ReceiveTransactionData.Trigger(transactionData)
diff --git a/plugins/gossip/transaction_processor_test.go b/plugins/gossip/transaction_processor_test.go
index c07602df5f71f7b93168bdd8f01271a994a50697..9c7e8bdf6954d2b22839f66f066ac22e4e7a319b 100644
--- a/plugins/gossip/transaction_processor_test.go
+++ b/plugins/gossip/transaction_processor_test.go
@@ -9,7 +9,7 @@ import (
 )
 
 func BenchmarkProcessSimilarTransactionsFiltered(b *testing.B) {
-	byteArray := setupTransaction(meta_transaction.MARSHALLED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
+	byteArray := setupTransaction(meta_transaction.MARSHALED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
 
 	b.ResetTimer()
 
@@ -19,7 +19,7 @@ func BenchmarkProcessSimilarTransactionsFiltered(b *testing.B) {
 }
 
 func BenchmarkProcessSimilarTransactionsUnfiltered(b *testing.B) {
-	byteArray := setupTransaction(meta_transaction.MARSHALLED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
+	byteArray := setupTransaction(meta_transaction.MARSHALED_TOTAL_SIZE / ternary.NUMBER_OF_TRITS_IN_A_BYTE)
 
 	b.ResetTimer()
 
diff --git a/plugins/tangle/approvers.go b/plugins/tangle/approvers.go
index 2e54e11d97f206b58f42d9c858a73f9626b10cc3..a5648c8f76f4c8153015173e0966ef9b3298e97c 100644
--- a/plugins/tangle/approvers.go
+++ b/plugins/tangle/approvers.go
@@ -85,8 +85,8 @@ func configureApproversDatabase(plugin *node.Plugin) {
 
 func storeApproversInDatabase(approvers *approvers.Approvers) errors.IdentifiableError {
 	if approvers.GetModified() {
-		if err := transactionMetadataDatabase.Set(approvers.GetHash().CastToBytes(), approvers.Marshal()); err != nil {
-			return ErrDatabaseError.Derive(err, "failed to store transaction metadata")
+		if err := approversDatabase.Set(approvers.GetHash().CastToBytes(), approvers.Marshal()); err != nil {
+			return ErrDatabaseError.Derive(err, "failed to store approvers")
 		}
 
 		approvers.SetModified(false)
diff --git a/plugins/tangle/solidifier.go b/plugins/tangle/solidifier.go
index edf28844cbe536b44a643545ec5101053c1ba433..ce66662a01ff3d8db3535e067bbf30c3daf84207 100644
--- a/plugins/tangle/solidifier.go
+++ b/plugins/tangle/solidifier.go
@@ -17,7 +17,7 @@ import (
 
 //var solidifierChan = make(chan *value_transaction.ValueTransaction, 1000)
 
-const NUMBER_OF_WORKERS = 300
+const NUMBER_OF_WORKERS = 3000
 
 var tasksChan = make(chan *meta_transaction.MetaTransaction, NUMBER_OF_WORKERS)
 
diff --git a/plugins/tangle/transaction_metadata.go b/plugins/tangle/transaction_metadata.go
index 82a3b8fde8ac9a4053dc7c01f42f434d85a69524..6548346b1f3db226545bfb47900e559d9066b1f5 100644
--- a/plugins/tangle/transaction_metadata.go
+++ b/plugins/tangle/transaction_metadata.go
@@ -90,6 +90,9 @@ func storeTransactionMetadataInDatabase(metadata *transactionmetadata.Transactio
 		if marshaledMetadata, err := metadata.Marshal(); err != nil {
 			return err
 		} else {
+			if len(marshaledMetadata) != 97 {
+				panic("WATT")
+			}
 			if err := transactionMetadataDatabase.Set(metadata.GetHash().CastToBytes(), marshaledMetadata); err != nil {
 				return ErrDatabaseError.Derive(err, "failed to store transaction metadata")
 			}