diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_getTemplateProxyParameter.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_getTemplateProxyParameter.py
index e1f7b3f7ab338e8c4112760d7d0ed053b9c1f77a..4b9e23a5472b0df91d761fd73e09346feb1d0992 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_getTemplateProxyParameter.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_getTemplateProxyParameter.py
@@ -128,7 +128,7 @@ def populateOrganisationDict(my_organisation_list):
     if organisation_default_image:
       output_dict["logo_url"] = organisation_default_image.getRelativeUrl()
       output_dict["logo_data_url"] = 'data:image/png;;base64,%s' % (
-        b64encode(organisation_default_image.convert(format="png", display="thumbnail")[1])
+        b64encode(organisation_default_image.convert(format="png", display="thumbnail")[1]).decode()
       )
     else:
       output_dict["logo_url"] = err("logo_url")
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsLetter.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsLetter.py
index da568d4d6bcee91dbc7448fee6f76c394377b18b..98499aa65f0dacaadb600696428abebc6e012b38 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsLetter.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsLetter.py
@@ -256,9 +256,9 @@ if letter_format == "pdf":
   )
 
   # ================ encode and build cloudoo elements =========================
-  embedded_html_data = letter.Base_convertHtmlToSingleFile(letter_content, allow_script=True)
-  header_embedded_html_data = letter.Base_convertHtmlToSingleFile(letter_head, allow_script=True)
-  footer_embedded_html_data = letter.Base_convertHtmlToSingleFile(letter_foot, allow_script=True)
+  embedded_html_data = letter.Base_convertHtmlToSingleFile(letter_content, allow_script=True).encode('utf-8')
+  header_embedded_html_data = letter.Base_convertHtmlToSingleFile(letter_head, allow_script=True).encode('utf-8')
+  footer_embedded_html_data = letter.Base_convertHtmlToSingleFile(letter_foot, allow_script=True).encode('utf-8')
   pdf_file = letter.Base_cloudoooDocumentConvert(embedded_html_data, "html", "pdf", conversion_kw=dict(
       encoding="utf8",
       margin_top=letter_header_margin_to_top,
@@ -266,8 +266,8 @@ if letter_format == "pdf":
       margin_left=0,
       margin_right=0,
       header_spacing=1,
-      header_html_data=b64encode(header_embedded_html_data),
-      footer_html_data=b64encode(footer_embedded_html_data),
+      header_html_data=b64encode(header_embedded_html_data).decode(),
+      footer_html_data=b64encode(footer_embedded_html_data).decode(),
     )
   )
 
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsReport.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsReport.py
index a4f8a788619a8f19ad7946f255347115dda77945..99513c3ec94cacb4b99a443981fc92d824fbdaa6 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsReport.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Base_viewAsReport.py
@@ -269,10 +269,10 @@ if doc_format == "pdf":
     margin_bottom=20,
     toc=False,
     before_toc_data_list=before_toc_data_list,
-    xsl_style_sheet_data=b64encode(xsl_style_sheet_data),
-    header_html_data=b64encode(header_embedded_html_data),
+    xsl_style_sheet_data=b64encode(xsl_style_sheet_data).decode(),
+    header_html_data=b64encode(header_embedded_html_data).decode(),
     header_spacing=10,
-    footer_html_data=b64encode(footer_embedded_html_data),
+    footer_html_data=b64encode(footer_embedded_html_data).decode(),
     footer_spacing=3,
   )
   default_conversion_kw.update(conversion_dict)
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Presentation_viewAsSlideshow.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Presentation_viewAsSlideshow.py
index 334318af745cae1131ed109deff32990f9c77d36..783a56dc7d5dd9f16f581fb4befd0a1ab6f07eb4 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Presentation_viewAsSlideshow.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/Presentation_viewAsSlideshow.py
@@ -11,6 +11,8 @@ Try to convert old OpenOffice presentations into slideshows
 # ------------------------------------------------------------------------------
 
 import re
+from io import BytesIO
+from zipfile import ZipFile
 
 blank = ''
 flags = re.MULTILINE|re.DOTALL|re.IGNORECASE
@@ -18,8 +20,21 @@ flags = re.MULTILINE|re.DOTALL|re.IGNORECASE
 def getHeaderSlideTitle(my_doc):
   return '<h1>' + my_doc.getTitle() + '</h1>'
 
