Index: LayerErrorsPanel.java
===================================================================
--- LayerErrorsPanel.java	(revision 43214)
+++ LayerErrorsPanel.java	(revision 43215)
@@ -4,7 +4,9 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.commons.lang3.exception.ExceptionUtils;
 
@@ -13,11 +15,13 @@
 import org.gvsig.fmap.mapcontrol.swing.dynobject.DynObjectEditor;
 import org.gvsig.tools.ToolsLocator;
 import org.gvsig.tools.i18n.I18nManager;
+import org.gvsig.tools.util.impl.CallableException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class LayerErrorsPanel extends LayerErrorsView {
+public class LayerErrorsPanel
+    extends LayerErrorsView {
 
     private static final Logger logger = LoggerFactory.getLogger(LayerErrorsPanel.class);
     private static final long serialVersionUID = -5972995402218954892L;
@@ -54,45 +58,85 @@
         this.setPreferredSize(new Dimension(550, 400));
     }
 
-    public void setName(String name){
+    @Override
+    public void setName(String name) {
         this.txtLayerName.setText(name);
     }
 
-    public void setError(Exception e){
-        List<Exception> exs = new ArrayList<Exception>();
+    public void setError(Throwable e) {
+        List<Throwable> exs = new ArrayList<>();
         exs.add(e);
-        this.txtMessage.setText(this.getMessageAsHTML(exs));
+        this.txtMessage.setText(new MessageAsHTML(exs).toString());
         this.btnViewParameters.setEnabled(false);
     }
 
     public void setLayer(FLayer layer) {
         this.layer = layer;
         setName(layer.getName());
-        this.txtMessage.setText(this.getMessageAsHTML(layer.getErrors()));
+        this.txtMessage.setText(new MessageAsHTML(layer.getErrors()).toString());
         this.btnViewParameters.setEnabled(this.layer instanceof SingleLayer);
     }
 
-    private String getMessageAsHTML(List<Exception> exs) {
-        StringBuilder html = new StringBuilder();
-        //html.append("<html>\n");
-        for (Exception ex : exs) {
-            String lastmsg = "";
-            html.append("<ul>\n");
-            for( Throwable cause : ExceptionUtils.getThrowableList(ex) ) {
-                String message = cause.getMessage();
-                if (message != null) {
-                    if (!message.equalsIgnoreCase(lastmsg)) {
-                        lastmsg = message;
-                        html.append("<li>");
-                        html.append(message.replace("\n", "<br>\n"));
-                        html.append("</li>\n");
+    private class MessageAsHTML {
+
+        StringBuilder html;
+        Set<String> usedMsgs;
+
+        public MessageAsHTML(List<Throwable> exs) {
+            this.clear();
+            this.build(exs);
+        }
+
+        public MessageAsHTML() {
+            this.clear();
+        }
+
+        public void clear() {
+            this.html = new StringBuilder();
+            this.usedMsgs = new HashSet<>();
+        }
+
+        public void build(List<Throwable> exs) {
+            for( Throwable ex : exs ) {
+//                html.append("<ul>\n");
+                List<Throwable> causes = new ArrayList<>();
+                causes.addAll(ExceptionUtils.getThrowableList(ex));
+                if( ex instanceof List ) {
+                    causes.addAll((List<Throwable>) ex);
+                }
+                for( Throwable cause : causes ) {
+                    if( cause instanceof List ) {
+                        continue;
                     }
+                    if( cause instanceof CallableException ) {
+                        cause = ((CallableException) cause).getCause();
+                    }
+                    if( cause == null ) {
+                        continue;
+                    }
+                    String message = cause.getMessage();
+                    if( message != null ) {
+                        if( !this.usedMsgs.contains(message) ) {
+                            this.usedMsgs.add(message);
+                            html.append("<li>");
+                            html.append(message.replace("\n", "<br>\n"));
+                            if( cause.getCause() != null ) {
+                                this.build(ExceptionUtils.getThrowableList(
+                                    cause.getCause()));
+                            }
+                            html.append("</li>\n");
+                        }
+                    }
                 }
+
+//                html.append("</ul>\n");
             }
-            html.append("</ul><br>\n");
         }
-        //html.append("</html>\n");
-        return html.toString();
+
+        @Override
+        public String toString() {
+            return "<ul>\n" + html.toString() + "</ul>\n";
+        }
     }
 
     private void translate() {
@@ -109,10 +153,14 @@
 
     private void doViewParameters() {
         try {
-            DynObjectEditor editor = new DynObjectEditor( ((SingleLayer)layer).getDataStore().getParameters() );
+            DynObjectEditor editor = new DynObjectEditor(
+                ((SingleLayer) layer).getDataStore().getParameters()
+            );
             editor.editObject(true);
         } catch (Throwable th) {
-            logger.warn("Can't show standard properties dialog for this parameters.",th);
+            logger.warn(
+                "Can't show standard properties dialog for this parameters.",
+                th);
         }
     }
 
