diff --git a/m3u8/model.py b/m3u8/model.py
index 50bd2d5..6fee06f 100644
--- a/m3u8/model.py
+++ b/m3u8/model.py
@@ -6,7 +6,13 @@ import decimal
 import os
 import errno
 
-from m3u8.protocol import ext_x_start, ext_x_key, ext_x_session_key, ext_x_map
+from m3u8.protocol import (
+    ext_x_key,
+    ext_x_map,
+    ext_oatcls_scte35,
+    ext_x_session_key,
+    ext_x_start,
+)
 from m3u8.parser import parse, format_date_time
 from m3u8.mixins import BasePathMixin, GroupedBasePathMixin
 
@@ -443,8 +449,8 @@ class Segment(BasePathMixin):
     def __init__(self, uri=None, base_uri=None, program_date_time=None, current_program_date_time=None,
                  duration=None, title=None, bitrate=None, byterange=None, cue_out=False,
                  cue_out_start=False, cue_in=False, discontinuity=False, key=None, scte35=None,
-                 scte35_duration=None, scte35_elapsedtime=None, keyobject=None, parts=None,
-                 init_section=None, dateranges=None, gap_tag=None, custom_parser_values=None):
+                 oatcls_scte35=None, scte35_duration=None, scte35_elapsedtime=None, keyobject=None,
+                 parts=None, init_section=None, dateranges=None, gap_tag=None, custom_parser_values=None):
         self.uri = uri
         self.duration = duration
         self.title = title
@@ -458,6 +464,7 @@ class Segment(BasePathMixin):
         self.cue_out = cue_out
         self.cue_in = cue_in
         self.scte35 = scte35
+        self.oatcls_scte35 = oatcls_scte35
         self.scte35_duration = scte35_duration
         self.scte35_elapsedtime = scte35_elapsedtime
         self.key = keyobject
@@ -506,7 +513,11 @@ class Segment(BasePathMixin):
             output.append(str(self.dateranges))
             output.append('\n')
 
+
         if self.cue_out_start:
+            if self.oatcls_scte35:
+                output.append(f'{ext_oatcls_scte35}:{self.oatcls_scte35}\n')
+
             output.append('#EXT-X-CUE-OUT{}\n'.format(
                 (':' + self.scte35_duration) if self.scte35_duration else ''))
         elif self.cue_out:
diff --git a/m3u8/parser.py b/m3u8/parser.py
index b30b8d3..6ebd5a7 100644
--- a/m3u8/parser.py
+++ b/m3u8/parser.py
@@ -111,10 +111,13 @@ def parse(content, strict=False, custom_tags_parser=None):
             state['cue_out'] = True
 
         elif line.startswith(protocol.ext_x_cue_out):
-            _parse_cueout(line, state, string_to_lines(content)[lineno - 2])
+            _parse_cueout(line, state)
             state['cue_out_start'] = True
             state['cue_out'] = True
 
+        elif line.startswith(f'{protocol.ext_oatcls_scte35}:'):
+            _parse_oatcls_scte35(line, state)
+
         elif line.startswith(protocol.ext_x_cue_in):
             state['cue_in'] = True
 
@@ -269,6 +272,7 @@ def _parse_ts_chunk(line, data, state):
     segment['cue_out_start'] = state.pop('cue_out_start', False)
     scte_op = state.pop if segment['cue_in'] else state.get
     segment['scte35'] = scte_op('current_cue_out_scte35', None)
+    segment['oatcls_scte35'] = scte_op('current_cue_out_oatcls_scte35', None)
     segment['scte35_duration'] = scte_op('current_cue_out_duration', None)
     segment['scte35_elapsedtime'] = scte_op('current_cue_out_elapsedtime', None)
     segment['discontinuity'] = state.pop('discontinuity', False)
@@ -397,15 +401,7 @@ def _cueout_no_duration(line):
     if line == protocol.ext_x_cue_out:
         return (None, None)
 
-def _cueout_elemental(line, state, prevline):
-    param, value = line.split(':', 1)
-    res = re.match('.*EXT-OATCLS-SCTE35:(.*)$', prevline)
-    if res:
-        return (res.group(1), value)
-    else:
-        return None
-
-def _cueout_envivio(line, state, prevline):
+def _cueout_envivio(line, state):
     param, value = line.split(':', 1)
     res = re.match('.*DURATION=(.*),.*,CUE="(.*)"', value)
     if res:
