diff --git a/parameter/InstanceConfigurableElement.cpp b/parameter/InstanceConfigurableElement.cpp
index 4a6cacc..40ef18b 100644
--- a/parameter/InstanceConfigurableElement.cpp
+++ b/parameter/InstanceConfigurableElement.cpp
@@ -75,7 +75,8 @@
 
         for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
 
-            CInstanceConfigurableElement* pInstanceConfigurableChildElement = static_cast<CInstanceConfigurableElement*>(getChild(uiChild));
+            CInstanceConfigurableElement* pInstanceConfigurableChildElement =
+                    static_cast<CInstanceConfigurableElement*>(getChild(uiChild));
 
             if (!pInstanceConfigurableChildElement->map(mapper, strError)) {
 
diff --git a/parameter/Subsystem.cpp b/parameter/Subsystem.cpp
index f49ba64..feac79d 100644
--- a/parameter/Subsystem.cpp
+++ b/parameter/Subsystem.cpp
@@ -243,7 +243,8 @@
 
     for (uiItem = 0; uiItem < _subsystemObjectCreatorArray.size(); uiItem++) {
 
-        const CSubsystemObjectCreator* pSubsystemObjectCreator = _subsystemObjectCreatorArray[uiItem];
+        const CSubsystemObjectCreator* pSubsystemObjectCreator =
+                _subsystemObjectCreatorArray[uiItem];
 
         // Mapping key
         string strKey = pSubsystemObjectCreator->getMappingKey();
@@ -252,7 +253,8 @@
 
         if (pInstanceConfigurableElement->getMappingData(strKey, pStrValue)) {
 
-            // First check context consistency (required ancestors must have been set prior to object creation)
+            // First check context consistency
+            // (required ancestors must have been set prior to object creation)
             uint32_t uiAncestorKey;
             uint32_t uiAncestorMask = pSubsystemObjectCreator->getAncestorMask();
 
@@ -265,16 +267,19 @@
                 // Check ancestor was provided
                 if (!context.iSet(uiAncestorKey)) {
 
-                    getMappingError(strError, strKey, _contextMappingKeyArray[uiAncestorKey] + " not set", pInstanceConfigurableElement);
+                    getMappingError(strError, strKey, _contextMappingKeyArray[uiAncestorKey] +
+                                    " not set", pInstanceConfigurableElement);
 
                     return false;
                 }
             }
 
             // Then check configurable element size is correct
-            if (pInstanceConfigurableElement->getFootPrint() > pSubsystemObjectCreator->getMaxConfigurableElementSize()) {
+            if (pInstanceConfigurableElement->getFootPrint() >
+                pSubsystemObjectCreator->getMaxConfigurableElementSize()) {
 
-                string strSizeError = "Size should not exceed " + pSubsystemObjectCreator->getMaxConfigurableElementSize();
+                string strSizeError = "Size should not exceed " +
+                                      pSubsystemObjectCreator->getMaxConfigurableElementSize();
 
                 getMappingError(strError, strKey, strSizeError, pInstanceConfigurableElement);
 
@@ -282,7 +287,8 @@
             }
 
             // Do create object and keep its track
-            _subsystemObjectList.push_back(pSubsystemObjectCreator->objectCreate(*pStrValue, pInstanceConfigurableElement, context));
+            _subsystemObjectList.push_back(pSubsystemObjectCreator->objectCreate(
+                    *pStrValue, pInstanceConfigurableElement, context));
 
             // Indicate subsytem creation to caller
             bHasCreatedSubsystemObject = true;
@@ -297,9 +303,13 @@
 }
 
 // Generic error handling from derived subsystem classes
-void CSubsystem::getMappingError(string& strError, const string& strKey, const string& strMessage, const CInstanceConfigurableElement* pInstanceConfigurableElement)
+void CSubsystem::getMappingError(string& strError, const string& strKey, const string& strMessage,
+                                 const CInstanceConfigurableElement* pInstanceConfigurableElement)
 {
-    strError = getName() + " " + getKind() + " mapping:\n" + strKey + " error: \"" + strMessage + "\" for element " + pInstanceConfigurableElement->getPath();
+    strError = getName() + " " + getKind() + " "
+               "mapping:\n" + strKey + " "
+               "error: \"" + strMessage + "\" "
+               "for element " + pInstanceConfigurableElement->getPath();
 }
 
 // From IMapper
diff --git a/parameter/Subsystem.h b/parameter/Subsystem.h
index 5a0f844..996b546 100644
--- a/parameter/Subsystem.h
+++ b/parameter/Subsystem.h
@@ -82,8 +82,18 @@
     // Mapping execution
     bool mapSubsystemElements(string& strError);
 
-    // Generic subsystem mapping error handling
-    void getMappingError(string& strError, const string& strKey, const string& strMessage, const CInstanceConfigurableElement* pInstanceConfigurableElement);
+    /**
+     * Generic subsystem mapping error handling
+     *
+     * Format an human readable error string from a key and a message in case of mapping error
+     *
+     * @param[out] strError The formated error string
+     * @param[in] strKey The key on which the error refers
+     * @param[in] strMessage The error message
+     * @param[in] pInstanceConfigurableElement The element on wich the error refers
+     */
+    void getMappingError(string& strError, const string& strKey, const string& strMessage,
+                         const CInstanceConfigurableElement* pInstanceConfigurableElement);
 
     /**
      * Handle a configurable element mapping.
