diff --git a/pkg/local_object_storage/metabase/control.go b/pkg/local_object_storage/metabase/control.go
index 6ae695868..25cd5ae63 100644
--- a/pkg/local_object_storage/metabase/control.go
+++ b/pkg/local_object_storage/metabase/control.go
@@ -83,8 +83,6 @@ func (db *DB) init(reset bool) error {
 		string(shardInfoBucket):           {},
 	}
 
-	epoch := db.epochState.CurrentEpoch()
-
 	return db.boltDB.Update(func(tx *bbolt.Tx) error {
 		var err error
 		if !reset {
@@ -108,7 +106,7 @@ func (db *DB) init(reset bool) error {
 		}
 
 		if !reset {
-			err = syncCounter(tx, epoch, false)
+			err = syncCounter(tx, false)
 			if err != nil {
 				return fmt.Errorf("could not sync object counter: %w", err)
 			}
@@ -132,10 +130,8 @@ func (db *DB) init(reset bool) error {
 
 // SyncCounters forces to synchronize the object counters.
 func (db *DB) SyncCounters() error {
-	epoch := db.epochState.CurrentEpoch()
-
 	return db.boltDB.Update(func(tx *bbolt.Tx) error {
-		return syncCounter(tx, epoch, true)
+		return syncCounter(tx, true)
 	})
 }
 
diff --git a/pkg/local_object_storage/metabase/counter.go b/pkg/local_object_storage/metabase/counter.go
index dbb723806..0ab1d9805 100644
--- a/pkg/local_object_storage/metabase/counter.go
+++ b/pkg/local_object_storage/metabase/counter.go
@@ -108,7 +108,7 @@ func (db *DB) updateCounter(tx *bbolt.Tx, typ objectType, delta uint64, inc bool
 //
 // Does nothing if counters are not empty and force is false. If force is
 // true, updates the counters anyway.
-func syncCounter(tx *bbolt.Tx, epoch uint64, force bool) error {
+func syncCounter(tx *bbolt.Tx, force bool) error {
 	b, err := tx.CreateBucketIfNotExists(shardInfoBucket)
 	if err != nil {
 		return fmt.Errorf("could not get shard info bucket: %w", err)
@@ -123,13 +123,18 @@ func syncCounter(tx *bbolt.Tx, epoch uint64, force bool) error {
 	var phyCounter uint64
 	var logicCounter uint64
 
+	graveyardBKT := tx.Bucket(graveyardBucketName)
+	garbageBKT := tx.Bucket(garbageBucketName)
+
 	err = iteratePhyObjects(tx, func(cnr cid.ID, obj oid.ID) error {
 		phyCounter++
 
 		addr.SetContainer(cnr)
 		addr.SetObject(obj)
 
-		if st := objectStatus(tx, addr, epoch); st == 0 || st == 3 {
+		// check if an object is available: not with GCMark
+		// and not covered with a tombstone
+		if inGraveyardWithKey(addressKey(addr), graveyardBKT, garbageBKT) == 0 {
 			logicCounter++
 		}