diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala
index f649ba6a6ea3cd2939f56e2b33a83fb06f67a67b..0e4c459682f4a1604bef496616f695e17d4fd72e 100644
--- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala
+++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala
@@ -1,5 +1,6 @@
 package acab.devcon0
 package domain.service
+import java.time.Duration
 import java.time.Instant
 
 import acab.devcon0.domain.dtos.IpfsCidType.Empty
@@ -7,13 +8,28 @@ import acab.devcon0.domain.dtos.IpfsCidType.File
 import acab.devcon0.domain.dtos.IpfsCidType.Folder
 import acab.devcon0.domain.dtos._
 import acab.devcon0.domain.ports.output.client.IpfsClient
+import acab.devcon0.output.repository.ipfscid.FlatRepository
 import acab.devcon0.trile.domain.dtos.aliases.IpfsCid
 import cats.effect._
 import cats.implicits._
+import org.typelevel.log4cats.Logger
+import org.typelevel.log4cats.slf4j.Slf4jLogger
+
+class IpfsServiceImpl(ipfsClient: IpfsClient, flatRepository: FlatRepository) extends IpfsService {
+
+  private val logger: Logger[IO] = Slf4jLogger.getLogger[IO]
 
-class IpfsServiceImpl(ipfsClient: IpfsClient) extends IpfsService {
   override def lsFileTree(ipfsCid: IpfsCid): IO[IpfsCidDto] = {
-    getIpfsCidDto(Left(ipfsCid))
+    for
+      startTimestamp <- IO(Instant.now())
+      dtoList        <- getIpfsCidDto(Left(ipfsCid))
+      endTimestamp   <- IO(Instant.now())
+      _              <- logDuration(startTimestamp, endTimestamp)
+    yield dtoList
+  }
+
+  private def logDuration(startTimestamp: Instant, endTimestamp: Instant): IO[Unit] = {
+    logger.info(s"label=file-tree, duration=${Duration.between(startTimestamp, endTimestamp).toSeconds}(s)")
   }
 
   private def ipfsClientLs(ipfsCid: IpfsCid): IO[IpfsLsResponse] = {
@@ -59,8 +75,23 @@ class IpfsServiceImpl(ipfsClient: IpfsClient) extends IpfsService {
 
   private def getIpfsCidDto(eitherCidOrLink: Either[IpfsCid, IpfsLsLinkResponse]): IO[IpfsCidDto] = {
     eitherCidOrLink match
-      case Left(ipfsCid) => ipfsClientLs(ipfsCid).flatMap(buildIpfsCidDto(_, None))
-      case Right(link)   => ipfsClientLs(link.hash).flatMap(buildIpfsCidDto(_, Some(link)))
+      case Left(ipfsCid) =>
+        flatRepository
+          .get(ipfsCid)
+          .flatMap(maybeCacheHit => {
+            maybeCacheHit match
+              case Some(value) => IO(value)
+              case None        => ipfsClientLs(ipfsCid).flatMap(buildIpfsCidDto(_, None))
+          })
+      case Right(link) => {
+        flatRepository
+          .get(link.hash)
+          .flatMap(maybeCacheHit => {
+            maybeCacheHit match
+              case Some(value) => IO(value)
+              case None        => ipfsClientLs(link.hash).flatMap(buildIpfsCidDto(_, Some(link)))
+          })
+      }
   }
 
   private def getIpfsCidDtos(links: List[IpfsLsLinkResponse]): IO[List[IpfsCidDto]] = {