diff --git a/openpype/hosts/tvpaint/plugins/publish/help/validate_layers_visibility.xml b/openpype/hosts/tvpaint/plugins/publish/help/validate_layers_visibility.xml
new file mode 100644
index 0000000000..fc69d5fd7b
--- /dev/null
+++ b/openpype/hosts/tvpaint/plugins/publish/help/validate_layers_visibility.xml
@@ -0,0 +1,20 @@
+
+
+
+Layers visiblity
+## All layers are not visible
+
+All layers for subset "{instance_name}" are hidden.
+
+### Layer names for **{instance_name}**
+
+{layer_names}
+
+*Check layer names for all subsets in list on left side.*
+
+### How to repair?
+
+Make sure that at least one layer in the scene is visible or disable the subset before hitting publish button after refresh.
+
+
+
diff --git a/openpype/hosts/tvpaint/plugins/publish/validate_layers_visibility.py b/openpype/hosts/tvpaint/plugins/publish/validate_layers_visibility.py
index 74ef34169e..7ea0587b8f 100644
--- a/openpype/hosts/tvpaint/plugins/publish/validate_layers_visibility.py
+++ b/openpype/hosts/tvpaint/plugins/publish/validate_layers_visibility.py
@@ -1,6 +1,8 @@
import pyblish.api
+from openpype.pipeline import PublishXmlValidationError
+# TODO @iLLiCiTiT add repair action to disable instances?
class ValidateLayersVisiblity(pyblish.api.InstancePlugin):
"""Validate existence of renderPass layers."""
@@ -9,8 +11,26 @@ class ValidateLayersVisiblity(pyblish.api.InstancePlugin):
families = ["review", "renderPass", "renderLayer"]
def process(self, instance):
+ layer_names = set()
for layer in instance.data["layers"]:
+ layer_names.add(layer["name"])
if layer["visible"]:
return
- raise AssertionError("All layers of instance are not visible.")
+ instance_label = (
+ instance.data.get("label") or instance.data["name"]
+ )
+
+ raise PublishXmlValidationError(
+ self,
+ "All layers of instance \"{}\" are not visible.".format(
+ instance_label
+ ),
+ formatting_data={
+ "instance_name": instance_label,
+ "layer_names": "
".join([
+ "- {}".format(layer_name)
+ for layer_name in layer_names
+ ])
+ }
+ )