@@ -414,8 +410,6 @@ def _cueout_envivio(line, state, prevline):
         return None
 
 def _cueout_duration(line):
-    # this needs to be called after _cueout_elemental
-    # as it would capture those cues incompletely
     # This was added separately rather than modifying "simple"
     param, value = line.split(':', 1)
     res = re.match(r'DURATION=(.*)', value)
@@ -423,22 +417,21 @@ def _cueout_duration(line):
         return (None, res.group(1))
 
 def _cueout_simple(line):
-    # this needs to be called after _cueout_elemental
-    # as it would capture those cues incompletely
     param, value = line.split(':', 1)
     res = re.match(r'^(\d+(?:\.\d)?\d*)$', value)
     if res:
         return (None, res.group(1))
 
-def _parse_cueout(line, state, prevline):
+def _parse_cueout(line, state):
     _cueout_state = (_cueout_no_duration(line)
-                     or _cueout_elemental(line, state, prevline)
-                     or _cueout_envivio(line, state, prevline)
+                     or _cueout_envivio(line, state)
                      or _cueout_duration(line)
                      or _cueout_simple(line))
     if _cueout_state:
-        state['current_cue_out_scte35'] = _cueout_state[0]
-        state['current_cue_out_duration'] = _cueout_state[1]
+        cue_out_scte35, cue_out_duration = _cueout_state
+        current_cue_out_scte35 = state.get('current_cue_out_scte35')
+        state['current_cue_out_scte35'] = cue_out_scte35 or current_cue_out_scte35
+        state['current_cue_out_duration'] = cue_out_duration
 
 def _parse_server_control(line, data, state):
     attribute_parser = {
@@ -552,6 +545,13 @@ def _parse_content_steering(line, data, state):
         protocol.ext_x_content_steering, line, attribute_parser
     )
 
+
+def _parse_oatcls_scte35(line, state):
+    scte35_cue = line.split(':', 1)[1]
+    state['current_cue_out_oatcls_scte35'] = scte35_cue
+    state['current_cue_out_scte35'] = scte35_cue
+
+
 def string_to_lines(string):
     return string.strip().splitlines()
 
diff --git a/m3u8/protocol.py b/m3u8/protocol.py
index 87e6ca1..b6007b8 100644
--- a/m3u8/protocol.py
+++ b/m3u8/protocol.py
@@ -25,7 +25,7 @@ ext_x_cue_out = '#EXT-X-CUE-OUT'
 ext_x_cue_out_cont = '#EXT-X-CUE-OUT-CONT'
 ext_x_cue_in = '#EXT-X-CUE-IN'
 ext_x_cue_span = '#EXT-X-CUE-SPAN'
-ext_x_scte35 = '#EXT-OATCLS-SCTE35'
+ext_oatcls_scte35 = '#EXT-OATCLS-SCTE35'
 ext_is_independent_segments = '#EXT-X-INDEPENDENT-SEGMENTS'
 ext_x_map = '#EXT-X-MAP'
 ext_x_start = '#EXT-X-START'

diff --git a/tests/test_model.py b/tests/test_model.py
index 54aeb41..8f59c37 100755
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -159,6 +159,24 @@ def test_segment_cue_out_cont_attributes_dumps():
     )
     assert expected in result
 
+def test_segment_oatcls_scte35_dumps():
+    obj = m3u8.M3U8(playlists.CUE_OUT_ELEMENTAL_PLAYLIST)
+    result = obj.dumps()
+
+    # Only insert OATCLS-SCTE35 at cue out
+    cue_out_line = (
+        '#EXT-OATCLS-SCTE35:/DAlAAAAAAAAAP/wFAUAAAABf+//wpiQkv4ARKogAAEBAQAAQ6sodg==\n'
+        '#EXT-X-CUE-OUT'
+    )
+    assert cue_out_line in result
+    
+    # Don't insert it for continued cue outs
+    cue_out_cont_line =  (
+        '#EXT-OATCLS-SCTE35:/DAlAAAAAAAAAP/wFAUAAAABf+//wpiQkv4ARKogAAEBAQAAQ6sodg==\n'
+        '#EXT-X-CUE-OUT-CONT'
+    )
+    assert cue_out_cont_line not in result
+
 def test_segment_cue_out_start_dumps():
     obj = m3u8.M3U8(playlists.CUE_OUT_WITH_DURATION_PLAYLIST)
 
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 13033c1..d693d8b 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -285,11 +285,32 @@ def test_should_parse_program_date_time_from_playlist():
 
 def test_should_parse_scte35_from_playlist():
     data = m3u8.parse(playlists.CUE_OUT_ELEMENTAL_PLAYLIST)
