diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp
index 37fcc0e2f3e7f222ad06ec87ec734e284e5b189b..b0bc95b3c6ddee4e43426208af6ccb7618213f36 100644
--- a/catalogue/Catalogue.hpp
+++ b/catalogue/Catalogue.hpp
@@ -239,6 +239,12 @@ public:
    */
   virtual void deleteVirtualOrganization(const std::string &voName) = 0;
   
+  /**
+   * Get all the Virtual Organizations from the Catalogue
+   * @return the list of all the Virtual Organizations
+   */
+  virtual std::list<common::dataStructures::VirtualOrganization> getVirtualOrganizations() const = 0;
+  
   /**
    * Creates the specified storage class.
    *
diff --git a/catalogue/CatalogueRetryWrapper.hpp b/catalogue/CatalogueRetryWrapper.hpp
index 7919c7d1fee8ee6fb52d4764703cc1d5240b5a5e..2da57cb123d317e3df07958d93adb719357fed69 100644
--- a/catalogue/CatalogueRetryWrapper.hpp
+++ b/catalogue/CatalogueRetryWrapper.hpp
@@ -123,6 +123,10 @@ public:
   void deleteVirtualOrganization(const std::string &voName) override {
     return retryOnLostConnection(m_log, [&]{return m_catalogue->deleteVirtualOrganization(voName);}, m_maxTriesToConnect);
   }
+  
+  std::list<common::dataStructures::VirtualOrganization> getVirtualOrganizations() const override {
+    return retryOnLostConnection(m_log, [&]{return m_catalogue->getVirtualOrganizations();}, m_maxTriesToConnect);
+  }
     
   void createStorageClass(const common::dataStructures::SecurityIdentity &admin, const common::dataStructures::StorageClass &storageClass) override {
     return retryOnLostConnection(m_log, [&]{return m_catalogue->createStorageClass(admin, storageClass);}, m_maxTriesToConnect);
diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp
index 9413b1ea609560a4f157367caf3a3f78200e132b..0720529395addfca86bcf0645ee065ef70419579 100644
--- a/catalogue/CatalogueTest.cpp
+++ b/catalogue/CatalogueTest.cpp
@@ -180,6 +180,12 @@ void cta_catalogue_CatalogueTest::SetUp() {
         m_catalogue->deleteDiskSystem(ds.name);
       }
     }
+    {
+      const auto virtualOrganizations = m_catalogue->getVirtualOrganizations();
+      for(auto &vo: virtualOrganizations) {
+        m_catalogue->deleteVirtualOrganization(vo.name);
+      }
+    }
   } catch(exception::Exception &ex) {
     throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str());
   }
@@ -15349,4 +15355,30 @@ TEST_P(cta_catalogue_CatalogueTest, deleteVirtualOrganizationNameDoesNotExist) {
   ASSERT_THROW(m_catalogue->deleteVirtualOrganization("DOES_NOT_EXIST"),cta::exception::UserError);
 }
 
+TEST_P(cta_catalogue_CatalogueTest, getVirtualOrganizations) {
+  using namespace cta;
+
+  common::dataStructures::VirtualOrganization vo;
+  vo.name = "vo";
+  vo.comment = "comment";
+  
+  ASSERT_NO_THROW(m_catalogue->createVirtualOrganization(m_admin,vo));
+  
+  std::list<common::dataStructures::VirtualOrganization> vos = m_catalogue->getVirtualOrganizations();
+  ASSERT_EQ(1,vos.size());
+  
+  auto &voRetrieved = vos.front();
+  ASSERT_EQ(vo.name,voRetrieved.name);
+  ASSERT_EQ(vo.comment,voRetrieved.comment);
+  ASSERT_EQ(m_admin.host,voRetrieved.creationLog.host);
+  ASSERT_EQ(m_admin.username,voRetrieved.creationLog.username);
+  ASSERT_EQ(m_admin.host,voRetrieved.lastModificationLog.host);
+  ASSERT_EQ(m_admin.username,voRetrieved.lastModificationLog.username);
+  
+  
+  ASSERT_NO_THROW(m_catalogue->deleteVirtualOrganization(vo.name));
+  vos = m_catalogue->getVirtualOrganizations();
+  ASSERT_EQ(0,vos.size());
+}
+
 } // namespace unitTests
diff --git a/catalogue/DummyCatalogue.hpp b/catalogue/DummyCatalogue.hpp
index 204070ee4256527081a53b77a1e81dafe26c9366..550d21a5677e41ea2d8a0d165cec4600de917434 100644
--- a/catalogue/DummyCatalogue.hpp
+++ b/catalogue/DummyCatalogue.hpp
@@ -90,6 +90,7 @@ public:
   
   void createVirtualOrganization(const common::dataStructures::SecurityIdentity &admin, const common::dataStructures::VirtualOrganization &vo) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   void deleteVirtualOrganization(const std::string &voName) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
+  std::list<common::dataStructures::VirtualOrganization> getVirtualOrganizations() const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   void modifyArchiveRouteComment(const common::dataStructures::SecurityIdentity& admin, const std::string& storageClassName, const uint32_t copyNb, const std::string& comment) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   void modifyArchiveRouteTapePoolName(const common::dataStructures::SecurityIdentity& admin, const std::string& storageClassName, const uint32_t copyNb, const std::string& tapePoolName) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
   void modifyLogicalLibraryName(const common::dataStructures::SecurityIdentity &admin, const std::string &currentName, const std::string &newName) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); }
diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp
index e19a1eb3f40111562613f5efc7419c9e04fb5893..90c09b11685f14725b1e7d9f900add05cca2abc1 100644
--- a/catalogue/RdbmsCatalogue.cpp
+++ b/catalogue/RdbmsCatalogue.cpp
@@ -434,6 +434,58 @@ void RdbmsCatalogue::deleteVirtualOrganization(const std::string &voName){
   }
 }
 
+//------------------------------------------------------------------------------
+// getVirtualOrganizations
+//------------------------------------------------------------------------------
+std::list<common::dataStructures::VirtualOrganization> RdbmsCatalogue::getVirtualOrganizations() const {
+  try {
+    std::list<common::dataStructures::VirtualOrganization> virtualOrganizations;
+    const char *const sql =
+      "SELECT "
+        "VIRTUAL_ORGANIZATION_NAME AS VIRTUAL_ORGANIZATION_NAME,"
+
+        "USER_COMMENT AS USER_COMMENT,"
+
+        "CREATION_LOG_USER_NAME AS CREATION_LOG_USER_NAME,"
+        "CREATION_LOG_HOST_NAME AS CREATION_LOG_HOST_NAME,"
+        "CREATION_LOG_TIME AS CREATION_LOG_TIME,"
+
+        "LAST_UPDATE_USER_NAME AS LAST_UPDATE_USER_NAME,"
+        "LAST_UPDATE_HOST_NAME AS LAST_UPDATE_HOST_NAME,"
+        "LAST_UPDATE_TIME AS LAST_UPDATE_TIME "
+      "FROM "
+        "VIRTUAL_ORGANIZATION "
+      "ORDER BY "
+        "VIRTUAL_ORGANIZATION_NAME";
+    auto conn = m_connPool.getConn();
+    auto stmt = conn.createStmt(sql);
+    auto rset = stmt.executeQuery();
+    while (rset.next()) {
+      common::dataStructures::VirtualOrganization virtualOrganization;
+
+      virtualOrganization.name = rset.columnString("VIRTUAL_ORGANIZATION_NAME");
+
+      virtualOrganization.comment = rset.columnString("USER_COMMENT");
+      virtualOrganization.creationLog.username = rset.columnString("CREATION_LOG_USER_NAME");
+      virtualOrganization.creationLog.host = rset.columnString("CREATION_LOG_HOST_NAME");
+      virtualOrganization.creationLog.time = rset.columnUint64("CREATION_LOG_TIME");
+      virtualOrganization.lastModificationLog.username = rset.columnString("LAST_UPDATE_USER_NAME");
+      virtualOrganization.lastModificationLog.host = rset.columnString("LAST_UPDATE_HOST_NAME");
+      virtualOrganization.lastModificationLog.time = rset.columnUint64("LAST_UPDATE_TIME");
+
+      virtualOrganizations.push_back(virtualOrganization);
+    }
+
+    return virtualOrganizations;
+  } catch(exception::UserError &) {
+    throw;
+  } catch(exception::Exception &ex) {
+    ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str());
+    throw;
+  }
+}
+
+
 //------------------------------------------------------------------------------
 // createStorageClass
 //------------------------------------------------------------------------------
diff --git a/catalogue/RdbmsCatalogue.hpp b/catalogue/RdbmsCatalogue.hpp
index 26f0bd358eb624bb428fe19fd6a1902bd0647d33..fe7a17dddcc26090634089c3f57ac59dfb5dae14 100644
--- a/catalogue/RdbmsCatalogue.hpp
+++ b/catalogue/RdbmsCatalogue.hpp
@@ -224,6 +224,12 @@ public:
    * @param voName the name of the VirtualOrganization to delete
    */
   void deleteVirtualOrganization(const std::string &voName) override;
+  
+  /**
+   * Get all the Virtual Organizations from the Catalogue
+   * @return the list of all the Virtual Organizations
+   */
+  std::list<common::dataStructures::VirtualOrganization> getVirtualOrganizations() const override;
 
   /**
    * Creates the specified storage class.
diff --git a/common/dataStructures/VirtualOrganization.hpp b/common/dataStructures/VirtualOrganization.hpp
index 07c244013041135fef59fd8abb6df64a80948d93..5584ae85f0a4f2ee89dcebb6011940772350966c 100644
--- a/common/dataStructures/VirtualOrganization.hpp
+++ b/common/dataStructures/VirtualOrganization.hpp
@@ -19,6 +19,7 @@
 #pragma once
  
 #include <string>
+#include "EntryLog.hpp"
 
 namespace cta { 
 namespace common {
@@ -33,6 +34,15 @@ struct VirtualOrganization {
    * The comment.
    */
   std::string comment;
+  /**
+   * The creation log.
+   */
+  EntryLog creationLog;
+
+  /**
+   * The last modification log.
+   */
+  EntryLog lastModificationLog;
 };
 
 }}}