diff --git a/addons/account/views/account_portal_templates.xml b/addons/account/views/account_portal_templates.xml
index 25cd8c84e34750404675f3d9e70c9cfe2367df90..e4705746870ba86efc364a18cb7f1db75490e50f 100644
--- a/addons/account/views/account_portal_templates.xml
+++ b/addons/account/views/account_portal_templates.xml
@@ -108,7 +108,7 @@
                                 <div class="small mb-1"><strong class="text-muted">Salesperson</strong></div>
                                 <div class="row">
                                     <div class="col flex-grow-0 pr-2">
-                                        <img t-if="invoice.invoice_user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(invoice.invoice_user_id.image)" alt="Contact"/>
+                                        <img t-if="invoice.invoice_user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(invoice.invoice_user_id.image_1024)" alt="Contact"/>
                                         <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
                                     </div>
                                     <div class="col pl-0">
diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py
index d033a750ed20b59220f2f7ca0979f47fdb7eccad..cbc347a66757631269c0efd048cadc481e12d97d 100644
--- a/addons/crm/models/crm_lead.py
+++ b/addons/crm/models/crm_lead.py
@@ -532,7 +532,7 @@ class Lead(models.Model):
                     'effect': {
                         'fadeout': 'slow',
                         'message': message,
-                        'img_url': '/web/image/%s/%s/image' % (self.team_id.user_id._name, self.team_id.user_id.id) if self.team_id.user_id.image else '/web/static/src/img/smile.svg',
+                        'img_url': '/web/image/%s/%s/image_1024' % (self.team_id.user_id._name, self.team_id.user_id.id) if self.team_id.user_id.image_1024 else '/web/static/src/img/smile.svg',
                         'type': 'rainbow_man',
                     }
                 }
diff --git a/addons/gamification/data/badge.xml b/addons/gamification/data/badge.xml
index 06476e98066b0ecd2c6a631d7a10393d59f22fbe..696e3fabec709c5d64ffd5bda40502efb8b22b55 100644
--- a/addons/gamification/data/badge.xml
+++ b/addons/gamification/data/badge.xml
@@ -5,21 +5,21 @@
             <field name="name">Good Job</field>
             <field name="description">You did great at your job.</field>
             <field name="rule_auth">everyone</field>
-            <field name="image" type="base64" file="gamification/static/img/badge_good_job-image.png"/>
+            <field name="image_1920" type="base64" file="gamification/static/img/badge_good_job-image.png"/>
         </record>
 
         <record id="badge_problem_solver" model="gamification.badge">
             <field name="name">Problem Solver</field>
             <field name="description">No one can solve challenges like you do.</field>
             <field name="rule_auth">everyone</field>
-            <field name="image" type="base64" file="gamification/static/img/badge_problem_solver-image.png"/>
+            <field name="image_1920" type="base64" file="gamification/static/img/badge_problem_solver-image.png"/>
         </record>
 
         <record id="badge_hidden" model="gamification.badge">
             <field name="name">Hidden</field>
             <field name="description">You have found the hidden badge</field>
             <field name="rule_auth">nobody</field>
-            <field name="image" type="base64" file="gamification/static/img/badge_hidden-image.png"/>
+            <field name="image_1920" type="base64" file="gamification/static/img/badge_hidden-image.png"/>
             <field name="active" eval="False" />
         </record>
 
@@ -29,7 +29,7 @@
             <field name="rule_auth">everyone</field>
             <field name="rule_max">True</field>
             <field name="rule_max_number">2</field>
-            <field name="image" type="base64" file="gamification/static/img/badge_idea-image.png"/>
+            <field name="image_1920" type="base64" file="gamification/static/img/badge_idea-image.png"/>
         </record>
 
         <record id="email_template_badge_received" model="mail.template">
@@ -71,7 +71,7 @@
                             <table cellspacing="0" cellpadding="0" border="0" style="width: 560px; margin-top: 5px;">
                             <tbody><tr>
                                 <td valign="center">
-                                    <img src="/web/image/gamification.badge/${object.badge_id.id}/image/80x80" style="padding: 0px; margin: 0px; height: auto; width: 80px;" alt="${user.company_id.name}"/>
+                                    <img src="/web/image/gamification.badge/${object.badge_id.id}/image_128/80x80" style="padding: 0px; margin: 0px; height: auto; width: 80px;" alt="${user.company_id.name}"/>
                                 </td>
                                 <td valign="center">
                                     <cite>${object.badge_id.description}</cite>
diff --git a/addons/gamification/data/gamification_karma_rank_data.xml b/addons/gamification/data/gamification_karma_rank_data.xml
index 5eba07b1a3d75788e211eb888bf7f8ac88b2a30c..e0ef1320a4eedf356d475b64758d56860b17d4c8 100644
--- a/addons/gamification/data/gamification_karma_rank_data.xml
+++ b/addons/gamification/data/gamification_karma_rank_data.xml
@@ -19,7 +19,7 @@
             </div>
         </field>
         <field name="karma_min">1</field>
-        <field name="image" type="base64" file="gamification/static/img/rank_newbie_badge.svg"/>
+        <field name="image_1920" type="base64" file="gamification/static/img/rank_newbie_badge.svg"/>
     </record>
 
     <record id="rank_student" model="gamification.karma.rank">
@@ -32,7 +32,7 @@
             </div>
         </field>
         <field name="karma_min">100</field>
-        <field name="image" type="base64" file="gamification/static/img/rank_student_badge.svg"/>
+        <field name="image_1920" type="base64" file="gamification/static/img/rank_student_badge.svg"/>
     </record>
 
     <record id="rank_bachelor" model="gamification.karma.rank">
@@ -45,7 +45,7 @@
             </div>
         </field>
         <field name="karma_min">500</field>
-        <field name="image" type="base64" file="gamification/static/img/rank_bachelor_badge.svg"/>
+        <field name="image_1920" type="base64" file="gamification/static/img/rank_bachelor_badge.svg"/>
     </record>
 
     <record id="rank_master" model="gamification.karma.rank">
@@ -58,7 +58,7 @@
             </div>
         </field>
         <field name="karma_min">2000</field>
-        <field name="image" type="base64" file="gamification/static/img/rank_master_badge.svg"/>
+        <field name="image_1920" type="base64" file="gamification/static/img/rank_master_badge.svg"/>
     </record>
 
     <record id="rank_doctor" model="gamification.karma.rank">
@@ -71,6 +71,6 @@
             </div>
         </field>
         <field name="karma_min">10000</field>
-        <field name="image" type="base64" file="gamification/static/img/rank_doctor_badge.svg"/>
+        <field name="image_1920" type="base64" file="gamification/static/img/rank_doctor_badge.svg"/>
     </record>
 </data></odoo>
diff --git a/addons/gamification/models/badge.py b/addons/gamification/models/badge.py
index afece1a34ce1b824b6cfc88b06fdfea9f4c95cf6..d1ea4c4cc9636bfb6d5b98b94d53c64161e28797 100644
--- a/addons/gamification/models/badge.py
+++ b/addons/gamification/models/badge.py
@@ -4,7 +4,7 @@
 import logging
 from datetime import date
 
-from odoo import api, tools, fields, models, _, exceptions
+from odoo import api, fields, models, _, exceptions
 
 _logger = logging.getLogger(__name__)
 
@@ -65,22 +65,11 @@ class GamificationBadge(models.Model):
 
     _name = 'gamification.badge'
     _description = 'Gamification Badge'
-    _inherit = ['mail.thread']
+    _inherit = ['mail.thread', 'image.mixin']
 
     name = fields.Char('Badge', required=True, translate=True)
     active = fields.Boolean('Active', default=True)
     description = fields.Text('Description', translate=True)
-    image = fields.Binary("Image", help="This field holds the image used for the badge.")
-    image_128 = fields.Binary(
-        "Medium-sized badge image",
-        help="Medium-sized image of the badge. It is automatically "
-             "resized as a 128x128px image, with aspect ratio preserved. "
-             "Use this field in form views or some kanban views.")
-    image_64 = fields.Binary(
-        "Small-sized badge image",
-        help="Small-sized image of the badge. It is automatically "
-             "resized as a 64x64px image, with aspect ratio preserved. "
-             "Use this field anywhere a small image is required.")
     level = fields.Selection([
         ('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')],
         string='Forum Badge Level', default='bronze')
@@ -137,16 +126,6 @@ class GamificationBadge(models.Model):
         "Remaining Sending Allowed", compute='_remaining_sending_calc',
         help="If a maximum is set")
 
