diff --git a/src/xpath.c b/src/xpath.c
index 00a4e33..4505141 100644
--- a/src/xpath.c
+++ b/src/xpath.c
@@ -5328,27 +5328,12 @@
  * @param[in] root_type XPath root node type.
  * @param[in] node_name Node name to move to. Must be in the dictionary!
  * @param[in] moveto_mod Expected module of the node.
- * @param[in] options XPath options.
  * @return LY_ERR (LY_ENOT if node does not match, LY_EINVAL if neither node nor any children match)
  */
 static LY_ERR
 moveto_scnode_check(const struct lysc_node *node, enum lyxp_node_type root_type, const char *node_name,
-                    const struct lys_module *moveto_mod, int options)
+                    const struct lys_module *moveto_mod)
 {
-    struct lysc_node *parent;
-
-    /* RPC input/output check */
-    for (parent = node->parent; parent && (parent->nodetype != LYS_ACTION); parent = parent->parent);
-    if (options & LYXP_SCNODE_OUTPUT) {
-        if (parent && (node->flags & LYS_CONFIG_W)) {
-            return LY_EINVAL;
-        }
-    } else {
-        if (parent && (node->flags & LYS_CONFIG_R)) {
-            return LY_EINVAL;
-        }
-    }
-
     /* module check */
     if (strcmp(node_name, "*") && (node->module != moveto_mod)) {
         return LY_ENOT;
@@ -5472,7 +5457,7 @@
 static LY_ERR
 moveto_scnode(struct lyxp_set *set, const char *qname, uint16_t qname_len, int options)
 {
-    int i, orig_used, idx, temp_ctx = 0;
+    int i, orig_used, idx, temp_ctx = 0, getnext_opts;
     uint32_t mod_idx;
     const char *name_dict = NULL; /* optimization - so we can do (==) instead (!strncmp(...)) in moveto_node_check() */
     const struct lys_module *moveto_mod;
@@ -5494,6 +5479,12 @@
     /* name */
     name_dict = lydict_insert(set->ctx, qname, qname_len);
 
+    /* getnext opts */
+    getnext_opts = LYS_GETNEXT_NOSTATECHECK;
+    if (options & LYXP_SCNODE_OUTPUT) {
+        getnext_opts |= LYS_GETNEXT_OUTPUT;
+    }
+
     orig_used = set->used;
     for (i = 0; i < orig_used; ++i) {
         if (set->val.scnodes[i].in_ctx != 1) {
@@ -5509,8 +5500,8 @@
             mod_idx = 0;
             while (moveto_mod || (moveto_mod = (struct lys_module *)ly_ctx_get_module_iter(set->ctx, &mod_idx))) {
                 sub = NULL;
-                while ((sub = lys_getnext(sub, NULL, moveto_mod->compiled, LYS_GETNEXT_NOSTATECHECK))) {
-                    if (!moveto_scnode_check(sub, set->root_type, name_dict, moveto_mod, options)) {
+                while ((sub = lys_getnext(sub, NULL, moveto_mod->compiled, getnext_opts))) {
+                    if (!moveto_scnode_check(sub, set->root_type, name_dict, moveto_mod)) {
                         idx = set_scnode_insert_node(set, sub, LYXP_NODE_ELEM);
                         /* we need to prevent these nodes from being considered in this moveto */
                         if ((idx < orig_used) && (idx > i)) {
@@ -5531,8 +5522,8 @@
         /* skip nodes without children - leaves, leaflists, and anyxmls (ouput root will eval to true) */
         } else if (!(start_parent->nodetype & (LYS_LEAF | LYS_LEAFLIST | LYS_ANYDATA))) {
             sub = NULL;
-            while ((sub = lys_getnext(sub, start_parent, NULL, LYS_GETNEXT_NOSTATECHECK))) {
-                if (!moveto_scnode_check(sub, set->root_type, name_dict, (moveto_mod ? moveto_mod : set->local_mod), options)) {
+            while ((sub = lys_getnext(sub, start_parent, NULL, getnext_opts))) {
+                if (!moveto_scnode_check(sub, set->root_type, name_dict, (moveto_mod ? moveto_mod : set->local_mod))) {
                     idx = set_scnode_insert_node(set, sub, LYXP_NODE_ELEM);
                     if ((idx < orig_used) && (idx > i)) {
                         set->val.scnodes[idx].in_ctx = 2;
@@ -5702,7 +5693,7 @@
                 goto next_iter;
             }
 
-            rc = moveto_scnode_check(elem, set->root_type, qname, moveto_mod, options);
+            rc = moveto_scnode_check(elem, set->root_type, qname, moveto_mod);
             if (!rc) {
                 if ((idx = set_scnode_dup_node_check(set, elem, LYXP_NODE_ELEM, i)) > -1) {
                     set->val.scnodes[idx].in_ctx = 1;
