diff --git a/VERSION b/VERSION
index ab0fa33..4d5e528 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-5.0.5
+5.0.6
\ No newline at end of file
diff --git a/pkg/ponresourcemanager/ponresourcemanager.go b/pkg/ponresourcemanager/ponresourcemanager.go
index 804a6f3..a8738ee 100755
--- a/pkg/ponresourcemanager/ponresourcemanager.go
+++ b/pkg/ponresourcemanager/ponresourcemanager.go
@@ -1263,12 +1263,10 @@
 	*/
 	ByteArray, err := ToByte(Resource[POOL])
 	if err != nil {
-		logger.Error(ctx, "Failed to convert resource to byte array")
 		return 0, err
 	}
 	Data := bitmap.TSFromData(ByteArray, false)
 	if Data == nil {
-		logger.Error(ctx, "Failed to get data from byte array")
 		return 0, errors.New("Failed to get data from byte array")
 	}
 
@@ -1279,6 +1277,9 @@
 			break
 		}
 	}
+	if Idx == Len {
+		return 0, errors.New("resource-exhausted--no-free-id-in-the-pool")
+	}
 	Data.Set(Idx, true)
 	res := uint32(Resource[START_IDX].(float64))
 	Resource[POOL] = Data.Data(false)
@@ -1303,6 +1304,10 @@
 		return false
 	}
 	Idx := Id - uint32(Resource[START_IDX].(float64))
+	if Idx >= uint32(Data.Len()) {
+		logger.Errorf(ctx, "ID %d is out of the boundaries of the pool", Id)
+		return false
+	}
 	Data.Set(int(Idx), false)
 	Resource[POOL] = Data.Data(false)
 
@@ -1320,6 +1325,10 @@
 		return false
 	}
 	Idx := Id - StartIndex
+	if Idx >= uint32(Data.Len()) {
+		logger.Errorf(ctx, "Reservation failed. ID %d is out of the boundaries of the pool", Id)
+		return false
+	}
 	Data.Set(int(Idx), true)
 	return true
 }
diff --git a/pkg/ponresourcemanager/ponresourcemanager_test.go b/pkg/ponresourcemanager/ponresourcemanager_test.go
index 9363735..845c9d8 100644
--- a/pkg/ponresourcemanager/ponresourcemanager_test.go
+++ b/pkg/ponresourcemanager/ponresourcemanager_test.go
@@ -20,6 +20,7 @@
 	"context"
 	"encoding/json"
 	"errors"
+	"github.com/boljen/go-bitmap"
 	"github.com/opencord/voltha-lib-go/v5/pkg/db"
 	"github.com/opencord/voltha-lib-go/v5/pkg/db/kvstore"
 	"github.com/opencord/voltha-lib-go/v5/pkg/log"
@@ -202,3 +203,155 @@
 	}
 
 }
