diff --git a/xroot_clients/CTACmd.cpp b/xroot_clients/CTACmd.cpp
index d1aeebc62af6590061d20dec80d3b2607749d1a0..7d9611cb5f8fd3684ab44673acecc9c31a60c974 100644
--- a/xroot_clients/CTACmd.cpp
+++ b/xroot_clients/CTACmd.cpp
@@ -20,12 +20,13 @@ void CTACmd::usage(std::ostream &os) const throw() {
   os <<
     "Usage:\n"
     "\t" << m_programName << " archive <source_file1> [<source_file2> [<source_file3> [...]]] <destination_path>\n"
-    "\t" << m_programName << " create-storage-class <storage_class_name> <number_of_tape_copies>\n"
-    "\t" << m_programName << " change-storage-class <directory_name> <storage_class_name>\n"
-    "\t" << m_programName << " delete-storage-class <storage_class_name>\n"
-    "\t" << m_programName << " list-storage-class\n"
+    "\t" << m_programName << " mkclass <storage_class_name> <number_of_tape_copies>\n"
+    "\t" << m_programName << " chclass <directory_name> <storage_class_name>\n"
+    "\t" << m_programName << " rmclass <storage_class_name>\n"
+    "\t" << m_programName << " lsclass\n"
     "\t" << m_programName << " mkdir <directory_name>\n"
-    "\t" << m_programName << " rmdir <directory_name>\n";
+    "\t" << m_programName << " rmdir <directory_name>\n"
+    "\t" << m_programName << " ls <directory_name>\n";
 }
 
 //------------------------------------------------------------------------------