-def getSlideList(content):
-  return re.findall(r'<html>(.*?)</html>', content, flags=flags)
+def getSlideList(zip_content):
+  slide_list = []
+  with ZipFile(BytesIO(zip_content)) as zf:
+    for name in sorted(
+        zf.namelist(),
+        # iterate in order: 'tmpczlzod7e.impr.html', 'img1.html', 'text1.html', 'img2.html', 'text2.html'
+        key=lambda name: (
+          not name.endswith('impr.html'),
+          'img' not in name,
+          name.replace('img', '').replace('text', ''))):
+      if name.endswith('.html'):
+        slide_list.extend(
+          re.findall(r'<html>(.*?)</html>', zf.read(name).decode('utf-8'), flags=flags)
+        )
+  return slide_list
 
 def getKey(item):
   return int(item[0])
@@ -29,7 +44,11 @@ if context.getPortalType() in ["Presentation"]:
   portal = context.getPortalObject()
   mimetype = 'text/html'
   content_type = context.getContentType()
-  raw_data = portal.portal_transforms.convertToData(mimetype, bytes(context.getData() or b""), context=context, mimetype=content_type)
+  raw_data = portal.portal_transforms.convertToData(
+    mimetype,
+    bytes(context.getData() or b""),
+    context=context,
+    mimetype=content_type)
   if raw_data is None:
     raise ValueError("Failed to convert to %r" % mimetype)
   if context.REQUEST is not None:
@@ -38,6 +57,8 @@ if context.getPortalType() in ["Presentation"]:
   # get a list of slides
   content = getSlideList(raw_data)
 
+  # ( comment below might be obsolete, this was before fixing a bug that we iterated
+  #   directly in the binary data from .zip raw content, which was somehow OK on python2 )
   # every slide is in the raw_data twice, once with the title and image as text,
   # once with the slidecontent without title. All slides are mixed randomly, so
   # we need to find out which slide contains what and then put them in their
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_createTableOfContent.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_createTableOfContent.py
index 2ef23f536e6a4d60c3d83bd449b84436f648e55a..707075bd5f60e6167334acdf747a87295c023f96 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_createTableOfContent.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_createTableOfContent.py
@@ -15,7 +15,7 @@ import re
 from Products.PythonScripts.standard import html_quote
 
 blank = ""
-header_current = 1
+header_current = '0'
 header_initial = None
 table_of_content = blank
 index = 0
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_embedReportDocumentList.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_embedReportDocumentList.py
index 90c59384175ef7c0988dfb5a046e507b9e6f699d..bef82cb8d61abcba906220e937f29fc50855bf06 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_embedReportDocumentList.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_embedReportDocumentList.py
@@ -10,6 +10,7 @@ Insert reports linked to in a document (including backcompat handling)
 # doc_format                 output format being generated
 
 import re
+import six
 
 document = context
 
@@ -28,10 +29,14 @@ def getReportViaFancyName(my_report_name, follow_up):
   if method_call is not None:
     # extra curl: Coverage report requires parameter details (1|0)
     if coverage_name:
