diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py
--- a/rhodecode/lib/utils.py
+++ b/rhodecode/lib/utils.py
@@ -859,78 +859,6 @@ class BasePasterCommand(Command):
         initialize_database(config)
 
 
-class PartialRenderer(object):
-    """
-    Partial renderer used to render chunks of html used in datagrids
-    use like::
-
-        _render = PartialRenderer('data_table/_dt_elements.mako')
-        _render('quick_menu', args, kwargs)
-        PartialRenderer.h,
-                        c,
-                        _,
-                        ungettext
-        are the template stuff initialized inside and can be re-used later
-
-    :param tmpl_name: template path relate to /templates/ dir
-    """
-
-    def __init__(self, tmpl_name):
-        import rhodecode
-        from pylons import request, tmpl_context as c
-        from pylons.i18n.translation import _, ungettext
-        from rhodecode.lib import helpers as h
-
-        self.tmpl_name = tmpl_name
-        self.rhodecode = rhodecode
-        self.c = c
-        self._ = _
-        self.ungettext = ungettext
-        self.h = h
-        self.request = request
-
-    def _mako_lookup(self):
-        _tmpl_lookup = self.rhodecode.CONFIG['pylons.app_globals'].mako_lookup
-        return _tmpl_lookup.get_template(self.tmpl_name)
-
-    def _update_kwargs_for_render(self, kwargs):
-        """
-        Inject params required for Mako rendering
-        """
-        _kwargs = {
-            '_': self._,
-            'h': self.h,
-            'c': self.c,
-            'request': self.request,
-            '_ungettext': self.ungettext,
-        }
-        _kwargs.update(kwargs)
-        return _kwargs
-
-    def _render_with_exc(self, render_func, args, kwargs):
-        try:
-            return render_func.render(*args, **kwargs)
-        except:
-            log.error(exceptions.text_error_template().render())
-            raise
-
-    def _get_template(self, template_obj, def_name):
-        if def_name:
-            tmpl = template_obj.get_def(def_name)
-        else:
-            tmpl = template_obj
-        return tmpl
-
-    def render(self, def_name, *args, **kwargs):
-        lookup_obj = self._mako_lookup()
-        tmpl = self._get_template(lookup_obj, def_name=def_name)
-        kwargs = self._update_kwargs_for_render(kwargs)
-        return self._render_with_exc(tmpl, args, kwargs)
-
-    def __call__(self, tmpl, *args, **kwargs):
-        return self.render(tmpl, *args, **kwargs)
-
-
 def password_changed(auth_user, session):
     # Never report password change in case of default user or anonymous user.
     if auth_user.username == User.DEFAULT_USER or auth_user.user_id is None:
diff --git a/rhodecode/model/notification.py b/rhodecode/model/notification.py
--- a/rhodecode/model/notification.py
+++ b/rhodecode/model/notification.py
@@ -26,11 +26,11 @@ Model for notifications
 import logging
 import traceback
 
+from pyramid.threadlocal import get_current_request
 from sqlalchemy.sql.expression import false, true
 
 import rhodecode
 from rhodecode.lib import helpers as h
-from rhodecode.lib.utils import PartialRenderer
 from rhodecode.model import BaseModel
 from rhodecode.model.db import Notification, User, UserNotification
 from rhodecode.model.meta import Session
@@ -343,9 +343,9 @@ class EmailNotificationModel(BaseModel):
     def whitespace_filter(self, text):
         return text.replace('\n', '').replace('\t', '')
 
-    def get_renderer(self, type_):
+    def get_renderer(self, type_, request):
         template_name = self.email_types[type_]
-        return PartialRenderer(template_name)
+        return request.get_partial_renderer(template_name)
 
     def render_email(self, type_, **kwargs):
         """
@@ -354,8 +354,8 @@ class EmailNotificationModel(BaseModel):
         """
         # translator and helpers inject
         _kwargs = self._update_kwargs_for_render(kwargs)
-
-        email_template = self.get_renderer(type_)
+        request = get_current_request()
+        email_template = self.get_renderer(type_, request=request)
 
         subject = email_template.render('subject', **_kwargs)
 
diff --git a/rhodecode/tests/lib/test_mako_emails.py b/rhodecode/tests/lib/test_mako_emails.py
--- a/rhodecode/tests/lib/test_mako_emails.py
+++ b/rhodecode/tests/lib/test_mako_emails.py
@@ -1,16 +1,35 @@
 import collections
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010-2017 RhodeCode GmbH
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License, version 3
+# (only), as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This program is dual-licensed. If you wish to learn more about the
+# RhodeCode Enterprise Edition, including its added features, Support services,
+# and proprietary license terms, please see https://rhodecode.com/licenses/
 
 import pytest
 
-from rhodecode.lib.utils import PartialRenderer
+from rhodecode.lib.partial_renderer import PyramidPartialRenderer
 from rhodecode.lib.utils2 import AttributeDict
 from rhodecode.model.notification import EmailNotificationModel
 
 
-def test_get_template_obj(app):
+def test_get_template_obj(app, request_stub):
     template = EmailNotificationModel().get_renderer(
-        EmailNotificationModel.TYPE_TEST)
-    assert isinstance(template, PartialRenderer)
+        EmailNotificationModel.TYPE_TEST, request_stub)
+    assert isinstance(template, PyramidPartialRenderer)
 
 
 def test_render_email(app, http_host_only_stub):