Index: hst/src/main/java/org/onehippo/forge/easyforms/util/TextVariableParser.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- hst/src/main/java/org/onehippo/forge/easyforms/util/TextVariableParser.java	(revision 1572)
+++ hst/src/main/java/org/onehippo/forge/easyforms/util/TextVariableParser.java	(revision )
@@ -136,7 +136,7 @@
         for (String variable : varsToReplace) {
             String value = getValueForKey(variable, variableListBean);
             if (value == null) {
-                log.warn("Can not find label for key '{0}' in document {1}.", variable, variableListBean.getPath());
+                log.warn("Can not find label for key '{}' in document {}.", variable, variableListBean.getPath());
                 continue;
             }
             replacedData = StringUtils.replace(replacedData, TEXT_VARIABLE_START_TAG + documentName +
Index: hst/src/main/java/org/onehippo/forge/easyforms/model/AbstractField.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- hst/src/main/java/org/onehippo/forge/easyforms/model/AbstractField.java	(revision 1572)
+++ hst/src/main/java/org/onehippo/forge/easyforms/model/AbstractField.java	(revision )
@@ -73,6 +73,7 @@
     private String validationRuleId;
     private String validationRuleLabel;
     private String regExp;
+    private String validmessage;
     private boolean caseSensitive;
     private final Form parent;
     private String value;
@@ -94,6 +95,7 @@
             this.label = bean.getLabel();
             this.hint = bean.getHint();
             this.expandHint = bean.isExpandHint();
+            this.validmessage = bean.getValidMessage();
             this.mandatory = bean.isMandatory();
             this.caseSensitive = bean.isCaseSensitive();
             this.fieldId = bean.getFieldId();
@@ -254,6 +256,14 @@
         this.expandHint = expandHint;
     }
 
+    public String getValidmessage() {
+        return validmessage;
+    }
+
+    public void setValidmessage(String validmessage) {
+        this.validmessage = validmessage;
+    }
+
     public boolean isMandatory() {
         return mandatory;
     }
@@ -565,9 +575,15 @@
         final Map<String, ErrorMessage> messages = new LinkedHashMap<String, ErrorMessage>();
         for (ValidationRule rule : rules) {
             if (rule.invalid(value, otherValue)) {
+                if(!getValidmessage().isEmpty()){
+                    messages.put(getName(), rule.getValidationMessage(getName(),  getValidmessage(), label, value,
+                            locale, errorMessageBundle));
+                }
+                else{
-                messages.put(getName(), rule.getMessage(getName(), label, value, locale, errorMessageBundle));
-            }
-        }
+                    messages.put(getName(), rule.getMessage(getName(), label, value, locale, errorMessageBundle));
+                }
+            }
+        }
         return messages;
     }
 
@@ -602,6 +618,7 @@
         sb.append("{mandatory=").append(mandatory);
         sb.append(", label='").append(label).append('\'');
         sb.append(", hint='").append(hint).append('\'');
+        sb.append(", validmessage='").append(validmessage).append('\'');
         sb.append("{expandHint=").append(expandHint);
         sb.append(", name='").append(name).append('\'');
         sb.append(", id='").append(id).append('\'');
Index: cms/src/main/java/org/onehippo/forge/easyforms/common/Utils.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/common/Utils.java	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/common/Utils.java	(revision )
@@ -32,6 +32,7 @@
         LABELS_FOR_PROPS.put(Constants.HINT_PROP, "Hint");
         LABELS_FOR_PROPS.put(Constants.EXPAND_HINT_PROP, "Expand Hint");
         LABELS_FOR_PROPS.put(Constants.MANDATORY_PROP, "Required");
+        LABELS_FOR_PROPS.put(Constants.VALID_MESSAGE_PROP, "Validation Message");
         LABELS_FOR_PROPS.put(Constants.LENGTH_PROP, "Length");
         LABELS_FOR_PROPS.put(Constants.ROWS_PROP, "Rows");
         LABELS_FOR_PROPS.put(Constants.COLS_PROP, "Columns");
Index: hst/src/main/java/org/onehippo/forge/easyforms/validation/rules/ValidationRule.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- hst/src/main/java/org/onehippo/forge/easyforms/validation/rules/ValidationRule.java	(revision 1572)
+++ hst/src/main/java/org/onehippo/forge/easyforms/validation/rules/ValidationRule.java	(revision )
@@ -45,7 +45,7 @@
     /**
      * sets rule label which can be displayed instead of the raw rule data
      *
-     * @param data validation data
+     * @param label the rule label
      */
     void setRuleLabel(String label);
 
