diff --git a/storage/ndf.go b/storage/ndf.go
new file mode 100644
index 0000000000000000000000000000000000000000..f92336de562a1a439d9884ed2f96083e940dbd2a
--- /dev/null
+++ b/storage/ndf.go
@@ -0,0 +1,30 @@
+package storage
+
+import (
+	jww "github.com/spf13/jwalterweatherman"
+	"gitlab.com/elixxir/client/storage/utility"
+	"gitlab.com/xx_network/primitives/ndf"
+)
+
+const baseNdfKey = "baseNdf"
+
+func (s *Session) SetBaseNDF(def *ndf.NetworkDefinition) {
+	err := utility.SaveNDF(s.kv, baseNdfKey, def)
+	if err != nil {
+		jww.FATAL.Printf("Failed to dave the base NDF: %s", err)
+	}
+	s.baseNdf = def
+}
+
+func (s *Session) GetBaseNDF() *ndf.NetworkDefinition {
+	if s.baseNdf != nil {
+		return s.baseNdf
+	}
+	def, err := utility.LoadNDF(s.kv, baseNdfKey)
+	if err != nil {
+		jww.FATAL.Printf("Could not load the base NDF: %s", err)
+	}
+
+	s.baseNdf = def
+	return def
+}
diff --git a/storage/session.go b/storage/session.go
index 3a9c8f51d77e39e5b825d1b3637b1e9869c76d41..9e6427e87c83e244a63163150af32d2a40716fb3 100644
--- a/storage/session.go
+++ b/storage/session.go
@@ -24,6 +24,7 @@ import (
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/xx_network/crypto/signature/rsa"
 	"gitlab.com/xx_network/primitives/id"
+	"gitlab.com/xx_network/primitives/ndf"
 	"sync"
 	"testing"
 )
@@ -36,7 +37,9 @@ type Session struct {
 	kv  *versioned.KV
 	mux sync.RWMutex
 
+	//memoized data
 	regStatus RegistrationStatus
+	baseNdf   *ndf.NetworkDefinition
 
 	//sub-stores
 	e2e              *e2e.Store
diff --git a/storage/utility/NDF.go b/storage/utility/NDF.go
new file mode 100644
index 0000000000000000000000000000000000000000..be827bee86fa84bd151eb459d3b95c65b11872a9
--- /dev/null
+++ b/storage/utility/NDF.go
@@ -0,0 +1,40 @@
+package utility
+
+import (
+	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/xx_network/primitives/ndf"
+	"time"
+)
+
+const currentNDFVersion = 0
+
+func LoadNDF(kv *versioned.KV, key string) (*ndf.NetworkDefinition, error) {
+	vo, err := kv.Get(key)
+	if err != nil {
+		return nil, err
+	}
+
+	ndf, _, err := ndf.DecodeNDF(string(vo.Data))
+	if err != nil {
+		return nil, err
+	}
+
+	return ndf, err
+}
+
+func SaveNDF(kv *versioned.KV, key string, ndf *ndf.NetworkDefinition) error {
+	marshaled, err := ndf.Marshal()
+	if err != nil {
+		return err
+	}
+
+	now := time.Now()
+
+	obj := versioned.Object{
+		Version:   currentNDFVersion,
+		Timestamp: now,
+		Data:      marshaled,
+	}
+
+	return kv.Set(key, &obj)
+}