Some suggestions: 1. Give a better name. Say "pre-order" traversal of element in the parse tree. [1] 2. Now if I M-h, C-x C-x and Deactivate mark, I essentially short-circuit the traversal of whole subtree rooted at point. There should be a convenient binding for it. Same as forward-sexp? 3. When you say "Shouldn't be here", it means that point is NOT at the canonical C-down position. But you do seem to "adjust" it to the canonical position down below. May be you want to remove it or say something more positive like - In the middle of nowhere. Trying to get to the assembly point. > New version: Couple of issues. 1. Visit the attached file. Make sure everything is visible. 2. M-< 3. C-down gives a stacktrace. See below. ---------------------------------------------------------------- Within the same file, 1. Move to bol of the empty line that is in <<>> section. That is not an empty line but has spaces. 2. C-down 3. Cursor does NOT do a stop over at "References" headline but skips past to References to Fuzzy Target ---------------------------------------------------------------- Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil) =(2 nil) (or (eobp) (= (point) end)) (cond ((or (eobp) (= (point) end))) ((eq type (quote table-row)) (goto-char (org-element-property :end (org-element-property :parent element)))) ((and post-affiliated (< (point) post-affiliated)) (goto-char post-affiliated)) ((eq type (quote table)) (goto-char end)) ((not contents-begin) (goto-char end)) ((< (point) contents-begin) (if (not (memq type (quote (footnote-definition item)))) (goto-char contents-begin) (end-of-line) (org-forward-linear-element))) ((>= (point) contents-end) (goto-char end)) ((eq type (quote paragraph)) (goto-char end)) ((eq type (quote plain-list)) (end-of-line) (org-forward-linear-element)) ((eq type (quote verse-block)) (or (re-search-forward "^[ ]*$" contents-end t) (goto-char end))) (t (error "This shouldn't happen"))) (let* ((origin (point)) (element (org-element-at-point)) (type (org-element-type element)) (post-affiliated (org-element-property :post-affiliated element)) (contents-begin (org-element-property :contents-begin element)) (contents-end (org-element-property :contents-end element)) (end (let ((end (org-element-property :end element)) (parent element)) (while (and (setq parent (org-element-property :parent parent)) (= (org-element-property :contents-end parent) end)) (setq end (org-element-property :end parent))) end))) (skip-chars-forward " \n") (or (eobp) (goto-char (max (line-beginning-position) origin))) (cond ((or (eobp) (= (point) end))) ((eq type (quote table-row)) (goto-char (org-element-property :end (org-element-property :parent element)))) ((and post-affiliated (< (point) post-affiliated)) (goto-char post-affiliated)) ((eq type (quote table)) (goto-char end)) ((not contents-begin) (goto-char end)) ((< (point) contents-begin) (if (not (memq type (quote (footnote-definition item)))) (goto-char contents-begin) (end-of-line) (org-forward-linear-element))) ((>= (point) contents-end) (goto-char end)) ((eq type (quote paragraph)) (goto-char end)) ((eq type (quote plain-list)) (end-of-line) (org-forward-linear-element)) ((eq type (quote verse-block)) (or (re-search-forward "^[ ]*$" contents-end t) (goto-char end))) (t (error "This shouldn't happen"))) (if (memq (org-invisible-p2) (quote (org-hide-block outline))) (progn (goto-char end)))) org-forward-linear-element() call-interactively(org-forward-linear-element nil nil) command-execute(org-forward-linear-element)