diff --git a/DDCore/include/DD4hep/Path.h b/DDCore/include/DD4hep/Path.h
new file mode 100644
index 0000000000000000000000000000000000000000..2a919e7b8cb7fb58769912e295b6c5c390d08354
--- /dev/null
+++ b/DDCore/include/DD4hep/Path.h
@@ -0,0 +1,106 @@
+//==========================================================================
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+//  \author  Markus Frank
+//  \date    2016-08-30
+//  \version 1.0
+//
+//==========================================================================
+// $Id$
+#ifndef DD4HEP_DDCORE_PATH_H
+#define DD4HEP_DDCORE_PATH_H
+
+// Framework include files
+
+// C/C++ include files
+#include <string>
+
+// Forward declartions
+
+/// Namespace for the AIDA detector description toolkit
+namespace DD4hep {
+
+
+  /// Path handling class.
+  /**
+   *  Normally this could as well be replaced by 
+   *  boost::filesystem::path.
+   *
+   *  However, the LC folks do not like the additional link-dependency.
+   *  Hence this small extraction.
+   *  The main code comes from the boost implementation.
+   *
+   *  See http://www.boost.org/LICENSE_1_0.txt for the license and
+   *  the filesystem library home page: http://www.boost.org/libs/filesystem
+   *
+   *  \author  M.Frank
+   *  \version 1.0
+   *  \ingroup DD4HEP
+   */
+  class Path : public std::string {
+  public:
+    /// Default constructor
+    Path() : std::string()                      {                    }
+    /// Initializing constructor
+    Path(const std::string& c) : std::string(c) {                    }
+    /// Copy constructor
+    Path(const Path& c) : std::string(c)    {                        }
+    /// Assigning constructor
+    template <class Iter> Path(Iter _begin,Iter _end)  {
+      if ( _begin != _end )  {
+        std::string s(_begin, _end);
+        this->std::string::operator=(s);
+      }
+    }
+    /// Default destructor
+    ~Path() {}
+    /// Assignment operator from Path object
+    Path& operator=(const Path& c)          {
+      this->std::string::operator=(c);
+      return *this;
+    }
+    /// Assignment operator from string object
+    Path& operator=(const std::string& c)   {
+      this->std::string::operator=(c);
+      return *this;
+    }
+    /// Append operation
+    Path& append(const std::string& c);
+    /// Append operation
+    Path& operator/=(const Path& c)         {    return append(c);   }
+    /// Append operation
+    Path& operator/=(const std::string& c)  {    return append(c);   }
+    /// Normalize path name
+    Path  normalize()  const;
+    /// Parent's path
+    Path  parent_path() const;
+    /// The file name of the path
+    Path  filename() const;
+    /// The full file path of the object
+    Path  file_path() const;
+    /// Manipulator: remove the file name part. Leaves the parent path
+    Path& remove_filename();
+    
+    /// String representation of thre Path object
+    const std::string& native() const       {    return *this;       }
+    /// String representation of thre Path object
+    const char* string_data() const { return this->std::string::c_str(); }
+    /// Index of the parent's path end
+    size_t parent_path_end() const;
+    /// Helpers
+    class detail  {
+    public:
+      /// Path representing "."
+      static const Path& dot_path();
+      /// Path representing ".."
+      static const Path& dot_dot_path();
+    };
+  };
+} /* End namespace DD4hep           */
+#endif    /* DD4HEP_DDCORE_PATH_H   */
diff --git a/DDCore/src/Path.cpp b/DDCore/src/Path.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d3929b1d33542f2d0c0a3c30ca5b50194bb1b8fc
--- /dev/null
+++ b/DDCore/src/Path.cpp
@@ -0,0 +1,228 @@
+//  AIDA Detector description implementation for LCD
+//--------------------------------------------------------------------------
+// Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
+// All rights reserved.
+//
+// For the licensing terms see $DD4hepINSTALL/LICENSE.
+// For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
+//
+//  \author  Markus Frank
+//  \date    2016-08-30
+//  \version 1.0
+//
+//==========================================================================
+// $Id$
+
+#include "DD4hep/Path.h"
+#include <climits>
+#include <cstring>
+#include <vector>
+#include <stdexcept>
+
+using namespace std;
+using namespace DD4hep;
+
+namespace {
+  const char dot = '.';
+  const char separator = '/';
+  const char* const separators = "/";
+  const char colon = ':';
+
+  
+  inline bool is_separator(char c)  { return c == separator;  }
+
+  bool is_root_separator(const string& str, size_t pos)
+  // pos is position of the separator
+  {
+    if ( str.empty() || is_separator(str[pos]) ) {
+      throw runtime_error("precondition violation");
+    }
+    // subsequent logic expects pos to be for leftmost slash of a set
+    while (pos > 0 && is_separator(str[pos-1]))
+      --pos;
+
+    //  "/" [...]
+    if (pos == 0)  
+      return true;
+    //  "//" name "/"
+    if (pos < 3 || !is_separator(str[0]) || !is_separator(str[1]))
+      return false;
+
+    return str.find_first_of(separators, 2) == pos;
+  }
+
+  size_t filename_pos(const string& str,size_t end_pos)
+  // return 0 if str itself is filename (or empty)
+  {
+    // case: "//"
+    if (end_pos == 2 
+        && is_separator(str[0])
+        && is_separator(str[1])) return 0;
+
+    // case: ends in "/"
+    if (end_pos && is_separator(str[end_pos-1]))
+      return end_pos-1;
+    
+    // set pos to start of last element
+    size_t pos(str.find_last_of(separators, end_pos-1));
+
+    return (pos == string::npos // path itself must be a filename (or empty)
+            || (pos == 1 && is_separator(str[0]))) // or net
+      ? 0 // so filename is entire string
+      : pos + 1; // or starts after delimiter
+  }
+
+  // return npos if no root_directory found
+  size_t root_directory_start(const string& path, size_t size)  {
+    // case "//"
+    if (size == 2
+        && is_separator(path[0])
+        && is_separator(path[1])) return string::npos;
+    // case "//net {/}"
+    if (size > 3
+        && is_separator(path[0])
+        && is_separator(path[1])
+        && !is_separator(path[2]))
+    {
+      string::size_type pos(path.find_first_of(separators, 2));
+      return pos < size ? pos : string::npos;
+    }
+    
+    // case "/"
+    if (size > 0 && is_separator(path[0])) return 0;
+    return string::npos;
+  }
+}
+
+const Path& Path::detail::dot_path()   {
+  static Path p(".");
+  return p;
+}
+const Path& Path::detail::dot_dot_path()  {
+  static Path p("..");
+  return p;
+}
+
+Path& Path::append(const std::string& c)   {
+  insert(end(),separator);
+  insert(end(),c.begin(),c.end());
+  return *this;
+}
+
+Path Path::normalize()  const {
+  if (empty())
+    return *this;
+
+  vector<string> pathes;
+  char tmp[PATH_MAX];
+  ::strncpy(tmp, string_data(), sizeof(tmp));
+  tmp[sizeof(tmp)-1] = 0;
+  char *token, *save=0;
+  token = ::strtok_r(tmp,separators,&save);
+  while(token)  {
+    pathes.push_back(token);
+    token = ::strtok_r(0,separators,&save);
+  }
+  Path temp;
+  vector<string>::const_iterator start(pathes.begin());
+  vector<string>::const_iterator last(pathes.end());
+  vector<string>::const_iterator stop(last--);
+  for (vector<string>::const_iterator itr(start); itr != stop; ++itr)  {
+    // ignore "." except at start and last
+    Path itr_path(*itr);
+    if (itr_path.native().size() == 1
+        && (itr_path.native())[0] == dot
+        && itr != start
+        && itr != last) continue;
+
+    // ignore a name and following ".."
+    if ( temp.empty() && itr_path.find(colon) != string::npos )  {
+      temp = itr_path;
+      continue;
+    }
+    else if (!temp.empty()
+        && itr_path.native().size() == 2
+        && (itr_path.native())[0] == dot
+        && (itr_path.native())[1] == dot) // dot dot
+    {
+      string lf(temp.filename().native());  
+      if (lf.size() > 0
+          && (lf.size() != 1 || (lf[0] != dot && lf[0] != separator))
+          && (lf.size() != 2 || (lf[0] != dot && lf[1] != dot))   )
+      {
+        temp.remove_filename();
+        //// if not root directory, must also remove "/" if any
+        //if (temp.native().size() > 0
+        //  && temp.native()[temp.native().size()-1]
+        //    == separator)
+        //{
+        //  string::size_type rds(
+        //    root_directory_start(temp.native(), temp.native().size()));
+        //  if (rds == string::npos
+        //    || rds != temp.native().size()-1) 
+        //  {
+        //    temp.m_pathname.erase(temp.native().size()-1);
+        //  }
+        //}
+
+        vector<string>::const_iterator next(itr);
+        if (temp.empty() && ++next != stop && next == last && *last == detail::dot_path())  {
+          temp /= detail::dot_path();
+        }
+        continue;
+      }
+    }
+    temp /= *itr;
+  };
+
+  if (temp.empty())
+    temp /= detail::dot_path();
+  return temp;
+}
+
+size_t Path::parent_path_end() const  {
+  size_t end_pos(filename_pos(native(),this->size()));
+  bool filename_was_separator(this->size() && is_separator(at(end_pos)));
+
+  // skip separators unless root directory
+  size_t root_dir_pos(root_directory_start(native(), end_pos));
+  for (; end_pos > 0
+         && (end_pos-1) != root_dir_pos
+         && is_separator(this->at(end_pos-1))
+         ;
+       --end_pos) {}
+
+  return (end_pos == 1 && root_dir_pos == 0 && filename_was_separator) ? string::npos : end_pos;
+}
+
+
+Path& Path::remove_filename()   {
+  this->erase(this->parent_path_end());
+  return *this;
+}
+
+Path  Path::parent_path() const  {
+  size_t end_pos(parent_path_end());
+  return end_pos == string::npos ? Path() : Path(string_data(), string_data() + end_pos);
+}
+
+Path Path::filename() const
+{
+  size_t pos(filename_pos(native(), native().size()));
+  return (native().size()
+          && pos
+          && is_separator(at(pos))
+          && !is_root_separator(native(), pos))
+    ? detail::dot_path()
+    : Path(string_data() + pos);
+}
+
+Path  Path::file_path() const  {
+  size_t pos(filename_pos(native(), native().size()));
+  return (native().size()
+          && pos
+          && is_separator(at(pos))
+          && !is_root_separator(native(), pos))
+    ? detail::dot_path()
+    : Path(string_data() + pos);
+}
diff --git a/DDDB/CMakeLists.txt b/DDDB/CMakeLists.txt
index 9f5cf7477087429affb4a10866b2776932fb20c4..bb3905e50f656270f20bb0b62dfa9338c894c647 100644
--- a/DDDB/CMakeLists.txt
+++ b/DDDB/CMakeLists.txt
@@ -19,7 +19,6 @@
 
 dd4hep_package(    DDDB
   USES             DDCore DDCond
-                   [BOOST REQUIRED]
   INCLUDE_DIRS     include
   INSTALL_INCLUDES include/DDDB)
 
