diff --git a/tapeserver/daemon/CMakeLists.txt b/tapeserver/daemon/CMakeLists.txt
index e58372083b9ddf8963098530c52a8812fc625dd2..053a7510a65dba4f90a262a1095087c8f98a1478 100644
--- a/tapeserver/daemon/CMakeLists.txt
+++ b/tapeserver/daemon/CMakeLists.txt
@@ -2,7 +2,15 @@ cmake_minimum_required (VERSION 2.6)
 
 add_library(ctatapedaemon
   CommandLineParams.cpp
+  ConfigurationFile.cpp
   GlobalConfiguration.cpp
   TapeDaemon.cpp
   TpconfigLine.cpp
-  TpconfigLines.cpp)
\ No newline at end of file
+  TpconfigLines.cpp)
+
+add_library(ctadaemonunittests SHARED
+  ConfigurationFileTests.cpp)
+
+target_link_libraries(ctadaemonunittests
+  ctatapedaemon
+  unitTestHelper)
\ No newline at end of file
diff --git a/tapeserver/daemon/ConfigurationFile.cpp b/tapeserver/daemon/ConfigurationFile.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6b6a90289f2ed6f290d6810cc73277eaf9227160
--- /dev/null
+++ b/tapeserver/daemon/ConfigurationFile.cpp
@@ -0,0 +1,64 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ConfigurationFile.hpp"
+#include "common/exception/Exception.hpp"
+
+#include <fstream>
+#include <algorithm>
+
+namespace cta { namespace tape { namespace daemon {
+  
+ConfigurationFile::ConfigurationFile(const std::string& path) {
+  // Try to open the configuration file, throwing an exception if there is a
+  // failure
+  std::ifstream file(path);
+  if (file.fail()) {
+    cta::exception::Exception ex;
+    ex.getMessage() << __FUNCTION__ << " failed"
+      ": Failed to open configuration file"
+      ": m_fileName=" << path;
+    throw ex;
+  }
+  
+  std::string line;
+  size_t lineNumber=0;
+  while(++lineNumber, std::getline(file, line)) {
+    // get rid of potential tabs
+    std::replace(line.begin(),line.end(),'\t',' ');
+    // get the category
+    std::istringstream sline(line);
+    std::string category;
+    if (!(sline >> category)) continue; // empty line
+    if (category[0] == '#') continue;   // comment
+    // get the key
+    std::string key;
+    if (!(sline >> key)) continue;      // no key on line
+    if (key[0] == '#') continue;        // key commented
+    // get and store value
+    while (sline.get() == ' '){}; sline.unget(); // skip spaces
+    std::string value;
+    std::getline(sline, value, '#');
+    value.erase(value.find_last_not_of(" \n\r\t")+1); // right trim
+    auto & entry = entries[category][key];
+    entry.value = value;
+    entry.line = lineNumber;
+  }
+}
+
+}}} // namespace cta::tape::daemon
\ No newline at end of file
diff --git a/tapeserver/daemon/ConfigurationFile.hpp b/tapeserver/daemon/ConfigurationFile.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4db4d83ebbe5af81ebe50001c69e73cfb798632d
--- /dev/null
+++ b/tapeserver/daemon/ConfigurationFile.hpp
@@ -0,0 +1,34 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <map>
+#include <string>
+
+namespace cta { namespace tape { namespace daemon {
+struct ConfigurationFile {
+public:
+  ConfigurationFile(const std::string & path);
+  struct value_t {
+    std::string value;
+    uint32_t line;
+  };
+  std::map<std::string, std::map<std::string, value_t> > entries;
+};
+}}} // namespace cta::tape::daemon
\ No newline at end of file
diff --git a/tapeserver/daemon/ConfigurationFileTests.cpp b/tapeserver/daemon/ConfigurationFileTests.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..440c513b87ebd92bd827ff1bd656338aeb52a311
--- /dev/null
+++ b/tapeserver/daemon/ConfigurationFileTests.cpp
@@ -0,0 +1,39 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gtest/gtest.h>
+
+#include "ConfigurationFile.hpp"
+#include "tests/TempFile.hpp"
+
+namespace unitTests {
+
+TEST(cta_Daemon, ConfigurationFile) {
+  TempFile tf;
+  tf.stringFill("# My test config file\n"
+  "cat1 key1 val1\n"
+  "cat1 #key2 val2\n"
+  "cat1 key3 #val3\n");
+  cta::tape::daemon::ConfigurationFile cf(tf.path());
+  ASSERT_EQ(1, cf.entries.size());
+  ASSERT_NO_THROW(cf.entries.at("cat1").at("key1"));
+  ASSERT_EQ("val1", cf.entries.at("cat1").at("key1").value);
+  ASSERT_EQ(2, cf.entries.at("cat1").at("key1").line);
+}
+
+} // namespace unitTests
\ No newline at end of file
diff --git a/tapeserver/daemon/GlobalConfiguration.cpp b/tapeserver/daemon/GlobalConfiguration.cpp
index 5048620d08473658f8bddbc7d084f56ebdcc47d4..e9de3c79a252e231b04c2491454a9cf41cd958cc 100644
--- a/tapeserver/daemon/GlobalConfiguration.cpp
+++ b/tapeserver/daemon/GlobalConfiguration.cpp
@@ -17,6 +17,7 @@
  */
 
 #include "GlobalConfiguration.hpp"
