diff --git a/m3u8/model.py b/m3u8/model.py
index 48bfd46..a5206ad 100644
--- a/m3u8/model.py
+++ b/m3u8/model.py
@@ -220,7 +220,9 @@ class M3U8(object):
         self._base_uri = new_base_uri
         self.media.base_uri = new_base_uri
         self.playlists.base_uri = new_base_uri
+        self.iframe_playlists.base_uri = new_base_uri
         self.segments.base_uri = new_base_uri
+        self.rendition_reports.base_uri = new_base_uri
         for key in self.keys:
             if key:
                 key.base_uri = new_base_uri
@@ -249,6 +251,8 @@ class M3U8(object):
         self.media.base_path = self._base_path
         self.segments.base_path = self._base_path
         self.playlists.base_path = self._base_path
+        self.iframe_playlists.base_path = self._base_path
+        self.rendition_reports.base_path = self._base_path
 
 
     def add_playlist(self, playlist):
@@ -411,7 +415,7 @@ class Segment(BasePathMixin):
         self.uri = uri
         self.duration = duration
         self.title = title
-        self.base_uri = base_uri
+        self._base_uri = base_uri
         self.byterange = byterange
         self.program_date_time = program_date_time
         self.current_program_date_time = current_program_date_time
@@ -422,9 +426,9 @@ class Segment(BasePathMixin):
         self.scte35 = scte35
         self.scte35_duration = scte35_duration
         self.key = keyobject
-        self.parts = PartialSegmentList( [ PartialSegment(base_uri=self.base_uri, **partial) for partial in parts ] if parts else [] )
+        self.parts = PartialSegmentList( [ PartialSegment(base_uri=self._base_uri, **partial) for partial in parts ] if parts else [] )
         if init_section is not None:
-            self.init_section = InitializationSection(self.base_uri, **init_section)
+            self.init_section = InitializationSection(self._base_uri, **init_section)
         else:
             self.init_section = None
 
@@ -492,6 +496,27 @@ class Segment(BasePathMixin):
     def __str__(self):
         return self.dumps(None)
 
+    @property
+    def base_path(self):
+        return super(Segment, self).base_path
+
+    @base_path.setter
+    def base_path(self, newbase_path):
+        super(Segment, self.__class__).base_path.fset(self, newbase_path)
+        self.parts.base_path = newbase_path
+        if self.init_section is not None:
+            self.init_section.base_path = newbase_path
+
+    @property
+    def base_uri(self):
+        return self._base_uri
+
+    @base_uri.setter
+    def base_uri(self, newbase_uri):
+        self._base_uri = newbase_uri
+        self.parts.base_uri = newbase_uri
+        if self.init_section is not None:
+            self.init_section.base_uri = newbase_uri
 
 class SegmentList(list, GroupedBasePathMixin):
 

diff --git a/tests/test_model.py b/tests/test_model.py
index f3523a3..a9d3ca1 100755
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -1099,15 +1099,17 @@ def test_add_rendition_report_to_playlist():
 
     obj.add_rendition_report(
         RenditionReport(
-            base_uri='',
+            base_uri=None,
             uri='../1M/waitForMSN.php',
             last_msn=273,
             last_part=0
         )
     )
 
+    obj.base_path = 'http://localhost/test'
+
     result = obj.dumps()
-    expected = '#EXT-X-RENDITION-REPORT:URI="../1M/waitForMSN.php",LAST-MSN=273,LAST-PART=0'
+    expected = '#EXT-X-RENDITION-REPORT:URI="http://localhost/test/waitForMSN.php",LAST-MSN=273,LAST-PART=0'
 
     assert expected in result
 
@@ -1119,7 +1121,7 @@ def test_add_part_to_segment():
 
     obj.add_part(
         PartialSegment(
-            '',
+            None,
             'filePart271.0.ts',
             0.33334
         )
@@ -1188,6 +1190,38 @@ def test_endswith_newline():
 
     assert manifest.endswith('#EXT-X-ENDLIST\n')
 
+def test_init_section_base_path_update():
+    obj = m3u8.M3U8(playlists.MULTIPLE_MAP_URI_PLAYLIST)
+
+    assert obj.segments[0].init_section.uri == 'init1.mp4'
+
+    obj.base_path = 'http://localhost/base_path'
+    obj.base_uri = 'http://localhost/base_uri'
+
+    assert obj.segments[0].init_section.uri == 'http://localhost/base_path/init1.mp4'
+    assert obj.segments[0].init_section.base_uri == 'http://localhost/base_uri'
+
+def test_iframe_playlists_base_path_update():
+    obj = m3u8.M3U8(playlists.VARIANT_PLAYLIST_WITH_IFRAME_PLAYLISTS)
+
+    assert obj.iframe_playlists[0].uri == 'video-800k-iframes.m3u8'
+    assert obj.iframe_playlists[0].base_uri == None
+
+    obj.base_path = 'http://localhost/base_path'
+    obj.base_uri = 'http://localhost/base_uri'
+
+    assert obj.iframe_playlists[0].uri == 'http://localhost/base_path/video-800k-iframes.m3u8'
+    assert obj.iframe_playlists[0].base_uri == 'http://localhost/base_uri'
+
+def test_partial_segment_base_path_update():
+    obj = m3u8.M3U8(playlists.LOW_LATENCY_DELTA_UPDATE_PLAYLIST)
+
+    obj.base_path = 'http://localhost/base_path'
+    obj.base_uri = 'http://localhost/base_uri'
+
+    assert obj.segments[2].parts[0].uri == 'http://localhost/base_path/filePart271.0.ts'
+    assert obj.segments[2].parts[0].base_uri == 'http://localhost/base_uri'
+
 # custom asserts
 
 

Base Paths/URIs not applied to some types
Looks like some types that are derived from `BasePathMixin` (at least `PartialSegment`, `InitializationSegment`, `RenditionReport`) do not have their base_path or base_uri updated as they are not considered in the `M3U8` setter methods.

I will put a PR together soon.
tests/test_model.py::test_add_rendition_report_to_playlist 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_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_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_should_not_ignore_zero_duration 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_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_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