-      return method_call(display_comment=True)[0].encode(encoding='UTF-8')
-    if detail_name:
-      return method_call(format='detailed',display_detail = 1)[0].encode(encoding='UTF-8')
-    return method_call(display_comment=True)[0].encode(encoding='UTF-8')
+      result = method_call(display_comment=True)[0]
+    elif detail_name:
+      result = method_call(format='detailed',display_detail = 1)[0]
+    else:
+      result = method_call(display_comment=True)[0]
+    if six.PY2:
+      result = result.encode(encoding='UTF-8')
+    return result
 
 if doc_content.find('${WebPage_') != -1:
   document_required_follow_up_list = [x.getObject() for x in document.portal_catalog(
@@ -82,8 +87,10 @@ for link in re.findall('([^[]<a.*?</a>[^]])', doc_content):
           if target_context is not None:
             target_caller = getattr(target_context, report_name, None)
             if target_caller is not None:
-              substitution_content = target_caller(**link_param_dict)
+              substitution_content = target_caller(**link_param_dict)[0]
+              if six.PY2:
+                substitution_content = substitution_content.encode("utf-8")
               # Note: switched to report returning a tuple with (content, header-title, header-subtitle)
-              doc_content = doc_content.replace(link, substitution_content[0].encode("utf-8").strip())
+              doc_content = doc_content.replace(link, substitution_content.strip())
 
 return doc_content
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsBook.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsBook.py
index d9f05f08aa91d6c3ac8cbf94d1e0212562b6ad39..21e8a0f0e359b5756b3b6397fb9d7177aefb4ba7 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsBook.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsBook.py
@@ -33,6 +33,7 @@ MAIN FILE: generate book in different output formats
 # display_svg                           format for svg images (svg, png*)
 
 import re
+import six
 
 from Products.PythonScripts.standard import html_quote
 from base64 import b64encode
@@ -83,8 +84,7 @@ book_version = html_quote(override_document_version) if override_document_versio
 book_description = html_quote(override_document_description) if override_document_description else book.getDescription()
 book_title = html_quote(override_document_title) if override_document_title else book.getTitle()
 
-# unicode
-if isinstance(book_content, unicode):
+if six.PY2 and isinstance(book_content, unicode):
   book_content = book_content.encode("UTF-8")
 
 # backcompat
@@ -197,7 +197,9 @@ if book_include_reference_table:
   #else:
   #  book_content = book_content.replace("${WebPage_insertTableOfReferences}", book_references.encode('UTF-8').strip())
   book_references = book.Base_unescape(book_references)
-  book_content = book_content.replace("${WebPage_insertTableOfReferences}", book_references.encode('UTF-8').strip())
+  if six.PY2:
+    book_references = book_references.encode('utf-8')
+  book_content = book_content.replace("${WebPage_insertTableOfReferences}", book_references.strip())
 else:
   book_content = book_content.replace("${WebPage_insertTableOfReferences}", blank)
 
@@ -209,7 +211,7 @@ if book_include_content_table:
     book_table_of_content = book.WebPage_createBookXslTableOfContent(
       book_toc_title=book_translated_toc_title,
       margin_15mm = margin_15mm
-    ).encode('UTF-8').strip()
+    ).strip()
   elif book_format == "html":
     book_content, book_table_of_content = book.WebPage_createTableOfContent(
       doc_content=book_content,
@@ -357,22 +359,22 @@ elif book_format == "pdf":
   )
 
   # ================ encode and build cloudoo elements =========================
-  header_embedded_html_data = book.Base_convertHtmlToSingleFile(book_head, allow_script=True)
+  header_embedded_html_data = book.Base_convertHtmlToSingleFile(book_head, allow_script=True).encode('utf-8')
   before_toc_data_list = [
-    b64encode(book.Base_convertHtmlToSingleFile(book_cover, allow_script=True)),
+    b64encode(book.Base_convertHtmlToSingleFile(book_cover, allow_script=True).encode('utf-8')).decode(),
   ]
   after_toc_data_list = []
   if book_include_history_table:
     before_toc_data_list.append(
-      b64encode(book.Base_convertHtmlToSingleFile(book_history, allow_script=True))
+      b64encode(book.Base_convertHtmlToSingleFile(book_history, allow_script=True).encode('utf-8')).decode()
     )
   #if book_include_reference_table:
   #  after_toc_data_list.append(
-  #    b64encode(book.Base_convertHtmlToSingleFile(book_references, allow_script=True))
+  #    b64encode(book.Base_convertHtmlToSingleFile(book_references, allow_script=True).encode('utf-8')).decode()
   #  )
-  xsl_style_sheet_data = book_table_of_content
-  embedded_html_data = book.Base_convertHtmlToSingleFile(book_content, allow_script=True)
-  footer_embedded_html_data = book.Base_convertHtmlToSingleFile(book_foot, allow_script=True)
+  xsl_style_sheet_data = book_table_of_content.encode('utf-8')
+  embedded_html_data = book.Base_convertHtmlToSingleFile(book_content, allow_script=True).encode('utf-8')
+  footer_embedded_html_data = book.Base_convertHtmlToSingleFile(book_foot, allow_script=True).encode('utf-8')
   if margin_15mm:
     margin_top = 50
     margin_bottom = 25
@@ -385,11 +387,11 @@ elif book_format == "pdf":
     margin_bottom=margin_bottom,
     toc=True if book_include_content_table else False,
     before_toc_data_list=before_toc_data_list,
-    xsl_style_sheet_data=b64encode(xsl_style_sheet_data),
+    xsl_style_sheet_data=b64encode(xsl_style_sheet_data).decode(),
     after_toc_data_list=after_toc_data_list,
-    header_html_data=b64encode(header_embedded_html_data),
+    header_html_data=b64encode(header_embedded_html_data).decode(),
     header_spacing=10,
-    footer_html_data=b64encode(footer_embedded_html_data),
+    footer_html_data=b64encode(footer_embedded_html_data).decode(),
     footer_spacing=3,
     )
   )
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsContract.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsContract.py
index 5f540681fd18a378e9e87dfea52ee472e84f72f0..9da25db1960c1558d28c7324eba2d174cca71d4b 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsContract.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsContract.py
@@ -1,8 +1,9 @@
 import re
