diff --git a/src/Configuration.h b/src/Configuration.h
index 72865c1bc005ad4cc25f5dbeb9556ae9366be0b7..4817e540b351e7538705b99b117837adbb323782 100644
--- a/src/Configuration.h
+++ b/src/Configuration.h
@@ -55,7 +55,7 @@ protected:
 
 public:
 //------------------------------------------------------------------------------
-//	[Public] User methods
+//	[Public] Create class method
 //------------------------------------------------------------------------------
 	static Configuration::SP create(std::string certificateFile,
         std::string privateKeyFile, std::string dHTempFile,
@@ -73,19 +73,27 @@ public:
 		return c_sp;
 	}
 
-	std::string getCertificateFile() const { return m_certificateFile; };
-	std::string getPrivateKeyFile() const { return m_privateKeyFile; };
-	std::string getDHTempFile() const { return m_dHTempFile; };
-	std::string getLocalHost() const { return m_localHost; };
-	unsigned int getLocalPort() const { return m_localPort; };
-	unsigned int getWorkerNumber() const { return m_workerNumber; };
-	std::string getDatabaseHost() const { return m_databaseHost; };
-	unsigned int getDatabasePort() const { return m_databasePort; };
-	std::string getDatabaseUsername() const { return m_databaseUsername; };
-	std::string getDatabasePassword() const { return m_databasePassword; };
+//------------------------------------------------------------------------------
+//	[Public] Getter methods
+//------------------------------------------------------------------------------
+	std::string getCertificateFile() const { return m_certificateFile; }
+	std::string getPrivateKeyFile() const { return m_privateKeyFile; }
+	std::string getDHTempFile() const { return m_dHTempFile; }
+	std::string getLocalHost() const { return m_localHost; }
+	unsigned int getLocalPort() const { return m_localPort; }
+	unsigned int getWorkerNumber() const { return m_workerNumber; }
+	std::string getDatabaseHost() const { return m_databaseHost; }
+	unsigned int getDatabasePort() const { return m_databasePort; }
+	std::string getDatabaseUsername() const { return m_databaseUsername; }
+	std::string getDatabasePassword() const { return m_databasePassword; }
     unsigned int getDatabaseConnectionNumber() const { return m_databaseConnectionNumber; }
     ExportedTablesMap& getExportedTablesMap() const { return m_exportedTablesMap; }
+    AuthorisedUsersMap& getAuthorisedUsersMap() const { return m_authorisedUsersMap; }
+
 
