diff --git a/packages/binary/serialize/serialized_object.go b/packages/binary/serialize/serialized_object.go
new file mode 100644
index 0000000000000000000000000000000000000000..f3ecab10fa541a24f290b761c44b8db8bb3123bc
--- /dev/null
+++ b/packages/binary/serialize/serialized_object.go
@@ -0,0 +1,15 @@
+package serialize
+
+import (
+	"reflect"
+	"unsafe"
+)
+
+type SerializedObject struct {
+	readOffset int
+}
+
+func (so *SerializedObject) SerializeInt(int int) []byte {
+	hdr := reflect.SliceHeader{Data: uintptr(unsafe.Pointer(&int)), Len: 8, Cap: 8}
+	return *(*[]byte)(unsafe.Pointer(&hdr))
+}
diff --git a/packages/binary/spammer/spammer.go b/packages/binary/spammer/spammer.go
index 95b4bd5aa243211cab416c144f68574b983f10cf..7f163170dfb8337c1becd4f9046b7868d94c7f8c 100644
--- a/packages/binary/spammer/spammer.go
+++ b/packages/binary/spammer/spammer.go
@@ -24,8 +24,9 @@ type Spammer struct {
 
 func New(tangle *tangle.Tangle, tipSelector *tipselector.TipSelector) *Spammer {
 	return &Spammer{
-		tangle:      tangle,
-		tipSelector: tipSelector,
+		shutdownSignal: make(chan types.Empty),
+		tangle:         tangle,
+		tipSelector:    tipSelector,
 	}
 }
 
@@ -44,7 +45,7 @@ func (spammer *Spammer) Shutdown() {
 	spammer.startStopMutex.Lock()
 	defer spammer.startStopMutex.Unlock()
 
-	if !spammer.running {
+	if spammer.running {
 		spammer.running = false
 
 		spammer.shutdownSignal <- types.Void
diff --git a/packages/binary/storageprefix/storageprefix.go b/packages/binary/storageprefix/storageprefix.go
index 6493adf68473e6cdd98ecd4befaa510967437220..ff38affd4d7653e15347572f3cce8cb1c9cd56d7 100644
--- a/packages/binary/storageprefix/storageprefix.go
+++ b/packages/binary/storageprefix/storageprefix.go
@@ -1,7 +1,7 @@
 package storageprefix
 
 var (
-	Mainnet = []byte{0}
+	Mainnet = []byte{88}
 
 	TangleTransaction         = []byte{1}
 	TangleTransactionMetadata = []byte{2}
diff --git a/packages/binary/tangle/events.go b/packages/binary/tangle/events.go
index d2bf35523764694fd393df88ff9936244ddd5b54..5fe03f48e19c5ff19a5936a8b16486d51a40a597 100644
--- a/packages/binary/tangle/events.go
+++ b/packages/binary/tangle/events.go
@@ -34,6 +34,6 @@ func transactionIdEvent(handler interface{}, params ...interface{}) {
 func cachedTransactionEvent(handler interface{}, params ...interface{}) {
 	handler.(func(*transaction.CachedTransaction, *transactionmetadata.CachedTransactionMetadata))(
 		params[0].(*transaction.CachedTransaction).Retain(),
-		params[1].(*transactionmetadata.CachedTransactionMetadata).Retain().(*transactionmetadata.CachedTransactionMetadata),
+		params[1].(*transactionmetadata.CachedTransactionMetadata).Retain(),
 	)
 }
diff --git a/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
index 8b327806525d359f39dcbf0dd54e699cdc195f61..c8db28e1b0f455adb506ff40b5996fbab8801bcb 100644
--- a/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
+++ b/packages/binary/tangle/model/transactionmetadata/cached_transactionmetadata.go
@@ -8,8 +8,8 @@ type CachedTransactionMetadata struct {
 	objectstorage.CachedObject
 }
 
-func (cachedObject *CachedTransactionMetadata) Retain() objectstorage.CachedObject {
-	return &CachedTransactionMetadata{cachedObject}
+func (cachedObject *CachedTransactionMetadata) Retain() *CachedTransactionMetadata {
+	return &CachedTransactionMetadata{cachedObject.CachedObject.Retain()}
 }
 
 func (cachedObject *CachedTransactionMetadata) Unwrap() *TransactionMetadata {
diff --git a/packages/binary/tangle/model/transactionmetadata/proto.go b/packages/binary/tangle/model/transactionmetadata/proto.go
new file mode 100644
index 0000000000000000000000000000000000000000..652cb7d48f6a027ca9104ade946c2483f7626510
--- /dev/null
+++ b/packages/binary/tangle/model/transactionmetadata/proto.go
@@ -0,0 +1,51 @@
+package transactionmetadata
+
+import (
+	"fmt"
+	"reflect"
+	"runtime"
+	"time"
+	"unsafe"
+)
+
+type Proto struct {
+	receivedTime       time.Time
+	solidificationTime time.Time
+	solid              bool
+}
+
+// region GENERIC SERIALIZATION CODE ///////////////////////////////////////////////////////////////////////////////////
+
+var sizeOfProto = int(unsafe.Sizeof(Proto{}))
+
+func ProtoFromBytes(bytes []byte) (result *Proto, err error) {
+	if bytesLength := len(bytes); bytesLength != sizeOfProto {
+		return nil, fmt.Errorf("bytes are not long enough (%d instead of %d)", bytesLength, sizeOfProto)
+	}
+
+	copiedBytes := make([]byte, sizeOfProto)
+	copy(copiedBytes, bytes)
+
+	result = (*Proto)(unsafe.Pointer(
+		(*reflect.SliceHeader)(unsafe.Pointer(&copiedBytes)).Data,
+	))
+
+	runtime.KeepAlive(copiedBytes)
+
+	return
+}
+
+func (proto *Proto) ToBytes() (result []byte) {
+	result = make([]byte, sizeOfProto)
+	copy(result, *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
+		Data: uintptr(unsafe.Pointer(proto)),
+		Len:  sizeOfProto,
+		Cap:  sizeOfProto,
+	})))
+
+	runtime.KeepAlive(proto)
+
+	return
+}
+
+// endregion ///////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
index f29a6e3425262f50a312892714e3ca32020eb3cb..a7730e6224e9a4923b2bb0a2c3494aaca7c7300a 100644
--- a/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
+++ b/packages/binary/tangle/model/transactionmetadata/transactionmetadata.go
@@ -86,9 +86,22 @@ func (transactionMetadata *TransactionMetadata) Update(other objectstorage.Stora
 }
 
 func (transactionMetadata *TransactionMetadata) MarshalBinary() ([]byte, error) {
-	return nil, nil
+	return (&Proto{
+		receivedTime:       transactionMetadata.receivedTime,
+		solidificationTime: transactionMetadata.solidificationTime,
+		solid:              transactionMetadata.solid,
+	}).ToBytes(), nil
 }
 
-func (transactionMetadata *TransactionMetadata) UnmarshalBinary([]byte) error {
-	return nil
+func (transactionMetadata *TransactionMetadata) UnmarshalBinary(data []byte) (err error) {
+	proto, err := ProtoFromBytes(data)
+	if err != nil {
+		return
+	}
+
+	transactionMetadata.receivedTime = proto.receivedTime
+	transactionMetadata.solidificationTime = proto.solidificationTime
+	transactionMetadata.solid = proto.solid
+
+	return
 }
diff --git a/packages/binary/tangle/tangle_test.go b/packages/binary/tangle/tangle_test.go
index f40da0a91d6bd1e15df1ac5e78ea2ad6eeca6bf3..c8ff887c1f0659f340749dd564f3d7f001811be2 100644
--- a/packages/binary/tangle/tangle_test.go
+++ b/packages/binary/tangle/tangle_test.go
@@ -8,15 +8,19 @@ import (
 	"github.com/dgraph-io/badger/v2"
 	"github.com/iotaledger/hive.go/events"
 
+	"github.com/iotaledger/hive.go/database"
+
 	"github.com/iotaledger/goshimmer/packages/binary/identity"
 	"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/transactionmetadata"
-	"github.com/iotaledger/goshimmer/packages/database"
+	"github.com/iotaledger/goshimmer/plugins/config"
 )
 
 var testDatabase *badger.DB
 
+var _ = config.PLUGIN
+
 func init() {
 	testDatabase = database.GetBadgerInstance()
 }
diff --git a/plugins/autopeering/autopeering.go b/plugins/autopeering/autopeering.go
index c02b8bf87d18bd47a48d0555e073a99b0b340eed..436198b3bc22a9cbabe4c4c3d67c76915c8e978f 100644
--- a/plugins/autopeering/autopeering.go
+++ b/plugins/autopeering/autopeering.go
@@ -16,9 +16,7 @@ import (
 	"github.com/iotaledger/hive.go/logger"
 	"github.com/iotaledger/hive.go/node"
 
-	"github.com/iotaledger/goshimmer/packages/netutil"
 	"github.com/iotaledger/goshimmer/plugins/autopeering/local"
-	"github.com/iotaledger/goshimmer/plugins/cli"
 	"github.com/iotaledger/goshimmer/plugins/config"
 	"github.com/iotaledger/goshimmer/plugins/gossip"
 )
@@ -161,17 +159,19 @@ func parseEntryNodes() (result []*peer.Peer, err error) {
 }
 
 func checkConnection(localAddr *net.UDPAddr, self *peer.Peer) {
-	peering := self.Services().Get(service.PeeringKey)
-	remoteAddr, err := net.ResolveUDPAddr(peering.Network(), peering.String())
-	if err != nil {
-		panic(err)
-	}
+	/*
+		peering := self.Services().Get(service.PeeringKey)
+		remoteAddr, err := net.ResolveUDPAddr(peering.Network(), peering.String())
+		if err != nil {
+			panic(err)
+		}
 
-	// do not check the address as a NAT may change them for local connections
-	err = netutil.CheckUDP(localAddr, remoteAddr, false, true)
-	if err != nil {
-		log.Errorf("Error testing service: %s", err)
-		log.Panicf("Please check that %s is publicly reachable at %s/%s",
-			cli.AppName, peering.String(), peering.Network())
-	}
+		// do not check the address as a NAT may change them for local connections
+		err = netutil.CheckUDP(localAddr, remoteAddr, false, true)
+		if err != nil {
+			log.Errorf("Error testing service: %s", err)
+			log.Panicf("Please check that %s is publicly reachable at %s/%s",
+				cli.AppName, peering.String(), peering.Network())
+		}
+	*/
 }
diff --git a/plugins/config/config.go b/plugins/config/config.go
index 5f507429000463fed592df15ceed04a858fc9866..70513880fa272a3878d840c6cb7211fa26eb8df6 100644
--- a/plugins/config/config.go
+++ b/plugins/config/config.go
@@ -52,7 +52,7 @@ func parseParameters() {
 // It automatically reads in a single config file starting with "config" (can be changed via the --config CLI flag)
 // and ending with: .json, .toml, .yaml or .yml (in this sequence).
 func Fetch(printConfig bool, ignoreSettingsAtPrint ...[]string) error {
-	err := parameter.LoadConfigFile(NodeConfig, *configDirPath, *configName, true, false)
+	err := parameter.LoadConfigFile(NodeConfig, *configDirPath, *configName, true, true)
 	if err != nil {
 		return err
 	}
diff --git a/plugins/gossip/gossip.go b/plugins/gossip/gossip.go
index 3697608d0a732f7cd097834c08879ed9423a10e0..8c071f8c5414101e927aceb1817c9284efc2eda2 100644
--- a/plugins/gossip/gossip.go
+++ b/plugins/gossip/gossip.go
@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"net"
 	"strconv"
-	"sync"
 
 	"github.com/iotaledger/hive.go/autopeering/peer"
 	"github.com/iotaledger/hive.go/autopeering/peer/service"
@@ -14,7 +13,6 @@ import (
 	gp "github.com/iotaledger/goshimmer/packages/gossip"
 	"github.com/iotaledger/goshimmer/packages/gossip/server"
 	"github.com/iotaledger/goshimmer/plugins/autopeering/local"
-	"github.com/iotaledger/goshimmer/plugins/cli"
 	"github.com/iotaledger/goshimmer/plugins/config"
 	"github.com/iotaledger/goshimmer/plugins/tangle"
 )
@@ -84,25 +82,27 @@ func start(shutdownSignal <-chan struct{}) {
 }
 
 func checkConnection(srv *server.TCP, self *peer.Peer) {
-	var wg sync.WaitGroup
-	wg.Add(1)
-	go func() {
-		defer wg.Done()
-		conn, err := srv.AcceptPeer(self)
+	/*
+		var wg sync.WaitGroup
+		wg.Add(1)
+		go func() {
+			defer wg.Done()
+			conn, err := srv.AcceptPeer(self)
+			if err != nil {
+				return
+			}
+			_ = conn.Close()
+		}()
+		conn, err := srv.DialPeer(self)
 		if err != nil {
-			return
+			log.Errorf("Error testing: %s", err)
+			addr := self.Services().Get(service.GossipKey)
+			log.Panicf("Please check that %s is publicly reachable at %s/%s",
+				cli.AppName, addr.String(), addr.Network())
 		}
 		_ = conn.Close()
-	}()
-	conn, err := srv.DialPeer(self)
-	if err != nil {
-		log.Errorf("Error testing: %s", err)
-		addr := self.Services().Get(service.GossipKey)
-		log.Panicf("Please check that %s is publicly reachable at %s/%s",
-			cli.AppName, addr.String(), addr.Network())
-	}
-	_ = conn.Close()
-	wg.Wait()
+		wg.Wait()
+	*/
 }
 
 func getTransaction(transactionId transaction.Id) (bytes []byte, err error) {
diff --git a/plugins/tangle/plugin.go b/plugins/tangle/plugin.go
index 533d644f3c2e52ad49b8f2c361a8f5ca6866f401..8edf6459f4cdd8206732e2e1487914a16698d860 100644
--- a/plugins/tangle/plugin.go
+++ b/plugins/tangle/plugin.go
@@ -1,7 +1,10 @@
 package tangle
 
 import (
+	"fmt"
+
 	"github.com/iotaledger/goshimmer/packages/binary/storageprefix"
+	"github.com/iotaledger/goshimmer/packages/binary/tangle"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transaction"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle/model/transactionmetadata"
 	"github.com/iotaledger/goshimmer/packages/binary/tangle/tipselector"
@@ -9,11 +12,9 @@ import (
 	"github.com/iotaledger/goshimmer/packages/binary/tangle/transactionrequester"
 	"github.com/iotaledger/goshimmer/packages/database"
 	"github.com/iotaledger/goshimmer/packages/shutdown"
+
 	"github.com/iotaledger/hive.go/daemon"
 	"github.com/iotaledger/hive.go/events"
-
-	"github.com/iotaledger/goshimmer/packages/binary/tangle"
-
 	"github.com/iotaledger/hive.go/logger"
 	"github.com/iotaledger/hive.go/node"
 )
@@ -56,6 +57,8 @@ func configure(*node.Plugin) {
 
 	// setup TipSelector
 	Instance.Events.TransactionSolid.Attach(events.NewClosure(func(cachedTransaction *transaction.CachedTransaction, cachedTransactionMetadata *transactionmetadata.CachedTransactionMetadata) {
+		fmt.Println(cachedTransaction.Unwrap())
+
 		cachedTransactionMetadata.Release()
 
 		cachedTransaction.Consume(TipSelector.AddTip)
diff --git a/plugins/webapi/spammer/plugin.go b/plugins/webapi/spammer/plugin.go
index a5d9345bdfa5f8bffcddb1c501c6dc12ae9fc19d..7bd38432c88dda4a3a9730202a6987f5c1675663 100644
--- a/plugins/webapi/spammer/plugin.go
+++ b/plugins/webapi/spammer/plugin.go
@@ -10,7 +10,7 @@ import (
 
 var transactionSpammer *spammer.Spammer
 
-var PLUGIN = node.NewPlugin("Spammer", node.Disabled, configure)
+var PLUGIN = node.NewPlugin("Spammer", node.Enabled, configure)
 
 func configure(plugin *node.Plugin) {
 	transactionSpammer = spammer.New(tangle.Instance, tangle.TipSelector)