diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp
index 554209133285417112b5462956a412a301384eaa..afa3f71833dbf5f9f5e686919703e396c49089f2 100644
--- a/catalogue/Catalogue.hpp
+++ b/catalogue/Catalogue.hpp
@@ -165,7 +165,8 @@ public:
   virtual std::list<cta::common::dataStructures::ArchiveFile> getArchiveFiles(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0;
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
-   const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0;
+   const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) = 0;  
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id) = 0;
   
   virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force) = 0;
 
diff --git a/catalogue/DummyCatalogue.cpp b/catalogue/DummyCatalogue.cpp
index 7cc94f41683e6e474a28dde190f6fe1b99d96d05..ece8e431bb0c2b1bb2aec9cb546f48959823d58a 100644
--- a/catalogue/DummyCatalogue.cpp
+++ b/catalogue/DummyCatalogue.cpp
@@ -405,6 +405,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::catalogue::DummyCatalogue::
         const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) {
   return cta::common::dataStructures::ArchiveFileSummary(); 
 }
+
+//------------------------------------------------------------------------------
+// getArchiveFileById
+//------------------------------------------------------------------------------
+cta::common::dataStructures::ArchiveFile cta::catalogue::DummyCatalogue::getArchiveFileById(const std::string &id){
+  return cta::common::dataStructures::ArchiveFile();
+}
           
 //------------------------------------------------------------------------------
 // setDriveStatus
