diff --git a/cmd2/parsing.py b/cmd2/parsing.py
index ce15bd38..655e0c58 100644
--- a/cmd2/parsing.py
+++ b/cmd2/parsing.py
@@ -250,23 +250,27 @@ class StatementParser:
         tokens = self.tokenize(rawinput)
 
         # of the valid terminators, find the first one to occur in the input
-        terminator_pos = len(tokens)+1
-        for test_terminator in self.terminators:
-            try:
-                pos = tokens.index(test_terminator)
-                if pos < terminator_pos:
+        terminator_pos = len(tokens) + 1
+        for pos, cur_token in enumerate(tokens):
+            for test_terminator in self.terminators:
+                if cur_token.startswith(test_terminator):
                     terminator_pos = pos
                     terminator = test_terminator
+                    # break the inner loop, and we want to break the
+                    # outer loop too
                     break
-            except ValueError:
-                # the terminator is not in the tokens
-                pass
+            else:
+                # this else clause is only run if the inner loop
+                # didn't execute a break. If it didn't, then
+                # continue to the next iteration of the outer loop
+                continue
+            # inner loop was broken, break the outer
+            break
 
         if terminator:
             if terminator == LINE_FEED:
                 terminator_pos = len(tokens)+1
-            else:
-                terminator_pos = tokens.index(terminator)
+
             # everything before the first terminator is the command and the args
             argv = tokens[:terminator_pos]
             (command, args) = self._command_and_args(argv)

diff --git a/tests/test_parsing.py b/tests/test_parsing.py
index 41966c71..7b361b7e 100644
--- a/tests/test_parsing.py
+++ b/tests/test_parsing.py
@@ -250,6 +250,23 @@ def test_parse_redirect_inside_terminator(parser):
     assert statement.argv == ['has', '>', 'inside']
     assert statement.terminator == ';'
 
+@pytest.mark.parametrize('line,terminator',[
+    ('multiline with | inside;', ';'),
+    ('multiline with | inside ;', ';'),
+    ('multiline with | inside;;;', ';'),
+    ('multiline with | inside;; ;;', ';'),
+    ('multiline with | inside&', '&'),
+    ('multiline with | inside &;', '&'),
+    ('multiline with | inside&&;', '&'),
+    ('multiline with | inside &; &;', '&'),
+])
+def test_parse_multiple_terminators(parser, line, terminator):
+    statement = parser.parse(line)
+    assert statement.multiline_command == 'multiline'
+    assert statement.args == 'with | inside'
+    assert statement.argv == ['multiline', 'with', '|', 'inside']
+    assert statement.terminator == terminator
+
 def test_parse_unfinished_multiliine_command(parser):
     line = 'multiline has > inside an unfinished command'
     statement = parser.parse(line)
@@ -261,7 +278,10 @@ def test_parse_unfinished_multiliine_command(parser):
 
 @pytest.mark.parametrize('line,terminator',[
     ('multiline has > inside;', ';'),
+    ('multiline has > inside;;;', ';'),
+    ('multiline has > inside;; ;;', ';'),
     ('multiline has > inside &', '&'),
+    ('multiline has > inside & &', '&'),
 ])
 def test_parse_multiline_command_ignores_redirectors_within_it(parser, line, terminator):
     statement = parser.parse(line)
@@ -388,8 +408,15 @@ def test_parse_alias_pipe(parser, line):
     assert not statement.args
     assert statement.pipe_to == ['less']
 
-def test_parse_alias_terminator_no_whitespace(parser):
-    line = 'helpalias;'
+@pytest.mark.parametrize('line', [
+    'helpalias;',
+    'helpalias;;',
+    'helpalias;; ;',
+    'helpalias ;',
+    'helpalias ; ;',
+    'helpalias ;; ;',
+])
+def test_parse_alias_terminator_no_whitespace(parser, line):
     statement = parser.parse(line)
     assert statement.command == 'help'
     assert not statement.args
@@ -448,6 +475,8 @@ def test_parse_command_only_quoted_args(parser):
     'helpalias>>out.txt',
     'help|less',
     'helpalias;',
+    'help ;;',
+    'help; ;;',
 ])
 def test_parse_command_only_specialchars(parser, line):
     statement = parser.parse_command_only(line)
@@ -455,6 +484,11 @@ def test_parse_command_only_specialchars(parser, line):
 
 @pytest.mark.parametrize('line', [
     ';',
+    ';;',
+    ';; ;',
+    '&',
+    '& &',
+    ' && &',
     '>',
     "'",
     '"',

Allow continuous run of terminators to end a multiline command
`test_cmd ;;;;;`   (Results in a new line)

`test_cmd ;;;;;   ;` (Completes the command)

Both of these input lines should complete the command.
tests/test_parsing.py::test_parse_multiple_terminators[multiline tests/test_parsing.py::test_parse_multiline_command_ignores_redirectors_within_it[multiline 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_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_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_unfinished_multiliine_command 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_termninated_by_empty_line 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_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[|]