diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index 3e36c388fe2358b881eb3207be5c260cc31d28a6..5b5acf9480ad1c23f73dfaf2c8eaee4eafc1fa74 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -15,8 +15,11 @@ jobs:
       - name: Build GoShimmer image
         run: docker build -t iotaledger/goshimmer .
 
-      - name: Pull drand image
-        run: docker pull angelocapossele/drand:latest
+      - name: Pull additional Docker images
+        run: |
+          docker pull angelocapossele/drand:latest
+          docker pull gaiaadm/pumba:latest
+          docker pull gaiadocker/iproute2:latest
         
       - name: Run integration tests
         run: docker-compose -f tools/integration-tests/tester/docker-compose.yml up --abort-on-container-exit --exit-code-from tester --build
@@ -35,4 +38,6 @@ jobs:
 
       - name: Clean up
         if: always()
-        run: docker-compose -f tools/integration-tests/tester/docker-compose.yml down
+        run: |
+          docker-compose -f tools/integration-tests/tester/docker-compose.yml down
+          docker rm -f $(docker ps -a -q -f ancestor=gaiadocker/iproute2)
\ No newline at end of file
diff --git a/dapps/valuetransfers/dapp.go b/dapps/valuetransfers/dapp.go
index 1fd95f1ee284a702cec70d6aa0064e0a93bb608c..ab27ed9d2f99eac856855213a01cb8d94b9d2a11 100644
--- a/dapps/valuetransfers/dapp.go
+++ b/dapps/valuetransfers/dapp.go
@@ -3,6 +3,7 @@ package valuetransfers
 import (
 	"time"
 
+	"github.com/iotaledger/goshimmer/plugins/database"
 	"github.com/iotaledger/hive.go/daemon"
 	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/logger"
@@ -14,7 +15,6 @@ import (
 	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
 	messageTangle "github.com/iotaledger/goshimmer/packages/binary/messagelayer/tangle"
-	"github.com/iotaledger/goshimmer/packages/database"
 	"github.com/iotaledger/goshimmer/packages/shutdown"
 	"github.com/iotaledger/goshimmer/packages/vote"
 	"github.com/iotaledger/goshimmer/plugins/messagelayer"
@@ -48,7 +48,7 @@ func configure(_ *node.Plugin) {
 	log.Debug("configuring ValueTransfers")
 
 	// create instances
-	Tangle = tangle.New(database.GetBadgerInstance())
+	Tangle = tangle.New(database.Store())
 
 	// subscribe to message-layer
 	messagelayer.Tangle.Events.MessageSolid.Attach(events.NewClosure(onReceiveMessageFromMessageLayer))
diff --git a/dapps/valuetransfers/packages/branchmanager/branchmanager.go b/dapps/valuetransfers/packages/branchmanager/branchmanager.go
index ecade28a4d82b467ecd8ab225788bfd4b1862602..5342c9efc98d8e35aea1cebcc02b5997c42af5c9 100644
--- a/dapps/valuetransfers/packages/branchmanager/branchmanager.go
+++ b/dapps/valuetransfers/packages/branchmanager/branchmanager.go
@@ -5,7 +5,7 @@ import (
 	"fmt"
 	"sort"
 
-	"github.com/dgraph-io/badger/v2"
+	"github.com/iotaledger/hive.go/kvstore"
 	"github.com/iotaledger/hive.go/marshalutil"
 	"github.com/iotaledger/hive.go/objectstorage"
 	"github.com/iotaledger/hive.go/types"
@@ -39,8 +39,8 @@ type BranchManager struct {
 }
 
 // New is the constructor of the BranchManager.
-func New(badgerInstance *badger.DB) (branchManager *BranchManager) {
-	osFactory := objectstorage.NewFactory(badgerInstance, storageprefix.ValueTransfers)
+func New(store kvstore.KVStore) (branchManager *BranchManager) {
+	osFactory := objectstorage.NewFactory(store, storageprefix.ValueTransfers)
 
 	branchManager = &BranchManager{
 		branchStorage:         osFactory.New(osBranch, osBranchFactory, osBranchOptions...),
diff --git a/dapps/valuetransfers/packages/branchmanager/branchmanager_test.go b/dapps/valuetransfers/packages/branchmanager/branchmanager_test.go
index f868df810ae246bf8613857709ea4474eeb53656..776e620199c2b3363702c7972f57c0622f476f68 100644
--- a/dapps/valuetransfers/packages/branchmanager/branchmanager_test.go
+++ b/dapps/valuetransfers/packages/branchmanager/branchmanager_test.go
@@ -5,11 +5,11 @@ import (
 	"testing"
 
 	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/testutil"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
 )
 
 func TestSomething(t *testing.T) {
-	branchManager := New(testutil.DB(t))
+	branchManager := New(mapdb.NewMapDB())
 
 	cachedBranch1, _ := branchManager.Fork(BranchID{2}, []BranchID{MasterBranchID}, []ConflictID{transaction.OutputID{4}})
 	defer cachedBranch1.Release()
diff --git a/dapps/valuetransfers/packages/tangle/tangle.go b/dapps/valuetransfers/packages/tangle/tangle.go
index 227944875678d75b4dc8281cdea343c2004cae14..ac495ff9f7ecf09fbf3d4321dd9331355684e4b0 100644
--- a/dapps/valuetransfers/packages/tangle/tangle.go
+++ b/dapps/valuetransfers/packages/tangle/tangle.go
@@ -7,8 +7,8 @@ import (
 	"math"
 	"time"
 
-	"github.com/dgraph-io/badger/v2"
 	"github.com/iotaledger/hive.go/async"
+	"github.com/iotaledger/hive.go/kvstore"
 	"github.com/iotaledger/hive.go/objectstorage"
 	"github.com/iotaledger/hive.go/types"
 
@@ -42,11 +42,11 @@ type Tangle struct {
 }
 
 // New is the constructor of a Tangle and creates a new Tangle object from the given details.
-func New(badgerInstance *badger.DB) (result *Tangle) {
-	osFactory := objectstorage.NewFactory(badgerInstance, storageprefix.ValueTransfers)
+func New(store kvstore.KVStore) (result *Tangle) {
+	osFactory := objectstorage.NewFactory(store, storageprefix.ValueTransfers)
 
 	result = &Tangle{
-		branchManager: branchmanager.New(badgerInstance),
+		branchManager: branchmanager.New(store),
 
 		payloadStorage:             osFactory.New(osPayload, osPayloadFactory, objectstorage.CacheTime(time.Second)),
 		payloadMetadataStorage:     osFactory.New(osPayloadMetadata, osPayloadMetadataFactory, objectstorage.CacheTime(time.Second)),
diff --git a/dapps/valuetransfers/packages/test/valuetransfers_test.go b/dapps/valuetransfers/packages/test/valuetransfers_test.go
index d321c931d23b6b07a3934674626e76f0ec11eccd..aed10000c612fad4a452d97a5ac6a155e3fcb9a0 100644
--- a/dapps/valuetransfers/packages/test/valuetransfers_test.go
+++ b/dapps/valuetransfers/packages/test/valuetransfers_test.go
@@ -5,6 +5,7 @@ import (
 	"time"
 
 	"github.com/iotaledger/hive.go/crypto/ed25519"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
 	"github.com/stretchr/testify/assert"
 
 	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address"
@@ -12,12 +13,11 @@ import (
 	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/payload"
 	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/tangle"
 	"github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction"
-	"github.com/iotaledger/goshimmer/packages/binary/testutil"
 )
 
 func TestTangle_ValueTransfer(t *testing.T) {
 	// initialize tangle + ledgerstate
-	valueTangle := tangle.New(testutil.DB(t))
+	valueTangle := tangle.New(mapdb.NewMapDB())
 	if err := valueTangle.Prune(); err != nil {
 		t.Error(err)
 
diff --git a/go.mod b/go.mod
index 767664d5d7a401d71b3aab0ed8a56033af383b52..8485376324ad4c40826bad1928e1249caa0cc371 100644
--- a/go.mod
+++ b/go.mod
@@ -11,7 +11,7 @@ require (
 	github.com/gobuffalo/packr/v2 v2.7.1
 	github.com/golang/protobuf v1.3.5
 	github.com/gorilla/websocket v1.4.1
-	github.com/iotaledger/hive.go v0.0.0-20200513180357-f0ac8c45b754
+	github.com/iotaledger/hive.go v0.0.0-20200525142347-543f24c486b8
 	github.com/iotaledger/iota.go v1.0.0-beta.14
 	github.com/labstack/echo v3.3.10+incompatible
 	github.com/labstack/gommon v0.3.0
diff --git a/go.sum b/go.sum
index bc4b41436c3c6873e7f1d56641cb4f465c259ef2..77da261f6c05159eaec85f7f2946dcbcc0e3e97a 100644
--- a/go.sum
+++ b/go.sum
@@ -139,8 +139,8 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/iotaledger/hive.go v0.0.0-20200513180357-f0ac8c45b754 h1:UCyAisLvAuKIWf2bMz+iYYgjGdHS7H4W2wMTpWg9yl8=
-github.com/iotaledger/hive.go v0.0.0-20200513180357-f0ac8c45b754/go.mod h1:HgYsLMzyQV+eaiUrxa1c7qvH9Jwi2ncycqtlw+Lczhs=
+github.com/iotaledger/hive.go v0.0.0-20200525142347-543f24c486b8 h1:QRVEyknRx6lCrHtk6BbBLcs16nQ8Ozbe4OSxV8XYAr8=
+github.com/iotaledger/hive.go v0.0.0-20200525142347-543f24c486b8/go.mod h1:zwZhaE4ZeglpTrbmbwdnVPMI5XdRu2RmByi3Qn0ztmU=
 github.com/iotaledger/iota.go v1.0.0-beta.9/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
 github.com/iotaledger/iota.go v1.0.0-beta.14 h1:Oeb28MfBuJEeXcGrLhTCJFtbsnc8y1u7xidsAmiOD5A=
 github.com/iotaledger/iota.go v1.0.0-beta.14/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
@@ -329,6 +329,8 @@ go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYr
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
+go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 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=
@@ -415,6 +417,7 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200427175716-29b57079015a h1:08u6b1caTT9MQY4wSbmsd4Ulm6DmgNYnbImBuZjGJow=
 golang.org/x/sys v0.0.0-20200427175716-29b57079015a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/packages/binary/messagelayer/messagefactory/messagefactory.go b/packages/binary/messagelayer/messagefactory/messagefactory.go
index 331bacb25fcf56d3fe98205833106d55c2d8714e..7f06f292a8f7b46356287f34e1c6dfc99c5a142b 100644
--- a/packages/binary/messagelayer/messagefactory/messagefactory.go
+++ b/packages/binary/messagelayer/messagefactory/messagefactory.go
@@ -4,25 +4,26 @@ import (
 	"fmt"
 	"time"
 
-	"github.com/dgraph-io/badger/v2"
-	"github.com/iotaledger/hive.go/identity"
-
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/tipselector"
+	"github.com/iotaledger/hive.go/identity"
+	"github.com/iotaledger/hive.go/kvstore"
 )
 
+const storeSequenceInterval = 100
+
 // MessageFactory acts as a factory to create new messages.
 type MessageFactory struct {
 	Events        *Events
-	sequence      *badger.Sequence
+	sequence      *kvstore.Sequence
 	localIdentity *identity.LocalIdentity
 	tipSelector   *tipselector.TipSelector
 }
 
 // New creates a new message factory.
-func New(db *badger.DB, localIdentity *identity.LocalIdentity, tipSelector *tipselector.TipSelector, sequenceKey []byte) *MessageFactory {
-	sequence, err := db.GetSequence(sequenceKey, 100)
+func New(store kvstore.KVStore, localIdentity *identity.LocalIdentity, tipSelector *tipselector.TipSelector, sequenceKey []byte) *MessageFactory {
+	sequence, err := kvstore.NewSequence(store, sequenceKey, storeSequenceInterval)
 	if err != nil {
 		panic(fmt.Sprintf("could not create message sequence number: %v", err))
 	}
diff --git a/packages/binary/messagelayer/messagefactory/messagefactory_test.go b/packages/binary/messagelayer/messagefactory/messagefactory_test.go
index 5c8466cceefd5c60196d49a400e445dc3acecae4..f54aecb4c06bc3d3b8f520b4dc3d2098be2366cb 100644
--- a/packages/binary/messagelayer/messagefactory/messagefactory_test.go
+++ b/packages/binary/messagelayer/messagefactory/messagefactory_test.go
@@ -2,8 +2,6 @@ package messagefactory
 
 import (
 	"encoding"
-	"io/ioutil"
-	"os"
 	"sync"
 	"sync/atomic"
 	"testing"
@@ -12,13 +10,11 @@ import (
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/tipselector"
-	"github.com/iotaledger/goshimmer/packages/database"
-	"github.com/iotaledger/goshimmer/plugins/config"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
 
 	"github.com/iotaledger/hive.go/events"
 	"github.com/iotaledger/hive.go/identity"
 	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
 )
 
 const (
@@ -27,22 +23,12 @@ const (
 )
 
 func TestMessageFactory_BuildMessage(t *testing.T) {
-	// Set up DB for testing
-	dir, err := ioutil.TempDir("", t.Name())
-	require.NoError(t, err)
-	defer os.Remove(dir)
-	// use the tempdir for the database
-	config.Node.Set(database.CFG_DIRECTORY, dir)
-	db := database.GetBadgerInstance()
-
-	localIdentity := identity.GenerateLocalIdentity()
-	tipSelector := tipselector.New()
+	msgFactory := New(mapdb.NewMapDB(), identity.GenerateLocalIdentity(), tipselector.New(), []byte(sequenceKey))
+	defer msgFactory.Shutdown()
 
 	// keep track of sequence numbers
 	sequenceNumbers := sync.Map{}
 
-	msgFactory := New(db, localIdentity, tipSelector, []byte(sequenceKey))
-
 	// attach to event and count
 	countEvents := uint64(0)
 	msgFactory.Events.MessageConstructed.Attach(events.NewClosure(func(msg *message.Message) {
@@ -116,8 +102,6 @@ func TestMessageFactory_BuildMessage(t *testing.T) {
 	})
 	assert.EqualValues(t, totalMessages-1, max)
 	assert.EqualValues(t, totalMessages, countSequence)
-
-	_ = db.Close()
 }
 
 type MockPayload struct {
diff --git a/packages/binary/messagelayer/tangle/tangle.go b/packages/binary/messagelayer/tangle/tangle.go
index 702963c2239a04fca662204426fba4cf4ddef2d2..9a5f02151a769ded0328f7fe9cfc8da269c76261 100644
--- a/packages/binary/messagelayer/tangle/tangle.go
+++ b/packages/binary/messagelayer/tangle/tangle.go
@@ -4,7 +4,7 @@ import (
 	"container/list"
 	"time"
 
-	"github.com/dgraph-io/badger/v2"
+	"github.com/iotaledger/hive.go/kvstore"
 	"github.com/iotaledger/hive.go/types"
 
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
@@ -50,8 +50,8 @@ func missingMessageFactory(key []byte) (objectstorage.StorableObject, int, error
 }
 
 // New creates a new Tangle.
-func New(badgerInstance *badger.DB) (result *Tangle) {
-	osFactory := objectstorage.NewFactory(badgerInstance, storageprefix.MessageLayer)
+func New(store kvstore.KVStore) (result *Tangle) {
+	osFactory := objectstorage.NewFactory(store, storageprefix.MessageLayer)
 
 	result = &Tangle{
 		shutdown:               make(chan struct{}),
diff --git a/packages/binary/messagelayer/tangle/tangle_test.go b/packages/binary/messagelayer/tangle/tangle_test.go
index 98eb4ffdcb4442b9fae7c648f0e0d418c932d14a..51bcb08378a3949873721bf352ea8792e8b59404 100644
--- a/packages/binary/messagelayer/tangle/tangle_test.go
+++ b/packages/binary/messagelayer/tangle/tangle_test.go
@@ -2,29 +2,18 @@ package tangle
 
 import (
 	"fmt"
-	"io/ioutil"
-	"os"
 	"testing"
 	"time"
 
-	"github.com/iotaledger/hive.go/events"
-	"github.com/iotaledger/hive.go/identity"
-	"github.com/stretchr/testify/require"
-
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
-	"github.com/iotaledger/goshimmer/packages/database"
-	"github.com/iotaledger/goshimmer/plugins/config"
+	"github.com/iotaledger/hive.go/events"
+	"github.com/iotaledger/hive.go/identity"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
 )
 
 func BenchmarkTangle_AttachMessage(b *testing.B) {
-	dir, err := ioutil.TempDir("", b.Name())
-	require.NoError(b, err)
-	defer os.Remove(dir)
-	// use the tempdir for the database
-	config.Node.Set(database.CFG_DIRECTORY, dir)
-
-	tangle := New(database.GetBadgerInstance())
+	tangle := New(mapdb.NewMapDB())
 	if err := tangle.Prune(); err != nil {
 		b.Error(err)
 
@@ -49,13 +38,7 @@ func BenchmarkTangle_AttachMessage(b *testing.B) {
 }
 
 func TestTangle_AttachMessage(t *testing.T) {
-	dir, err := ioutil.TempDir("", t.Name())
-	require.NoError(t, err)
-	defer os.Remove(dir)
-	// use the tempdir for the database
-	config.Node.Set(database.CFG_DIRECTORY, dir)
-
-	messageTangle := New(database.GetBadgerInstance())
+	messageTangle := New(mapdb.NewMapDB())
 	if err := messageTangle.Prune(); err != nil {
 		t.Error(err)
 
diff --git a/packages/binary/messagelayer/test/message_test.go b/packages/binary/messagelayer/test/message_test.go
index 70684aa307f921b7223413296b5e06710aba2b66..fca5ec70b56df7d2b3457d959ddc08308c33febf 100644
--- a/packages/binary/messagelayer/test/message_test.go
+++ b/packages/binary/messagelayer/test/message_test.go
@@ -5,11 +5,15 @@ import (
 	"testing"
 	"time"
 
+	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/messagefactory"
+	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/tipselector"
+	"github.com/iotaledger/goshimmer/plugins/messagelayer"
+	"github.com/iotaledger/hive.go/identity"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
 	"github.com/stretchr/testify/assert"
 
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/message"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
-	"github.com/iotaledger/goshimmer/packages/binary/testutil"
 )
 
 func TestMessage_StorableObjectFromKey(t *testing.T) {
@@ -28,7 +32,10 @@ func TestMessage_StorableObjectFromKey(t *testing.T) {
 }
 
 func TestMessage_MarshalUnmarshal(t *testing.T) {
-	testMessage := testutil.MessageFactory(t).IssuePayload(payload.NewData([]byte("sth")))
+	msgFactory := messagefactory.New(mapdb.NewMapDB(), identity.GenerateLocalIdentity(), tipselector.New(), []byte(messagelayer.DBSequenceNumber))
+	defer msgFactory.Shutdown()
+
+	testMessage := msgFactory.IssuePayload(payload.NewData([]byte("sth")))
 	assert.Equal(t, true, testMessage.VerifySignature())
 
 	fmt.Print(testMessage)
diff --git a/packages/binary/testutil/db.go b/packages/binary/testutil/db.go
deleted file mode 100644
index 554512a166a0ba332163debe51fb1fd14829ec30..0000000000000000000000000000000000000000
--- a/packages/binary/testutil/db.go
+++ /dev/null
@@ -1,36 +0,0 @@
-package testutil
-
-import (
-	"io/ioutil"
-	"os"
-	"testing"
-
-	"github.com/dgraph-io/badger/v2"
-	"github.com/stretchr/testify/require"
-
-	"github.com/iotaledger/goshimmer/packages/database"
-	"github.com/iotaledger/goshimmer/plugins/config"
-)
-
-var dbInstance *badger.DB
-
-func DB(t *testing.T) *badger.DB {
-	if dbInstance == nil {
-		// Set up DB for testing
-		dir, err := ioutil.TempDir("", t.Name())
-		require.NoError(t, err)
-
-		t.Cleanup(func() {
-			os.Remove(dir)
-
-			dbInstance = nil
-		})
-
-		// use the tempdir for the database
-		config.Node.Set(database.CFG_DIRECTORY, dir)
-
-		dbInstance = database.GetBadgerInstance()
-	}
-
-	return dbInstance
-}
diff --git a/packages/binary/testutil/messagefactory.go b/packages/binary/testutil/messagefactory.go
deleted file mode 100644
index 093ee86934a36ed3a2264e82dc505e4d42c03e9a..0000000000000000000000000000000000000000
--- a/packages/binary/testutil/messagefactory.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package testutil
-
-import (
-	"testing"
-
-	"github.com/iotaledger/hive.go/identity"
-
-	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/messagefactory"
-	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/tipselector"
-)
-
-const sequenceKey = "seq"
-
-var messageFactoryInstance *messagefactory.MessageFactory
-
-func MessageFactory(t *testing.T) *messagefactory.MessageFactory {
-	if messageFactoryInstance == nil {
-		localIdentity := identity.GenerateLocalIdentity()
-		tipSelector := tipselector.New()
-
-		t.Cleanup(func() {
-			messageFactoryInstance = nil
-		})
-
-		messageFactoryInstance = messagefactory.New(DB(t), localIdentity, tipSelector, []byte(sequenceKey))
-	}
-
-	return messageFactoryInstance
-}
diff --git a/packages/database/badgerdb.go b/packages/database/badgerdb.go
new file mode 100644
index 0000000000000000000000000000000000000000..4246add326298926822ae81a1a17c713b8da3f02
--- /dev/null
+++ b/packages/database/badgerdb.go
@@ -0,0 +1,98 @@
+package database
+
+import (
+	"fmt"
+	"os"
+	"runtime"
+
+	"github.com/dgraph-io/badger/v2"
+	"github.com/dgraph-io/badger/v2/options"
+	"github.com/iotaledger/hive.go/kvstore"
+	badgerstore "github.com/iotaledger/hive.go/kvstore/badger"
+)
+
+const valueLogGCDiscardRatio = 0.1
+
+type badgerDB struct {
+	*badger.DB
+}
+
+// NewDB returns a new persisting DB object.
+func NewDB(dirname string) (DB, error) {
+	// assure that the directory exists
+	err := createDir(dirname)
+	if err != nil {
+		return nil, fmt.Errorf("could not create DB directory: %w", err)
+	}
+
+	opts := badger.DefaultOptions(dirname)
+
+	opts.Logger = nil
+	opts.SyncWrites = false
+	opts.TableLoadingMode = options.MemoryMap
+	opts.ValueLogLoadingMode = options.MemoryMap
+	opts.CompactL0OnClose = false
+	opts.KeepL0InMemory = false
+	opts.VerifyValueChecksum = false
+	opts.ZSTDCompressionLevel = 1
+	opts.Compression = options.None
+	opts.MaxCacheSize = 50000000
+	opts.EventLogging = false
+
+	if runtime.GOOS == "windows" {
+		opts = opts.WithTruncate(true)
+	}
+
+	db, err := badger.Open(opts)
+	if err != nil {
+		return nil, fmt.Errorf("could not open DB: %w", err)
+	}
+
+	return &badgerDB{DB: db}, nil
+}
+
+func (db *badgerDB) NewStore() kvstore.KVStore {
+	return badgerstore.New(db.DB)
+}
+
+// Close closes a DB. It's crucial to call it to ensure all the pending updates make their way to disk.
+func (db *badgerDB) Close() error {
+	return db.DB.Close()
+}
+
+func (db *badgerDB) RequiresGC() bool {
+	return true
+}
+
+func (db *badgerDB) GC() error {
+	err := db.RunValueLogGC(valueLogGCDiscardRatio)
+	if err != nil {
+		return err
+	}
+	// trigger the go garbage collector to release the used memory
+	runtime.GC()
+	return nil
+}
+
+// Returns whether the given file or directory exists.
+func exists(path string) (bool, error) {
+	_, err := os.Stat(path)
+	if os.IsNotExist(err) {
+		return false, nil
+	}
+	if err != nil {
+		return false, err
+	}
+	return true, err
+}
+
+func createDir(dirname string) error {
+	exists, err := exists(dirname)
+	if err != nil {
+		return err
+	}
+	if !exists {
+		return os.Mkdir(dirname, 0700)
+	}
+	return nil
+}
diff --git a/packages/database/database.go b/packages/database/database.go
index 809ef4595fcc6f75b1ca82bc72a22e7d3b5b81f5..200cc67cfb75cddb22e574c79672948225f07cd3 100644
--- a/packages/database/database.go
+++ b/packages/database/database.go
@@ -1,93 +1,18 @@
-// Wrapper for hive.go/database package. Only use this instead of the hive.go package.
 package database
 
 import (
-	"io/ioutil"
-	"os"
-	"runtime"
-	"sync"
-
-	"github.com/dgraph-io/badger/v2"
-	"github.com/dgraph-io/badger/v2/options"
-	"github.com/iotaledger/hive.go/database"
-	"github.com/iotaledger/hive.go/logger"
-
-	"github.com/iotaledger/goshimmer/plugins/config"
-)
-
-var (
-	instance       *badger.DB
-	once           sync.Once
-	ErrKeyNotFound = database.ErrKeyNotFound
+	"github.com/iotaledger/hive.go/kvstore"
 )
 
-type (
-	Database     = database.Database
-	Entry        = database.Entry
-	KeyOnlyEntry = database.KeyOnlyEntry
-	KeyPrefix    = database.KeyPrefix
-	Key          = database.Key
-	Value        = database.Value
-)
-
-func Get(dbPrefix byte, optionalBadger ...*badger.DB) (Database, error) {
-	return database.Get(dbPrefix, optionalBadger...)
-}
-
-func GetBadgerInstance() *badger.DB {
-	once.Do(func() {
-		dbDir := config.Node.GetString(CFG_DIRECTORY)
-
-		var dbDirClear bool
-		// check whether the database is new, by checking whether any file exists within
-		// the database directory
-		fileInfos, err := ioutil.ReadDir(dbDir)
-		if err != nil {
-			// panic on other errors, for example permission related
-			if !os.IsNotExist(err) {
-				panic(err)
-			}
-			dbDirClear = true
-		}
-		if len(fileInfos) == 0 {
-			dbDirClear = true
-		}
-
-		opts := badger.DefaultOptions(dbDir)
-		opts.Logger = nil
-		if runtime.GOOS == "windows" {
-			opts = opts.WithTruncate(true)
-		}
-
-		opts.SyncWrites = false
-		opts.TableLoadingMode = options.MemoryMap
-		opts.ValueLogLoadingMode = options.MemoryMap
-		opts.CompactL0OnClose = false
-		opts.KeepL0InMemory = false
-		opts.VerifyValueChecksum = false
-		opts.ZSTDCompressionLevel = 1
-		opts.Compression = options.None
-		opts.MaxCacheSize = 50000000
-		opts.EventLogging = false
-
-		db, err := database.CreateDB(dbDir, opts)
-		if err != nil {
-			// errors should cause a panic to avoid singleton deadlocks
-			panic(err)
-		}
-		instance = db
-
-		// up on the first caller, check whether the version of the database is compatible
-		checkDatabaseVersion(dbDirClear)
-	})
-	return instance
-}
-
-func CleanupBadgerInstance(log *logger.Logger) {
-	db := GetBadgerInstance()
-	log.Info("Running Badger database garbage collection")
-	var err error
-	for err == nil {
-		err = db.RunValueLogGC(0.7)
-	}
+// DB represents a database abstraction.
+type DB interface {
+	// NewStore creates a new KVStore backed by the database.
+	NewStore() kvstore.KVStore
+	// Close closes a DB.
+	Close() error
+
+	// RequiresGC returns whether the database requires a call of GC() to clean deleted items.
+	RequiresGC() bool
+	// GC runs the garbage collection to clean deleted database items.
+	GC() error
 }
diff --git a/packages/database/memdb.go b/packages/database/memdb.go
new file mode 100644
index 0000000000000000000000000000000000000000..2ff8d979774021e9a61584f3fea326858437e8d2
--- /dev/null
+++ b/packages/database/memdb.go
@@ -0,0 +1,32 @@
+package database
+
+import (
+	"github.com/iotaledger/hive.go/kvstore"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
+)
+
+type memDB struct {
+	*mapdb.MapDB
+}
+
+// NewMemDB returns a new in-memory (not persisted) DB object.
+func NewMemDB() (DB, error) {
+	return &memDB{MapDB: mapdb.NewMapDB()}, nil
+}
+
+func (db *memDB) NewStore() kvstore.KVStore {
+	return db.MapDB
+}
+
+func (db *memDB) Close() error {
+	db.MapDB = nil
+	return nil
+}
+
+func (db *memDB) RequiresGC() bool {
+	return false
+}
+
+func (db *memDB) GC() error {
+	return nil
+}
diff --git a/packages/database/parameters.go b/packages/database/parameters.go
deleted file mode 100644
index 8d647e65a59ea193f461fa9b6a5292e24f1435aa..0000000000000000000000000000000000000000
--- a/packages/database/parameters.go
+++ /dev/null
@@ -1,13 +0,0 @@
-package database
-
-import (
-	flag "github.com/spf13/pflag"
-)
-
-const (
-	CFG_DIRECTORY = "database.directory"
-)
-
-func init() {
-	flag.String(CFG_DIRECTORY, "mainnetdb", "path to the database folder")
-}
diff --git a/packages/database/prefixes.go b/packages/database/prefix/prefix.go
similarity index 91%
rename from packages/database/prefixes.go
rename to packages/database/prefix/prefix.go
index c9dc488d40b5fbe557467e1be275e6aa56052aec..005c6dfa31761c7edcd72199e3ff0d13f0d28691 100644
--- a/packages/database/prefixes.go
+++ b/packages/database/prefix/prefix.go
@@ -1,4 +1,4 @@
-package database
+package prefix
 
 const (
 	DBPrefixApprovers byte = iota
diff --git a/packages/database/versioning.go b/packages/database/versioning.go
deleted file mode 100644
index 5150bc624dcd1bbdea419dffab416c7105fd562c..0000000000000000000000000000000000000000
--- a/packages/database/versioning.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package database
-
-import (
-	"errors"
-	"fmt"
-)
-
-const (
-	// DBVersion defines the version of the database schema this version of GoShimmer supports.
-	// everytime there's a breaking change regarding the stored data, this version flag should be adjusted.
-	DBVersion = 2
-)
-
-var (
-	ErrDBVersionIncompatible = errors.New("database version is not compatible. please delete your database folder and restart")
-	// the key under which the database is stored
-	dbVersionKey = []byte{0}
-)
-
-// checks whether the database is compatible with the current schema version.
-// also automatically sets the version if the database is new.
-func checkDatabaseVersion(dbIsNew bool) {
-	dbInstance, err := Get(DBPrefixDatabaseVersion, instance)
-	if err != nil {
-		panic(err)
-	}
-
-	if dbIsNew {
-		// store db version for the first time in the new database
-		if err = dbInstance.Set(Entry{Key: dbVersionKey, Value: []byte{DBVersion}}); err != nil {
-			panic(fmt.Sprintf("unable to persist db version number: %s", err.Error()))
-		}
-		return
-	}
-
-	// db version must be available
-	entry, err := dbInstance.Get(dbVersionKey)
-	if err != nil {
-		if err == ErrKeyNotFound {
-			panic(err)
-		}
-		panic(fmt.Errorf("%w: no database version was persisted", ErrDBVersionIncompatible))
-	}
-	if entry.Value[0] != DBVersion {
-		panic(fmt.Errorf("%w: supported version: %d, version of database: %d", ErrDBVersionIncompatible, DBVersion, entry.Value[0]))
-	}
-}
diff --git a/packages/gossip/manager_test.go b/packages/gossip/manager_test.go
index 399fa1759670c9b14c84ce65b304de1334be5888..7dcc2d9e6070a5c9fc27ad21a24f09e084ed678d 100644
--- a/packages/gossip/manager_test.go
+++ b/packages/gossip/manager_test.go
@@ -12,8 +12,8 @@ import (
 	"github.com/iotaledger/goshimmer/packages/gossip/server"
 	"github.com/iotaledger/hive.go/autopeering/peer"
 	"github.com/iotaledger/hive.go/autopeering/peer/service"
-	"github.com/iotaledger/hive.go/database/mapdb"
 	"github.com/iotaledger/hive.go/events"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
 	"github.com/iotaledger/hive.go/logger"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
diff --git a/packages/gossip/server/server_test.go b/packages/gossip/server/server_test.go
index 5c62ef5ed25f72618b4fc87599b6321422768e62..7fa8defa98cc42d7e947c7fa27abbecd3090e828 100644
--- a/packages/gossip/server/server_test.go
+++ b/packages/gossip/server/server_test.go
@@ -8,7 +8,7 @@ import (
 
 	"github.com/iotaledger/hive.go/autopeering/peer"
 	"github.com/iotaledger/hive.go/autopeering/peer/service"
-	"github.com/iotaledger/hive.go/database/mapdb"
+	"github.com/iotaledger/hive.go/kvstore/mapdb"
 	"github.com/iotaledger/hive.go/logger"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
diff --git a/plugins/autopeering/autopeering.go b/plugins/autopeering/autopeering.go
index 101b53dc591a1205a40db67b3c43bc0add88c477..d9f60b6d878178c95941fb14421f7acef4399c15 100644
--- a/plugins/autopeering/autopeering.go
+++ b/plugins/autopeering/autopeering.go
@@ -159,8 +159,7 @@ func start(shutdownSignal <-chan struct{}) {
 	Discovery().Close()
 	Selection().Close()
 
-	// persists potential peering seeds for the next start
-	log.Infof("%d peers persisted as seeds", lPeer.Database().PersistSeeds())
+	lPeer.Database().Close()
 }
 
 func hash32(b []byte) uint32 {
diff --git a/plugins/autopeering/local/local.go b/plugins/autopeering/local/local.go
index c16f755ed5802a2bbbf352bd47aa0b39443c3f76..040dcc0fbaef5e393b3b603611ca097c09249cdf 100644
--- a/plugins/autopeering/local/local.go
+++ b/plugins/autopeering/local/local.go
@@ -7,8 +7,9 @@ import (
 	"strings"
 	"sync"
 
-	"github.com/iotaledger/goshimmer/packages/database"
+	"github.com/iotaledger/goshimmer/packages/database/prefix"
 	"github.com/iotaledger/goshimmer/plugins/config"
+	"github.com/iotaledger/goshimmer/plugins/database"
 	"github.com/iotaledger/hive.go/autopeering/peer"
 	"github.com/iotaledger/hive.go/autopeering/peer/service"
 	"github.com/iotaledger/hive.go/logger"
@@ -57,11 +58,7 @@ func configureLocal() *peer.Local {
 		}
 		seed = append(seed, bytes)
 	}
-	badgerDB, err := database.Get(database.DBPrefixAutoPeering, database.GetBadgerInstance())
-	if err != nil {
-		log.Fatalf("Error loading DB: %s", err)
-	}
-	peerDB, err := peer.NewDB(badgerDB)
+	peerDB, err := peer.NewDB(database.StoreRealm([]byte{prefix.DBPrefixAutoPeering}))
 	if err != nil {
 		log.Fatalf("Error creating peer DB: %s", err)
 	}
diff --git a/plugins/database/parameters.go b/plugins/database/parameters.go
new file mode 100644
index 0000000000000000000000000000000000000000..c860dd8b3a2cda995b9682ce4f1143c6d84d21d6
--- /dev/null
+++ b/plugins/database/parameters.go
@@ -0,0 +1,17 @@
+package database
+
+import (
+	flag "github.com/spf13/pflag"
+)
+
+const (
+	// CfgDatabaseDir defines the directory of the database.
+	CfgDatabaseDir = "database.directory"
+	// CfgDatabaseInMemory defines whether to use an in-memory database.
+	CfgDatabaseInMemory = "database.inMemory"
+)
+
+func init() {
+	flag.String(CfgDatabaseDir, "mainnetdb", "path to the database folder")
+	flag.Bool(CfgDatabaseInMemory, false, "whether the database is only kept in memory and not persisted")
+}
diff --git a/plugins/database/plugin.go b/plugins/database/plugin.go
index 6a006b7bc0798daab622f890f60e8fc6596366a2..99333abfe3b079adef2ac60109b9310457dcdbd9 100644
--- a/plugins/database/plugin.go
+++ b/plugins/database/plugin.go
@@ -2,11 +2,16 @@
 package database
 
 import (
+	"errors"
+	"sync"
 	"time"
 
 	"github.com/iotaledger/goshimmer/packages/database"
+	"github.com/iotaledger/goshimmer/packages/database/prefix"
 	"github.com/iotaledger/goshimmer/packages/shutdown"
+	"github.com/iotaledger/goshimmer/plugins/config"
 	"github.com/iotaledger/hive.go/daemon"
+	"github.com/iotaledger/hive.go/kvstore"
 	"github.com/iotaledger/hive.go/logger"
 	"github.com/iotaledger/hive.go/node"
 	"github.com/iotaledger/hive.go/timeutil"
@@ -19,25 +24,82 @@ var (
 	// Plugin is the plugin instance of the database plugin.
 	Plugin = node.NewPlugin(PluginName, node.Enabled, configure, run)
 	log    *logger.Logger
+
+	db        database.DB
+	store     kvstore.KVStore
+	storeOnce sync.Once
 )
 
-func configure(_ *node.Plugin) {
+// Store returns the KVStore instance.
+func Store() kvstore.KVStore {
+	storeOnce.Do(createStore)
+	return store
+}
+
+// StoreRealm is a factory method for a different realm backed by the KVStore instance.
+func StoreRealm(realm kvstore.Realm) kvstore.KVStore {
+	return Store().WithRealm(realm)
+}
+
+func createStore() {
 	log = logger.NewLogger(PluginName)
 
-	_ = database.GetBadgerInstance()
+	var err error
+	if config.Node.GetBool(CfgDatabaseInMemory) {
+		db, err = database.NewMemDB()
+	} else {
+		dbDir := config.Node.GetString(CfgDatabaseDir)
+		db, err = database.NewDB(dbDir)
+	}
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	store = db.NewStore()
+}
+
+func configure(_ *node.Plugin) {
+	// assure that the store is initialized
+	store := Store()
+
+	err := checkDatabaseVersion(store.WithRealm([]byte{prefix.DBPrefixDatabaseVersion}))
+	if errors.Is(err, ErrDBVersionIncompatible) {
+		log.Panicf("The database scheme was updated. Please delete the database folder.\n%s", err)
+	}
+	if err != nil {
+		log.Panicf("Failed to check database version: %s", err)
+	}
+
+	// we open the database in the configure, so we must also make sure it's closed here
+	err = daemon.BackgroundWorker(PluginName, closeDB, shutdown.PriorityDatabase)
+	if err != nil {
+		log.Panicf("Failed to start as daemon: %s", err)
+	}
 }
 
 func run(_ *node.Plugin) {
-	daemon.BackgroundWorker(PluginName+"_GC", func(shutdownSignal <-chan struct{}) {
-		timeutil.Ticker(func() {
-			database.CleanupBadgerInstance(log)
-		}, 5*time.Minute, shutdownSignal)
-	}, shutdown.PriorityBadgerGarbageCollection)
-
-	daemon.BackgroundWorker(PluginName, func(shutdownSignal <-chan struct{}) {
-		<-shutdownSignal
-		log.Infof("Syncing database to disk...")
-		database.GetBadgerInstance().Close()
-		log.Infof("Syncing database to disk... done")
-	}, shutdown.PriorityDatabase)
+	if err := daemon.BackgroundWorker(PluginName+"[GC]", runGC, shutdown.PriorityBadgerGarbageCollection); err != nil {
+		log.Errorf("Failed to start as daemon: %s", err)
+	}
+}
+
+func closeDB(shutdownSignal <-chan struct{}) {
+	<-shutdownSignal
+	log.Infof("Syncing database to disk...")
+	if err := db.Close(); err != nil {
+		log.Errorf("Failed to flush the database: %s", err)
+	}
+	log.Infof("Syncing database to disk... done")
+}
+
+func runGC(shutdownSignal <-chan struct{}) {
+	if !db.RequiresGC() {
+		return
+	}
+	// run the garbage collection with the given interval
+	timeutil.Ticker(func() {
+		if err := db.GC(); err != nil {
+			log.Warnf("Garbage collection failed: %s", err)
+		}
+	}, 5*time.Minute, shutdownSignal)
 }
diff --git a/plugins/database/versioning.go b/plugins/database/versioning.go
new file mode 100644
index 0000000000000000000000000000000000000000..0ee20f7b3a8f1de65889fe8c6353687606d98dbc
--- /dev/null
+++ b/plugins/database/versioning.go
@@ -0,0 +1,41 @@
+package database
+
+import (
+	"errors"
+	"fmt"
+
+	"github.com/iotaledger/hive.go/kvstore"
+)
+
+const (
+	// DBVersion defines the version of the database schema this version of GoShimmer supports.
+	// Every time there's a breaking change regarding the stored data, this version flag should be adjusted.
+	DBVersion = 2
+)
+
+var (
+	// ErrDBVersionIncompatible is returned when the database has an unexpected version.
+	ErrDBVersionIncompatible = errors.New("database version is not compatible. please delete your database folder and restart")
+	// the key under which the database is stored
+	dbVersionKey = []byte{0}
+)
+
+// checks whether the database is compatible with the current schema version.
+// also automatically sets the version if the database is new.
+func checkDatabaseVersion(store kvstore.KVStore) error {
+	entry, err := store.Get(dbVersionKey)
+	if err == kvstore.ErrKeyNotFound {
+		// set the version in an empty DB
+		return store.Set(dbVersionKey, []byte{DBVersion})
+	}
+	if err != nil {
+		return err
+	}
+	if len(entry) == 0 {
+		return fmt.Errorf("%w: no database version was persisted", ErrDBVersionIncompatible)
+	}
+	if entry[0] != DBVersion {
+		return fmt.Errorf("%w: supported version: %d, version of database: %d", ErrDBVersionIncompatible, DBVersion, entry[0])
+	}
+	return nil
+}
diff --git a/plugins/messagelayer/plugin.go b/plugins/messagelayer/plugin.go
index 9541eff4a806e2442095e21880b681042bcddb5f..e5088a8679debcd80f68d182752d2083dc6b276a 100644
--- a/plugins/messagelayer/plugin.go
+++ b/plugins/messagelayer/plugin.go
@@ -7,9 +7,9 @@ import (
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/messagerequester"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/tangle"
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/tipselector"
-	"github.com/iotaledger/goshimmer/packages/database"
 	"github.com/iotaledger/goshimmer/packages/shutdown"
 	"github.com/iotaledger/goshimmer/plugins/autopeering/local"
+	"github.com/iotaledger/goshimmer/plugins/database"
 	"github.com/iotaledger/hive.go/autopeering/peer"
 	"github.com/iotaledger/hive.go/daemon"
 	"github.com/iotaledger/hive.go/events"
@@ -35,15 +35,16 @@ var (
 
 func configure(*node.Plugin) {
 	log = logger.NewLogger(PluginName)
+	store := database.Store()
 
 	// create instances
 	MessageParser = messageparser.New()
 	MessageRequester = messagerequester.New()
 	TipSelector = tipselector.New()
-	Tangle = tangle.New(database.GetBadgerInstance())
+	Tangle = tangle.New(store)
 
 	// Setup MessageFactory (behavior + logging))
-	MessageFactory = messagefactory.New(database.GetBadgerInstance(), local.GetInstance().LocalIdentity(), TipSelector, []byte(DBSequenceNumber))
+	MessageFactory = messagefactory.New(database.Store(), local.GetInstance().LocalIdentity(), TipSelector, []byte(DBSequenceNumber))
 	MessageFactory.Events.MessageConstructed.Attach(events.NewClosure(Tangle.AttachMessage))
 	MessageFactory.Events.Error.Attach(events.NewClosure(func(err error) {
 		log.Errorf("internal error in message factory: %v", err)
diff --git a/tools/integration-tests/runTests.sh b/tools/integration-tests/runTests.sh
index bb0674097775df377d9b9aa36ef94c03870a5983..1cf8b79f481e4cb2fea3211925e60cd6d0a10602 100755
--- a/tools/integration-tests/runTests.sh
+++ b/tools/integration-tests/runTests.sh
@@ -3,8 +3,10 @@
 echo "Build GoShimmer image"
 docker build -t iotaledger/goshimmer ../../.
 
-echo "Pulling drand image"
+echo "Pull additional Docker images"
 docker pull angelocapossele/drand:latest
+docker pull gaiaadm/pumba:latest
+docker pull gaiadocker/iproute2:latest
 
 echo "Run integration tests"
 docker-compose -f tester/docker-compose.yml up --abort-on-container-exit --exit-code-from tester --build
@@ -13,4 +15,5 @@ echo "Create logs from containers in network"
 docker logs tester &> logs/tester.log
 
 echo "Clean up"
-docker-compose -f tester/docker-compose.yml down
\ No newline at end of file
+docker-compose -f tester/docker-compose.yml down
+docker rm -f $(docker ps -a -q -f ancestor=gaiadocker/iproute2)
diff --git a/tools/integration-tests/tester/docker-compose.yml b/tools/integration-tests/tester/docker-compose.yml
index 72438dcdefb644f583e4a660b58cb69707a9c99c..4beab7f788d263cfaca32f1e9cff01eec89e0e19 100644
--- a/tools/integration-tests/tester/docker-compose.yml
+++ b/tools/integration-tests/tester/docker-compose.yml
@@ -4,9 +4,14 @@ services:
   tester:
     container_name: tester
     image: golang:1.14
-    working_dir: /go/src/github.com/iotaledger/goshimmer/tools/integration-tests/tester
-    entrypoint: go test ./tests -v -mod=readonly
+    working_dir: /tmp/goshimmer/tools/integration-tests/tester
+    entrypoint: go test ./tests -v -mod=readonly -timeout 30m
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock:ro
-      - ../../..:/go/src/github.com/iotaledger/goshimmer:ro
-      - ../logs:/tmp/logs
\ No newline at end of file
+      - ../../..:/tmp/goshimmer:ro
+      - ../logs:/tmp/logs
+      - goshimmer-testing-cache:/go
+
+volumes:
+  goshimmer-testing-cache:
+    name: goshimmer-testing-cache
diff --git a/tools/integration-tests/tester/framework/docker.go b/tools/integration-tests/tester/framework/docker.go
index e04c9cfe6ec4a2eaa9886bd3b3b4a3297c25a724..37ab6594cc22894046caa268535e7b520dc4dede 100644
--- a/tools/integration-tests/tester/framework/docker.go
+++ b/tools/integration-tests/tester/framework/docker.go
@@ -122,9 +122,47 @@ func (d *DockerContainer) CreateDrandMember(name string, goShimmerAPI string, le
 	return d.CreateContainer(name, containerConfig)
 }
 
+// CreatePumba creates a new container with Pumba configuration.
+func (d *DockerContainer) CreatePumba(name string, containerName string, targetIPs []string) error {
+	hostConfig := &container.HostConfig{
+		Binds: strslice.StrSlice{"/var/run/docker.sock:/var/run/docker.sock:ro"},
+	}
+
+	cmd := strslice.StrSlice{
+		"--log-level=debug",
+		"netem",
+		"--duration=100m",
+	}
+
+	for _, ip := range targetIPs {
+		targetFlag := "--target=" + ip
+		cmd = append(cmd, targetFlag)
+	}
+
+	slice := strslice.StrSlice{
+		"--tc-image=gaiadocker/iproute2",
+		"loss",
+		"--percent=100",
+		containerName,
+	}
+	cmd = append(cmd, slice...)
+
+	containerConfig := &container.Config{
+		Image: "gaiaadm/pumba:latest",
+		Cmd:   cmd,
+	}
+
+	return d.CreateContainer(name, containerConfig, hostConfig)
+}
+
 // CreateContainer creates a new container with the given configuration.
-func (d *DockerContainer) CreateContainer(name string, containerConfig *container.Config) error {
-	resp, err := d.client.ContainerCreate(context.Background(), containerConfig, nil, nil, name)
+func (d *DockerContainer) CreateContainer(name string, containerConfig *container.Config, hostConfigs ...*container.HostConfig) error {
+	var hostConfig *container.HostConfig
+	if len(hostConfigs) > 0 {
+		hostConfig = hostConfigs[0]
+	}
+
+	resp, err := d.client.ContainerCreate(context.Background(), containerConfig, hostConfig, nil, name)
 	if err != nil {
 		return err
 	}
@@ -170,6 +208,22 @@ func (d *DockerContainer) ExitStatus() (int, error) {
 	return resp.State.ExitCode, nil
 }
 
+// IP returns the IP address according to the container information for the given network.
+func (d *DockerContainer) IP(network string) (string, error) {
+	resp, err := d.client.ContainerInspect(context.Background(), d.id)
+	if err != nil {
+		return "", err
+	}
+
+	for name, v := range resp.NetworkSettings.Networks {
+		if name == network {
+			return v.IPAddress, nil
+		}
+	}
+
+	return "", fmt.Errorf("IP address in %s could not be determined", network)
+}
+
 // Logs returns the logs of the container as io.ReadCloser.
 func (d *DockerContainer) Logs() (io.ReadCloser, error) {
 	options := types.ContainerLogsOptions{
diff --git a/tools/integration-tests/tester/framework/drngnetwork.go b/tools/integration-tests/tester/framework/drngnetwork.go
index 80da857995fa1cc325900ba9746915c096cf7430..4169c37ecee4897c9a105c8962a9f53aa0d89aca 100644
--- a/tools/integration-tests/tester/framework/drngnetwork.go
+++ b/tools/integration-tests/tester/framework/drngnetwork.go
@@ -55,7 +55,10 @@ func (n *DRNGNetwork) CreatePeer(c GoShimmerConfig, publicKey hive_ed25519.Publi
 		return nil, err
 	}
 
-	peer := newPeer(name, identity.New(publicKey), container)
+	peer, err := newPeer(name, identity.New(publicKey), container, n.network)
+	if err != nil {
+		return nil, err
+	}
 	n.network.peers = append(n.network.peers, peer)
 	return peer, nil
 }
diff --git a/tools/integration-tests/tester/framework/framework.go b/tools/integration-tests/tester/framework/framework.go
index ab92eb30dbc73aabc39482536068ea7653e19fd8..55f822869e8d6a3311b851363813695275a131ff 100644
--- a/tools/integration-tests/tester/framework/framework.go
+++ b/tools/integration-tests/tester/framework/framework.go
@@ -12,6 +12,7 @@ import (
 	"sync"
 	"time"
 
+	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/client"
 	hive_ed25519 "github.com/iotaledger/hive.go/crypto/ed25519"
 )
@@ -99,6 +100,88 @@ func (f *Framework) CreateNetwork(name string, peers int, minimumNeighbors int,
 	return network, nil
 }
 
+// CreateNetworkWithPartitions creates and returns a partitioned network that contains `peers` GoShimmer nodes per partition.
+// It waits for the peers to autopeer until the minimum neighbors criteria is met for every peer.
+// The first peer automatically starts with the bootstrap plugin enabled.
+func (f *Framework) CreateNetworkWithPartitions(name string, peers, partitions, minimumNeighbors int) (*Network, error) {
+	network, err := newNetwork(f.dockerClient, strings.ToLower(name), f.tester)
+	if err != nil {
+		return nil, err
+	}
+
+	err = network.createEntryNode()
+	if err != nil {
+		return nil, err
+	}
+
+	// block all traffic from/to entry node
+	pumbaEntryNodeName := network.namePrefix(containerNameEntryNode) + containerNameSuffixPumba
+	pumbaEntryNode, err := network.createPumba(
+		pumbaEntryNodeName,
+		network.namePrefix(containerNameEntryNode),
+		strslice.StrSlice{},
+	)
+	if err != nil {
+		return nil, err
+	}
+	// wait until pumba is started and blocks all traffic
+	time.Sleep(5 * time.Second)
+
+	// create peers/GoShimmer nodes
+	for i := 0; i < peers; i++ {
+		config := GoShimmerConfig{
+			Bootstrap: i == 0,
+		}
+		if _, err = network.CreatePeer(config); err != nil {
+			return nil, err
+		}
+	}
+	// wait until containers are fully started
+	time.Sleep(2 * time.Second)
+
+	// create partitions
+	chunkSize := peers / partitions
+	var end int
+	for i := 0; end < peers; i += chunkSize {
+		end = i + chunkSize
+		// last partitions takes the rest
+		if i/chunkSize == partitions-1 {
+			end = peers
+		}
+		_, err = network.createPartition(network.peers[i:end])
+		if err != nil {
+			return nil, err
+		}
+	}
+	// wait until pumba containers are started and block traffic between partitions
+	time.Sleep(5 * time.Second)
+
+	// delete pumba for entry node
+	err = pumbaEntryNode.Stop()
+	if err != nil {
+		return nil, err
+	}
+	logs, err := pumbaEntryNode.Logs()
+	if err != nil {
+		return nil, err
+	}
+	err = createLogFile(pumbaEntryNodeName, logs)
+	if err != nil {
+		return nil, err
+	}
+	err = pumbaEntryNode.Remove()
+	if err != nil {
+		return nil, err
+	}
+
+	err = network.WaitForAutopeering(minimumNeighbors)
+	if err != nil {
+		return nil, err
+	}
+
+	return network, nil
+}
+
 // CreateDRNGNetwork creates and returns a (Docker) Network that contains drand and `peers` GoShimmer nodes.
 func (f *Framework) CreateDRNGNetwork(name string, members, peers, minimumNeighbors int) (*DRNGNetwork, error) {
 	drng, err := newDRNGNetwork(f.dockerClient, strings.ToLower(name), f.tester)
diff --git a/tools/integration-tests/tester/framework/network.go b/tools/integration-tests/tester/framework/network.go
index 4094e8b6e173fd78148821645e7e1a7e3b4c911d..f8efc9798779ab2f811c4aeb540c0fe88bb3534b 100644
--- a/tools/integration-tests/tester/framework/network.go
+++ b/tools/integration-tests/tester/framework/network.go
@@ -27,6 +27,8 @@ type Network struct {
 	entryNode         *DockerContainer
 	entryNodeIdentity *identity.Identity
 
+	partitions []*Partition
+
 	dockerClient *client.Client
 }
 
@@ -115,7 +117,10 @@ func (n *Network) CreatePeer(c GoShimmerConfig) (*Peer, error) {
 		return nil, err
 	}
 
-	peer := newPeer(name, identity.New(publicKey), container)
+	peer, err := newPeer(name, identity.New(publicKey), container, n)
+	if err != nil {
+		return nil, err
+	}
 	n.peers = append(n.peers, peer)
 	return peer, nil
 }
@@ -135,6 +140,12 @@ func (n *Network) Shutdown() error {
 		}
 	}
 
+	// delete all partitions
+	err = n.DeletePartitions()
+	if err != nil {
+		return err
+	}
+
 	// retrieve logs
 	logs, err := n.entryNode.Logs()
 	if err != nil {
@@ -208,6 +219,10 @@ func (n *Network) WaitForAutopeering(minimumNeighbors int) error {
 	log.Printf("Waiting for autopeering...\n")
 	defer log.Printf("Waiting for autopeering... done\n")
 
+	if minimumNeighbors == 0 {
+		return nil
+	}
+
 	for i := autopeeringMaxTries; i > 0; i-- {
 
 		for _, p := range n.peers {
@@ -259,3 +274,147 @@ func (n *Network) Peers() []*Peer {
 func (n *Network) RandomPeer() *Peer {
 	return n.peers[rand.Intn(len(n.peers))]
 }
+
+// createPumba creates and starts a Pumba Docker container.
+func (n *Network) createPumba(name string, containerName string, targetIPs []string) (*DockerContainer, error) {
+	container := NewDockerContainer(n.dockerClient)
+	err := container.CreatePumba(name, containerName, targetIPs)
+	if err != nil {
+		return nil, err
+	}
+	err = container.Start()
+	if err != nil {
+		return nil, err
+	}
+
+	return container, nil
+}
+
+// createPartition creates a partition with the given peers.
+// It starts a Pumba container for every peer that blocks traffic to all other partitions.
+func (n *Network) createPartition(peers []*Peer) (*Partition, error) {
+	peersMap := make(map[string]*Peer)
+	for _, peer := range peers {
+		peersMap[peer.ID().String()] = peer
+	}
+
+	// block all traffic to all other peers except in the current partition
+	var targetIPs []string
+	for _, peer := range n.peers {
+		if _, ok := peersMap[peer.ID().String()]; ok {
+			continue
+		}
+		targetIPs = append(targetIPs, peer.ip)
+	}
+
+	partitionName := n.namePrefix(fmt.Sprintf("partition_%d-", len(n.partitions)))
+
+	// create pumba container for every peer in the partition
+	pumbas := make([]*DockerContainer, len(peers))
+	for i, p := range peers {
+		name := partitionName + p.name + containerNameSuffixPumba
+		pumba, err := n.createPumba(name, p.name, targetIPs)
+		if err != nil {
+			return nil, err
+		}
+		pumbas[i] = pumba
+		time.Sleep(1 * time.Second)
+	}
+
+	partition := &Partition{
+		name:     partitionName,
+		peers:    peers,
+		peersMap: peersMap,
+		pumbas:   pumbas,
+	}
+	n.partitions = append(n.partitions, partition)
+
+	return partition, nil
+}
+
+// DeletePartitions deletes all partitions of the network.
+// All nodes can communicate with the full network again.
+func (n *Network) DeletePartitions() error {
+	for _, p := range n.partitions {
+		err := p.deletePartition()
+		if err != nil {
+			return err
+		}
+	}
+	n.partitions = nil
+	return nil
+}
+
+// Partitions returns the network's partitions.
+func (n *Network) Partitions() []*Partition {
+	return n.partitions
+}
+
+// Split splits the existing network in given partitions.
+func (n *Network) Split(partitions ...[]*Peer) error {
+	for _, peers := range partitions {
+		_, err := n.createPartition(peers)
+		if err != nil {
+			return err
+		}
+	}
+	// wait until pumba containers are started and block traffic between partitions
+	time.Sleep(5 * time.Second)
+
+	return nil
+}
+
+// Partition represents a network partition.
+// It contains its peers and the corresponding Pumba instances that block all traffic to peers in other partitions.
+type Partition struct {
+	name     string
+	peers    []*Peer
+	peersMap map[string]*Peer
+	pumbas   []*DockerContainer
+}
+
+// Peers returns the partition's peers.
+func (p *Partition) Peers() []*Peer {
+	return p.peers
+}
+
+// PeersMap returns the partition's peers map.
+func (p *Partition) PeersMap() map[string]*Peer {
+	return p.peersMap
+}
+
+func (p *Partition) String() string {
+	return fmt.Sprintf("Partition{%s, %s}", p.name, p.peers)
+}
+
+// deletePartition deletes a partition, all its Pumba containers and creates logs for them.
+func (p *Partition) deletePartition() error {
+	// stop containers
+	for _, pumba := range p.pumbas {
+		err := pumba.Stop()
+		if err != nil {
+			return err
+		}
+	}
+
+	// retrieve logs
+	for i, pumba := range p.pumbas {
+		logs, err := pumba.Logs()
+		if err != nil {
+			return err
+		}
+		err = createLogFile(fmt.Sprintf("%s%s", p.name, p.peers[i].name), logs)
+		if err != nil {
+			return err
+		}
+	}
+
+	for _, pumba := range p.pumbas {
+		err := pumba.Remove()
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
diff --git a/tools/integration-tests/tester/framework/parameters.go b/tools/integration-tests/tester/framework/parameters.go
index 17d8933574870f1fe2bd6cd79d59add12d67b5bf..0d6b3c0198be9822c6eedb5716f40717a5ec8a5d 100644
--- a/tools/integration-tests/tester/framework/parameters.go
+++ b/tools/integration-tests/tester/framework/parameters.go
@@ -1,19 +1,20 @@
 package framework
 
 const (
-	autopeeringMaxTries = 50
+	autopeeringMaxTries = 25
 
 	apiPort = "8080"
 
-	containerNameTester    = "/tester"
-	containerNameEntryNode = "entry_node"
-	containerNameReplica   = "replica_"
-	containerNameDrand     = "drand_"
+	containerNameTester      = "/tester"
+	containerNameEntryNode   = "entry_node"
+	containerNameReplica     = "replica_"
+	containerNameDrand       = "drand_"
+	containerNameSuffixPumba = "_pumba"
 
 	logsDir = "/tmp/logs/"
 
-	disabledPluginsEntryNode = "portcheck,dashboard,analysis-client,gossip,drng,issuer,sync,metrics,messagelayer,webapi,webapibroadcastdataendpoint,webapifindtransactionhashesendpoint,webapigetneighborsendpoint,webapigettransactionobjectsbyhashendpoint,webapigettransactiontrytesbyhashendpoint"
-	disabledPluginsPeer      = "portcheck,dashboard,analysis-client"
+	disabledPluginsEntryNode = "portcheck,dashboard,analysis-client,profiling,gossip,drng,issuer,sync,metrics,messagelayer,webapi,webapibroadcastdataendpoint,webapifindtransactionhashesendpoint,webapigetneighborsendpoint,webapigettransactionobjectsbyhashendpoint,webapigettransactiontrytesbyhashendpoint"
+	disabledPluginsPeer      = "portcheck,dashboard,analysis-client,profiling"
 
 	dockerLogsPrefixLen = 8
 
diff --git a/tools/integration-tests/tester/framework/peer.go b/tools/integration-tests/tester/framework/peer.go
index 2ad98d4125599a3b87848a41c1d4ab8d08b6f806..18c059e8d91d6d07b2131fbf620d0b35f45d39ea 100644
--- a/tools/integration-tests/tester/framework/peer.go
+++ b/tools/integration-tests/tester/framework/peer.go
@@ -14,6 +14,7 @@ import (
 type Peer struct {
 	// name of the GoShimmer instance, Docker container and hostname
 	name string
+	ip   string
 	// GoShimmer identity
 	*identity.Identity
 
@@ -28,13 +29,21 @@ type Peer struct {
 }
 
 // newPeer creates a new instance of Peer with the given information.
-func newPeer(name string, identity *identity.Identity, dockerContainer *DockerContainer) *Peer {
+// dockerContainer needs to be started in order to determine the container's (and therefore peer's) IP correctly.
+func newPeer(name string, identity *identity.Identity, dockerContainer *DockerContainer, network *Network) (*Peer, error) {
+	// after container is started we can get its IP
+	ip, err := dockerContainer.IP(network.name)
+	if err != nil {
+		return nil, err
+	}
+
 	return &Peer{
 		name:            name,
+		ip:              ip,
 		Identity:        identity,
 		GoShimmerAPI:    client.NewGoShimmerAPI(getWebAPIBaseURL(name), http.Client{Timeout: 30 * time.Second}),
 		DockerContainer: dockerContainer,
-	}
+	}, nil
 }
 
 func (p *Peer) String() string {
diff --git a/tools/integration-tests/tester/go.mod b/tools/integration-tests/tester/go.mod
index 8f31861c5760b6229a2b2ec62b943f470993b75c..a9a1a0e32432ad6acc597375b0a0786f61032841 100644
--- a/tools/integration-tests/tester/go.mod
+++ b/tools/integration-tests/tester/go.mod
@@ -10,7 +10,7 @@ require (
 	github.com/docker/go-units v0.4.0 // indirect
 	github.com/drand/drand v0.8.1
 	github.com/iotaledger/goshimmer v0.1.3
-	github.com/iotaledger/hive.go v0.0.0-20200513180357-f0ac8c45b754
+	github.com/iotaledger/hive.go v0.0.0-20200525142347-543f24c486b8
 	github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
 	github.com/stretchr/testify v1.5.1
 )
diff --git a/tools/integration-tests/tester/go.sum b/tools/integration-tests/tester/go.sum
index f71c038d73d23289a0ecd1a7ce429bdbd3ef3284..2214754956637a299b0be8e15f83ff6b82fd2520 100644
--- a/tools/integration-tests/tester/go.sum
+++ b/tools/integration-tests/tester/go.sum
@@ -138,8 +138,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/iotaledger/hive.go v0.0.0-20200513180357-f0ac8c45b754 h1:UCyAisLvAuKIWf2bMz+iYYgjGdHS7H4W2wMTpWg9yl8=
-github.com/iotaledger/hive.go v0.0.0-20200513180357-f0ac8c45b754/go.mod h1:HgYsLMzyQV+eaiUrxa1c7qvH9Jwi2ncycqtlw+Lczhs=
+github.com/iotaledger/hive.go v0.0.0-20200525142347-543f24c486b8 h1:QRVEyknRx6lCrHtk6BbBLcs16nQ8Ozbe4OSxV8XYAr8=
+github.com/iotaledger/hive.go v0.0.0-20200525142347-543f24c486b8/go.mod h1:zwZhaE4ZeglpTrbmbwdnVPMI5XdRu2RmByi3Qn0ztmU=
 github.com/iotaledger/iota.go v1.0.0-beta.9/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
 github.com/iotaledger/iota.go v1.0.0-beta.14/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
@@ -318,6 +318,8 @@ go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYr
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
+go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 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=
@@ -406,6 +408,7 @@ golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk=
 golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200427175716-29b57079015a h1:08u6b1caTT9MQY4wSbmsd4Ulm6DmgNYnbImBuZjGJow=
 golang.org/x/sys v0.0.0-20200427175716-29b57079015a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
diff --git a/tools/integration-tests/tester/tests/autopeering_test.go b/tools/integration-tests/tester/tests/autopeering_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..824448f6586bc32b9aac18f3496a2d4cf1badb1b
--- /dev/null
+++ b/tools/integration-tests/tester/tests/autopeering_test.go
@@ -0,0 +1,37 @@
+package tests
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func TestNetworkSplit(t *testing.T) {
+	n, err := f.CreateNetworkWithPartitions("autopeering_TestNetworkSplit", 6, 2, 2)
+	require.NoError(t, err)
+	defer ShutdownNetwork(t, n)
+
+	// test that nodes only have neighbors from same partition
+	for _, partition := range n.Partitions() {
+		for _, peer := range partition.Peers() {
+			resp, err := peer.GetNeighbors(false)
+			require.NoError(t, err)
+
+			// check that all neighbors are indeed in the same partition
+			for _, n := range resp.Accepted {
+				assert.Contains(t, partition.PeersMap(), n.ID)
+			}
+			for _, n := range resp.Chosen {
+				assert.Contains(t, partition.PeersMap(), n.ID)
+			}
+		}
+	}
+
+	err = n.DeletePartitions()
+	require.NoError(t, err)
+
+	// let them mingle and check that they all peer with each other
+	err = n.WaitForAutopeering(4)
+	require.NoError(t, err)
+}
diff --git a/tools/integration-tests/tester/tests/common_test.go b/tools/integration-tests/tester/tests/common_test.go
index e52f6c89798a8b8872b01e83b3a262e3afe41dd8..d6b6fab53c72e07e7ad76c37f4901a15007b371f 100644
--- a/tools/integration-tests/tester/tests/common_test.go
+++ b/tools/integration-tests/tester/tests/common_test.go
@@ -65,7 +65,7 @@ func TestSynchronization(t *testing.T) {
 	// 8. issue some messages on old peers so that new peer can sync again
 	ids = sendDataMessagesOnRandomPeer(t, n.Peers()[:initalPeers], 10, ids)
 	// wait for peer to sync
-	time.Sleep(5 * time.Second)
+	time.Sleep(10 * time.Second)
 
 	// 9. newPeer becomes synced again
 	resp, err = newPeer.Info()