diff --git a/catalogue/DummyCatalogue.hpp b/catalogue/DummyCatalogue.hpp
index 242e8f47b3492acb3d81de60a030ba7f243fac54..2522e9d7a97f0259904f7eddbd018a64bf7eb187 100644
--- a/catalogue/DummyCatalogue.hpp
+++ b/catalogue/DummyCatalogue.hpp
@@ -138,6 +138,7 @@ public:
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id);
   
   virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force);
   /**
diff --git a/catalogue/MockCatalogue.cpp b/catalogue/MockCatalogue.cpp
index 4134a292cccfc9c8f08fb91f626d6b0ff6f19653..f6bb5da571e82e0c99505504e12af4476761ac69 100644
--- a/catalogue/MockCatalogue.cpp
+++ b/catalogue/MockCatalogue.cpp
@@ -405,6 +405,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::catalogue::MockCatalogue::g
         const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path) {
   return cta::common::dataStructures::ArchiveFileSummary(); 
 }
+
+//------------------------------------------------------------------------------
+// getArchiveFileById
+//------------------------------------------------------------------------------
+cta::common::dataStructures::ArchiveFile cta::catalogue::MockCatalogue::getArchiveFileById(const std::string &id){
+  return cta::common::dataStructures::ArchiveFile();
+}
           
 //------------------------------------------------------------------------------
 // setDriveStatus
diff --git a/catalogue/MockCatalogue.hpp b/catalogue/MockCatalogue.hpp
index 7958136b8a04d8c15e4d676c6c22b903bb042cbc..528a7862ae8c2587178005818759941b1fb1b16b 100644
--- a/catalogue/MockCatalogue.hpp
+++ b/catalogue/MockCatalogue.hpp
@@ -138,6 +138,7 @@ public:
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id);
   
   virtual void setDriveStatus(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const bool up, const bool force);
   /**
diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp
index ea18e726e521e44ab5aa73e535e8fcbef1a58afa..8230d4ae55b96dfc383ce8b262b5ee837640b6c8 100644
--- a/scheduler/Scheduler.cpp
+++ b/scheduler/Scheduler.cpp
@@ -658,6 +658,13 @@ cta::common::dataStructures::ArchiveFileSummary cta::Scheduler::getArchiveFileSu
   return cta::common::dataStructures::ArchiveFileSummary(); 
 }
 
+//------------------------------------------------------------------------------
+// getArchiveFileById
+//------------------------------------------------------------------------------
+cta::common::dataStructures::ArchiveFile cta::Scheduler::getArchiveFileById(const std::string &id){
+  return cta::common::dataStructures::ArchiveFile();
+}
+
 //------------------------------------------------------------------------------
 // readTest
 //------------------------------------------------------------------------------
diff --git a/scheduler/Scheduler.hpp b/scheduler/Scheduler.hpp
index df2f6569a21965d02d465482c460ed32160cdf54..543b0f3243349a3dd85524f5b81b558f6b71beb4 100644
--- a/scheduler/Scheduler.hpp
+++ b/scheduler/Scheduler.hpp
@@ -210,6 +210,7 @@ public:
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
   virtual cta::common::dataStructures::ArchiveFileSummary getArchiveFileSummary(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &id, const std::string &eosid,
    const std::string &copynb, const std::string &tapepool, const std::string &vid, const std::string &owner, const std::string &group, const std::string &storageclass, const std::string &path);
+  virtual cta::common::dataStructures::ArchiveFile getArchiveFileById(const std::string &id);
 
   virtual cta::common::dataStructures::ReadTestResult readTest(const cta::common::dataStructures::SecurityIdentity &requester, const std::string &driveName, const std::string &vid, const uint64_t firstFSeq, const uint64_t lastFSeq, 
    const bool checkChecksum, const std::string &output, const std::string &tag) const; //when output=="null" discard the data read
diff --git a/xroot_plugins/XrdCtaFile.cpp b/xroot_plugins/XrdCtaFile.cpp
index 6f8e94a3f78d78b652392769f91f11e4aa7d9f93..7447ec8c6ef342721e587ac685d8d9af52bd545b 100644
--- a/xroot_plugins/XrdCtaFile.cpp
+++ b/xroot_plugins/XrdCtaFile.cpp
@@ -1810,6 +1810,63 @@ void XrdProFile::xCom_listpendingarchives(const std::vector<std::string> &tokens
 void XrdProFile::xCom_listpendingretrieves(const std::vector<std::string> &tokens, const cta::common::dataStructures::SecurityIdentity &requester) {
   std::stringstream help;
   help << tokens[0] << " lpr/listpendingretrieves [--vid/-v <vid>] [--extended/-x]" << std::endl;
+  std::string vid = getOptionValue(tokens, "-v", "--vid");
+  bool extended = hasOption(tokens, "-x", "--extended");
+  std::map<std::string, std::list<cta::common::dataStructures::RetrieveJob> > result;
+  if(vid.empty()) {
+    result = m_scheduler->getPendingRetrieveJobs(requester);
+  }
+  else {
+    std::list<cta::common::dataStructures::RetrieveJob> list = m_scheduler->getPendingRetrieveJobs(requester, vid);
+    if(list.size()>0) {
+      result[vid] = list;
+    }
+  }
+  if(result.size()>0) {
+    if(extended) {
+      std::vector<std::vector<std::string>> responseTable;
+      std::vector<std::string> header = {"vid","id","copy no.","fseq","block id","size","user","group","instance","path","diskpool","diskpool throughput"};
+      responseTable.push_back(header);    
+      for(auto it = result.cbegin(); it != result.cend(); it++) {
+        for(auto jt = it->second.cbegin(); jt != it->second.cend(); jt++) {
+          std::vector<std::string> currentRow;
+          currentRow.push_back(it->first);
+          currentRow.push_back(jt->getRequest().getArchiveFileID());
+          cta::common::dataStructures::ArchiveFile file = m_scheduler->getArchiveFileById(jt->getRequest().getArchiveFileID());
+          currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].first));
+          currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].second.getFSeq()));
+          currentRow.push_back(std::to_string((unsigned long long)jt->getTapeCopies()[it->first].second.getBlockId()));
+          currentRow.push_back(std::to_string((unsigned long long)file.getFileSize()));
+          currentRow.push_back(jt->getRequest().getRequester().getUserName());
+          currentRow.push_back(jt->getRequest().getRequester().getGroupName());
+          currentRow.push_back(jt->getRequest().getDrData().getDrInstance());
+          currentRow.push_back(jt->getRequest().getDrData().getDrPath());
+          currentRow.push_back(jt->getRequest().getDiskpoolName());
+          currentRow.push_back(std::to_string((unsigned long long)jt->getRequest().getDiskpoolThroughput()));
+          responseTable.push_back(currentRow);
+        }
+      }
+      m_data = formatResponse(responseTable);
+    }
+    else {
+      std::vector<std::vector<std::string>> responseTable;
+      std::vector<std::string> header = {"vid","total files","total size"};
+      responseTable.push_back(header);    
+      for(auto it = result.cbegin(); it != result.cend(); it++) {
+        std::vector<std::string> currentRow;
+        currentRow.push_back(it->first);
+        currentRow.push_back(std::to_string((unsigned long long)it->second.size()));
+        uint64_t size=0;
+        for(auto jt = it->second.cbegin(); jt != it->second.cend(); jt++) {
+          cta::common::dataStructures::ArchiveFile file = m_scheduler->getArchiveFileById(jt->getRequest().getArchiveFileID());
+          size += file.getFileSize();
+        }
+        currentRow.push_back(std::to_string((unsigned long long)size));
+        responseTable.push_back(currentRow);
+      }
+      m_data = formatResponse(responseTable);
+    }
+  }
 }
 
 //------------------------------------------------------------------------------