-    @api.model_create_multi
-    def create(self, values_list):
-        for vals in values_list:
-            tools.image_resize_images(vals)
-        return super(GamificationBadge, self).create(values_list)
-
-    def write(self, vals):
-        tools.image_resize_images(vals)
-        return super(GamificationBadge, self).write(vals)
-
     @api.depends('owner_ids')
     def _get_owners_info(self):
         """Return:
diff --git a/addons/gamification/models/gamification_karma_rank.py b/addons/gamification/models/gamification_karma_rank.py
index 5958dd3424fe55b6a0c0e23d12e1cf389df2209f..65b0d8d21778c78acd573f9ecb7d3ef248df58d5 100644
--- a/addons/gamification/models/gamification_karma_rank.py
+++ b/addons/gamification/models/gamification_karma_rank.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
-from odoo import api, tools, fields, models, exceptions, http
+from odoo import api, fields, models, exceptions
 from odoo.tools.translate import html_translate
 
 
@@ -24,6 +24,7 @@ class Http(models.AbstractModel):
 class KarmaRank(models.Model):
     _name = 'gamification.karma.rank'
     _description = 'Rank based on karma'
+    _inherit = 'image.mixin'
     _order = 'karma_min'
 
     name = fields.Text(string='Rank Name', translate=True, required=True)
@@ -33,22 +34,9 @@ class KarmaRank(models.Model):
         help="Motivational phrase to reach this rank")
     karma_min = fields.Integer(string='Required Karma', help='Minimum karma needed to reach this rank')
     user_ids = fields.One2many('res.users', 'rank_id', string='Users', help="Users having this rank")
-    image = fields.Binary('Rank Icon')
-    image_128 = fields.Binary(
-        "Medium-sized rank icon",
-        help="Medium-sized icon of the rank. It is automatically "
-             "resized as a 128x128px image, with aspect ratio preserved. "
-             "Use this field in form views or some kanban views.")
-    image_64 = fields.Binary(
-        "Small-sized rank icon",
-        help="Small-sized icon of the rank. It is automatically "
-             "resized as a 64x64px image, with aspect ratio preserved. "
-             "Use this field anywhere a small image is required.")
 
     @api.model_create_multi
     def create(self, values_list):
-        for vals in values_list:
-            tools.image_resize_images(vals)
         res = super(KarmaRank, self).create(values_list)
         users = self.env['res.users'].sudo().search([('karma', '>', 0)])
         users._recompute_rank()
@@ -60,7 +48,6 @@ class KarmaRank(models.Model):
             low = min(vals['karma_min'], self.karma_min)
             high = max(vals['karma_min'], self.karma_min)
 
-        tools.image_resize_images(vals)
         res = super(KarmaRank, self).write(vals)
 
         if 'karma_min' in vals:
diff --git a/addons/gamification/views/badge.xml b/addons/gamification/views/badge.xml
index 9676faff9533400a284b84ff27022a4504ac9e8b..d0980d3e0b7abfa86e2eb27f0d18e6cb6d280fb9 100644
--- a/addons/gamification/views/badge.xml
+++ b/addons/gamification/views/badge.xml
@@ -40,7 +40,7 @@
                 <sheet>
                     <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
                     <div class="oe_button_box" name="button_box"/>
-                    <field name="image" widget='image' class="oe_avatar"/>
+                    <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
                     <div class="oe_title">
                         <label for="name" class="oe_edit_only"/>
                         <h1>
@@ -102,7 +102,6 @@
                 <field name="id"/>
                 <field name="name"/>
                 <field name="description"/>
-                <field name="image"/>
                 <field name="stat_my"/>
                 <field name="stat_count"/>
                 <field name="stat_this_month"/>
@@ -114,7 +113,7 @@
                     <t t-name="kanban-box">
                         <div t-attf-class="o_kanban_gamification oe_kanban_global_click #{record.stat_my.raw_value ? 'oe_kanban_color_5' : 'oe_kanban_color_white'}">
                             <div class="o_kanban_image">
-                                <img t-att-src="kanban_image('gamification.badge', 'image', record.id.raw_value)" t-att-title="record.name.value" t-att-alt="record.name.value"/>
+                                <img t-att-src="kanban_image('gamification.badge', 'image_1024', record.id.raw_value)" t-att-title="record.name.value" t-att-alt="record.name.value"/>
                             </div>
                             <div class="oe_kanban_details">
                                 <strong class="o_kanban_record_title"><field name="name"/></strong>
@@ -168,7 +167,7 @@
                         <div class="oe_kanban_card oe_kanban_global_click oe_kanban_badge oe_kanban_color_white o_kanban_gamification">
                             <div class="o_kanban_content">
                                 <div class="o_kanban_image">
-                                    <a type="open"><img t-att-src="kanban_image('gamification.badge', 'image', record.badge_id.raw_value)" t-att-title="record.badge_name.value" t-att-alt="record.badge_name.value" /></a>
+                                    <a type="open"><img t-att-src="kanban_image('gamification.badge', 'image_1024', record.badge_id.raw_value)" t-att-title="record.badge_name.value" t-att-alt="record.badge_name.value" /></a>
                                 </div>
                                 <div class="oe_kanban_details">
                                     <h4 class="mt0 mb0">
diff --git a/addons/gamification/views/gamification_karma_rank_views.xml b/addons/gamification/views/gamification_karma_rank_views.xml
index f728cff538e85de3d72e371fb3738b81bfd027b4..fc0205794b5d82d17a106071091935fb51168170 100644
--- a/addons/gamification/views/gamification_karma_rank_views.xml
+++ b/addons/gamification/views/gamification_karma_rank_views.xml
@@ -47,7 +47,7 @@
                 <form string="Rank">
                     <sheet>
                         <div class="oe_button_box" name="button_box"/>
-                        <field name="image" widget='image' class="oe_avatar"/>
+                        <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
                         <div class="oe_title">
                             <label for="name" class="oe_edit_only"/>
                             <h1>
diff --git a/addons/google_calendar/static/tests/google_calendar_tests.js b/addons/google_calendar/static/tests/google_calendar_tests.js
index 76aaa65411b2042819569d84c8e6c10a3331c2c9..0470d95d730027abfd147bdc510ac4d0c31e2263 100644
--- a/addons/google_calendar/static/tests/google_calendar_tests.js
+++ b/addons/google_calendar/static/tests/google_calendar_tests.js
@@ -39,7 +39,7 @@ QUnit.module('Google Calendar', {
                     id: {string: "ID", type: "integer"},
                     display_name: {string: "Displayed name", type: "char"},
                     partner_id: {string: "partner", type: "many2one", relation: 'partner'},
-                    image: {string: "image", type: "integer"},
+                    image_1920: {string: "image", type: "integer"},
                 },
                 records: [
                     {id: 4, display_name: "user 4", partner_id: 4},
@@ -49,10 +49,10 @@ QUnit.module('Google Calendar', {
                 fields: {
                     id: {string: "ID", type: "integer"},
                     display_name: {string: "Displayed name", type: "char"},
-                    image: {string: "image", type: "integer"},
+                    image_1920: {string: "image", type: "integer"},
                 },
                 records: [
-                    {id: 4, display_name: "partner 4", image: 'DDD'}
+                    {id: 4, display_name: "partner 4", image_1920: 'DDD'}
                 ]
             },
             filter_partner: {
diff --git a/addons/hr/data/hr_data.xml b/addons/hr/data/hr_data.xml
index 8c70cef3e68f82958e85fe163cf80077284eef79..41e343de6d4e43275ee99e41316774c19d1f9343 100644
--- a/addons/hr/data/hr_data.xml
+++ b/addons/hr/data/hr_data.xml
@@ -15,7 +15,7 @@
             <field name="user_id" ref="base.user_admin"/>
             <field name="address_id" ref="base.partner_admin"/>
             <field name="address_home_id" ref="base.partner_admin"/>
-            <field name="image" eval="obj(ref('base.partner_admin')).image" model="res.partner"/>
+            <field name="image_1920" eval="obj(ref('base.partner_admin')).image_1920" model="res.partner"/>
         </record>
 
         <record id="onboarding_setup_it_materials" model="hr.plan.activity.type">
diff --git a/addons/hr/data/hr_demo.xml b/addons/hr/data/hr_demo.xml
index a713638b1fa7481066ab1d902c4d8867b04d87ab..b6f039b140c9a4b08ea41f7aa85998aa776ed9fa 100644
--- a/addons/hr/data/hr_demo.xml
+++ b/addons/hr/data/hr_demo.xml
@@ -154,7 +154,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(376)-310-7863</field>
           <field name="work_email">ronnie.hart87@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_al-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_al-image.jpg"/>
       </record>
 
       <record id="employee_mit" model="hr.employee">
@@ -168,7 +168,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_phone">(538)-497-4804</field>
           <field name="mobile_phone">(538)-672-3185</field>
           <field name="work_email">anita.oliver32@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_mit-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_mit-image.jpg"/>
       </record>
 
       <record id="employee_niv" model="hr.employee">
@@ -181,7 +181,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(450)-719-4182</field>
           <field name="work_email">sharlene.rhodes49@example.comcom</field>
-          <field name="image" type="base64" file="hr/static/img/employee_niv-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_niv-image.jpg"/>
       </record>
 
       <record id="employee_stw" model="hr.employee">
@@ -194,7 +194,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(332)-775-6660</field>
           <field name="work_email">randall.lewis74@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_stw-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_stw-image.jpg"/>
       </record>
 
       <record id="employee_chs" model="hr.employee">
@@ -207,7 +207,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(157)-363-8229</field>
           <field name="work_email">jennie.fletcher76@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_chs-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_chs-image.jpg"/>
       </record>
 
       <record id="employee_qdp" model="hr.employee">
@@ -221,7 +221,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">+3281813700</field>
           <field name="work_email">gilles@odoo.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_qdp-image.png"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_qdp-image.png"/>
       </record>
 
       <record id="employee_fme" model="hr.employee">
@@ -234,7 +234,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(449)-505-5146</field>
           <field name="work_email">keith.byrd52@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_fme-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_fme-image.jpg"/>
       </record>
 
       <record id="employee_fpi" model="hr.employee">
@@ -247,7 +247,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(203)-276-7903</field>
           <field name="work_email">audrey.peterson25@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_fpi-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_fpi-image.jpg"/>
       </record>
 
       <record id="employee_jth" model="hr.employee">
@@ -260,7 +260,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(663)-707-8451</field>
           <field name="work_email">toni.jimenez23@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_jth-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_jth-image.jpg"/>
       </record>
 
       <record id="employee_ngh" model="hr.employee">
@@ -273,7 +273,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(916)-264-7362</field>
           <field name="work_email">jeffrey.kelly72@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_ngh-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_ngh-image.jpg"/>
       </record>
 
       <record id="employee_vad" model="hr.employee">
@@ -286,7 +286,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(360)-694-7266</field>
           <field name="work_email">tina.williamson98@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_vad-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_vad-image.jpg"/>
       </record>
 
       <record id="employee_han" model="hr.employee">
@@ -297,7 +297,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(350)-912-1201</field>
           <field name="work_email">walter.horton80@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_han-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_han-image.jpg"/>
       </record>
 
       <record id="employee_jve" model="hr.employee">
@@ -308,7 +308,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(114)-262-1607</field>
           <field name="work_email">paul.williams59@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_jve-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_jve-image.jpg"/>
       </record>
 
       <record id="employee_jep" model="hr.employee">
@@ -319,7 +319,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(883)-331-5378</field>
           <field name="work_email">doris.cole31@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_jep-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_jep-image.jpg"/>
       </record>
 
       <record id="employee_jod" model="hr.employee">
@@ -330,7 +330,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(206)-267-3735</field>
           <field name="work_email">jod@odoo.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_jod-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_jod-image.jpg"/>
       </record>
 
       <record id="employee_jog" model="hr.employee">
@@ -341,7 +341,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(754)-532-3841</field>
           <field name="work_email">beth.evans77@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_jog-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_jog-image.jpg"/>
       </record>
 
       <record id="employee_jgo" model="hr.employee">
@@ -352,7 +352,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(944)-518-8232</field>
           <field name="work_email">ernest.reed47@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_jgo-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_jgo-image.jpg"/>
       </record>
 
       <record id="employee_lur" model="hr.employee">
@@ -363,7 +363,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_phone">(644)-169-1352</field>
           <field name="work_email">eli.lambert22@example.com</field>
-          <field name="image" type="base64" file="hr/static/img/employee_lur-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_lur-image.jpg"/>
       </record>
 
       <record id="employee_hne" model="hr.employee">
@@ -374,7 +374,7 @@ If you have development competencies, we can propose you specific traineeships</
           <field name="work_location">Building 1, Second Floor</field>
           <field name="work_email">abigail.peterson39@example.com</field>
           <field name="work_phone">(482)-233-3393</field>
-          <field name="image" type="base64" file="hr/static/img/employee_hne-image.jpg"/>
+          <field name="image_1920" type="base64" file="hr/static/img/employee_hne-image.jpg"/>
       </record>
     </data>
 </odoo>
diff --git a/addons/hr/models/hr_employee.py b/addons/hr/models/hr_employee.py
index b30e8bfd3bf5841c89de27f010ffe761fd033b98..6f28b32b610afb1775fc4cfeb16ee541e9b275d6 100644
--- a/addons/hr/models/hr_employee.py
+++ b/addons/hr/models/hr_employee.py
@@ -8,7 +8,7 @@ import itertools
 from werkzeug import url_encode
 import pytz
 
-from odoo import api, fields, models, tools, _
+from odoo import api, fields, models, _
 from odoo.exceptions import ValidationError, AccessError
 from odoo.modules.module import get_module_resource
 from odoo.addons.resource.models.resource_mixin import timezone_datetime
@@ -25,13 +25,13 @@ class HrEmployeePrivate(models.Model):
     _name = "hr.employee"
     _description = "Employee"
     _order = 'name'
-    _inherit = ['hr.employee.base', 'mail.thread', 'mail.activity.mixin', 'resource.mixin']
+    _inherit = ['hr.employee.base', 'mail.thread', 'mail.activity.mixin', 'resource.mixin', 'image.mixin']
     _mail_post_access = 'read'
 
     @api.model
     def _default_image(self):
         image_path = get_module_resource('hr', 'static/src/img', 'default_image.png')
-        return tools.image_process(base64.b64encode(open(image_path, 'rb').read()), size=(1024, 1024))
+        return base64.b64encode(open(image_path, 'rb').read())
 
     # resource and user
     # required on the resource, make sure required="True" set in the view
@@ -93,13 +93,7 @@ class HrEmployeePrivate(models.Model):
     emergency_phone = fields.Char("Emergency Phone", groups="hr.group_hr_user", tracking=True)
     km_home_work = fields.Integer(string="Km Home-Work", groups="hr.group_hr_user", tracking=True)
 
-    # image: all image fields are base64 encoded and PIL-supported
-    image = fields.Binary(
-        "Photo", default=_default_image)
-    image_128 = fields.Binary(
-        "Medium-sized photo")
-    image_64 = fields.Binary(
-        "Small-sized photo")
+    image_1920 = fields.Image(default=_default_image)
     phone = fields.Char(related='address_home_id.phone', related_sudo=False, string="Private Phone", groups="hr.group_hr_user")
     # employee in company
     parent_id = fields.Many2one('hr.employee', 'Manager')
@@ -232,7 +226,7 @@ class HrEmployeePrivate(models.Model):
 
     def _sync_user(self, user):
         vals = dict(
-            image=user.image,
+            image_1920=user.image_1920,
             work_email=user.email,
         )
         if user.tz:
@@ -245,7 +239,6 @@ class HrEmployeePrivate(models.Model):
             user = self.env['res.users'].browse(vals['user_id'])
             vals.update(self._sync_user(user))
             vals['name'] = vals.get('name', user.name)
-        tools.image_resize_images(vals)
         employee = super(HrEmployeePrivate, self).create(vals)
         url = '/web#%s' % url_encode({'action': 'hr.plan_wizard_action', 'active_id': employee.id, 'active_model': 'hr.employee'})
         employee._message_log(body=_('<b>Congratulations !</b> May I recommand you to setup an <a href="%s">onboarding plan ?</a>') % (url))
@@ -262,7 +255,6 @@ class HrEmployeePrivate(models.Model):
                 self.env['res.partner.bank'].browse(account_id).partner_id = vals['address_home_id']
         if vals.get('user_id'):
             vals.update(self._sync_user(self.env['res.users'].browse(vals['user_id'])))
-        tools.image_resize_images(vals)
         res = super(HrEmployeePrivate, self).write(vals)
         if vals.get('department_id') or vals.get('user_id'):
             department_id = vals['department_id'] if vals.get('department_id') else self[:1].department_id.id
diff --git a/addons/hr/models/hr_employee_public.py b/addons/hr/models/hr_employee_public.py
index 75e72f704dbb3998e7a646fed44b6575d56cdee3..62c221ee472fd5324eef4655be8fb9e899537744 100644
--- a/addons/hr/models/hr_employee_public.py
+++ b/addons/hr/models/hr_employee_public.py
@@ -32,9 +32,12 @@ class HrEmployeePublic(models.Model):
 
     # hr.employee.public specific fields
     child_ids = fields.One2many('hr.employee.public', 'parent_id', string='Direct subordinates', readonly=True)
-    image = fields.Binary("Photo", compute='_compute_image', readonly=True, compute_sudo=True)
-    image_128 = fields.Binary("Medium-sized photo", compute='_compute_image', readonly=True, compute_sudo=True)
-    image_64 = fields.Binary("Small-sized photo", compute='_compute_image', readonly=True, compute_sudo=True)
+    image_1920 = fields.Image("Original Image", compute='_compute_image', compute_sudo=True)
+    image_1024 = fields.Image("Image 1024", compute='_compute_image', compute_sudo=True)
+    image_512 = fields.Image("Image 512", compute='_compute_image', compute_sudo=True)
+    image_256 = fields.Image("Image 256", compute='_compute_image', compute_sudo=True)
+    image_128 = fields.Image("Image 128", compute='_compute_image', compute_sudo=True)
+    image_64 = fields.Image("Image 64", compute='_compute_image', compute_sudo=True)
     parent_id = fields.Many2one('hr.employee.public', 'Manager', readonly=True)
     coach_id = fields.Many2one('hr.employee.public', 'Coach', readonly=True)
 
@@ -42,7 +45,10 @@ class HrEmployeePublic(models.Model):
         for employee in self:
             # We have to be in sudo to have access to the images
             employee_id = self.sudo().env['hr.employee'].browse(employee.id)
-            employee.image = employee_id.image
+            employee.image_1920 = employee_id.image_1920
+            employee.image_1024 = employee_id.image_1024
+            employee.image_512 = employee_id.image_512
+            employee.image_256 = employee_id.image_256
             employee.image_128 = employee_id.image_128
             employee.image_64 = employee_id.image_64
 
diff --git a/addons/hr/models/res_users.py b/addons/hr/models/res_users.py
index d863c41fd64a761e7792616551b94da1f9621275..6b9832bcbecea42f66e50e632e9ef7b3dad35e18 100644
--- a/addons/hr/models/res_users.py
+++ b/addons/hr/models/res_users.py
@@ -157,7 +157,7 @@ class User(models.Model):
         result = super(User, self).write(vals)
 
         employee_values = {}
-        for fname in [f for f in ['name', 'email', 'image', 'tz'] if f in vals]:
+        for fname in [f for f in ['name', 'email', 'image_1920', 'tz'] if f in vals]:
             employee_values[fname] = vals[fname]
         if employee_values:
             if 'email' in employee_values:
diff --git a/addons/hr/report/hr_employee_badge.xml b/addons/hr/report/hr_employee_badge.xml
index 1a5e8fdc6454b05c79ac51bcf810153124fa90dd..f186914ba3d1f823727dcde88c32f6d4f15e9476 100644
--- a/addons/hr/report/hr_employee_badge.xml
+++ b/addons/hr/report/hr_employee_badge.xml
@@ -25,7 +25,7 @@
                                     </tr>
                                     <tr style="height:70%;">
                                         <td align="center" valign="center">
-                                            <img t-if="employee.image" t-att-src="image_data_uri(employee.image)" style="max-height:85pt;max-width:90%" alt="Employee Image"/>
+                                            <img t-if="employee.image_1920" t-att-src="image_data_uri(employee.image_1920)" style="max-height:85pt;max-width:90%" alt="Employee Image"/>
                                         </td>
                                     </tr>
                                 </table>
diff --git a/addons/hr/views/hr_employee_public_views.xml b/addons/hr/views/hr_employee_public_views.xml
index 2fa227dd80aec1ee6e98aee7c37b040303eb2667..d6177dae4138e05bd63b7de8d059c8e9ae2dae1b 100644
--- a/addons/hr/views/hr_employee_public_views.xml
+++ b/addons/hr/views/hr_employee_public_views.xml
@@ -36,7 +36,7 @@
                         <div class="oe_button_box" name="button_box">
                             <!-- Used by other modules-->
                         </div>
-                        <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/>
+                        <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/>
                             <div class="oe_title">
                                 <label for="name" class="oe_edit_only"/>
                                 <h1>
@@ -112,7 +112,7 @@
                         <t t-name="kanban-box">
                         <div class="oe_kanban_global_click o_kanban_record_has_image_fill o_hr_kanban_record">
                             <!-- Medium employee's picture -->
-                            <field name="image" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/>
+                            <field name="image_128" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/>
                             <!-- Employee's picture optimized for mobile -->
                             <field name="image_64" widget="image" class="o_kanban_image d-md-none rounded-circle" options="{'zoom': true, 'background': true, 'preventClicks': false}"/>
 
diff --git a/addons/hr/views/hr_employee_views.xml b/addons/hr/views/hr_employee_views.xml
index 7ea3a15ec90180ee016e7e1e1c4250e37253a134..434afc2ec6fa0fc860b9c71dbcdeb6b7e4e5b55f 100644
--- a/addons/hr/views/hr_employee_views.xml
+++ b/addons/hr/views/hr_employee_views.xml
@@ -74,7 +74,7 @@
                                 </div>
                             </button>
                         </div>
-                        <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/>
+                        <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/>
                         <div class="oe_title">
                             <label for="name" class="oe_edit_only"/>
                             <h1>
@@ -227,7 +227,7 @@
                        <t t-name="kanban-box">
                        <div class="oe_kanban_global_click o_kanban_record_has_image_fill o_hr_kanban_record">
                            <!-- Medium employee's picture -->
-                           <field name="image" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/>
+                           <field name="image_128" widget="image" class="o_kanban_image_fill_left d-none d-md-block" options="{'zoom': true, 'background': true, 'preventClicks': false}"/>
                            <!-- Employee's picture optimized for mobile -->
                            <field name="image_64" widget="image" class="o_kanban_image d-md-none rounded-circle" options="{'zoom': true, 'background': true, 'preventClicks': false}"/>
 
diff --git a/addons/hr/views/res_users.xml b/addons/hr/views/res_users.xml
index e14aec0890c79a98f453ea3fa85ac11f4e405efe..1f618fb776a336f0b6811131e69c28ba7a04a3e0 100644
--- a/addons/hr/views/res_users.xml
+++ b/addons/hr/views/res_users.xml
@@ -14,7 +14,7 @@
             <field name="arch" type="xml">
                 <footer position="replace"/>
                 <h1 position="replace"/>
-                <xpath expr="//field[@name='image']" position="replace"/>
+                <xpath expr="//field[@name='image_1920']" position="replace"/>
                 <xpath expr="//field[@name='email']" position="attributes">
                     <attribute name="invisible">1</attribute>
                 </xpath>
@@ -75,7 +75,7 @@
                                 </div>
                             </button>
                         </div>
-                        <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/>
+                        <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image":"image_128"}'/>
                         <div class="oe_title">
                             <label for="name" class="oe_edit_only"/>
                             <h1>
diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml
index a8e2508c5d017a0aa33e9194a420b7e859136f2e..0afbe3be4db2c6513e9a5aed06921d7413fb0d48 100644
--- a/addons/hr_expense/views/hr_expense_views.xml
+++ b/addons/hr_expense/views/hr_expense_views.xml
@@ -310,7 +310,7 @@
                         <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
                         <field name='product_variant_count' invisible='1'/>
                         <field name="id" invisible="True"/>
-                        <field name="image_128" widget="image" class="oe_avatar"/>
+                        <field name="image_1920" widget="image" class="oe_avatar" options="{'image_preview': 'image_128'}"/>
                         <div class="oe_title">
                             <label class="oe_edit_only" for="name" string="Product Name"/>
                             <h1><field name="name" placeholder="e.g. Lunch"/></h1>
diff --git a/addons/hr_org_chart/static/src/xml/hr_org_chart.xml b/addons/hr_org_chart/static/src/xml/hr_org_chart.xml
index 119aec4fa15f85b96c1f9cb09b2fb966c99359ae..8c5160fc59ca3b8f0f0076d6a537ec63625a107f 100644
--- a/addons/hr_org_chart/static/src/xml/hr_org_chart.xml
+++ b/addons/hr_org_chart/static/src/xml/hr_org_chart.xml
@@ -10,13 +10,13 @@
                 use bg-images to get a clean and centred images -->
             <a t-if="! is_self"
                 class="o_media_object rounded-circle o_employee_redirect"
-                t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image/\')'"
+                t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image_1024/\')'"
                 t-att-alt="employee.name"
                 t-att-data-employee-id="employee.id"
                 t-att-href="employee.link"/>
             <div t-if="is_self"
                 class="o_media_object rounded-circle"
-                t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image/\')'"/>
+                t-att-style="'background-image:url(\'/web/image/hr.employee.public/' + employee.id + '/image_1024/\')'"/>
         </div>
 
         <div class="media-body">
@@ -151,7 +151,7 @@
 
 <t t-name="hr_orgchart_emp_popover_title">
     <div>
-        <span t-att-style='"background-image:url(\"/web/image/hr.employee.public/" + employee.id + "/image/\")"'/>
+        <span t-att-style='"background-image:url(\"/web/image/hr.employee.public/" + employee.id + "/image_1024/\")"'/>
         <a href="#" class="float-right o_employee_redirect" t-att-data-employee-id="employee.id"><i class="fa fa-external-link" role="img" aria-label='Redirect' title="Redirect"></i></a>
         <b><t t-esc="employee.name"/></b>
     </div>
diff --git a/addons/im_livechat/views/im_livechat_channel_views.xml b/addons/im_livechat/views/im_livechat_channel_views.xml
index 3a331f6e762df211ce3b39016f21bb7f1bc48fad..807bc64a7c7f5dcb9a8324c1ec184879acfb7f48 100644
--- a/addons/im_livechat/views/im_livechat_channel_views.xml
+++ b/addons/im_livechat/views/im_livechat_channel_views.xml
@@ -105,7 +105,7 @@
                                             <t t-name="kanban-box">
                                                 <div class="oe_kanban_global_click">
                                                     <div class="o_kanban_image">
-                                                        <img t-att-src="kanban_image('res.users', 'image', record.id.raw_value)" alt="User"/>
+                                                        <img t-att-src="kanban_image('res.users', 'image_1024', record.id.raw_value)" alt="User"/>
                                                     </div>
                                                     <div class="o_kanban_details">
                                                         <h4 class="o_kanban_record_title"><field name="name"/></h4>
diff --git a/addons/lunch/data/lunch_demo.xml b/addons/lunch/data/lunch_demo.xml
index 4fc4ecf2fe3dd9752c803dbea561607fc6583b65..503067967481855531bc83dbb5b5f193027556fb 100644
--- a/addons/lunch/data/lunch_demo.xml
+++ b/addons/lunch/data/lunch_demo.xml
@@ -118,7 +118,7 @@
             <field name="price">7.5</field>
             <field name="supplier_id" ref="supplier_corner"/>
             <field name="description">Beef, Bacon, Salad, Cheddar, Fried Onion, BBQ Sauce</field>
-            <field name="image" type="base64" file="lunch/static/img/bacon_burger.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/bacon_burger.png"/>
             <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/>
         </record>
 
@@ -128,7 +128,7 @@
             <field name="price">7.0</field>
             <field name="supplier_id" ref="supplier_corner"/>
             <field name="description">Beef, Cheddar, Salad, Fried Onions, BBQ Sauce</field>
-            <field name="image" type="base64" file="lunch/static/img/cheeseburger.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/cheeseburger.png"/>
         </record>
 
         <record model="lunch.product" id="product_chicken_curry">
@@ -136,7 +136,7 @@
             <field name="category_id" eval="str(ref('categ_sandwich'))"/>
             <field name="price">3.0</field>
             <field name="supplier_id" ref="supplier_corner"/>
-            <field name="image" type="base64" file="lunch/static/img/chicken_curry.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/chicken_curry.png"/>
         </record>
 
         <record model="lunch.product" id="product_spicy_tuna">
@@ -144,7 +144,7 @@
             <field name="category_id" eval="str(ref('categ_sandwich'))"/>
             <field name="price">3.0</field>
             <field name="supplier_id" ref="supplier_corner"/>
-            <field name="image" type="base64" file="lunch/static/img/chicken_curry.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/chicken_curry.png"/>
         </record>
 
         <record model="lunch.product" id="product_mozzarella">
@@ -153,7 +153,7 @@
             <field name="price">3.9</field>
             <field name="supplier_id" ref="supplier_corner"/>
             <field name="description">Mozzarella, Pesto, Tomatoes</field>
-            <field name="image" type="base64" file="lunch/static/img/mozza.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/mozza.png"/>
         </record>
 
         <record model="lunch.product" id="product_club">
@@ -162,7 +162,7 @@
             <field name="price">3.4</field>
             <field name="supplier_id" ref="supplier_corner"/>
             <field name="description">Ham, Cheese, Vegetables</field>
-            <field name="image" type="base64" file="lunch/static/img/club.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/club.png"/>
         </record>
 
         <record model="lunch.product" id="product_maki">
@@ -171,7 +171,7 @@
             <field name="price">12.0</field>
             <field name="supplier_id" ref="supplier_sushi_shop"/>
             <field name="description">6 Maki Salmon - 6 Maki Tuna - 6 Maki Shrimp/Avocado</field>
-            <field name="image" type="base64" file="lunch/static/img/maki.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/maki.png"/>
             <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/>
         </record>
 
@@ -181,7 +181,7 @@
             <field name="price">13.80</field>
             <field name="supplier_id" ref="supplier_sushi_shop"/>
             <field name="description">4 Sushi Salmon - 6 Maki Salmon - 4 Sashimi Salmon </field>
-            <field name="image" type="base64" file="lunch/static/img/salmon_sushi.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/salmon_sushi.png"/>
             <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/>
         </record>
 
@@ -191,7 +191,7 @@
             <field name="price">14.0</field>
             <field name="supplier_id" ref="supplier_sushi_shop"/>
             <field name="description">1 Avocado - 1 Salmon - 1 Eggs - 1 Tuna</field>
-            <field name="image" type="base64" file="lunch/static/img/temaki.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/temaki.png"/>
             <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/>
         </record>
 
@@ -201,7 +201,7 @@
             <field name="price">9.25</field>
             <field name="supplier_id" ref="supplier_sushi_shop"/>
             <field name="description">2 Tempuras, Cabbages, Onions, Sesame Sauce</field>
-            <field name="image" type="base64" file="lunch/static/img/chirashi.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/chirashi.png"/>
             <field name="new_until" eval="datetime.today() + relativedelta(weeks=1)"/>
         </record>
 
@@ -211,7 +211,7 @@
             <field name="price">3.30</field>
             <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/>
             <field name="description">Cheese, Ham, Salad, Tomatoes, cucumbers, eggs</field>
-            <field name="image" type="base64" file="lunch/static/img/club.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/club.png"/>
         </record>
 
         <record model="lunch.product" id="product_country">
@@ -220,7 +220,7 @@
             <field name="price">3.30</field>
             <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/>
             <field name="description">Brie, Honey, Walnut Kernels</field>
-            <field name="image" type="base64" file="lunch/static/img/brie.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/brie.png"/>
         </record>
 
         <record model="lunch.product" id="product_tuna">
@@ -229,7 +229,7 @@
             <field name="price">2.50</field>
             <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/>
             <field name="description">Tuna, Mayonnaise</field>
-            <field name="image" type="base64" file="lunch/static/img/tuna_sandwich.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/tuna_sandwich.png"/>
         </record>
 
         <record model="lunch.product" id="product_gouda">
@@ -238,7 +238,7 @@
             <field name="price">2.50</field>
             <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/>
             <field name="description"></field>
-            <field name="image" type="base64" file="lunch/static/img/gouda.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/gouda.png"/>
         </record>
 
         <record model="lunch.product" id="product_chicken_curry">
@@ -247,7 +247,7 @@
             <field name="price">2.60</field>
             <field name="supplier_id" eval="str(ref('supplier_coin_gourmand'))"/>
             <field name="description"></field>
-            <field name="image" type="base64" file="lunch/static/img/chicken_curry.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/chicken_curry.png"/>
         </record>
 
         <record model="lunch.product" id="product_margherita">
@@ -256,7 +256,7 @@
             <field name="price">6.90</field>
             <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/>
             <field name="description">Tomatoes, Mozzarella</field>
-            <field name="image" type="base64" file="lunch/static/img/pizza_margherita.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/pizza_margherita.png"/>
         </record>
 
         <record model="lunch.product" id="product_funghi">
@@ -265,7 +265,7 @@
             <field name="price">7.00</field>
             <field name="supplier_id" ref="supplier_pizza_inn"/>
             <field name="description">Tomatoes, Mushrooms, Mozzarella</field>
-            <field name="image" type="base64" file="lunch/static/img/pizza_funghi.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/pizza_funghi.png"/>
         </record>
 
         <record model="lunch.product" id="product_vege">
@@ -274,7 +274,7 @@
             <field name="price">7.00</field>
             <field name="supplier_id" ref="supplier_pizza_inn"/>
             <field name="description">Tomatoes, Mozzarella, Mushrooms, Peppers, Olives</field>
-            <field name="image" type="base64" file="lunch/static/img/pizza_veggie.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/pizza_veggie.png"/>
         </record>
 
         <record model="lunch.product" id="product_italiana">
@@ -283,7 +283,7 @@
             <field name="price">7.40</field>
             <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/>
             <field name="description">Fresh Tomatoes, Basil, Mozzarella</field>
-            <field name="image" type="base64" file="lunch/static/img/italiana.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/italiana.png"/>
         </record>
 
         <record model="lunch.product" id="product_Bolognese">
@@ -292,7 +292,7 @@
             <field name="price">7.70</field>
             <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/>
             <field name="description"></field>
-            <field name="image" type="base64" file="lunch/static/img/pasta_bolognese.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/pasta_bolognese.png"/>
         </record>
 
          <record model="lunch.product" id="product_Napoli">
@@ -301,7 +301,7 @@
             <field name="price">7.70</field>
             <field name="supplier_id" eval="str(ref('supplier_pizza_inn'))"/>
             <field name="description">Tomatoes, Basil</field>
-            <field name="image" type="base64" file="lunch/static/img/napoli.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/napoli.png"/>
         </record>
 
         <record model="lunch.topping" id="product_olives">
@@ -316,7 +316,7 @@
             <field name="price">5.50</field>
             <field name="supplier_id" ref="supplier_pizza_inn"/>
             <field name="description">Tomato sauce, Olive oil, Fresh Tomatoes, Onions, Vegetables, Parmesan</field>
-            <field name="image" type="base64" file="lunch/static/img/4formaggio.png"/>
+            <field name="image_1920" type="base64" file="lunch/static/img/4formaggio.png"/>
         </record>
 
         <record model="lunch.cashmove" id="cashmove_1">
diff --git a/addons/lunch/models/lunch_product.py b/addons/lunch/models/lunch_product.py
index d091b19ea7992f644dc61cf24d08f415834de3f7..3d668857f1c2177b522d1b487be09e87964e0b2b 100644
--- a/addons/lunch/models/lunch_product.py
+++ b/addons/lunch/models/lunch_product.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo import api, fields, models, tools
+from odoo import api, fields, models
 
 from odoo.tools import formatLang
 
@@ -85,6 +85,7 @@ class LunchProduct(models.Model):
     """ Products available to order. A product is linked to a specific vendor. """
     _name = 'lunch.product'
     _description = 'Lunch Product'
+    _inherit = 'image.mixin'
     _order = 'name'
 
     name = fields.Char('Product Name', required=True)
@@ -97,30 +98,5 @@ class LunchProduct(models.Model):
     company_id = fields.Many2one('res.company', related='supplier_id.company_id', store=True)
     currency_id = fields.Many2one('res.currency', related='company_id.currency_id')
 
-    # image: all image fields are base64 encoded and PIL-supported
-    image = fields.Binary(
-        "Image",
-        help="This field holds the image used as image for the product, limited to 1024x1024px.")
-    image_128 = fields.Binary(
-        "Medium-sized image",
-        help="Medium-sized image of the product. It is automatically "
-             "resized as a 128x128px image, with aspect ratio preserved, "
-             "only when the image exceeds one of those sizes. Use this field in form views or some kanban views.")
-    image_64 = fields.Binary(
-        "Small-sized image",
-        help="Small-sized image of the product. It is automatically "
-             "resized as a 64x64px image, with aspect ratio preserved. "
-             "Use this field anywhere a small image is required.")
-
     new_until = fields.Date('New Until')
     favorite_user_ids = fields.Many2many('res.users', 'lunch_product_favorite_user_rel', 'product_id', 'user_id')
-
-    @api.model_create_multi
-    def create(self, vals_list):
-        for values in vals_list:
-            tools.image_resize_images(values)
-        return super(LunchProduct, self).create(vals_list)
-
-    def write(self, values):
-        tools.image_resize_images(values)
-        return super(LunchProduct, self).write(values)
diff --git a/addons/lunch/views/lunch_product_views.xml b/addons/lunch/views/lunch_product_views.xml
index e5132ff500156817ccc98c8529f66421d6cb6422..e328753add1de90035ac56b77fdc02c72765e0eb 100644
--- a/addons/lunch/views/lunch_product_views.xml
+++ b/addons/lunch/views/lunch_product_views.xml
@@ -46,7 +46,7 @@
                 <field name="currency_id" invisible="1"/>
                 <sheet>
                     <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
-                    <field name="image" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
+                    <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
                     <div class="oe_title">
                         <label for="name" class="oe-edit-only"/>
                         <h1>
diff --git a/addons/lunch/wizard/lunch_line_wizard.py b/addons/lunch/wizard/lunch_line_wizard.py
index 39ef50416486d7c7b1622ddffea97d744fd24ea4..4bdc3b1eb7c09e99c873768414027006e746820b 100644
--- a/addons/lunch/wizard/lunch_line_wizard.py
+++ b/addons/lunch/wizard/lunch_line_wizard.py
@@ -47,9 +47,8 @@ class LunchOrderWizard(models.TransientModel):
     available_toppings_2 = fields.Boolean(help='Are extras available for this product', compute='_compute_available_toppings')
     available_toppings_3 = fields.Boolean(help='Are extras available for this product', compute='_compute_available_toppings')
 
-    image = fields.Binary(related='product_id.image')
-    image_128 = fields.Binary(related='product_id.image_128')
-    image_64 = fields.Binary(related='product_id.image_64')
+    image_1920 = fields.Image(related='product_id.image_1920')
+    image_128 = fields.Image(related='product_id.image_128')
 
     quantity = fields.Float('Quantity', default=1)
     price_total = fields.Float('Total Price', compute='_compute_price_total')
diff --git a/addons/lunch/wizard/lunch_line_wizard_views.xml b/addons/lunch/wizard/lunch_line_wizard_views.xml
index b6f4a57f5a270dc0b4b3d9691e1348a645c0b8ec..7c8879f452d8d6a4ea09a3058021d2d5d21c11dc 100644
--- a/addons/lunch/wizard/lunch_line_wizard_views.xml
+++ b/addons/lunch/wizard/lunch_line_wizard_views.xml
@@ -16,7 +16,7 @@
                 <field name="edit" invisible="1"/>
                 <div class="d-flex">
                     <div class="flex-grow-0 pr-5">
-                        <field name="image_128" widget="image" class="o_lunch_image" />
+                        <field name="image_1920" widget="image" class="o_lunch_image" options="{'image_preview': 'image_128'}"/>
                     </div>
                     <div class="flex-grow-1 pr-5">
                         <h2><field name="product_name"/></h2>
diff --git a/addons/mail_bot/data/mailbot_data.xml b/addons/mail_bot/data/mailbot_data.xml
index b772ffd5951dd0f53a5bc57890cdf742be59f217..20233fd731031d86a21b882b5b5492174649946a 100644
--- a/addons/mail_bot/data/mailbot_data.xml
+++ b/addons/mail_bot/data/mailbot_data.xml
@@ -4,7 +4,7 @@
         <record id="base.partner_root" model="res.partner">
             <field name="name">OdooBot</field>
             <field name="email">odoobot@example.com</field>
-            <field name="image" type="base64" file="mail/static/src/img/odoobot.png"/>
+            <field name="image_1920" type="base64" file="mail/static/src/img/odoobot.png"/>
         </record>
     </data>
 </odoo>
diff --git a/addons/mail_bot/views/res_users_views.xml b/addons/mail_bot/views/res_users_views.xml
index 296e5380485665e51aa418246eafca67955e8617..f82b2b96f7234293cba7bef149c65d83e33d4e37 100644
--- a/addons/mail_bot/views/res_users_views.xml
+++ b/addons/mail_bot/views/res_users_views.xml
@@ -34,7 +34,7 @@
         <field name="model">res.users</field>
         <field name="inherit_id" ref="base.view_users_form_simple_modif"/>
         <field name="arch" type="xml">
-            <xpath expr="//field[@name='image']" position="before">
+            <xpath expr="//field[@name='image_1920']" position="before">
                 <widget name="notification_alert"/>
             </xpath>
         </field>
diff --git a/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js b/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js
index c1fab81a194cde0cd0fee5849ac05504d82346e2..69a1332122e8b257bf282cda547afa0cf0a2b4a8 100644
--- a/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js
+++ b/addons/partner_autocomplete/static/src/js/partner_autocomplete_fieldchar.js
@@ -115,7 +115,7 @@ var FieldAutocomplete = FieldChar.extend(AutocompleteMixin, {
         var self = this;
         this._getCreateData(company).then(function (data) {
             if (data.logo) {
-                var logoField = self.model === 'res.partner' ? 'image' : 'logo';
+                var logoField = self.model === 'res.partner' ? 'image_1920' : 'logo';
                 data.company[logoField] = data.logo;
             }
 
diff --git a/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js
index b524dba75a603a14eb1cbdc7a5e7f01ed3011775..c605c9bc33ce7b1bd2b4a855cb2ed67d3bb040fe 100644
--- a/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js
+++ b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js
@@ -15,7 +15,7 @@ odoo.define('partner_autocomplete.tests', function (require) {
 
         _.each(createData, function (val, key) {
             if (fields[key]) {
-                if (key === 'image') {
+                if (key === 'image_1920') {
                     if (val) val = 'data:image/png;base64,' + val;
                     assert.hasAttrValue(form.$(".o_field_image img"), "data-src", val, 'image value should have been updated to "' + val + '"');
                 } else {
@@ -123,7 +123,7 @@ odoo.define('partner_autocomplete.tests', function (require) {
                         name: {string: "Name", type: "char", searchable: true},
                         parent_id: {string: "Company", type: "many2one", relation: "res.partner"},
                         website: {string: "Website", type: "char", searchable: true},
-                        image: {string: "Image", type: "binary", searchable: true},
+                        image_1920: {string: "Image", type: "binary", searchable: true},
                         email: {string: "Email", type: "char", searchable: true},
                         phone: {string: "Phone", type: "char", searchable: true},
                         street: {string: "Street", type: "char", searchable: true},
@@ -163,7 +163,7 @@ odoo.define('partner_autocomplete.tests', function (require) {
                 '<field name="company_type"/>' +
                 '<field name="name" widget="field_partner_autocomplete"/>' +
                 '<field name="website"/>' +
-                '<field name="image" widget="image"/>' +
+                '<field name="image_1920" widget="image"/>' +
                 '</form>',
         }).then(function (form){
             // Set company type to Individual
@@ -198,7 +198,7 @@ odoo.define('partner_autocomplete.tests', function (require) {
                 '<field name="company_type"/>' +
                 '<field name="name" widget="field_partner_autocomplete"/>' +
                 '<field name="website"/>' +
-                '<field name="image" widget="image"/>' +
+                '<field name="image_1920" widget="image"/>' +
                 '<field name="email"/>' +
                 '<field name="phone"/>' +
                 '<field name="street"/>' +
@@ -272,7 +272,7 @@ odoo.define('partner_autocomplete.tests', function (require) {
                 '<field name="company_type"/>' +
                 '<field name="name" widget="field_partner_autocomplete"/>' +
                 '<field name="website"/>' +
-                '<field name="image" widget="image"/>' +
+                '<field name="image_1920" widget="image"/>' +
                 '<field name="email"/>' +
                 '<field name="phone"/>' +
                 '<field name="street"/>' +
diff --git a/addons/point_of_sale/models/res_partner.py b/addons/point_of_sale/models/res_partner.py
index a1b89f004e3f2bbd57404c9e276a90ff058a82ec..7f54488c51c4afa7e87540971e7fba1f0b0945dc 100644
--- a/addons/point_of_sale/models/res_partner.py
+++ b/addons/point_of_sale/models/res_partner.py
@@ -29,8 +29,8 @@ class ResPartner(models.Model):
         """ create or modify a partner from the point of sale ui.
             partner contains the partner's fields. """
         # image is a dataurl, get the data after the comma