+import six
 
 from base64 import b64encode
 
-blank = ''
+blank = b''
 pref = context.getPortalObject().portal_preferences
 
 contract_format = kw.get('format') or 'html'
@@ -35,7 +36,7 @@ contract_version = context.getVersion() or "001"
 contract_description = context.getDescription()
 contract_title = context.getTitle()
 
-if isinstance(contract_content, unicode):
+if six.PY2 and isinstance(contract_content, unicode):
   contract_content = contract_content.encode("UTF-8")
 
 contract_history_section_list = re.findall('<section.+?>.+?</section>', contract_content, re.S)
@@ -289,22 +290,22 @@ elif contract_format == "pdf":
   )
 
   # ================ encode and build cloudoo elements =========================
-  header_embedded_html_data = context.Base_convertHtmlToSingleFile(contract_head, allow_script=True)
+  header_embedded_html_data = context.Base_convertHtmlToSingleFile(contract_head, allow_script=True).encode('utf-8')
   before_toc_data_list = [
-    b64encode(context.Base_convertHtmlToSingleFile(contract_cover, allow_script=True)),
+    b64encode(context.Base_convertHtmlToSingleFile(contract_cover, allow_script=True).encode('utf-8')).decode(),
   ]
   after_toc_data_list = []
   if contract_include_history_table:
     before_toc_data_list.append(
-      b64encode(context.Base_convertHtmlToSingleFile(contract_history, allow_script=True))
+      b64encode(context.Base_convertHtmlToSingleFile(contract_history, allow_script=True).encode('utf-8')).decode()
     )
   #if contract_include_reference_table:
   #  after_toc_data_list.append(
-  #    b64encode(context.Base_convertHtmlToSingleFile(contract_references, allow_script=True))
+  #    b64encode(context.Base_convertHtmlToSingleFile(contract_references, allow_script=True)).decode()
   #  )
   xsl_style_sheet_data = contract_table_of_content
-  embedded_html_data = context.Base_convertHtmlToSingleFile(contract_content, allow_script=True)
-  footer_embedded_html_data = context.Base_convertHtmlToSingleFile(contract_foot, allow_script=True)
+  embedded_html_data = context.Base_convertHtmlToSingleFile(contract_content, allow_script=True).encode('utf-8')
+  footer_embedded_html_data = context.Base_convertHtmlToSingleFile(contract_foot, allow_script=True).encode('utf-8')
   margin_top = 40
   margin_bottom = 20
   pdf_file = context.Base_cloudoooDocumentConvert(embedded_html_data, "html", "pdf", conversion_kw=dict(
@@ -313,11 +314,11 @@ elif contract_format == "pdf":
     margin_bottom=margin_bottom,
     toc=True if contract_include_content_table else False,
     before_toc_data_list=before_toc_data_list,
-    xsl_style_sheet_data=b64encode(xsl_style_sheet_data),
+    xsl_style_sheet_data=b64encode(xsl_style_sheet_data).decode(),
     after_toc_data_list=after_toc_data_list,
-    header_html_data=b64encode(header_embedded_html_data),
+    header_html_data=b64encode(header_embedded_html_data).decode(),
     header_spacing=10,
-    footer_html_data=b64encode(footer_embedded_html_data),
+    footer_html_data=b64encode(footer_embedded_html_data).decode(),
     footer_spacing=3,
     )
   )
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsLeaflet.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsLeaflet.py
index c6c23b0290351dc15487fb092826b8d5025afdc9..13a2240cc475476ebea53f4b3c6f8757d53e70c1 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsLeaflet.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsLeaflet.py
@@ -22,6 +22,7 @@ MAIN FILE: render two pager in different output formats
 # document_save:            save file in document module (default None)
 
 import re