-    assert not data['segments'][2]['cue_out']
-    assert data['segments'][3]['scte35']
-    assert data['segments'][3]['cue_out']
-    assert '/DAlAAAAAAAAAP/wFAUAAAABf+//wpiQkv4ARKogAAEBAQAAQ6sodg==' == data['segments'][4]['scte35']
-    assert '50' == data['segments'][4]['scte35_duration']
+
+    # cue_out should be maintained from [EXT-X-CUE-OUT, EXT-X-CUE-IN)
+    actual_cue_status = [s['cue_out'] for s in data['segments']]
+    expected_cue_status = [
+        False, False, False, True, True, True, True, True, True, False, False
+    ]
+    assert actual_cue_status == expected_cue_status
+
+    # scte35 should be maintained from [EXT-X-CUE-OUT, EXT-X-CUE-IN]
+    cue = '/DAlAAAAAAAAAP/wFAUAAAABf+//wpiQkv4ARKogAAEBAQAAQ6sodg=='
+    actual_scte35 = [s['scte35'] for s in data['segments']]
+    expected_scte35 = [None, None, None, cue, cue, cue, cue, cue, cue, cue, None]
+    assert actual_scte35 == expected_scte35
+
+    # oatcls_scte35 should be maintained from [EXT-X-CUE-OUT, EXT-X-CUE-IN]
+    actual_oatcls_scte35 = [s['oatcls_scte35'] for s in data['segments']]
+    expected_oatcls_scte35 = [None, None, None, cue, cue, cue, cue, cue, cue, cue, None]
+    assert actual_oatcls_scte35 == expected_oatcls_scte35
+
+    # durations should be maintained from  from [EXT-X-CUE-OUT, EXT-X-CUE-IN]
+    actual_scte35_duration = [s['scte35_duration'] for s in data['segments']]
+    expected_scte35_duration = [
+        None, None, None, '50.000', '50', '50', '50', '50', '50', '50', None
+    ]
+    assert actual_scte35_duration == expected_scte35_duration
+
 
 def test_should_parse_envivio_cue_playlist():
     data = m3u8.parse(playlists.CUE_OUT_ENVIVIO_PLAYLIST)

#EXT-OATCLS-SCTE35 tag is getting removed
According to documentation, this library supports the '#EXT-OATCLS-SCTE35' tag. But, 
when I used this parser to trim manifest files, SCTE tags were getting removed.

Below are the steps I follow,
1. Downloaded master manifest file[using python request]
2. Passed downloaded master manifest string to m3u8.loads method and got parsed master manifest object[say parsed_master_manifest]
3. Iterated over playlists of parsed_master_manifest
    a. Downloaded child manifest file[using python request]
    b. Passed downloaded child manifest string to m3u8.loads method and got parsed child manifest object[say parsed_child_manifest]
    c. Initialized Segmentlist[say desired_segments]
    d. Appended desired segments in  desired_segments
    e. Replaced original segments list with desired_segments
4. Store Master and all child manifest on local machine using m3u8.dump method
 
