diff --git a/cloudbaseinit/plugins/common/userdata.py b/cloudbaseinit/plugins/common/userdata.py
index 23346ae6..4b06047b 100644
--- a/cloudbaseinit/plugins/common/userdata.py
+++ b/cloudbaseinit/plugins/common/userdata.py
@@ -134,7 +134,7 @@ class UserDataPlugin(base.BasePlugin):
                 LOG.debug("Calling user part handler for content type: %s" %
                           content_type)
                 handler_func(None, content_type, part.get_filename(),
-                             part.get_payload())
+                             part.get_payload(decode=True))
             else:
                 user_data_plugin = user_data_plugins.get(content_type)
                 if not user_data_plugin:
diff --git a/cloudbaseinit/plugins/common/userdataplugins/cloudconfig.py b/cloudbaseinit/plugins/common/userdataplugins/cloudconfig.py
index 76c59a08..9300e46f 100644
--- a/cloudbaseinit/plugins/common/userdataplugins/cloudconfig.py
+++ b/cloudbaseinit/plugins/common/userdataplugins/cloudconfig.py
@@ -105,5 +105,5 @@ class CloudConfigPlugin(base.BaseUserDataPlugin):
             return executor.execute()
 
     def process(self, part):
-        payload = part.get_payload()
+        payload = part.get_payload(decode=True)
         return self.process_non_multipart(payload)
diff --git a/cloudbaseinit/plugins/common/userdataplugins/heat.py b/cloudbaseinit/plugins/common/userdataplugins/heat.py
index ee3cfb53..be8ff454 100644
--- a/cloudbaseinit/plugins/common/userdataplugins/heat.py
+++ b/cloudbaseinit/plugins/common/userdataplugins/heat.py
@@ -40,10 +40,10 @@ class HeatPlugin(base.BaseUserDataPlugin):
         file_name = os.path.join(CONF.heat_config_dir, part.get_filename())
         self._check_dir(file_name)
 
-        encoding.write_file(file_name, part.get_payload())
+        payload = part.get_payload(decode=True)
+        encoding.write_file(file_name, payload)
 
         if part.get_filename() == self._heat_user_data_filename:
-            payload = part.get_payload()
             # Normalize the payload to bytes, since `execute_user_data_script`
             # operates on bytes and `get_payload` returns a string on
             # Python 3.
diff --git a/cloudbaseinit/plugins/common/userdataplugins/parthandler.py b/cloudbaseinit/plugins/common/userdataplugins/parthandler.py
index fea7f104..8dfcade6 100644
--- a/cloudbaseinit/plugins/common/userdataplugins/parthandler.py
+++ b/cloudbaseinit/plugins/common/userdataplugins/parthandler.py
@@ -29,7 +29,7 @@ class PartHandlerPlugin(base.BaseUserDataPlugin):
     def process(self, part):
         temp_dir = tempfile.gettempdir()
         part_handler_path = os.path.join(temp_dir, part.get_filename())
-        encoding.write_file(part_handler_path, part.get_payload())
+        encoding.write_file(part_handler_path, part.get_payload(decode=True))
 
         part_handler = classloader.ClassLoader().load_module(part_handler_path)
 
diff --git a/cloudbaseinit/plugins/common/userdataplugins/shellscript.py b/cloudbaseinit/plugins/common/userdataplugins/shellscript.py
index 855ced6f..84186297 100644
--- a/cloudbaseinit/plugins/common/userdataplugins/shellscript.py
+++ b/cloudbaseinit/plugins/common/userdataplugins/shellscript.py
@@ -36,7 +36,7 @@ class ShellScriptPlugin(base.BaseUserDataPlugin):
         target_path = os.path.join(tempfile.gettempdir(), file_name)
 
         try:
-            encoding.write_file(target_path, part.get_payload())
+            encoding.write_file(target_path, part.get_payload(decode=True))
 
             return fileexecutils.exec_file(target_path)
         except Exception as ex:
diff --git a/cloudbaseinit/tests/plugins/common/userdataplugins/test_shellscript.py b/cloudbaseinit/tests/plugins/common/userdataplugins/test_shellscript.py
index 75c600a6..7abc7609 100644
--- a/cloudbaseinit/tests/plugins/common/userdataplugins/test_shellscript.py
+++ b/cloudbaseinit/tests/plugins/common/userdataplugins/test_shellscript.py
@@ -63,7 +63,7 @@ class ShellScriptPluginTests(unittest.TestCase):
         mock_write_file.assert_called_once_with(
             fake_target, mock_part.get_payload.return_value)
         mock_exec_file.assert_called_once_with(fake_target)
-        mock_part.get_payload.assert_called_once_with()
+        mock_part.get_payload.assert_called_once_with(decode=True)
         mock_gettempdir.assert_called_once_with()
         if not exception:
             self.assertEqual('fake response', response)