@@ -98,5 +98,30 @@
      */
     String getRuleData();
 
+    /**
+     * Return {@link ErrorMessage} using the provided parameter values.
+     *
+     * @param name the field name
+     * @param label the field label
+     * @param value the field value
+     * @param locale the locale of the message to return
+     * @param errorMessageBundle the message-bundle name from which the error message is returned.
+     * @return the error message to return based on the provided parameters.
+     */
     ErrorMessage getMessage(String name, String label, String value, Locale locale, String errorMessageBundle);
+
+    /**
+     * Return validation messages of type {@link ErrorMessage}, using the provided parameter values.
+     *
+     * @param name the field name.
+     * @param validationMessage the validation message linked to the field.
+     * @param label the field label
+     * @param value the field value
+     * @param locale the locale of the message to return
+     * @param errorMessageBundle the message-bundle name from which the error message is returned.
+     * @return the error message of type {@link ErrorMessage} to return based on the provided parameters. The message
+     *          will also hold the validation message.
+     */
+    ErrorMessage getValidationMessage(String name, String validationMessage, String label, String value, Locale locale,
+                                      String errorMessageBundle);
 }
Index: cms/src/main/java/org/onehippo/forge/easyforms/common/Constants.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/common/Constants.java	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/common/Constants.java	(revision )
@@ -47,6 +47,7 @@
     public static final String QUERIES_PROP = "ef:queries";
     public static final String OPTIONS_PROP = "ef:options";
     public static final String VALID_EXPRESSION_PROP = "ef:validexpression";
+    public static final String VALID_MESSAGE_PROP = "ef:validmessage";
     public static final String VALID_CASE_SENSITIVE_PROP = "ef:validcasesensitive";
     public static final String MIN_LENGTH_PROP = "ef:minlength";
     public static final String MAX_LENGTH_PROP = "ef:maxlength";
Index: hst/src/main/java/org/onehippo/forge/easyforms/model/Form.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- hst/src/main/java/org/onehippo/forge/easyforms/model/Form.java	(revision 1572)
+++ hst/src/main/java/org/onehippo/forge/easyforms/model/Form.java	(revision )
@@ -357,8 +357,11 @@
                 field.setRegExp(fieldBean.getRegExp());
                 // process validation on a field:
                 field.createValidationRules();
+                final String fieldName = (StringUtils.isBlank(fieldBean.getFieldName())
+                        ? new StringBuilder().append("field_").append(count).toString() : fieldBean.getFieldName());
                 field.setLabel(VariableParser.parseTextVars(field.getLabel(), request));
                 field.setHint(VariableParser.parseTextVars(field.getHint(), request));
+                field.setValidmessage(VariableParser.parseTextVars(field.getValidmessage(), request));
                 //
                 processFieldNames(count, fieldBean, field);
 
Index: cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_it.properties
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_it.properties	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_it.properties	(revision )
@@ -25,6 +25,7 @@
 field.property.columns=Colonni
 field.property.validationrule=Validation Rule
 field.property.validexpression=RegEx di validazione
+field.property.valid.message=Validation Text
 field.property.validcasesensitive=Case Sensitive
 field.property.newchoice=Nouvo scelta
 field.property.fieldName=Nome del campo
@@ -54,4 +55,4 @@
 validation.rule.email.label=E-mail Address
 validation.rule.website.label=Website Address
 field.property.fieldId=Field ID
-field.property.inputtype=Input Type
\ No newline at end of file
+field.property.inputtype=Input Type
Index: cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.properties
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.properties	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.properties	(revision )
@@ -25,6 +25,7 @@
 field.property.columns=Columns
 field.property.validationrule=Validation Rule
 field.property.validexpression=Validation RegEx
+field.property.valid.message=Validation Text
 field.property.validcasesensitive=Case Sensitive
 field.property.newchoice=New choice
 field.property.fieldName=Field name
Index: cms/src/main/java/org/onehippo/forge/easyforms/model/AbstractFieldModel.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/model/AbstractFieldModel.java	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/model/AbstractFieldModel.java	(revision )
@@ -34,6 +34,7 @@
     private String hint = "Hint"; //TODO localize
     private boolean expandHint = true;
     private boolean mandatory = false;