diff --git a/xroot_plugins/XrdProFilesystem.cpp b/xroot_plugins/XrdProFilesystem.cpp
index b87a3a73a59cfab62db50482da29c9f7294b6a6e..c183236aefb0649104dfba4c60fbced15518ea6c 100644
--- a/xroot_plugins/XrdProFilesystem.cpp
+++ b/xroot_plugins/XrdProFilesystem.cpp
@@ -141,7 +141,7 @@ int XrdProFilesystem::executeArchiveCommand(ParsedRequest &req, XrdOucErrInfo &e
 //------------------------------------------------------------------------------
 // executeCreateStorageClassCommand
 //------------------------------------------------------------------------------
-int XrdProFilesystem::executeCreateStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
+int XrdProFilesystem::executeMkclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
   if(req.args.size() != 2) {
     std::string response = "[ERROR] Wrong number of arguments provided";
     eInfo.setErrInfo(response.length(), response.c_str());
@@ -180,7 +180,7 @@ int XrdProFilesystem::executeCreateStorageClassCommand(ParsedRequest &req, XrdOu
 //------------------------------------------------------------------------------
 // executeCreateStorageClassCommand
 //------------------------------------------------------------------------------
-int XrdProFilesystem::executeChangeStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
+int XrdProFilesystem::executeChclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
   if(req.args.size() != 2) {
     std::string response = "[ERROR] Wrong number of arguments provided";
     eInfo.setErrInfo(response.length(), response.c_str());
@@ -213,7 +213,7 @@ int XrdProFilesystem::executeChangeStorageClassCommand(ParsedRequest &req, XrdOu
 //------------------------------------------------------------------------------
 // executeDeleteStorageClassCommand
 //------------------------------------------------------------------------------
-int XrdProFilesystem::executeDeleteStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
+int XrdProFilesystem::executeRmclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
   if(req.args.size() != 1) {
     std::string response = "[ERROR] Wrong number of arguments provided";
     eInfo.setErrInfo(response.length(), response.c_str());
@@ -247,7 +247,7 @@ int XrdProFilesystem::executeDeleteStorageClassCommand(ParsedRequest &req, XrdOu
 //------------------------------------------------------------------------------
 // executeListStorageClassCommand
 //------------------------------------------------------------------------------
-int XrdProFilesystem::executeListStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
+int XrdProFilesystem::executeLsclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
   if(req.args.size() != 0) {
     std::string response = "[ERROR] Wrong number of arguments provided";
     eInfo.setErrInfo(response.length(), response.c_str());
@@ -292,6 +292,8 @@ int XrdProFilesystem::executeMkdirCommand(ParsedRequest &req, XrdOucErrInfo &eIn
     return SFS_DATA;
   }
   try {
+    cta::UserIdentity requester;
+    m_clientAPI->createDirectory(requester, req.args.at(0));
     std::string response = "[OK] Directory ";
     response += req.args.at(0);
     response += " created";
@@ -346,6 +348,63 @@ int XrdProFilesystem::executeRmdirCommand(ParsedRequest &req, XrdOucErrInfo &eIn
   }
 }
 
+//------------------------------------------------------------------------------
+// executeLsCommand
+//------------------------------------------------------------------------------
+int XrdProFilesystem::executeLsCommand(ParsedRequest &req, XrdOucErrInfo &eInfo) {
+  if(req.args.size() != 1) {
+    std::string response = "[ERROR] Wrong number of arguments provided";
+    eInfo.setErrInfo(response.length(), response.c_str());
+    return SFS_DATA;
+  }
+  try {
+    cta::UserIdentity requester;
+    std::string response;
+    cta::DirectoryIterator itor = m_clientAPI->getDirectoryContents(requester, req.args.at(0));
+    while(itor.hasMore()) {
+      const cta::DirectoryEntry &entry = itor.next();
+      response += "\n";
+      switch(entry.entryType) {
+        case cta::DirectoryEntry::FILE_ENTRY:
+          response += "-";
+          break;
+        case cta::DirectoryEntry::DIRECTORY_ENTRY:
+          response += "d";
+          break;
+        case cta::DirectoryEntry::NONE:
+        default:          
+          response += "n";
+          break;
+      }
+      response += entry.ownerPerms;
+      response += entry.groupPerms;
+      response += entry.otherPerms;
+      response += " ";
+      response += entry.ownerId;
+      response += " ";
+      response += entry.groupId;
+      response += " ";
+      response += entry.name;
+    }
+    eInfo.setErrInfo(response.length(), response.c_str());
+    return SFS_DATA;
+  } catch (cta::Exception &ex) {
+    std::string response = "[ERROR] CTA exception caught: ";
+    response += ex.what();
+    eInfo.setErrInfo(response.length(), response.c_str());
+    return SFS_DATA;
+  } catch (std::exception &ex) {
+    std::string response = "[ERROR] Exception caught: ";
+    response += ex.what();
+    eInfo.setErrInfo(response.length(), response.c_str());
+    return SFS_DATA;
+  } catch (...) {
+    std::string response = "[ERROR] Unknown exception caught!";
+    eInfo.setErrInfo(response.length(), response.c_str());
+    return SFS_DATA;
+  }
+}
+
 //------------------------------------------------------------------------------
 // dispatchRequest
 //------------------------------------------------------------------------------
@@ -359,21 +418,21 @@ int XrdProFilesystem::dispatchRequest(XrdSfsFSctl &args, XrdOucErrInfo &eInfo) {
   {  
     return executeArchiveCommand(req, eInfo);
   }
-  else if(strcmp(req.cmd.c_str(), "/create-storage-class") == 0)
+  else if(strcmp(req.cmd.c_str(), "/mkclass") == 0)
   {  
-    return executeCreateStorageClassCommand(req, eInfo);
+    return executeMkclassCommand(req, eInfo);
   }  
-  else if(strcmp(req.cmd.c_str(), "/change-storage-class") == 0)
+  else if(strcmp(req.cmd.c_str(), "/chclass") == 0)
   {  
-    return executeChangeStorageClassCommand(req, eInfo);
+    return executeChclassCommand(req, eInfo);
   }
-  else if(strcmp(req.cmd.c_str(), "/delete-storage-class") == 0)
+  else if(strcmp(req.cmd.c_str(), "/rmclass") == 0)
   {  
-    return executeDeleteStorageClassCommand(req, eInfo);
+    return executeRmclassCommand(req, eInfo);
   }
-  else if(strcmp(req.cmd.c_str(), "/list-storage-class") == 0)
+  else if(strcmp(req.cmd.c_str(), "/lsclass") == 0)
   {  
-    return executeListStorageClassCommand(req, eInfo);
+    return executeLsclassCommand(req, eInfo);
   }
   else if(strcmp(req.cmd.c_str(), "/mkdir") == 0)
   {  
@@ -382,6 +441,10 @@ int XrdProFilesystem::dispatchRequest(XrdSfsFSctl &args, XrdOucErrInfo &eInfo) {
   else if(strcmp(req.cmd.c_str(), "/rmdir") == 0)
   {  
     return executeRmdirCommand(req, eInfo);
+  }  
+  else if(strcmp(req.cmd.c_str(), "/ls") == 0)
+  {  
+    return executeLsCommand(req, eInfo);
   }
   else
   {
diff --git a/xroot_plugins/XrdProFilesystem.hpp b/xroot_plugins/XrdProFilesystem.hpp
index 94c96ddd73b66176713dd9831e585aa75387c7b2..b45287319aebbf8563da6ffe9890762ca018604d 100644
--- a/xroot_plugins/XrdProFilesystem.hpp
+++ b/xroot_plugins/XrdProFilesystem.hpp
@@ -71,7 +71,7 @@ protected:
    * @param eInfo   Error information
    * @return SFS_DATA
    */
-  int executeCreateStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
+  int executeMkclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
   
   /**
    * Executes the command contained within the request structure
@@ -80,7 +80,7 @@ protected:
    * @param eInfo   Error information
    * @return SFS_DATA
    */
-  int executeChangeStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
+  int executeChclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
   
   /**
    * Executes the command contained within the request structure
@@ -89,7 +89,7 @@ protected:
    * @param eInfo   Error information
    * @return SFS_DATA
    */
-  int executeDeleteStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
+  int executeRmclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
   
   /**
    * Executes the command contained within the request structure
@@ -98,7 +98,7 @@ protected:
    * @param eInfo   Error information
    * @return SFS_DATA
    */
-  int executeListStorageClassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
+  int executeLsclassCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
   
   /**
    * Executes the command contained within the request structure
@@ -118,6 +118,15 @@ protected:
    */
   int executeRmdirCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
   
+  /**
+   * Executes the command contained within the request structure
+   * 
+   * @param req     parsed request
+   * @param eInfo   Error information
+   * @return SFS_DATA
+   */
+  int executeLsCommand(ParsedRequest &req, XrdOucErrInfo &eInfo);
+  
   /**
    * Dispatches the request based on the query
    *