diff --git a/include/simpleplugin/attributes/class_FileAttribute.inc b/include/simpleplugin/attributes/class_FileAttribute.inc
index 2ad49b65e6dbe934fd9954d67ee6b5159419653b..388112074afd0c382f494196c1d88946d08c9e3d 100644
--- a/include/simpleplugin/attributes/class_FileAttribute.inc
+++ b/include/simpleplugin/attributes/class_FileAttribute.inc
@@ -169,7 +169,7 @@ class FileDownloadAttribute extends FileAttribute
     $display = '';
     if ($this->upload) {
       $display  .= $this->renderInputField('file', $id);
-      $display  .= $this->renderInputField('submit', 'upload'.$id, array('value' => _('Upload')));
+      $display  .= $this->renderInputField('submit', 'upload'.$id, array('value' => _('Upload'), 'formnovalidate' => 'formnovalidate'));
     }
     $display  .= $this->renderInputField(
       'image', 'download'.$id,
diff --git a/include/simpleplugin/attributes/class_IntAttribute.inc b/include/simpleplugin/attributes/class_IntAttribute.inc
index 476f16607ac17a4ff894f8cb12c7cf89a62d3cc1..7ca5e42159b7a4d108befbededdd251e0b985cfe 100644
--- a/include/simpleplugin/attributes/class_IntAttribute.inc
+++ b/include/simpleplugin/attributes/class_IntAttribute.inc
@@ -108,6 +108,9 @@ class IntAttribute extends Attribute
       $js       = $this->managedAttributesJS();
       $attributes['onChange'] = 'javascript:'.htmlentities($js, ENT_COMPAT, 'UTF-8');
     }
+    if ($this->isRequired()) {
+      $attributes['required'] = 'required';
+    }
     $display = $this->renderInputField('number', $id, $attributes);
     return $this->renderAcl($display);
   }
diff --git a/include/simpleplugin/attributes/class_SetAttribute.inc b/include/simpleplugin/attributes/class_SetAttribute.inc
index ddd05f6f86b44d0d6433b9eadacc230ab7342f76..90d16938dd25347c0bd149aded872676067918cd 100644
--- a/include/simpleplugin/attributes/class_SetAttribute.inc
+++ b/include/simpleplugin/attributes/class_SetAttribute.inc
@@ -43,7 +43,7 @@ class SetAttribute extends Attribute
       $values
     );
     $this->attribute = $attribute;
-    $this->attribute->setRequired(TRUE);
+    $this->attribute->setRequired(FALSE);
     $this->valueUnicity = $valueUnicity;
   }
 
@@ -278,8 +278,8 @@ class SetAttribute extends Attribute
   function renderButtons ()
   {
     $id = $this->getHtmlId();
-    $buttons  = $this->renderInputField('submit', 'add'.$id, array('value' => '{msgPool type=addButton}'));
-    $buttons .= $this->renderInputField('submit', 'del'.$id, array('value' => '{msgPool type=delButton}'));
+    $buttons  = $this->renderInputField('submit', 'add'.$id, array('value' => '{msgPool type=addButton}', 'formnovalidate' => 'formnovalidate'));
+    $buttons .= $this->renderInputField('submit', 'del'.$id, array('value' => '{msgPool type=delButton}', 'formnovalidate' => 'formnovalidate'));
     return $buttons;
   }
 
@@ -656,7 +656,7 @@ class OrderedArrayAttribute extends SetAttribute
   function renderButtons ()
   {
     $id = $this->getHtmlId();
-    $buttons = $this->renderInputField('submit', 'add'.$id, array('value' => '{msgPool type=addButton}'));
+    $buttons = $this->renderInputField('submit', 'add'.$id, array('value' => '{msgPool type=addButton}', 'formnovalidate' => 'formnovalidate'));
     return $buttons;
   }
 }
diff --git a/include/simpleplugin/attributes/class_StringAttribute.inc b/include/simpleplugin/attributes/class_StringAttribute.inc
index 632ec4bea79869ad0b2cf9af0d357275ab166e42..f76587bae4f78fb416c3bed3dd84799ed0d1babd 100644
--- a/include/simpleplugin/attributes/class_StringAttribute.inc
+++ b/include/simpleplugin/attributes/class_StringAttribute.inc
@@ -80,6 +80,9 @@ class StringAttribute extends Attribute
     if ($this->html5pattern !== NULL) {
       $attributes['pattern'] = htmlentities($this->html5pattern, ENT_COMPAT, 'UTF-8');
     }
