diff --git a/network/rounds/remoteFilters.go b/network/rounds/remoteFilters.go
index e2a225632c088a9082a63ed08367b90114f80a50..7a434be073e51118d22adae682c27d2e3ad83b50 100644
--- a/network/rounds/remoteFilters.go
+++ b/network/rounds/remoteFilters.go
@@ -1,3 +1,10 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright © 2020 xx network SEZC                                          //
+//                                                                           //
+// Use of this source code is governed by a license that can be found in the //
+// LICENSE file                                                              //
+///////////////////////////////////////////////////////////////////////////////
+
 package rounds
 
 import (
diff --git a/network/rounds/remoteFilters_test.go b/network/rounds/remoteFilters_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..5a5e381e0b8bc24140a2e9dc5686b8ff81f00ddc
--- /dev/null
+++ b/network/rounds/remoteFilters_test.go
@@ -0,0 +1,202 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright © 2020 xx network SEZC                                          //
+//                                                                           //
+// Use of this source code is governed by a license that can be found in the //
+// LICENSE file                                                              //
+///////////////////////////////////////////////////////////////////////////////
+
+package rounds
+
+import (
+	bloom "gitlab.com/elixxir/bloomfilter"
+	"gitlab.com/elixxir/client/interfaces"
+	"gitlab.com/elixxir/client/storage/reception"
+	"gitlab.com/elixxir/comms/mixmessages"
+	"gitlab.com/xx_network/primitives/id"
+	"gitlab.com/xx_network/primitives/id/ephemeral"
+	"reflect"
+	"testing"
+	"time"
+)
+
+// Unit test NewRemoteFilter
+func TestNewRemoteFilter(t *testing.T) {
+	bloomFilter := &mixmessages.ClientBloom{
+		Filter:     nil,
+		FirstRound: 0,
+		RoundRange: 0,
+	}
+
+	rf := NewRemoteFilter(bloomFilter)
+	if !reflect.DeepEqual(rf.data, bloomFilter) {
+		t.Fatalf("NewRemoteFilter() error: "+
+			"RemoteFilter not initialized as expected."+
+			"\n\tExpected: %v\n\tReceived: %v", bloomFilter, rf.data)
+	}
+}
+
+// Unit test GetFilter
+func TestRemoteFilter_GetFilter(t *testing.T) {
+	testFilter, err := bloom.InitByParameters(interfaces.BloomFilterSize,
+		interfaces.BloomFilterHashes)
+	if err != nil {
+		t.Fatalf("GetFilter error: " +
+			"Cannot initialize bloom filter for setup: %v", err)
+	}
+
+	data, err := testFilter.MarshalBinary()
+	if err != nil {
+		t.Fatalf("GetFilter error: " +
+			"Cannot marshal filter for setup: %v", err)
+	}
+
+	bloomFilter := &mixmessages.ClientBloom{
+		Filter:     data,
+		FirstRound: 0,
+		RoundRange: 0,
+	}
+
+	rf := NewRemoteFilter(bloomFilter)
+	retrievedFilter := rf.GetFilter()
+	if !reflect.DeepEqual(retrievedFilter, testFilter) {
+		t.Fatalf("GetFilter error: " +
+			"Did not retrieve expected filter." +
+			"\n\tExpected: %v\n\tReceived: %v", testFilter, retrievedFilter)
+	}
+}
+
+// Unit test fro FirstRound and LastRound
+func TestRemoteFilter_FirstLastRound(t *testing.T) {
+	firstRound := uint64(25)
+	roundRange := uint32(75)
+	bloomFilter := &mixmessages.ClientBloom{
+		Filter:     nil,
+		FirstRound: firstRound,
+		RoundRange: roundRange,
+	}
+	rf := NewRemoteFilter(bloomFilter)
+
+	// Test FirstRound
+	receivedFirstRound := rf.FirstRound()
+	if receivedFirstRound != id.Round(firstRound) {
+		t.Fatalf("FirstRound error: " +
+			"Did not receive expected round." +
+			"\n\tExpected: %v\n\tReceived: %v", firstRound, receivedFirstRound)
+	}
+
+	// Test LastRound
+	receivedLastRound := rf.LastRound()
+	if receivedLastRound != id.Round(firstRound + uint64(roundRange)) {
+		t.Fatalf("LastRound error: " +
+			"Did not receive expected round." +
+			"\n\tExpected: %v\n\tReceived: %v", receivedLastRound, firstRound + uint64(roundRange))
+	}
+
+}
+
+// In bounds test
+func TestValidFilterRange(t *testing.T) {
+	firstRound := uint64(25)
+	roundRange := uint32(75)
+	testFilter, err := bloom.InitByParameters(interfaces.BloomFilterSize,
+		interfaces.BloomFilterHashes)
+	if err != nil {
+		t.Fatalf("GetFilter error: " +
+			"Cannot initialize bloom filter for setup: %v", err)
+	}
+
+	data, err := testFilter.MarshalBinary()
+	if err != nil {
+		t.Fatalf("GetFilter error: " +
+			"Cannot marshal filter for setup: %v", err)
+	}
+
+	// Construct an in bounds value
+	expectedEphID := ephemeral.Id{1, 2, 3, 4, 5, 6, 7, 8}
+	requestGateway := id.NewIdFromString(ReturningGateway, id.Gateway, t)
+	iu := reception.IdentityUse{
+		Identity: reception.Identity{
+			EphId:  expectedEphID,
+			Source: requestGateway,
+			StartValid: time.Now().Add(12*time.Hour),
+			EndValid: time.Now().Add(24*time.Hour),
+		},
+	}
+
+
+	bloomFilter := &mixmessages.ClientBloom{
+		Filter:     data,
+		FirstRound: firstRound,
+		RoundRange: roundRange,
+	}
+
+	msg := &mixmessages.ClientBlooms{
+		Period: int64(12 * time.Hour ),
+		FirstTimestamp: time.Now().UnixNano(),
+		Filters: []*mixmessages.ClientBloom{bloomFilter},
+	}
+
+	start, end, outOfBounds := ValidFilterRange(iu, msg)
+	if outOfBounds {
+		t.Errorf("ValidFilterRange error: " +
+			"Range should not be out of bounds")
+	}
+
+	if start != 0 && end != 1 {
+		t.Errorf("ValidFilterRange error: " +
+			"Unexpected indices returned. " +
+			"\n\tExpected start: %v\n\tReceived start: %v" +
+			"\n\tExpected end: %v\n\tReceived end: %v", 0, start, 1, end)
+	}
+
+}
+
+// out of bounds test
+func TestValidFilterRange_OutBounds(t *testing.T) {
+	firstRound := uint64(25)
+	roundRange := uint32(75)
+	testFilter, err := bloom.InitByParameters(interfaces.BloomFilterSize,
+		interfaces.BloomFilterHashes)
+	if err != nil {
+		t.Fatalf("GetFilter error: " +
+			"Cannot initialize bloom filter for setup: %v", err)
+	}
+
+	data, err := testFilter.MarshalBinary()
+	if err != nil {
+		t.Fatalf("GetFilter error: " +
+			"Cannot marshal filter for setup: %v", err)
+	}
+
+	// Construct an in bounds value
+	expectedEphID := ephemeral.Id{1, 2, 3, 4, 5, 6, 7, 8}
+	requestGateway := id.NewIdFromString(ReturningGateway, id.Gateway, t)
+	iu := reception.IdentityUse{
+		Identity: reception.Identity{
+			EphId:  expectedEphID,
+			Source: requestGateway,
+			StartValid: time.Now().Add(-24*time.Hour),
+			EndValid: time.Now().Add(-36*time.Hour),
+		},
+	}
+
+
+	bloomFilter := &mixmessages.ClientBloom{
+		Filter:     data,
+		FirstRound: firstRound,
+		RoundRange: roundRange,
+	}
+
+	msg := &mixmessages.ClientBlooms{
+		Period: int64(12 * time.Hour ),
+		FirstTimestamp: time.Now().UnixNano(),
+		Filters: []*mixmessages.ClientBloom{bloomFilter},
+	}
+
+	_, _, outOfBounds := ValidFilterRange(iu, msg)
+	if !outOfBounds {
+		t.Errorf("ValidFilterRange error: " +
+			"Range should be out of bounds")
+	}
+
+}
\ No newline at end of file
diff --git a/storage/ndf_test.go b/storage/ndf_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..82be0547ed04672ecc607b84eae202ce663dfdfb
--- /dev/null
+++ b/storage/ndf_test.go
@@ -0,0 +1 @@
+package storage