diff --git a/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java b/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java
index 2d24d152f60710afab5d8ca2fbc71ede2623d9de..df6a45e45bd4b34b6432f29421f73e3bb453f0c2 100644
--- a/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java
+++ b/MessageContentAnalyzer-ejb/src/main/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBean.java
@@ -32,6 +32,7 @@ import net.ihe.gazelle.contentanalyzer.business.McaApi;
 import net.ihe.gazelle.contentanalyzer.business.MessageContentAnalyzer;
 import net.ihe.gazelle.contentanalyzer.business.analyzers.MimeTypeDetector;
 import net.ihe.gazelle.contentanalyzer.business.analyzers.XMLAnalyzer;
+import net.ihe.gazelle.contentanalyzer.business.analyzers.XMLAnalyzerFactory;
 import net.ihe.gazelle.contentanalyzer.business.exceptions.UnexpectedAnalysisException;
 import net.ihe.gazelle.contentanalyzer.business.model.*;
 import net.ihe.gazelle.contentanalyzer.business.model.config.McaConfigDAO;
@@ -108,7 +109,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
     private String displayedMessagePart;
     private Boolean indentMessageInGUI = Boolean.FALSE;
     private String messagePartLog;
-    private Map<String, String> namespaces = null ;
+    private Map<String, String> namespaces = null;
     private Boolean namespacesActuallyAdded = Boolean.FALSE;
     private String originalMessagePart;
     private boolean selectedMessagePartEdited;
@@ -131,24 +132,24 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
     ////////////////////    Getter and setter     /////////////////////////////////
     ///////////////////////////////////////////////////////////////////////////////
 
