diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py
index 7273286b..94b75e5f 100644
--- a/cmd2/cmd2.py
+++ b/cmd2/cmd2.py
@@ -1858,8 +1858,30 @@ class Cmd(cmd.Cmd):
         pipe runs out. We can't refactor it because we need to retain
         backwards compatibility with the standard library version of cmd.
         """
-        statement = self.statement_parser.parse(self.preparse(line))
-        while statement.multiline_command and not statement.terminator:
+        # preparse() is deprecated, use self.register_postparsing_hook() instead
+        line = self.preparse(line)
+
+        while True:
+            try:
+                statement = self.statement_parser.parse(line)
+                if statement.multiline_command and statement.terminator:
+                    # we have a completed multiline command, we are done
+                    break
+                if not statement.multiline_command:
+                    # it's not a multiline command, but we parsed it ok
+                    # so we are done
+                    break
+            except ValueError:
+                # we have unclosed quotation marks, lets parse only the command
+                # and see if it's a multiline
+                statement = self.statement_parser.parse_command_only(line)
+                if not statement.multiline_command:
+                    # not a multiline command, so raise the exception
+                    raise
+
+            # if we get here we must have:
+            #   - a multiline command with no terminator
+            #   - a multiline command with unclosed quotation marks
             if not self.quit_on_sigint:
                 try:
                     newline = self.pseudo_raw_input(self.continuation_prompt)
@@ -1885,7 +1907,6 @@ class Cmd(cmd.Cmd):
                     newline = '\n'
                     self.poutput(newline)
                 line = '{}\n{}'.format(statement.raw, newline)
-            statement = self.statement_parser.parse(line)
 
         if not statement.command:
             raise EmptyStatement()
diff --git a/cmd2/parsing.py b/cmd2/parsing.py
index 475554b0..b67cef10 100644
--- a/cmd2/parsing.py
+++ b/cmd2/parsing.py
@@ -407,8 +407,8 @@ class StatementParser:
         """Partially parse input into a Statement object.
 
         The command is identified, and shortcuts and aliases are expanded.
-        Terminators, multiline commands, and output redirection are not
-        parsed.
+        Multiline commands are identified, but terminators and output
+        redirection are not parsed.
 
         This method is used by tab completion code and therefore must not
         generate an exception if there are unclosed quotes.
@@ -420,8 +420,8 @@ class StatementParser:
           - args
 
         Different from parse(), this method does not remove redundant whitespace