Please expedite this. and me know If I am doing anything wrong. I would much appreciate if any of you suggest a solution for this.
tests/test_model.py::test_segment_oatcls_scte35_dumps tests/test_parser.py::test_should_parse_scte35_from_playlist
tests/test_model.py::test_base_path_playlist_with_slash_in_query_string tests/test_model.py::test_target_duration_attribute tests/test_model.py::test_media_sequence_attribute tests/test_model.py::test_program_date_time_attribute tests/test_model.py::test_program_date_time_attribute_for_each_segment tests/test_model.py::test_program_date_time_attribute_with_discontinuity tests/test_model.py::test_program_date_time_attribute_without_discontinuity tests/test_model.py::test_segment_discontinuity_attribute tests/test_model.py::test_segment_cue_out_attribute tests/test_model.py::test_segment_cue_out_start_attribute tests/test_model.py::test_segment_cue_in_attribute tests/test_model.py::test_segment_cue_out_cont_dumps tests/test_model.py::test_segment_cue_out_cont_attributes_dumps tests/test_model.py::test_segment_cue_out_start_dumps tests/test_model.py::test_segment_cue_out_start_no_duration_dumps tests/test_model.py::test_segment_cue_out_in_dumps tests/test_model.py::test_segment_elemental_scte35_attribute tests/test_model.py::test_segment_envivio_scte35_attribute tests/test_model.py::test_segment_unknown_scte35_attribute tests/test_model.py::test_segment_cue_out_no_duration tests/test_model.py::test_keys_on_clear_playlist tests/test_model.py::test_keys_on_simple_encrypted_playlist tests/test_model.py::test_key_attribute tests/test_model.py::test_key_attribute_on_none tests/test_model.py::test_key_attribute_without_initialization_vector tests/test_model.py::test_session_keys_on_clear_playlist tests/test_model.py::test_session_keys_on_simple_encrypted_playlist tests/test_model.py::test_session_key_attribute tests/test_model.py::test_session_key_attribute_on_none tests/test_model.py::test_session_key_attribute_without_initialization_vector tests/test_model.py::test_segments_attribute tests/test_model.py::test_segments_attribute_without_title tests/test_model.py::test_segments_attribute_without_duration tests/test_model.py::test_segments_attribute_with_byterange tests/test_model.py::test_segment_attribute_with_multiple_keys tests/test_model.py::test_segment_title_dumps tests/test_model.py::test_is_variant_attribute tests/test_model.py::test_is_endlist_attribute tests/test_model.py::test_is_i_frames_only_attribute tests/test_model.py::test_playlists_attribute tests/test_model.py::test_playlists_attribute_without_program_id tests/test_model.py::test_playlists_attribute_with_resolution tests/test_model.py::test_iframe_playlists_attribute tests/test_model.py::test_version_attribute tests/test_model.py::test_version_settable_as_int tests/test_model.py::test_version_settable_as_string tests/test_model.py::test_allow_cache_attribute tests/test_model.py::test_files_attribute_should_list_all_files_including_segments_and_key tests/test_model.py::test_vod_playlist_type_should_be_imported_as_a_simple_attribute tests/test_model.py::test_event_playlist_type_should_be_imported_as_a_simple_attribute tests/test_model.py::test_independent_segments_should_be_true tests/test_model.py::test_independent_segments_should_be_false tests/test_model.py::test_no_playlist_type_leaves_attribute_empty tests/test_model.py::test_dump_playlists_with_resolution tests/test_model.py::test_dump_should_build_file_with_same_content tests/test_model.py::test_dump_should_create_sub_directories tests/test_model.py::test_dump_should_raise_if_create_sub_directories_fails tests/test_model.py::test_dump_should_work_for_variant_streams tests/test_model.py::test_dump_should_work_for_variant_playlists_with_iframe_playlists tests/test_model.py::test_dump_should_work_for_iframe_playlists tests/test_model.py::test_dump_should_include_program_date_time tests/test_model.py::test_dump_segment_honors_timespec tests/test_model.py::test_dump_should_not_ignore_zero_duration tests/test_model.py::test_dump_should_use_decimal_floating_point_for_very_short_durations tests/test_model.py::test_dump_should_include_segment_level_program_date_time tests/test_model.py::test_dump_should_include_segment_level_program_date_time_without_discontinuity tests/test_model.py::test_dump_should_include_map_attributes tests/test_model.py::test_multiple_map_attributes tests/test_model.py::test_dump_should_include_multiple_map_attributes tests/test_model.py::test_dump_should_work_for_playlists_using_byteranges tests/test_model.py::test_should_dump_with_endlist_tag tests/test_model.py::test_should_dump_without_endlist_tag tests/test_model.py::test_should_dump_multiple_keys tests/test_model.py::test_should_dump_unencrypted_encrypted_keys_together tests/test_model.py::test_should_dump_complex_unencrypted_encrypted_keys tests/test_model.py::test_should_dump_complex_unencrypted_encrypted_keys_no_uri_attr tests/test_model.py::test_should_dump_session_data tests/test_model.py::test_should_dump_multiple_session_data tests/test_model.py::test_length_segments_by_key tests/test_model.py::test_list_segments_by_key tests/test_model.py::test_replace_segment_key tests/test_model.py::test_keyformat_and_keyformatversion tests/test_model.py::test_should_dump_program_datetime_and_discontinuity tests/test_model.py::test_should_normalize_segments_and_key_urls_if_base_path_passed_to_constructor tests/test_model.py::test_should_normalize_session_key_urls_if_base_path_passed_to_constructor tests/test_model.py::test_should_normalize_variant_streams_urls_if_base_path_passed_to_constructor tests/test_model.py::test_should_normalize_segments_and_key_urls_if_base_path_attribute_updated tests/test_model.py::test_playlist_type_dumped_to_appropriate_m3u8_field tests/test_model.py::test_empty_playlist_type_is_gracefully_ignored tests/test_model.py::test_none_playlist_type_is_gracefully_ignored tests/test_model.py::test_0_media_sequence_added_to_file tests/test_model.py::test_none_media_sequence_gracefully_ignored tests/test_model.py::test_0_discontinuity_sequence_added_to_file tests/test_model.py::test_none_discontinuity_sequence_gracefully_ignored tests/test_model.py::test_non_zero_discontinuity_sequence_added_to_file tests/test_model.py::test_should_correctly_update_base_path_if_its_blank tests/test_model.py::test_base_path_should_just_return_uri_if_absolute tests/test_model.py::test_m3u8_should_propagate_base_uri_to_segments tests/test_model.py::test_m3u8_should_propagate_base_uri_to_key tests/test_model.py::test_m3u8_should_propagate_base_uri_to_session_key tests/test_model.py::test_base_path_with_optional_uri_should_do_nothing tests/test_model.py::test_medialist_uri_method tests/test_model.py::test_segment_map_uri_attribute tests/test_model.py::test_segment_map_uri_attribute_with_byterange tests/test_model.py::test_start_with_negative_offset tests/test_model.py::test_start_with_precise tests/test_model.py::test_playlist_stream_info_contains_group_id_refs tests/test_model.py::test_should_dump_frame_rate tests/test_model.py::test_should_round_frame_rate tests/test_model.py::test_add_segment_to_playlist tests/test_model.py::test_segment_str_method tests/test_model.py::test_attribute_denormaliser tests/test_model.py::test_find_key_throws_when_no_match tests/test_model.py::test_ll_playlist tests/test_model.py::test_add_rendition_report_to_playlist tests/test_model.py::test_add_part_to_segment tests/test_model.py::test_partial_segment_gap_and_byterange tests/test_model.py::test_session_data_with_value tests/test_model.py::test_session_data_with_uri tests/test_model.py::test_session_data_cannot_be_created_with_value_and_uri_at_the_same_time tests/test_model.py::test_endswith_newline tests/test_model.py::test_init_section_base_path_update tests/test_model.py::test_iframe_playlists_base_path_update tests/test_model.py::test_partial_segment_base_path_update tests/test_model.py::test_add_preload_hint tests/test_model.py::test_add_daterange tests/test_model.py::test_daterange_simple tests/test_model.py::test_daterange_scte_out_and_in tests/test_model.py::test_daterange_enddate_sctecmd tests/test_model.py::test_daterange_in_parts tests/test_model.py::test_add_gap tests/test_model.py::test_gap tests/test_model.py::test_gap_in_parts tests/test_model.py::test_skip_dateranges tests/test_model.py::test_add_skip tests/test_model.py::test_content_steering tests/test_model.py::test_add_content_steering tests/test_model.py::test_content_steering_base_path_update tests/test_model.py::test_add_content_steering_base_uri_update tests/test_parser.py::test_should_parse_simple_playlist_from_string tests/test_parser.py::test_should_parse_non_integer_duration_from_playlist_string tests/test_parser.py::test_should_parse_comma_in_title tests/test_parser.py::test_should_parse_simple_playlist_from_string_with_different_linebreaks tests/test_parser.py::test_should_parse_sliding_window_playlist_from_string tests/test_parser.py::test_should_parse_playlist_with_encrypted_segments_from_string tests/test_parser.py::test_should_load_playlist_with_iv_from_string tests/test_parser.py::test_should_add_key_attribute_to_segment_from_playlist tests/test_parser.py::test_should_add_non_key_for_multiple_keys_unencrypted_and_encrypted tests/test_parser.py::test_should_handle_key_method_none_and_no_uri_attr tests/test_parser.py::test_should_parse_playlist_with_session_encrypted_segments_from_string tests/test_parser.py::test_should_load_playlist_with_session_iv_from_string tests/test_parser.py::test_should_parse_quoted_title_from_playlist tests/test_parser.py::test_should_parse_unquoted_title_from_playlist tests/test_parser.py::test_should_parse_variant_playlist tests/test_parser.py::test_should_parse_variant_playlist_with_cc_subtitles_and_audio tests/test_parser.py::test_should_parse_variant_playlist_with_none_cc_and_audio tests/test_parser.py::test_should_parse_variant_playlist_with_average_bandwidth tests/test_parser.py::test_should_parse_variant_playlist_with_video_range tests/test_parser.py::test_should_parse_variant_playlist_with_hdcp_level tests/test_parser.py::test_should_parse_variant_playlist_with_bandwidth_as_float tests/test_parser.py::test_should_parse_variant_playlist_with_iframe_playlists tests/test_parser.py::test_should_parse_variant_playlist_with_alt_iframe_playlists_layout tests/test_parser.py::test_should_parse_iframe_playlist tests/test_parser.py::test_should_parse_playlist_using_byteranges tests/test_parser.py::test_should_parse_endlist_playlist tests/test_parser.py::test_should_parse_ALLOW_CACHE tests/test_parser.py::test_should_parse_VERSION tests/test_parser.py::test_should_parse_program_date_time_from_playlist tests/test_parser.py::test_should_parse_envivio_cue_playlist tests/test_parser.py::test_should_parse_no_duration_cue_playlist tests/test_parser.py::test_parse_simple_playlist_messy tests/test_parser.py::test_parse_simple_playlist_messy_strict tests/test_parser.py::test_commaless_extinf tests/test_parser.py::test_commaless_extinf_strict tests/test_parser.py::test_should_parse_segment_map_uri tests/test_parser.py::test_should_parse_segment_map_uri_with_byterange tests/test_parser.py::test_should_parse_multiple_map_attributes tests/test_parser.py::test_should_parse_empty_uri_with_base_path tests/test_parser.py::test_should_parse_audio_channels tests/test_parser.py::test_should_parse_start_with_negative_time_offset tests/test_parser.py::test_should_parse_start_with_precise tests/test_parser.py::test_should_parse_session_data tests/test_parser.py::test_should_parse_multiple_session_data tests/test_parser.py::test_simple_playlist_with_discontinuity_sequence tests/test_parser.py::test_simple_playlist_with_custom_tags tests/test_parser.py::test_iptv_playlist_with_custom_tags tests/test_parser.py::test_master_playlist_with_frame_rate tests/test_parser.py::test_master_playlist_with_unrounded_frame_rate tests/test_parser.py::test_low_latency_playlist tests/test_parser.py::test_low_latency_with_preload_and_byteranges_playlist tests/test_parser.py::test_negative_media_sequence tests/test_parser.py::test_daterange_simple tests/test_parser.py::test_date_range_with_scte_out_and_in tests/test_parser.py::test_date_range_in_parts tests/test_parser.py::test_gap tests/test_parser.py::test_gap_in_parts tests/test_parser.py::test_should_parse_variant_playlist_with_iframe_with_average_bandwidth tests/test_parser.py::test_should_parse_variant_playlist_with_iframe_with_video_range tests/test_parser.py::test_should_parse_variant_playlist_with_iframe_with_hdcp_level tests/test_parser.py::test_delta_playlist_daterange_skipping tests/test_parser.py::test_bitrate tests/test_parser.py::test_content_steering tests/test_parser.py::test_cue_in_pops_scte35_data_and_duration tests/test_parser.py::test_playlist_with_stable_variant_id tests/test_parser.py::test_iframe_with_stable_variant_id tests/test_parser.py::test_media_with_stable_rendition_id