diff --git a/stix2/pattern_visitor.py b/stix2/pattern_visitor.py
index 5b8300f..c4deb64 100644
--- a/stix2/pattern_visitor.py
+++ b/stix2/pattern_visitor.py
@@ -49,6 +49,9 @@ def check_for_valid_timetamp_syntax(timestamp_string):
     return _TIMESTAMP_RE.match(timestamp_string)
 
 
+def same_boolean_operator(current_op, op_token):
+    return current_op == op_token.symbol.text
+
 
 class STIXPatternVisitorForSTIX2():
     classes = {}
@@ -131,7 +134,7 @@ class STIXPatternVisitorForSTIX2():
         if len(children) == 1:
             return children[0]
         else:
-            if isinstance(children[0], _BooleanExpression):
+            if isinstance(children[0], _BooleanExpression) and same_boolean_operator(children[0].operator, children[1]):
                 children[0].operands.append(children[2])
                 return children[0]
             else:

diff --git a/stix2/test/v20/test_pattern_expressions.py b/stix2/test/v20/test_pattern_expressions.py
index a96d3b8..0e0a9ca 100644
--- a/stix2/test/v20/test_pattern_expressions.py
+++ b/stix2/test/v20/test_pattern_expressions.py
@@ -511,6 +511,16 @@ def test_parsing_start_stop_qualified_expression():
     ) == "[ipv4-addr:value = '1.2.3.4'] START '2016-06-01T00:00:00Z' STOP '2017-03-12T08:30:00Z'"
 
 
+def test_parsing_mixed_boolean_expression_1():
+    patt_obj = create_pattern_object("[a:b = 1 AND a:b = 2 OR a:b = 3]",)
+    assert str(patt_obj) == "[a:b = 1 AND a:b = 2 OR a:b = 3]"
+
+
+def test_parsing_mixed_boolean_expression_2():
+    patt_obj = create_pattern_object("[a:b = 1 OR a:b = 2 AND a:b = 3]",)
+    assert str(patt_obj) == "[a:b = 1 OR a:b = 2 AND a:b = 3]"
+
+
 def test_parsing_illegal_start_stop_qualified_expression():
     with pytest.raises(ValueError):
         create_pattern_object("[ipv4-addr:value = '1.2.3.4'] START '2016-06-01' STOP '2017-03-12T08:30:00Z'", version="2.0")
diff --git a/stix2/test/v21/test_pattern_expressions.py b/stix2/test/v21/test_pattern_expressions.py
index 8294a41..b574e05 100644
--- a/stix2/test/v21/test_pattern_expressions.py
+++ b/stix2/test/v21/test_pattern_expressions.py
@@ -644,6 +644,16 @@ def test_parsing_boolean():
     assert str(patt_obj) == "[network-traffic:is_active = true]"
 
 
+def test_parsing_mixed_boolean_expression_1():
+    patt_obj = create_pattern_object("[a:b = 1 AND a:b = 2 OR a:b = 3]",)
+    assert str(patt_obj) == "[a:b = 1 AND a:b = 2 OR a:b = 3]"
+
+
+def test_parsing_mixed_boolean_expression_2():
+    patt_obj = create_pattern_object("[a:b = 1 OR a:b = 2 AND a:b = 3]",)
+    assert str(patt_obj) == "[a:b = 1 OR a:b = 2 AND a:b = 3]"
+
+
 def test_parsing_multiple_slashes_quotes():
     patt_obj = create_pattern_object("[ file:name = 'weird_name\\'' ]", version="2.1")
     assert str(patt_obj) == "[file:name = 'weird_name\\'']"

Pattern AST creation bug
Comparison expression ORs can get changed to ANDs:

```python
from stix2.pattern_visitor import create_pattern_object

ast = create_pattern_object(pattern="[a:b=1 AND a:b=2 OR a:b=3]")

print(ast)
```
produces
```
[a:b = 1 AND a:b = 2 AND a:b = 3]
```

