diff --git a/network/dataStructures/roundData.go b/network/dataStructures/roundData.go
index 986ab960adcc0e32a7c77296b946a33a9d3f3cda..2c98af73e904eeb2ab005bf67bee77c5f8596fb2 100644
--- a/network/dataStructures/roundData.go
+++ b/network/dataStructures/roundData.go
@@ -57,3 +57,8 @@ func (d *Data) GetRound(id int) (*mixmessages.RoundInfo, error) {
 func (d *Data) GetLastRoundID() id.Round {
 	return id.Round(d.rounds.GetNewestId())
 }
+
+// Gets the ID of the oldest roundd in the buffer
+func (d *Data) GetOldestRoundID() id.Round  {
+	return id.Round(d.rounds.GetOldestId())
+}
diff --git a/network/instance.go b/network/instance.go
index ae67a6061c603fe68819f3cdcdadbc934824089c..2891bed0416c3520e6d3caf139e3bb2fccc14db6 100644
--- a/network/instance.go
+++ b/network/instance.go
@@ -519,6 +519,11 @@ func (i *Instance) GetLastRoundID() id.Round {
 	return i.roundData.GetLastRoundID() - 1
 }
 
+// Get the oldest round id
+func (i *Instance) GetOldestRoundID() id.Round  {
+	return i.roundData.GetOldestRoundID()
+}
+
 // Update gateway hosts based on most complete ndf
 func (i *Instance) UpdateGatewayConnections() error {
 	if i.full != nil {
diff --git a/network/instance_test.go b/network/instance_test.go
index 80f5563a925aba1cf62ae6d12492ec36c3bbce5c..a5c9d5fade400f0acda93ce84be7f638472d7de9 100644
--- a/network/instance_test.go
+++ b/network/instance_test.go
@@ -316,6 +316,49 @@ func TestInstance_GetLastUpdateID(t *testing.T) {
 	i.GetLastUpdateID()
 }
 
+func TestInstance_GetOldestRoundID(t *testing.T) {
+	i := Instance{
+		roundData: ds.NewData(),
+	}
+
+	expectedOldRound := id.Round(0)
+	_ = i.roundData.UpsertRound(&mixmessages.RoundInfo{ID: uint64(expectedOldRound)})
+	_ = i.roundData.UpsertRound(&mixmessages.RoundInfo{ID:uint64(2)})
+
+
+	returned := i.GetOldestRoundID()
+	if returned != expectedOldRound {
+		t.Errorf("Failed to get oldest round from buffer." +
+			"\n\tExpected: %v" +
+			"\n\tReceived: %v", expectedOldRound, returned)
+	}
+}
+
+// Test which forces a full buffer, causing overwriting of old rounds
+func TestInstance_GetOldestRoundID_ManyRounds(t *testing.T) {
+	testInstance := Instance{
+		roundData: ds.NewData(),
+	}
+
+	// Ensure a circle back in the round buffer
+	for i := 1; i <= ds.RoundInfoBufLen ; i++ {
+		_ = testInstance.roundData.UpsertRound(&mixmessages.RoundInfo{ID: uint64(i)})
+
+	}
+
+	// This will have oldest round as 0, until we reach RoundInfoBufLen, then
+	// round 0 will be overwritten by the newest round,
+	// moving the oldest round to round 1
+	expected := id.Round(1)
+	returned := testInstance.GetOldestRoundID()
+	if returned !=  expected {
+		t.Errorf("Failed to get oldest round from buffer." +
+			"\n\tExpected: %v" +
+			"\n\tReceived: %v", 1, returned)
+	}
+}
+
+
 func TestInstance_UpdateGatewayConnections(t *testing.T) {
 	secured, _ := NewSecuredNdf(testutils.NDF)
 	testManager := connect.NewManagerTesting(t)