+    if ($this->isRequired()) {
+      $attributes['required'] = 'required';
+    }
     $display  = $this->renderInputField($this->inputType, $id, $attributes);
     return $this->renderAcl($display);
   }
@@ -153,7 +156,9 @@ class TextAreaAttribute extends StringAttribute
   {
     $id = $this->getHtmlId();
     $display  = '<textarea name="'.$id.'" id="'.$id.'"'.
-                ($this->disabled ? ' disabled="disabled"' : '').'>'.
+                ($this->disabled ? ' disabled="disabled"' : '').
+                ($this->isRequired() ? ' required="required"' : '').
+                '>'.
                 '{literal}'.htmlentities($this->getValue(), ENT_COMPAT, 'UTF-8').'{/literal}</textarea>';
     return $this->renderAcl($display);
   }
diff --git a/include/simpleplugin/class_dialogAttributes.inc b/include/simpleplugin/class_dialogAttributes.inc
index c0169875b6a89254deea88ffa4efb5d0cdafb634..997f560261c75007975a334e8ee5f5c3877e3a0c 100644
--- a/include/simpleplugin/class_dialogAttributes.inc
+++ b/include/simpleplugin/class_dialogAttributes.inc
@@ -249,20 +249,27 @@ class DialogAttribute extends SetAttribute
       );
       $buttons  .= $this->renderInputField(
         'submit', 'add'.$id,
-        array('value' => '{msgPool type=addButton}')
+        array(
+          'value'           => '{msgPool type=addButton}',
+          'formnovalidate'  => 'formnovalidate'
+        )
       );
       $dialogButtonValue = _('Add (dialog)');
     }
     $buttons  .= $this->renderInputField(
       'submit', 'add'.$id.'_dialog',
       array(
-        'class' => 'dialog',
-        'value' => $dialogButtonValue
+        'class'           => 'dialog',
+        'value'           => $dialogButtonValue,
+        'formnovalidate'  => 'formnovalidate'
       )
     );
     $buttons  .= $this->renderInputField(
       'submit', 'del'.$id,
-      array('value' => '{msgPool type=delButton}')
+      array(
+        'value'           => '{msgPool type=delButton}',
+        'formnovalidate'  => 'formnovalidate'
+      )
     );
     return $buttons;
   }
@@ -337,8 +344,9 @@ class DialogOrderedArrayAttribute extends OrderedArrayAttribute
     return $this->renderInputField(
       'submit', 'add'.$id.'_dialog',
       array(
-        'class' => 'dialog',
-        'value' => '{msgPool type=addButton}'
+        'class'           => 'dialog',
+        'value'           => '{msgPool type=addButton}',
+        'formnovalidate'  => 'formnovalidate'
       )
     );
   }
diff --git a/setup/setup_migrate_adminAccount.tpl b/setup/setup_migrate_adminAccount.tpl
index ae5ca8bbc5e9b05c22e6d7cc290f11359098d245..a7cd35fffa0b26e7f8c23aab558a93bb40a9719f 100644
--- a/setup/setup_migrate_adminAccount.tpl
+++ b/setup/setup_migrate_adminAccount.tpl
@@ -51,7 +51,7 @@
     <hr/>
     <div style='width:99%; text-align:right; padding:5px;'>
       <input type='submit' name='dialog_confirm' value='{t}Apply{/t}'/>
-      <input type='submit' name='dialog_cancel' value='{t}Cancel{/t}'/>
+      <input type='submit' formnovalidate="formnovalidate" name='dialog_cancel' value='{t}Cancel{/t}'/>
     </div>
   </div>
 </div>
diff --git a/setup/setup_migrate_baseOC.tpl b/setup/setup_migrate_baseOC.tpl
index 4a85846dff236694f76c63d6a5d104d290a971fc..bec45cc2f90c31c2a097eaaafddead5e1124adf9 100644
--- a/setup/setup_migrate_baseOC.tpl
+++ b/setup/setup_migrate_baseOC.tpl
@@ -22,7 +22,7 @@
 
     <hr/>
     <div style='width:100%; text-align:right; padding:5px;'>
-      <input type='submit' name='dialog_cancel' value='{t}Close{/t}'>
+      <input type='submit' formnovalidate="formnovalidate" name='dialog_cancel' value='{t}Close{/t}'>
     </div>
   </div>
 </div>