-        within statement.args. It does however, ensure args does not have leading
-        or trailing whitespace.
+        within statement.args. It does however, ensure args does not have
+        leading or trailing whitespace.
         """
         # expand shortcuts and aliases
         line = self._expand(rawinput)
@@ -447,6 +447,12 @@ class StatementParser:
             if not command or not args:
                 args = None
 
+        # set multiline
+        if command in self.multiline_commands:
+            multiline_command = command
+        else:
+            multiline_command = None
+
         # build the statement
         # string representation of args must be an empty string instead of
         # None for compatibility with standard library cmd
@@ -454,6 +460,7 @@ class StatementParser:
                               raw=rawinput,
                               command=command,
                               args=args,
+                              multiline_command=multiline_command,
                               )
         return statement
 

diff --git a/tests/test_cmd2.py b/tests/test_cmd2.py
index 3324a105..0ec993e9 100644
--- a/tests/test_cmd2.py
+++ b/tests/test_cmd2.py
@@ -1471,7 +1471,8 @@ def test_multiline_complete_empty_statement_raises_exception(multiline_app):
         multiline_app._complete_statement('')
 
 def test_multiline_complete_statement_without_terminator(multiline_app):
-    # Mock out the input call so we don't actually wait for a user's response on stdin when it looks for more input
+    # Mock out the input call so we don't actually wait for a user's response
+    # on stdin when it looks for more input
     m = mock.MagicMock(name='input', return_value='\n')
     builtins.input = m
 
@@ -1481,6 +1482,20 @@ def test_multiline_complete_statement_without_terminator(multiline_app):
     statement = multiline_app._complete_statement(line)
     assert statement == args
     assert statement.command == command
+    assert statement.multiline_command == command
+
+def test_multiline_complete_statement_with_unclosed_quotes(multiline_app):
+    # Mock out the input call so we don't actually wait for a user's response
+    # on stdin when it looks for more input
+    m = mock.MagicMock(name='input', side_effect=['quotes', '" now closed;'])
+    builtins.input = m
+
+    line = 'orate hi "partially open'
+    statement = multiline_app._complete_statement(line)
+    assert statement == 'hi "partially open\nquotes\n" now closed'
+    assert statement.command == 'orate'
+    assert statement.multiline_command == 'orate'
+    assert statement.terminator == ';'
 
 
 def test_clipboard_failure(base_app, capsys):
diff --git a/tests/test_parsing.py b/tests/test_parsing.py
index 6e795660..de4c637e 100644
--- a/tests/test_parsing.py
+++ b/tests/test_parsing.py
@@ -376,7 +376,7 @@ def test_parse_multiline_with_complete_comment(parser):
     assert statement.argv == ['multiline', 'command', 'is', 'done']
     assert statement.terminator == ';'
 
-def test_parse_multiline_termninated_by_empty_line(parser):
+def test_parse_multiline_terminated_by_empty_line(parser):
     line = 'multiline command ends\n\n'
     statement = parser.parse(line)
     assert statement.multiline_command == 'multiline'
@@ -386,6 +386,23 @@ def test_parse_multiline_termninated_by_empty_line(parser):
     assert statement.argv == ['multiline', 'command', 'ends']
     assert statement.terminator == '\n'
 
+@pytest.mark.parametrize('line,terminator',[
+    ('multiline command "with\nembedded newline";', ';'),
+    ('multiline command "with\nembedded newline";;;', ';'),
+    ('multiline command "with\nembedded newline";; ;;', ';'),
+    ('multiline command "with\nembedded newline" &', '&'),
+    ('multiline command "with\nembedded newline" & &', '&'),
+    ('multiline command "with\nembedded newline"\n\n', '\n'),
+])
+def test_parse_multiline_with_embedded_newline(parser, line, terminator):
+    statement = parser.parse(line)
+    assert statement.multiline_command == 'multiline'
+    assert statement.command == 'multiline'
+    assert statement.args == 'command "with\nembedded newline"'
+    assert statement == statement.args
+    assert statement.argv == ['multiline', 'command', 'with\nembedded newline']
+    assert statement.terminator == terminator
+
 def test_parse_multiline_ignores_terminators_in_comments(parser):
     line = 'multiline command "with term; ends" now\n\n'
     statement = parser.parse(line)
@@ -584,6 +601,16 @@ def test_parse_command_only_none(parser, line):
     assert statement.args is None
     assert statement == ''
 
+def test_parse_command_only_multiline(parser):
+    line = 'multiline with partially "open quotes and no terminator'
+    statement = parser.parse_command_only(line)
+    assert statement.command == 'multiline'
+    assert statement.multiline_command == 'multiline'
+    assert statement.args == 'with partially "open quotes and no terminator'
+    assert statement == statement.args
+    assert statement.command_and_args == line
+
+
 def test_statement_initialization(parser):
     string = 'alias'
     statement = cmd2.Statement(string)

Question: multiline command args with  matching quote on another line?
Is it possible to configure cmd2 to have the closing quote on another line ('embedded newline in args'):

my_command  is a multiline command

Expected behaviour
my_command  'This is a long arg broken over two
lines';

self.argv[1] = 'This is a long arg broken over two\nlines'

Currently the parser shows "ERROR: Invalid syntax: No closing quotation"

tests/test_cmd2.py::test_multiline_complete_statement_with_unclosed_quotes tests/test_parsing.py::test_parse_command_only_multiline
tests/test_cmd2.py::test_version tests/test_cmd2.py::test_empty_statement tests/test_cmd2.py::test_base_help tests/test_cmd2.py::test_base_help_verbose tests/test_cmd2.py::test_base_help_history tests/test_cmd2.py::test_base_argparse_help tests/test_cmd2.py::test_base_shortcuts tests/test_cmd2.py::test_base_show tests/test_cmd2.py::test_base_show_long tests/test_cmd2.py::test_base_show_readonly tests/test_cmd2.py::test_cast tests/test_cmd2.py::test_cast_problems tests/test_cmd2.py::test_base_set tests/test_cmd2.py::test_set_not_supported tests/test_cmd2.py::test_set_quiet tests/test_cmd2.py::test_base_shell tests/test_cmd2.py::test_base_py tests/test_cmd2.py::test_base_run_python_script tests/test_cmd2.py::test_base_run_pyscript tests/test_cmd2.py::test_recursive_pyscript_not_allowed tests/test_cmd2.py::test_pyscript_with_nonexist_file tests/test_cmd2.py::test_pyscript_with_exception tests/test_cmd2.py::test_pyscript_requires_an_argument tests/test_cmd2.py::test_base_error tests/test_cmd2.py::test_history_span tests/test_cmd2.py::test_history_get tests/test_cmd2.py::test_base_history tests/test_cmd2.py::test_history_script_format tests/test_cmd2.py::test_history_with_string_argument tests/test_cmd2.py::test_history_with_integer_argument tests/test_cmd2.py::test_history_with_integer_span tests/test_cmd2.py::test_history_with_span_start tests/test_cmd2.py::test_history_with_span_end tests/test_cmd2.py::test_history_with_span_index_error tests/test_cmd2.py::test_history_output_file tests/test_cmd2.py::test_history_edit tests/test_cmd2.py::test_history_run_all_commands tests/test_cmd2.py::test_history_run_one_command tests/test_cmd2.py::test_history_clear tests/test_cmd2.py::test_base_load tests/test_cmd2.py::test_load_with_empty_args tests/test_cmd2.py::test_load_with_nonexistent_file tests/test_cmd2.py::test_load_with_directory tests/test_cmd2.py::test_load_with_empty_file tests/test_cmd2.py::test_load_with_binary_file tests/test_cmd2.py::test_load_with_utf8_file tests/test_cmd2.py::test_load_nested_loads tests/test_cmd2.py::test_base_runcmds_plus_hooks tests/test_cmd2.py::test_base_relative_load tests/test_cmd2.py::test_relative_load_requires_an_argument tests/test_cmd2.py::test_output_redirection tests/test_cmd2.py::test_output_redirection_to_nonexistent_directory tests/test_cmd2.py::test_output_redirection_to_too_long_filename tests/test_cmd2.py::test_feedback_to_output_true tests/test_cmd2.py::test_feedback_to_output_false tests/test_cmd2.py::test_allow_redirection tests/test_cmd2.py::test_pipe_to_shell tests/test_cmd2.py::test_pipe_to_shell_error tests/test_cmd2.py::test_base_timing tests/test_cmd2.py::test_base_debug tests/test_cmd2.py::test_base_colorize tests/test_cmd2.py::test_edit_no_editor tests/test_cmd2.py::test_edit_file tests/test_cmd2.py::test_edit_file_with_spaces tests/test_cmd2.py::test_edit_blank tests/test_cmd2.py::test_base_py_interactive tests/test_cmd2.py::test_exclude_from_history tests/test_cmd2.py::test_base_cmdloop_with_queue tests/test_cmd2.py::test_base_cmdloop_without_queue tests/test_cmd2.py::test_cmdloop_without_rawinput tests/test_cmd2.py::test_precmd_hook_success tests/test_cmd2.py::test_precmd_hook_failure tests/test_cmd2.py::test_interrupt_quit tests/test_cmd2.py::test_interrupt_noquit tests/test_cmd2.py::test_default_to_shell_unknown tests/test_cmd2.py::test_default_to_shell_good tests/test_cmd2.py::test_default_to_shell_failure tests/test_cmd2.py::test_ansi_prompt_not_esacped tests/test_cmd2.py::test_ansi_prompt_escaped tests/test_cmd2.py::test_custom_command_help tests/test_cmd2.py::test_custom_help_menu tests/test_cmd2.py::test_help_undocumented tests/test_cmd2.py::test_help_overridden_method tests/test_cmd2.py::test_help_cat_base tests/test_cmd2.py::test_help_cat_verbose tests/test_cmd2.py::test_select_options tests/test_cmd2.py::test_select_invalid_option tests/test_cmd2.py::test_select_list_of_strings tests/test_cmd2.py::test_select_list_of_tuples tests/test_cmd2.py::test_select_uneven_list_of_tuples tests/test_cmd2.py::test_help_with_no_docstring tests/test_cmd2.py::test_which_editor_good tests/test_cmd2.py::test_which_editor_bad tests/test_cmd2.py::test_multiline_complete_empty_statement_raises_exception tests/test_cmd2.py::test_multiline_complete_statement_without_terminator tests/test_cmd2.py::test_clipboard_failure tests/test_cmd2.py::test_commandresult_truthy tests/test_cmd2.py::test_commandresult_falsy tests/test_cmd2.py::test_is_text_file_bad_input tests/test_cmd2.py::test_eof tests/test_cmd2.py::test_eos tests/test_cmd2.py::test_echo tests/test_cmd2.py::test_pseudo_raw_input_tty_rawinput_true tests/test_cmd2.py::test_pseudo_raw_input_tty_rawinput_false tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_true_echo_true tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_true_echo_false tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_false_echo_true tests/test_cmd2.py::test_pseudo_raw_input_piped_rawinput_false_echo_false tests/test_cmd2.py::test_raw_input tests/test_cmd2.py::test_stdin_input tests/test_cmd2.py::test_empty_stdin_input tests/test_cmd2.py::test_poutput_string tests/test_cmd2.py::test_poutput_zero tests/test_cmd2.py::test_poutput_empty_string tests/test_cmd2.py::test_poutput_none tests/test_cmd2.py::test_alias tests/test_cmd2.py::test_alias_lookup_invalid_alias tests/test_cmd2.py::test_unalias tests/test_cmd2.py::test_unalias_all tests/test_cmd2.py::test_unalias_non_existing tests/test_cmd2.py::test_create_invalid_alias[">"] tests/test_cmd2.py::test_create_invalid_alias["no>pe"] tests/test_cmd2.py::test_create_invalid_alias["no tests/test_cmd2.py::test_create_invalid_alias["nopipe|"] tests/test_cmd2.py::test_create_invalid_alias["noterm;"] tests/test_cmd2.py::test_create_invalid_alias[noembedded"quotes] tests/test_cmd2.py::test_ppaged tests/test_cmd2.py::test_parseline_empty tests/test_cmd2.py::test_parseline tests/test_cmd2.py::test_readline_remove_history_item tests/test_cmd2.py::test_onecmd_raw_str_continue tests/test_cmd2.py::test_onecmd_raw_str_quit tests/test_cmd2.py::test_existing_history_file tests/test_cmd2.py::test_new_history_file tests/test_cmd2.py::test_bad_history_file_path tests/test_parsing.py::test_parse_empty_string_default tests/test_parsing.py::test_tokenize_default[command-tokens0] tests/test_parsing.py::test_tokenize_default[command tests/test_parsing.py::test_tokenize_default[termbare tests/test_parsing.py::test_tokenize_default[termbare; tests/test_parsing.py::test_tokenize_default[termbare& tests/test_parsing.py::test_tokenize_default[help|less-tokens7] tests/test_parsing.py::test_parse_empty_string tests/test_parsing.py::test_tokenize[command-tokens0] tests/test_parsing.py::test_tokenize[command tests/test_parsing.py::test_tokenize[42 tests/test_parsing.py::test_tokenize[l-tokens4] tests/test_parsing.py::test_tokenize[termbare tests/test_parsing.py::test_tokenize[termbare; tests/test_parsing.py::test_tokenize[termbare& tests/test_parsing.py::test_tokenize[help|less-tokens9] tests/test_parsing.py::test_tokenize[l|less-tokens10] tests/test_parsing.py::test_tokenize_unclosed_quotes tests/test_parsing.py::test_command_and_args[tokens0-None-None] tests/test_parsing.py::test_command_and_args[tokens1-command-None] tests/test_parsing.py::test_command_and_args[tokens2-command-arg1 tests/test_parsing.py::test_parse_single_word[plainword] tests/test_parsing.py::test_parse_single_word["one tests/test_parsing.py::test_parse_single_word['one tests/test_parsing.py::test_parse_word_plus_terminator[termbare;-;] tests/test_parsing.py::test_parse_word_plus_terminator[termbare tests/test_parsing.py::test_parse_word_plus_terminator[termbare&-&] tests/test_parsing.py::test_parse_suffix_after_terminator[termbare; tests/test_parsing.py::test_parse_suffix_after_terminator[termbare tests/test_parsing.py::test_parse_suffix_after_terminator[termbare& tests/test_parsing.py::test_parse_command_with_args tests/test_parsing.py::test_parse_command_with_quoted_args tests/test_parsing.py::test_parse_command_with_args_terminator_and_suffix tests/test_parsing.py::test_parse_hashcomment tests/test_parsing.py::test_parse_c_comment tests/test_parsing.py::test_parse_c_comment_empty tests/test_parsing.py::test_parse_c_comment_no_closing tests/test_parsing.py::test_parse_c_comment_multiple_opening tests/test_parsing.py::test_parse_what_if_quoted_strings_seem_to_start_comments tests/test_parsing.py::test_parse_simple_pipe[simple tests/test_parsing.py::test_parse_simple_pipe[simple|piped] tests/test_parsing.py::test_parse_double_pipe_is_not_a_pipe tests/test_parsing.py::test_parse_complex_pipe tests/test_parsing.py::test_parse_redirect[help tests/test_parsing.py::test_parse_redirect[help>out.txt->] tests/test_parsing.py::test_parse_redirect[help>>out.txt->>] tests/test_parsing.py::test_parse_redirect_with_args tests/test_parsing.py::test_parse_redirect_with_dash_in_path tests/test_parsing.py::test_parse_redirect_append tests/test_parsing.py::test_parse_pipe_and_redirect tests/test_parsing.py::test_parse_output_to_paste_buffer tests/test_parsing.py::test_parse_redirect_inside_terminator tests/test_parsing.py::test_parse_multiple_terminators[multiline tests/test_parsing.py::test_parse_unfinished_multiliine_command tests/test_parsing.py::test_parse_multiline_command_ignores_redirectors_within_it[multiline tests/test_parsing.py::test_parse_multiline_with_incomplete_comment tests/test_parsing.py::test_parse_multiline_with_complete_comment tests/test_parsing.py::test_parse_multiline_terminated_by_empty_line tests/test_parsing.py::test_parse_multiline_with_embedded_newline[multiline tests/test_parsing.py::test_parse_multiline_ignores_terminators_in_comments tests/test_parsing.py::test_parse_command_with_unicode_args tests/test_parsing.py::test_parse_unicode_command tests/test_parsing.py::test_parse_redirect_to_unicode_filename tests/test_parsing.py::test_parse_unclosed_quotes tests/test_parsing.py::test_empty_statement_raises_exception tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[helpalias-help-None] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[helpalias tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[42-theanswer-None] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[42 tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[!ls-shell-ls] tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[!ls tests/test_parsing.py::test_parse_alias_and_shortcut_expansion[l-shell-ls tests/test_parsing.py::test_parse_alias_on_multiline_command tests/test_parsing.py::test_parse_alias_redirection[helpalias tests/test_parsing.py::test_parse_alias_redirection[helpalias>out.txt->] tests/test_parsing.py::test_parse_alias_redirection[helpalias>>out.txt->>] tests/test_parsing.py::test_parse_alias_pipe[helpalias tests/test_parsing.py::test_parse_alias_pipe[helpalias|less] tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias;] tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias;;] tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias;; tests/test_parsing.py::test_parse_alias_terminator_no_whitespace[helpalias tests/test_parsing.py::test_parse_command_only_command_and_args tests/test_parsing.py::test_parse_command_only_emptyline tests/test_parsing.py::test_parse_command_only_strips_line tests/test_parsing.py::test_parse_command_only_expands_alias tests/test_parsing.py::test_parse_command_only_expands_shortcuts tests/test_parsing.py::test_parse_command_only_quoted_args tests/test_parsing.py::test_parse_command_only_specialchars[helpalias tests/test_parsing.py::test_parse_command_only_specialchars[helpalias>out.txt] tests/test_parsing.py::test_parse_command_only_specialchars[helpalias>>out.txt] tests/test_parsing.py::test_parse_command_only_specialchars[help|less] tests/test_parsing.py::test_parse_command_only_specialchars[helpalias;] tests/test_parsing.py::test_parse_command_only_specialchars[help tests/test_parsing.py::test_parse_command_only_specialchars[help; tests/test_parsing.py::test_parse_command_only_none[;] tests/test_parsing.py::test_parse_command_only_none[;;] tests/test_parsing.py::test_parse_command_only_none[;; tests/test_parsing.py::test_parse_command_only_none[&] tests/test_parsing.py::test_parse_command_only_none[& tests/test_parsing.py::test_parse_command_only_none[ tests/test_parsing.py::test_parse_command_only_none[>] tests/test_parsing.py::test_parse_command_only_none['] tests/test_parsing.py::test_parse_command_only_none["] tests/test_parsing.py::test_parse_command_only_none[|] tests/test_parsing.py::test_statement_initialization