diff --git a/src/Element/YamlFormCheckboxesOther.php b/src/Element/YamlFormCheckboxesOther.php
index 10794a1..e8f88df 100755
--- a/src/Element/YamlFormCheckboxesOther.php
+++ b/src/Element/YamlFormCheckboxesOther.php
@@ -118,7 +118,9 @@ class YamlFormCheckboxesOther extends FormElement {
       }
     }
 
-    if ($element['#required'] && empty($value)) {
+    $is_empty = empty($value);
+    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
+    if ($element['#required'] && $is_empty && $has_access) {
       $form_state->setError($element, t('@name field is required.', ['@name' => $element['#title']]));
     }
 
diff --git a/src/Element/YamlFormElementOptions.php b/src/Element/YamlFormElementOptions.php
index 333d1b9..f7720a0 100755
--- a/src/Element/YamlFormElementOptions.php
+++ b/src/Element/YamlFormElementOptions.php
@@ -144,7 +144,8 @@ class YamlFormElementOptions extends FormElement {
       }
     }
 
-    if ($element['#required'] && empty($value)) {
+    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
+    if ($element['#required'] && empty($value) && $has_access) {
       $form_state->setError($element, t('@name field is required.', ['@name' => $element['#title']]));
     }
 
diff --git a/src/Element/YamlFormEmailConfirm.php b/src/Element/YamlFormEmailConfirm.php
index e9443a8..6435550 100755
--- a/src/Element/YamlFormEmailConfirm.php
+++ b/src/Element/YamlFormEmailConfirm.php
@@ -111,25 +111,29 @@ class YamlFormEmailConfirm extends FormElement {
    * Validates an email confirm element.
    */
   public static function validateEmailConfirm(&$element, FormStateInterface $form_state, &$complete_form) {
+
     $mail_1 = trim($element['mail_1']['#value']);
     $mail_2 = trim($element['mail_2']['#value']);
-    if ((!empty($mail_1) || !empty($mail_2)) && strcmp($mail_1, $mail_2)) {
-      $form_state->setError($element['mail_2'], t('The specified email addresses do not match.'));
-    }
-    else {
-      // NOTE: Only mail_1 needs to be validated since mail_2 is the same value.
-      // Verify the required value.
-      if ($element['mail_1']['#required'] && empty($mail_1)) {
-        $form_state->setError($element, t('@name field is required.', ['@name' => $element['mail_1']['#title']]));
+    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
+    if ($has_access) {
+      if ((!empty($mail_1) || !empty($mail_2)) && strcmp($mail_1, $mail_2)) {
+        $form_state->setError($element['mail_2'], t('The specified email addresses do not match.'));
       }
-      // Verify that the value is not longer than #maxlength.
-      if (isset($element['mail_1']['#maxlength']) && Unicode::strlen($mail_1) > $element['mail_1']['#maxlength']) {
-        $t_args = [
-          '@name' => $element['mail_1']['#title'],
-          '%max' => $element['mail_1']['#maxlength'],
-          '%length' => Unicode::strlen($mail_1),
-        ];
-        $form_state->setError($element, t('@name cannot be longer than %max characters but is currently %length characters long.', $t_args));
+      else {
+        // NOTE: Only mail_1 needs to be validated since mail_2 is the same value.
+        // Verify the required value.
+        if ($element['mail_1']['#required'] && empty($mail_1)) {
+          $form_state->setError($element, t('@name field is required.', ['@name' => $element['mail_1']['#title']]));
+        }
+        // Verify that the value is not longer than #maxlength.
+        if (isset($element['mail_1']['#maxlength']) && Unicode::strlen($mail_1) > $element['mail_1']['#maxlength']) {
+          $t_args = [
+            '@name' => $element['mail_1']['#title'],
+            '%max' => $element['mail_1']['#maxlength'],
+            '%length' => Unicode::strlen($mail_1),
+          ];
+          $form_state->setError($element, t('@name cannot be longer than %max characters but is currently %length characters long.', $t_args));
+        }
       }
     }
 
diff --git a/src/Element/YamlFormRadiosOther.php b/src/Element/YamlFormRadiosOther.php
index 8a1a229..317b47b 100755
--- a/src/Element/YamlFormRadiosOther.php
+++ b/src/Element/YamlFormRadiosOther.php
@@ -109,7 +109,9 @@ class YamlFormRadiosOther extends FormElement {
       $value = $other_value;
     }
 
-    if ($element['#required'] && ($value === '' || $value === NULL)) {
+    $is_empty = ($value === '' || $value === NULL);
+    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
+    if ($element['#required'] && $is_empty && $has_access) {
       $form_state->setError($element, t('@name field is required.', ['@name' => $element['#title']]));
     }
 
diff --git a/src/Element/YamlFormSelectOther.php b/src/Element/YamlFormSelectOther.php
index b91ad31..a8f5c83 100755
--- a/src/Element/YamlFormSelectOther.php
+++ b/src/Element/YamlFormSelectOther.php
@@ -155,7 +155,8 @@ class YamlFormSelectOther extends FormElement {
       $is_empty = ($value === '' || $value === NULL) ? TRUE : FALSE;
     }
 
-    if ($element['#required'] && $is_empty) {
+    $has_access = (!isset($element['#access']) || $element['#access'] === TRUE);
+    if ($element['#required'] && $is_empty && $has_access) {
       $form_state->setError($element, t('@name field is required.', ['@name' => $element['select']['#title']]));
     }
 
diff --git a/src/Tests/YamlFormElementExtrasTest.php b/src/Tests/YamlFormElementExtrasTest.php
index c3f844e..1ae3aeb 100755
--- a/src/Tests/YamlFormElementExtrasTest.php
+++ b/src/Tests/YamlFormElementExtrasTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\yamlform\Tests;
 
 use Drupal\simpletest\WebTestBase;
+use Drupal\yamlform\Entity\YamlForm;
 
 /**
  * Tests for YAML form (render) element extras.
@@ -264,6 +265,8 @@ class YamlFormElementExtrasTest extends WebTestBase {
    * Tests value processing for custom elements.
    */
   public function testProcessingElements() {
+    /** @var \Drupal\yamlform\YamlFormInterface $yamlform */
+    $yamlform = YamlForm::load('test_element_extras');
 
     /**************************************************************************/
     // counter
@@ -424,6 +427,19 @@ class YamlFormElementExtrasTest extends WebTestBase {
     $this->assertRaw('select_other_advanced: One');
     $this->assertNoRaw('select_other_advanced: Five');
 
+    // Check select other validation is required when default value is NULL.
+    $elements = $yamlform->getElementsDecoded();
+    $elements['select_other']['select_other_advanced']['#default_value'] = NULL;
+    $yamlform->setElements($elements)->save();
+    $this->drupalPostForm('yamlform/test_element_extras', [], t('Submit'));
+    $this->assertRaw('Select other advanced field is required.');
+
+    // Check select other validation is skipped when #access is set to FALSE.
+    $elements['select_other']['select_other_advanced']['#access'] = FALSE;
+    $yamlform->setElements($elements)->save();
+    $this->drupalPostForm('yamlform/test_element_extras', [], t('Submit'));
+    $this->assertNoRaw('Select other advanced field is required.');
+
     /**************************************************************************/
     // radios_other
     /**************************************************************************/
diff --git a/src/YamlFormInterface.php b/src/YamlFormInterface.php
index 892345a..34cb16f 100644
--- a/src/YamlFormInterface.php
+++ b/src/YamlFormInterface.php
@@ -203,7 +203,7 @@ interface YamlFormInterface extends ConfigEntityInterface, EntityWithPluginColle
    * Get elements (YAML) value.
    *
    * @return string
-   *   The elements' raw value.
+   *   The elements raw value.
    */
   public function getElementsRaw();
 
diff --git a/src/YamlFormSubmissionForm.php b/src/YamlFormSubmissionForm.php
index b78ec58..cb34556 100755
--- a/src/YamlFormSubmissionForm.php
+++ b/src/YamlFormSubmissionForm.php
@@ -847,6 +847,7 @@ class YamlFormSubmissionForm extends ContentEntityForm {
       foreach ($wizard['pages'] as $index => $page_key) {
         if ($index != $wizard['current']) {
           $form['elements'][$page_key]['#access'] = FALSE;
+          $this->hideElements($form['elements'][$page_key]);
         }
         else {
           $form['elements'][$page_key]['#type'] = 'container';
@@ -872,6 +873,22 @@ class YamlFormSubmissionForm extends ContentEntityForm {
   /****************************************************************************/
 
   /**
+   * Hide form elements by settings their #access to FALSE.
+   *
+   * @param array $elements
+   *   An render array representing elements.
+   */
+  protected function hideElements(&$elements) {
+    foreach ($elements as $key => &$element) {
+      if (Element::property($key) || !is_array($element)) {
+        continue;
+      }
+      $element['#access'] = FALSE;
+      $this->hideElements($element);
+    }
+  }
+
+  /**
    * Prepare form elements.
    *
    * @param array $elements