-    public void setMcaConfigDao(McaConfigDAO mcaConfigDao){
+    public void setMcaConfigDao(McaConfigDAO mcaConfigDao) {
         this.mcaConfigDao = mcaConfigDao;
     }
 
-    public McaConfigDAO getMcaConfigDao(){
+    public McaConfigDAO getMcaConfigDao() {
         return this.mcaConfigDao;
     }
 
-    public void setOidGenerator(OIDGenerator oidGenerator){
-        this.oidGenerator=oidGenerator;
+    public void setOidGenerator(OIDGenerator oidGenerator) {
+        this.oidGenerator = oidGenerator;
     }
 
-    public void setValidationCacheManager(ValidationCacheManager validationCacheManager){
+    public void setValidationCacheManager(ValidationCacheManager validationCacheManager) {
         this.validationCacheManager = validationCacheManager;
     }
 
     public void setMcaApi(McaApi mcaApi) {
-        this.mcaApi=mcaApi;
+        this.mcaApi = mcaApi;
     }
 
     public void setXmlAnalyzer(XMLAnalyzer xmlAnalyzer) {
@@ -173,11 +174,11 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return this.dataModel;
     }
 
-    public String getDisplayedMessagePart(){
+    public String getDisplayedMessagePart() {
         return this.displayedMessagePart;
     }
 
-    public String getEditedMessagePart(){
+    public String getEditedMessagePart() {
         return this.displayedMessagePart;
     }
 
@@ -185,7 +186,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         setDisplayedMessagePart(computeNewDisplayedMessagePart());
     }
 
-    public void setDisplayedMessagePart(String displayedMessagePart){
+    public void setDisplayedMessagePart(String displayedMessagePart) {
         this.displayedMessagePart = displayedMessagePart;
     }
 
@@ -278,7 +279,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         if (instance != null && instance.isLoggedIn()) {
             login = instance.getCredentials().getUsername();
             institutionKeyword = instance.getInstitutionKeyword();
-            if (instance.hasRole("monitor_role")|| instance.hasRole("admin_role")) {
+            if (instance.hasRole("monitor_role") || instance.hasRole("admin_role")) {
                 monitor = true;
             }
         }
@@ -307,11 +308,11 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         analyzerBeanBusiness.setAnalyzedObject(analyzedObject);
     }
 
-    public String getDescription(){
+    public String getDescription() {
         return analyzerBeanBusiness.getDescription();
     }
 
-    public void setDescription(String description){
+    public void setDescription(String description) {
         analyzerBeanBusiness.setDescription(description);
     }
 
@@ -319,7 +320,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return analyzerBeanBusiness.getFileContent();
     }
 
-    public String getFilePath(){
+    public String getFilePath() {
         return analyzerBeanBusiness.getFilePath();
     }
 
@@ -354,7 +355,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
     public void init() {
         final Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
         String privacyKey = null;
-        if(params.get("privacyKey")!= null){
+        if (params.get("privacyKey") != null) {
             privacyKey = params.get("privacyKey");
         }
         if (params.get("oid") != null) {
@@ -362,8 +363,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                 analyzerBeanBusiness.initWithOid(params.get("oid"), privacyKey, params.get(AnalyzerBean.TOOL_OID),
                         params.get("externalId"), params.get("proxyType"), EVSClientResults.getXValResultOidFromUrl(params), analyzedObjectPartDAO);
                 viewMessagePart(getAnalyzedObject().getFilePath(), getAnalyzedObject().getParentAnalyzedObjectPart().getChildList().get(0));
-            }
-            catch(UnexpectedAnalysisException e) {
+            } catch (UnexpectedAnalysisException e) {
                 logUnexpectedAnalysisException(e);
             }
         } else if (params.get("id") != null) {
@@ -379,8 +379,8 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                 analyzerBeanBusiness.setToolOID(params.get(AnalyzerBean.TOOL_OID));
             }
             // Get the tool externalId if exist (To send back the result)
-            if ( params.get("externalId") != null) {
-                analyzerBeanBusiness.setExternalId( params.get("externalId"));
+            if (params.get("externalId") != null) {
+                analyzerBeanBusiness.setExternalId(params.get("externalId"));
             }
             // Get the proxy type if exist and add it(To send back the result)
             if (params.get("proxyType") != null) {
@@ -397,8 +397,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
             final List tmpList = analyzedObjectPart.getChildList();
             if (tmpList != null && !tmpList.isEmpty()) {
                 tree.addChild(Integer.valueOf(index), this.processFileList(analyzedObjectPart));
-            }
-            else {
+            } else {
                 final GazelleTreeNodeImpl<AnalyzedObjectPart> node = new GazelleTreeNodeImpl<>();
                 node.setData(analyzedObjectPart);
                 tree.addChild(Integer.valueOf(index), node);
@@ -413,18 +412,18 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
 
         String fileContent;
 
-        if(node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)){
+        if (node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)) {
             FacesMessages.instance().add(Severity.INFO, "Cannot download folders");
             return;
-        } else{
+        } else {
             try {
                 fileContent = getOriginalPartContent(objectPath, node);
-            } catch (UnexpectedAnalysisException e){
+            } catch (UnexpectedAnalysisException e) {
                 logUnexpectedAnalysisException(e);
                 return;
             }
         }
-        if ((node.getValidationType()!=null && node.getValidationType() == ValidationType.DICOM)) {
+        if ((node.getValidationType() != null && node.getValidationType() == ValidationType.DICOM)) {
             try {
                 // Test base 64
                 final boolean result = Base64Converter.base64Detection(fileContent);
@@ -445,12 +444,13 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
             }
         } else {
             Map<String, String> namespaces = node.getListOfNamespacesForAnalyzedObjectPart();
-            if (namespaces != null && downloadAddedNamespaces){
+            if (namespaces != null && downloadAddedNamespaces) {
+                XMLAnalyzer xmlAnalyzer = new XMLAnalyzerFactory().getXMLAnalyzer();
                 fileContent = xmlAnalyzer.addNamespacesToFileContent(fileContent, namespaces);
                 FilesDownloader.downloadFile(fileContent, node, getAnalyzedObject(),
                         FacesContext.getCurrentInstance());
             } else if (analyzerBeanBusiness.isZipNode(node, mcaConfigDao) ||
-                    (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() && analyzerBeanBusiness.isZipNode(node.getChildList().get(0), mcaConfigDao))){
+                    (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty() && analyzerBeanBusiness.isZipNode(node.getChildList().get(0), mcaConfigDao))) {
                 FilesDownloader.downloadZipFile(objectPath, node, getAnalyzedObject(), FacesContext.getCurrentInstance());
             } else {
                 FilesDownloader.downloadFile(fileContent, node, getAnalyzedObject()
@@ -461,34 +461,32 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
 
     public void execute() {
 
-        if(analyzerBeanBusiness.getUploadedFileContent() != null){
-            try{
+        if (analyzerBeanBusiness.getUploadedFileContent() != null) {
+            try {
                 analyzerBeanBusiness.execute(getUploadedFileContent(), oidGenerator, validationCacheManager, mcaApi);
-            } catch (UnexpectedAnalysisException e){
+            } catch (UnexpectedAnalysisException e) {
                 logUnexpectedAnalysisException(e);
             }
             final ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
             try {
                 ec.redirect(getAnalyzedObject().permanentLink());
-            } catch (IOException e){
+            } catch (IOException e) {
                 FacesMessages.instance().add(Severity.ERROR, "Unable to redirect to the analysis result");
             }
-        }
-        else if (getAnalyzedObject() != null){
+        } else if (getAnalyzedObject() != null) {
             analyzerBeanBusiness.setDescription(getAnalyzedObject().getDescription());
             try {
                 analyzerBeanBusiness.executeFromPath(getAnalyzedObject().getFilePath(), oidGenerator, validationCacheManager, mcaApi);
-            } catch (UnexpectedAnalysisException e){
+            } catch (UnexpectedAnalysisException e) {
                 logUnexpectedAnalysisException(e);
             }
 
             try {
                 redirectWithCallingToolsInfo(getAnalyzedObject().permanentLink());
-            } catch (IOException e){
+            } catch (IOException e) {
                 FacesMessages.instance().add(Severity.ERROR, "Unable to redirect to the analysis result");
             }
-        }
-        else{
+        } else {
             FacesMessages.instance().add(Severity.ERROR, "Please select a file BEFORE requesting the analysis");
         }
     }
@@ -500,21 +498,21 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
 
     public void executeWithString(final String fileContent) {
         setDescription(EXECUTE_FROM_STR_DESCRIPTION);
-        try{
+        try {
             analyzerBeanBusiness.executeWithString(fileContent, oidGenerator, validationCacheManager, mcaApi);
-        } catch (UnexpectedAnalysisException e){
+        } catch (UnexpectedAnalysisException e) {
             logUnexpectedAnalysisException(e);
             return;
         }
         try {
             redirectWithCallingToolsInfo(getAnalyzedObject().permanentLink());
-        } catch (IOException e){
+        } catch (IOException e) {
             FacesMessages.instance().add(Severity.ERROR, "Unable to redirect to the analysis result");
         }
     }
 
-    private void redirectWithCallingToolsInfo(String url) throws IOException{
-        if (url != null && !url.isEmpty()){
+    private void redirectWithCallingToolsInfo(String url) throws IOException {
+        if (url != null && !url.isEmpty()) {
             if (analyzerBeanBusiness.getToolOID() != null && !analyzerBeanBusiness.getToolOID().isEmpty()) {
                 url += "&toolOid=" + analyzerBeanBusiness.getToolOID();
             }
@@ -559,17 +557,17 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return res;
     }
 
-    public String getValidationPermanentLinkFromDb(final String messageContentAnalyzerOid){
+    public String getValidationPermanentLinkFromDb(final String messageContentAnalyzerOid) {
         return AnalyzerBeanBusiness.getValidationPermanentLinkFromDb(messageContentAnalyzerOid);
     }
 
-    public String getCrossValidationPermanentLink(String oid){
+    public String getCrossValidationPermanentLink(String oid) {
         return EVSClientResults.getLastXValPermanentLinkWithExternalId(oid, ApplicationPreferenceManager.getStringValue("mca_tool_oid"),
                 ApplicationPreferenceManager.getStringValue("application_url"));
     }
 
-    public String getIconForXNode(String oid){
-        if (oid != null && !oid.isEmpty()){
+    public String getIconForXNode(String oid) {
+        if (oid != null && !oid.isEmpty()) {
             String status = EVSClientResults.getLastXValStatusWithExternalId(oid, ApplicationPreferenceManager.getStringValue("mca_tool_oid"),
                     ApplicationPreferenceManager.getStringValue("application_url"));
             if (status == null) {
@@ -585,15 +583,15 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return null;
     }
 
-    public boolean crossValidatorAvailable(String xValidatorOid){
-        if (xValidatorOid != null && !xValidatorOid.isEmpty()){
+    public boolean crossValidatorAvailable(String xValidatorOid) {
+        if (xValidatorOid != null && !xValidatorOid.isEmpty()) {
             String validatorStatus = EVSClientResults.getXValidatorStatus(xValidatorOid, ApplicationPreferenceManager.getStringValue("application_url"));
             return validatorStatus != null && !validatorStatus.isEmpty() && validatorStatus.equals("Available");
         }
         return false;
     }
 
-    public Boolean needsUpload(){
+    public Boolean needsUpload() {
         return (getAnalyzedObject() == null && getUploadedFileContent() == null);
     }
 
@@ -630,13 +628,13 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
     public String validate(final String objectPath, final AnalyzedObjectPart node) {
         String evsClientUrl = ApplicationPreferenceManager.getStringValue("application_url");
         try {
-            if ((node.getDocType().equals("ZIP") || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty()
-                    && node.getChildList().get(0).getDocType().equals("ZIP"))) ||
-                    (mcaConfigDao.getZipStructureWithDocType(node.getDocType()) != null || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty()
-                            && mcaConfigDao.getZipStructureWithDocType(node.getChildList().get(0).getDocType()) != null))){
+            if (isNodeZip(node) || isMcaConfigZip(node)) {
                 FacesMessages.instance().add(Severity.ERROR, "Cannot Validate a ZIP file");
-            } else if (node.getDecodedPartFilePath() != null) {
-                if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node .getListOfNamespacesForAnalyzedObjectPart().isEmpty()){
+                return "/messageContentAnalyzerDetailedResult.seam?oid=" + this.getAnalyzedObject().getOid();
+            }
+
+            if (node.getDecodedPartFilePath() != null) {
+                if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) {
                     ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(node.getDecodedPart(),
                             node.getValidationType(), node.getStartOffset(), node.getEndOffset(), node.getMessageContentAnalyzerOid());
                     return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl);
@@ -653,7 +651,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                     }
                     String toDecodeStringContent = getOriginalPartContent(objectPath, parent);
                     byte[] decodedPartBytesContent = Base64Converter.base64Decoding(toDecodeStringContent.getBytes(StandardCharsets.UTF_8));
-                    if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()){
+                    if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) {
                         createDecodedPart(decodedPartBytesContent, objectPath, node);
                         ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(decodedPartBytesContent, node.getValidationType(), node.getStartOffset(),
                                 node.getEndOffset(), node.getMessageContentAnalyzerOid());
@@ -661,14 +659,14 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                     } else {
                         String decodedStringContent = new String(decodedPartBytesContent, StandardCharsets.UTF_8);
                         decodedStringContent = xmlAnalyzer.addNamespacesToFileContent(decodedStringContent
-                                .substring(node.getStartOffset(), node.getEndOffset()),node.getListOfNamespacesForAnalyzedObjectPart());
+                                .substring(node.getStartOffset(), node.getEndOffset()), node.getListOfNamespacesForAnalyzedObjectPart());
                         String decodedPartPath = createAddedNamespacePart(decodedStringContent.getBytes(StandardCharsets.UTF_8), objectPath, node);
                         ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(decodedStringContent.getBytes(StandardCharsets.UTF_8), node.getValidationType(), 0,
                                 0, node.getMessageContentAnalyzerOid());
                         return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl);
                     }
                 } else if (node.getEncodedType().equals(EncodedType.ZIP_ENCODED)) {
-                    if (node.getDocType().contains(MimeTypeDetector.FOLDER_PREFIX)) {
+                    if (isNodeFolder(node)) {
                         FacesMessages.instance().add(Severity.ERROR, "Cannot validate folders");
                     } else if (node.getDocType().contains(MimeTypeDetector.FILE_PREFIX)) {
                         String decodedStringContent = getOriginalPartContent(objectPath, node);
@@ -683,7 +681,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                         }
                         String decodedStringContent = getOriginalPartContent(objectPath, parent);
 
-                        if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()){
+                        if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) {
                             String decodedPartPath = createDecodedPart(decodedStringContent.getBytes(StandardCharsets.UTF_8),
                                     objectPath, node);
                             node.setDecodedPartFilePath(decodedPartPath);
@@ -692,7 +690,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                             return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl);
                         } else {
                             decodedStringContent = xmlAnalyzer.addNamespacesToFileContent(decodedStringContent
-                                    .substring(node.getStartOffset(), node.getEndOffset()),node.getListOfNamespacesForAnalyzedObjectPart());
+                                    .substring(node.getStartOffset(), node.getEndOffset()), node.getListOfNamespacesForAnalyzedObjectPart());
                             String decodedPartPath = createAddedNamespacePart(decodedStringContent.getBytes(StandardCharsets.UTF_8),
                                     objectPath, node);
                             ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(decodedStringContent.getBytes(StandardCharsets.UTF_8), node.getValidationType(), 0,
@@ -702,21 +700,21 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                     }
                 }
             } else {
-                if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()){
+                if (node.getListOfNamespacesForAnalyzedObjectPart() == null || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty()) {
                     ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(getFileContent().getBytes(StandardCharsets.UTF_8), node.getValidationType(), node.getStartOffset(),
                             node.getEndOffset(), node.getMessageContentAnalyzerOid());
                     return EVSClientServletConnector.sendToValidationFromMcaWithoutRedirection(validationObject, evsClientUrl);
                 } else {
                     String stringFileContent;
-                    try{
+                    try {
                         stringFileContent = new String(FileUtils.readFileToByteArray(new File(objectPath)),
                                 StandardCharsets.UTF_8);
-                    }catch (IOException e){
-                        LOGGER.error("Unable to read file : ",e);
-                        throw new UnexpectedAnalysisException("Unable to read File.",e);
+                    } catch (IOException e) {
+                        LOGGER.error("Unable to read file : ", e);
+                        throw new UnexpectedAnalysisException("Unable to read File.", e);
                     }
                     stringFileContent = xmlAnalyzer.addNamespacesToFileContent(stringFileContent
-                            .substring(node.getStartOffset(), node.getEndOffset()),node.getListOfNamespacesForAnalyzedObjectPart());
+                            .substring(node.getStartOffset(), node.getEndOffset()), node.getListOfNamespacesForAnalyzedObjectPart());
                     String addedNamespacesPartPath = createAddedNamespacePart(stringFileContent.getBytes(StandardCharsets.UTF_8),
                             objectPath, node);
                     ValidationObject validationObject = analyzerBeanBusiness.createValidationObject(stringFileContent.getBytes(StandardCharsets.UTF_8), node.getValidationType(), 0,
@@ -730,20 +728,20 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return "/messageContentAnalyzerDetailedResult.seam?oid=" + this.getAnalyzedObject().getOid();
     }
 
-    public void viewMessagePart(final String objectPath,final AnalyzedObjectPart node) {
+    public void viewMessagePart(final String objectPath, final AnalyzedObjectPart node) {
 
         this.selectedMessagePartEdited = false;
         if (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty()
-                && node.getChildList().get(0).getListOfNamespacesForAnalyzedObjectPart() != null){
+                && node.getChildList().get(0).getListOfNamespacesForAnalyzedObjectPart() != null) {
             this.namespaces = node.getChildList().get(0).getListOfNamespacesForAnalyzedObjectPart();
         } else {
             this.namespaces = node.getListOfNamespacesForAnalyzedObjectPart();
         }
-        if(this.namespaces == null){
+        if (this.namespaces == null) {
             this.showAddedNamespacesInGUI = false;
             this.indentMessageInGUI = false;
         }
-        if(node.isXmlChild()){
+        if (node.isXmlChild()) {
             this.isDisplayedPartXml = true;
         } else {
             this.isDisplayedPartXml = false;
@@ -751,15 +749,12 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
 
         setMessagePartLog(node.getPartLog());
 
-        if ((node.getDocType().equals("ZIP") || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty()
-                && node.getChildList().get(0).getDocType().equals("ZIP"))) ||
-                (mcaConfigDao.getZipStructureWithDocType(node.getDocType()) != null || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty()
-                        && mcaConfigDao.getZipStructureWithDocType(node.getChildList().get(0).getDocType()) != null))){
+        if (isNodeZip(node) || isMcaConfigZip(node)) {
             FacesMessages.instance().add(Severity.INFO, "Cannot show ZIP content");
             setOriginalMessagePart(null);
             setDisplayedMessagePart();
             return;
-        }else if (node.getDocType().endsWith("/")){
+        } else if (isNodeFolder(node)) {
             FacesMessages.instance().add(Severity.INFO, "This is a directory, no content to show.");
             setOriginalMessagePart(null);
             setDisplayedMessagePart();
@@ -780,38 +775,135 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         setDisplayedMessagePart();
     }
 
+    /**
+     * Check if it has a valid XValidationResultOid
+     *
+     * @param node
+     * @return a boolean according to the getxValidationResultOid() value
+     */
+    public boolean hasValidationResultOid(final AnalyzedObjectPart node) {
+        return node != null && node.getxValidationResultOid() != null && !node.getxValidationResultOid().isEmpty();
+    }
+
+
+    /**
+     * Check if it has a valid ValidationType
+     *
+     * @param node
+     * @return a boolean according to the getValidationType() value
+     */
+    public boolean hasValidationType(final AnalyzedObjectPart node) {
+        return node != null && node.getValidationType() != null;
+    }
+
+
+    /**
+     * Check if it has a valid XValidatorOid
+     *
+     * @param node
+     * @return a boolean according to the getxValidatorOid() value
+     */
+    public boolean hasXValidatorOid(final AnalyzedObjectPart node) {
+        return node != null && node.getxValidatorOid() != null;
+    }
+
+    /**
+     * Check if the global node has a zip structure
+     *
+     * @param node
+     * @return a boolean according to the node's structure
+     */
+    public boolean isMcaConfigZip(final AnalyzedObjectPart node) {
+        if (hasDoctype(node)) {
+            return mcaConfigDao.getZipStructureWithDocType(node.getDocType()) != null || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty()
+                    && mcaConfigDao.getZipStructureWithDocType(node.getChildList().get(0).getDocType()) != null);
+        }
+        return false;
+    }
+
+    /**
+     * Check if the node is a zip, or one of its child is a zip
+     *
+     * @param node
+     * @return a boolean according to the node's type
+     */
+    public boolean isNodeZip(final AnalyzedObjectPart node) {
+        if (hasDoctype(node)) {
+            return node.getDocType().equals("ZIP") || (node.getDocType().equals("DOCUMENT") && !node.getChildList().isEmpty()
+                    && node.getChildList().get(0).getDocType().equals("ZIP"));
+        }
+        return false;
+    }
+
+    /**
+     * Check if the node is a folder
+     *
+     * @param node
+     * @return a boolean according to the node's type
+     */
+    public boolean isNodeFolder(AnalyzedObjectPart node) {
+        if (hasDoctype(node)) {
+            return node.getDocType().contains(MimeTypeDetector.FOLDER_PREFIX) || node.getDocType().endsWith("/");
+        }
+        return false;
+    }
+
+    /**
+     * Check if it has a valid DocType
+     *
+     * @param node
+     * @return a boolean according to the getValidationType() value
+     */
+    public boolean hasDoctype(final AnalyzedObjectPart node) {
+        return node != null && node.getDocType() != null && !node.getDocType().isEmpty();
+    }
+
+    /**
+     * Business logic : Check if the node has a validationType, is not a zip nor a folder before rendering the icon
+     *
+     * @param node
+     * @return a boolean according to the business logic
+     */
+    public boolean shouldRenderValidationIcon(final AnalyzedObjectPart node) {
+        if (hasValidationType(node)) {
+            return false;
+        }
+        return !isNodeFolder(node) && !isNodeZip(node) && !isMcaConfigZip(node);
+    }
+
+
     ///////////////////////////////////////////////////////////////////////////////
     ////////////////////      Private Methods     /////////////////////////////////
     ///////////////////////////////////////////////////////////////////////////////
 
     private String computeNewDisplayedMessagePart() {
 
-        if (this.originalMessagePart == null){
+        if (this.originalMessagePart == null) {
             return "";
         }
 
         String fileContent = null;
-        if (this.showAddedNamespacesInGUI && namespaces != null){
-            fileContent = xmlAnalyzer.addNamespacesToFileContent(this.originalMessagePart,namespaces);
-            if(fileContent.equals(this.originalMessagePart)){
+        if (this.showAddedNamespacesInGUI && namespaces != null) {
+            fileContent = xmlAnalyzer.addNamespacesToFileContent(this.originalMessagePart, namespaces);
+            if (fileContent.equals(this.originalMessagePart)) {
                 this.namespacesActuallyAdded = false;
             } else {
                 this.namespacesActuallyAdded = true;
             }
         }
-        if (this.indentMessageInGUI){
-            if (fileContent != null){
+        if (this.indentMessageInGUI) {
+            if (fileContent != null) {
                 return AnalyzerUtils.prettyFormat(fileContent);
             }
             return AnalyzerUtils.prettyFormat(this.originalMessagePart);
         }
-        if (fileContent != null){
+        if (fileContent != null) {
             return fileContent;
         }
         return this.originalMessagePart;
     }
 
-    private String createDecodedPart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node){
+    private String createDecodedPart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node) {
 
         String decodedPartPath = abpm.computeEditedPartPath(objectPath, node.getMessageContentAnalyzerOid(), getAnalyzedObject().getOid());
         abpm.createFile(decodedPartBytesContent, decodedPartPath);
@@ -820,7 +912,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return decodedPartPath;
     }
 
-    private String createAddedNamespacePart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node){
+    private String createAddedNamespacePart(byte[] decodedPartBytesContent, String objectPath, AnalyzedObjectPart node) {
 
         String decodedPartPathWithAddedNamespaces = abpm.computeEditedPartPath(objectPath, node.getMessageContentAnalyzerOid(), getAnalyzedObject().getOid());
         abpm.createFile(decodedPartBytesContent, decodedPartPathWithAddedNamespaces);
@@ -829,7 +921,7 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return decodedPartPathWithAddedNamespaces;
     }
 
-    private String getOriginalPartContent(final String objectPath, final AnalyzedObjectPart node) throws UnexpectedAnalysisException{
+    private String getOriginalPartContent(final String objectPath, final AnalyzedObjectPart node) throws UnexpectedAnalysisException {
 
         File file = new File(objectPath);
 
@@ -838,31 +930,31 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         byte[] bytes = null;
         DicomToTxtTransformer dicomToTxtTransformer = new DicomToTxtTransformer();
 
-        if (node.getDecodedPartFilePath() != null && (node.getListOfNamespacesForAnalyzedObjectPart()==null
+        if (node.getDecodedPartFilePath() != null && (node.getListOfNamespacesForAnalyzedObjectPart() == null
                 || node.getListOfNamespacesForAnalyzedObjectPart().isEmpty())) {
-            try{
+            try {
                 return new String(FileUtils.readFileToByteArray(new File(node.getDecodedPartFilePath())), StandardCharsets.UTF_8);
-            }catch (IOException e){
-                LOGGER.error("Unable to read file : ",e);
-                throw new UnexpectedAnalysisException("Unable to read File.",e);
+            } catch (IOException e) {
+                LOGGER.error("Unable to read file : ", e);
+                throw new UnexpectedAnalysisException("Unable to read File.", e);
             }
         }
 
-        if(node.getDocType().equals("DOCUMENT")){
-            try{
-                byte [] byteFileContent =  FileUtils.readFileToByteArray(file);
-                if(!node.getChildList().isEmpty()
-                        && node.getChildList().get(0).getDocType().equals(DICOM)){
+        if (node.getDocType().equals("DOCUMENT")) {
+            try {
+                byte[] byteFileContent = FileUtils.readFileToByteArray(file);
+                if (!node.getChildList().isEmpty()
+                        && node.getChildList().get(0).getDocType().equals(DICOM)) {
                     byteFileContent = dicomToTxtTransformer.dicom2txt(byteFileContent);
                 }
                 return new String(byteFileContent, StandardCharsets.UTF_8);
-            }catch (IOException e){
-                LOGGER.error("Unable to read file : ",e);
-                throw new UnexpectedAnalysisException("Unable to read File.",e);
+            } catch (IOException e) {
+                LOGGER.error("Unable to read file : ", e);
+                throw new UnexpectedAnalysisException("Unable to read File.", e);
             }
         }
 
-        if (!node.getEncodedType().equals(EncodedType.NOT_ENCODED)){
+        if (!node.getEncodedType().equals(EncodedType.NOT_ENCODED)) {
             if (node.getEncodedType().equals(EncodedType.B64_ENCODED)) {
                 while (!parent.getDocType().equals(MessageContentAnalyzer.BASE64)) {
                     parent = parent.getParent();
@@ -880,19 +972,19 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                     fileContent = new String(decodedByteContent, StandardCharsets.UTF_8).substring(node.getStartOffset(), node.getEndOffset());
                     return fileContent;
                 }
-            }else if (node.getEncodedType().equals(EncodedType.ZIP_ENCODED)){
-                if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX) || node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)){
+            } else if (node.getEncodedType().equals(EncodedType.ZIP_ENCODED)) {
+                if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX) || node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)) {
 
                     ZipInputStream zipIn = null;
                     String expectedEntryName = "";
                     String entryName;
-                    if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX)){
+                    if (node.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX)) {
                         expectedEntryName = node.getDocType().replace(MimeTypeDetector.FILE_PREFIX, "");
-                    } else if (node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)){
+                    } else if (node.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)) {
                         expectedEntryName = node.getDocType().replace(MimeTypeDetector.FOLDER_PREFIX, "");
                     }
 
-                    try{
+                    try {
                         zipIn = new ZipInputStream(new ByteArrayInputStream(FileUtils.readFileToByteArray(file)));
                         ZipEntry entry = zipIn.getNextEntry();
                         entryName = entry.getName();
@@ -906,57 +998,57 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
                         byte[] zipFileContent = mimeTypeDetector.extractFile(zipIn);
 
                         if (!node.getChildList().isEmpty() && node.getChildList().get(0).getValidationType() != null &&
-                                node.getChildList().get(0).getValidationType() == ValidationType.DICOM){
+                                node.getChildList().get(0).getValidationType() == ValidationType.DICOM) {
                             zipFileContent = dicomToTxtTransformer.dicom2txt(zipFileContent);
                             return new String(zipFileContent, StandardCharsets.UTF_8);
                         }
                         return new String(zipFileContent, StandardCharsets.UTF_8);
-                    } catch (IOException e){
-                        LOGGER.error("Unable to read zip file : ",e);
-                        throw new UnexpectedAnalysisException("Unable to read zip File.",e);
+                    } catch (IOException e) {
+                        LOGGER.error("Unable to read zip file : ", e);
+                        throw new UnexpectedAnalysisException("Unable to read zip File.", e);
                     }
 
-                }else{
+                } else {
                     while (!parent.getDocType().startsWith(MimeTypeDetector.FOLDER_PREFIX)
-                            && !parent.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX) ) {
+                            && !parent.getDocType().startsWith(MimeTypeDetector.FILE_PREFIX)) {
                         parent = parent.getParent();
                     }
                     fileContent = getOriginalPartContent(objectPath, parent);
                     if (node.getValidationType() != null &&
-                            node.getValidationType() == ValidationType.DICOM){
+                            node.getValidationType() == ValidationType.DICOM) {
                         return fileContent;
                     }
                     return fileContent.substring(node.getStartOffset(), node.getEndOffset());
                 }
             }
 
-        } else if (node.getValidationType() != null && node.getValidationType() == ValidationType.DICOM){
+        } else if (node.getValidationType() != null && node.getValidationType() == ValidationType.DICOM) {
             try {
                 bytes = FileUtils.readFileToByteArray(file);
             } catch (final IOException e) {
                 AnalyzerBean.LOGGER.error(e.getMessage());
             }
 
-            if(bytes != null) {
+            if (bytes != null) {
                 bytes = dicomToTxtTransformer.dicom2txt(bytes);
                 return new String(bytes, StandardCharsets.UTF_8);
             }
-        }else if(node.getDocType().equals(MimeTypeConfigEnum.ZIP.getDocType())){
+        } else if (node.getDocType().equals(MimeTypeConfigEnum.ZIP.getDocType())) {
 
             try {
                 byte[] byteContent = FileUtils.readFileToByteArray(file);
                 fileContent = new String(byteContent, StandardCharsets.UTF_8);
                 return fileContent;
-            }catch (IOException e){
-                LOGGER.error("Unable to read file : ",e);
-                throw new UnexpectedAnalysisException("Unable to read File",e);
+            } catch (IOException e) {
+                LOGGER.error("Unable to read file : ", e);
+                throw new UnexpectedAnalysisException("Unable to read File", e);
             }
         } else {
-            try{
+            try {
                 fileContent = new String(FileUtils.readFileToByteArray(file), StandardCharsets.UTF_8);
-            } catch (IOException e){
-                LOGGER.error("Unable to read file : ",e);
-                throw new UnexpectedAnalysisException("Unable to read File",e);
+            } catch (IOException e) {
+                LOGGER.error("Unable to read file : ", e);
+                throw new UnexpectedAnalysisException("Unable to read File", e);
             }
             fileContent = fileContent.substring(node.getStartOffset(), node.getEndOffset());
             return fileContent;
@@ -964,9 +1056,9 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return "Error retrieving string content";
     }
 
-    private void logUnexpectedAnalysisException(UnexpectedAnalysisException e){
+    private void logUnexpectedAnalysisException(UnexpectedAnalysisException e) {
 
-        FacesMessages.instance().add(Severity.ERROR, e.getMessage() + " Please contact an administrator.");
+        FacesMessages.instance().add(Severity.ERROR, e.getMessage() + "Please contact an administrator.");
     }
 
     private GazelleTreeNodeImpl<AnalyzedObjectPart> processFileList(final AnalyzedObjectPart file) {
@@ -987,24 +1079,24 @@ public class AnalyzerBean implements QueryModifier<AnalyzedObject> {
         return tree;
     }
 
-    public void sendToXValidation(final AnalyzedObjectPart p_o_analyzedObjectPart){
+    public void sendToXValidation(final AnalyzedObjectPart p_o_analyzedObjectPart) {
 
         List<AnalyzedObjectPart> l_l_xValInputsList = p_o_analyzedObjectPart.getXValInputList();
         List<EVSClientCrossValidatedObject> l_l_crossValidationInputList = new ArrayList<>();
-        for (AnalyzedObjectPart l_o_input: l_l_xValInputsList){
+        for (AnalyzedObjectPart l_o_input : l_l_xValInputsList) {
             try {
                 l_l_crossValidationInputList.add(new CrossValidationInput(l_o_input.getxValInputType(),
-                                getOriginalPartContent(this.getAnalyzedObject().getFilePath(), l_o_input).getBytes(StandardCharsets.UTF_8),
+                        getOriginalPartContent(this.getAnalyzedObject().getFilePath(), l_o_input).getBytes(StandardCharsets.UTF_8),
                         "xml"));
-            } catch (UnexpectedAnalysisException e){
+            } catch (UnexpectedAnalysisException e) {
                 logUnexpectedAnalysisException(e);
             }
         }
-        try{
+        try {
             EVSClientServletConnector.sendToXValidation(l_l_crossValidationInputList, FacesContext.getCurrentInstance().getExternalContext(),
                     ApplicationPreferenceManager.getStringValue("application_url"), ApplicationPreferenceManager.getStringValue("mca_tool_oid"), p_o_analyzedObjectPart.getxValidatorOid(),
                     p_o_analyzedObjectPart.getMessageContentAnalyzerOid());
-        } catch (IOException e){
+        } catch (IOException e) {
             FacesMessages.instance().add(Severity.ERROR, "Cannot redirect to Cross Validation");
         }
     }
diff --git a/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java b/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java
index d00820780a2672d59c1f9d61dd246b4bb1e68ca4..4a1a11842ca9736f3d0f5d77296aad556606f5a8 100644
--- a/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java
+++ b/MessageContentAnalyzer-ejb/src/test/java/net/ihe/gazelle/contentanalyzer/gui/AnalyzerBeanTest.java
@@ -4,8 +4,11 @@ import net.ihe.gazelle.common.application.action.ApplicationPreferenceManager;
 import net.ihe.gazelle.contentanalyzer.app.AnalyzerBeanBusiness;
 import net.ihe.gazelle.contentanalyzer.app.McaPersistenceManager;
 import net.ihe.gazelle.contentanalyzer.business.McaApiImpl;
+import net.ihe.gazelle.contentanalyzer.business.analyzers.MimeTypeDetector;
 import net.ihe.gazelle.contentanalyzer.business.analyzers.XMLAnalyzerFactory;
 import net.ihe.gazelle.contentanalyzer.business.model.AnalyzedObject;
+import net.ihe.gazelle.contentanalyzer.business.model.AnalyzedObjectPart;
+import net.ihe.gazelle.contentanalyzer.business.model.ValidationType;
 import net.ihe.gazelle.contentanalyzer.business.model.config.McaConfigDaoStub;
 import net.ihe.gazelle.evsclient.common.action.ValidationCacheManager;
 import net.ihe.gazelle.evsclient.common.model.OIDGenerator;
@@ -30,16 +33,20 @@ import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.persistence.EntityManager;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import static org.junit.Assert.*;
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 
 @RunWith(PowerMockRunner.class)
-@PrepareForTest({ ApplicationPreferenceManager.class, OIDGenerator.class, EntityManager.class, SharedResult.class,
+@PrepareForTest({ApplicationPreferenceManager.class, OIDGenerator.class, EntityManager.class, SharedResult.class,
         ValidationCacheManager.class, EntityManagerService.class, VersionProvider.class, ExternalContext.class,
         FacesContext.class, AnalyzerBeanBusiness.class})
-@PowerMockIgnore({ "org.xml.*", "org.w3c.*", "javax.xml.*" })
+@PowerMockIgnore({"org.xml.*", "org.w3c.*", "javax.xml.*"})
 public class AnalyzerBeanTest {
 
     @Mock
@@ -50,7 +57,7 @@ public class AnalyzerBeanTest {
     AnalyzerBean analyzerBean;
 
     @Before
-    public void setUp() throws Exception{
+    public void setUp() throws Exception {
 
         MockitoAnnotations.initMocks(this);
 
@@ -71,6 +78,31 @@ public class AnalyzerBeanTest {
         mockEntityManager();
     }
 
+    private void setOriginalMessagePart() {
+        analyzerBean.setOriginalMessagePart("<s:Body xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\n" +
+                "        <wsnt:Subscribe xmlns:wsnt=\"http://docs.oasis-open.org/wsn/b-2\">\n" +
+                "            <wsnt:ConsumerReference>\n" +
+                "                <a:Address xmlns:a=\"http://www.w3.org/2005/08/addressing\">http://abc.com/1123</a:Address>\n" +
+                "            </wsnt:ConsumerReference>\n" +
+                "            <wsnt:Filter>\n" +
+                "                <wsnt:TopicExpression Dialect=\"http://docs.oasis-open.org/wsn/t-1080 1/TopicExpression/Simple\">\n" +
+                "                    ihe:FullDocumentEntry\n" +
+                "                </wsnt:TopicExpression>\n" +
+                "                <rim:AdhocQuery xmlns:rim=\"urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0\" id=\"urn:uuid:aa2332d0-f8fe-11e0-be50-0800200c9a66\">\n" +
+                "                    <rim:Slot name=\"$XDSDocumentEntryPatientId\">\n" +
+                "                        <rim:ValueList>\n" +
+                "                            <rim:Value>'1234'</rim:Value>\n" +
+                "                        </rim:ValueList>\n" +
+                "                    </rim:Slot>\n" +
+                "                </rim:AdhocQuery>\n" +
+                "            </wsnt:Filter>\n" +
+                "            <wsnt:InitialTerminationTime>2014-05-19T16:16:02.7686801+01:00</wsnt:InitialTerminationTime>\n" +
+                "        </wsnt:Subscribe>\n" +
+                "    </s:Body>");
+        analyzerBean.setDisplayedMessagePart();
+        analyzerBean.executeOnEditedPart();
+    }
+
     private void mockObjectSave() {
         PowerMockito.mockStatic(ApplicationPreferenceManager.class);
         PowerMockito.mockStatic(SharedResult.class);
@@ -109,13 +141,13 @@ public class AnalyzerBeanTest {
     private void mockExternalContext() {
         PowerMockito.mockStatic(FacesContext.class);
         PowerMockito.mockStatic(ExternalContext.class);
-        FacesContext facesContext =  PowerMockito.mock(FacesContext.class);
+        FacesContext facesContext = PowerMockito.mock(FacesContext.class);
         ExternalContext externalContext = PowerMockito.mock(ExternalContext.class);
         PowerMockito.when(FacesContext.getCurrentInstance()).thenReturn(facesContext);
         PowerMockito.when(facesContext.getExternalContext()).thenReturn(externalContext);
     }
 
-    private void mockEntityManager() throws Exception{
+    private void mockEntityManager() throws Exception {
         EntityManager em = PowerMockito.mock(EntityManager.class);
         PowerMockito.mockStatic(EntityManagerService.class);
         PowerMockito.when(EntityManagerService.provideEntityManager()).thenReturn(em);
@@ -148,6 +180,150 @@ public class AnalyzerBeanTest {
         });
     }
 
+    @Test
+    public void testFolderWithoutDocType() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType(null);
+        assertFalse(analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testWithFolderPrefix() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType(MimeTypeDetector.FOLDER_PREFIX);
+        assert (analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testFolderWithSlashEnding() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType("/");
+        assert (analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testFolderWithoutFolderContent() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType("notAFolder");
+        assertFalse(analyzerBean.isNodeFolder(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testMCAZipWithoutDocType() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType(null);
+        assertFalse(analyzerBean.isMcaConfigZip(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testMCAZipWithZipContent() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType("ZIP");
+        AnalyzerBean analyzerBeanMock = spy(analyzerBean);
+        when(analyzerBeanMock.isMcaConfigZip(analyzedObject.getParentAnalyzedObjectPart())).thenReturn(true);
+        assert (analyzerBeanMock.isMcaConfigZip(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testZipWithoutDocType() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType(null);
+        assertFalse(analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testNodeZipWithZipContent() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType("ZIP");
+        assert (analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testNodeZipWithoutZipContent() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType("NotAZIP");
+        assertFalse(analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testNodeZipWithChildZipContent() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setDocType("DOCUMENT");
+
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject childObject = analyzerBean.getAnalyzedObject();
+        childObject.getParentAnalyzedObjectPart().setDocType("ZIP");
+        List<AnalyzedObjectPart> childObjectParts = new ArrayList<>();
+        childObjectParts.add(childObject.getParentAnalyzedObjectPart());
+
+        analyzedObject.getParentAnalyzedObjectPart().setChildList(childObjectParts);
+        assert (analyzerBean.isNodeZip(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+
+    @Test
+    public void testNullObjectDocType() {
+        analyzerBean.reset();
+        assertFalse(analyzerBean.hasDoctype(null));
+    }
+
+    @Test
+    public void testNullDocType() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.setParentAnalyzedObjectPart(null);
+        assertFalse(analyzerBean.hasDoctype(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+
+    @Test
+    public void testHasDocType() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        assert (analyzerBean.hasDoctype(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testRenderValidationIconWithDoctype() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        analyzedObject.getParentAnalyzedObjectPart().setValidationType(ValidationType.ATNA);
+        assertFalse(analyzerBean.shouldRenderValidationIcon(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+    @Test
+    public void testRenderValidationIconWithoutDoctype() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
+        AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
+        assert(analyzerBean.shouldRenderValidationIcon(analyzedObject.getParentAnalyzedObjectPart()));
+    }
+
+
     @Test
     public void test_reset() {
         analyzerBean.reset();
@@ -159,30 +335,9 @@ public class AnalyzerBeanTest {
     }
 
     @Test
-    public void executeWithStringTest(){
-        analyzerBean.setOriginalMessagePart("<s:Body xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\">\n" +
-                "        <wsnt:Subscribe xmlns:wsnt=\"http://docs.oasis-open.org/wsn/b-2\">\n" +
-                "            <wsnt:ConsumerReference>\n" +
-                "                <a:Address xmlns:a=\"http://www.w3.org/2005/08/addressing\">http://abc.com/1123</a:Address>\n" +
-                "            </wsnt:ConsumerReference>\n" +
-                "            <wsnt:Filter>\n" +
-                "                <wsnt:TopicExpression Dialect=\"http://docs.oasis-open.org/wsn/t-1080 1/TopicExpression/Simple\">\n" +
-                "                    ihe:FullDocumentEntry\n" +
-                "                </wsnt:TopicExpression>\n" +
-                "                <rim:AdhocQuery xmlns:rim=\"urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0\" id=\"urn:uuid:aa2332d0-f8fe-11e0-be50-0800200c9a66\">\n" +
-                "                    <rim:Slot name=\"$XDSDocumentEntryPatientId\">\n" +
-                "                        <rim:ValueList>\n" +
-                "                            <rim:Value>'1234'</rim:Value>\n" +
-                "                        </rim:ValueList>\n" +
-                "                    </rim:Slot>\n" +
-                "                </rim:AdhocQuery>\n" +
-                "            </wsnt:Filter>\n" +
-                "            <wsnt:InitialTerminationTime>2014-05-19T16:16:02.7686801+01:00</wsnt:InitialTerminationTime>\n" +
-                "        </wsnt:Subscribe>\n" +
-                "    </s:Body>");
-        analyzerBean.setDisplayedMessagePart();
-        analyzerBean.executeOnEditedPart();
-
+    public void executeWithStringTest() {
+        analyzerBean.reset();
+        setOriginalMessagePart();
         AnalyzedObject analyzedObject = analyzerBean.getAnalyzedObject();
 
         assertEquals("XML", analyzedObject.getParentAnalyzedObjectPart().getChildList().get(0).getChildList().get(0).getDocType());
diff --git a/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml b/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml
index 4273b399a11ac3cb0f6b1f633a6ea0a73484e713..b9cde3e2901cc52ab4bf49d490664213d86a1e79 100644
--- a/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml
+++ b/MessageContentAnalyzer-war/src/main/webapp/common/_messageContentAnalyzerResultDiv.xhtml
@@ -48,7 +48,8 @@
                             <rich:treeNode expanded="#{true}">
 
                                 <s:span title="#{messages['net.ihe.gazelle.mca.NoNamespaceIsDefinedForThisTagSoWeCouldntLinkItT']}"
-                                        rendered="#{node.data.noDefinedNamespace}" styleClass="gzl-icon-exclamation-triangle"/>
+                                        rendered="#{node.data.noDefinedNamespace}"
+                                        styleClass="gzl-icon-exclamation-triangle"/>
 
                                 <a4j:commandLink
                                         title="#{messages['net.ihe.gazelle.evs.ViewPart']}"
@@ -63,15 +64,17 @@
                                         value="#{analyzerBean.getValidationPermanentLinkFromDb(node.data.messageContentAnalyzerOid)}"
                                         target="_blank"
                                         rendered="#{analyzerBean.getValidationPermanentLinkFromDb(node.data.messageContentAnalyzerOid)!='not performed'}">
-                                    <s:span title="#{messages['gazelle.evs.ClickToViewValidationOutcome']}" styleClass="#{analyzerBean.getIconForNode(node.data)}"/>
+                                    <s:span title="#{messages['gazelle.evs.ClickToViewValidationOutcome']}"
+                                            styleClass="#{analyzerBean.getIconForNode(node.data)}"/>
                                 </h:outputLink>
 
                                 <!--XVal result-->
                                 <h:outputLink
                                         value="#{analyzerBean.getCrossValidationPermanentLink(node.data.messageContentAnalyzerOid)}"
                                         target="_blank"
-                                        rendered="#{node.data.xValidationResultOid != null and not empty node.data.xValidationResultOid}">
-                                    <s:span title="#{messages['net.ihe.gazelle.mca.ClickToViewCrossValidationOutcome']}" styleClass="#{analyzerBean.getIconForXNode(node.data.messageContentAnalyzerOid)}"/>
+                                        rendered="#{analyzerBean.hasValidationResultOid(node.data)}">
+                                    <s:span title="#{messages['net.ihe.gazelle.mca.ClickToViewCrossValidationOutcome']}"
+                                            styleClass="#{analyzerBean.getIconForXNode(node.data.messageContentAnalyzerOid)}"/>
                                 </h:outputLink>
 
 
@@ -79,35 +82,42 @@
                                         action="#{analyzerBean.validate(analyzerBean.getFilePath(),node.data)}"
                                         target="_blank"
                                         execute="resultFormTokenId"
-                                        rendered="#{node.data.validationType!=null and not empty node.data.validationType}">
-                                    <s:span title="#{messages['net.ihe.gazelle.xval.Validate']}" styleClass="gzl-icon-play"/>
+                                        rendered="#{analyzerBean.hasValidationType(node.data)}">
+                                    <s:span title="#{messages['net.ihe.gazelle.xval.Validate']}"
+                                            styleClass="gzl-icon-play"/>
                                 </a4j:commandLink>
 
                                 <a4j:commandLink
                                         action="#{analyzerBean.validate(analyzerBean.getFilePath(),node.data)}"
                                         target="_blank"
                                         execute="resultFormTokenId"
-                                        rendered="#{empty node.data.validationType}">
+                                        rendered="#{analyzerBean.shouldRenderValidationIcon(node.data)}">
                                     <span class="gzl-icon-stack" title="#{messages['net.ihe.gazelle.xval.Validate']}">
                                         <em class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/>
                                         <em class="gzl-icon-question-circle gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/>
                                     </span>
+
                                 </a4j:commandLink>
 
+
                                 <h:commandLink actionListener="#{analyzerBean.sendToXValidation(node.data)}"
-                                               rendered="#{node.data.xValidatorOid != null and not empty node.data.xValidatorOid and
+                                               rendered="#{analyzerBean.hasXValidatorOid(node.data) and
                                                 analyzerBean.crossValidatorAvailable(node.data.xValidatorOid)}">
-                                    <span class="gzl-icon-stack" title="#{messages['net.ihe.gazelle.mca.SendToCrossValidation']}">
+                                    <span class="gzl-icon-stack"
+                                          title="#{messages['net.ihe.gazelle.mca.SendToCrossValidation']}">
                                         <em class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/>
                                         <em class="gzl-icon-times-blue gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/>
                                     </span>
                                 </h:commandLink>
 
-                                <s:span styleClass="gzl-icon-stack" title="#{messages['net.ihe.gazelle.mca.CrossValidatorNotAvailable']}"
-                                    rendered="#{node.data.xValidatorOid != null and not empty node.data.xValidatorOid and
+                                <s:span styleClass="gzl-icon-stack"
+                                        title="#{messages['net.ihe.gazelle.mca.CrossValidatorNotAvailable']}"
+                                        rendered="#{analyzerBean.hasXValidatorOid(node.data) and
                                                 not analyzerBean.crossValidatorAvailable(node.data.xValidatorOid)}">
-                                        <em style="color:C6C6C6" class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/>
-                                        <em style="color:C6C6C6" class="gzl-icon-times-blue gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/>
+                                    <em style="color:C6C6C6"
+                                        class="gzl-icon-play gzl-icon-stack-1x gzl-icon-stack-up "/>
+                                    <em style="color:C6C6C6"
+                                        class="gzl-icon-times-blue gzl-icon-stack-1x gzl-icon-stack-small-bottom-right"/>
                                 </s:span>
 
                                 <h:commandLink
@@ -115,14 +125,17 @@
                                         ignoreDupResponses="true"
                                         action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath,node.data, false)}"
                                         rendered="#{node.data.listOfNamespacesForAnalyzedObjectPart == null}">
-                                    <s:span title="#{messages['net.ihe.gazelle.xval.Download']}" styleClass="gzl-icon-download"/>
+                                    <s:span title="#{messages['net.ihe.gazelle.xval.Download']}"
+                                            styleClass="gzl-icon-download"/>
                                 </h:commandLink>
 
-                                <s:div rendered="#{node.data.listOfNamespacesForAnalyzedObjectPart != null}" style="display: inline">
+                                <s:div rendered="#{node.data.listOfNamespacesForAnalyzedObjectPart != null}"
+                                       style="display: inline">
 
                                     <a title="#{messages['net.ihe.gazelle.evs.DownloadPart']}"
                                        onclick="jq162('#downloadPopup#{node.data.id}').modal('show');">
-                                        <s:span title="#{messages['net.ihe.gazelle.evs.DownloadPart']}" styleClass="gzl-icon-download"/>
+                                        <s:span title="#{messages['net.ihe.gazelle.evs.DownloadPart']}"
+                                                styleClass="gzl-icon-download"/>
                                     </a>
 
                                     <ui:decorate template="/layout/popup/_popup_title_footer.xhtml">
@@ -130,22 +143,28 @@
                                         <ui:param name="bodyStyleClass" value="bg-warning"/>
                                         <ui:define name="popup_title">
                                             <s:span styleClass="gzl-icon-exclamation-triangle"/>
-                                            <h:outputText value="#{messages['net.ihe.gazelle.mca.DownloadAnalysisSubpart']}"/>
+                                            <h:outputText
+                                                    value="#{messages['net.ihe.gazelle.mca.DownloadAnalysisSubpart']}"/>
                                         </ui:define>
 
-                                        <p>#{messages['net.ihe.gazelle.mca.YouAreAboutToDownloadTheContentOfASubpartFromThe']}</p>
-                                        <p>#{messages['net.ihe.gazelle.mca.NamespacesFromPreviousPartsMayBeReportedBeforeTh']}</p>
-                                        <p>#{messages['net.ihe.gazelle.mca.DoYouWantToDownloadTheOriginalContentOrTheAdjust']}</p>
+                                        <p>
+                                            #{messages['net.ihe.gazelle.mca.YouAreAboutToDownloadTheContentOfASubpartFromThe']}</p>
+                                        <p>
+                                            #{messages['net.ihe.gazelle.mca.NamespacesFromPreviousPartsMayBeReportedBeforeTh']}</p>
+                                        <p>
+                                            #{messages['net.ihe.gazelle.mca.DoYouWantToDownloadTheOriginalContentOrTheAdjust']}</p>
 
                                         <ui:define name="popup_footer">
-                                            <h:commandButton value="#{messages['net.ihe.gazelle.mca.DownloadOriginalContent']}"
-                                                             action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, false)}"
-                                                             oncomplete="jq162('#downloadPopup').modal('hide');"
-                                                             styleClass="gzl-btn-blue"/>
-                                            <h:commandButton value="#{messages['net.ihe.gazelle.mca.DownloadAdjustedContent']}"
-                                                             action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, true)}"
-                                                             styleClass="gzl-btn-blue"
-                                                             oncomplete="jq162('#downloadPopup').modal('hide');"/>
+                                            <h:commandButton
+                                                    value="#{messages['net.ihe.gazelle.mca.DownloadOriginalContent']}"
+                                                    action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, false)}"
+                                                    oncomplete="jq162('#downloadPopup').modal('hide');"
+                                                    styleClass="gzl-btn-blue"/>
+                                            <h:commandButton
+                                                    value="#{messages['net.ihe.gazelle.mca.DownloadAdjustedContent']}"
+                                                    action="#{analyzerBean.downloadFile(analyzerBean.analyzedObject.filePath, node.data, true)}"
+                                                    styleClass="gzl-btn-blue"
+                                                    oncomplete="jq162('#downloadPopup').modal('hide');"/>
                                         </ui:define>
                                     </ui:decorate>
                                 </s:div>
@@ -158,67 +177,79 @@
                     <a4j:region>
                         <div class="col-md-8">
                             <div class="row">
-                                    <div class="col-md-12">
-                                    <s:decorate template="/layout/form/_checkbox.xhtml" rendered="#{analyzerBean.isDisplayedPartXml}">
+                                <div class="col-md-12">
+                                    <s:decorate template="/layout/form/_checkbox.xhtml"
+                                                rendered="#{analyzerBean.isDisplayedPartXml}">
                                         <ui:param name="id" value="cb2"/>
-                                        <ui:define name="label"><h:outputText value="#{messages['net.ihe.gazelle.mca.IndentContent']}"/></ui:define>
+                                        <ui:define name="label">
+                                            <h:outputText value="#{messages['net.ihe.gazelle.mca.IndentContent']}"/>
+                                        </ui:define>
                                         <h:selectBooleanCheckbox id="cb2" value="#{analyzerBean.indentMessageInGUI}">
                                             <a4j:ajax event="change" render="panelPartArea"/>
                                         </h:selectBooleanCheckbox>
                                     </s:decorate>
-                                    <h:outputText value="#{messages['net.ihe.gazelle.mca.TheContentOfThisPartMayReferToNamespacesDefinedI']}"
-                                                  rendered="#{analyzerBean.isDisplayedPartXml and analyzerBean.namespaces != null}"/><br />
+                                    <h:outputText
+                                            value="#{messages['net.ihe.gazelle.mca.TheContentOfThisPartMayReferToNamespacesDefinedI']}"
+                                            rendered="#{analyzerBean.isDisplayedPartXml and analyzerBean.namespaces != null}"/>
+                                    <br/>
                                     <s:decorate template="/layout/form/_checkbox.xhtml"
                                                 rendered="#{analyzerBean.isDisplayedPartXml and analyzerBean.namespaces != null}">
                                         <ui:param name="id" value="cb3"/>
                                         <ui:define name="label">
-                                            <h:outputText value="#{messages['net.ihe.gazelle.mca.ShowReportedNamespacesFromOriginalMessage']}"/>
+                                            <h:outputText
+                                                    value="#{messages['net.ihe.gazelle.mca.ShowReportedNamespacesFromOriginalMessage']}"/>
                                         </ui:define>
-                                        <h:selectBooleanCheckbox id="cb3" value="#{analyzerBean.showAddedNamespacesInGUI}">
+                                        <h:selectBooleanCheckbox id="cb3"
+                                                                 value="#{analyzerBean.showAddedNamespacesInGUI}">
                                             <a4j:ajax event="change" render="panelPartArea"/>
                                         </h:selectBooleanCheckbox>
                                     </s:decorate>
 
                                     <s:div id="indentedMessage" rendered="#{analyzerBean.indentMessageInGUI}">
                                         <s:span styleClass="gzl-icon-info-circle"/>
-                                        <h:outputText value="#{messages['net.ihe.gazelle.mca.TheFollowingContentHasBeenModifiedindentedForBet']}"/>
+                                        <h:outputText
+                                                value="#{messages['net.ihe.gazelle.mca.TheFollowingContentHasBeenModifiedindentedForBet']}"/>
                                     </s:div>
 
                                     #{analyzerBean.setDisplayedMessagePart()}
 
                                     <s:div id="namespaceMessages">
-                                        <s:div id="namespacesActuallyAdded" rendered="#{analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}">
+                                        <s:div id="namespacesActuallyAdded"
+                                               rendered="#{analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}">
                                             <s:span styleClass="gzl-icon-info-circle"/>
-                                            <h:outputText value="#{messages['net.ihe.gazelle.mca.NamespacesHaveBeenReportedFromPreviousXMLSubpart']}"/>
+                                            <h:outputText
+                                                    value="#{messages['net.ihe.gazelle.mca.NamespacesHaveBeenReportedFromPreviousXMLSubpart']}"/>
                                         </s:div>
-                                        <s:div id="noNamespacesAdded" rendered="#{!analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}">
+                                        <s:div id="noNamespacesAdded"
+                                               rendered="#{!analyzerBean.namespacesActuallyAdded and analyzerBean.showAddedNamespacesInGUI}">
                                             <s:span styleClass="gzl-icon-info-circle"/>
-                                            <h:outputText value="#{messages['net.ihe.gazelle.mca.NoNamespacesWereFoundMissingThePartWillBeSendToT']}"/>
+                                            <h:outputText
+                                                    value="#{messages['net.ihe.gazelle.mca.NoNamespacesWereFoundMissingThePartWillBeSendToT']}"/>
                                         </s:div>
                                     </s:div>
                                 </div>
                             </div>
 
                             <div class="row">
-                                    <div class="col-md-8">
-                                        <h:inputTextarea id="messagearea3" readonly="false" style="width: 100%"
-                                                         styleClass="#{(analyzerBean.indentMessageInGUI and !analyzerBean.showAddedNamespacesInGUI)?'xml-indented ':''}
+                                <div class="col-md-8">
+                                    <h:inputTextarea id="messagearea3" readonly="false" style="width: 100%"
+                                                     styleClass="#{(analyzerBean.indentMessageInGUI and !analyzerBean.showAddedNamespacesInGUI)?'xml-indented ':''}
                                                          #{(analyzerBean.indentMessageInGUI and analyzerBean.showAddedNamespacesInGUI)?'xml-indented-modified ':''}
                                                          #{(analyzerBean.showAddedNamespacesInGUI and !analyzerBean.indentMessageInGUI)?'xml-modified ':''}"
-                                                         value="#{analyzerBean.displayedMessagePart}"
-                                                         rows="20" maxlength="2048">
-                                            <a4j:ajax event="keyup" render="buttdiv"
-                                                      listener="#{analyzerBean.setSelectedMessagePartEdited(true)}"/>
-                                        </h:inputTextarea>
-                                    </div>
-
-                                    <div class="col-md-4">
-                                        <h:inputTextarea id="logarea" readonly="true" style="width: 100%"
-                                                         styleClass="greyed-logs"
-                                                         value="#{analyzerBean.getMessagePartLog()}"
-                                                         rows="20" maxlength="2048">
-                                        </h:inputTextarea>
-                                    </div>
+                                                     value="#{analyzerBean.displayedMessagePart}"
+                                                     rows="20" maxlength="2048">
+                                        <a4j:ajax event="keyup" render="buttdiv"
+                                                  listener="#{analyzerBean.setSelectedMessagePartEdited(true)}"/>
+                                    </h:inputTextarea>
+                                </div>
+
+                                <div class="col-md-4">
+                                    <h:inputTextarea id="logarea" readonly="true" style="width: 100%"
+                                                     styleClass="greyed-logs"
+                                                     value="#{analyzerBean.getMessagePartLog()}"
+                                                     rows="20" maxlength="2048">
+                                    </h:inputTextarea>
+                                </div>
                             </div>
 
                             <s:div id="buttdiv">
diff --git a/pom.xml b/pom.xml
index b8527923ba76b19ea0264723564da6ee110269cd..60284620ec8742e7ece2e85b9c32b291aee8729a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,7 +36,9 @@
     <properties>
         <git.user.name>gitlab-ci</git.user.name>
         <git.user.token>changeit</git.user.token>
-        <git.project.url>https://${git.user.name}:${git.user.token}@gitlab.inria.fr/gazelle/library/message-content-analyzer</git.project.url>
+        <git.project.url>
+            https://${git.user.name}:${git.user.token}@gitlab.inria.fr/gazelle/library/message-content-analyzer
+        </git.project.url>
 
         <gazelle.model.version>4.0.36</gazelle.model.version>
         <powermock.version>1.7.1</powermock.version>
@@ -57,6 +59,11 @@
         <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
         <sonar.jacoco.reportPaths>target/jacoco.exec</sonar.jacoco.reportPaths>
         <sonar.maven.plugin>3.5.0.1254</sonar.maven.plugin>
+        <git.user.name>gitlab-ci</git.user.name>
+        <git.user.token>changeit</git.user.token>
+        <git.project.url>
+            https://${git.user.name}:${git.user.token}@gitlab.inria.fr/gazelle/library/message-content-analyzer
+        </git.project.url>
     </properties>
 
     <modules>