stix2/test/v20/test_pattern_expressions.py::test_parsing_mixed_boolean_expression_1 stix2/test/v21/test_pattern_expressions.py::test_parsing_mixed_boolean_expression_1
stix2/test/v20/test_pattern_expressions.py::test_create_comparison_expression stix2/test/v20/test_pattern_expressions.py::test_boolean_expression stix2/test/v20/test_pattern_expressions.py::test_boolean_expression_with_parentheses stix2/test/v20/test_pattern_expressions.py::test_hash_followed_by_registryKey_expression_python_constant stix2/test/v20/test_pattern_expressions.py::test_hash_followed_by_registryKey_expression stix2/test/v20/test_pattern_expressions.py::test_file_observable_expression stix2/test/v20/test_pattern_expressions.py::test_multiple_file_observable_expression[AndObservationExpression-AND] stix2/test/v20/test_pattern_expressions.py::test_multiple_file_observable_expression[OrObservationExpression-OR] stix2/test/v20/test_pattern_expressions.py::test_root_types stix2/test/v20/test_pattern_expressions.py::test_artifact_payload stix2/test/v20/test_pattern_expressions.py::test_greater_than_python_constant stix2/test/v20/test_pattern_expressions.py::test_greater_than stix2/test/v20/test_pattern_expressions.py::test_less_than stix2/test/v20/test_pattern_expressions.py::test_greater_than_or_equal stix2/test/v20/test_pattern_expressions.py::test_less_than_or_equal stix2/test/v20/test_pattern_expressions.py::test_not stix2/test/v20/test_pattern_expressions.py::test_and_observable_expression stix2/test/v20/test_pattern_expressions.py::test_invalid_and_observable_expression stix2/test/v20/test_pattern_expressions.py::test_hex stix2/test/v20/test_pattern_expressions.py::test_multiple_qualifiers stix2/test/v20/test_pattern_expressions.py::test_set_op stix2/test/v20/test_pattern_expressions.py::test_timestamp stix2/test/v20/test_pattern_expressions.py::test_boolean stix2/test/v20/test_pattern_expressions.py::test_binary stix2/test/v20/test_pattern_expressions.py::test_list stix2/test/v20/test_pattern_expressions.py::test_list2 stix2/test/v20/test_pattern_expressions.py::test_invalid_constant_type stix2/test/v20/test_pattern_expressions.py::test_invalid_integer_constant stix2/test/v20/test_pattern_expressions.py::test_invalid_float_constant stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[True-True0] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[False-False0] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[True-True1] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[False-False1] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[true-True] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[false-False] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[t-True] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[f-False] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[T-True] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[F-False] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[1-True] stix2/test/v20/test_pattern_expressions.py::test_boolean_constant[0-False] stix2/test/v20/test_pattern_expressions.py::test_invalid_boolean_constant stix2/test/v20/test_pattern_expressions.py::test_invalid_hash_constant[MD5-zzz] stix2/test/v20/test_pattern_expressions.py::test_invalid_hash_constant[ssdeep-zzz==] stix2/test/v20/test_pattern_expressions.py::test_invalid_hex_constant stix2/test/v20/test_pattern_expressions.py::test_invalid_binary_constant stix2/test/v20/test_pattern_expressions.py::test_escape_quotes_and_backslashes stix2/test/v20/test_pattern_expressions.py::test_like stix2/test/v20/test_pattern_expressions.py::test_issuperset stix2/test/v20/test_pattern_expressions.py::test_repeat_qualifier stix2/test/v20/test_pattern_expressions.py::test_invalid_repeat_qualifier stix2/test/v20/test_pattern_expressions.py::test_invalid_within_qualifier stix2/test/v20/test_pattern_expressions.py::test_startstop_qualifier stix2/test/v20/test_pattern_expressions.py::test_invalid_startstop_qualifier stix2/test/v20/test_pattern_expressions.py::test_make_constant_already_a_constant stix2/test/v20/test_pattern_expressions.py::test_parsing_comparison_expression stix2/test/v20/test_pattern_expressions.py::test_parsing_qualified_expression stix2/test/v20/test_pattern_expressions.py::test_parsing_start_stop_qualified_expression stix2/test/v20/test_pattern_expressions.py::test_parsing_mixed_boolean_expression_2 stix2/test/v20/test_pattern_expressions.py::test_parsing_illegal_start_stop_qualified_expression stix2/test/v20/test_pattern_expressions.py::test_list_constant stix2/test/v21/test_pattern_expressions.py::test_create_comparison_expression stix2/test/v21/test_pattern_expressions.py::test_boolean_expression stix2/test/v21/test_pattern_expressions.py::test_boolean_expression_with_parentheses stix2/test/v21/test_pattern_expressions.py::test_hash_followed_by_registryKey_expression_python_constant stix2/test/v21/test_pattern_expressions.py::test_hash_followed_by_registryKey_expression stix2/test/v21/test_pattern_expressions.py::test_file_observable_expression stix2/test/v21/test_pattern_expressions.py::test_multiple_file_observable_expression[AndObservationExpression-AND] stix2/test/v21/test_pattern_expressions.py::test_multiple_file_observable_expression[OrObservationExpression-OR] stix2/test/v21/test_pattern_expressions.py::test_root_types stix2/test/v21/test_pattern_expressions.py::test_artifact_payload stix2/test/v21/test_pattern_expressions.py::test_greater_than_python_constant stix2/test/v21/test_pattern_expressions.py::test_greater_than stix2/test/v21/test_pattern_expressions.py::test_parsing_greater_than stix2/test/v21/test_pattern_expressions.py::test_less_than stix2/test/v21/test_pattern_expressions.py::test_parsing_less_than stix2/test/v21/test_pattern_expressions.py::test_greater_than_or_equal stix2/test/v21/test_pattern_expressions.py::test_parsing_greater_than_or_equal stix2/test/v21/test_pattern_expressions.py::test_less_than_or_equal stix2/test/v21/test_pattern_expressions.py::test_parsing_less_than_or_equal stix2/test/v21/test_pattern_expressions.py::test_parsing_issubset stix2/test/v21/test_pattern_expressions.py::test_parsing_issuperset stix2/test/v21/test_pattern_expressions.py::test_parsing_like stix2/test/v21/test_pattern_expressions.py::test_parsing_match stix2/test/v21/test_pattern_expressions.py::test_parsing_followed_by stix2/test/v21/test_pattern_expressions.py::test_not stix2/test/v21/test_pattern_expressions.py::test_and_observable_expression stix2/test/v21/test_pattern_expressions.py::test_parsing_and_observable_expression stix2/test/v21/test_pattern_expressions.py::test_or_observable_expression stix2/test/v21/test_pattern_expressions.py::test_parsing_or_observable_expression stix2/test/v21/test_pattern_expressions.py::test_invalid_and_observable_expression stix2/test/v21/test_pattern_expressions.py::test_hex stix2/test/v21/test_pattern_expressions.py::test_parsing_hex stix2/test/v21/test_pattern_expressions.py::test_multiple_qualifiers stix2/test/v21/test_pattern_expressions.py::test_set_op stix2/test/v21/test_pattern_expressions.py::test_timestamp stix2/test/v21/test_pattern_expressions.py::test_boolean stix2/test/v21/test_pattern_expressions.py::test_binary stix2/test/v21/test_pattern_expressions.py::test_parsing_binary stix2/test/v21/test_pattern_expressions.py::test_list stix2/test/v21/test_pattern_expressions.py::test_list2 stix2/test/v21/test_pattern_expressions.py::test_invalid_constant_type stix2/test/v21/test_pattern_expressions.py::test_invalid_integer_constant stix2/test/v21/test_pattern_expressions.py::test_invalid_timestamp_constant stix2/test/v21/test_pattern_expressions.py::test_invalid_float_constant stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[True-True0] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[False-False0] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[True-True1] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[False-False1] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[true-True] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[false-False] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[t-True] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[f-False] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[T-True] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[F-False] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[1-True] stix2/test/v21/test_pattern_expressions.py::test_boolean_constant[0-False] stix2/test/v21/test_pattern_expressions.py::test_invalid_boolean_constant stix2/test/v21/test_pattern_expressions.py::test_invalid_hash_constant[MD5-zzz] stix2/test/v21/test_pattern_expressions.py::test_invalid_hash_constant[SSDEEP-zzz==] stix2/test/v21/test_pattern_expressions.py::test_invalid_hex_constant stix2/test/v21/test_pattern_expressions.py::test_invalid_binary_constant stix2/test/v21/test_pattern_expressions.py::test_escape_quotes_and_backslashes stix2/test/v21/test_pattern_expressions.py::test_like stix2/test/v21/test_pattern_expressions.py::test_issuperset stix2/test/v21/test_pattern_expressions.py::test_repeat_qualifier stix2/test/v21/test_pattern_expressions.py::test_invalid_repeat_qualifier stix2/test/v21/test_pattern_expressions.py::test_invalid_within_qualifier stix2/test/v21/test_pattern_expressions.py::test_startstop_qualifier stix2/test/v21/test_pattern_expressions.py::test_invalid_startstop_qualifier stix2/test/v21/test_pattern_expressions.py::test_make_constant_already_a_constant stix2/test/v21/test_pattern_expressions.py::test_parsing_comparison_expression stix2/test/v21/test_pattern_expressions.py::test_parsing_repeat_and_within_qualified_expression stix2/test/v21/test_pattern_expressions.py::test_parsing_start_stop_qualified_expression stix2/test/v21/test_pattern_expressions.py::test_list_constant stix2/test/v21/test_pattern_expressions.py::test_parsing_boolean stix2/test/v21/test_pattern_expressions.py::test_parsing_mixed_boolean_expression_2 stix2/test/v21/test_pattern_expressions.py::test_parsing_multiple_slashes_quotes stix2/test/v21/test_pattern_expressions.py::test_parse_error