diff --git a/storage/cmix/store_test.go b/storage/cmix/store_test.go
index b1bb2eebcb82ea045b8d7ca8ed5a1b1680da7b5d..33b66b3e12d9651c73812bc949d65ae899bb4ecc 100644
--- a/storage/cmix/store_test.go
+++ b/storage/cmix/store_test.go
@@ -19,6 +19,9 @@ import (
 
 // Happy path Add/Done test
 func TestStore_AddRemove(t *testing.T) {
+	// Uncomment to print keys that Set and Get are called on
+	//jww.SetStdoutThreshold(jww.LevelTrace)
+
 	testStore, _ := makeTestStore()
 
 	nodeId := id.NewIdFromString("test", id.Node, t)
@@ -39,6 +42,9 @@ func TestStore_AddRemove(t *testing.T) {
 
 // Happy path
 func TestLoadStore(t *testing.T) {
+	// Uncomment to print keys that Set and Get are called on
+	//jww.SetStdoutThreshold(jww.LevelTrace)
+
 	testStore, kv := makeTestStore()
 
 	// Add a test node key
@@ -50,7 +56,7 @@ func TestLoadStore(t *testing.T) {
 	// Load the store and check its attributes
 	store, err := LoadStore(kv)
 	if err != nil {
-		t.Errorf("Unable to load store: %+v", err)
+		t.Fatalf("Unable to load store: %+v", err)
 	}
 	if store.GetDHPublicKey().Cmp(testStore.GetDHPublicKey()) != 0 {
 		t.Errorf("LoadStore failed to load public key")
@@ -65,6 +71,9 @@ func TestLoadStore(t *testing.T) {
 
 // Happy path
 func TestStore_GetRoundKeys(t *testing.T) {
+	// Uncomment to print keys that Set and Get are called on
+	//jww.SetStdoutThreshold(jww.LevelTrace)
+
 	testStore, _ := makeTestStore()
 	// Set up the circuit
 	numIds := 10
@@ -90,6 +99,9 @@ func TestStore_GetRoundKeys(t *testing.T) {
 
 // Missing keys path
 func TestStore_GetRoundKeys_Missing(t *testing.T) {
+	// Uncomment to print keys that Set and Get are called on
+	//jww.SetStdoutThreshold(jww.LevelTrace)
+
 	testStore, _ := makeTestStore()
 	// Set up the circuit
 	numIds := 10
diff --git a/storage/conversation/partner.go b/storage/conversation/partner.go
index f13f133b22cd1521e0c6520436dec70cae1d6b6e..e1bd682ded5fae688bf6858ce1d96fe63ef4c61c 100644
--- a/storage/conversation/partner.go
+++ b/storage/conversation/partner.go
@@ -181,5 +181,5 @@ func (c *Conversation) marshal() ([]byte, error) {
 }
 
 func makeConversationKey(partner *id.ID) string {
-	return partner.String()
+	return versioned.MakePartnerPrefix(partner)
 }
diff --git a/storage/conversation/partner_test.go b/storage/conversation/partner_test.go
index 0c6091abc3aee7ff1801d7dc3c648879aa878607..caad5518c49fe4e14f6df69a53116f237e8ef828 100644
--- a/storage/conversation/partner_test.go
+++ b/storage/conversation/partner_test.go
@@ -1,6 +1,7 @@
 package conversation
 
 import (
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/xx_network/primitives/id"
@@ -11,6 +12,8 @@ import (
 
 // Tests happy path of LoadOrMakeConversation() when making a new Conversation.
 func TestLoadOrMakeConversation_Make(t *testing.T) {
+	// Uncomment to print keys that Set and Get are called on
+	jww.SetStdoutThreshold(jww.LevelTrace)
 	// Set up test values
 	kv := versioned.NewKV(make(ekv.Memstore))
 	partner := id.NewIdFromString("partner ID", id.User, t)
diff --git a/storage/conversation/store_test.go b/storage/conversation/store_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..e391f3949648a9c9cf1429375cb35f43b40be4e7
--- /dev/null
+++ b/storage/conversation/store_test.go
@@ -0,0 +1,21 @@
+package conversation
+
+import (
+	jww "github.com/spf13/jwalterweatherman"
+	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/elixxir/ekv"
+	"gitlab.com/xx_network/primitives/id"
+	"testing"
+)
+
+// Read jww trace output to determine if key names are ok
+func TestStore_Get_Prefix(t *testing.T) {
+	// Uncomment to print keys that Set and Get are called on
+	jww.SetStdoutThreshold(jww.LevelTrace)
+
+	// It's a conversation with a partner, so does there need to be an additional layer of hierarchy here later?
+	rootKv := versioned.NewKV(make(ekv.Memstore))
+	store := NewStore(rootKv)
+	conv := store.Get(id.NewIdFromUInt(8, id.User, t))
+	t.Log(conv)
+}
diff --git a/storage/partition/multiPartMessage.go b/storage/partition/multiPartMessage.go
index 63d2c7611384fbb0d6d0a0dc83022161187ca5a4..28907664049a63110347cdae002b64d408a188a2 100644
--- a/storage/partition/multiPartMessage.go
+++ b/storage/partition/multiPartMessage.go
@@ -2,19 +2,19 @@ package partition
 
 import (
 	"encoding/json"
+	"fmt"
 	"github.com/pkg/errors"
 	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/xx_network/primitives/id"
-	"strconv"
 	"sync"
 	"time"
 )
 
 const currentMultiPartMessageVersion = 0
-const keyMultiPartMessagePrefix = "MultiPartMessage"
+const messageKey = "MultiPart"
 
 type multiPartMessage struct {
 	Sender       *id.ID
@@ -33,9 +33,9 @@ type multiPartMessage struct {
 // creates a new one and saves it if one does not exist.
 func loadOrCreateMultiPartMessage(sender *id.ID, messageID uint64,
 	kv *versioned.KV) *multiPartMessage {
-	key := makeMultiPartMessageKey(sender, messageID)
+	kv = kv.Prefix(versioned.MakePartnerPrefix(sender)).Prefix(fmt.Sprintf("MessageID:%d", messageID))
 
-	obj, err := kv.Get(key)
+	obj, err := kv.Get(messageKey)
 	if err != nil {
 		if !ekv.Exists(err) {
 			mpm := &multiPartMessage{
@@ -70,8 +70,6 @@ func loadOrCreateMultiPartMessage(sender *id.ID, messageID uint64,
 }
 
 func (mpm *multiPartMessage) save() error {
-	key := makeMultiPartMessageKey(mpm.Sender, mpm.MessageID)
-
 	data, err := json.Marshal(mpm)
 	if err != nil {
 		return errors.Wrap(err, "Failed to unmarshal multi-part message")
@@ -83,7 +81,7 @@ func (mpm *multiPartMessage) save() error {
 		Data:      data,
 	}
 
-	return mpm.kv.Set(key, &obj)
+	return mpm.kv.Set(messageKey, &obj)
 }
 
 func (mpm *multiPartMessage) Add(partNumber uint8, part []byte) {
@@ -98,7 +96,7 @@ func (mpm *multiPartMessage) Add(partNumber uint8, part []byte) {
 	mpm.parts[partNumber] = part
 	mpm.PresentParts++
 
-	if err := savePart(mpm.kv, mpm.Sender, mpm.MessageID, partNumber, part); err != nil {
+	if err := savePart(mpm.kv, partNumber, part); err != nil {
 		jww.FATAL.Panicf("Failed to save multi part "+
 			"message part %v from %s messageID %v: %s", partNumber, mpm.Sender,
 			mpm.MessageID, err)
@@ -127,9 +125,10 @@ func (mpm *multiPartMessage) AddFirst(mt message.Type, partNumber uint8,
 	mpm.parts[partNumber] = part
 	mpm.PresentParts++
 
-	if err := savePart(mpm.kv, mpm.Sender, mpm.MessageID, partNumber, part); err != nil {
-		jww.FATAL.Panicf("Failed to save multi part message part %v from %s "+
-			"messageID %v: %s", partNumber, mpm.Sender, mpm.MessageID, err)
+	if err := savePart(mpm.kv, partNumber, part); err != nil {
+		jww.FATAL.Panicf("Failed to save multi part "+
+			"message part %v from %s messageID %v: %s", partNumber, mpm.Sender,
+			mpm.MessageID, err)
 	}
 
 	if err := mpm.save(); err != nil {
@@ -156,13 +155,15 @@ func (mpm *multiPartMessage) IsComplete() (message.Receive, bool) {
 	// Load all parts from disk, deleting files from disk as we go along
 	for i := uint8(0); i < mpm.NumParts; i++ {
 		if mpm.parts[i] == nil {
-			if mpm.parts[i], err = loadPart(mpm.kv, mpm.Sender, mpm.MessageID, i); err != nil {
-				jww.FATAL.Panicf("Failed to load multi part message part %v "+
-					"from %s messageID %v: %s", i, mpm.Sender, mpm.MessageID, err)
+			if mpm.parts[i], err = loadPart(mpm.kv, i); err != nil {
+				jww.FATAL.Panicf("Failed to load multi part "+
+					"message part %v from %s messageID %v: %s", i, mpm.Sender,
+					mpm.MessageID, err)
 			}
-			if err = deletePart(mpm.kv, mpm.Sender, mpm.MessageID, i); err != nil {
-				jww.FATAL.Panicf("Failed to delete multi part message part %v "+
-					"from %s messageID %v: %s", i, mpm.Sender, mpm.MessageID, err)
+			if err = deletePart(mpm.kv, i); err != nil {
+				jww.FATAL.Panicf("Failed to delete  multi part "+
+					"message part %v from %s messageID %v: %s", i, mpm.Sender,
+					mpm.MessageID, err)
 			}
 		}
 		lenMsg += len(mpm.parts[i])
@@ -194,15 +195,10 @@ func (mpm *multiPartMessage) IsComplete() (message.Receive, bool) {
 }
 
 func (mpm *multiPartMessage) delete() {
-	key := makeMultiPartMessageKey(mpm.Sender, mpm.MessageID)
-	if err := mpm.kv.Delete(key); err != nil {
+	//key := makeMultiPartMessageKey(mpm.MessageID)
+	if err := mpm.kv.Delete(messageKey); err != nil {
 		jww.FATAL.Panicf("Failed to delete multi part "+
 			"message from %s messageID %v: %s", mpm.Sender,
 			mpm.MessageID, err)
 	}
 }
-
-func makeMultiPartMessageKey(partner *id.ID, messageID uint64) string {
-	return keyMultiPartMessagePrefix + ":" + partner.String() + ":" +
-		strconv.FormatUint(messageID, 10)
-}
diff --git a/storage/partition/multiPartMessage_test.go b/storage/partition/multiPartMessage_test.go
index 6f164b6d11869f207930741339e7a17362f21800..c5577e4ec8f6862e324b072a71439e66ad2aeae3 100644
--- a/storage/partition/multiPartMessage_test.go
+++ b/storage/partition/multiPartMessage_test.go
@@ -3,6 +3,7 @@ package partition
 import (
 	"bytes"
 	"encoding/json"
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/ekv"
@@ -15,6 +16,7 @@ import (
 
 // Tests the creation part of loadOrCreateMultiPartMessage().
 func Test_loadOrCreateMultiPartMessage_Create(t *testing.T) {
+	jww.SetStdoutThreshold(jww.LevelTrace)
 	// Set up expected test value
 	prng := rand.New(rand.NewSource(time.Now().UnixNano()))
 	expectedMpm := &multiPartMessage{
@@ -35,14 +37,9 @@ func Test_loadOrCreateMultiPartMessage_Create(t *testing.T) {
 	mpm := loadOrCreateMultiPartMessage(expectedMpm.Sender,
 		expectedMpm.MessageID, expectedMpm.kv)
 
-	if !reflect.DeepEqual(expectedMpm, mpm) {
-		t.Errorf("loadOrCreateMultiPartMessage() did not create the correct "+
-			"multiPartMessage.\n\texpected: %+v\n\treceived: %+v",
-			expectedMpm, mpm)
-	}
+	CheckMultiPartMessages(expectedMpm, mpm, t)
 
-	obj, err := expectedMpm.kv.Get(makeMultiPartMessageKey(expectedMpm.Sender,
-		expectedMpm.MessageID))
+	obj, err := mpm.kv.Get(messageKey)
 	if err != nil {
 		t.Errorf("Get() failed to get multiPartMessage from key value store: %v", err)
 	}
@@ -76,10 +73,36 @@ func Test_loadOrCreateMultiPartMessage_Load(t *testing.T) {
 	mpm := loadOrCreateMultiPartMessage(expectedMpm.Sender,
 		expectedMpm.MessageID, expectedMpm.kv)
 
-	if !reflect.DeepEqual(expectedMpm, mpm) {
-		t.Errorf("loadOrCreateMultiPartMessage() did not create the correct "+
-			"multiPartMessage.\n\texpected: %+v\n\treceived: %+v",
-			expectedMpm, mpm)
+	CheckMultiPartMessages(expectedMpm, mpm, t)
+}
+
+func CheckMultiPartMessages(expectedMpm *multiPartMessage, mpm *multiPartMessage, t *testing.T) {
+	// The kv differs because it has prefix called, so we compare fields individually
+	if expectedMpm.Timestamp != mpm.Timestamp {
+		t.Errorf("timestamps mismatch: expected %v, got %v", expectedMpm.Timestamp, mpm.Timestamp)
+	}
+	if expectedMpm.MessageType != mpm.MessageType {
+		t.Errorf("messagetype mismatch: expected %v, got %v", expectedMpm.MessageID, mpm.MessageID)
+	}
+	if expectedMpm.MessageID != mpm.MessageID {
+		t.Errorf("messageid mismatch: expected %v, got %v", expectedMpm.MessageID, mpm.MessageID)
+	}
+	if expectedMpm.NumParts != mpm.NumParts {
+		t.Errorf("numparts mismatch: expected %v, got %v", expectedMpm.NumParts, mpm.NumParts)
+	}
+	if expectedMpm.PresentParts != mpm.PresentParts {
+		t.Errorf("presentparts mismatch: expected %v, got %v", expectedMpm.PresentParts, mpm.PresentParts)
+	}
+	if !expectedMpm.Sender.Cmp(mpm.Sender) {
+		t.Errorf("sender mismatch: expected %v, got %v", expectedMpm.Sender, mpm.Sender)
+	}
+	if len(expectedMpm.parts) != len(mpm.parts) {
+		t.Error("parts different length")
+	}
+	for i := range expectedMpm.parts {
+		if !bytes.Equal(expectedMpm.parts[i], mpm.parts[i]) {
+			t.Errorf("parts differed at index %v", i)
+		}
 	}
 }
 
@@ -112,7 +135,7 @@ func TestMultiPartMessage_Add(t *testing.T) {
 		t.Fatalf("Failed to marshal expected multiPartMessage: %v", err)
 	}
 
-	obj, err := mpm.kv.Get(makeMultiPartMessageKey(mpm.Sender, mpm.MessageID))
+	obj, err := mpm.kv.Get(messageKey)
 	if err != nil {
 		t.Errorf("Get() failed to get multiPartMessage from key value store: %v", err)
 	}
@@ -145,12 +168,9 @@ func TestMultiPartMessage_AddFirst(t *testing.T) {
 	npm.AddFirst(expectedMpm.MessageType, 2, expectedMpm.NumParts,
 		expectedMpm.Timestamp, expectedMpm.parts[2])
 
-	if !reflect.DeepEqual(expectedMpm, npm) {
-		t.Errorf("AddFirst() did not produce correct multiPartMessage."+
-			"\n\texpected: %#v\n\treceived: %#v", expectedMpm, npm)
-	}
+	CheckMultiPartMessages(expectedMpm, npm, t)
 
-	data, err := loadPart(npm.kv, npm.Sender, npm.MessageID, 2)
+	data, err := loadPart(npm.kv, 2)
 	if err != nil {
 		t.Errorf("loadPart() produced an error: %v", err)
 	}
@@ -213,13 +233,12 @@ func TestMultiPartMessage_delete(t *testing.T) {
 	kv := versioned.NewKV(make(ekv.Memstore))
 	mpm := loadOrCreateMultiPartMessage(id.NewIdFromUInt(prng.Uint64(), id.User, t),
 		prng.Uint64(), kv)
-	key := makeMultiPartMessageKey(mpm.Sender, mpm.MessageID)
 
 	mpm.delete()
-	obj, err := kv.Get(key)
+	obj, err := kv.Get(messageKey)
 	if ekv.Exists(err) {
 		t.Errorf("delete() did not properly delete key %s."+
-			"\n\tobject received: %+v", key, obj)
+			"\n\tobject received: %+v", messageKey, obj)
 	}
 }
 
diff --git a/storage/partition/part.go b/storage/partition/part.go
index 11c502e88c3cf381cd31154be06fe5c803109706..7a6052d96ee8f2cbd66d89642f0217e5ee5745da 100644
--- a/storage/partition/part.go
+++ b/storage/partition/part.go
@@ -1,17 +1,15 @@
 package partition
 
 import (
+	"fmt"
 	"gitlab.com/elixxir/client/storage/versioned"
-	"gitlab.com/xx_network/primitives/id"
-	"strconv"
 	"time"
 )
 
 const currentMultiPartMessagePartVersion = 0
-const keyMultiPartMessagePartPrefix = "MultiPartMessagePart"
 
-func loadPart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8) ([]byte, error) {
-	key := makeMultiPartMessagePartKey(partner, messageID, partNum)
+func loadPart(kv *versioned.KV, partNum uint8) ([]byte, error) {
+	key := makeMultiPartMessagePartKey(partNum)
 
 	obj, err := kv.Get(key)
 	if err != nil {
@@ -21,8 +19,8 @@ func loadPart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8)
 	return obj.Data, nil
 }
 
-func savePart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8, part []byte) error {
-	key := makeMultiPartMessagePartKey(partner, messageID, partNum)
+func savePart(kv *versioned.KV, partNum uint8, part []byte) error {
+	key := makeMultiPartMessagePartKey(partNum)
 
 	obj := versioned.Object{
 		Version:   currentMultiPartMessagePartVersion,
@@ -33,13 +31,17 @@ func savePart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8,
 	return kv.Set(key, &obj)
 }
 
-func deletePart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8) error {
-	key := makeMultiPartMessagePartKey(partner, messageID, partNum)
+func deletePart(kv *versioned.KV, partNum uint8) error {
+	key := makeMultiPartMessagePartKey(partNum)
 	return kv.Delete(key)
 }
 
-func makeMultiPartMessagePartKey(partner *id.ID, messageID uint64, partNum uint8) string {
-	return keyMultiPartMessagePartPrefix + ":" + partner.String() + ":" +
-		strconv.FormatUint(messageID, 10) + ":" + string(partNum)
-
+// Make the key for a part
+func makeMultiPartMessagePartKey(part uint8) string {
+	return fmt.Sprintf("part:%v", part)
 }
+
+//func multiPartMessagePartPrefix(kv *versioned.KV, id uint64) *versioned.KV {
+//	return kv.Prefix(keyMultiPartMessagePartPrefix).
+//		Prefix(strconv.FormatUint(id, 32))
+//}
diff --git a/storage/partition/part_test.go b/storage/partition/part_test.go
index 8899d634653d6a3019536abae025870822d99d02..d83d528fb4e962d3b2f23f8ae13b1b25c1da33a2 100644
--- a/storage/partition/part_test.go
+++ b/storage/partition/part_test.go
@@ -2,9 +2,9 @@ package partition
 
 import (
 	"bytes"
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/ekv"
-	"gitlab.com/xx_network/primitives/id"
 	"math/rand"
 	"testing"
 	"time"
@@ -15,15 +15,13 @@ func Test_savePart(t *testing.T) {
 	// Set up test values
 	prng := rand.New(rand.NewSource(time.Now().UnixNano()))
 	kv := versioned.NewKV(make(ekv.Memstore))
-	partner := id.NewIdFromUInt(prng.Uint64(), id.User, t)
-	messageID := prng.Uint64()
 	partNum := uint8(prng.Uint32())
 	part := make([]byte, prng.Int31n(500))
 	prng.Read(part)
-	key := makeMultiPartMessagePartKey(partner, messageID, partNum)
+	key := makeMultiPartMessagePartKey(partNum)
 
 	// Save part
-	err := savePart(kv, partner, messageID, partNum, part)
+	err := savePart(kv, partNum, part)
 	if err != nil {
 		t.Errorf("savePart() produced an error: %v", err)
 	}
@@ -43,24 +41,23 @@ func Test_savePart(t *testing.T) {
 
 // Tests happy path of loadPart().
 func Test_loadPart(t *testing.T) {
+	jww.SetStdoutThreshold(jww.LevelTrace)
 	// Set up test values
 	prng := rand.New(rand.NewSource(time.Now().UnixNano()))
-	kv := versioned.NewKV(make(ekv.Memstore))
-	partner := id.NewIdFromUInt(prng.Uint64(), id.User, t)
-	messageID := prng.Uint64()
+	rootKv := versioned.NewKV(make(ekv.Memstore))
 	partNum := uint8(prng.Uint32())
 	part := make([]byte, prng.Int31n(500))
 	prng.Read(part)
-	key := makeMultiPartMessagePartKey(partner, messageID, partNum)
+	key := makeMultiPartMessagePartKey(partNum)
 
 	// Save part to key value store
-	err := kv.Set(key, &versioned.Object{Timestamp: time.Now(), Data: part})
+	err := rootKv.Set(key, &versioned.Object{Timestamp: time.Now(), Data: part})
 	if err != nil {
 		t.Fatalf("Failed to set object: %v", err)
 	}
 
 	// Load part from key value store
-	data, err := loadPart(kv, partner, messageID, partNum)
+	data, err := loadPart(rootKv, partNum)
 	if err != nil {
 		t.Errorf("loadPart() produced an error: %v", err)
 	}
@@ -78,14 +75,12 @@ func Test_loadPart_NotFoundError(t *testing.T) {
 	// Set up test values
 	prng := rand.New(rand.NewSource(time.Now().UnixNano()))
 	kv := versioned.NewKV(make(ekv.Memstore))
-	partner := id.NewIdFromUInt(prng.Uint64(), id.User, t)
-	messageID := prng.Uint64()
 	partNum := uint8(prng.Uint32())
 	part := make([]byte, prng.Int31n(500))
 	prng.Read(part)
 
 	// Load part from key value store
-	data, err := loadPart(kv, partner, messageID, partNum)
+	data, err := loadPart(kv, partNum)
 	if ekv.Exists(err) {
 		t.Errorf("loadPart() found an item for the key: %v", err)
 	}
@@ -102,26 +97,24 @@ func TestDeletePart(t *testing.T) {
 	// Set up test values
 	prng := rand.New(rand.NewSource(time.Now().UnixNano()))
 	kv := versioned.NewKV(make(ekv.Memstore))
-	partner := id.NewIdFromUInt(prng.Uint64(), id.User, t)
-	messageID := prng.Uint64()
 	partNum := uint8(prng.Uint32())
 	part := make([]byte, prng.Int31n(500))
 	prng.Read(part)
 
 	// Save part
-	err := savePart(kv, partner, messageID, partNum, part)
+	err := savePart(kv, partNum, part)
 	if err != nil {
 		t.Fatalf("savePart() produced an error: %v", err)
 	}
 
 	// Attempt to delete part
-	err = deletePart(kv, partner, messageID, partNum)
+	err = deletePart(kv, partNum)
 	if err != nil {
 		t.Errorf("deletePart() produced an error: %v", err)
 	}
 
 	// Check if part was deleted
-	_, err = loadPart(kv, partner, messageID, partNum)
+	_, err = loadPart(kv, partNum)
 	if ekv.Exists(err) {
 		t.Errorf("part was found in key value store: %v", err)
 	}
diff --git a/storage/partition/store.go b/storage/partition/store.go
index d9935a201a1313eeb1d16711ec8f9e09f16379cd..2b23d2834e905c94b6d11e3ffab764e18d94154e 100644
--- a/storage/partition/store.go
+++ b/storage/partition/store.go
@@ -12,6 +12,8 @@ import (
 
 type multiPartID [16]byte
 
+const packagePrefix = "Partition"
+
 type Store struct {
 	multiParts map[multiPartID]*multiPartMessage
 	kv         *versioned.KV
@@ -21,7 +23,7 @@ type Store struct {
 func New(kv *versioned.KV) *Store {
 	return &Store{
 		multiParts: make(map[multiPartID]*multiPartMessage),
-		kv:         kv,
+		kv:         kv.Prefix(packagePrefix),
 	}
 }
 
diff --git a/storage/partition/store_test.go b/storage/partition/store_test.go
index c222eead9e9538561eafc51d4ea86c5a5cd3d294..fab54bcd6bc38f6c4c031460cf6c006d6dc1e213 100644
--- a/storage/partition/store_test.go
+++ b/storage/partition/store_test.go
@@ -2,6 +2,7 @@ package partition
 
 import (
 	"bytes"
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/interfaces/message"
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/ekv"
@@ -13,12 +14,13 @@ import (
 
 // Tests happy path of New().
 func TestNew(t *testing.T) {
+	rootKv := versioned.NewKV(make(ekv.Memstore))
 	expectedStore := &Store{
 		multiParts: make(map[multiPartID]*multiPartMessage),
-		kv:         versioned.NewKV(make(ekv.Memstore)),
+		kv:         rootKv.Prefix(packagePrefix),
 	}
 
-	store := New(expectedStore.kv)
+	store := New(rootKv)
 
 	if !reflect.DeepEqual(expectedStore, store) {
 		t.Errorf("New() did not return the expecte Store."+
@@ -28,6 +30,7 @@ func TestNew(t *testing.T) {
 
 // Tests happy path of Store.AddFirst().
 func TestStore_AddFirst(t *testing.T) {
+	jww.SetStdoutThreshold(jww.LevelTrace)
 	part := []byte("Test message.")
 	s := New(versioned.NewKV(ekv.Memstore{}))
 
diff --git a/storage/utility/knownRounds.go b/storage/utility/knownRounds.go
index c03f7c433900fc2b7a6f634532374c599bd58baa..472206074e4ccc56cf4e5ecf03b0cadcdbbd00de 100644
--- a/storage/utility/knownRounds.go
+++ b/storage/utility/knownRounds.go
@@ -10,7 +10,7 @@ import (
 )
 
 // Sub key used in building keys for saving the message to the key value store
-const knownRoundsSubKey = "knownRound"
+const knownRoundsPrefix = "knownRound"
 
 // Version of the file saved to the key value store
 const currentKnownRoundsVersion = 0
@@ -32,7 +32,7 @@ func NewKnownRounds(kv *versioned.KV, key string, size int) (*KnownRounds, error
 	// Create new empty struct
 	kr := &KnownRounds{
 		rounds: knownRounds.NewKnownRound(size),
-		kv:     kv,
+		kv:     kv.Prefix(knownRoundsPrefix),
 		key:    key,
 	}
 
@@ -49,7 +49,7 @@ func LoadKnownRounds(kv *versioned.KV, key string, size int) (*KnownRounds, erro
 	// Create new empty struct
 	kr := &KnownRounds{
 		rounds: knownRounds.NewKnownRound(size),
-		kv:     kv,
+		kv:     kv.Prefix(knownRoundsPrefix),
 		key:    key,
 	}
 
@@ -78,7 +78,7 @@ func (kr *KnownRounds) save() error {
 	}
 
 	// Save versioned object
-	return kr.kv.Set(makeKnownRoundsSubKey(kr.key), &obj)
+	return kr.kv.Set(kr.key, &obj)
 }
 
 // load retrieves the list of rounds from the key value store and stores them
@@ -86,7 +86,7 @@ func (kr *KnownRounds) save() error {
 func (kr *KnownRounds) load() error {
 
 	// Load the versioned object
-	vo, err := kr.kv.Get(makeKnownRoundsSubKey(kr.key))
+	vo, err := kr.kv.Get(kr.key)
 	if err != nil {
 		return err
 	}
@@ -162,8 +162,3 @@ func (kr *KnownRounds) RangeUncheckedMasked(mask *knownRounds.KnownRounds,
 		jww.FATAL.Panicf("Error saving list of checked rounds: %v", err)
 	}
 }
-
-// makeKnownRoundsSubKey generates a new key for the known rounds buffer.
-func makeKnownRoundsSubKey(key string) string {
-	return key + knownRoundsSubKey
-}
diff --git a/storage/utility/knownRounds_test.go b/storage/utility/knownRounds_test.go
index 88e153f1e1c8bd4f471a934712d878cd91a90d5d..f6490beef04f57cd4d6858d1a97522e699fe8245 100644
--- a/storage/utility/knownRounds_test.go
+++ b/storage/utility/knownRounds_test.go
@@ -1,6 +1,7 @@
 package utility
 
 import (
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/client/storage/versioned"
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/elixxir/primitives/knownRounds"
@@ -13,14 +14,15 @@ import (
 func TestNewKnownRounds(t *testing.T) {
 	// Set up expected value
 	size := 10
+	rootKv := versioned.NewKV(make(ekv.Memstore))
 	expectedKR := &KnownRounds{
 		rounds: knownRounds.NewKnownRound(size),
-		kv:     versioned.NewKV(make(ekv.Memstore)),
+		kv:     rootKv.Prefix(knownRoundsPrefix),
 		key:    "testKey",
 	}
 
 	// Create new KnownRounds
-	kr, err := NewKnownRounds(expectedKR.kv, expectedKR.key, size)
+	kr, err := NewKnownRounds(rootKv, expectedKR.key, size)
 	if err != nil {
 		t.Errorf("NewKnownRounds() returned an error."+
 			"\n\texpected: %v\n\treceived: %v", nil, err)
@@ -28,17 +30,19 @@ func TestNewKnownRounds(t *testing.T) {
 
 	if !reflect.DeepEqual(expectedKR, kr) {
 		t.Errorf("NewKnownRounds() returned an incorrect KnownRounds."+
-			"\n\texpected: %v\n\treceived: %v", expectedKR, kr)
+			"\n\texpected: %+v\n\treceived: %+v", expectedKR, kr)
 	}
 }
 
 // Tests happy path of LoadKnownRounds.
 func TestLoadKnownRounds(t *testing.T) {
+	jww.SetStdoutThreshold(jww.LevelTrace)
 	// Set up expected value
 	size := 10
+	rootKv := versioned.NewKV(make(ekv.Memstore))
 	expectedKR := &KnownRounds{
 		rounds: knownRounds.NewKnownRound(size),
-		kv:     versioned.NewKV(make(ekv.Memstore)),
+		kv:     rootKv.Prefix(knownRoundsPrefix),
 		key:    "testKey",
 	}
 
@@ -53,7 +57,7 @@ func TestLoadKnownRounds(t *testing.T) {
 		t.Fatalf("Error saving KnownRounds: %v", err)
 	}
 
-	kr, err := LoadKnownRounds(expectedKR.kv, expectedKR.key, size)
+	kr, err := LoadKnownRounds(rootKv, expectedKR.key, size)
 	if err != nil {
 		t.Errorf("LoadKnownRounds() returned an error."+
 			"\n\texpected: %v\n\treceived: %v", nil, err)
@@ -94,7 +98,7 @@ func TestKnownRounds_save(t *testing.T) {
 		t.Errorf("save() returned an error: %v", err)
 	}
 
-	obj, err := expectedKR.kv.Get(makeKnownRoundsSubKey(expectedKR.key))
+	obj, err := expectedKR.kv.Get(expectedKR.key)
 	if err != nil {
 		t.Errorf("Get() returned an error: %v", err)
 	}
diff --git a/storage/versioned/kv.go b/storage/versioned/kv.go
index 3e0fb42ee476abe684af619f3f5be8239eccdb76..cb13324783388d4fe6292ed696ed9027e79934cf 100644
--- a/storage/versioned/kv.go
+++ b/storage/versioned/kv.go
@@ -8,8 +8,9 @@ package versioned
 
 import (
 	"fmt"
-	"gitlab.com/elixxir/client/globals"
+	jww "github.com/spf13/jwalterweatherman"
 	"gitlab.com/elixxir/ekv"
+	"gitlab.com/xx_network/primitives/id"
 	"strings"
 )
 
@@ -21,6 +22,12 @@ func MakeKeyWithPrefix(dataType string, uniqueID string) string {
 	return fmt.Sprintf("%s%s%s", dataType, PrefixSeparator, uniqueID)
 }
 
+// MakePartnerPrefix creates a string prefix
+// to denote who a conversation or relationship is with
+func MakePartnerPrefix(id *id.ID) string {
+	return fmt.Sprintf("Partner:%v", id.String())
+}
+
 // Upgrade functions must be of this type
 type Upgrade func(key string, oldObject *Object) (*Object,
 	error)
@@ -74,9 +81,9 @@ func NewKV(data ekv.KeyValue) *KV {
 // Make sure to inspect the version returned in the versioned object
 func (v *KV) Get(key string) (*Object, error) {
 	key = v.prefix + key
+	jww.TRACE.Printf("Get %p with key %v", v.r.data, key)
 	// Get raw data
 	result := Object{}
-	globals.Log.TRACE.Println("getting key", key, "in", v.r.data)
 	err := v.r.data.Get(key, &result)
 	if err != nil {
 		return nil, err
@@ -98,6 +105,7 @@ func (v *KV) Get(key string) (*Object, error) {
 // Delete removes a given key from the data store
 func (v *KV) Delete(key string) error {
 	key = v.prefix + key
+	jww.TRACE.Printf("Delete %p with key %v", v.r.data, key)
 	return v.r.data.Delete(key)
 }
 
@@ -106,7 +114,7 @@ func (v *KV) Delete(key string) error {
 // type optionally unique id! Call MakeKeyWithPrefix() to do so.
 func (v *KV) Set(key string, object *Object) error {
 	key = v.prefix + key
-	globals.Log.TRACE.Println("setting key", key, "in", v.r.data)
+	jww.TRACE.Printf("Set %p with key %v", v.r.data, key)
 	return v.r.data.Set(key, object)
 }