diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py
index 1196d12d44f934f3ccaddb215a84cd7a1692e01e..c95d86509fdd97066021983fef7dad3fbf4ec68e 100644
--- a/addons/http_routing/models/ir_http.py
+++ b/addons/http_routing/models/ir_http.py
@@ -29,6 +29,18 @@ odoo._geoip_resolver = None
 # Slug API
 # ------------------------------------------------------------
 
+def _guess_mimetype(ext=False, default='text/html'):
+    exts = {
+        '.css': 'text/css',
+        '.less': 'text/less',
+        '.js': 'text/javascript',
+        '.xml': 'text/xml',
+        '.csv': 'text/csv',
+        '.html': 'text/html',
+    }
+    return ext is not False and exts.get(ext, default) or exts
+
+
 def slugify_one(s, max_length=None):
     """ Transform a string to a slug that can be used in a url path.
         This method will first try to do the job with python-slugify if present.
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index c538fde2f855dedc3993a707ee48ee8202f5de2c..c8c80c433c1d4b1bc2e2fc27d6acbe526d765c96 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -17,8 +17,7 @@ import odoo
 from odoo import http, models, fields, _
 from odoo.http import request
 from odoo.tools import pycompat, OrderedSet
-from odoo.addons.http_routing.models.ir_http import slug
-from odoo.addons.website.models.ir_http import _guess_mimetype
+from odoo.addons.http_routing.models.ir_http import slug, _guess_mimetype
 from odoo.addons.web.controllers.main import WebClient, Binary, Home
 from odoo.addons.portal.controllers.portal import pager as portal_pager
 
@@ -249,9 +248,13 @@ class Website(Home):
     def pagenew(self, path="", noredirect=False, add_menu=False, template=False):
         # for supported mimetype, get correct default template
         _, ext = os.path.splitext(path)
-        mimetype_template = _guess_mimetype(ext)[1]
-        if not template:
-            template = mimetype_template
+        View = request.env['ir.ui.view']
+        ext_special_case = ext and ext in _guess_mimetype() and ext != '.html'
+
+        if not template and ext_special_case:
+            default_templ = 'website.default_%s' % ext.lstrip('.')
+            if request.env.ref(default_templ, False):
+                template = default_templ
 
         template = template and dict(template=template) or {}
         page = request.env['website'].new_page(path, add_menu=add_menu, **template)
@@ -259,7 +262,7 @@ class Website(Home):
         if noredirect:
             return werkzeug.wrappers.Response(url, mimetype='text/plain')
 
-        if ext and ext != '.html': # redirect non html pages to backend to edit
+        if ext_special_case: # redirect non html pages to backend to edit
             return werkzeug.utils.redirect('/web#id=' + str(page.get('view_id')) + '&view_type=form&model=ir.ui.view')
         return werkzeug.utils.redirect(url + "?enable_editor=1")
 
diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py
index 8fbdfd18eae030e2697515081d66ab6e6ba66d39..433fc5e297ae7957acbdf87913db531b90187155 100644
--- a/addons/website/models/ir_http.py
+++ b/addons/website/models/ir_http.py
@@ -19,7 +19,7 @@ from odoo.exceptions import QWebException
 from odoo.tools.safe_eval import safe_eval
 from odoo.osv.expression import FALSE_DOMAIN
 
-from odoo.addons.http_routing.models.ir_http import ModelConverter
+from odoo.addons.http_routing.models.ir_http import ModelConverter, _guess_mimetype
 
 logger = logging.getLogger(__name__)
 
@@ -39,20 +39,6 @@ def sitemap_qs2dom(qs, route, field='name'):
     return dom
 
 
-def _guess_mimetype(ext=False, default=False):
-    exts = {
-        '.css': ['text/css', 'website.default_css'],
-        '.less': ['text/less', 'website.default_less'],
-        '.js': ['text/javascript', 'website.default_javascript'],
-        '.xml': ['text/xml', 'website.default_xml'],
-        '.csv': ['text/csv', 'website.default_csv'],
-        '.html': ['text/html', False],
-    }
-    if not default:
-        default = exts['.html']
-    return ext is not False and exts.get(ext, default) or exts
-
-
 class Http(models.AbstractModel):
     _inherit = 'ir.http'
 
@@ -130,7 +116,7 @@ class Http(models.AbstractModel):
                 # 'path': req_page[1:],
                 'deletable': True,
                 'main_object': mypage,
-            }, mimetype=_guess_mimetype(ext)[0])
+            }, mimetype=_guess_mimetype(ext))
         return False
 
     @classmethod
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 70581a3524e499889a6eedeecee8ee417765aed9..b1c2227d8d3a654d38b6850f3981b2ef891ea453 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -534,7 +534,7 @@
     </t>
 </template>
 
-<template id="default_javascript">
+<template id="default_js">
     <script type="text/javascript">
         if (0 &gt; 1) {
             let it_cant_be = false;