+import six
 
 from Products.PythonScripts.standard import html_quote
 from base64 import b64encode
@@ -146,10 +147,11 @@ if leaflet_display_side:
   )
   #leaflet_content = leaflet_legalese.decode() + leaflet_content.decode()
 
-  if isinstance(leaflet_legalese, unicode):
-    leaflet_legalese = leaflet_legalese.encode("UTF-8")
-  if isinstance(leaflet_content, unicode):
-    leaflet_content = leaflet_content.encode("UTF-8")
+  if six.PY2:
+    if isinstance(leaflet_legalese, unicode):
+      leaflet_legalese = leaflet_legalese.encode("UTF-8")
+    if isinstance(leaflet_content, unicode):
+      leaflet_content = leaflet_content.encode("UTF-8")
 
   leaflet_content = leaflet_legalese + leaflet_content
 
@@ -255,9 +257,9 @@ if leaflet_format == "pdf":
   )
 
   # ================ encode and build cloudoo elements =========================
-  embedded_html_data = leaflet.Base_convertHtmlToSingleFile(leaflet_content, allow_script=True)
-  header_embedded_html_data = leaflet.Base_convertHtmlToSingleFile(leaflet_head, allow_script=True)
-  footer_embedded_html_data = leaflet.Base_convertHtmlToSingleFile(leaflet_foot, allow_script=True)
+  embedded_html_data = leaflet.Base_convertHtmlToSingleFile(leaflet_content, allow_script=True).encode('utf-8')
+  header_embedded_html_data = leaflet.Base_convertHtmlToSingleFile(leaflet_head, allow_script=True).encode('utf-8')
+  footer_embedded_html_data = leaflet.Base_convertHtmlToSingleFile(leaflet_foot, allow_script=True).encode('utf-8')
   pdf_file = leaflet.Base_cloudoooDocumentConvert(embedded_html_data, "html", "pdf", conversion_kw=dict(
       encoding="utf8",
       orientation="portrait",
@@ -265,9 +267,9 @@ if leaflet_format == "pdf":
       margin_bottom=20,
       margin_left=0,
       margin_right=0,
-      header_html_data=b64encode(header_embedded_html_data),
+      header_html_data=b64encode(header_embedded_html_data).decode(),
       header_spacing=10,
-      footer_html_data=b64encode(footer_embedded_html_data),
+      footer_html_data=b64encode(footer_embedded_html_data).decode(),
       footer_spacing=3
     )
   )
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsRelease.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsRelease.py
index 117b353543a7c2e9d07e93fdd282b351c2195bab..cae8dd627e8b89ed5c1b928938ba576c9c76b7e6 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsRelease.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsRelease.py
@@ -21,6 +21,7 @@ MAIN FILE: render press release in different output formats
 # document_save:            save file in document module (default None)
 
 import re
+import six
 from base64 import b64encode
 
 blank = ''
@@ -137,10 +138,11 @@ if release_display_about:
     release_relative_url=release_relative_url,
   )
   #release_content = release_content.decode() + release_about.decode()
-  if isinstance(release_content, unicode):
-    release_content = release_content.encode("UTF-8")
-  if isinstance(release_about, unicode):
-    release_about = release_about.encode("UTF-8")
+  if six.PY2:
+    if isinstance(release_content, unicode):
+      release_content = release_content.encode("UTF-8")
+    if isinstance(release_about, unicode):
+      release_about = release_about.encode("UTF-8")
 
   release_content = release_content + release_about
 
@@ -226,9 +228,9 @@ if release_format == "pdf":
   )
 
   # ================ encode and build cloudoo elements =========================
