diff --git a/parameter/DefaultElementLibrary.h b/parameter/DefaultElementLibrary.h
new file mode 100644
index 0000000..53a9059
--- /dev/null
+++ b/parameter/DefaultElementLibrary.h
@@ -0,0 +1,94 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2013 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ */
+#pragma once
+
+#include "ElementLibrary.h"
+#include "ElementBuilder.h"
+
+#include <map>
+#include <string>
+
+/** Factory that creates an element given an xml element. If no matching builder is found, it uses
+  * the default builder.
+  *
+  * @tparam CDefaultElementBuilder is the class of the element builder to use if no corresponding
+  *                                builder is found for a given xml element.
+  */
+template<class CDefaultElementBuilder>
+class CDefaultElementLibrary: public CElementLibrary
+{
+public:
+
+    explicit CDefaultElementLibrary(bool bEnableDefaultMechanism = true);
+    virtual ~CDefaultElementLibrary() {}
+
+    /** Enable the default builder fallback mechanism.
+      * @see createElement() for more detail on this mechanism.
+      *
+      * @param[in] bEnable if true/false, activate/deactivate the default builder mechanism.
+      */
+    void enableDefaultMechanism(bool bEnable) {
+        _bEnableDefaultMechanism = bEnable;
+    }
+
+
+    /** Create and return an element instanciated depending on an xmlElement.
+      *
+      * @param[in] xmlElement: The xml element used to find a matching builder
+      *
+      * @return If a matching builder is found, return an element created from the builder,
+      *         otherwise:
+      *             If the default mechanism is enable (@see enableDefaultMechanism),
+      *                 create the elemen with the default element builder.
+      *             otherwise, return NULL.
+      */
+    CElement* createElement(const CXmlElement& xmlElement) const;
+
+private:
+    bool _bEnableDefaultMechanism;
+    CDefaultElementBuilder _DefaultElementBuilder;
+};
+
+template<class CDefaultElementBuilder>
+CDefaultElementLibrary<CDefaultElementBuilder>::CDefaultElementLibrary(bool bEnableDefaultMechanism) :
+        _bEnableDefaultMechanism(bEnableDefaultMechanism),
+        _DefaultElementBuilder() {}
+
+template<class CDefaultElementBuilder>
+CElement* CDefaultElementLibrary<CDefaultElementBuilder>::createElement(const CXmlElement& xmlElement) const
+{
+    CElement* builtElement = CElementLibrary::createElement(xmlElement);
+
+    if (builtElement != NULL) {
+        // The element was created, return it
+        return builtElement;
+    }
+
+    if (!_bEnableDefaultMechanism) {
+        // The default builder mechanism is not enabled
+        return NULL;
+    }
+
+    // Use the default builder
+    return _DefaultElementBuilder.createElement(xmlElement);
+}
+
diff --git a/parameter/ElementLibrary.cpp b/parameter/ElementLibrary.cpp
index 695942a..2945064 100644
--- a/parameter/ElementLibrary.cpp
+++ b/parameter/ElementLibrary.cpp
@@ -57,12 +57,12 @@
     return NULL;
 }
 
-void CElementLibrary::addElementBuilder(string type, const CElementBuilder *pElementBuilder)
+void CElementLibrary::addElementBuilder(const std::string& type, const CElementBuilder *pElementBuilder)
 {
     _elementBuilderMap[type] = pElementBuilder;
 }
 
-string CElementLibrary::getBuilderType(const CXmlElement& xmlElement) const
+std::string CElementLibrary::getBuilderType(const CXmlElement& xmlElement) const
 {
     // Defaulting to xml element name
     return xmlElement.getType();
diff --git a/parameter/ElementLibrary.h b/parameter/ElementLibrary.h
index 0de6056..8f9337e 100644
--- a/parameter/ElementLibrary.h
+++ b/parameter/ElementLibrary.h
@@ -29,13 +29,11 @@
 
 #include "Element.h"
 
-using namespace std;
-
 class CElementBuilder;
 
 class CElementLibrary
 {
-    typedef map<string, const CElementBuilder*> ElementBuilderMap;
+    typedef std::map<string, const CElementBuilder*> ElementBuilderMap;
     typedef ElementBuilderMap::iterator ElementBuilderMapIterator;
     typedef ElementBuilderMap::const_iterator ElementBuilderMapConstIterator;
 
@@ -49,7 +47,7 @@
        *               create a new element.
        * @param[in] pElementBuilder is the tag associated element builder.
        */
-    void addElementBuilder(string type, const CElementBuilder *pElementBuilder);
+    void addElementBuilder(const std::string& type, const CElementBuilder *pElementBuilder);
     void clean();
 
     // Instantiation
@@ -57,7 +55,7 @@
 
 private:
     // Builder type
-    virtual string getBuilderType(const CXmlElement& xmlElement) const;
+    virtual std::string getBuilderType(const CXmlElement& xmlElement) const;
 
     // Builders
     ElementBuilderMap _elementBuilderMap;
diff --git a/parameter/SubsystemLibrary.cpp b/parameter/SubsystemLibrary.cpp
index 1f4c3e6..d6a82f4 100644
--- a/parameter/SubsystemLibrary.cpp
+++ b/parameter/SubsystemLibrary.cpp
@@ -25,15 +25,6 @@
 #include "SubsystemLibrary.h"
 #include "XmlElement.h"
 
-
-CSubsystemLibrary::CSubsystemLibrary()
-{
-}
-
-CSubsystemLibrary::~CSubsystemLibrary()
-{
-}
-
 string CSubsystemLibrary::getBuilderType(const CXmlElement& xmlElement) const
 {
     // Xml element's name attribute
diff --git a/parameter/SubsystemLibrary.h b/parameter/SubsystemLibrary.h
index 42ade57..00898ce 100644
--- a/parameter/SubsystemLibrary.h
+++ b/parameter/SubsystemLibrary.h
@@ -24,15 +24,15 @@
  */
 #pragma once
 
-#include "ElementLibrary.h"
+#include "DefaultElementLibrary.h"
+#include "VirtualSubsystem.h"
+#include "NamedElementBuilderTemplate.h"
+#include <string>
 
-class CSubsystemLibrary : public CElementLibrary
+class CSubsystemLibrary :
+        public CDefaultElementLibrary<TNamedElementBuilderTemplate<CVirtualSubsystem> >
 {
-public:
-    CSubsystemLibrary();
-    virtual ~CSubsystemLibrary();
-
 private:
     // Builder type (based on element's name attribute)
-    virtual string getBuilderType(const CXmlElement& xmlElement) const;
+    virtual std::string getBuilderType(const CXmlElement& xmlElement) const;
 };