+
+func TestResourcePoolOverflow(t *testing.T) {
+	ctx := context.Background()
+	PONRMgr, err := NewPONResourceManager(ctx, "gpon", "onu", "olt1",
+		"etcd", "1:1", "service/voltha")
+	if err != nil {
+		return
+	}
+	PONRMgr.KVStore = &db.Backend{
+		Client: newMockKvClient(ctx),
+	}
+
+	PONRMgr.KVStoreForConfig = &db.Backend{
+		Client: newMockKvClient(ctx),
+	}
+	// create a pool in the range of [1,16]
+	StartIndex := uint32(1)
+	EndIndex := uint32(16)
+
+	FormatResult, err := PONRMgr.FormatResource(ctx, 1, StartIndex, EndIndex, []uint32{})
+	if err != nil {
+		t.Error("Failed to format resource", err)
+		return
+	}
+
+	// Add resource as json in kv store.
+	err = PONRMgr.KVStore.Put(ctx, GEMPORT_ID_POOL_PATH, FormatResult)
+	if err != nil {
+		t.Error("Error in posting data to kv store", GEMPORT_ID_POOL_PATH)
+		return
+	}
+
+	for i := 1; i <= 20; i++ {
+		// get gem port id pool from the kv store
+		resource, err := PONRMgr.GetResource(context.Background(), GEMPORT_ID_POOL_PATH)
+		if err != nil {
+			t.Error("Failed to get resource from gem port id pool", err)
+			return
+		}
+		// get a gem port id from the pool
+		nextID, err := PONRMgr.GenerateNextID(ctx, resource)
+		// all free ids in the pool will be consumed by the first 16 steps of the loop
+		// resource-exhausted error is expected from the pool at the 17th step of the loop
+		if i > int(EndIndex) {
+			assert.NotNil(t, err)
+		} else if err != nil {
+			t.Error("Failed to get gem port id from the pool", err)
+			return
+		} else {
+			assert.NotEqual(t, 0, nextID)
+			// put updated gem port id pool into the kv store
+			err = PONRMgr.UpdateResource(context.Background(), GEMPORT_ID_POOL_PATH, resource)
+			if err != nil {
+				t.Error("Failed to put updated gem port id pool into the kv store", err)
+				return
+			}
+		}
+	}
+}
+
+func TestPONResourceManager_ReleaseInvalidID(t *testing.T) {
+	ctx := context.Background()
+	PONRMgr, err := NewPONResourceManager(ctx, "gpon", "onu", "olt1",
+		"etcd", "1:1", "service/voltha")
+	if err != nil {
+		return
+	}
+	PONRMgr.KVStore = &db.Backend{
+		Client: newMockKvClient(ctx),
+	}
+
+	PONRMgr.KVStoreForConfig = &db.Backend{
+		Client: newMockKvClient(ctx),
+	}
+	// create a pool in the range of [1,16]
+	StartIndex := uint32(1)
+	EndIndex := uint32(16)
+
+	FormatResult, err := PONRMgr.FormatResource(ctx, 1, StartIndex, EndIndex, []uint32{})
+	if err != nil {
+		t.Error("Failed to format resource", err)
+		return
+	}
+
+	// Add resource as json in kv store.
+	err = PONRMgr.KVStore.Put(ctx, GEMPORT_ID_POOL_PATH, FormatResult)
+	if err != nil {
+		t.Error("Error in posting data to kv store", GEMPORT_ID_POOL_PATH)
+		return
+	}
+
+	// get gem port id pool from the kv store
+	resource, err := PONRMgr.GetResource(context.Background(), GEMPORT_ID_POOL_PATH)
+	if err != nil {
+		t.Error("Failed to get resource from gem port id pool", err)
+		return
+	}
+	//try to release an ID whose value is out of the boundaries of the pool and expect false
+	released := PONRMgr.ReleaseID(ctx, resource, uint32(EndIndex+1))
+	assert.Equal(t, false, released)
+}
+
+func TestPONResourceManager_ReserveInvalidID(t *testing.T) {
+	ctx := context.Background()
+	PONRMgr, err := NewPONResourceManager(ctx, "gpon", "onu", "olt1",
+		"etcd", "1:1", "service/voltha")
+	if err != nil {
+		return
+	}
+	PONRMgr.KVStore = &db.Backend{
+		Client: newMockKvClient(ctx),
+	}
+
+	PONRMgr.KVStoreForConfig = &db.Backend{
+		Client: newMockKvClient(ctx),
+	}
+	// create a pool in the range of [1,16]
+	StartIndex := uint32(1)
+	EndIndex := uint32(16)
+
+	FormatResult, err := PONRMgr.FormatResource(ctx, 1, StartIndex, EndIndex, []uint32{})
+	if err != nil {
+		t.Error("Failed to format resource", err)
+		return
+	}
+
+	// Add resource as json in kv store.
+	err = PONRMgr.KVStore.Put(ctx, GEMPORT_ID_POOL_PATH, FormatResult)
+	if err != nil {
+		t.Error("Error in posting data to kv store", GEMPORT_ID_POOL_PATH)
+		return
+	}
+	// get gem port id pool from the kv store
+	resource, err := PONRMgr.GetResource(context.Background(), GEMPORT_ID_POOL_PATH)
+	if err != nil {
+		t.Error("Failed to get resource from gem port id pool", err)
+		return
+	}
+	ByteArray, err := ToByte(resource[POOL])
+	if err != nil {
+		t.Error(ctx, "Failed to convert resource to byte array")
+		return
+	}
+	Data := bitmap.TSFromData(ByteArray, false)
+	if Data == nil {
+		t.Error(ctx, "Failed to get resource pool")
+		return
+	}
+	//try to reserve an ID whose value is out of the boundaries of the pool and expect false
+	reserved := PONRMgr.reserveID(ctx, Data, StartIndex, EndIndex+1)
+	assert.Equal(t, false, reserved)
+}