+#include "ConfigurationFile.hpp"
 
 namespace cta { namespace tape { namespace daemon {
   
@@ -27,9 +28,22 @@ GlobalConfiguration GlobalConfiguration::createFromCtaConf(cta::log::Logger& log
 GlobalConfiguration GlobalConfiguration::createFromCtaConf(
   const std::string& generalConfigPath, cta::log::Logger& log) {
   GlobalConfiguration ret;
+  // Parse config file
+  ConfigurationFile cf(generalConfigPath);
+  // Extract configuration from parsed config file
+  // tpConfigPath: this element is optional
+  try {
+    ConfigurationFile::value_t & v = cf.entries.at("Taped").at("tpConfigPath");
+    std::stringstream src;
+    src << generalConfigPath << ":" << v.line;
+     ret.tpConfigPath.set(v.value, src.str());
+  } catch (...) {}
   return ret;
 }
 
+GlobalConfiguration::GlobalConfiguration():
+  tpConfigPath("tpConfigPath", "/etc/cta/TPCONFIG", "Compile time default") {}
+
 cta::log::DummyLogger GlobalConfiguration::gDummyLogger("");
 
 }}} // namespace cta::tape::daemon
diff --git a/tapeserver/daemon/GlobalConfiguration.hpp b/tapeserver/daemon/GlobalConfiguration.hpp
index f83503b62d0836a9b808f9369460de0c577b63c8..6742a407b1fc9d47a0a130d3008b9a2e29b5ca5e 100644
--- a/tapeserver/daemon/GlobalConfiguration.hpp
+++ b/tapeserver/daemon/GlobalConfiguration.hpp
@@ -19,8 +19,11 @@
 #pragma once
 #include <string>
 #include <map>
+#include <type_traits>
+#include <limits>
 #include "DriveConfiguration.hpp"
 #include "common/log/DummyLogger.hpp"
+#include "common/exception/Exception.hpp"
 
 namespace cta {
 namespace tape {
@@ -35,7 +38,48 @@ struct GlobalConfiguration {
   static GlobalConfiguration createFromCtaConf(
           const std::string & generalConfigPath,
           cta::log::Logger & log = gDummyLogger);
+  // Default constructor.
+  GlobalConfiguration();
   std::map<std::string, DriveConfiguration> driveConfigs;
+
+  
+  /**
+   * A templated class allowing the tracking of parameter with their source.
+   * If the parameter is not set (implicitly defined as the source being
+   * an empty string), access to the value will be denied (exception)
+   */
+  template<class C>
+  class SourcedParameter {
+  public:
+    CTA_GENERATE_EXCEPTION_CLASS(ParameterNotDefined);
+    SourcedParameter(const std::string & name): m_name(name) {
+      if (std::is_arithmetic<C>::value) {
+        m_value=std::numeric_limits<C>::max();
+      }
+    }
+    SourcedParameter(const std::string & name, C value, const std::string & source):
+      m_name(name), m_value(value), m_source(source) {}
+    C operator() () {
+      if (m_source.empty()) {
+        throw ParameterNotDefined(std::string("In SourcedParameter::operator(): "
+                "value not defined for parameter \'" + m_name + "\' :"));
+      }
+      return m_value;
+    }
+    void set(const std::string & value, const std::string & source) {
+      m_value = value;
+      m_source = source;
+    }
+    const std::string & name() { return m_name; }
+    const std::string & source() { return m_source; }
+  private:
+    std::string m_name;
+    C m_value;
+    std::string m_source;
+  };
+  
+  // The actual parameters:
+  SourcedParameter<std::string> tpConfigPath;
 private:
   /** A private dummy logger which will simplify the implementaion of the 
    * functions (just unconditionally log things). */
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index e65957e483b3be1df9a7465e5fff4e82b5bdc9da..753b49d74de0628c4bc6b1ff1298b5cc63937cb0 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -43,10 +43,14 @@ target_link_libraries(cta-unitTests
   ctaremotensunittests
   ctaschedulerunittests
   ctaio
+  ctadaemonunittests
   ${GMOCK_LIB}
   gtest
   pthread)
 
+add_library(unitTestHelper
+  TempFile.cpp)
+
 add_library(systemTestHelper
   Subprocess.cpp)
 
diff --git a/tests/TempFile.cpp b/tests/TempFile.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1f8b11f757d88e4df466570034e466d79decf1e9
--- /dev/null
+++ b/tests/TempFile.cpp
@@ -0,0 +1,68 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "TempFile.hpp"
+#include "common/exception/Errnum.hpp"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <fstream>
+#include <memory>
+
+
+namespace unitTests {
+
+TempFile::TempFile() {
+  char path[] = "/tmp/testCTA-XXXXXX";
+  int fd = ::mkstemp(path);
+  cta::exception::Errnum::throwOnMinusOne(fd, "In TempFile::TempFile: failed to mkstemp: ");
+  ::close(fd);
+  m_path = path;
+}
+
+TempFile::TempFile(const std::string& path) : m_path(path) { }
+
+TempFile::~TempFile() {
+  if (m_path.size()) {
+    ::unlink(m_path.c_str());
+  }
+}
+
+std::string TempFile::path() {
+  return m_path;
+}
+
+void TempFile::randomFill(size_t size) {
+  std::ofstream out(m_path, std::ios::out | std::ios::binary);
+  std::ifstream in("/dev/urandom", std::ios::in | std::ios::binary);
+  std::unique_ptr<char[] > buff(new char[size]);
+  in.read(buff.get(), size);
+  out.write(buff.get(), size);
+}
+
+void TempFile::stringFill(const std::string& string) {
+  std::ofstream out(m_path, std::ios::out | std::ios::binary | std::ios::trunc);
+  out << string;
+}
+
+void TempFile::stringAppend(const std::string& string) {
+  std::ofstream out(m_path, std::ios::out | std::ios::binary | std::ios::app);
+  out << string;
+}
+  
+}
\ No newline at end of file
diff --git a/tests/TempFile.hpp b/tests/TempFile.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..63d2d110489988bbe7cb79feabf174392bc0c3ab
--- /dev/null
+++ b/tests/TempFile.hpp
@@ -0,0 +1,40 @@
+/*
+ * The CERN Tape Archive (CTA) project
+ * Copyright (C) 2015  CERN
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <string>
+
+namespace unitTests {
+/**
+ * A class creating a temporary file (deleted by destructor). Various population
+ * operations are provided.
+ */
+class TempFile {
+public:
+  TempFile();
+  TempFile(const std::string& path);
+  std::string path();
+  void randomFill(size_t size);
+  void stringFill(const std::string &string);
+  void stringAppend(const std::string &string);
+  ~TempFile();
+private:
+  std::string m_path;
+};
+}
\ No newline at end of file