-        if partner.get('image'):
-            partner['image'] = partner['image'].split(',')[1]
+        if partner.get('image_1920'):
+            partner['image_1920'] = partner['image_1920'].split(',')[1]
         partner_id = partner.pop('id', False)
         if partner_id:  # Modifying existing partner
             self.browse(partner_id).write(partner)
diff --git a/addons/product/views/product_template_views.xml b/addons/product/views/product_template_views.xml
index f17b7b2a966121381fd4c8fcfd4d17266b1dd18c..35678b7068942e7415de1bfade6baaa0a0233a85 100644
--- a/addons/product/views/product_template_views.xml
+++ b/addons/product/views/product_template_views.xml
@@ -68,7 +68,6 @@
         <field name="arch" type="xml">
             <kanban>
                 <field name="id"/>
-                <field name="image_64"/>
                 <field name="lst_price"/>
                 <field name="product_variant_count"/>
                 <field name="currency_id"/>
diff --git a/addons/product/views/product_views.xml b/addons/product/views/product_views.xml
index 9539ca36ef9d145153bd30932d8fbb9fb151e196..3acf80d169f53dc59508f3c062465897466800f1 100644
--- a/addons/product/views/product_views.xml
+++ b/addons/product/views/product_views.xml
@@ -418,7 +418,6 @@
             <field name="arch" type="xml">
                 <kanban>
                     <field name="id"/>