+//------------------------------------------------------------------------------
+//	[Public] Utilities methods
+//------------------------------------------------------------------------------
     bool isTableExported(const std::string schema, const std::string table)
     {
         std::pair<ExportedTablesMap::const_iterator, ExportedTablesMap::const_iterator > ret;
diff --git a/src/MetadataExporter.cpp b/src/MetadataExporter.cpp
index c646bf8a34e9582cad5a00d728edbd11fac4bad8..fd13ab425b0bba8e2255e39236fda449cb288b5c 100644
--- a/src/MetadataExporter.cpp
+++ b/src/MetadataExporter.cpp
@@ -41,7 +41,6 @@
 
 #include <MetadataExporter.h>
 #include <MetadataExporterClass.h>
-#include <Configuration.h>
 #include <PlainServer.h>
 #include <SSLServer.h>
 
@@ -601,8 +600,25 @@ void MetadataExporter::importExportedTables(std::vector<std::string>& exportedTa
         }
 
         std::string schema = exportedTables.at(i).substr(0, found);
+
+        if(schema.empty())
+        {
+            std::stringstream errorStream;
+            errorStream << "ExportedTables property has empty schema at "
+                << i << " position" << std::endl;
+            throw std::invalid_argument(errorStream.str());
+        }
+
         std::string table = exportedTables.at(i).substr(found+1, std::string::npos);
 
+        if(table.empty())
+        {
+            std::stringstream errorStream;
+            errorStream << "ExportedTables property has empty table at "
+                << i << " position" << std::endl;
+            throw std::invalid_argument(errorStream.str());
+        }
+
         INFO_STREAM << "MetadataExporter::importExportedTables() schema "
             << schema << " table " << table << endl;
 
@@ -632,8 +648,25 @@ void MetadataExporter::importAuthorisedUsers(std::vector<std::string>& authorise
         }
 
         std::string user = authorisedUsers.at(i).substr(0, found);
+
+        if(user.empty())
+        {
+            std::stringstream errorStream;
+            errorStream << "AuthorisedUsers property has empty user at "
+                << i << " position" << std::endl;
+            throw std::invalid_argument(errorStream.str());
+        }
+
         std::string password = authorisedUsers.at(i).substr(found+1, std::string::npos);
 
+        if(password.empty())
+        {
+            std::stringstream errorStream;
+            errorStream << "AuthorisedUsers property has empty password at "
+                << i << " position" << std::endl;
+            throw std::invalid_argument(errorStream.str());
+        }
+
         #ifdef VERBOSE_DEBUG
             INFO_STREAM << "MetadataExporter::importAuthorisedUsers() user "
                 << user << " password " << password << endl;
diff --git a/src/MetadataExporter.h b/src/MetadataExporter.h
index fca15b0182ecc340ee17f80b28320f933743cf05..04a1d28493947d0dc92097e7622f91d1e7bc189e 100644
--- a/src/MetadataExporter.h
+++ b/src/MetadataExporter.h
@@ -38,6 +38,7 @@
 #ifndef MetadataExporter_H
 #define MetadataExporter_H
 
+#include <Configuration.h>
 #include <Server.h>
 
 #include <tango.h>
diff --git a/src/ProtocolManager.cpp b/src/ProtocolManager.cpp
index ecab559d923b40c336c24502257837dc56d825dc..7974b336db9cd8ab7246e6828c11025b56ac2631 100644
--- a/src/ProtocolManager.cpp
+++ b/src/ProtocolManager.cpp
@@ -163,46 +163,57 @@ ResponseSP ProtocolManager::prepareValidation(RequestSP request_sp)
             m_validatedSchema = validationReq.schema();
             m_validatedTable =  validationReq.table();
 
-            try
+            if(m_configuration_sp->isTableExported(m_validatedSchema, m_validatedTable))
             {
-                DBManager::InformationList informationList =
-                    m_dBManager_sp->retrieveInformation(m_validatedSchema, m_validatedTable);
-
-                if(informationList.empty())
+                try
                 {
-                    std::stringstream errorStream;
-                    errorStream << "Table " << m_validatedSchema << "."
-                        << m_validatedTable << " not exists";
-                    throw std::runtime_error(errorStream.str());
+                    DBManager::InformationList informationList =
+                        m_dBManager_sp->retrieveInformation(m_validatedSchema, m_validatedTable);
+
+                    if(informationList.empty())
+                    {
+                        std::stringstream errorStream;
+                        errorStream << "Table " << m_validatedSchema << "."
+                            << m_validatedTable << " not exists";
+                        throw std::runtime_error(errorStream.str());
+                    }
+
+                    if(validationReq.columns_size() != (int)informationList.size())
+                    {
+                        std::stringstream errorStream;
+                        errorStream << "Table " << m_validatedSchema << "."
+                            << m_validatedTable << " has different columns size";
+                        throw std::runtime_error(errorStream.str());
+                    }
+
+                    for(int i=0; i<validationReq.columns_size(); ++i)
+                        validateColumn(validationReq.columns(i), informationList);
+
+                    INFO_STREAM << "ProtocolManager::prepareValidation() "
+                        << "Validation accepted for " << m_validatedSchema << "."
+                        << m_validatedTable << " from " << m_remoteEndpoint << endl;
+
+                    m_isValidated = true;
+
+                    validationRes->set_state(Response::Validation::ACCEPTED);
+                    validationRes->set_status("Table validated");
                 }
-
-                if(validationReq.columns_size() != (int)informationList.size())
+                catch(std::runtime_error& ex)
                 {
-                    std::stringstream errorStream;
-                    errorStream << "Table " << m_validatedSchema << "."
-                        << m_validatedTable << " has different columns size";
-                    throw std::runtime_error(errorStream.str());
-                }
-
-                for(int i=0; i<validationReq.columns_size(); ++i)
-                    validateColumn(validationReq.columns(i), informationList);
+                    WARN_STREAM << "ProtocolManager::prepareValidation() "
+                        << ex.what() << " from " << m_remoteEndpoint << endl;
 
-                INFO_STREAM << "ProtocolManager::prepareValidation() "
-                    << "Validation accepted for " << m_validatedSchema << "."
-                    << m_validatedTable << " from " << m_remoteEndpoint << endl;
-
-                m_isValidated = true;
-
-                validationRes->set_state(Response::Validation::ACCEPTED);
-                validationRes->set_status("Table validated");
+                    validationRes->set_state(Response::Validation::REJECTED);
+                    validationRes->set_status(ex.what());
+                }
             }
-            catch(std::runtime_error& ex)
+            else
             {
                 WARN_STREAM << "ProtocolManager::prepareValidation() "
-                    << ex.what() << " from " << m_remoteEndpoint << endl;
+                    << "Not exported table from " << m_remoteEndpoint << endl;
 
                 validationRes->set_state(Response::Validation::REJECTED);
-                validationRes->set_status(ex.what());
+                validationRes->set_status("Not exported table");
             }
         }
         else