+    private String validMessage = "Validation message";
     private JcrNodeModel nodeModel;
 
     /**
@@ -49,6 +50,7 @@
         setLabel(this.nodeModel.getNode().getProperty(Constants.LABEL_PROP).getString());
         setHint(this.nodeModel.getNode().getProperty(Constants.HINT_PROP).getString());
         setMandatory(this.nodeModel.getNode().getProperty(Constants.MANDATORY_PROP).getBoolean());
+        setValidMessage(this.nodeModel.getNode().getProperty(Constants.VALID_MESSAGE_PROP).getString());
     }
 
     public JcrNodeModel getNodeModel() {
@@ -89,6 +91,14 @@
 
     public void setExpandHint(boolean expandHint) {
         this.expandHint = expandHint;
+    }
+
+    public String getValidMessage() {
+        return validMessage;
+    }
+
+    public void setValidMessage(String validMessage) {
+        this.validMessage = validMessage;
     }
 
     /**
Index: cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_nl.properties
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_nl.properties	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_nl.properties	(revision )
@@ -25,6 +25,7 @@
 field.property.columns=Kolommen
 field.property.validationrule=Validation Rule
 field.property.validexpression=Validatie RegEx
+field.property.valid.message=Validatie Text
 field.property.validcasesensitive=Case Sensitive
 field.property.newchoice=Nieuwe keuze
 field.property.fieldName=Veldnaam
Index: hst/src/main/java/org/onehippo/forge/easyforms/model/ErrorMessage.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- hst/src/main/java/org/onehippo/forge/easyforms/model/ErrorMessage.java	(revision 1572)
+++ hst/src/main/java/org/onehippo/forge/easyforms/model/ErrorMessage.java	(revision )
@@ -38,6 +38,7 @@
     private Object value;
     private Object validationValue;
     private String localizedErrorMessage;
+    private String validMessage;
 
     public ErrorMessage(final String key, final String name) {
         this.key = key;
@@ -132,6 +133,14 @@
 
     public void setLocalizedMessage(final String message) {
         localizedErrorMessage = message;
+    }
+
+    public String getValidMessage() {
+        return validMessage;
+    }
+
+    public void setValidMessage(String validMessage) {
+        this.validMessage = validMessage;
     }
 
     public String getMessageTemplate(Locale locale, String errorMessageBundle) {
Index: cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.java	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.java	(revision )
@@ -54,6 +54,9 @@
     final CheckBox expandHintField;
 
 
+    final Label validMessageLabel;
+    final TextField validMessageField;
+
     final Label fieldName;
     final TextField<String> fieldNameField;
     final Label label;
@@ -146,6 +149,20 @@
                 target.addComponent(formPlugin);
             }
         });
+
+        this.validMessageLabel = new Label("validMessage", new StringResourceModel("field.property.valid.message", this,
+                null));
+        this.validMessageField = new TextField("validMessage-field", new SingleValuePropertyModel(fieldModel.getNodeModel(),
+                Constants.VALID_MESSAGE_PROP));
+
+        this.validMessageField.add(new OnChangeAjaxBehavior() {
+
+            @Override
+            protected void onUpdate(AjaxRequestTarget target) {
+                target.addComponent(formPlugin);
+            }
+        });
+
         this.mandatoryLabel = new Label("mandatory", new StringResourceModel("field.property.mandatory", this, null));
         this.mandatoryField = new CheckBox("mandatory-field", new SingleValuePropertyModel<Boolean>(fieldModel.getNodeModel(), Constants.MANDATORY_PROP));
 
@@ -211,6 +228,8 @@
         add(hintField);
         add(expandHintLabel);
         add(expandHintField);
+        add(validMessageLabel);
+        add(validMessageField);
         add(mandatoryLabel);
         add(mandatoryField);
         add(fieldClass);
Index: hst/src/main/java/org/onehippo/forge/easyforms/beans/AbstractFieldBean.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- hst/src/main/java/org/onehippo/forge/easyforms/beans/AbstractFieldBean.java	(revision 1572)
+++ hst/src/main/java/org/onehippo/forge/easyforms/beans/AbstractFieldBean.java	(revision )
@@ -89,6 +89,10 @@
 
 
 
+    public String getValidMessage() {
+        return getProperty("ef:validmessage");
+    }
+
     public boolean isCaseSensitive() {
         return BooleanUtils.toBoolean((String) getProperty("ef:validcasesensitive"));
     }
Index: cms/src/main/java/org/onehippo/forge/easyforms/panels/FieldSetTagPanel.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/panels/FieldSetTagPanel.java	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/panels/FieldSetTagPanel.java	(revision )
@@ -36,6 +36,7 @@
         mandatoryField.setVisible(false);
         labelField.setVisible(false);
         hintField.setVisible(false);
+        validMessage.setVisible(false);
     }
 
     public void renderHead(IHeaderResponse response) {
Index: hst/src/main/java/org/onehippo/forge/easyforms/validation/rules/BaseRule.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- hst/src/main/java/org/onehippo/forge/easyforms/validation/rules/BaseRule.java	(revision 1572)
+++ hst/src/main/java/org/onehippo/forge/easyforms/validation/rules/BaseRule.java	(revision )
@@ -64,10 +64,18 @@
     }
 
     public ErrorMessage getMessage(final String name, final String label, final String value, final Locale locale,
-                                   String errorMessageBundle) {
+                                   final String errorMessageBundle) {
         setMessageBundle(EasyFormUtil.getEasyformMessageBundle(locale, errorMessageBundle));
         ErrorMessage message = getMessage(name, label, value);
         message.setLocalizedMessage(message.getLocalizedMessage(locale, errorMessageBundle));
+        return message;
+    }
+
+    public ErrorMessage getValidationMessage(final String name, final String validationMessage, final String label,
+                                             final String value, final Locale locale, final String errorMessageBundle) {
+        setMessageBundle(EasyFormUtil.getEasyformMessageBundle(locale, errorMessageBundle));
+        ErrorMessage message = getMessage(name, label, value);
+        message.setLocalizedMessage(validationMessage);
         return message;
     }
 }
Index: cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_de.properties
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_de.properties	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_de.properties	(revision )
@@ -24,6 +24,7 @@
 field.property.rows=Reihen
 field.property.columns=Spalte
 field.property.validationrule=Validation Rule
+field.property.valid.message=Validation Text
 field.property.validexpression=Validation RegEx
 field.property.validcasesensitive=Case Sensitive
 field.property.newchoice=Neue Wahl
Index: cms/src/main/java/org/onehippo/forge/easyforms/panels/AbstractPanel.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/panels/AbstractPanel.java	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/panels/AbstractPanel.java	(revision )
@@ -29,6 +29,7 @@
     final Label mandatoryField;
     final Label labelField;
     final Label hintField;
+    final Label validMessage;
 
     AbstractFieldModel model;
 
@@ -40,11 +41,13 @@
         labelField = new Label("label", fieldModel.getLabel());
         hintField = new Label("hint", fieldModel.getHint());
         mandatoryField = new Label("mandatory", "*");
+        validMessage = new Label("validMessage", fieldModel.getValidMessage());
         mandatoryField.setVisible(fieldModel.isMandatory());
 
         add(labelField);
         add(hintField);
         add(mandatoryField);
+        add(validMessage);
     }
 
     @Override
Index: cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_fr.properties
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_fr.properties	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel_fr.properties	(revision )
@@ -25,6 +25,7 @@
 field.property.columns=Colonnes
 field.property.validationrule=Validation Rule
 field.property.validexpression=Expression r\u00e9guli\u00e8re
+field.property.valid.message=Validation Text
 field.property.validcasesensitive=Case Sensitive
 field.property.newchoice=Nouveau choix
 field.property.fieldName=Nom du champ
Index: repository/src/main/resources/easy-forms.cnd
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- repository/src/main/resources/easy-forms.cnd	(revision 1572)
+++ repository/src/main/resources/easy-forms.cnd	(revision )
@@ -32,6 +32,7 @@
 - ef:mandatory (boolean) = "false" autocreated
 - ef:expandhint (boolean) = "false" autocreated
 - ef:fieldname (string)
+- ef:validmessage (string) ="" autocreated
 // custom field class FQN
 - ef:fieldclass (string)
 // to hold all the 'free defined properties' which can be used by the custom field classes. 
@@ -135,4 +136,4 @@
 - ef:value (string)
 
 [ef:variables] > hippo:document orderable
-+ ef:variable (ef:variable) multiple
\ No newline at end of file
++ ef:variable (ef:variable) multiple
Index: cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.html
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.html	(revision 1572)
+++ cms/src/main/java/org/onehippo/forge/easyforms/properties/panels/AbstractFieldPropertiesPanel.html	(revision )
@@ -44,6 +44,10 @@
     <div class="property mandatory">
         <input type="checkbox" wicket:id="mandatory-field"/> <span class="label" wicket:id="mandatory">[HINT]</span>
     </div>
+    <div class="property validate">
+        <span class="label" wicket:id="validMessage">[VALID MESSAGE]</span><br/>
+        <input type="text" wicket:id="validMessage-field"/>
+    </div>
     <wicket:child/>
     <div class="property class">
         <span class="label" wicket:id="fieldClass">[FIELD CLASS]</span><br/>