-                    <field name="image_64"/>
                     <field name="lst_price"/>
                     <field name="activity_state"/>
                     <progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/>
diff --git a/addons/project/views/project_portal_templates.xml b/addons/project/views/project_portal_templates.xml
index b76a27479b95d7e65b9b086a610959877c67fae9..2ac7e60469345588b854934486d59a0c625afc55 100644
--- a/addons/project/views/project_portal_templates.xml
+++ b/addons/project/views/project_portal_templates.xml
@@ -91,7 +91,7 @@
                             <h6>Customer</h6>
                             <div class="row">
                                 <div class="col flex-grow-0 pr-3">
-                                    <img t-if="project.partner_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.partner_id.image)" alt="Contact"/>
+                                    <img t-if="project.partner_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.partner_id.image_1024)" alt="Contact"/>
                                     <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
                                 </div>
                                 <div class="col pl-sm-0">
@@ -103,7 +103,7 @@
                             <h6>Project Manager</h6>
                             <div class="row">
                                 <div class="col flex-grow-0 pr-3">
-                                    <img t-if="project.user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.user_id.image)" alt="Contact"/>
+                                    <img t-if="project.user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.user_id.image_1024)" alt="Contact"/>
                                     <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
                                 </div>
                                 <div class="col pl-sm-0">