-  embedded_html_data = release.Base_convertHtmlToSingleFile(release_content, allow_script=True)
-  header_embedded_html_data = release.Base_convertHtmlToSingleFile(release_head, allow_script=True)
-  footer_embedded_html_data = release.Base_convertHtmlToSingleFile(release_foot, allow_script=True)
+  embedded_html_data = release.Base_convertHtmlToSingleFile(release_content, allow_script=True).encode('utf-8')
+  header_embedded_html_data = release.Base_convertHtmlToSingleFile(release_head, allow_script=True).encode('utf-8')
+  footer_embedded_html_data = release.Base_convertHtmlToSingleFile(release_foot, allow_script=True).encode('utf-8')
   pdf_file = release.Base_cloudoooDocumentConvert(embedded_html_data, "html", "pdf", conversion_kw=dict(
       encoding="utf8",
       orientation="portrait",
@@ -236,9 +238,9 @@ if release_format == "pdf":
       margin_bottom=20,
       margin_left=0,
       margin_right=0,
-      header_html_data=b64encode(header_embedded_html_data),
+      header_html_data=b64encode(header_embedded_html_data).decode(),
       header_spacing=10,
-      footer_html_data=b64encode(footer_embedded_html_data),
+      footer_html_data=b64encode(footer_embedded_html_data).decode(),
       footer_spacing=3
     )
   )
diff --git a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsSlideshow.py b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsSlideshow.py
index 339c5cf33150f6c67b8375ff399a2da25ae17bcf..800718c7f6915f7ed81c4dc102c399f09d7386a9 100644
--- a/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsSlideshow.py
+++ b/bt5/erp5_corporate_identity/SkinTemplateItem/portal_skins/erp5_corporate_identity/WebPage_viewAsSlideshow.py
@@ -24,6 +24,7 @@ MAIN FILE: generate presentation in different output formats
 # remote_content:           convert legacy odp, sxi formats (not active)
 
 import re
+import six
 
 from Products.PythonScripts.standard import html_quote
 from base64 import b64encode
@@ -420,25 +421,25 @@ if doc_format == "pdf" or doc_format == "mhtml":
   )
 
   # ================ encode and build cloudoo elements =========================
-  footer_embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_footer, allow_script=True)
-  #embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_content, allow_script=True)
+  footer_embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_footer, allow_script=True).encode('utf-8')
+  #embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_content, allow_script=True).encode('utf-8')
+  cover = doc.Base_convertHtmlToSingleFile(doc_slideshow_cover, allow_script=True).encode('utf-8')
   before_body_data_list = [
-    b64encode(doc.Base_convertHtmlToSingleFile(doc_slideshow_cover, allow_script=True)),
+    b64encode(cover).decode(),
   ]
   if doc_format == "mhtml":
     context.REQUEST.RESPONSE.setHeader("Content-Type", "text/html;")
     return doc.Base_convertHtmlToSingleFile(doc_slideshow_cover, allow_script=True)
   if doc_display_notes:
     #after_body_data_list = [
-    #  b64encode(doc.Base_convertHtmlToSingleFile(doc_slideshow_notes, allow_script=True)),
+    #  b64encode(doc.Base_convertHtmlToSingleFile(doc_slideshow_notes, allow_script=True).encode('utf-8')).decode(),
     #]
-    embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_notes, allow_script=True)
+    embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_notes, allow_script=True).encode('utf-8')
     after_body_data_list = []
   else:
-    embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_content, allow_script=True)
+    embedded_html_data = doc.Base_convertHtmlToSingleFile(doc_slideshow_content, allow_script=True).encode('utf-8')
     after_body_data_list = []
     #after_body_data_list = []
-
   pdf_file = doc.Base_cloudoooDocumentConvert(embedded_html_data, "html", "pdf", conversion_kw=dict(
       encoding="utf8",
       orientation= "portrait" if doc_display_notes else "landscape",
@@ -447,7 +448,7 @@ if doc_format == "pdf" or doc_format == "mhtml":
       before_body_data_list=before_body_data_list,
       after_body_data_list=after_body_data_list,
       header_spacing=10,
-      footer_html_data=b64encode(footer_embedded_html_data),
+      footer_html_data=b64encode(footer_embedded_html_data).decode(),
       footer_spacing=3
     )
   )