diff --git a/DDDB/src/CondDB2DDDB.cpp b/DDDB/src/CondDB2DDDB.cpp
index d961e54e1af822d574685479b176b8ac16522b6a..e36196faf74c18a5c16301a0afece63e8811636e 100644
--- a/DDDB/src/CondDB2DDDB.cpp
+++ b/DDDB/src/CondDB2DDDB.cpp
@@ -19,14 +19,14 @@
 //==========================================================================
 
 // Framework includes
+#include "DD4hep/Path.h"
+#include "DD4hep/Alignments.h"
 #include "DDDB/DDDBTags.h"
 #include "DDDB/DDDBDimension.h"
 #include "DDDB/DDDBHelper.h"
 #include "DDDB/DDDBConversion.h"
-#include "DD4hep/Alignments.h"
 
 // C/C++ include files
-#include "boost/filesystem/path.hpp"
 
 using namespace std;
 using namespace DD4hep;
@@ -333,7 +333,7 @@ namespace DD4hep {
 
     string object_path(Context* context, const string& ref)  {
       size_t hash = ref.rfind("#");
-      boost::filesystem::path path = hash==0 ? ref.substr(1) : ref;
+      Path path = hash==0 ? ref.substr(1) : ref;
       if ( ref[0] != '/' )  {
         path = context->locals.obj_path;
         path /= (hash==0 ? ref.substr(1) : ref.substr(hash+1));
@@ -342,7 +342,7 @@ namespace DD4hep {
     }
     string object_href(xml_h element, const string& ref)   {
       string p = XML::DocumentHandler::system_path(element);
-      boost::filesystem::path path = p;
+      Path path = p;
       p = path.normalize().native();
       p += '#';
       p += ref;
@@ -352,7 +352,7 @@ namespace DD4hep {
       size_t hash = ref.rfind("#");
       size_t idx  = ref.find(":");
       size_t idq  = ref.find("/");
-      boost::filesystem::path path = hash==0 ? ref.substr(1) : ref;
+      Path path = hash==0 ? ref.substr(1) : ref;
       if ( (idx == string::npos || idq < idx) && ref[0] != '/' )  {
         path = context->locals.xml_doc->id;
         if ( hash != 0 ) path = path.parent_path();
@@ -396,7 +396,7 @@ namespace DD4hep {
           par->catalogrefs[det->id] = det;
           return checkParents(context, par);
         }
-        boost::filesystem::path p(det->path);
+        Path p(det->path);
         parent_id  = p.parent_path().native();
         if ( parent_id == "/" )  {
           return true;
@@ -1527,7 +1527,7 @@ namespace DD4hep {
       if ( idet == geo->catalogs.end() ) {
         xml_h      elt;
         string     path      = object_path(context, name);
-        boost::filesystem::path p(path);
+        Path p(path);
         string     parent    = p.parent_path().native();
         Catalog*   det       = new Catalog();
         det->typeID   = 1;
@@ -1791,11 +1791,11 @@ namespace DD4hep {
       string p = XML::DocumentHandler::system_path(element);
       if ( hash == 0 )  { // This is a local object. Take the element's path
         p += ref;
-        boost::filesystem::path path = p;  // Remote object. Parent + local path
+        Path path = p;  // Remote object. Parent + local path
         p = path.normalize().native();      
         return p;
       }
-      boost::filesystem::path path = p;  // Remote object. Parent + local path
+      Path path = p;  // Remote object. Parent + local path
       path  = path.parent_path();
       path /= ref;
       p  = path.normalize().native();      
diff --git a/DDDB/src/DDDB2Objects.cpp b/DDDB/src/DDDB2Objects.cpp
index 1a96cd4f0125258cb0066fc73829b659b98ca1bb..9fd96135fdfdfe436536204f4a8aca92c6bd1f05 100644
--- a/DDDB/src/DDDB2Objects.cpp
+++ b/DDDB/src/DDDB2Objects.cpp
@@ -25,6 +25,7 @@
 #include "DDDB/DDDBConversion.h"
 
 #include "DD4hep/LCDD.h"
+#include "DD4hep/Path.h"
 #include "DD4hep/DetConditions.h"
 #include "DD4hep/ConditionsData.h"
 #include "DD4hep/DetectorTools.h"
@@ -42,7 +43,6 @@
 #include <iostream>
 #include <iomanip>
 #include <set>
-#include "boost/filesystem/path.hpp"
 
 using namespace std;
 using namespace DD4hep;
@@ -756,7 +756,7 @@ namespace DD4hep {
         return par;
       }
       else if ( path.length() > 1 )   {
-        boost::filesystem::path p = path;
+        Path p = path;
         par = __parent(context,p.parent_path().native());
         DetElement det = DetElement(p.filename().native(),"Logical",0);
         par.add(det);
diff --git a/DDDB/src/DDDBExecutor.cpp b/DDDB/src/DDDBExecutor.cpp
index b7f87ca5af35bb203d711ad348929bca2e376eb0..9ccd832f27ec6bd31ed3f6d6089e90997c277e62 100644
--- a/DDDB/src/DDDBExecutor.cpp
+++ b/DDDB/src/DDDBExecutor.cpp
@@ -24,6 +24,7 @@
 #include "DD4hep/Factories.h"
 #include "DD4hep/Printout.h"
 #include "DD4hep/LCDD.h"
+#include "DD4hep/Path.h"
 
 // C/C++ include files
 #include <sys/types.h>
@@ -32,7 +33,6 @@
 #include <fcntl.h>
 #include <iostream>
 #include <cerrno>
-#include "boost/filesystem/path.hpp"
 #include "TGeoManager.h"
 #include "TRint.h"
 
@@ -121,7 +121,7 @@ static long load_xml_dddb(Geometry::LCDD& lcdd, int argc, char** argv) {
       }
     }
 
-    boost::filesystem::path path = sys_id;
+    Path path = sys_id;
     sys_id = path.normalize().c_str();
 
     /// Install helper
diff --git a/doc/CompileAllOptionPermutations.sh b/doc/CompileAllOptionPermutations.sh
index a91041c03a198743c9f89d1d695c76364d46af33..4a844cad0b50a09c0a003a06f7e9798ebe3b696b 100755
--- a/doc/CompileAllOptionPermutations.sh
+++ b/doc/CompileAllOptionPermutations.sh
@@ -134,8 +134,8 @@ build_all()
     DEF_MODES="ON OFF";
     G4_MODES="${DEF_MODES}";
     XERCES_MODES="${DEF_MODES}";
-    #XERCES_MODES="OFF";
     LCIO_MODES="${DEF_MODES}";
+    #XERCES_MODES="OFF";
     #G4_MODES="ON";
     #XERCES_MODES="OFF";
     #LCIO_MODES="ON";