@@ -205,7 +205,7 @@
                             <strong>Assigned to</strong>
                             <div class="row">
                                 <div class="col flex-grow-0 pr-3">
-                                    <img t-if="task.user_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.user_id.image)" alt="Contact"/>
+                                    <img t-if="task.user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.user_id.image_1024)" alt="Contact"/>
                                     <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
                                 </div>
                                 <div class="col pl-md-0">
@@ -217,7 +217,7 @@
                             <strong>Reported by</strong>
                             <div class="row">
                                 <div class="col flex-grow-0 pr-3">
-                                    <img t-if="task.partner_id.image" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.partner_id.image)" alt="Contact"/>
+                                    <img t-if="task.partner_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.partner_id.image_1024)" alt="Contact"/>
                                     <img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
                                 </div>
                                 <div class="col pl-md-0">
diff --git a/addons/project/views/project_rating_templates.xml b/addons/project/views/project_rating_templates.xml
index a016e3e77b229aac9fa8731f573ca5d3b2f24b12..a1b8613ccb3896c36146b8838003999c9510ab6d 100644
--- a/addons/project/views/project_rating_templates.xml
+++ b/addons/project/views/project_rating_templates.xml
@@ -77,8 +77,8 @@
             <t t-foreach="partner_stats.values()" t-as="partner_stat">
                 <div class="row mt8" t-if="partner_stat['total']" title="Top 5 partner ratings of last 15 days.">
                     <div class="col-md-1">
-                        <img t-if="partner_stat['rated_partner'].image" class="o_top_partner_image" t-att-src="image_data_uri(partner_stat['rated_partner'].image)" alt="Rated partner"/>
-                        <img  t-if="not partner_stat['rated_partner'].image" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/>
+                        <img t-if="partner_stat['rated_partner'].image_1024" class="o_top_partner_image" t-att-src="image_data_uri(partner_stat['rated_partner'].image_1024)" alt="Rated partner"/>
+                        <img  t-if="not partner_stat['rated_partner'].image_1024" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/>
                     </div>
                     <div class="col-md-4 o_smiley_no_padding_right">
                         <span class="ml8" t-esc="partner_stat['rated_partner'].name"/>
@@ -126,8 +126,8 @@
             <div t-attf-id="rating_#{rating.id}" class="container d-none">
                 <div class="row">
                     <div class="col-lg-2">
-                        <img t-if="rating.partner_id.image" class="o_top_partner_image" t-att-src="image_data_uri(rating.partner_id.image)" alt="Rated partner"/>
-                        <img  t-if="not rating.partner_id.image" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/>
+                        <img t-if="rating.partner_id.image_1024" class="o_top_partner_image" t-att-src="image_data_uri(rating.partner_id.image_1024)" alt="Rated partner"/>
+                        <img  t-if="not rating.partner_id.image_1024" class="o_top_partner_image" src='/web/static/src/img/placeholder.png' alt="Placeholder"/>
                     </div>
                     <div class="col-lg-10">
                         <div class="mt4">
diff --git a/addons/sale/views/sale_portal_templates.xml b/addons/sale/views/sale_portal_templates.xml
index b6264bb8534fb276f8e7dee667130b3594e80e1b..d67a37a52878b21557ff618ca69ce328b2844a43 100644
--- a/addons/sale/views/sale_portal_templates.xml
+++ b/addons/sale/views/sale_portal_templates.xml
@@ -184,8 +184,8 @@
                                 <div class="small mb-1"><strong class="text-muted">Salesperson</strong></div>
                                 <div class="row flex-nowrap">
                                     <div class="col flex-grow-0 pr-2">
-                                        <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="sale_order.user_id.image" t-att-src="image_data_uri(sale_order.user_id.image)" alt="Contact"/>
-                                        <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="not sale_order.user_id.image" src="/web/static/src/img/placeholder.png" alt="Contact"/>
+                                        <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="sale_order.user_id.image_1024" t-att-src="image_data_uri(sale_order.user_id.image_1024)" alt="Contact"/>
+                                        <img class="rounded-circle mr4 float-left o_portal_contact_img" t-if="not sale_order.user_id.image_1024" src="/web/static/src/img/placeholder.png" alt="Contact"/>
                                     </div>
                                     <div class="col pl-0" style="min-width: 150px">
                                         <span t-field="sale_order.user_id" t-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/>
diff --git a/addons/stock/data/stock_demo.xml b/addons/stock/data/stock_demo.xml
index ceaf8bad0aa83f7a4821a14b678de8e9b86acca1..2566a0979bd420c3b86ffeddeed76419157cc7e7 100644
--- a/addons/stock/data/stock_demo.xml
+++ b/addons/stock/data/stock_demo.xml
@@ -152,7 +152,7 @@
             <field name="parent_id" ref="res_partner_company_1"/>
             <field name="email">jeff.lawson52@example.com</field>
             <field name="phone">(461)-417-6587</field>
-            <field name="image" type="base64" file="stock/static/img/res_partner_address_41.jpg"/>
+            <field name="image_1920" type="base64" file="stock/static/img/res_partner_address_41.jpg"/>
         </record>
 
         <record id="res_company_1" model="res.company">
diff --git a/addons/stock_landed_costs/views/stock_landed_cost_views.xml b/addons/stock_landed_costs/views/stock_landed_cost_views.xml
index d30a98cd2b99f4f5c5bda1895be4bf96e269b4a1..8169f4b3f1fae569c2a1b8fa6c5e207cb1f6205b 100644
--- a/addons/stock_landed_costs/views/stock_landed_cost_views.xml
+++ b/addons/stock_landed_costs/views/stock_landed_cost_views.xml
@@ -205,7 +205,7 @@
                 <form string="Landed Costs">
                     <sheet>
                         <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
-                        <field name="image_128" widget="image" class="oe_avatar"/>
+                        <field name="image_1920" widget="image" class="oe_avatar" options="{'image_preview': 'image_128'}"/>
                         <div class="oe_title">
                             <div class="oe_edit_only">
                                 <label for="name" name='label_name' string="Product Name"/>
diff --git a/addons/survey/views/gamification_badge_views.xml b/addons/survey/views/gamification_badge_views.xml
index e9f03f859365e22231fbc0d5361ea668df686a8f..fa404edf6e223464ed7c0d6bdbd6e2a3a0116bd4 100644
--- a/addons/survey/views/gamification_badge_views.xml
+++ b/addons/survey/views/gamification_badge_views.xml
@@ -8,7 +8,7 @@
             <form string="Badge">
                 <sheet>
                     <div class="oe_button_box" name="button_box"/>
-                    <field name="image" widget='image' class="oe_avatar"/>
+                    <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
                     <div class="oe_title">
                         <label for="name" class="oe_edit_only"/>
                         <h1>
diff --git a/addons/website/tests/template_qweb_test.xml b/addons/website/tests/template_qweb_test.xml
index 423c8d3212e6cb89d9844f849200e91f8cde1851..ac7dd4e390fbcf34110e3adde60c4411e755910b 100644
--- a/addons/website/tests/template_qweb_test.xml
+++ b/addons/website/tests/template_qweb_test.xml
@@ -28,7 +28,7 @@
         <a href="/web/content/local_link">x</a>
         <span t-attf-style="background-image: url('/web/image/2')" t-att-empty="False">xxx</span>
         <div widget="html" t-field="user.signature"/>
-        <div widget="image" t-field="user.image" t-options="{'widget': 'image'}"/>
+        <div widget="image" t-field="user.image_1920" t-options="{'widget': 'image'}"/>
     </body>
 </html>
     </template>
diff --git a/addons/website/tests/test_qweb.py b/addons/website/tests/test_qweb.py
index 8e2eb382a408e8f5b9b7d995de787efb447c4c6d..9386c9f81e346fd6e59040ff73def6432738bebd 100644
--- a/addons/website/tests/test_qweb.py
+++ b/addons/website/tests/test_qweb.py
@@ -57,7 +57,7 @@ class TestQweb(TransactionCase):
         <div widget="html"><span class="toto">
                 span<span class="fa"></span><img src="http://test.cdn/web/image/1">
             </span></div>
-        <div widget="image"><img src="http://test.cdn/web/image/res.users/%(user_id)s/image/%(filename)s" class="img img-fluid" alt="%(alt)s"/></div>
+        <div widget="image"><img src="http://test.cdn/web/image/res.users/%(user_id)s/image_1920/%(filename)s" class="img img-fluid" alt="%(alt)s"/></div>
     </body>
 </html>""" % {
             "js": attachments[0].url,
diff --git a/addons/website_blog/static/src/js/website_blog.editor.js b/addons/website_blog/static/src/js/website_blog.editor.js
index 2eedfc78b2e24f6ce533a01bfcd18189dbaa1c85..1342d32201f02097ac1d0458485107af151ca853 100644
--- a/addons/website_blog/static/src/js/website_blog.editor.js
+++ b/addons/website_blog/static/src/js/website_blog.editor.js
@@ -127,7 +127,7 @@ options.registry.many2one.include({
                 var $img = $(this).find('img');
                 var css = window.getComputedStyle($img[0]);
                 $img.css({ width: css.width, height: css.height });
-                $img.attr('src', '/web/image/res.partner/'+self.ID+'/image');
+                $img.attr('src', '/web/image/res.partner/'+self.ID+'/image_1024');
             });
             setTimeout(function () { $nodes.removeClass('o_dirty'); },0);
         }
diff --git a/addons/website_event_track/models/event_track.py b/addons/website_event_track/models/event_track.py
index b347d6ffb538b2bb3201e02e688ee2b449ca992b..20b146f0f845050dc4e6a0db5dc3689e31d6c1b6 100644
--- a/addons/website_event_track/models/event_track.py
+++ b/addons/website_event_track/models/event_track.py
@@ -88,7 +88,7 @@ class Track(models.Model):
         ('0', 'Low'), ('1', 'Medium'),
         ('2', 'High'), ('3', 'Highest')],
         'Priority', required=True, default='1')
-    image = fields.Binary('Image', related='partner_id.image_128', store=True, readonly=False)
+    image = fields.Image("Image", related='partner_id.image_128', store=True, readonly=False)
 
     @api.depends('name')
     def _compute_website_url(self):
@@ -202,4 +202,4 @@ class Sponsor(models.Model):
     partner_id = fields.Many2one('res.partner', 'Sponsor/Customer', required=True)
     url = fields.Char('Sponsor Website')
     sequence = fields.Integer('Sequence', store=True, related='sponsor_type_id.sequence', readonly=False)
-    image_128 = fields.Binary(string='Logo', related='partner_id.image_128', store=True, readonly=False)
+    image_128 = fields.Image(string="Logo", related='partner_id.image_128', store=True, readonly=False)
diff --git a/addons/website_forum/models/forum.py b/addons/website_forum/models/forum.py
index 3bd01177ec70092298e6093c16d15730a5341ef6..8056381da9608dd67810504b83c931b9a65d3d2a 100644
--- a/addons/website_forum/models/forum.py
+++ b/addons/website_forum/models/forum.py
@@ -388,7 +388,7 @@ class Post(models.Model):
         res = super(Post, self)._default_website_meta()
         res['default_opengraph']['og:title'] = res['default_twitter']['twitter:title'] = self.name
         res['default_opengraph']['og:description'] = res['default_twitter']['twitter:description'] = self.plain_content
-        res['default_opengraph']['og:image'] = res['default_twitter']['twitter:image'] = "/web/image/res.users/%s/image" % (self.create_uid.id)
+        res['default_opengraph']['og:image'] = res['default_twitter']['twitter:image'] = "/web/image/res.users/%s/image_1024" % (self.create_uid.id)
         res['default_twitter']['twitter:card'] = 'summary'
         res['default_meta_description'] = self.plain_content
         return res
diff --git a/addons/website_partner/views/website_partner_templates.xml b/addons/website_partner/views/website_partner_templates.xml
index 2f5c58b1dee449d7d996df69606ecd521448016a..60adb04ee2dc92646b67bc9951b1d0f4052f3384 100644
--- a/addons/website_partner/views/website_partner_templates.xml
+++ b/addons/website_partner/views/website_partner_templates.xml
@@ -17,7 +17,7 @@
 <template id="partner_detail" name="Partner Details">
     <h1 class="col-lg-12 text-center" id="partner_name" t-field="partner.display_name"/>
     <div class="col-lg-4">
-        <div t-field="partner.image" t-options='{"widget": "image", "class": "d-block mx-auto mb16", "max_width": 512}'/>
+        <div t-field="partner.image_1920" t-options='{"widget": "image", "preview_image": "image_512", "class": "d-block mx-auto mb16"}'/>
         <address>
              <div t-field="partner.self" t-options='{
                  "widget": "contact",
diff --git a/addons/website_profile/views/website_profile.xml b/addons/website_profile/views/website_profile.xml
index 1a06cdee7a9581066babc29ab9220f867acded88..b5470a833a9ab343b01bd6e4e1fc07a9fb5fa692 100644
--- a/addons/website_profile/views/website_profile.xml
+++ b/addons/website_profile/views/website_profile.xml
@@ -206,7 +206,7 @@
                     <!-- ==== Header Left ==== -->
                     <div class="col-12 col-md-4 col-lg-3">
                         <div t-attf-class="d-flex align-items-start h-100 #{'justify-content-between' if (request.env.user == user) else 'justify-content-around' }">
-                            <div class="o_wprofile_pict d-inline-block mb-3 mb-md-0" t-attf-style="background-image:url(/web/image/res.users/#{user.id}/image)"/>
+                            <div class="o_wprofile_pict d-inline-block mb-3 mb-md-0" t-attf-style="background-image:url(/web/image/res.users/#{user.id}/image_1024)"/>
                             <a class="btn btn-primary d-inline-block d-md-none" t-if="request.env.user == user and user.karma != 0" t-attf-href="/profile/edit?url_param=#{edit_button_url_param}">
                                 <i class="fa fa-pencil mr-1"/>EDIT
                             </a>
@@ -406,7 +406,7 @@
                                 <t t-foreach="ranks" t-as="rank">
                                     <li t-attf-class="list-group-item">
                                         <div class="media align-items-center">
-                                            <img width="40" t-attf-src="/web/image/gamification.karma.rank/#{rank.id}/image" class="mr-2" alt="Rank badge"/>
+                                            <img width="40" t-attf-src="/web/image/gamification.karma.rank/#{rank.id}/image_64" class="mr-2" alt="Rank badge"/>
                                             <div class="media-body">
                                                 <h5 class="mt-0 mb-0" t-field="rank.name"/>
                                                 <span class="badge badge-success"><span t-field="rank.karma_min"/></span> point<span t-if="rank.karma_min">s</span>
@@ -437,9 +437,9 @@
         <table class="table table-sm mb64">
             <tr t-foreach="badges" t-as="badge">
                 <td class="align-middle">
-                    <img t-if="not badge.image and badge.level" t-attf-src="/website_profile/static/src/img/badge_#{badge.level}.svg"
+                    <img t-if="not badge.image_1920 and badge.level" t-attf-src="/website_profile/static/src/img/badge_#{badge.level}.svg"
                          class="my-1" style="height:2.5em" t-att-alt="badge.name"/>
-                    <img t-else="" t-attf-src="/web/image/gamification.badge/#{badge.id}/image" class="my-1" style="height:2.5em" t-att-alt="badge.name"/>
+                    <img t-else="" t-attf-src="/web/image/gamification.badge/#{badge.id}/image_1024" class="my-1" style="height:2.5em" t-att-alt="badge.name"/>
                     <h6 t-field="badge.name" class="d-inline my-0"/>
                 </td>
                 <td class="align-middle d-none d-md-table-cell">
diff --git a/addons/website_sale/models/product.py b/addons/website_sale/models/product.py
index 644457566a7572377fa94f54916c564b038dc6ff..d8b22e6dfc91397cb05e325d02dbab986b8ded1b 100644
--- a/addons/website_sale/models/product.py
+++ b/addons/website_sale/models/product.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo import api, fields, models, tools, _
+from odoo import api, fields, models, _
 from odoo.exceptions import ValidationError, UserError
 from odoo.addons.website.models import ir_http
 from odoo.tools.translate import html_translate
@@ -137,7 +137,7 @@ class ProductPricelist(models.Model):
 
 class ProductPublicCategory(models.Model):
     _name = "product.public.category"
-    _inherit = ["website.seo.metadata", "website.multi.mixin"]
+    _inherit = ["website.seo.metadata", "website.multi.mixin", 'image.mixin']
     _description = "Website Product Category"
     _parent_store = True
     _order = "sequence, name"
@@ -148,32 +148,9 @@ class ProductPublicCategory(models.Model):
     child_id = fields.One2many('product.public.category', 'parent_id', string='Children Categories')
     parents_and_self = fields.Many2many('product.public.category', compute='_compute_parents_and_self')
     sequence = fields.Integer(help="Gives the sequence order when displaying a list of product categories.", index=True)
-    # NOTE: there is no 'default image', because by default we don't show
-    # thumbnails for categories. However if we have a thumbnail for at least one
-    # category, then we display a default image on the other, so that the
-    # buttons have consistent styling.
-    # In this case, the default image is set by the js code.
-    image = fields.Binary(help="This field holds the image used as image for the category, limited to 1024x1024px.")
     website_description = fields.Html('Category Description', sanitize_attributes=False, translate=html_translate)
-    image_128 = fields.Binary(string='Medium-sized image',
-                                 help="Medium-sized image of the category. It is automatically "
-                                 "resized as a 128x128px image, with aspect ratio preserved. "
-                                 "Use this field in form views or some kanban views.")
-    image_64 = fields.Binary(string='Small-sized image',
-                                help="Small-sized image of the category. It is automatically "
-                                "resized as a 64x64px image, with aspect ratio preserved. "
-                                "Use this field anywhere a small image is required.")
     product_tmpl_ids = fields.Many2many('product.template', relation='product_public_category_product_template_rel')
 
-    @api.model
-    def create(self, vals):
-        tools.image_resize_images(vals)
-        return super(ProductPublicCategory, self).create(vals)
-
-    def write(self, vals):
-        tools.image_resize_images(vals)
-        return super(ProductPublicCategory, self).write(vals)
-
     @api.constrains('parent_id')
     def check_parent_id(self):
         if not self._check_recursion():
diff --git a/addons/website_sale/views/product_views.xml b/addons/website_sale/views/product_views.xml
index 373ea27bde5b6e6b2d6d7dc11d236fb50fc0d344..43284ead368325a0111b48540a35172e5406ea43 100644
--- a/addons/website_sale/views/product_views.xml
+++ b/addons/website_sale/views/product_views.xml
@@ -145,7 +145,7 @@
         <field name="arch" type="xml">
             <form string="Website Public Categories">
                 <sheet>
-                    <field name="image_128" widget='image' class="oe_avatar"/>
+                    <field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
                     <div class="oe_left">
                         <group>
                             <field name="name"/>
diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py
index 2f12ab7277581c7eb9e152bcde7aefadb6d0ddfb..57c25a04af0b026fb8f92f8c5fae53238eae11a3 100644
--- a/addons/website_slides/controllers/main.py
+++ b/addons/website_slides/controllers/main.py
@@ -324,7 +324,7 @@ class WebsiteSlides(WebsiteProfile):
         return request.env['res.users'].sudo().search_read([
             ('karma', '>', 0),
             ('website_published', '=', True),
-            ('image', '!=', False)], ['id'], limit=3, order='karma desc')
+            ('image_1920', '!=', False)], ['id'], limit=3, order='karma desc')
 
     @http.route([
         '/slides/<model("slide.channel"):channel>',
diff --git a/addons/website_slides/data/gamification_data.xml b/addons/website_slides/data/gamification_data.xml
index 4bf7a829b9d989b7247219391e452110dac04ee5..08606251fad898ed80d9651f8ec321b6e2c86f33 100644
--- a/addons/website_slides/data/gamification_data.xml
+++ b/addons/website_slides/data/gamification_data.xml
@@ -5,7 +5,7 @@
     <record id="badge_data_register" model="gamification.badge">
         <field name="name">Get started</field>
         <field name="description">Register to the platform</field>
-        <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/>
+        <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/>
         <field name="website_published" eval="True"/>
         <field name="level">bronze</field>
         <field name="rule_auth">nobody</field>
@@ -46,7 +46,7 @@
     <record id="badge_data_profile" model="gamification.badge">
         <field name="name">Know yourself</field>
         <field name="description">Complete your profile</field>
-        <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/>
+        <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_bronze.svg"/>
         <field name="website_published" eval="True"/>
         <field name="level">bronze</field>
         <field name="rule_auth">nobody</field>
@@ -88,7 +88,7 @@
     <record id="badge_data_course" model="gamification.badge">
         <field name="name">Power User</field>
         <field name="description">Complete a course</field>
-        <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_silver.svg"/>
+        <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_silver.svg"/>
         <field name="website_published" eval="True"/>
         <field name="level">silver</field>
         <field name="rule_auth">nobody</field>
@@ -128,7 +128,7 @@
     <record id="badge_data_certification" model="gamification.badge">
         <field name="name">Certified Knowledge</field>
         <field name="description">Get a certification</field>
-        <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/>
+        <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/>
         <field name="website_published" eval="False"/>
         <field name="level">gold</field>
         <field name="rule_auth">nobody</field>
@@ -169,7 +169,7 @@
     <record id="badge_data_karma" model="gamification.badge">
         <field name="name">Community hero</field>
         <field name="description">Reach 2000 XP</field>
-        <field name="image" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/>
+        <field name="image_1920" type="base64" file="website_slides/static/src/img/standard_badge_gold.svg"/>
         <field name="website_published" eval="True"/>
         <field name="level">gold</field>
         <field name="rule_auth">nobody</field>
diff --git a/odoo/addons/base/data/res_partner_data.xml b/odoo/addons/base/data/res_partner_data.xml
index ee4b4fbf31cf7fec9fdfcd3382ebc68b8d1e54f4..951240cf6ae8a8c70722a16a12e4117e73718849 100644
--- a/odoo/addons/base/data/res_partner_data.xml
+++ b/odoo/addons/base/data/res_partner_data.xml
@@ -11,7 +11,7 @@
             <field name="phone"></field>
             <field name="email">info@yourcompany.com</field>
             <field name="website">www.yourcompany.com</field>
-            <field name="image" type="base64" file="base/static/img/res_company_logo.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_company_logo.png"/>
         </record>
 
         <record model="res.partner" id="base.partner_root">
@@ -25,7 +25,7 @@
             <field name="name">Administrator</field>
             <field name="company_id" ref="main_company"/>
             <field name="email">admin@example.com</field>
-            <field name="image" type="base64" file="base/static/img/avatar_grey.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/avatar_grey.png"/>
         </record>
 
         <record id="public_partner" model="res.partner">
diff --git a/odoo/addons/base/data/res_partner_demo.xml b/odoo/addons/base/data/res_partner_demo.xml
index 39e3c8dedd6e21c5c7d321d37dc88fed80607913..3f97483710a34883491460ee958b52adaa9d38b5 100644
--- a/odoo/addons/base/data/res_partner_demo.xml
+++ b/odoo/addons/base/data/res_partner_demo.xml
@@ -51,7 +51,7 @@
             <field name="email">wood.corner26@example.com</field>
             <field name="phone">(623)-853-7197</field>
             <field name="website">http://www.wood-corner.com</field>
-            <field name="image" type="base64" file="base/static/img/res_partner_1-image.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_1-image.png"/>
         </record>
         <record id="res_partner_2" model="res.partner">
             <field name="name">Deco Addict</field>
@@ -65,7 +65,7 @@
             <field name="email">deco.addict82@example.com</field>
             <field name="phone">(603)-996-3829</field>
             <field name="website">http://www.deco-addict.com</field>
-            <field name="image" type="base64" file="base/static/img/res_partner_2-image.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_2-image.png"/>
         </record>
         <record id="res_partner_3" model="res.partner">
             <field name="name">Gemini Furniture</field>
@@ -79,9 +79,9 @@
             <field name="email">gemini.furniture39@example.com</field>
             <field name="phone">(941)-284-4875</field>
             <field name="website">http://www.gemini-furniture.com/</field>
-            <field name="image" type="base64" file="base/static/img/res_partner_3-image.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_3-image.png"/>
         </record>
-        
+
         <record id="res_partner_4" model="res.partner">
             <field name="name">Ready Mat</field>
             <field eval="[(6, 0, [ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
@@ -94,7 +94,7 @@
             <field name="email">ready.mat28@example.com</field>
             <field name="phone">(803)-873-6126</field>
             <field name="website">http://www.ready-mat.com/</field>
-            <field name="image" type="base64" file="base/static/img/res_partner_4-image.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_4-image.png"/>
         </record>
 
         <record id="res_partner_10" model="res.partner">
@@ -107,9 +107,9 @@
             <field name="country_id" ref="base.us"/>
             <field name="email">jackson.group82@example.com</field>
             <field name="phone">(334)-502-1024</field>
-            <field name="image" type="base64" file="base/static/img/res_partner_10-image.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_10-image.jpg"/>
         </record>
-  
+
         <record id="res_partner_12" model="res.partner">
             <field name="name">Azure Interior</field>
             <field eval="[(6, 0, [ref('res_partner_category_11')])]" name="category_id"/>
@@ -122,7 +122,7 @@
             <field name="country_id" ref="base.us"/>
             <field name="email">azure.Interior24@example.com</field>
             <field name="website">http://www.azure-interior.com</field>
-            <field name="image" type="base64" file="base/static/img/res_partner_12-image.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_12-image.png"/>
         </record>
 
         <record id="res_partner_18" model="res.partner">
@@ -136,7 +136,7 @@
             <field name="phone">(828)-316-0593</field>
             <field name="country_id" ref="base.us"/>
             <field name="website">http://www.lumber-inc.com</field>
-            <field name="image" type="base64" file="base/static/img/res_partner_18-image.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_18-image.png"/>
         </record>
 
         <record id="res_partner_address_1" model="res.partner">
diff --git a/odoo/addons/base/data/res_partner_image_demo.xml b/odoo/addons/base/data/res_partner_image_demo.xml
index a74973eedb4a3e65bec1087672d8c79eb482e3f4..d70d8624ad8fc34345487363a9608e5a4b9b6703 100644
--- a/odoo/addons/base/data/res_partner_image_demo.xml
+++ b/odoo/addons/base/data/res_partner_image_demo.xml
@@ -3,103 +3,103 @@
     <data noupdate="0">
 
         <record id="base.res_partner_address_1" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_1.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_1.jpg"/>
         </record>
 
         <record id="base.res_partner_address_2" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_2.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_2.jpg"/>
         </record>
 
         <record id="base.res_partner_address_3" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_3.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_3.jpg"/>
         </record>
 
         <record id="base.res_partner_address_4" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_4.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_4.jpg"/>
         </record>
 
         <record id="base.res_partner_address_5" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_5.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_5.jpg"/>
         </record>
 
         <record id="base.res_partner_address_7" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_7.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_7.jpg"/>
         </record>
 
         <record id="base.res_partner_address_10" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_10.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_10.jpg"/>
         </record>
 
         <record id="base.res_partner_address_11" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_11.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_11.jpg"/>
         </record>
 
         <record id="base.res_partner_address_13" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_13.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_13.jpg"/>
         </record>
 
         <record id="base.res_partner_address_14" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_14.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_14.jpg"/>
         </record>
 
         <record id="base.res_partner_address_15" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_15.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_15.jpg"/>
         </record>
 
         <record id="base.res_partner_address_16" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_16.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_16.jpg"/>
         </record>
 
         <record id="base.res_partner_address_17" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_17.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_17.jpg"/>
         </record>
 
         <record id="base.res_partner_address_18" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_18.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_18.jpg"/>
         </record>
 
         <record id="base.res_partner_address_24" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_24.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_24.jpg"/>
         </record>
 
         <record id="base.res_partner_address_25" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_25.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_25.jpg"/>
         </record>
 
         <record id="base.res_partner_address_27" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_27.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_27.jpg"/>
         </record>
 
         <record id="base.res_partner_address_28" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_28.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_28.jpg"/>
         </record>
 
         <record id="base.res_partner_address_30" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_30.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_30.jpg"/>
         </record>
 
         <record id="base.res_partner_address_31" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_31.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_31.jpg"/>
         </record>
 
         <record id="base.res_partner_address_32" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_32.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_32.jpg"/>
         </record>
 
         <record id="base.res_partner_address_33" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_33.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_33.jpg"/>
         </record>
 
         <record id="base.res_partner_address_34" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_address_34.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_address_34.jpg"/>
         </record>
 
         <record id="base.res_partner_main1" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_main1.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_main1.jpg"/>
         </record>
 
         <record id="base.res_partner_main2" model="res.partner">
-            <field name="image" type="base64" file="base/static/img/res_partner_main2.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/res_partner_main2.jpg"/>
         </record>
 
     </data>
diff --git a/odoo/addons/base/data/res_users_data.xml b/odoo/addons/base/data/res_users_data.xml
index f274489fb1d9ed4683a5f95d1629ac7ea2bbeae1..6439180c2a757bfbfacb9863ed4ef75d6c40fff3 100644
--- a/odoo/addons/base/data/res_users_data.xml
+++ b/odoo/addons/base/data/res_users_data.xml
@@ -36,7 +36,7 @@ Administrator</span>]]></field>
             <field name="password"></field>
             <!-- Avoid auto-including this demo user in any default group -->
             <field name="groups_id" eval="[(6,0,[])]"/>
-            <field name="image" type="base64" file="base/static/img/public_user-image.png"/>
+            <field name="image_1920" type="base64" file="base/static/img/public_user-image.png"/>
             <field name="partner_id" ref="public_partner"/>
             <field name="active" eval="False"/>
         </record>
diff --git a/odoo/addons/base/data/res_users_demo.xml b/odoo/addons/base/data/res_users_demo.xml
index 4f4c580dfb8cae9612a76d0d4d703afa3c2d0699..980c4d2b3bc08dff099c86cd169e9ea05f4133a5 100644
--- a/odoo/addons/base/data/res_users_demo.xml
+++ b/odoo/addons/base/data/res_users_demo.xml
@@ -36,7 +36,7 @@
             <field name="signature" type="xml"><span>-- <br/>+Mr Demo</span></field>
             <field name="company_id" ref="main_company"/>
             <field name="groups_id" eval="[(6,0,[ref('base.group_user'), ref('base.group_partner_manager')])]"/>
-            <field name="image" type="base64" file="base/static/img/user_demo-image.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/user_demo-image.jpg"/>
         </record>
 
         <record model="res.partner" id="base.partner_root">
@@ -55,7 +55,7 @@
             <field name="phone">+1 555-555-5555</field>
             <field name="email">admin@yourcompany.example.com</field>
             <field name="tz">Europe/Brussels</field>
-            <field name="image" type="base64" file="base/static/img/partner_root-image.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/partner_root-image.jpg"/>
         </record>
 
 
@@ -69,7 +69,7 @@
             <field name="zip">07002</field>
             <field name="country_id" ref="base.us"/>
             <field name="company_name">YourCompany</field>
-            <field name="image" type="base64" file="base/static/img/partner_demo_portal.jpg"/>
+            <field name="image_1920" type="base64" file="base/static/img/partner_demo_portal.jpg"/>
             <field name="phone">(683)-556-5104</field>
         </record>
         <record id="demo_user0" model="res.users" context="{'no_reset_password': True}">
diff --git a/odoo/addons/base/models/res_company.py b/odoo/addons/base/models/res_company.py
index cc5ddc750875f04366c6015e001758b3b28e669a..17c4e95446f142312f9628855529181f142eadcc 100644
--- a/odoo/addons/base/models/res_company.py
+++ b/odoo/addons/base/models/res_company.py
@@ -70,7 +70,7 @@ class Company(models.Model):
     partner_id = fields.Many2one('res.partner', string='Partner', required=True)
     report_header = fields.Text(string='Company Tagline', help="Appears by default on the top right corner of your printed documents (report header).")
     report_footer = fields.Text(string='Report Footer', translate=True, help="Footer text displayed at the bottom of all reports.")
-    logo = fields.Binary(related='partner_id.image', default=_get_logo, string="Company Logo", readonly=False)
+    logo = fields.Binary(related='partner_id.image_1920', default=_get_logo, string="Company Logo", readonly=False)
     # logo_web: do not store in attachments, since the image is retrieved in SQL for
     # performance reasons (see addons/web/controllers/main.py, Binary.company_logo)
     logo_web = fields.Binary(compute='_compute_logo_web', store=True, attachment=False)
@@ -154,10 +154,10 @@ class Company(models.Model):
         for company in self:
             company.partner_id.country_id = company.country_id
 
-    @api.depends('partner_id', 'partner_id.image')
+    @api.depends('partner_id.image_1920')
     def _compute_logo_web(self):
         for company in self:
-            company.logo_web = tools.image_process(company.partner_id.image, size=(180, 0))
+            company.logo_web = tools.image_process(company.partner_id.image_1920, size=(180, 0))
 
     @api.onchange('state_id')
     def _onchange_state(self):
@@ -218,7 +218,7 @@ class Company(models.Model):
         partner = self.env['res.partner'].create({
             'name': vals['name'],
             'is_company': True,
-            'image': vals.get('logo'),
+            'image_1920': vals.get('logo'),
             'email': vals.get('email'),
             'phone': vals.get('phone'),
             'website': vals.get('website'),
diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py
index 9ffacd4913f8fd94ed4616a646c65e44a2197cb0..c4671db916adf25c507a4db1d5b27834e649cfab 100644
--- a/odoo/addons/base/models/res_partner.py
+++ b/odoo/addons/base/models/res_partner.py
@@ -15,7 +15,7 @@ import requests
 from lxml import etree
 from werkzeug import urls
 
-from odoo import api, fields, models, tools, SUPERUSER_ID, _
+from odoo import api, fields, models, tools, _
 from odoo.modules import get_module_resource
 from odoo.osv.expression import get_unaccent_wrapper
 from odoo.exceptions import UserError, ValidationError
@@ -130,7 +130,7 @@ class PartnerTitle(models.Model):
 
 class Partner(models.Model):
     _description = 'Contact'
-    _inherit = ['format.address.mixin']
+    _inherit = ['format.address.mixin', 'image.mixin']
     _name = "res.partner"
     _order = "display_name"
 
@@ -220,16 +220,6 @@ class Partner(models.Model):
                                           store=True)
     company_name = fields.Char('Company Name')
 
-    # image: all image fields are base64 encoded and PIL-supported
-    image = fields.Binary("Image")
-    image_128 = fields.Binary("Medium-sized image",
-        help="Medium-sized image of this contact. It is automatically "\
-             "resized as a 128x128px image, with aspect ratio preserved. "\
-             "Use this field in form views or some kanban views.")
-    image_64 = fields.Binary("Small-sized image",
-        help="Small-sized image of this contact. It is automatically "\
-             "resized as a 64x64px image, with aspect ratio preserved. "\
-             "Use this field anywhere a small image is required.")
     # hack to allow using plain browse record in qweb views, and used in ir.qweb.field.contact
     self = fields.Many2one(comodel_name=_name, compute='_compute_get_ids')
 
@@ -329,7 +319,7 @@ class Partner(models.Model):
         colorize, img_path, image_base64 = False, False, False
 
         if partner_type in ['other'] and parent_id:
-            parent_image = self.browse(parent_id).image
+            parent_image = self.browse(parent_id).image_1920
             image_base64 = parent_image or None
 
         if not image_base64 and partner_type == 'invoice':
@@ -348,7 +338,7 @@ class Partner(models.Model):
         if image_base64 and colorize:
             image_base64 = tools.image_process(image_base64, colorize=True)
 
-        return tools.image_process(image_base64, size=(1024, 1024))
+        return image_base64
 
     @api.model
     def _fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
@@ -408,8 +398,8 @@ class Partner(models.Model):
 
     @api.onchange('email')
     def onchange_email(self):
-        if not self.image and self._context.get('gravatar_image') and self.email:
-            self.image = self._get_gravatar_image(self.email)
+        if not self.image_1920 and self._context.get('gravatar_image') and self.email:
+            self.image_1920 = self._get_gravatar_image(self.email)
 
     @api.onchange('parent_id', 'company_id')
     def _onchange_company_id(self):
@@ -568,10 +558,6 @@ class Partner(models.Model):
                     if len(companies) > 1 or company not in companies:
                         raise UserError(
                             ("The selected company is not compatible with the companies of the related user(s)"))
-        # no padding on the big image, because it's used as website logo
-        tools.image_resize_images(vals, return_big=False)
-        tools.image_resize_images(vals, return_medium=False, return_small=False)
-
         result = True
         # To write in SUPERUSER on field is_company and avoid access rights problems.
         if 'is_company' in vals and self.user_has_groups('base.group_partner_manager') and not self.env.su:
@@ -595,11 +581,8 @@ class Partner(models.Model):
                 vals['company_name'] = False
             # compute default image in create, because computing gravatar in the onchange
             # cannot be easily performed if default images are in the way
-            if not vals.get('image'):
-                vals['image'] = self._get_default_image(vals.get('type'), vals.get('is_company'), vals.get('parent_id'))
-            # no padding on the big image, because it's used as website logo
-            tools.image_resize_images(vals, return_big=False)
-            tools.image_resize_images(vals, return_medium=False, return_small=False)
+            if not vals.get('image_1920'):
+                vals['image_1920'] = self._get_default_image(vals.get('type'), vals.get('is_company'), vals.get('parent_id'))
         partners = super(Partner, self).create(vals_list)
 
         if self.env.context.get('_partners_skip_fields_sync'):
diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py
index 96d747ecb0749564683ed855f5fc813d4b9e3437..7606124f223f9191530c84cfeae6fd863eae9988 100644
--- a/odoo/addons/base/models/res_users.py
+++ b/odoo/addons/base/models/res_users.py
@@ -201,9 +201,9 @@ class Users(models.Model):
     __uid_cache = defaultdict(dict)             # {dbname: {uid: password}}
 
     # User can write on a few of his own fields (but not his groups for example)
-    SELF_WRITEABLE_FIELDS = ['signature', 'action_id', 'company_id', 'email', 'name', 'image', 'image_128', 'image_64', 'lang', 'tz']
+    SELF_WRITEABLE_FIELDS = ['signature', 'action_id', 'company_id', 'email', 'name', 'image_1920', 'lang', 'tz']
     # User can read a few of his own fields
-    SELF_READABLE_FIELDS = ['signature', 'company_id', 'login', 'email', 'name', 'image', 'image_128', 'image_64', 'lang', 'tz', 'tz_offset', 'groups_id', 'partner_id', '__last_update', 'action_id']
+    SELF_READABLE_FIELDS = ['signature', 'company_id', 'login', 'email', 'name', 'image_1920', 'image_1024', 'image_512', 'image_256', 'image_128', 'image_64', 'lang', 'tz', 'tz_offset', 'groups_id', 'partner_id', '__last_update', 'action_id']
 
     def _default_groups(self):
         default_user = self.env.ref('base.default_user', raise_if_not_found=False)
diff --git a/odoo/addons/base/tests/test_ir_http.py b/odoo/addons/base/tests/test_ir_http.py
index 19ab037400fa17690a97c234f7bd4f224eec53fd..5d06b2f4293748f9104991917f1a2c20a2be5698 100644
--- a/odoo/addons/base/tests/test_ir_http.py
+++ b/odoo/addons/base/tests/test_ir_http.py
@@ -40,14 +40,14 @@ class test_ir_http_mimetype(common.TransactionCase):
     def test_ir_http_mimetype_basic_field(self):
         """ Test mimetype for classic field """
         partner = self.env['res.partner'].create({
-            'image': GIF,
+            'image_1920': GIF,
             'name': 'Test mimetype basic field',
         })
 
         status, headers, content = self.env['ir.http'].binary_content(
             model='res.partner',
             id=partner.id,
-            field='image',
+            field='image_1920',
             default_mimetype='application/octet-stream',
         )
         mimetype = dict(headers).get('Content-Type')
diff --git a/odoo/addons/base/tests/test_orm.py b/odoo/addons/base/tests/test_orm.py
index b16d229b4955234724ae45e0738a08330c472ab6..b44c22f19cd10ff415be5ae6c57dcd95ca8760e2 100644
--- a/odoo/addons/base/tests/test_orm.py
+++ b/odoo/addons/base/tests/test_orm.py
@@ -364,7 +364,7 @@ class TestInherits(TransactionCase):
         write_date_before = user.write_date
 
         # write base64 image
-        user.write({'image': 'R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='})
+        user.write({'image_1920': 'R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='})
         write_date_after = user.write_date
         self.assertNotEqual(write_date_before, write_date_after)
 
diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml
index 15c9a695c2eff427f7f3a39d8791677eae6a1245..7099f4b0850dc57d3830d8e4e864f65794933a97 100644
--- a/odoo/addons/base/views/res_partner_views.xml
+++ b/odoo/addons/base/views/res_partner_views.xml
@@ -67,7 +67,7 @@
                 <form string="Contact">
                     <field name="is_company" invisible="1"/>
                     <field name="type" invisible="1"/>
-                    <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
+                    <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
                     <div class="oe_title">
                         <field name="company_type" options="{'horizontal': true}" class="oe_edit_only" widget="radio"  groups="base.group_no_one"/>
                         <h1>
@@ -97,7 +97,7 @@
             <field name="priority" eval="20"/>
             <field name="arch" type="xml">
                 <form string="Partner">
-                    <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}' readonly="1"/>
+                    <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}' readonly="1"/>
                     <div class="oe_title">
                         <h1>
                             <field name="name" readonly="1"/>
@@ -135,7 +135,7 @@
             <field name="arch" type="xml">
                 <form string="Partners">
                 <sheet>
-                    <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
+                    <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
                     <div class="oe_title">
                         <field name="is_company" invisible="1"/>
                         <field name="commercial_partner_id" invisible="1"/>
@@ -205,7 +205,7 @@
                 <sheet>
                     <widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
                     <div class="oe_button_box" name="button_box"/>
-                    <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
+                    <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
                     <div class="oe_title">
                         <field name="is_company" invisible="1"/>
                         <field name="commercial_partner_id" invisible="1"/>
@@ -373,11 +373,11 @@
                                                 <field name="mobile" widget="phone"/>
                                             </group>
                                             <group colspan="1">
-                                                <field name="image_128" widget="image" class="oe_avatar" nolabel="1"/>
+                                                <field name="image_1920" widget="image" class="oe_avatar" nolabel="1" options="{'image_preview': 'image_128'}"/>
                                             </group>
                                         </group>
                                         <field name="lang" invisible="True"/>
-                                        <field name="image" invisible="True"/>
+                                        <field name="image_1920" invisible="True"/>
                                         <field name="user_id" invisible="True"/>
                                     </sheet>
                                 </form>
diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml
index 33d7e1008b2d0e3f51ef45330afc0f18709d640d..0ef4f47208cec44d60882f7b1e669817139c4787 100644
--- a/odoo/addons/base/views/res_users_views.xml
+++ b/odoo/addons/base/views/res_users_views.xml
@@ -125,7 +125,7 @@
                         <div class="alert alert-info text-center mb-3" attrs="{'invisible': [('id', '>', 0)]}" role="alert">
                             You are inviting a new user.
                         </div>
-                        <field name="image" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image": "image_128"}'/>
+                        <field name="image_1920" widget='image' class="oe_avatar" options='{"zoom": true, "preview_image": "image_128"}'/>
                         <div class="oe_title">
                             <label for="name" class="oe_edit_only"/>
                             <h1><field name="name" required="1"/></h1>
@@ -189,7 +189,7 @@
                             <field name="partner_id" required="0" readonly="1"/>
                           </div>
                         </div>
-                        <field name="image" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
+                        <field name="image_1920" widget='image' class="oe_avatar" options='{"preview_image": "image_128"}'/>
                         <div class="oe_title">
                             <label for="name" class="oe_edit_only"/>
                             <h1><field name="name" required="1"/></h1>
@@ -342,7 +342,7 @@
             <field eval="18" name="priority"/>
             <field name="arch" type="xml">
                 <form string="Users">
-                    <field name="image" readonly="0" widget='image' class="oe_right oe_avatar" options='{"preview_image": "image_64"}'/>
+                    <field name="image_1920" readonly="0" widget='image' class="oe_right oe_avatar" options='{"preview_image": "image_64"}'/>
                     <h1>
                         <field name="name" readonly="1" class="oe_inline"/>
                     </h1>
diff --git a/odoo/addons/test_impex/tests/test_load.py b/odoo/addons/test_impex/tests/test_load.py
index 2765d458a405cec93e85cbb1e92e5af3b61b3e70..e558608c449f976d93f663c6851cd887689f134b 100644
--- a/odoo/addons/test_impex/tests/test_load.py
+++ b/odoo/addons/test_impex/tests/test_load.py
@@ -979,7 +979,7 @@ class test_o2m_multiple(ImporterCase):
 class test_realworld(common.TransactionCase):
     def test_bigfile(self):
         data = json.loads(pkgutil.get_data(self.__module__, 'contacts_big.json').decode('utf-8'))
-        result = self.env['res.partner'].load(['name', 'mobile', 'email', 'image'], data)
+        result = self.env['res.partner'].load(['name', 'mobile', 'email', 'image_1920'], data)
         self.assertFalse(result['messages'])
         self.assertEqual(len(result['ids']), len(data))
 
diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py
index d12072a58a3bc266d2b29c94392e8bfe234bc282..49891ee6fd9f25d6f5ba2a407bea5d2321469fd9 100644
--- a/odoo/addons/test_new_api/tests/test_new_fields.py
+++ b/odoo/addons/test_new_api/tests/test_new_fields.py
@@ -1304,11 +1304,11 @@ class TestFields(common.TransactionCase):
         from odoo.addons.base.tests.test_mimetypes import SVG
         demo_user = self.env.ref('base.user_demo')
         # User demo changes his own avatar
-        demo_user.with_user(demo_user).image = SVG
+        demo_user.with_user(demo_user).image_1920 = SVG
         # The SVG file should have been neutered
         attachment = self.env['ir.attachment'].search([
             ('res_model', '=', demo_user.partner_id._name),
-            ('res_field', '=', 'image'),
+            ('res_field', '=', 'image_1920'),
             ('res_id', '=', demo_user.partner_id.id),
         ])
         self.assertEqual(attachment.mimetype, 'text/plain')