From 9de1bc0eef6f5bfaa2a8d745431caa361ae91548 Mon Sep 17 00:00:00 2001
From: kujiu <kujiu@users.noreply.github.com>
Date: Fri, 22 Jun 2018 21:22:21 +0200
Subject: [PATCH] [IMP] Improve compatibility with screen readers
 (accessibility) (#24574)

Today, Odoo is really tricky to use without seeing the screen, it must be improved to be usable.

This PR forbid to use labels without a "for" attribute, add some title, rule and aria attributes in HTML. With that, Odoo will be fully usable with a screen reader.


* [IMP] Labels must have a for attribute. Improve accessibility.
* [IMP] Better error message when trying to read a missing cached value
* [FIX] Add some aria-label and title attributes for screen readers.
* [FIX] Template name is not included in the error message in case of SyntaxError in QWeb
* [FIX] Improve the Tour failed at step error message to be more explicit.
* [IMP] Add aria-labels
* [FIX] Add missing aria-label on failing test
* [IMP] aria-hidden means hidden. Fix all bad aria-hidden and hide aria-hidden for all.
* [IMP] Color names on kanban views and many2many tags
* [IMP] Add some checks on views for accessibility.
* [IMP] Add `alt` attribute on `img` tags.
* [IMP] Add aria-label and title on non-described icons
* [IMP] Add button role to widgets with btn class
* [IMP] Translate aria and formatted attributes.
* [IMP] Remove wrong aria-labelledby
* [IMP] Add menu role on dropdowns
* [IMP] Buttons must be focusable
* [IMP] Add aria attributes on progress bars
* [IMP] Improve accessibility of basic widgets
* [IMP] Change main layout to more semantic tags
* [IMP] Add menuitem role when missing
* [IMP] Remove wrong role='presentation'
* [IMP] Improve accessibility of tab panels
* [IMP] Add aria-invalid on invalid fields
* [IMP] Add aria-sort on ordered columns
* [IMP] Add role on alerts
* [IMP] Use dialog role, header, main and footer tags for modals
* [IMP] Add labels on o_status
* [IMP] Improve accessibility of kanban view with feeds and articles
* [IMP] Add alerts in case of new messages
* [IMP] Add widget, navigation or img role to aria-labelled items
---
 .../src/xml/account_dashboard_setup_bar.xml   |   10 +-
 .../static/src/xml/account_payment.xml        |    2 +-
 .../static/src/xml/account_reconciliation.xml |   34 +-
 .../static/tests/reconciliation_tests.js      |    8 +-
 addons/account/views/account_invoice_view.xml |   18 +-
 .../views/account_journal_dashboard_view.xml  |   34 +-
 addons/account/views/account_payment_view.xml |    6 +-
 .../views/account_portal_templates.xml        |   14 +-
 addons/account/views/account_view.xml         |   22 +-
 .../views/res_config_settings_views.xml       |   44 +-
 ...count_report_aged_partner_balance_view.xml |    2 +-
 .../wizard/account_unreconcile_view.xml       |    2 +-
 .../wizard/account_validate_move_view.xml     |    2 +-
 .../views/account_analytic_default_view.xml   |    4 +-
 .../views/account_budget_views.xml            |    4 +-
 .../views/account_portal_templates.xml        |    8 +-
 .../auth_oauth/views/auth_oauth_templates.xml |    2 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../views/auth_signup_login_templates.xml     |   18 +-
 addons/auth_signup/views/res_users_views.xml  |    4 +-
 .../static/src/js/barcode_form_view.js        |    2 +-
 addons/barcodes/static/tests/barcode_tests.js |   10 +-
 .../base_gengo/views/ir_translation_views.xml |    2 +-
 .../wizard/base_gengo_translations_view.xml   |    4 +-
 .../static/src/xml/base_import.xml            |    6 +-
 .../tests/test_module/test.xml                |    2 +-
 .../views/base_import_module_view.xml         |    2 +-
 .../views/res_config_settings_views.xml       |   11 +-
 .../views/res_config_settings_views.xml       |    2 +-
 addons/board/static/src/xml/board.xml         |    6 +-
 addons/board/static/tests/dashboard_tests.js  |   16 +-
 .../calendar/static/tests/calendar_tests.js   |   10 +-
 addons/calendar/views/calendar_templates.xml  |    2 +-
 addons/calendar/views/calendar_views.xml      |    2 +-
 addons/crm/data/mail_template_data.xml        |    2 +-
 addons/crm/static/src/js/tour.js              |    4 +-
 addons/crm/views/crm_lead_views.xml           |   22 +-
 addons/crm/views/crm_team_views.xml           |    2 +-
 .../crm/views/res_config_settings_views.xml   |    6 +-
 addons/crm/views/res_partner_views.xml        |    4 +-
 addons/delivery/views/delivery_view.xml       |    6 +-
 .../document/static/tests/document_tests.js   |    2 +-
 addons/event/data/email_template_data.xml     |   24 +-
 addons/event/report/event_event_templates.xml |    8 +-
 addons/event/views/event_views.xml            |   11 +-
 addons/event/wizard/event_confirm_view.xml    |    2 +-
 addons/event_sale/data/event_demo.xml         |    4 +-
 .../fleet/views/fleet_vehicle_model_views.xml |    4 +-
 addons/fleet/views/fleet_vehicle_views.xml    |    6 +-
 addons/gamification/views/badge.xml           |    6 +-
 addons/gamification/views/challenge.xml       |    2 +-
 addons/gamification/views/goal.xml            |    8 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../views/res_config_settings_views.xml       |    4 +-
 addons/hr/views/hr_views.xml                  |   30 +-
 addons/hr/views/res_config_settings_views.xml |    2 +-
 .../report/hr_employee_badge.xml              |    4 +-
 .../static/src/xml/attendance.xml             |   28 +-
 .../views/hr_attendance_view.xml              |    4 +-
 .../hr_attendance/views/hr_employee_view.xml  |   14 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../hr_contract/views/hr_contract_views.xml   |   10 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../hr_holidays/report/hr_leave_reports.xml   |    2 +-
 .../views/hr_leave_allocation_views.xml       |    3 +-
 .../views/maintenance_views.xml               |    2 +-
 .../static/src/xml/hr_org_chart.xml           |    6 +-
 .../views/res_config_settings_views.xml       |    2 +-
 ...hr_payroll_payslips_by_employees_views.xml |    2 +-
 .../data/hr_recruitment_data.xml              |    4 +-
 addons/hr_recruitment/views/hr_job_views.xml  |   20 +-
 .../views/hr_recruitment_views.xml            |   18 +-
 .../views/res_config_settings_views.xml       |    4 +-
 .../hr_timesheet/views/hr_timesheet_views.xml |    4 +-
 addons/hr_timesheet/views/project_views.xml   |    2 +-
 addons/iap/static/src/xml/iap_templates.xml   |    4 +-
 .../static/src/xml/copy_clipboard.xml         |    4 +-
 .../static/src/xml/im_livechat_backend.xml    |    3 +-
 .../views/im_livechat_channel_views.xml       |   16 +-
 .../views/l10n_be_hr_payroll_view.xml         |    4 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../views/res_config_settings_views.xml       |    4 +-
 .../hr_salary_employee_bymonth_view.xml       |    2 +-
 .../wizard/hr_yearly_salary_detail_view.xml   |    2 +-
 addons/lunch/static/src/xml/lunch.xml         |    3 +-
 addons/lunch/views/lunch_views.xml            |   38 +-
 addons/mail/static/src/xml/activity.xml       |   26 +-
 addons/mail/static/src/xml/chat_window.xml    |   12 +-
 addons/mail/static/src/xml/chatter.xml        |    8 +-
 addons/mail/static/src/xml/composer.xml       |   24 +-
 addons/mail/static/src/xml/discuss.xml        |   42 +-
 .../static/src/xml/extended_chat_window.xml   |    2 +-
 addons/mail/static/src/xml/followers.xml      |   32 +-
 addons/mail/static/src/xml/systray.xml        |   25 +-
 addons/mail/static/src/xml/thread.xml         |   70 +-
 .../static/src/xml/web_kanban_activity.xml    |   32 +-
 addons/mail/static/tests/chatter_tests.js     |   36 +-
 .../static/tests/discuss_moderation_tests.js  |    2 +-
 addons/mail/views/mail_channel_views.xml      |    4 +-
 addons/mail/views/mail_message_views.xml      |    2 +-
 .../mail/views/res_config_settings_views.xml  |    2 +-
 .../mail/wizard/mail_resend_message_views.xml |    2 +-
 .../maintenance/views/maintenance_views.xml   |   58 +-
 .../mass_mailing/data/mass_mailing_demo.xml   |    4 +-
 .../static/src/xml/mass_mailing.xml           |   12 +-
 .../mass_mailing/views/editor_field_html.xml  |    2 +-
 .../views/mass_mailing_stats_views.xml        |    2 +-
 .../mass_mailing/views/mass_mailing_views.xml |   36 +-
 addons/mass_mailing/views/snippets_themes.xml |   52 +-
 .../views/snippets_themes_options.xml         |    4 +-
 addons/membership/views/product_views.xml     |    4 +-
 .../mrp/report/mrp_production_templates.xml   |    4 +-
 .../mrp/report/mrp_report_bom_structure.xml   |    6 +-
 addons/mrp/views/ir_attachment_view.xml       |    2 +-
 addons/mrp/views/mrp_bom_views.xml            |    4 +-
 addons/mrp/views/mrp_workcenter_views.xml     |   25 +-
 addons/mrp/views/mrp_workorder_views.xml      |    8 +-
 .../mrp/views/res_config_settings_views.xml   |    2 +-
 addons/mrp/views/stock_picking_views.xml      |   22 +-
 addons/note/static/src/xml/systray.xml        |    8 +-
 addons/note/views/note_views.xml              |   14 +-
 addons/pad/static/src/xml/pad.xml             |    2 +-
 addons/pad/static/tests/pad_tests.js          |    4 +-
 addons/payment/data/payment_acquirer_data.xml |   48 +-
 addons/payment/static/src/js/payment_form.js  |    8 +-
 .../views/payment_portal_templates.xml        |   24 +-
 addons/payment/views/payment_templates.xml    |    8 +-
 addons/payment/views/payment_views.xml        |    2 +-
 .../static/src/xml/stripe_templates.xml       |   18 +-
 addons/point_of_sale/static/src/js/screens.js |   11 +
 addons/point_of_sale/static/src/xml/pos.xml   |  218 +-
 .../views/point_of_sale_dashboard.xml         |   16 +-
 .../point_of_sale/views/pos_category_view.xml |    2 +-
 .../point_of_sale/views/pos_config_view.xml   |    6 +-
 addons/point_of_sale/views/pos_order_view.xml |    2 +-
 .../point_of_sale/views/pos_session_view.xml  |    2 +-
 addons/point_of_sale/views/pos_templates.xml  |    2 +-
 .../point_of_sale/views/report_userlabel.xml  |    2 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../point_of_sale/views/res_partner_view.xml  |    2 +-
 .../wizard/pos_open_statement.xml             |    2 +-
 .../portal/static/src/xml/portal_chatter.xml  |    8 +-
 .../static/src/xml/portal_signature.xml       |    4 +-
 addons/portal/views/portal_templates.xml      |   13 +-
 .../static/src/xml/discount_templates.xml     |    2 +-
 .../static/src/xml/pos_mercury.xml            |    2 +-
 .../views/pos_config_setting_views.xml        |    2 +-
 addons/pos_reprint/static/src/xml/reprint.xml |    5 +-
 .../pos_restaurant/static/src/xml/floors.xml  |   64 +-
 .../static/src/xml/multiprint.xml             |    3 +-
 .../pos_restaurant/static/src/xml/notes.xml   |    4 +-
 .../static/src/xml/printbill.xml              |   13 +-
 .../static/src/xml/splitbill.xml              |    8 +-
 .../pos_restaurant/views/pos_config_views.xml |   12 +-
 .../report/product_product_templates.xml      |    6 +-
 .../product/views/product_pricelist_views.xml |    4 +-
 .../product/views/product_template_views.xml  |    2 +-
 addons/product/views/product_views.xml        |    2 +-
 .../data/product_demo.xml                     |    4 +-
 .../data/project_mail_template_data.xml       |    2 +-
 addons/project/static/src/js/tour.js          |    2 +-
 addons/project/static/src/xml/project.xml     |    2 +-
 addons/project/static/tests/project_tests.js  |    6 +-
 .../views/project_portal_templates.xml        |    6 +-
 .../views/project_rating_templates.xml        |   29 +-
 addons/project/views/project_views.xml        |   64 +-
 addons/purchase/views/portal_templates.xml    |    4 +-
 addons/purchase/views/purchase_views.xml      |    6 +-
 .../views/res_config_settings_views.xml       |    4 +-
 addons/purchase/views/res_partner_views.xml   |    2 +-
 .../views/purchase_requisition_views.xml      |    2 +-
 addons/purchase_stock/data/mail_data.xml      |    2 +-
 addons/rating/views/rating_template.xml       |    6 +-
 addons/rating/views/rating_view.xml           |    4 +-
 addons/repair/wizard/repair_cancel_views.xml  |    2 +-
 .../sale/views/res_config_settings_views.xml  |    4 +-
 addons/sale/views/res_partner_views.xml       |    2 +-
 addons/sale/views/sale_portal_templates.xml   |   30 +-
 .../sale_make_invoice_advance_views.xml       |    4 +-
 addons/sale_management/static/src/js/tour.js  |    7 +-
 .../views/sale_portal_templates.xml           |   12 +-
 addons/sale_stock/static/src/js/tour.js       |    6 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../views/sale_stock_portal_template.xml      |   10 +-
 .../views/stock_config_settings_views.xml     |    4 +-
 addons/sale_stock/views/stock_views.xml       |    4 +-
 .../views/hr_timesheet_templates.xml          |    2 +-
 .../views/res_config_settings_views.xml       |    2 +-
 addons/sales_team/views/crm_team_views.xml    |    4 +-
 .../sales_team/views/sales_team_dashboard.xml |   18 +-
 addons/sms/static/src/xml/sms_widget.xml      |    2 +-
 addons/sms/views/res_partner_views.xml        |    4 +
 .../stock/report/report_location_barcode.xml  |    2 +-
 addons/stock/report/report_lot_barcode.xml    |    6 +-
 .../stock/report/report_package_barcode.xml   |    4 +-
 .../report/report_stockpicking_operations.xml |   12 +-
 .../xml/stock_traceability_report_backend.xml |   12 +-
 .../xml/stock_traceability_report_line.xml    |    6 +-
 .../stock/views/report_stock_traceability.xml |    4 +-
 addons/stock/views/stock_inventory_views.xml  |    2 +-
 addons/stock/views/stock_move_views.xml       |    2 +-
 addons/stock/views/stock_picking_views.xml    |   24 +-
 addons/stock/views/stock_scrap_views.xml      |    2 +-
 addons/stock/views/stock_template.xml         |    2 +-
 .../views/stock_account_views.xml             |    2 +-
 .../views/stock_landed_cost_views.xml         |    2 +-
 .../views/stock_picking_batch_views.xml       |    2 +-
 addons/survey/views/survey_result.xml         |   65 +-
 addons/survey/views/survey_templates.xml      |   22 +-
 addons/survey/views/survey_views.xml          |   44 +-
 .../views/theme_bootswatch_templates.xml      |   10 +-
 .../views/theme_default_templates.xml         |   12 +-
 .../fontawesome/css/font-awesome-suffix.css   | 2145 +++++++++++++++++
 addons/web/static/lib/pdfjs/web/ui_utils.js   |    6 +
 .../static/lib/qweb/qweb-test-attributes.xml  |    4 +-
 addons/web/static/lib/qweb/qweb2.js           |    4 +-
 addons/web/static/src/js/core/dialog.js       |   31 +-
 .../static/src/js/fields/abstract_field.js    |    2 +
 .../web/static/src/js/fields/basic_fields.js  |   22 +-
 .../static/src/js/fields/relational_fields.js |    2 +-
 .../src/js/views/basic/basic_renderer.js      |    1 +
 .../views/kanban/kanban_column_progressbar.js |    3 +
 .../kanban/kanban_column_quick_create.js      |    2 +-
 .../src/js/views/kanban/kanban_record.js      |   31 +-
 .../kanban/kanban_record_quick_create.js      |    2 +-
 .../js/views/list/list_editable_renderer.js   |    6 +-
 .../static/src/js/views/list/list_renderer.js |    4 +
 .../src/js/views/pivot/pivot_renderer.js      |    5 +
 .../static/src/js/widgets/change_password.js  |    2 +-
 .../static/src/js/widgets/debug_manager.js    |    2 +-
 .../src/js/widgets/domain_selector_dialog.js  |    2 +-
 addons/web/static/src/scss/ui.scss            |    4 +
 addons/web/static/src/scss/utils.scss         |    8 +
 addons/web/static/src/xml/base.xml            |  414 ++--
 addons/web/static/src/xml/dialog.xml          |   12 +-
 addons/web/static/src/xml/kanban.xml          |   43 +-
 addons/web/static/src/xml/web_calendar.xml    |   18 +-
 .../tests/chrome/action_manager_tests.js      |   18 +-
 .../static/tests/fields/basic_fields_tests.js |   10 +-
 .../tests/fields/relational_fields_tests.js   |  508 ++--
 .../tests/fields/upgrade_fields_tests.js      |    2 +-
 .../services/notification_service_tests.js    |    6 +-
 .../web/static/tests/views/calendar_tests.js  |  104 +-
 addons/web/static/tests/views/form_tests.js   |  184 +-
 addons/web/static/tests/views/kanban_tests.js |   62 +-
 addons/web/static/tests/views/list_tests.js   |   16 +-
 .../static/tests/views/view_dialogs_tests.js  |   14 +-
 .../static/tests/widgets/data_export_tests.js |   28 +-
 addons/web/views/database_manager.html        |    1 +
 addons/web/views/report_templates.xml         |   17 +-
 addons/web/views/webclient_templates.xml      |   50 +-
 .../web_diagram/static/tests/diagram_tests.js |   22 +-
 .../static/lib/summernote/src/js/Renderer.js  |   14 +-
 .../static/src/js/backend/fields.js           |    2 +-
 addons/web_editor/static/src/js/tours/rte.js  |    8 +-
 .../static/src/js/widgets/widgets.js          |    2 +-
 addons/web_editor/static/src/xml/ace.xml      |    6 +-
 addons/web_editor/static/src/xml/backend.xml  |    4 +-
 addons/web_editor/static/src/xml/editor.xml   |   65 +-
 addons/web_editor/static/src/xml/snippets.xml |   18 +-
 addons/web_editor/views/snippets.xml          |    2 +-
 .../static/src/xml/dashboard.xml              |   32 +-
 addons/web_tour/static/src/js/tour_manager.js |   16 +-
 .../web_tour/static/src/xml/debug_manager.xml |    2 +-
 addons/website/data/website_data.xml          |    2 +-
 addons/website/data/website_demo.xml          |   12 +-
 .../src/js/content/snippets.animation.js      |    2 +-
 .../website/static/src/js/menu/mobile_view.js |    2 +-
 addons/website/static/src/js/tours/rte.js     |   12 +-
 .../static/src/xml/website.backend.xml        |    2 +-
 .../static/src/xml/website.contentMenu.xml    |   10 +-
 .../static/src/xml/website.facebook_page.xml  |    4 +-
 .../static/src/xml/website.gallery.xml        |   18 +-
 .../static/src/xml/website.pageProperties.xml |   18 +-
 addons/website/static/src/xml/website.seo.xml |    2 +-
 .../website/static/src/xml/website.share.xml  |    2 +-
 addons/website/static/src/xml/website.xml     |   18 +-
 .../views/res_config_settings_views.xml       |    6 +-
 addons/website/views/snippets.xml             |  244 +-
 .../views/website_navbar_templates.xml        |   42 +-
 addons/website/views/website_templates.xml    |   78 +-
 addons/website/views/website_views.xml        |    4 +-
 .../website_blog/data/website_blog_demo.xml   |    6 +-
 .../static/src/js/website.tour.blog.js        |    8 +-
 addons/website_blog/views/snippets.xml        |   34 +-
 .../views/website_blog_templates.xml          |   56 +-
 .../website_blog/views/website_blog_views.xml |    4 +-
 .../views/website_crm_templates.xml           |    8 +-
 .../website_crm_partner_assign_templates.xml  |  124 +-
 .../views/website_customer_templates.xml      |   12 +-
 .../static/src/js/website.tour.event.js       |    6 +-
 .../static/src/js/website_event.js            |    2 +-
 .../website_event/views/event_templates.xml   |   77 +-
 .../views/event_templates.xml                 |    2 +-
 .../views/event_track_templates.xml           |    2 +-
 .../views/event_track_views.xml               |   14 +-
 .../static/src/xml/website_form.xml           |    6 +-
 .../static/src/js/website_tour_forum.js       |    6 +-
 .../src/xml/website_forum_share_templates.xml |   21 +-
 addons/website_forum/views/ir_qweb.xml        |    6 +-
 addons/website_forum/views/website_forum.xml  |  191 +-
 addons/website_forum_doc/views/doc.xml        |   12 +-
 .../website_forum_doc/views/website_doc.xml   |    6 +-
 .../static/src/xml/website.gengo.xml          |   82 +-
 .../website_hr/views/website_hr_templates.xml |    2 +-
 .../data/hr_job_demo.xml                      |   56 +-
 .../website_hr_recruitment_templates.xml      |   52 +-
 .../views/website_hr_recuitment_snippets.xml  |   24 +-
 .../static/src/xml/recent_link.xml            |   10 +-
 .../views/website_links_graphs.xml            |   16 +-
 .../views/website_links_template.xml          |   12 +-
 .../views/res_config_settings_views.xml       |    2 +-
 .../views/website_livechat.xml                |    6 +-
 .../website_mail/data/mail_channel_data.xml   |    2 +-
 .../website_mail_channel/views/snippets.xml   |    8 +-
 .../views/website_mail_channel_templates.xml  |   44 +-
 .../views/snippets_templates.xml              |   26 +-
 .../views/unsubscribe_templates.xml           |    6 +-
 .../views/website_membership_templates.xml    |   10 +-
 .../website_quote/data/website_quote_demo.xml |   26 +-
 .../views/website_quote_templates.xml         |  146 +-
 .../static/src/xml/website_mail.xml           |   18 +-
 addons/website_sale/data/demo.xml             |   36 +-
 .../website_sale/data/mail_template_data.xml  |    2 +-
 .../static/src/js/website_sale_tour_shop.js   |    8 +-
 addons/website_sale/views/product_views.xml   |    2 +-
 .../views/res_config_settings_views.xml       |   12 +-
 addons/website_sale/views/snippets.xml        |   20 +-
 addons/website_sale/views/templates.xml       |  134 +-
 .../static/src/xml/comparison.xml             |   10 +-
 .../website_sale_comparison_template.xml      |   16 +-
 .../views/website_sale_digital.xml            |    4 +-
 .../xml/website_sale_dashboard_utm_chart.xml  |    8 +-
 .../static/src/js/website_sale.test.js        |    2 +-
 .../views/website_sale_options_templates.xml  |   28 +-
 ...ebsite_sale_stock_product_availability.xml |    4 +-
 .../views/website_sale_stock_templates.xml    |    8 +-
 .../views/website_sale_wishlist_template.xml  |   15 +-
 .../static/src/js/slides_upload.js            |    4 +-
 .../static/src/xml/website_slides.xml         |   24 +-
 .../views/res_config_settings_views.xml       |    7 +-
 .../website_slides/views/website_slides.xml   |  124 +-
 .../views/website_slides_backend.xml          |    2 +-
 .../views/website_slides_embed.xml            |   34 +-
 addons/website_theme_install/views/views.xml  |    8 +-
 .../static/src/xml/website.twitter.xml        |    6 +-
 .../views/res_config_settings_views.xml       |    4 +-
 odoo/addons/base/models/ir_ui_view.py         |    7 +-
 odoo/addons/base/rng/common.rng               |    3 +
 .../addons/base/tests/test_view_validation.py |   75 +-
 odoo/addons/base/views/ir_module_views.xml    |    2 +-
 .../base/views/ir_qweb_widget_templates.xml   |   14 +-
 odoo/addons/base/views/ir_rule_views.xml      |    2 +-
 odoo/addons/base/views/ir_sequence_views.xml  |   22 +-
 odoo/addons/base/views/res_company_views.xml  |    4 +-
 .../base/views/res_config_settings_views.xml  |    2 +-
 odoo/addons/base/views/res_partner_views.xml  |   22 +-
 odoo/addons/base/views/res_users_views.xml    |   12 +-
 .../wizard/base_language_install_views.xml    |    4 +-
 .../wizard/base_module_uninstall_views.xml    |    2 +-
 .../base/wizard/base_module_update_views.xml  |    2 +-
 .../base/wizard/base_module_upgrade_views.xml |    4 +-
 odoo/addons/test_exceptions/view.xml          |   46 +-
 .../test_main_flows/static/src/js/tour.js     |   46 +-
 .../test_new_api/static/tests/x2many.js       |   32 +-
 odoo/api.py                                   |    7 +-
 odoo/exceptions.py                            |    7 +
 odoo/tools/translate.py                       |    5 +-
 odoo/tools/view_validation.py                 |  242 +-
 370 files changed, 5804 insertions(+), 3218 deletions(-)
 create mode 100644 addons/web/static/lib/fontawesome/css/font-awesome-suffix.css

diff --git a/addons/account/static/src/xml/account_dashboard_setup_bar.xml b/addons/account/static/src/xml/account_dashboard_setup_bar.xml
index 7666753f26b2..8b065bc7829b 100644
--- a/addons/account/static/src/xml/account_dashboard_setup_bar.xml
+++ b/addons/account/static/src/xml/account_dashboard_setup_bar.xml
@@ -6,22 +6,22 @@
             <div class="o_form_statusbar">
                 <div class="o_statusbar_status" data-original-title="" title="" >
                     <button name="setting_chart_of_accounts_action" type="company_object" t-attf-class="btn btn-sm o_arrow_button btn-default account_setup_dashboard_action #{values['chart_of_accounts'] and 'o_action_done' or ''}" >
-                        <i class="fa fa-check" t-if="values['chart_of_accounts']"/>
+                        <i class="fa fa-check" t-if="values['chart_of_accounts']" role="img" aria-label="Current state" title="Current state" aria-current="step"/>
                         <b class="o_account_dashboard_index">4</b>
                         Chart of Accounts
                     </button>
                     <button name="setting_init_fiscal_year_action" type="company_object" t-attf-class="btn btn-sm o_arrow_button btn-default account_setup_dashboard_action #{values['fiscal_year'] and 'o_action_done' or ''}">
-                        <i class="fa fa-check" t-if="values['fiscal_year']"/>
+                        <i class="fa fa-check" t-if="values['fiscal_year']" role="img" aria-label="Current state" title="Current state" aria-current="step"/>
                         <b class="o_account_dashboard_index">3</b>
                         Fiscal Year
                     </button>
                     <button name="setting_init_bank_account_action" type="company_object" t-attf-class="btn btn-sm o_arrow_button btn-default account_setup_dashboard_action #{values['bank'] and 'o_action_done' or ''}">
-                        <i class="fa fa-check" t-if="values['bank']"/>
+                        <i class="fa fa-check" t-if="values['bank']" role="img" aria-label="Current state" title="Current state" aria-current="step"/>
                         <b class="o_account_dashboard_index">2</b>
                         Add a Bank Account
                     </button>
                     <button name="setting_init_company_action" type="company_object" t-attf-class="btn btn-sm o_arrow_button btn-default account_setup_dashboard_action #{values['company'] and 'o_action_done' or ''}">
-                        <i class="fa fa-check" t-if="values['company']"/>
+                        <i class="fa fa-check" t-if="values['company']" role="img" aria-label="Current state" title="Current state" aria-current="step"/>
                         <b class="o_account_dashboard_index">1</b>
                         Company Data
                     </button>
@@ -29,7 +29,7 @@
                     <h4 class="text-muted">Configuration Steps</h4>
                 </div>
                 <div class="pull-right" style="padding: 7px 0;">
-                    <button aria-hidden="true" data-dismiss="modal" type="company_object" name="setting_hide_setup_bar" class="account_setup_dashboard_action close">×</button>
+                    <button aria-label="Hide setup bar" data-dismiss="modal" type="company_object" name="setting_hide_setup_bar" class="account_setup_dashboard_action close">×</button>
                 </div>
             </div>
         </div>
diff --git a/addons/account/static/src/xml/account_payment.xml b/addons/account/static/src/xml/account_payment.xml
index 0a8abf28d725..27fc4044f241 100644
--- a/addons/account/static/src/xml/account_payment.xml
+++ b/addons/account/static/src/xml/account_payment.xml
@@ -22,7 +22,7 @@
                     </t>
                     <t t-if="!outstanding">
                         <td>
-                            <a role="button" tabindex="0" class="js_payment_info fa fa-info-circle" t-att-index="line.index" style="margin-right:5px;"></a>
+                            <a role="button" tabindex="0" class="js_payment_info fa fa-info-circle" t-att-index="line.index" style="margin-right:5px;" aria-label="Info" title="Info"></a>
                         </td>
                         <td>
                             <i class="o_field_widget text-right o_payment_label">Paid on <t t-esc="line.date"></t></i>
diff --git a/addons/account/static/src/xml/account_reconciliation.xml b/addons/account/static/src/xml/account_reconciliation.xml
index a367feb03c02..0183aecebc7c 100644
--- a/addons/account/static/src/xml/account_reconciliation.xml
+++ b/addons/account/static/src/xml/account_reconciliation.xml
@@ -81,7 +81,7 @@
             </caption>
             <thead>
                 <tr>
-                    <td class="cell_action"><span class="toggle_match fa fa-cog"></span></td>
+                    <td class="cell_action"><span class="toggle_match fa fa-cog" aria-label="Settings" role="img" title="Settings"></span></td>
                     <td class="cell_account_code"><t t-esc="state.st_line.account_code"/></td>
                     <td class="cell_due_date"><t t-esc="state.st_line.date"/></td>
                     <td class="cell_label"><t t-if="state.st_line.name" t-esc="state.st_line.name"/> <t t-if="state.st_line.amount_currency_str"> (<t t-esc="state.st_line.amount_currency_str"/>)</t></td>
@@ -120,7 +120,7 @@
     </t>
     <t t-jquery=".accounting_view thead tr" t-operation="replace">
         <tr>
-            <td class="cell_action"><span class="toggle_match fa fa-cog"></span></td>
+            <td class="cell_action"><span class="toggle_match fa fa-cog" aria-label="Settings" role="img" title="Settings"></span></td>
             <td colspan="3"><span/><span t-if="state.last_time_entries_checked">Last Reconciliation: <t t-esc="state.last_time_entries_checked"/></span></td>
             <td colspan="2"><t t-esc="state.st_line.account_code"/></td>
             <td class="cell_info_popover"></td>
@@ -130,12 +130,12 @@
 
 <t t-name="reconciliation.line.balance">
     <tr t-if="state.balance.amount_currency &amp;&amp; !(state.reconciliation_proposition[0] || {}).partial_reconcile">
-        <td class="cell_action"><span class="toggle_create fa fa-play"></span></td>
+        <td class="cell_action"><span role="img" class="toggle_create fa fa-play" aria-label="Run" title="Run"></span></td>
         <td class="cell_account_code"><t t-esc="state.balance.account_code"/></td>
         <td class="cell_due_date"></td>
         <td class="cell_label"><t t-if="state.balance.amount_currency &lt; 0">Create Write-off</t><t t-elif="state.st_line.partner_id">Open balance</t><t t-else="">Choose counterpart</t></td>
-        <td class="cell_left"><t t-if="state.balance.amount_currency &lt; 0"><span t-if="state.balance.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{state.balance.currency_id%8} line_info_button fa fa-money" t-att-data-content="state.balance.amount_currency_str"/><t t-raw="state.balance.amount_str"/></t></td>
-        <td class="cell_right"><t t-if="state.balance.amount_currency &gt; 0"><span t-if="state.balance.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{state.balance.currency_id%8} line_info_button fa fa-money" t-att-data-content="state.balance.amount_currency_str"/><t t-raw="state.balance.amount_str"/></t></td>
+        <td class="cell_left"><t t-if="state.balance.amount_currency &lt; 0"><span role="img" t-if="state.balance.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{state.balance.currency_id%8} line_info_button fa fa-money" t-att-data-content="state.balance.amount_currency_str" t-att-aria-label="state.balance.amount_currency_str" t-att-title="state.balance.amount_currency_str"/><t t-raw="state.balance.amount_str"/></t></td>
+        <td class="cell_right"><t t-if="state.balance.amount_currency &gt; 0"><span role="img" t-if="state.balance.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{state.balance.currency_id%8} line_info_button fa fa-money" t-att-data-content="state.balance.amount_currency_str" t-att-aria-label="state.balance.amount_currency_str" t-att-title="state.balance.amount_currency_str"/><t t-raw="state.balance.amount_str"/></t></td>
         <td class="cell_info_popover"></td>
     </tr>
 </t>
@@ -144,8 +144,8 @@
 <div t-name="reconciliation.line.match">
     <div class="match_controls">
         <input class="filter" placeholder="Filter..." type="text" value=""/>
-        <span class="pull-right fa fa-chevron-right disabled"></span>
-        <span class="pull-right fa fa-chevron-left disabled"></span>
+        <span class="pull-right fa fa-chevron-right disabled" role="img" aria-label="Previous" title="Previous"></span>
+        <span class="pull-right fa fa-chevron-left disabled" role="img" aria-label="Next" title="Next"></span>
     </div>
     <table>
         <tbody>
@@ -163,10 +163,10 @@
             <p t-if="!state.reconcileModels.length" style="color: #bbb;">To speed up reconciliation, define <a style="cursor: pointer;" class="reconcile_model_create">reconciliation models</a>.</p>
         </div>
         <div class="dropdown pull-right">
-            <a data-toggle="dropdown" href="#"><span class="fa fa-cog"/></a>
-            <ul class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="Presets config">
-                <li><a class="reconcile_model_create" href="#">Create model</a></li>
-                <li><a class="reconcile_model_edit" href="#">Modify models</a></li>
+            <a data-toggle="dropdown" href="#"><span class="fa fa-cog" role="img" aria-label="Settings"/></a>
+            <ul class="dropdown-menu dropdown-menu-right" role="menu" aria-label="Presets config">
+                <li><a role="menuitem" class="reconcile_model_create" href="#">Create model</a></li>
+                <li><a role="menuitem" class="reconcile_model_edit" href="#">Modify models</a></li>
             </ul>
         </div>
     </div>
@@ -205,14 +205,14 @@
         </tbody>
     </table>
     <div class="add_line_container">
-        <a class="add_line" t-att-style="!state.balance.amout ? 'display: none;' : null"><i class="fa fa-plus-circle"/> Save and New</a>
+        <a class="add_line fa fa-plus-circle" t-att-style="!state.balance.amout ? 'display: none;' : null">Save and New</a>
     </div>
 </div>
 
 
 <t t-name="reconciliation.line.mv_line">
     <tr t-if="line.display !== false" t-attf-class="mv_line #{line.already_paid ? ' already_reconciled' : ''} #{line.__invalid ? 'invalid' : ''} #{line.is_tax ? 'is_tax' : ''}" t-att-data-line-id="line.id" t-att-data-selected="selected">
-        <td class="cell_action"><span class="fa fa-add-remove"/></td>
+        <td class="cell_action"><span class="fa fa-add-remove" role="img" aria-label="Set" title="Set"/></td>
         <td class="cell_account_code"><t t-esc="line.account_code"/></td>
         <td class="cell_due_date"><t t-esc="line.date_maturity === false ? line.date : line.date_maturity"/></td>
         <td class="cell_label">
@@ -225,8 +225,8 @@
             <t t-if="line.ref &amp;&amp; line.ref.length"> : </t>
             <t t-esc="line.ref"/>
         </td>
-        <td class="cell_left"><t t-if="line.amount &lt; 0"><span t-if="line.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{line.currency_id%8} line_info_button fa fa-money" t-att-data-content="line.amount_currency_str"/><t t-raw="line.amount_str"/></t></td>
-        <td class="cell_right"><t t-if="line.amount &gt; 0"><span t-if="line.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{line.currency_id%8} line_info_button fa fa-money" t-att-data-content="line.amount_currency_str"/><t t-raw="line.amount_str"/></t></td>
+        <td class="cell_left"><t t-if="line.amount &lt; 0"><span role="img" t-if="line.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{line.currency_id%8} line_info_button fa fa-money" t-att-data-content="line.amount_currency_str" t-att-aria-label="line.amount_currency_str" t-att-title="line.amount_currency_str"/><t t-raw="line.amount_str"/></t></td>
+        <td class="cell_right"><t t-if="line.amount &gt; 0"><span role="img" t-if="line.amount_currency_str" t-attf-class="o_multi_currency o_multi_currency_color_#{line.currency_id%8} line_info_button fa fa-money" t-att-data-content="line.amount_currency_str" t-att-aria-label="line.amount_currency_str" t-att-title="line.amount_currency_str"/><t t-raw="line.amount_str"/></t></td>
         <td class="cell_info_popover"></td>
     </tr>
 </t>
@@ -266,10 +266,10 @@
 
 <t t-name="reconciliation.notification">
     <div t-att-class="'notification alert-dismissible alert alert-' + type" role="alert">
-        <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true" class="fa fa-times"></span><span class="sr-only">Close</span></button>
+        <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span title="Close" class="fa fa-times"></span></button>
         <t t-esc="message" />
         <t t-if="details !== undefined">
-            <a class="fa fa-external-link" rel="do_action" href="#"
+            <a class="fa fa-external-link" rel="do_action" href="#" aria-label="External link" title="External link"
                 t-att-data-action_name="details.name"
                 t-att-data-model="details.model"
                 t-att-data-ids="details.ids">
diff --git a/addons/account/static/tests/reconciliation_tests.js b/addons/account/static/tests/reconciliation_tests.js
index 0ef3ec63b6ed..45cbc30d8ea2 100644
--- a/addons/account/static/tests/reconciliation_tests.js
+++ b/addons/account/static/tests/reconciliation_tests.js
@@ -941,11 +941,11 @@ QUnit.module('account', {
 
         // Simulate changing partner with SelectCreateDialog
         widget = clientAction.widgets[1];
-        assert.strictEqual($('.modal').length, 0, "shouldn't have any opened modal");
+        assert.strictEqual($('[role="dialog"]').length, 0, "shouldn't have any opened modal");
         widget.$('.o_input_dropdown input').trigger('click');
         $('.ui-autocomplete .ui-menu-item a:contains(Search More):eq(1)').trigger('mouseenter').trigger('click');
-        assert.strictEqual($('.modal').length, 1, "should open a SelectCreateDialog");
-        $('.modal table.o_list_view td:contains(Camptocamp)').click();
+        assert.strictEqual($('[role="dialog"]').length, 1, "should open a SelectCreateDialog");
+        $('[role="dialog"] table.o_list_view td:contains(Camptocamp)').click();
         assert.strictEqual(widget.$('.o_input_dropdown input').val(), "Camptocamp", "the partner many2one should display Camptocamp");
 
         widget = clientAction.widgets[2];
@@ -1100,7 +1100,7 @@ QUnit.module('account', {
         widget.$('.create .create_account_id input').trigger('click');
         $('.ui-autocomplete .ui-menu-item a:contains(Search)').trigger('mouseenter').trigger('click');
         // select the account who does not appear in the drop drown
-        $('.modal tr.o_data_row:contains(502)').click();
+        $('[role="dialog"] tr.o_data_row:contains(502)').click();
         assert.strictEqual(widget.$('.create .create_account_id input').val(), "101200 Account Receivable", "Selected account does not change");
         // wait the name_get to render the changes
         def.resolve();
diff --git a/addons/account/views/account_invoice_view.xml b/addons/account/views/account_invoice_view.xml
index 8345b94ac582..8a587a3c7ff4 100644
--- a/addons/account/views/account_invoice_view.xml
+++ b/addons/account/views/account_invoice_view.xml
@@ -235,11 +235,11 @@
                 <field name="has_outstanding" invisible="1"/>
                 <sheet string="Vendor Bill">
                     <div>
-                        <label string="Draft Bill" attrs="{'invisible': ['|',('state','!=','draft'), ('type','!=','in_invoice')]}"/>
-                        <label string="- First Number:" attrs="{'invisible': [('sequence_number_next_prefix','=',False)]}"/>
-                        <label string="Draft Credit Note" attrs="{'invisible': ['|',('state','!=','draft'), ('type','!=','in_refund')]}"/>
-                        <label string="Bill " attrs="{'invisible': ['|',('state', '=', 'draft'), ('type','!=','in_invoice')]}"/>
-                        <label string="Credit Note " attrs="{'invisible': ['|',('state', '=', 'draft'), ('type','!=','in_refund')]}"/>
+                        <span class="o_form_label" attrs="{'invisible': ['|',('state','!=','draft'), ('type','!=','in_invoice')]}">Draft Bill</span>
+                        <span class="o_form_label" attrs="{'invisible': [('sequence_number_next_prefix','=',False)]}">- First Number:</span>
+                        <span class="o_form_label" attrs="{'invisible': ['|',('state','!=','draft'), ('type','!=','in_refund')]}">Draft Credit Note</span>
+                        <span class="o_form_label" attrs="{'invisible': ['|',('state', '=', 'draft'), ('type','!=','in_invoice')]}">Bill </span>
+                        <span class="o_form_label" attrs="{'invisible': ['|',('state', '=', 'draft'), ('type','!=','in_refund')]}">Credit Note </span>
                         <h1 class="mt0">
                             <field name="number" class="oe_inline" attrs="{'invisible': [('state', '=', 'draft')]}"/>
                             <div  attrs="{'invisible': [('sequence_number_next_prefix','=',False)]}">
@@ -387,15 +387,15 @@
                 <sheet string="Invoice">
                     <div class="oe_button_box" name="button_box">
                     </div>
-                    <label string="Credit Note" attrs="{'invisible': ['|',('state','=','draft'), ('type','!=','out_refund')]}"/>
+                    <span class="o_form_label"> attrs="{'invisible': ['|',('state','=','draft'), ('type','!=','out_refund')]}">Credit Note</span>
                     <h1 class="mt0">
                         <div attrs="{'invisible': [('sequence_number_next_prefix','!=',False)]}">
-                            <label string="Draft Invoice" attrs="{'invisible': ['|',('state','not in',('draft',)), ('type','!=','out_invoice')]}"/>
-                            <label string="Draft Credit Note" attrs="{'invisible': ['|',('state','not in',('draft',)), ('type','!=','out_refund')]}"/>
+                            <label for="number" string="Draft Invoice" attrs="{'invisible': ['|',('state','not in',('draft',)), ('type','!=','out_invoice')]}"/>
+                            <label for="number" string="Draft Credit Note" attrs="{'invisible': ['|',('state','not in',('draft',)), ('type','!=','out_refund')]}"/>
                             <field name="number" readonly="1" class="oe_inline" attrs="{'invisible': [('state','in',('draft',))]}"/>
                         </div>
                         <div  attrs="{'invisible': [('sequence_number_next_prefix','=',False)]}">
-                            <label string="Invoice Number:"/><br/>
+                            <label for="sequence_number_next_prefix" string="Invoice Number:"/><br/>
                             <field name="sequence_number_next_prefix" class="oe_inline"/>
                             <field name="sequence_number_next" class="oe_inline"/>
                         </div>
diff --git a/addons/account/views/account_journal_dashboard_view.xml b/addons/account/views/account_journal_dashboard_view.xml
index 0c27c8432522..346e7793d1fd 100644
--- a/addons/account/views/account_journal_dashboard_view.xml
+++ b/addons/account/views/account_journal_dashboard_view.xml
@@ -29,7 +29,7 @@
                                     </t>
                                 </div>
                                 <t t-if="journal_type == 'bank' || journal_type == 'cash' || journal_type == 'sale' || journal_type == 'purchase'" t-call="JournalBodyGraph"/>
-                            </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                            </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                 <t t-call="JournalManage"/>
                             </div>
                         </div>
@@ -46,7 +46,7 @@
                                 </div>
                             </div>
                             <div class="o_kanban_manage_button_section">
-                                <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" aria-label="Selection" role="img" title="Selection"/></a>
                             </div>
                         </div>
                     </t>
@@ -57,57 +57,57 @@
                         <div t-if="journal_type == 'bank' || journal_type == 'cash'" class="row">
                              <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_view">
                                 <div class="o_kanban_card_manage_title">
-                                    <span>View</span>
+                                    <span role="separator">View</span>
                                 </div>
                                 <div>
-                                    <a type="object" name="open_action">Statements</a>
+                                    <a role="menuitem" type="object" name="open_action">Statements</a>
                                 </div>
                                 <div>
-                                    <a type="object" name="open_action_with_context" context="{'action_name': 'action_bank_statement_line', 'search_default_journal': True}">Operations</a>
+                                    <a role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_bank_statement_line', 'search_default_journal': True}">Operations</a>
                                 </div>
                                 <div>
-                                    <a type="object" name="open_collect_money">Customer Payments</a>
+                                    <a role="menuitem" type="object" name="open_collect_money">Customer Payments</a>
                                 </div>
                                 <div>
-                                    <a type="object" name="open_spend_money">Vendor Payments</a>
+                                    <a role="menuitem" type="object" name="open_spend_money">Vendor Payments</a>
                                 </div>
                                 <div>
-                                    <a type="object" name="open_transfer_money">Internal Transfers</a>
+                                    <a role="menuitem" type="object" name="open_transfer_money">Internal Transfers</a>
                                 </div>
                                 <div>
-                                    <a type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}" groups="base.group_no_one">Journal Items</a>
+                                    <a role="menuitem" type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}" groups="base.group_no_one">Journal Items</a>
                                 </div>
                             </div>
 
                              <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_new">
                                 <div class="o_kanban_card_manage_title">
-                                    <span>New</span>
+                                    <span role="separator">New</span>
                                 </div>
                                 <div name="bank_cash_commands">
                                     <t t-if="journal_type == 'bank'">
-                                        <a type="object" name="create_bank_statement">Statement</a>
+                                        <a role="menuitem" type="object" name="create_bank_statement">Statement</a>
                                     </t>
                                     <t t-if="journal_type == 'cash'">
-                                        <a type="object" name="create_cash_statement">Statement</a>
+                                        <a role="menuitem" type="object" name="create_cash_statement">Statement</a>
                                     </t>
                                 </div>
                                 <div>
-                                    <a type="object" name="create_customer_payment">Customer Payment</a>
+                                    <a role="menuitem" type="object" name="create_customer_payment">Customer Payment</a>
                                 </div>
                                 <div>
-                                    <a type="object" name="create_supplier_payment">Vendor Payment</a>
+                                    <a role="menuitem" type="object" name="create_supplier_payment">Vendor Payment</a>
                                 </div>
                                 <div>
-                                    <a type="object" name="create_internal_transfer">Internal Transfer</a>
+                                    <a role="menuitem" type="object" name="create_internal_transfer">Internal Transfer</a>
                                 </div>
                             </div>
 
                              <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_reconciliation">
                                 <div class="o_kanban_card_manage_title">
-                                    <span>Reconciliation</span>
+                                    <span role="separator">Reconciliation</span>
                                 </div>
                                 <div>
-                                    <a type="object" name="open_action_with_context" context="{'action_name': 'action_account_reconcile_model', 'use_domain': True}" groups="account.group_account_manager">Reconciliation Models</a>
+                                    <a role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_account_reconcile_model', 'use_domain': True}" groups="account.group_account_manager">Reconciliation Models</a>
                                 </div>
                             </div>
                         </div>
diff --git a/addons/account/views/account_payment_view.xml b/addons/account/views/account_payment_view.xml
index f7a425f174bd..9593f4207e3c 100644
--- a/addons/account/views/account_payment_view.xml
+++ b/addons/account/views/account_payment_view.xml
@@ -57,7 +57,7 @@
                                         <strong><span><field name="name"/></span></strong>
                                     </div>
                                     <div class="col-xs-6 text-right">
-                                        <strong><i class="fa fa-clock-o"/> <t t-esc="record.payment_date.value"/></strong>
+                                        <strong><i class="fa fa-clock-o" role="img" aria-label="Date" title="Date"/> <t t-esc="record.payment_date.value"/></strong>
                                     </div>
                                 </div>
                                 <div class="row">
@@ -272,7 +272,7 @@
                                     <div attrs="{'invisible': [('payment_difference_handling','=','open')]}">
                                         <label for="writeoff_account_id" class="oe_edit_only" string="Post Difference In"/>
                                         <field name="writeoff_account_id" string="Post Difference In" attrs="{'required': [('payment_difference_handling', '=', 'reconcile')]}"/>
-                                        <label string="Journal" attrs="{'invisible': [('amount', '!=', 0)]}"/>
+                                        <label for="journal_id" string="Journal" attrs="{'invisible': [('amount', '!=', 0)]}"/>
                                         <field name="journal_id" string="Journal" widget="selection" attrs="{'invisible': [('amount', '!=', 0)]}"/>
                                         <label for="writeoff_label" class="oe_edit_only" string="Label"/>
                                         <field name="writeoff_label" attrs="{'required': [('payment_difference_handling', '=', 'reconcile')]}"/>
@@ -339,7 +339,7 @@
                                 <div attrs="{'invisible': [('payment_difference_handling','=','open')]}">
                                     <label for="writeoff_account_id" class="oe_edit_only" string="Post Difference In"/>
                                     <field name="writeoff_account_id" string="Post Difference In" attrs="{'required': [('payment_difference_handling', '=', 'reconcile')]}"/>
-                                    <label string="Journal" attrs="{'invisible': [('amount', '!=', 0)]}"/>
+                                    <label for="journal_id" string="Journal" attrs="{'invisible': [('amount', '!=', 0)]}"/>
                                     <field name="journal_id" string="Journal" widget="selection" attrs="{'invisible': [('amount', '!=', 0)]}"/>
                                     <label for="writeoff_label" class="oe_edit_only" string="Label"/>
                                     <field name="writeoff_label" attrs="{'required': [('payment_difference_handling', '=', 'reconcile')]}"/>
diff --git a/addons/account/views/account_portal_templates.xml b/addons/account/views/account_portal_templates.xml
index 21ac38d693ea..6e49a4c8d46f 100644
--- a/addons/account/views/account_portal_templates.xml
+++ b/addons/account/views/account_portal_templates.xml
@@ -48,13 +48,13 @@
                         <td class='hidden-xs'><span t-field="invoice.date_due"/></td>
                         <td class="tx_status">
                             <t t-if="invoice.state == 'open'">
-                                <span class="label label-info"><i class="fa fa-fw fa-clock-o"></i><span class="hidden-xs"> Waiting for Payment</span></span>
+                                <span class="label label-info"><i class="fa fa-fw fa-clock-o" aria-label="Opened" title="Opened" role="img"></i><span class="hidden-xs"> Waiting for Payment</span></span>
                             </t>
                             <t t-if="invoice.state == 'paid'">
-                                <span class="label label-default"><i class="fa fa-fw fa-check"></i><span class="hidden-xs"> Paid</span></span>
+                                <span class="label label-default"><i class="fa fa-fw fa-check" aria-label="Paid" title="Paid" role="img"></i><span class="hidden-xs"> Paid</span></span>
                             </t>
                             <t t-if="invoice.state == 'cancel'">
-                                <span class="label label-default"><i class="fa fa-fw fa-remove"></i><span class="hidden-xs"> Cancelled</span></span>
+                                <span class="label label-default"><i class="fa fa-fw fa-remove" aria-label="Cancelled" title="Cancelled" role="img"></i><span class="hidden-xs"> Cancelled</span></span>
                             </t>
                         </td>
                         <td><span t-esc="-invoice.residual if invoice.type == 'out_refund' else invoice.residual" t-options='{"widget": "monetary", "display_currency": invoice.currency_id}'/></td>
@@ -93,8 +93,8 @@
                         <div class="pb8 ml16 mr16 container">
                             <t t-if="invoice.user_id">
                                 <div><strong>Your Contact:</strong></div>
-                                <img class="img-circle mr4 pull-left o_portal_contact_img" t-if="invoice.user_id.image" t-attf-src="data:image/png;base64,#{invoice.user_id.image}"/>
-                                <img class="img-circle mr4 pull-left o_portal_contact_img" t-if="not invoice.user_id.image" src="/web/static/src/img/placeholder.png"/>
+                                <img class="img-circle mr4 pull-left o_portal_contact_img" t-if="invoice.user_id.image" t-attf-src="data:image/png;base64,#{invoice.user_id.image}" alt="Contact"/>
+                                <img class="img-circle mr4 pull-left o_portal_contact_img" t-if="not invoice.user_id.image" src="/web/static/src/img/placeholder.png" alt="Contact"/>
                                 <span t-field="invoice.user_id" t-field-options='{"widget": "contact", "fields": ["name", "phone"], "no_marker": True}'/>
                                 <a data-toggle="modal" href="#" data-target="#invoice_chatter">Contact us</a>
                             </t>
@@ -142,7 +142,7 @@
 
     <template id="portal_invoice_error" name="Invoice error/warning display">
         <div class="row mr16">
-            <div t-attf-class="'col-md-12 mr16 ml16 alert alert-dismissable' #{'alert-danger' if error else 'alert-warning'}">
+            <div t-attf-class="'col-md-12 mr16 ml16 alert alert-dismissable' #{'alert-danger' if error else 'alert-warning'}" role="alert">
                 <a href="#" class="close" data-dismiss="alert" aria-label="close" title="close">×</a>
                 <t t-if="error == 'generic'" name="generic">
                     There was an error processing this page.
@@ -153,7 +153,7 @@
 
     <template id="portal_invoice_success" name="Invoice success display">
         <div class="row mr16">
-            <div class="col-md-12 mr16 ml16 alert alert-dismissable alert-success">
+            <div class="col-md-12 mr16 ml16 alert alert-dismissable alert-success" role="status">
                 <a href="#" class="close" data-dismiss="alert" aria-label="close" title="close">×</a>
             </div>
         </div>
diff --git a/addons/account/views/account_view.xml b/addons/account/views/account_view.xml
index 7213ed5870c2..63108d2edc5c 100644
--- a/addons/account/views/account_view.xml
+++ b/addons/account/views/account_view.xml
@@ -345,7 +345,7 @@
                                         <field name="loss_account_id"/>
                                     </group>
                                     <group name="group_alias" string="Email your Vendor Bills" attrs="{'invisible': [('type', '!=',  'purchase')]}">
-                                        <label string="Email Alias" attrs="{'invisible': [('alias_domain', '=', False)]}"/>
+                                        <label string="Email Alias" attrs="{'invisible': [('alias_domain', '=', False)]}" for="alias_id"/>
                                         <div name="alias_def" attrs="{'invisible': [('alias_domain', '=', False)]}">
                                             <field name="alias_id" class="oe_read_only oe_inline"/>
                                             <div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;" >
@@ -353,7 +353,7 @@
                                             </div>
                                         </div>
                                         <div class="content-group" attrs="{'invisible': [('alias_domain', '!=', False)]}">
-                                            <a type='action' name='%(action_open_settings)d' class="btn btn-sm btn-link"><i class="fa fa-fw o_button_icon fa-arrow-right"/> Configure Email Servers</a>
+                                            <a type='action' name='%(action_open_settings)d' class="btn btn-sm btn-link" role="button"><span class="fa fa-fw o_button_icon fa-arrow-right"> Configure Email Servers</span></a>
                                     </div>
                                     </group>
                                 </group>
@@ -860,7 +860,7 @@
                                 <label for="amount"/>
                                 <div>
                                     <field name="amount" class="oe_inline"/>
-                                    <label string="%" class="oe_inline" attrs="{'invisible':[('amount_type','!=','percentage')]}" />
+                                    <span class="o_form_label oe_inline" attrs="{'invisible':[('amount_type','!=','percentage')]}">%</span>
                                 </div>
                                 <field name="journal_id" domain="[('company_id', '=', company_id)]" widget="selection"/>
                             </group>
@@ -882,7 +882,7 @@
                                 <label for="second_amount" string="Amount"/>
                                 <div>
                                     <field name="second_amount" class="oe_inline"/>
-                                    <label string="%" class="oe_inline" attrs="{'invisible':[('amount_type','!=','percentage')]}" />
+                                    <span class="o_form_label oe_inline" attrs="{'invisible':[('amount_type','!=','percentage')]}">%</span>
                                 </div>
                                 <field name="second_journal_id" string="Journal" domain="[('company_id', '=', company_id)]" widget="selection"/>
                             </group>
@@ -1105,7 +1105,7 @@
                                     <label for="amount" attrs="{'invisible':[('amount_type','not in', ('fixed', 'percent', 'division'))]}"/>
                                     <div attrs="{'invisible':[('amount_type','not in', ('fixed', 'percent', 'division'))]}">
                                         <field name="amount" class="oe_inline" />
-                                        <label string="%" class="oe_inline" attrs="{'invisible':[('amount_type','=','fixed')]}" />
+                                        <span class="o_form_label oe_inline" attrs="{'invisible':[('amount_type','=','fixed')]}">%</span>
                                     </div>
                                 </group>
                                 <group attrs="{'invisible':[('amount_type','=', 'group')]}" groups="account.group_account_user">
@@ -1257,13 +1257,13 @@
                                         <span t-esc="record.move_id.value"/>
                                     </strong>
                                     <strong class="col-xs-6 text-right">
-                                        <i class="fa fa-clock-o"/><field name="date_maturity"/>
+                                        <i class="fa fa-clock-o" aria-label="Date" role="img" title="Date"/><field name="date_maturity"/>
                                     </strong>
                                     <div class="col-xs-10">
                                         <span t-esc="record.name.value"/>
                                     </div>
                                     <div class="col-xs-2 text-right">
-                                        <img t-att-src="kanban_image('res.partner', 'image_small', record.partner_id.raw_value)" t-att-title="record.partner_id.value" width="24" height="24" class="oe_kanban_avatar"/>
+                                        <img t-att-src="kanban_image('res.partner', 'image_small', record.partner_id.raw_value)" t-att-title="record.partner_id.value" t-att-alt="record.partner_id.value" width="24" height="24" class="oe_kanban_avatar"/>
                                     </div>
                                 </div>
                             </div>
@@ -1468,7 +1468,7 @@
                                         <strong><span><field name="journal_id"/></span></strong>
                                     </div>
                                     <div class="col-xs-6 text-right">
-                                        <strong><i class="fa fa-clock-o"/> <t t-esc="record.date.value"/></strong>
+                                        <strong><i class="fa fa-clock-o" aria-label="Date" role="img" title="Date"/> <t t-esc="record.date.value"/></strong>
                                     </div>
                                 </div>
                                 <div class="row">
@@ -1695,7 +1695,7 @@
                             <div attrs="{'invisible':[('value','=', 'balance')]}" class="o_row">
                                 <label for="value_amount" attrs="{'invisible':[('value','=', 'balance')]}"/>
                                 <field name="value_amount" class="oe_inline"/>
-                                <label string="%" class="oe_inline" attrs="{'invisible':[('value','!=','percent')]}"/>
+                                <span class="o_form_label oe_inline" attrs="{'invisible':[('value','!=','percent')]}">%</span>
                             </div>
                         </group>
                     </group>
@@ -1713,7 +1713,7 @@
                     <div colspan="2" attrs="{'invisible': [('option','!=', 'day_after_invoice_date')]}">
                         <label for="day_of_the_month" string="On the"/>
                         <field name="day_of_the_month" class="oe_inline"/>
-                        <label string="of the month"/>
+                        <span class="o_form_label">of the month</span>
                     </div>
                 </form>
             </field>
@@ -1942,7 +1942,7 @@
                                     <label for="amount" attrs="{'invisible':[('amount_type','=', 'group')]}"/>
                                     <div attrs="{'invisible':[('amount_type','=', 'group')]}">
                                         <field name="amount" class="oe_inline" />
-                                        <label string="%" class="oe_inline" attrs="{'invisible':[('amount_type','=','fixed')]}" />
+                                        <span class="o_form_label oe_inline" attrs="{'invisible':[('amount_type','=','fixed')]}">%</span>
                                     </div>
                                 </group>
                                 <group attrs="{'invisible':[('amount_type','=', 'group')]}">
diff --git a/addons/account/views/res_config_settings_views.xml b/addons/account/views/res_config_settings_views.xml
index 28607bc8de73..3c7fc6f3b1b0 100644
--- a/addons/account/views/res_config_settings_views.xml
+++ b/addons/account/views/res_config_settings_views.xml
@@ -24,14 +24,14 @@
                                 <div class="col-xs-12 col-md-6 o_setting_box" attrs="{'invisible': [('has_accounting_entries','!=',False)]}">
                                     <div class="o_setting_left_pane"/>
                                     <div class="o_setting_right_pane">
-                                        <label string="Fiscal Localization"/>
-                                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                        <span class="o_form_label">Fiscal Localization</span>
+                                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                         <div class="text-muted">
                                             Taxes, fiscal positions, chart of accounts &amp; legal statements for your country
                                         </div>
                                         <div class="content-group">
                                             <div class="row mt16">
-                                                <label string="Package" class="col-md-3 o_light_label"/>
+                                                <label for="chart_template_id" string="Package" class="col-md-3 o_light_label"/>
                                                 <field name="chart_template_id" widget="selection"/>
                                             </div>
                                             <div>
@@ -49,7 +49,7 @@
                                         <field name="account_hide_setup_bar" widget="upgrade_boolean"/>
                                     </div>
                                     <div class="o_setting_right_pane">
-                                        <label string='Hide the Configuration Steps bar'/>
+                                        <label for="account_hide_setup_bar" string='Hide the Configuration Steps bar'/>
                                         <div class="text-muted">
                                             Deactivate the "Configuration Steps" bar on the dashboard
                                         </div>
@@ -62,8 +62,8 @@
                             <div class="col-xs-12 col-md-6 o_setting_box" title="These taxes are set in any new product created.">
                                 <div class="o_setting_left_pane"/>
                                 <div class="o_setting_right_pane">
-                                    <label string='Default Taxes'/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="o_form_label">Default Taxes</span>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                     <div class="text-muted">
                                         Default taxes applied to local transactions
                                     </div>
@@ -82,7 +82,7 @@
                             <div class="col-xs-12 col-md-6 o_setting_box" id="rounding_method" title="A rounding per line is advised if your prices are tax-included. That way, the sum of line subtotals equals the total with taxes.">
                                 <div class="o_setting_left_pane"/>
                                 <div class="o_setting_right_pane">
-                                    <label string="Rounding Method"/>
+                                    <span class="o_form_label">Rounding Method</span>
                                     <div class="text-muted">
                                         How total tax amount is computed in orders and invoices
                                     </div>
@@ -97,7 +97,7 @@
                                 </div>
                                 <div class="o_setting_right_pane" name="account_taxcloud_right_pane">
                                     <label for="module_account_taxcloud" string="TaxCloud"/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                     <div class="text-muted">
                                         Compute tax rates based on U.S. ZIP codes
                                     </div>
@@ -120,7 +120,7 @@
                                 </div>
                                 <div class="o_setting_right_pane">
                                     <label for="tax_exigibility"/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                     <div class="text-muted">
                                         Allow to configure taxes using cash basis
                                     </div>
@@ -138,8 +138,8 @@
                             <div class="col-xs-12 col-md-6 o_setting_box">
                                 <div class="o_setting_left_pane"/>
                                 <div class="o_setting_right_pane">
-                                    <label string="Main Currency"/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="o_form_label">Main Currency</span>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                     <div class="text-muted">
                                         Main currency of your company
                                     </div>
@@ -223,7 +223,7 @@
                                     <field name="module_account_payment"/>
                                 </div>
                                 <div class="o_setting_right_pane">
-                                    <label string="Online Payment"/>
+                                    <label for="module_account_payment" string="Online Payment"/>
                                     <div class="text-muted">
                                         Let your customers pay their invoices online
                                     </div>
@@ -234,7 +234,7 @@
                                     <field name="module_account_batch_payment" widget="upgrade_boolean"/>
                                 </div>
                                 <div class="o_setting_right_pane">
-                                    <label string="Batch Payments"/>
+                                    <label for="module_account_batch_deposit" string="Batch Payments"/>
                                     <div class="text-muted">
                                         Group payments into a single batch to ease the reconciliation process
                                     </div>
@@ -246,7 +246,7 @@
                                 </div>
                                 <div class="o_setting_right_pane" name="sepa_direct_debit_right_pane">
                                     <label string="SEPA Direct Debit (SDD)" for="module_account_sepa"/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                     <div class="text-muted">
                                         Collect customer payments in one-click using Euro SEPA Service
                                     </div>
@@ -267,7 +267,7 @@
                                 </div>
                                 <div class="o_setting_right_pane">
                                     <label string="Checks" for="module_account_check_printing"/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                     <div class="text-muted" id="print_bills_payment">
                                         Print checks to pay your vendors
                                     </div>
@@ -279,7 +279,7 @@
                                 </div>
                                 <div class="o_setting_right_pane" name="sepa_right_pane">
                                     <label for="module_account_sepa"/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                     <div class="text-muted">
                                         Pay your bills in one-click using Euro SEPA Service
                                     </div>
@@ -295,7 +295,7 @@
                                         <field name="module_account_yodlee" widget="upgrade_boolean"/>
                                     </div>
                                     <div class="o_setting_right_pane">
-                                        <label string="Automatic Import"/>
+                                        <label for="module_account_yodlee" string="Automatic Import"/>
                                         <div class="text-muted">
                                             Import your bank statements automatically
                                         </div>
@@ -306,7 +306,7 @@
                                         <field name="module_account_bank_statement_import_csv" widget="upgrade_boolean"/>
                                     </div>
                                     <div class="o_setting_right_pane">
-                                        <label string="CSV Import"/>
+                                        <label for="module_account_bank_statement_import_csv" string="CSV Import"/>
                                         <div class="text-muted">
                                             Import your bank statements in CSV
                                         </div>
@@ -317,7 +317,7 @@
                                         <field name="module_account_bank_statement_import_qif" widget="upgrade_boolean"/>
                                     </div>
                                     <div class="o_setting_right_pane">
-                                        <label string="QIF Import"/>
+                                        <label for="module_account_bank_statement_import_qif" string="QIF Import"/>
                                         <div class="text-muted">
                                             Import your bank statements in QIF
                                         </div>
@@ -328,7 +328,7 @@
                                         <field name="module_account_bank_statement_import_ofx" widget="upgrade_boolean"/>
                                     </div>
                                     <div class="o_setting_right_pane">
-                                        <label string="OFX Import"/>
+                                        <label for="module_account_bank_statement_import_ofx" string="OFX Import"/>
                                         <div class="text-muted">
                                             Import your bank statements in OFX
                                         </div>
@@ -339,7 +339,7 @@
                                         <field name="module_account_bank_statement_import_camt" widget="upgrade_boolean"/>
                                     </div>
                                     <div class="o_setting_right_pane">
-                                        <label string="CAMT Import"/>
+                                        <label for="module_account_bank_statement_import_camt" string="CAMT Import"/>
                                         <div class="text-muted">
                                             Import your bank statements in CAMT.053
                                         </div>
@@ -405,7 +405,7 @@
                                     <field name="module_product_margin"/>
                                 </div>
                                 <div class="o_setting_right_pane">
-                                    <label string="Margin Analysis"/>
+                                    <label for="module_product_margin" string="Margin Analysis"/>
                                     <div class="text-muted">
                                         Monitor your product margins from invoices
                                     </div>
diff --git a/addons/account/wizard/account_report_aged_partner_balance_view.xml b/addons/account/wizard/account_report_aged_partner_balance_view.xml
index 42ca836364d3..fc0fab2f3ea6 100644
--- a/addons/account/wizard/account_report_aged_partner_balance_view.xml
+++ b/addons/account/wizard/account_report_aged_partner_balance_view.xml
@@ -7,7 +7,7 @@
         <field name="arch" type="xml">
             <form string="Report Options">
                 <separator string="Aged Partner Balance"/>
-                <label string="Aged Partner Balance is a more detailed report of your receivables by intervals. Odoo calculates a table of credit balance by start Date. So if you request an interval of 30 days Odoo generates an analysis of creditors for the past month, past two months, and so on. "/>
+                <span class="o_form_label">Aged Partner Balance is a more detailed report of your receivables by intervals. Odoo calculates a table of credit balance by start Date. So if you request an interval of 30 days Odoo generates an analysis of creditors for the past month, past two months, and so on. </span>
                 <group col="4">
                     <field name="date_from"/>
                     <field name="period_length"/>
diff --git a/addons/account/wizard/account_unreconcile_view.xml b/addons/account/wizard/account_unreconcile_view.xml
index 1c7927b2f8b2..374a7f85f33a 100644
--- a/addons/account/wizard/account_unreconcile_view.xml
+++ b/addons/account/wizard/account_unreconcile_view.xml
@@ -8,7 +8,7 @@
             <field name="arch" type="xml">
             <form string="Unreconcile">
                 <separator string="Unreconcile Transactions"/>
-                <label string="If you unreconcile transactions, you must also verify all the actions that are linked to those transactions because they will not be disabled"/>
+                <form class="o_form_label">If you unreconcile transactions, you must also verify all the actions that are linked to those transactions because they will not be disabled</form>
                 <footer>
                     <button string="Unreconcile" name="trans_unrec" type="object" default_focus="1" class="btn-primary"/>
                     <button string="Cancel" class="btn-default" special="cancel"/>
diff --git a/addons/account/wizard/account_validate_move_view.xml b/addons/account/wizard/account_validate_move_view.xml
index 2d94db9afbe6..7ffe823afc9b 100644
--- a/addons/account/wizard/account_validate_move_view.xml
+++ b/addons/account/wizard/account_validate_move_view.xml
@@ -8,7 +8,7 @@
             <field name="model">validate.account.move</field>
             <field name="arch" type="xml">
                 <form string="Post Journal Entries">
-                    <label string="All selected journal entries will be validated and posted. You won't be able to modify them afterwards."/>
+                    <span class="o_form_label">All selected journal entries will be validated and posted. You won't be able to modify them afterwards.</span>
                     <footer>
                         <button string="Post Journal Entries" name="validate_move" type="object" default_focus="1" class="btn-primary"/>
                         <button string="Cancel" class="btn-default" special="cancel"/>
diff --git a/addons/account_analytic_default/views/account_analytic_default_view.xml b/addons/account_analytic_default/views/account_analytic_default_view.xml
index 60723e1c2aca..2d80a7ebd181 100644
--- a/addons/account_analytic_default/views/account_analytic_default_view.xml
+++ b/addons/account_analytic_default/views/account_analytic_default_view.xml
@@ -55,9 +55,9 @@
                             <div t-attf-class="oe_kanban_card oe_kanban_global_click">
                                 <div>
                                     <strong><span><field name="analytic_id"/></span></strong>
-                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                 </div>
-                                <div t-if="record.date_start.value"><i class="fa fa-calendar"></i> From <field name="date_start"/> <t t-if="record.date_stop.value">to <field name="date_stop"/></t></div>
+                                <div t-if="record.date_start.value"><span class="fa fa-calendar"> From</span> <field name="date_start"/> <t t-if="record.date_stop.value">to <field name="date_stop"/></t></div>
                                 <div t-if="record.product_id.value"><strong>Product</strong> <field name="product_id"/> </div>
                                 <div t-if="record.partner_id.value"><strong>Customer</strong> <field name="partner_id"/> </div>
                             </div>
diff --git a/addons/account_budget/views/account_budget_views.xml b/addons/account_budget/views/account_budget_views.xml
index d9404e2389db..b367e4dd7764 100644
--- a/addons/account_budget/views/account_budget_views.xml
+++ b/addons/account_budget/views/account_budget_views.xml
@@ -196,14 +196,14 @@ Budgets
                             </div>
                             <div class="row">
                                 <div class="col-xs-10">
-                                    <i class="fa fa-clock-o"/>
+                                    <i class="fa fa-clock-o" role="img" aria-label="Period" title="Period"/>
                                     <t t-esc="record.date_from.value"/>-
                                     <t t-esc="record.date_to.value"/>
                                 </div>
                                 <div class="col-xs-2">
                                     <span class="pull-right">
                                         <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)"
-                                             t-att-title="record.user_id.value" width="24" height="24"
+                                             t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24"
                                              class="oe_kanban_avatar pull-right"/>
                                     </span>
                                 </div>
diff --git a/addons/account_payment/views/account_portal_templates.xml b/addons/account_payment/views/account_portal_templates.xml
index 3e97164577e1..706bea92384f 100644
--- a/addons/account_payment/views/account_portal_templates.xml
+++ b/addons/account_payment/views/account_portal_templates.xml
@@ -8,7 +8,7 @@
                 <t t-set="tx_ids" t-value="invoice.transaction_ids.filtered(lambda tx: tx.state in ('pending', 'authorized', 'done'))"/>
                 <t t-set="pending_manual_txs" t-value="tx_ids.filtered(lambda tx: tx.state == 'pending' and tx.acquirer_id.provider in ('transfer', 'manual'))"/>
                 <a t-if="invoice.state == 'open' and invoice.amount_total and invoice.type == 'out_invoice' and (pending_manual_txs or not tx_ids)"
-                    t-att-href="'/my/invoices/%s#portal_pay' % invoice.id" alt="Pay Now" class="btn btn-xs btn-primary">
+                    t-att-href="'/my/invoices/%s#portal_pay' % invoice.id" title="Pay now" aria-label="Pay now" class="btn btn-xs btn-primary" role="button">
                     <i class="fa fa-arrow-circle-right"/><span class='hidden-xs'> Pay Now</span>
                 </a>
             </td>
@@ -73,15 +73,15 @@
             <div class="mb8 ml16 mr16">
                 <a t-if="invoice.state == 'open' and invoice.amount_total and invoice.type == 'out_invoice' and (pending_manual_txs or not tx_ids)"
                     class="btn btn-primary btn-block" data-toggle="modal" data-target="#pay_with">
-                    <i class="fa fa-arrow-circle-right"/> Pay Now
+                    <span class="fa fa-arrow-circle-right">Pay Now</span>
                 </a>
                 <a t-if="tx_ids and not pending_manual_txs and invoice.state != 'paid'"
                     class="btn btn-warning btn-block" disabled="disabled">
-                    <i class="fa fa-check-circle"/> Pending
+                    <span class="fa fa-check-circle">Pending</span>
                 </a>
                 <a t-if="invoice.state == 'paid'"
                     class="btn btn-success btn-block" disabled="disabled">
-                    <i class="fa fa-check-circle"/> Paid
+                    <span class="fa fa-check-circle">Paid</span>
                 </a>
             </div>
         </xpath>
diff --git a/addons/auth_oauth/views/auth_oauth_templates.xml b/addons/auth_oauth/views/auth_oauth_templates.xml
index 7e483dd842ec..1ddd715a21c6 100644
--- a/addons/auth_oauth/views/auth_oauth_templates.xml
+++ b/addons/auth_oauth/views/auth_oauth_templates.xml
@@ -2,7 +2,7 @@
 <odoo>
         <template id="auth_oauth.providers" name="OAuth Providers">
             <div t-foreach="providers" t-as="p">
-                <a t-att-href="p['auth_link']" class="btn btn-link">
+                <a t-att-href="p['auth_link']" class="btn btn-link" role="button">
                     <i t-att-class="p['css_class']"/>
                     <t t-esc="p['body']"/>
                 </a>
diff --git a/addons/auth_oauth/views/res_config_settings_views.xml b/addons/auth_oauth/views/res_config_settings_views.xml
index 214f1701895d..990f10284546 100644
--- a/addons/auth_oauth/views/res_config_settings_views.xml
+++ b/addons/auth_oauth/views/res_config_settings_views.xml
@@ -27,7 +27,7 @@
                                     <label for="auth_oauth_google_client_id" string="Client ID:" class="col-md-3 o_light_label"/>
                                     <field name="auth_oauth_google_client_id" placeholder="e.g. 1234-xyz.apps.googleusercontent.com"/>
                                 </div>
-                                <a href="https://www.odoo.com/documentation/user/online/general/auth/google.html" target="_blank"><i class="fa fa-fw fa-arrow-right"/>Tutorial</a>
+                                <a class="fa fa-fw fa-arrow-right" href="https://www.odoo.com/documentation/user/online/general/auth/google.html" target="_blank">Tutorial</a>
                             </div>
                         </div>
                     </div>
diff --git a/addons/auth_signup/views/auth_signup_login_templates.xml b/addons/auth_signup/views/auth_signup_login_templates.xml
index 46fee5ea3759..5e8dd29fcbd8 100644
--- a/addons/auth_signup/views/auth_signup_login_templates.xml
+++ b/addons/auth_signup/views/auth_signup_login_templates.xml
@@ -2,8 +2,8 @@
 <odoo>
         <template id="auth_signup.login" inherit_id="web.login" name="Sign up - Reset Password">
             <xpath expr="//button[@type='submit']" position="before">
-                <a t-if="signup_enabled" t-attf-href="/web/signup?{{ keep_query() }}" class="btn btn-link pull-right">Don't have an account?</a>
-                <a t-if="reset_password_enabled" t-attf-href="/web/reset_password?{{ keep_query() }}" class="btn btn-link pull-right">Reset Password</a>
+                <a t-if="signup_enabled" t-attf-href="/web/signup?{{ keep_query() }}" class="btn btn-link pull-right" role="button">Don't have an account?</a>
+                <a t-if="reset_password_enabled" t-attf-href="/web/reset_password?{{ keep_query() }}" class="btn btn-link pull-right" role="button">Reset Password</a>
             </xpath>
         </template>
 
@@ -43,13 +43,13 @@
                         <t t-set="only_passwords" t-value="bool(token and not invalid_token)"/>
                     </t>
 
-                    <p class="alert alert-danger" t-if="error">
+                    <p class="alert alert-danger" t-if="error" role="alert">
                         <t t-esc="error"/>
                     </p>
                     <input type="hidden" name="redirect" t-att-value="redirect"/>
                     <input type="hidden" name="token" t-att-value="token"/>
                     <div class="clearfix oe_login_buttons">
-                        <a t-attf-href="/web/login?{{ keep_query() }}" class="btn btn-link pull-right">Already have an account?</a>
+                        <a t-attf-href="/web/login?{{ keep_query() }}" class="btn btn-link pull-right" role="button">Already have an account?</a>
                         <button type="submit" class="btn btn-primary pull-left o_signup_btn"> Sign up</button>
                     </div>
 
@@ -60,10 +60,10 @@
         <template id="auth_signup.reset_password" name="Reset password">
             <t t-call="web.login_layout">
                 <div t-if="message">
-                    <p class="alert alert-success" t-if="message">
+                    <p class="alert alert-success" t-if="message" role="status">
                         <t t-esc="message"/>
                     </p>
-                    <a href="/web/login" class="btn btn-link pull-right">Back to Login</a>
+                    <a href="/web/login" class="btn btn-link pull-right" role="button">Back to Login</a>
                 </div>
 
                 <form class="oe_reset_password_form" role="form" method="post" t-if="not message">
@@ -83,14 +83,14 @@
                         </div>
                     </t>
 
-                    <p class="alert alert-danger" t-if="error">
+                    <p class="alert alert-danger" t-if="error" role="alert">
                         <t t-esc="error"/>
                     </p>
                     <input type="hidden" name="redirect" t-att-value="redirect"/>
                     <input type="hidden" name="token" t-att-value="token"/>
                     <div class="clearfix oe_login_buttons">
-                        <a t-if="not token" t-attf-href="/web/login?{{ keep_query() }}" class="btn btn-link pull-right">Back to Login</a>
-                        <a t-if="invalid_token" href="/web/login" class="btn btn-link pull-right">Back to Login</a>
+                        <a t-if="not token" t-attf-href="/web/login?{{ keep_query() }}" class="btn btn-link pull-right" role="button">Back to Login</a>
+                        <a t-if="invalid_token" href="/web/login" class="btn btn-link pull-right" role="button">Back to Login</a>
                         <button type="submit" class="btn btn-primary pull-left">Confirm</button>
                     </div>
 
diff --git a/addons/auth_signup/views/res_users_views.xml b/addons/auth_signup/views/res_users_views.xml
index 85be323f3400..37267bf39cd4 100644
--- a/addons/auth_signup/views/res_users_views.xml
+++ b/addons/auth_signup/views/res_users_views.xml
@@ -18,8 +18,8 @@
                 </xpath>
 
                 <xpath expr="//sheet/div[@name='button_box']" position="after">
-                    <div class="alert alert-success text-center o_form_header" attrs="{'invisible': [('signup_valid', '!=', True)]}">
-                        <a class="close" data-dismiss="alert" href="#" aria-hidden="true">x</a>
+                    <div class="alert alert-success text-center o_form_header" attrs="{'invisible': [('signup_valid', '!=', True)]}" role="status">
+                        <a class="close" data-dismiss="alert" href="#" aria-label="Close">x</a>
                         <div attrs="{'invisible': [('state', '!=', 'active')]}">
                             <strong>A password reset has been requested for this user. An email containing the following link has been sent:</strong>
                         </div>
diff --git a/addons/barcodes/static/src/js/barcode_form_view.js b/addons/barcodes/static/src/js/barcode_form_view.js
index 15e27498f943..9a09480558b6 100644
--- a/addons/barcodes/static/src/js/barcode_form_view.js
+++ b/addons/barcodes/static/src/js/barcode_form_view.js
@@ -349,7 +349,7 @@ FormController.include({
         }
         // only catch the event if we're not focused in
         // another field and it's a number
-        if (!$(event.target).is('body, .modal') || !/[0-9]/.test(character)) {
+        if (!$(event.target).is('body, [role="dialog"]') || !/[0-9]/.test(character)) {
             return;
         }
 
diff --git a/addons/barcodes/static/tests/barcode_tests.js b/addons/barcodes/static/tests/barcode_tests.js
index de88e79b9fc9..3d3ed4c75312 100644
--- a/addons/barcodes/static/tests/barcode_tests.js
+++ b/addons/barcodes/static/tests/barcode_tests.js
@@ -468,12 +468,12 @@ QUnit.test('specification of widget barcode_handler with keypress and notifyChan
     setTimeout(function () {
         var keycode = $.ui.keyCode.ENTER;
 
-        assert.strictEqual($('.modal .modal-body').length, 1, 'should open a modal with a quantity as input');
-        assert.strictEqual($('.modal .modal-body .o_set_qty_input').val(), '5', 'the quantity by default in the modal shoud be 5');
+        assert.strictEqual($('main.modal-body').length, 1, 'should open a modal with a quantity as input');
+        assert.strictEqual($('main.modal-body .o_set_qty_input').val(), '5', 'the quantity by default in the modal shoud be 5');
 
-        $('.modal .modal-body .o_set_qty_input').val('7');
+        $('main.modal-body .o_set_qty_input').val('7');
 
-        $('.modal .modal-body .o_set_qty_input').trigger($.Event('keypress', {which: keycode, keyCode: keycode}));
+        $('main.modal-body .o_set_qty_input').trigger($.Event('keypress', {which: keycode, keyCode: keycode}));
         assert.strictEqual(form.$('.o_data_row .o_data_cell:nth(1)').text(), '7',
         "quantity checked should be 7");
 
@@ -533,7 +533,7 @@ QUnit.test('barcode_scanned only trigger error for active view', function (asser
         } else {
             keycode = char.charCodeAt(0);
         }
-        return $('.modal').trigger($.Event('keypress', {which: keycode, keyCode: keycode}));
+        return $('[role="dialog"]').trigger($.Event('keypress', {which: keycode, keyCode: keycode}));
     }
     _.each(['O','-','B','T','N','.','c','a','n','c','e','l','Enter'], modalTriggerKeypressEvent);
     assert.verifySteps(['warning'], "only one event should be triggered");
diff --git a/addons/base_gengo/views/ir_translation_views.xml b/addons/base_gengo/views/ir_translation_views.xml
index df433ea0277b..7ec252965e02 100644
--- a/addons/base_gengo/views/ir_translation_views.xml
+++ b/addons/base_gengo/views/ir_translation_views.xml
@@ -20,7 +20,7 @@
                  <xpath expr="//form/sheet" position="inside">
                     <group string="Gengo Translation Service" col="4" colspan="4">
                         <field name="gengo_translation" />
-                        <label string="Note: If the translation state is 'In Progress', it means that the translation has to be approved to be uploaded in this system. You are supposed to do that directly by using your Gengo Account"/>
+                        <span class="o_form_label">Note: If the translation state is 'In Progress', it means that the translation has to be approved to be uploaded in this system. You are supposed to do that directly by using your Gengo Account</span>
                         <field name="gengo_comment" nolabel="1" placeholder="Gengo Comments &amp; Activity..." colspan="4"/>
                     </group>
                 </xpath>
diff --git a/addons/base_gengo/wizard/base_gengo_translations_view.xml b/addons/base_gengo/wizard/base_gengo_translations_view.xml
index 756b48e8aeab..1d5ef223f1d2 100644
--- a/addons/base_gengo/wizard/base_gengo_translations_view.xml
+++ b/addons/base_gengo/wizard/base_gengo_translations_view.xml
@@ -5,8 +5,8 @@
             <field name="model">base.gengo.translations</field>
             <field name="arch" type="xml">
                 <form string="Gengo Request Form">
-                    <div class="alert alert-warning text-center" attrs="{'invisible': [('authorized_credentials', '=', True)]}">
-                        <label string="Gengo Public or Private keys are wrong or missing."/>
+                    <div class="alert alert-warning text-center" attrs="{'invisible': [('authorized_credentials', '=', True)]}" role="alert">
+                        <span class="o_form_label">Gengo Public or Private keys are wrong or missing.</span>
                         <button type="object" name="open_company" string="Click here to Configure Gengo Parameters" icon="fa-cogs" class="oe_inline oe_link"/>
                         <field name="authorized_credentials" invisible="1"/>
                     </div>
diff --git a/addons/base_import/static/src/xml/base_import.xml b/addons/base_import/static/src/xml/base_import.xml
index bd685932788d..fcd5b239cb68 100644
--- a/addons/base_import/static/src/xml/base_import.xml
+++ b/addons/base_import/static/src/xml/base_import.xml
@@ -14,11 +14,11 @@
                     <div class="input-group">
                       <input type="text" class="oe_import_file_show form-control" placeholder="No file chosen..."/>
                       <span class="input-group-btn">
-                        <label class="btn btn-primary" for="my-file-selector">
+                        <button class="btn btn-primary">
                         <input accept=".csv, .xls, .xlsx, .xlsm, .ods" id-attf-id="file_#{_id}"
                        name="file" id="my-file-selector" class="oe_import_file" type="file" style="display:none;"/>
                         Load File
-                        </label>
+                        </button>
                       </span>
                       <span class="input-group-btn">
                         <button type="button" class="btn btn-default oe_import_file_reload" disabled="disabled">Reload File</button>
@@ -26,7 +26,7 @@
                     </div>
                     <div class="template-import mt24 hidden">
                         <h5>
-                            <a href="#" class="import-link fa fa-download"></a>
+                            <a href="#" class="import-link fa fa-download" aria-label="Download" title="Download"></a>
                         </h5>
                     </div>
                 </div>
diff --git a/addons/base_import_module/tests/test_module/test.xml b/addons/base_import_module/tests/test_module/test.xml
index 9722d9478d1d..46ffc861347f 100644
--- a/addons/base_import_module/tests/test_module/test.xml
+++ b/addons/base_import_module/tests/test_module/test.xml
@@ -18,7 +18,7 @@
             </h1>
             <p>
                 And this static image too !
-                <img src="/test_module/static/src/img/c64.png"/>
+                <img src="/test_module/static/src/img/c64.png" alt='Logo'/>
             </p>
         </t>
     </template>
diff --git a/addons/base_import_module/views/base_import_module_view.xml b/addons/base_import_module/views/base_import_module_view.xml
index 60af0d3fc611..7c46391f1167 100644
--- a/addons/base_import_module/views/base_import_module_view.xml
+++ b/addons/base_import_module/views/base_import_module_view.xml
@@ -9,7 +9,7 @@
                     <field name="state" invisible="1"/>
                     <separator string="Import Module" colspan="4"/>
                     <group states="init" col="4">
-                        <label string="Select module package to import (.zip file):" colspan="4"/>
+                        <label for="module_file" string="Select module package to import (.zip file):" colspan="4"/>
                         <field name="module_file" colspan="4"/>
 
                         <field name="force"/>
diff --git a/addons/base_setup/views/res_config_settings_views.xml b/addons/base_setup/views/res_config_settings_views.xml
index 99d43c9c18ea..82bfe8b4dca8 100644
--- a/addons/base_setup/views/res_config_settings_views.xml
+++ b/addons/base_setup/views/res_config_settings_views.xml
@@ -13,8 +13,8 @@
                             <div class="row mt16 o_settings_container">
                                 <div class="col-xs-12 col-md-6 o_setting_box">
                                     <div class="o_setting_right_pane">
-                                        <label string="Format"/>
-                                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                        <span class="o_form_label">Format</span>
+                                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                         <div class="text-muted">
                                             Set the paper format of printed documents
                                         </div>
@@ -28,8 +28,8 @@
                                 </div>
                                 <div class="col-xs-12 col-md-6 o_setting_box">
                                     <div class="o_setting_right_pane">
-                                        <label string="Document Template"/>
-                                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                        <span class="o_form_label">Document Template</span>
+                                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                         <div class="text-muted">
                                             Choose your document's header and footer layout
                                         </div>
@@ -120,8 +120,7 @@
                                     </div>
                                     <div class="o_setting_right_pane">
                                         <label string="Inter Company Flows" for="module_inter_company_rules"/>
-                                        <span class="fa fa-lg fa-building-o"/>
-                                        <div class="text-muted">
+                                        <div class="fa fa-lg fa-building-o text-muted">
                                             the creation of documents between your companies
                                         </div>
                                         <div class="content-group" attrs="{'invisible': [('module_inter_company_rules','=',False)]}" id="inter_companies_rules">
diff --git a/addons/base_vat/views/res_config_settings_views.xml b/addons/base_vat/views/res_config_settings_views.xml
index e82be83c5a4d..5943ee56af21 100644
--- a/addons/base_vat/views/res_config_settings_views.xml
+++ b/addons/base_vat/views/res_config_settings_views.xml
@@ -13,7 +13,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="vat_check_vies"/>
-                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                         <div class="text-muted">
                            Verify VAT numbers using the European VIES service
                         </div>
diff --git a/addons/board/static/src/xml/board.xml b/addons/board/static/src/xml/board.xml
index 0e55c5dd77fb..d06d0872c8ac 100644
--- a/addons/board/static/src/xml/board.xml
+++ b/addons/board/static/src/xml/board.xml
@@ -3,7 +3,7 @@
 <t t-name="DashBoard">
     <div class="oe_dashboard_links">
         <button type="button" class="button oe_dashboard_link_change_layout" title="Change Layout..">
-            <img src="/board/static/src/img/layout_1-1-1.png" width="16" height="16"/>
+            <img src="/board/static/src/img/layout_1-1-1.png" width="16" height="16" alt=""/>
             <span> Change Layout </span>
         </button>
     </div>
@@ -37,8 +37,8 @@
         </p>
         <ul>
             <li t-foreach="'1 1-1 1-1-1 1-2 2-1'.split(' ')" t-as="layout" t-att-data-layout="layout">
-                <img t-attf-src="/board/static/src/img/layout_#{layout}.png"/>
-                <i t-if="layout == currentLayout" class="oe_dashboard_selected_layout fa fa-check fa-lg text-success"/>
+                <img t-attf-src="/board/static/src/img/layout_#{layout}.png" alt=""/>
+                <i t-if="layout == currentLayout" class="oe_dashboard_selected_layout fa fa-check fa-lg text-success" aria-label='Layout' role="img" title="Layout"/>
             </li>
         </ul>
     </div>
diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js
index 9afb88e56484..15b08aaf544e 100644
--- a/addons/board/static/tests/dashboard_tests.js
+++ b/addons/board/static/tests/dashboard_tests.js
@@ -161,17 +161,17 @@ QUnit.test('basic functionality, with one sub action', function (assert) {
     assert.ok(form.$('.oe_content').is(':visible'), "content is visible again");
     assert.verifySteps(['load action', 'edit custom', 'edit custom']);
 
-    assert.strictEqual($('.modal').length, 0, "should have no modal open");
+    assert.strictEqual($('[role="dialog"]').length, 0, "should have no modal open");
 
     form.$('button.oe_dashboard_link_change_layout').click();
 
-    assert.strictEqual($('.modal').length, 1, "should have opened a modal");
-    assert.strictEqual($('.modal li[data-layout="2-1"] i.oe_dashboard_selected_layout').length, 1,
+    assert.strictEqual($('[role="dialog"]').length, 1, "should have opened a modal");
+    assert.strictEqual($('[role="dialog"] li[data-layout="2-1"] i.oe_dashboard_selected_layout').length, 1,
         "should mark currently selected layout");
 
-    $('.modal .oe_dashboard_layout_selector li[data-layout="1-1"]').click();
+    $('[role="dialog"] .oe_dashboard_layout_selector li[data-layout="1-1"]').click();
 
-    assert.strictEqual($('.modal').length, 0, "should have no modal open");
+    assert.strictEqual($('[role="dialog"]').length, 0, "should have no modal open");
     assert.strictEqual(form.$('table.oe_dashboard[data-layout="1-1"]').length, 1,
         "should have rendered a table with correct layout");
 
@@ -179,12 +179,12 @@ QUnit.test('basic functionality, with one sub action', function (assert) {
     assert.strictEqual(form.$('.oe_action').length, 1, "should have one displayed action");
     form.$('span.oe_close').click();
 
-    assert.strictEqual($('.modal').length, 1, "should have opened a modal");
+    assert.strictEqual($('[role="dialog"]').length, 1, "should have opened a modal");
 
     // confirm the close operation
-    $('.modal button.btn-primary').click();
+    $('[role="dialog"] button.btn-primary').click();
 
-    assert.strictEqual($('.modal').length, 0, "should have no modal open");
+    assert.strictEqual($('[role="dialog"]').length, 0, "should have no modal open");
     assert.strictEqual(form.$('.oe_action').length, 0, "should have no displayed action");
 
     assert.verifySteps(['load action', 'edit custom', 'edit custom', 'edit custom', 'edit custom']);
diff --git a/addons/calendar/static/tests/calendar_tests.js b/addons/calendar/static/tests/calendar_tests.js
index bf2326ce8489..64678104592c 100644
--- a/addons/calendar/static/tests/calendar_tests.js
+++ b/addons/calendar/static/tests/calendar_tests.js
@@ -63,15 +63,15 @@ QUnit.module('calendar', {
         });
 
         assert.ok(form.$('.o_field_widget[name="partner_ids"]').hasClass('o_field_many2manytags'));
-        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > span').length, 2,
+        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > button').length, 2,
             "there should be 2 tags");
-        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > span:first').text().trim(), "Jesus",
+        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > button:first').text().trim(), "Jesus",
             "the tag should be correctly named");
-        assert.ok(form.$('.o_field_widget[name="partner_ids"] > span:first .o_calendar_invitation').hasClass('accepted'),
+        assert.ok(form.$('.o_field_widget[name="partner_ids"] > button:first .o_calendar_invitation').hasClass('accepted'),
             "Jesus should attend the meeting");
-        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > span[data-id="2"]').text().trim(), "Mahomet",
+        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > button[data-id="2"]').text().trim(), "Mahomet",
             "the tag should be correctly named");
-        assert.ok(form.$('.o_field_widget[name="partner_ids"] > span[data-id="2"] .o_calendar_invitation').hasClass('needsAction'),
+        assert.ok(form.$('.o_field_widget[name="partner_ids"] > button[data-id="2"] .o_calendar_invitation').hasClass('needsAction'),
             "Mohamet should still confirm his attendance to the meeting");
 
         form.destroy();
diff --git a/addons/calendar/views/calendar_templates.xml b/addons/calendar/views/calendar_templates.xml
index 2c9660de77e5..dac0a52bad05 100644
--- a/addons/calendar/views/calendar_templates.xml
+++ b/addons/calendar/views/calendar_templates.xml
@@ -26,7 +26,7 @@
 
             <div class="container">
                 <div class="o_logo">
-                    <img class="img img-responsive center-block" src="/web/binary/company_logo"/>
+                    <img class="img img-responsive center-block" src="/web/binary/company_logo" alt="Logo"/>
                 </div>
 
                 <div class="panel panel-default">
diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml
index 80994d946fac..26baf2830934 100644
--- a/addons/calendar/views/calendar_views.xml
+++ b/addons/calendar/views/calendar_views.xml
@@ -112,7 +112,7 @@
                     <notebook>
                         <page name="page_details" string="Meeting Details">
                             <group attrs="{'invisible': [('recurrency','==',False)]}" class="oe_edit_only ">
-                                <p class='alert alert-warning'> This event is linked to a recurrence...<br/>
+                                <p class='alert alert-warning' role="status"> This event is linked to a recurrence...<br/>
                                     <button type="object" name="action_detach_recurring_event"  string="Update only this instance"  help="Click here to update only this instance and not all recurrences. " class="oe_link"/>
                                 </p>
                             </group>
diff --git a/addons/crm/data/mail_template_data.xml b/addons/crm/data/mail_template_data.xml
index d768b0fb275b..a74cf121ae5e 100644
--- a/addons/crm/data/mail_template_data.xml
+++ b/addons/crm/data/mail_template_data.xml
@@ -19,7 +19,7 @@
                 <tbody>
                     <tr>
                         <td style="padding:2px;width:30%;">
-                            <img src="web/static/src/img/logo.png"/>
+                            <img src="web/static/src/img/logo.png" alt="Logo"/>
                         </td>
                         <td style="vertical-align: top; padding: 8px 10px;text-align: left;font-size: 14px;">
                             <a href="web/login" style="float:right ;margin:15px auto;background: #875A7B;border-radius: 5px;color: #ffffff;font-size: 16px;padding: 10px 20px 10px 20px;text-decoration: none;">Auto Login</a>
diff --git a/addons/crm/static/src/js/tour.js b/addons/crm/static/src/js/tour.js
index 5543a081500c..daf550378f54 100644
--- a/addons/crm/static/src/js/tour.js
+++ b/addons/crm/static/src/js/tour.js
@@ -41,12 +41,12 @@ tour.register('crm_tour', {
     content: _t("Let's schedule an activity."),
     position: "bottom"
 }, {
-    trigger: ".modal-body .o_field_many2one",
+    trigger: 'main.modal-body .o_field_many2one',
     extra_trigger: ".o_opportunity_kanban",
     content: _t("<p>You will be able to customize your followup activities. Examples:</p><ol><li>introductory email</li><li>call 10 days after</li><li>second call 3 days after, ...</li></ol><p class='mb0'><i>Select a standard activity for now.</i></p>"),
     position: "bottom",
     run: function (actions) {
-        actions.auto(".modal-footer button[special=cancel]");
+        actions.auto('footer.modal-footer button[special=cancel]');
     },
 }, {
     trigger: ".o_kanban_record",
diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml
index 994a577239b6..8b38ee39cf6f 100644
--- a/addons/crm/views/crm_lead_views.xml
+++ b/addons/crm/views/crm_lead_views.xml
@@ -189,14 +189,14 @@
                                     <div class="oe_kanban_bottom_left">
                                         <field name="priority" widget="priority"/>
                                         <t t-if="record.message_needaction_counter.raw_value">
-                                            <span class="oe_kanban_mail_new" title="Unread Messages"><i class="fa fa-comments"/><t t-raw="record.message_needaction_counter.raw_value"/></span>
+                                            <span role="alert" class="oe_kanban_mail_new" title="Unread Messages"><i class="fa fa-comments" aria-label="Messages" role="img"/><t t-raw="record.message_needaction_counter.raw_value"/></span>
                                         </t>
                                         <div class="o_kanban_inline_block">
                                             <field name="activity_ids" widget="kanban_activity"/>
                                         </div>
                                     </div>
                                     <div class="oe_kanban_bottom_right">
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                     </div>
                                 </div>
                             </div>
@@ -324,15 +324,15 @@
                             <div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click">
                                 <div class="o_dropdown_kanban dropdown">
 
-                                    <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                    <a class="dropdown-toggle btn" role="button" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                         <span class="fa fa-ellipsis-v"/>
                                     </a>
-                                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                        <t t-if="widget.editable"><li><a type="edit">Edit</a></li></t>
-                                        <t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t>
-                                        <li t-if="! record.active.value"><a name="action_set_active" type="object">Restore</a></li>
-                                        <li t-if="record.active.value"><a name="action_set_unactive" type="object">Archive</a></li>
-                                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                    <ul class="dropdown-menu" role="menu">
+                                        <t t-if="widget.editable"><li><a role="menuitem" type="edit">Edit</a></li></t>
+                                        <t t-if="widget.deletable"><li><a role="menuitem" type="delete">Delete</a></li></t>
+                                        <li t-if="! record.active.value"><a role="menuitem" name="action_set_active" type="object">Restore</a></li>
+                                        <li t-if="record.active.value"><a role="menuitem" name="action_set_unactive" type="object">Archive</a></li>
+                                        <li role="menuitem" aria-haspopup="true"><ul class="oe_kanban_colorpicker" data-field="color" role="menu"/></li>
                                     </ul>
                                 </div>
                                 <div class="oe_kanban_content">
@@ -350,12 +350,12 @@
                                         <div class="oe_kanban_bottom_left">
                                             <field name="priority" widget="priority" groups="base.group_user"/>
                                             <t t-if="record.message_needaction_counter.raw_value">
-                                                <span class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments'/><t t-raw="record.message_needaction_counter.raw_value"/></span>
+                                                <span role="alert" class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments' aria-label="Unread messages" role="img"/><t t-raw="record.message_needaction_counter.raw_value"/></span>
                                             </t>
                                             <field name="activity_ids" widget="kanban_activity"/>
                                         </div>
                                         <div class="oe_kanban_bottom_right">
-                                            <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
+                                            <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
                                         </div>
                                     </div>
                                 </div>
diff --git a/addons/crm/views/crm_team_views.xml b/addons/crm/views/crm_team_views.xml
index 8b421716c98e..c9c7fa8bbd8f 100644
--- a/addons/crm/views/crm_team_views.xml
+++ b/addons/crm/views/crm_team_views.xml
@@ -188,7 +188,7 @@
 
                     <xpath expr="//div[hasclass('o_primary')]" position="after">
                         <div t-if="record.use_leads.raw_value and record.alias_name.value and record.alias_domain.value">
-                            <small t-translation="off"><i class="fa fa-envelope-o"></i>&amp;nbsp; <field name="alias_id"/></small>
+                            <small t-translation="off"><i class="fa fa-envelope-o" aria-label="Leads" title="Leads" role="img"></i>&amp;nbsp; <field name="alias_id"/></small>
                         </div>
                     </xpath>
 
diff --git a/addons/crm/views/res_config_settings_views.xml b/addons/crm/views/res_config_settings_views.xml
index 4b421d928f14..aa17161697b6 100644
--- a/addons/crm/views/res_config_settings_views.xml
+++ b/addons/crm/views/res_config_settings_views.xml
@@ -31,17 +31,17 @@
                                 <field name="generate_lead_from_alias"/>
                             </div>
                             <div class="o_setting_right_pane">
-                                <label string="Manual Assignation of Incoming Emails"/>
+                                <label for="generate_lead_from_alias" string="Manual Assignation of Incoming Emails"/>
                                 <div class="text-muted">
                                     Generate leads from incoming emails and assign them
                                     to a sales channel manually
                                 </div>
                                 <div class="content-group" attrs="{'invisible': [('generate_lead_from_alias','=',False)]}">
                                     <div class="mt16">
-                                        <label string="Alias" class="o_light_label"/>
+                                        <label for="crm_alias_prefix" string="Alias" class="o_light_label"/>
                                         <field name="crm_alias_prefix" class="oe_inline"
                                             attrs="{'required': [('generate_lead_from_alias', '=', True)]}"/>
-                                        <span>@</span>
+                                        <label for="alias_domain" string="@"/>
                                         <field name="alias_domain" readonly="1" class="oe_inline"/>
                                     </div>
                                     <div attrs="{'invisible': [('alias_domain', 'not in', ['localhost', '', False])]}">
diff --git a/addons/crm/views/res_partner_views.xml b/addons/crm/views/res_partner_views.xml
index 611e1c2ab440..d92ec1a66348 100644
--- a/addons/crm/views/res_partner_views.xml
+++ b/addons/crm/views/res_partner_views.xml
@@ -70,8 +70,8 @@
                     <field name="meeting_count"/>
                 </field>
                 <xpath expr="//div[hasclass('oe_kanban_partner_links')]" position="inside">
-                    <span class="badge" t-if="record.opportunity_count.value>0"><i class="fa fa-fw fa-star"/><t t-esc="record.opportunity_count.value"/></span>
-                    <span class="badge" t-if="record.meeting_count.value>0"><i class="fa fa-fw fa-calendar"/><t t-esc="record.meeting_count.value"/></span>
+                    <span class="badge" t-if="record.opportunity_count.value>0"><i class="fa fa-fw fa-star" aria-label="Favorites" role="img" title="Favorites"/><t t-esc="record.opportunity_count.value"/></span>
+                    <span class="badge" t-if="record.meeting_count.value>0"><i class="fa fa-fw fa-calendar" aria-label="Meetings" role="img" title="Meetings"/><t t-esc="record.meeting_count.value"/></span>
                 </xpath>
             </field>
         </record>
diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml
index 4266265da67d..2aff39e5ebf7 100644
--- a/addons/delivery/views/delivery_view.xml
+++ b/addons/delivery/views/delivery_view.xml
@@ -275,7 +275,7 @@
                       <label for="carrier_id"/>
                       <div name='carrier_selection'>
                           <div>
-                            <field name="carrier_id" domain="[('id', 'in', available_carrier_ids)]" context="{'order_id': id}" class="oe_inline" options="{'no_create': True, 'no_open': True}" attrs="{'readonly':[('state','not in',('draft','sent'))]}"/> <i class="fa fa-check text-success" aria-hidden="true" attrs="{'invisible':['|','|',('carrier_id','=',False),('state','not in',('draft','sent')),('delivery_rating_success','=',False)]}"></i>
+                            <field name="carrier_id" domain="[('id', 'in', available_carrier_ids)]" context="{'order_id': id}" class="oe_inline" options="{'no_create': True, 'no_open': True}" attrs="{'readonly':[('state','not in',('draft','sent'))]}"/> <i class="fa fa-check text-success" role="img" aria-label="Rating OK" title="Rating OK" attrs="{'invisible':['|','|',('carrier_id','=',False),('state','not in',('draft','sent')),('delivery_rating_success','=',False)]}"></i>
                           </div>
                           <div>
                             <field name='delivery_price' widget='monetary' class="oe_inline" options="{'currency_field': 'currency_id'}" nolabel="1" attrs="{'invisible': [('carrier_id','=', False)]}" force_save="1"/>
@@ -283,7 +283,7 @@
                             <button name="set_delivery_line" string="Set price" type="object" class="oe_inline fa fa-arrow-right oe_link" attrs="{'invisible':['|','|',('carrier_id','=',False),('state','not in',('draft','sent')),('delivery_rating_success','=',False)]}"/>
                             <field name='delivery_rating_success' invisible="1" force_save="1"/>
                           </div>
-                          <div class="alert alert-info" role="alert" attrs="{'invisible': ['|',('carrier_id','=', False),('delivery_message','=',False)]}">
+                          <div class="alert alert-info" role="status" attrs="{'invisible': ['|',('carrier_id','=', False),('delivery_message','=',False)]}">
                             <field name='delivery_message' force_save="1"/>
                           </div>
                       </div>
@@ -301,7 +301,7 @@
             <field name="arch" type="xml">
                 <form string="Trackers URL">
                     <group>
-                        <div class="alert alert-info">
+                        <div class="alert alert-info" role="status">
                             <p>You have multiple URL, they should be available in the chatter.</p>
                         </div>
                     </group>
diff --git a/addons/document/static/tests/document_tests.js b/addons/document/static/tests/document_tests.js
index 338f3e755818..111beeca8417 100644
--- a/addons/document/static/tests/document_tests.js
+++ b/addons/document/static/tests/document_tests.js
@@ -70,7 +70,7 @@ odoo.define('document.tests', function (require) {
 
             assert.strictEqual(form.sidebar.$('.o_sidebar_delete_attachment').length, 2, "there should be two attachments");
             form.sidebar.$('.o_sidebar_delete_attachment:eq(0)').click();
-            $('.modal-footer .btn-primary').click();
+            $('footer.modal-footer .btn-primary').click();
             assert.strictEqual(form.sidebar.$('.o_sidebar_delete_attachment').length, 1, "there should be only one attachment");
             form.destroy();
         });
diff --git a/addons/event/data/email_template_data.xml b/addons/event/data/email_template_data.xml
index d110d05f7654..771e840d63a3 100644
--- a/addons/event/data/email_template_data.xml
+++ b/addons/event/data/email_template_data.xml
@@ -104,7 +104,7 @@
                     <table style="width:100%;">
                         <tr>
                             <td style="vertical-align:top;">
-                                <img src="/web_editor/font_to_img/61555/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"/>
+                                <img src="/web_editor/font_to_img/61555/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34" alt=""/>
                             </td>
                             <td style="padding: 0px 10px 0px 10px;width:50%;line-height:20px;vertical-align:top;">
                                 <div><strong>From</strong> ${object.event_id.date_begin_located}</div>
@@ -113,7 +113,7 @@
                             </td>
                             % if object.event_id.address_id.country_id.name:
                                 <td style="vertical-align:top;">
-                                    <img src="/web_editor/font_to_img/61505/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"/>
+                                    <img src="/web_editor/font_to_img/61505/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34" alt=""/>
                                 </td>
                                 <td style="padding: 0px 10px 0px 10px;width:50%;vertical-align:top;">
                                     % set location = ''
@@ -176,10 +176,10 @@
                         <tr>
                             <td style="padding:25px 0px;">
                                 <strong>Add this event to your calendar</strong>
-                                <a href="https://www.google.com/calendar/render?action=TEMPLATE&amp;text=${object.event_id.name}&amp;dates=${date_begin}/${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"/> Google</a>
-                                <a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&amp;summary=${object.event_id.name}&amp;dtstart=${date_begin}&amp;dtend=${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"/> Outlook</a>
+                                <a href="https://www.google.com/calendar/render?action=TEMPLATE&amp;text=${object.event_id.name}&amp;dates=${date_begin}/${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16" alt=""/> Google</a>
+                                <a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&amp;summary=${object.event_id.name}&amp;dtstart=${date_begin}&amp;dtend=${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16" alt=""/> Outlook</a>
                                 <a href="https://calendar.yahoo.com/?v=60&amp;view=d&amp;type=20&amp;title=${object.event_id.name}&amp;in_loc=${location}&amp;st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&amp;et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new">
-                                    <img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"/> Yahoo</a>
+                                    <img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16" alt=""/> Yahoo</a>
                             </td>
                         </tr>
                     </table>
@@ -192,7 +192,7 @@
                     <table style="width:100%;"><tr><td>
                         <div>
                             <a href="https://maps.google.com/maps?q=${location}" target="new">
-                                <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&amp;size=598x200&amp;maptype=roadmap&amp;format=png&amp;visual_refresh=true&amp;markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom; width: 100%;"/>
+                                <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&amp;size=598x200&amp;maptype=roadmap&amp;format=png&amp;visual_refresh=true&amp;markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom; width: 100%;" alt="Google Maps"/>
                             </a>
                         </div>
                     </td></tr></table>
@@ -299,7 +299,7 @@
                     <table style="width:100%;">
                         <tr>
                             <td style="vertical-align:top;">
-                                <img src="/web_editor/font_to_img/61555/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"/>
+                                <img src="/web_editor/font_to_img/61555/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34" alt=""/>
                             </td>
                             <td style="padding: 0px 10px 0px 10px;width:50%;line-height:20px;vertical-align:top;">
                                 <div><strong>From</strong> ${object.event_id.date_begin_located}</div>
@@ -308,7 +308,7 @@
                             </td>
                             % if object.event_id.address_id.country_id.name:
                                 <td style="vertical-align:top;">
-                                    <img src="/web_editor/font_to_img/61505/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34"/>
+                                    <img src="/web_editor/font_to_img/61505/rgb(81,81,102)/34" style="padding:4px;max-width:inherit;" height="34" alt=""/>
                                 </td>
                                 <td style="padding: 0px 10px 0px 10px;width:50%;vertical-align:top;">
                                     % set location = ''
@@ -371,10 +371,10 @@
                         <tr>
                             <td style="padding:25px 0px;">
                                 <strong>Add this event to your calendar</strong>
-                                <a href="https://www.google.com/calendar/render?action=TEMPLATE&amp;text=${object.event_id.name}&amp;dates=${date_begin}/${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"/> Google</a>
-                                <a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&amp;summary=${object.event_id.name}&amp;dtstart=${date_begin}&amp;dtend=${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"/> Outlook</a>
+                                <a href="https://www.google.com/calendar/render?action=TEMPLATE&amp;text=${object.event_id.name}&amp;dates=${date_begin}/${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16" alt=""/> Google</a>
+                                <a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&amp;summary=${object.event_id.name}&amp;dtstart=${date_begin}&amp;dtend=${date_end}&amp;location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16" alt=""/> Outlook</a>
                                 <a href="https://calendar.yahoo.com/?v=60&amp;view=d&amp;type=20&amp;title=${object.event_id.name}&amp;in_loc=${location}&amp;st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&amp;et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new">
-                                    <img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"/> Yahoo</a>
+                                    <img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16" alt=""/> Yahoo</a>
                             </td>
                         </tr>
                     </table>
@@ -387,7 +387,7 @@
                     <table style="width:100%;"><tr><td>
                         <div>
                             <a href="https://maps.google.com/maps?q=${location}" target="new">
-                                <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&amp;size=598x200&amp;maptype=roadmap&amp;format=png&amp;visual_refresh=true&amp;markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom; width: 100%;"/>
+                                <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&amp;size=598x200&amp;maptype=roadmap&amp;format=png&amp;visual_refresh=true&amp;markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom; width: 100%;" alt="Google Maps"/>
                             </a>
                         </div>
                     </td></tr></table>
diff --git a/addons/event/report/event_event_templates.xml b/addons/event/report/event_event_templates.xml
index 8490dc4aaca6..6c3b2e70eff5 100644
--- a/addons/event/report/event_event_templates.xml
+++ b/addons/event/report/event_event_templates.xml
@@ -15,10 +15,10 @@
                                         <div t-field="o.event_id.event_logo"/>
                                     </t>
                                     <span t-if="not o.event_id.event_logo and o.event_id.organizer_id.company_id.logo_web and o.event_id.organizer_id.is_company">
-                                        <img t-att-src="'data:image/png;base64,%s' % to_text(o.event_id.organizer_id.company_id.logo_web)" style="max-height:1cm; max-width:4cm;"/>
+                                        <img t-att-src="'data:image/png;base64,%s' % to_text(o.event_id.organizer_id.company_id.logo_web)" style="max-height:1cm; max-width:4cm;" alt="Logo"/>
                                     </span>
                                     <h5 t-field="o.event_id.name"/>
-                                    <h5>( <i class="fa fa-clock-o"></i> <span itemprop="startDate" t-field="o.event_id.with_context(tz=o.event_id.date_tz).date_begin" t-options='{"hide_seconds": True}'> </span> <i>to</i> <span itemprop="endDate" t-field="o.event_id.with_context(tz=o.event_id.date_tz).date_end" t-options='{"hide_seconds": True}'> </span> )</h5>
+                                    <h5>( <i class="fa fa-clock-o" aria-label="Period" role="img" title="Period"></i> <span itemprop="startDate" t-field="o.event_id.with_context(tz=o.event_id.date_tz).date_begin" t-options='{"hide_seconds": True}'> </span> <i>to</i> <span itemprop="endDate" t-field="o.event_id.with_context(tz=o.event_id.date_tz).date_end" t-options='{"hide_seconds": True}'> </span> )</h5>
                                 </div>
                                 <div class="row">
                                     <div class="col-xs-12 text-center" id="o_event_name">
@@ -65,11 +65,11 @@
                                 <div class="col-xs-12">
                                     <span t-if="event.organizer_id.is_company and event.organizer_id.company_id.logo_web">
                                         <div t-field="event.event_logo">
-                                            <img t-att-src="'data:image/png;base64,%s' % to_text(event.organizer_id.company_id.logo_web)" style="max-height:1cm; max-width:4cm;"/>
+                                            <img t-att-src="'data:image/png;base64,%s' % to_text(event.organizer_id.company_id.logo_web)" style="max-height:1cm; max-width:4cm;" alt="Logo"/>
                                         </div>
                                     </span>
                                     <h4 t-field="event.name"/>
-                                    <h5>( <i class="fa fa-clock-o"></i> <span itemprop="startDate" t-field="event.date_begin" t-options='{"hide_seconds": True}'> </span> <i>to</i> <span itemprop="endDate" t-field="event.date_end" t-options='{"hide_seconds": True}'> </span> )</h5>
+                                    <h5>( <i class="fa fa-clock-o" aria-label="Period" role="img" title="Period"></i> <span itemprop="startDate" t-field="event.date_begin" t-options='{"hide_seconds": True}'> </span> <i>to</i> <span itemprop="endDate" t-field="event.date_end" t-options='{"hide_seconds": True}'> </span> )</h5>
                                 </div>
                             </div>
                             <div class="row" t-ignore="true">
diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml
index af015656140c..229100cbb5db 100644
--- a/addons/event/views/event_views.xml
+++ b/addons/event/views/event_views.xml
@@ -305,14 +305,14 @@
                             <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
                                 <div class="o_dropdown_kanban dropdown">
 
-                                    <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                    <a class="dropdown-toggle btn" role="button" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                         <span class="fa fa-ellipsis-v"/>
                                     </a>
-                                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
+                                    <ul class="dropdown-menu" role="menu">
                                         <t t-if="widget.deletable">
-                                            <li><a type="delete">Delete</a></li>
+                                            <li><a role="menuitem" type="delete">Delete</a></li>
                                         </t>
-                                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                        <li role="menuitem" aria-haspopup="true"><ul class="oe_kanban_colorpicker" data-field="color" role="menu"/></li>
                                     </ul>
                                 </div>
                                 <div class="o_event_left">
@@ -327,8 +327,7 @@
                                     <h4 class="o_kanban_record_title"><field name="name"/></h4>
                                     <div>
                                         <t t-if="record.country_id.raw_value"> <b class="o_kanban_record_subtitle"> <field name="country_id"/> </b> <br/> </t>
-                                        <i class="fa fa-clock-o"/>
-                                        <b>To</b> <t t-esc="moment(record.date_end.raw_value).format('lll')"/>
+                                        <b class="fa fa-clock-o">To</b> <t t-esc="moment(record.date_end.raw_value).format('lll')"/>
                                     </div>
                                     <h4>
                                         <a name="%(act_event_registration_from_event)d" type="action">
diff --git a/addons/event/wizard/event_confirm_view.xml b/addons/event/wizard/event_confirm_view.xml
index 26741e434ea6..1cd67ac8da8a 100644
--- a/addons/event/wizard/event_confirm_view.xml
+++ b/addons/event/wizard/event_confirm_view.xml
@@ -7,7 +7,7 @@
             <field name="model">event.confirm</field>
             <field name="arch" type="xml">
               <form string="Event Confirmation">
-                  <label string="Warning: This Event has not reached its Minimum Registration Limit. Are you sure you want to confirm it?"/>
+                  <span class="o_form_label">Warning: This Event has not reached its Minimum Registration Limit. Are you sure you want to confirm it?</span>
                   <footer>
                       <button name="confirm" string="Confirm Anyway" type="object" class="btn-primary"/>
                       <button string="Cancel" class="btn-default" special="cancel" />
diff --git a/addons/event_sale/data/event_demo.xml b/addons/event_sale/data/event_demo.xml
index 54b88827055a..3c90dae2b59e 100644
--- a/addons/event_sale/data/event_demo.xml
+++ b/addons/event_sale/data/event_demo.xml
@@ -142,7 +142,7 @@
             <div class="row">
                 <div class="col-xs-5">
                 <p>
-                    <i class="fa fa-twitter"/> #OpenDays
+                    <i class="fa fa-twitter" role="img" aria-label="Twitter" title="Twitter"/> #OpenDays
                 </p>
                 </div>
                 <div class="col-xs-6">
@@ -154,7 +154,7 @@
                 <small class="col-xs-3" style="float: left; padding-right: 0px; padding-left: 0px;">sponsored by</small>
                 <div class="col-xs-2" style="padding-right: 0px; padding-left: 0px;">
                 <span>
-                    <img class="img img-responsive" src="/base/static/img/logo_white.png"/>
+                    <img class="img img-responsive" src="/base/static/img/logo_white.png alt="Logo"/>
                 </span>
                 </div>
             </div>
diff --git a/addons/fleet/views/fleet_vehicle_model_views.xml b/addons/fleet/views/fleet_vehicle_model_views.xml
index fb7f111b4508..d04413af0b5d 100644
--- a/addons/fleet/views/fleet_vehicle_model_views.xml
+++ b/addons/fleet/views/fleet_vehicle_model_views.xml
@@ -25,7 +25,7 @@
                                     <templates>
                                         <t t-name="kanban-box">
                                             <div style="position: relative">
-                                                <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block"><i class="fa fa-times text-danger"/></a>
+                                                <a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block" aria-label="Delete" title="Delete"><i class="fa fa-times text-danger"/></a>
                                                 <div class="oe_module_vignette">
                                                     <div class="oe_module_desc o_kanban_record_title">
                                                         <field name="name"/>
@@ -125,7 +125,7 @@
                     <t t-name="kanban-box">
                         <div class="oe_kanban_vignette oe_semantic_html_override">
                             <a type="open" href="#" class="o_kanban_image oe_kanban_action">
-                                <img t-att-src="kanban_image('fleet.vehicle.model.brand', 'image_small', record.id.raw_value)" class="img-responsive" style="width:100px;"/>
+                                <img alt="Open" t-att-src="kanban_image('fleet.vehicle.model.brand', 'image_small', record.id.raw_value)" class="img-responsive" style="width:100px;"/>
                             </a>
                             <div class="oe_kanban_details">
                                 <h4 class="oe_partner_heading">
diff --git a/addons/fleet/views/fleet_vehicle_views.xml b/addons/fleet/views/fleet_vehicle_views.xml
index 9076e6ce5b00..a30918dda216 100644
--- a/addons/fleet/views/fleet_vehicle_views.xml
+++ b/addons/fleet/views/fleet_vehicle_views.xml
@@ -197,7 +197,7 @@
                     <t t-name="kanban-box">
                         <div class="oe_kanban_global_click">
                             <div class="o_kanban_image">
-                                <img t-att-src="kanban_image('fleet.vehicle', 'image_small', record.id.raw_value)"/>
+                                <img t-att-src="kanban_image('fleet.vehicle', 'image_small', record.id.raw_value)" alt="Vehicle"/>
                             </div>
                             <div class="oe_kanban_details">
                                 <strong class="o_kanban_record_title">
@@ -222,10 +222,10 @@
                                     <field name="contract_count"/>
                                     Contract(s)
                                     <span t-if="record.contract_renewal_due_soon.raw_value and !record.contract_renewal_overdue.raw_value"
-                                        class="fa fa-exclamation-triangle" t-att-style="'color:orange'">
+                                        class="fa fa-exclamation-triangle" t-att-style="'color:orange'" role="img" aria-label="Warning: renewal due soon" title="Warning: renewal due soon">
                                     </span>
                                      <span t-if="record.contract_renewal_overdue.raw_value"
-                                        class="fa fa-exclamation-triangle" t-att-style="'color:red;'">
+                                        class="fa fa-exclamation-triangle" t-att-style="'color:red;'" role="img" aria-label="Attention: renewal overdue" title="Attention: renewal overdue">
                                     </span>
                                 </a>
                             </div>
diff --git a/addons/gamification/views/badge.xml b/addons/gamification/views/badge.xml
index 1f384a16e5d3..10ef3a616055 100644
--- a/addons/gamification/views/badge.xml
+++ b/addons/gamification/views/badge.xml
@@ -111,7 +111,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"/>
+                                <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"/>
                             </div>
                             <div class="oe_kanban_details">
                                 <strong class="o_kanban_record_title"><field name="name"/></strong>
@@ -132,7 +132,7 @@
                                     <em><field name="description"/></em>
                                     <div>
                                         <t t-foreach="record.unique_owner_ids.raw_value.slice(0,11)" t-as="owner">
-                                            <img width="24" height="24" class="oe_kanban_avatar" t-att-src="kanban_image('res.users', 'image_small', owner)" t-att-data-member_id="owner"/>
+                                            <img width="24" height="24" class="oe_kanban_avatar" t-att-src="kanban_image('res.users', 'image_small', owner)" t-att-data-member_id="owner" alt="Owner"/>
                                         </t>
                                     </div>
                                 </div>
@@ -165,7 +165,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" /></a>
+                                    <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>
                                 </div>
                                 <div class="oe_kanban_details">
                                     <h4 class="mt0 mb0">
diff --git a/addons/gamification/views/challenge.xml b/addons/gamification/views/challenge.xml
index 0d70e6cfd815..518d6edc7d4f 100644
--- a/addons/gamification/views/challenge.xml
+++ b/addons/gamification/views/challenge.xml
@@ -158,7 +158,7 @@
                                    </div>
                                </strong>
                                 <t t-foreach="record.user_ids.raw_value.slice(0,11)" t-as="member">
-                                    <img class="o_kanban_badge_avatars" t-att-src="kanban_image('res.users', 'image_small', member)" t-att-data-member_id="member"/>
+                                    <img class="o_kanban_badge_avatars" t-att-src="kanban_image('res.users', 'image_small', member)" t-att-data-member_id="member" alt="Member"/>
                                 </t>
                             </div>
                         </div>
diff --git a/addons/gamification/views/goal.xml b/addons/gamification/views/goal.xml
index 11c3b029c2ac..b46e0e6844d1 100644
--- a/addons/gamification/views/goal.xml
+++ b/addons/gamification/views/goal.xml
@@ -150,15 +150,15 @@
                             <div class="o_kanban_content">
                                 <p><strong><h4 class="oe_goal_name text-center" tooltip="kanban-tooltip"><field name="definition_id" /></h4></strong></p>
                                 <div class="pull-left">
-                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" />
+                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" />
                                 </div>
                                 <field name="user_id" />
                                 <div class="o_goal_state_block">
                                     <t t-if="record.definition_display.raw_value == 'boolean'">
                                         <div class="o_goal_state text-center">
-                                            <t t-if="record.state.raw_value=='reached'"><i class="o_green fa fa-check fa-3x" title="Goal Reached"/></t>
-                                            <t t-if="record.state.raw_value=='inprogress'"><i class="fa fa-clock-o fa-3x" title="Goal in Progress"/></t>
-                                            <t t-if="record.state.raw_value=='failed'"><i class="o_red fa fa-times fa-3x" title="Goal Failed"/></t>
+                                            <t t-if="record.state.raw_value=='reached'"><i role="img" class="o_green fa fa-check fa-3x" title="Goal Reached" aria-label="Goal Reached"/></t>
+                                            <t t-if="record.state.raw_value=='inprogress'"><i role="img" class="fa fa-clock-o fa-3x" title="Goal in Progress" aria-label="Goal in Progress"/></t>
+                                            <t t-if="record.state.raw_value=='failed'"><i role="img" class="o_red fa fa-times fa-3x" title="Goal Failed" aria-label="Goal Failed"/></t>
                                         </div>
                                     </t>
                                     <t t-if="record.definition_display.raw_value == 'progress'">
diff --git a/addons/google_calendar/views/res_config_settings_views.xml b/addons/google_calendar/views/res_config_settings_views.xml
index 9959ae612daf..8bcf1f467fe7 100644
--- a/addons/google_calendar/views/res_config_settings_views.xml
+++ b/addons/google_calendar/views/res_config_settings_views.xml
@@ -13,7 +13,7 @@
                             <label for="cal_client_secret" string="Client Secret" class="col-xs-3 col-md-3 o_light_label"/>
                             <field name="cal_client_secret" password="True" nolabel="1"/>
                         </div>
-                        <a href="https://www.odoo.com/documentation/user/11.0/crm/optimize/google_calendar_credentials.html" class="oe-link" target="_blank"><i class="fa fa-fw fa-arrow-right"/>Tutorial</a>
+                        <a href="https://www.odoo.com/documentation/user/11.0/crm/optimize/google_calendar_credentials.html" class="oe-link fa fa-fw fa-arrow-right" target="_blank">Tutorial</a>
                     </div>
                 </div>
             </field>
diff --git a/addons/google_drive/views/res_config_settings_views.xml b/addons/google_drive/views/res_config_settings_views.xml
index 20a695573409..699ea10c93c2 100644
--- a/addons/google_drive/views/res_config_settings_views.xml
+++ b/addons/google_drive/views/res_config_settings_views.xml
@@ -13,9 +13,9 @@
                         <field name="google_drive_authorization_code"/>
                     </div>
                     <div>
-                        <span type="button" class="btn-link o_btn-link-as-button fa-arrow-right">
+                        <button type="button" class="btn-link o_btn-link-as-button fa-arrow-right">
                             <field name="google_drive_uri" widget="url" text="Get Authorization Code"/>
-                        </span>
+                        </button>
                     </div>
                     <div>
                         <button type="action" name="%(action_google_drive_users_config)d" string="Google Drive Templates" icon="fa-arrow-right"  class="btn-link"/>
diff --git a/addons/hr/views/hr_views.xml b/addons/hr/views/hr_views.xml
index 94aa370d7925..1970a96d6a83 100644
--- a/addons/hr/views/hr_views.xml
+++ b/addons/hr/views/hr_views.xml
@@ -207,13 +207,13 @@
                     <t t-name="kanban-box">
                     <div class="oe_kanban_global_click">
                         <div class="o_kanban_image">
-                            <img t-att-src="kanban_image('hr.employee', 'image_medium', record.id.raw_value)"/>
+                            <img t-att-src="kanban_image('hr.employee', 'image_medium', record.id.raw_value)" alt="Employee"/>
                             <div class="o_employee_summary_icons">
                                 <t t-if="record.message_needaction_counter.raw_value">
-                                    <span class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments'/><t t-raw="record.message_needaction_counter.raw_value"/></span>
+                                    <span role="alert" class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments' role="img" aria-label="Unread Messages"/><t t-raw="record.message_needaction_counter.raw_value"/></span>
                                 </t>
-                                <span title='Messages'><i class='fa fa-comments'/><t t-esc="record.message_ids.raw_value.length"/></span>
-                                <span title='Followers'><i class='fa fa-users'/><t t-esc="record.message_follower_ids.raw_value.length"/></span>
+                                <span title='Messages'><i class='fa fa-comments' role="img" aria-label="Messages"/><t t-esc="record.message_ids.raw_value.length"/></span>
+                                <span title='Followers'><i class='fa fa-users' role="img" aria-label="Followers"/><t t-esc="record.message_follower_ids.raw_value.length"/></span>
                             </div>
                         </div>
                         <div class="oe_kanban_details">
@@ -229,9 +229,9 @@
                             <ul>
                                 <li id="last_login"/>
                                 <li t-if="record.work_location.raw_value"><field name="work_location"/></li>
-                                <li t-if="record.work_email.raw_value"><i class="fa fa-envelope"></i> <field name="work_email"/></li>
-                                <li t-if="record.work_phone.raw_value"><i class="fa fa-phone"></i> <field name="work_phone"/></li>
-                                <li t-if="record.mobile_phone.raw_value"><i class="fa fa-mobile"></i> <field name="mobile_phone"/></li>
+                                <li t-if="record.work_email.raw_value"><i class="fa fa-envelope" role="img" aria-label="Email" title="Email"></i> <field name="work_email"/></li>
+                                <li t-if="record.work_phone.raw_value"><i class="fa fa-phone" role="img" aria-label="Phone" title="Phone"></i> <field name="work_phone"/></li>
+                                <li t-if="record.mobile_phone.raw_value"><i class="fa fa-mobile" role="img" aria-label="Mobile" title="Mobile"></i> <field name="mobile_phone"/></li>
                             </ul>
                         </div>
                     </div>
@@ -567,7 +567,7 @@
                                         <div class="o_secondary"><field name="company_id" groups="base.group_multi_company"/></div>
                                     </div>
                                     <div class="o_kanban_manage_button_section">
-                                        <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                        <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                     </div>
                                 </div>
                                 <div class="container o_kanban_card_content">
@@ -578,19 +578,19 @@
                                         <div class="col-xs-6 o_kanban_primary_right">
                                         </div>
                                     </div>
-                                </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                                </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                     <div class="row">
-                                        <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_to_do">
+                                        <div role="menuitem" class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_to_do">
                                             <div class="o_kanban_card_manage_title">
                                                 <span>To Do</span>
                                             </div>
                                         </div>
-                                        <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_to_approve">
+                                        <div role="menuitem" class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_to_approve">
                                             <div class="o_kanban_card_manage_title">
                                                 <span>To Approve</span>
                                             </div>
                                         </div>
-                                        <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_reports">
+                                        <div role="menuitem" class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_reports">
                                             <div class="o_kanban_card_manage_title">
                                                 <span>Reporting</span>
                                             </div>
@@ -598,11 +598,11 @@
                                     </div>
 
                                     <div t-if="widget.editable" class="o_kanban_card_manage_settings row">
-                                        <div class="col-xs-8">
-                                            <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                        <div role="menuitem" aria-haspopup="true" class="col-xs-8">
+                                            <ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
                                         </div>
                                         <div class="col-xs-4 text-right">
-                                            <a type="edit">Settings</a>
+                                            <a role="menuitem" type="edit">Settings</a>
                                         </div>
                                     </div>
                                 </div>
diff --git a/addons/hr/views/res_config_settings_views.xml b/addons/hr/views/res_config_settings_views.xml
index 37c2e566b4d5..30d4d30f04e9 100644
--- a/addons/hr/views/res_config_settings_views.xml
+++ b/addons/hr/views/res_config_settings_views.xml
@@ -13,7 +13,7 @@
                         <div class="col-xs-12 col-md-6 o_setting_box">
                             <div class="o_setting_right_pane">
                                 <label for="resource_calendar_id"/>
-                                <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." role="img" aria-label="Values set here are company-specific." groups="base.group_multi_company"/>
                                 <div class="row">
                                     <div class="text-muted col-md-8">
                                         Set default calendar used to compute time allocation for leaves, timesheets, ...
diff --git a/addons/hr_attendance/report/hr_employee_badge.xml b/addons/hr_attendance/report/hr_employee_badge.xml
index cac5c5eee167..ea1191de1a91 100644
--- a/addons/hr_attendance/report/hr_employee_badge.xml
+++ b/addons/hr_attendance/report/hr_employee_badge.xml
@@ -34,7 +34,7 @@
                                 <table style="width:155pt; height:85pt">
                                     <tr><th><div style="font-size:15pt; margin-bottom:0pt;margin-top:0pt;" align="center"><t t-esc="employee.name"/></div></th></tr>
                                     <tr><td><div align="center" style="font-size:10pt;margin-bottom:5pt;"><t t-esc="employee.job_id.name"/></div></td></tr>
-                                    <tr><td><img t-if="employee.barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', employee.barcode, 600, 120)" style="max-height:50pt;max-width:100%;" align="center"/></td></tr>
+                                    <tr><td><img alt="barcode" t-if="employee.barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', employee.barcode, 600, 120)" style="max-height:50pt;max-width:100%;" align="center"/></td></tr>
                                 </table>
                             </td>
                         </table>
@@ -43,4 +43,4 @@
             </div>
         </t>
     </template>
-</odoo>
\ No newline at end of file
+</odoo>
diff --git a/addons/hr_attendance/static/src/xml/attendance.xml b/addons/hr_attendance/static/src/xml/attendance.xml
index 5c334bcfa4c8..f2ae4b73cda8 100644
--- a/addons/hr_attendance/static/src/xml/attendance.xml
+++ b/addons/hr_attendance/static/src/xml/attendance.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <template xml:space="preserve">
     <t t-name="PresenceIndicator">
-        <div id="oe_hr_attendance_status" class="fa fa-user">
+        <div id="oe_hr_attendance_status" class="fa fa-user" role="img" aria-label="Available" title="Available">
         </div>
     </t>
 
@@ -42,8 +42,9 @@
                     </div>
                     <h1 class="mb8"><t t-esc="widget.employee.name"/></h1>
                     <h3 class="mt8 mb24"><t t-if="!checked_in">Welcome!</t><t t-else="">Want to check out?</t></h3>
-                    <a t-attf-class="fa fa-7x o_hr_attendance_sign_in_out_icon {{checked_in? 'fa-sign-out btn-warning' : 'fa-sign-in btn-default'}}"/>
-                    <h3 class="mt0 mb0 text-muted">Click to <b t-if="checked_in">check out</b><b t-else="">check in</b></h3>
+                    <a class="fa fa-7x o_hr_attendance_sign_in_out_icon fa-sign-out btn-warning" t-if="checked_in" aria-label="Sign out" title="Sign out"/>
+                    <a class="fa fa-7x o_hr_attendance_sign_in_out_icon fa-sign-in btn-default" t-if="!checked_in" aria-label="Sign in" title="Sign in"/>
+                    <h3 class="mt0 mb0 text-muted">Click to <b t-if="checked_in">check out</b><b t-if="!checked_in">check in</b></h3>
                 </t>
                 <t t-else="">
                     Error : Could not find employee linked to user.
@@ -59,8 +60,8 @@
             <div class="o_hr_attendance_kiosk_mode">
                 <t t-set="checked_in" t-value="widget.employee_state=='checked_in'"/>
                 <div class="o_hr_attendance_back_button">
-                    <span class="btn btn-default btn-lg visible-xs"><i class="fa fa-chevron-left mr8"/> Go back</span>
-                    <span class="btn btn-default hidden-xs"><i class="fa fa-chevron-left"/></span>
+                    <span class="btn btn-default btn-lg visible-xs"><span class="fa fa-chevron-left mr8"> Go back</span></span>
+                    <span class="btn btn-default hidden-xs"><i role="img" class="fa fa-chevron-left" aria-label="Go back" title="Go back"/></span>
                 </div>
                 <t t-if="widget.employee_id">
                     <div class="o_hr_attendance_user_badge o_home_menu_background">
@@ -69,7 +70,8 @@
                     <h1 class="mb8"><t t-esc="widget.employee_name"/></h1>
                     <h3 class="mt8 mb24"><t t-if="!checked_in">Welcome!</t><t t-else="">Want to check out?</t></h3>
                     <t t-if="!widget.use_pin">
-                        <a t-attf-class="fa fa-7x o_hr_attendance_sign_in_out_icon {{checked_in? 'fa-sign-out btn-warning' : 'fa-sign-in btn-default'}}"/>
+                        <a class="fa fa-7x o_hr_attendance_sign_in_out_icon fa-sign-out btn-warning" t-if="checked_in" aria-label="Sign out" title="Sign out"/>
+                        <a class="fa fa-7x o_hr_attendance_sign_in_out_icon fa-sign-in btn-default" t-if="!checked_in" aria-label="Sign in" title="Sign in"/>
                         <h3 class="mt0 mb0 text-muted">Click to <b t-if="checked_in">check out</b><b t-else="">check in</b></h3>
                     </t>
                     <t t-else="">
@@ -90,10 +92,10 @@
                         </div>
                     </t>
                 </t>
-                <div t-else="" class="alert alert-danger">
+                <div t-else="" class="alert alert-danger" role="alert">
                     <b>Error: could not find corresponding employee.</b><br/>Please return to the main menu.
                 </div>
-                <div class="oe_attendance_sign_in_out"/>
+                <a role="button" class="oe_attendance_sign_in_out" aria-label="Sign out" title="Sign out"/>
             </div>
         </div>
     </t>
@@ -110,20 +112,20 @@
                     <t t-if="widget.attendance.check_out">
                         <h1 class="mb0">Goodbye <t t-esc="widget.employee_name"/>!</h1>
                         <h2 class="o_hr_attendance_message_message mt4 mb24"/>
-                        <div class="alert alert-info h2 mt0">
+                        <div class="alert alert-info h2 mt0" role="status">
                             Checked out at <b><t t-esc="widget.attendance.check_out_time"/></b>
                         </div>
                         <h3 class="o_hr_attendance_random_message mb24"/>
-                        <div class="o_hr_attendance_warning_message mt24 alert alert-warning" style="display:none"/>
+                        <div class="o_hr_attendance_warning_message mt24 alert alert-warning" style="display:none" role="alert"/>
                     </t>
                     <t t-else="">
                         <h1 class="mb0">Welcome <t t-esc="widget.employee_name"/>!</h1>
                         <h2 class="o_hr_attendance_message_message mt4 mb24"/>
-                        <div class="alert alert-info h2 mt0">
+                        <div class="alert alert-info h2 mt0" role="status">
                             Checked in at <b><t t-esc="widget.attendance.check_in_time"/></b>
                         </div>
                         <h3 class="o_hr_attendance_random_message mb24"/>
-                        <div class="o_hr_attendance_warning_message mt24 alert alert-warning" style="display:none"/>
+                        <div class="o_hr_attendance_warning_message mt24 alert alert-warning" style="display:none" role="alert"/>
                     </t>
                     <button class="o_hr_attendance_button_dismiss btn btn-primary btn-lg">
                         <span class="text-capitalize" t-if="widget.attendance.check_out">Goodbye</span>
@@ -131,7 +133,7 @@
                     </button>
                 </t>
                 <t t-else="">
-                    <div class="alert alert-warning">Invalid request, please return to the main menu.</div>
+                    <div class="alert alert-warning" role="alert">Invalid request, please return to the main menu.</div>
                     <button class="o_hr_attendance_button_dismiss btn btn-default btn-lg">Go back</button>
                 </t>
             </div>
diff --git a/addons/hr_attendance/views/hr_attendance_view.xml b/addons/hr_attendance/views/hr_attendance_view.xml
index 497d90d799d0..6a715ef7f412 100644
--- a/addons/hr_attendance/views/hr_attendance_view.xml
+++ b/addons/hr_attendance/views/hr_attendance_view.xml
@@ -27,14 +27,14 @@
                     <t t-name="kanban-box">
                         <div t-attf-class="oe_kanban_global_click">
                             <div>
-                                <img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" width="24" height="24" class="oe_kanban_avatar mr4"/>
+                                <img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" t-att-alt="record.employee_id.value" width="24" height="24" class="oe_kanban_avatar mr4"/>
                                 <span class="o_kanban_record_title">
                                     <strong><t t-esc="record.employee_id.value"/></strong>
                                 </span>
                             </div>
                             <hr class="mt4 mb8"/>
                             <div class="o_kanban_record_subtitle">
-                                <i class="fa fa-calendar" aria-hidden="true"></i>
+                                <i class="fa fa-calendar" aria-label="Period" role="img" title="Period"></i>
                                 <t t-esc="record.check_in.value"/>
                                 - <t t-esc="record.check_out.value"/>
                             </div>
diff --git a/addons/hr_attendance/views/hr_employee_view.xml b/addons/hr_attendance/views/hr_employee_view.xml
index e412a850bbf9..e2b101928685 100644
--- a/addons/hr_attendance/views/hr_employee_view.xml
+++ b/addons/hr_attendance/views/hr_employee_view.xml
@@ -12,8 +12,8 @@
                 <button name="%(hr_attendance_action_employee)d"
                     class="oe_stat_button"
                     type="action" attrs="{'invisible': [('attendance_state', '=', False)]}">
-                    <div id="oe_hr_attendance_status" class="fa fa-fw fa-user o_button_icon oe_hr_attendance_status_green" attrs="{'invisible': [('attendance_state', '=', 'checked_out')]}"/>
-                    <div id="oe_hr_attendance_status" class="fa fa-fw fa-user o_button_icon oe_hr_attendance_status_red" attrs="{'invisible': [('attendance_state', '=', 'checked_in')]}"/>
+                    <div role="img" id="oe_hr_attendance_status" class="fa fa-fw fa-user o_button_icon oe_hr_attendance_status_green" attrs="{'invisible': [('attendance_state', '=', 'checked_out')]}" aria-label="Available" title="Available"/>
+                    <div role="img" id="oe_hr_attendance_status" class="fa fa-fw fa-user o_button_icon oe_hr_attendance_status_red" attrs="{'invisible': [('attendance_state', '=', 'checked_in')]}" aria-label="Not available" title="Not available"/>
                     <div class="o_stat_info">
                         <span class="o_stat_text">Attendance</span>
                     </div>
@@ -55,15 +55,15 @@
                     <t t-name="kanban-box">
                     <div class="oe_kanban_global_click">
                         <div class="o_kanban_image">
-                            <img t-att-src="kanban_image('hr.employee', 'image_medium', record.id.raw_value)"/>
+                            <img t-att-src="kanban_image('hr.employee', 'image_medium', record.id.raw_value)" alt="Employee"/>
                         </div>
                         <div class="oe_kanban_details">
                             <div id="textbox">
                                 <div class="pull-right" t-if="record.attendance_state.raw_value == 'checked_in'">
-                                    <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_green"></span>
+                                    <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_green" role="img" aria-label="Available" title="Available"></span>
                                 </div>
                                 <div class="pull-right" t-if="record.attendance_state.raw_value == 'checked_out'">
-                                    <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_red"></span>
+                                    <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_red" role="img" aria-label="Not available" title="Not available"></span>
                                 </div>
                                 <strong>
                                     <field name="name"/>
@@ -93,10 +93,10 @@
             <field name="name" position="replace">
                 <div>
                     <div class="pull-right" t-if="record.attendance_state.raw_value == 'checked_in'">
-                        <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_green"></span>
+                        <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_green" role="img" aria-label="Available" title="Available"></span>
                     </div>
                     <div class="pull-right" t-if="record.attendance_state.raw_value == 'checked_out'">
-                        <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_red"></span>
+                        <span id="oe_hr_attendance_status" class="fa fa-user oe_hr_attendance_status_red" role="img" aria-label="Not available" title="Not available"></span>
                     </div>
                     <strong>
                         <field name="name" placeholder="Employee's Name"/>
diff --git a/addons/hr_attendance/views/res_config_settings_views.xml b/addons/hr_attendance/views/res_config_settings_views.xml
index 9cbeeba3f7dc..6d04db7ee611 100644
--- a/addons/hr_attendance/views/res_config_settings_views.xml
+++ b/addons/hr_attendance/views/res_config_settings_views.xml
@@ -15,7 +15,7 @@
                                 <field name="group_attendance_use_pin"/>
                             </div>
                             <div class="o_setting_right_pane">
-                                <label string="Employee PIN"/>
+                                <span class="o_form_label">Employee PIN</span>
                                 <div class="text-muted">
                                     Use PIN codes to check in in Kiosk Mode
                                 </div>
diff --git a/addons/hr_contract/views/hr_contract_views.xml b/addons/hr_contract/views/hr_contract_views.xml
index 78c57240ab89..ef1cfad0f331 100644
--- a/addons/hr_contract/views/hr_contract_views.xml
+++ b/addons/hr_contract/views/hr_contract_views.xml
@@ -175,12 +175,12 @@
                     <t t-name="kanban-box">
                         <div class="oe_kanban_card oe_kanban_global_click">
                             <div class="o_dropdown_kanban dropdown" groups="base.group_user">
-                                <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                <a class="dropdown-toggle btn" role="button" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                     <span class="fa fa-ellipsis-v"/>
                                 </a>
-                                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                    <t t-if="widget.editable"><li><a type="edit">Edit Contract</a></li></t>
-                                    <t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t>
+                                <ul class="dropdown-menu" role="menu">
+                                    <t t-if="widget.editable"><li><a role="menuitem" type="edit">Edit Contract</a></li></t>
+                                    <t t-if="widget.deletable"><li><a role="menuitem" type="delete">Delete</a></li></t>
                                 </ul>
                             </div>
                             <div class="oe_kanban_content">
@@ -191,7 +191,7 @@
                                     <field name="job_id"/>
                                 </div>
                                 <div class="oe_kanban_bottom_right">
-                                    <img t-att-src="kanban_image('hr.employee', 'image_medium', record.employee_id.raw_value)" t-att-title="record.employee_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                    <img t-att-src="kanban_image('hr.employee', 'image_medium', record.employee_id.raw_value)" t-att-title="record.employee_id.value" t-att-alt="record.employee_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                 </div>
                             </div>
                             <div class="oe_clear"></div>
diff --git a/addons/hr_expense/views/res_config_settings_views.xml b/addons/hr_expense/views/res_config_settings_views.xml
index 7d5aab933bfb..b27b20d6e0b5 100644
--- a/addons/hr_expense/views/res_config_settings_views.xml
+++ b/addons/hr_expense/views/res_config_settings_views.xml
@@ -22,7 +22,7 @@
                                     </div>
                                     <div class="content-group" attrs="{'invisible': ['|', ('use_mailgateway', '=',  False), ('alias_domain', 'in', ['localhost', '', False])]}">
                                         <div class="mt16">
-                                            <label string="Email Alias" class="o_light_label"/>
+                                            <label for="expense_alias_prefix" string="Email Alias" class="o_light_label"/>
                                             <field name="expense_alias_prefix" class="oe_inline"/>
                                             <span>@</span>
                                             <field name="alias_domain"  class="oe_inline" readonly="1"/>
diff --git a/addons/hr_holidays/report/hr_leave_reports.xml b/addons/hr_holidays/report/hr_leave_reports.xml
index c3728fff2136..a1c59ae63fa5 100644
--- a/addons/hr_holidays/report/hr_leave_reports.xml
+++ b/addons/hr_holidays/report/hr_leave_reports.xml
@@ -73,7 +73,7 @@
                         <div t-attf-class="oe_kanban_global_click">
                             <div>
                                 <span>
-                                    <img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" width="40" height="40" class="oe_kanban_avatar pull-left mr4"/>
+                                    <img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" t-att-alt="record.employee_id.value" width="40" height="40" class="oe_kanban_avatar pull-left mr4"/>
                                 </span>
                                 <span>
                                     <div>
diff --git a/addons/hr_holidays/views/hr_leave_allocation_views.xml b/addons/hr_holidays/views/hr_leave_allocation_views.xml
index d5fc5abe820a..620ef641a08c 100644
--- a/addons/hr_holidays/views/hr_leave_allocation_views.xml
+++ b/addons/hr_holidays/views/hr_leave_allocation_views.xml
@@ -75,7 +75,8 @@
                             <field name="type_request_unit" invisible="1"/>
                             <field name="name" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')]}"/>
                             <field name="holiday_status_id" context="{'employee_id':employee_id}"/>
-                            <label string="Duration" attrs="{'invisible': [('accrual', '=', True)]}"/>
+                            <label for="number_of_days_temp" string="Duration" attrs="{'invisible': [('type_request_unit', '=', 'hour'),('accrual', '=', True)]}"/>
+                            <label for="number_of_hours" string="Duration" attrs="{'invisible': [('type_request_unit', '!=', 'hour'),('accrual', '=', True)]}"/>
                             <div>
                                 <div attrs="{'invisible': ['|', ('type_request_unit', '=', 'hour'), ('accrual', '=', True)]}">
                                     <field name="number_of_days_temp" class="oe_inline" attrs="{'readonly': [('state', '=', 'validate')]}"/> days
diff --git a/addons/hr_maintenance/views/maintenance_views.xml b/addons/hr_maintenance/views/maintenance_views.xml
index 292bd62429e9..24aa8ad73746 100644
--- a/addons/hr_maintenance/views/maintenance_views.xml
+++ b/addons/hr_maintenance/views/maintenance_views.xml
@@ -99,7 +99,7 @@
                 <field name="department_id"/>
             </xpath>
             <xpath expr="//img[@t-att-title='record.owner_user_id.value']" position='replace'>
-                <img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" width="27" height="27" class="oe_kanban_avatar"/>
+                <img t-att-src="kanban_image('hr.employee', 'image_small', record.employee_id.raw_value)" t-att-title="record.employee_id.value" t-att-alt="record.employee_id.value" width="27" height="27" class="oe_kanban_avatar"/>
             </xpath>
             <div t-if="record.serial_no.raw_value" position='after'>
                 <div t-if="!record.employee_id.raw_value">Unassigned</div>
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 f4e7c53b1259..2984d98a72dd 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
@@ -63,7 +63,7 @@
                     <a class="well media-object text-center o_employee_redirect"
                             t-att-href="managers[0].link"
                             t-att-data-employee-id="managers[0].id">
-                        <i t-attf-class="fa fa-angle-double-up"/>
+                        <i t-attf-class="fa fa-angle-double-up" role="img" aria-label="More managers" title="More managers"/>
                     </a>
                 </div>
             </div>
@@ -83,7 +83,7 @@
     </t>
 
     <t t-if="!children.length &amp;&amp; !managers.length">
-        <div class="alert alert-info">
+        <div class="alert alert-info" role="alert">
             <p><b>No hierarchy position.</b></p>
             <p>This employee has no manager or subordinate.</p>
             <p>In order to get an organigram, set a manager and save the record.</p>
@@ -152,7 +152,7 @@
 <t t-name="hr_orgchart_emp_popover_title">
     <div>
         <span t-att-style='"background-image:url(\"/web/image/hr.employee/" + employee.id + "/image/\")"'/>
-        <a href="#" class="pull-right o_employee_redirect" t-att-data-employee-id="employee.id"><i class="fa fa-external-link"></i></a>
+        <a href="#" class="pull-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>
 </t>
diff --git a/addons/hr_payroll/views/res_config_settings_views.xml b/addons/hr_payroll/views/res_config_settings_views.xml
index 1e2193325064..5b72ee8cd7b5 100644
--- a/addons/hr_payroll/views/res_config_settings_views.xml
+++ b/addons/hr_payroll/views/res_config_settings_views.xml
@@ -23,7 +23,7 @@
                     <div class="row mt16 o_settings_container" id="hr_payroll_localization" attrs="{'invisible': ['|', '|', ('module_l10n_fr_hr_payroll', '=', True), ('module_l10n_be_hr_payroll', '=', True), ('module_l10n_in_hr_payroll', '=', True)]}">
                         <div class="col-md-6 col-xs-12 o_setting_box">
                             <div class="o_setting_right_pane">
-                                <label string="Payroll Rules"/>
+                                <span class="o_form_label">Payroll Rules</span>
                                 <div class="text-muted">
                                     Payroll rules that apply to your country
                                 </div>
diff --git a/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees_views.xml b/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees_views.xml
index 0607cbc5d578..64417d67a50d 100644
--- a/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees_views.xml
+++ b/addons/hr_payroll/wizard/hr_payroll_payslips_by_employees_views.xml
@@ -10,7 +10,7 @@
                         <button icon="fa-cogs" string="Generate" name="compute_sheet" type="object" class="oe_highlight"  />
                     </header>
                     <group>
-                        <label colspan="4" nolabel="1" string="This wizard will generate payslips for all selected employee(s) based on the dates and credit note specified on Payslips Run." />
+                        <span colspan="4" nolabel="1">This wizard will generate payslips for all selected employee(s) based on the dates and credit note specified on Payslips Run.</span>
                     </group>
                     <group colspan="4" >
                         <separator string="Employees" colspan="4"/>
diff --git a/addons/hr_recruitment/data/hr_recruitment_data.xml b/addons/hr_recruitment/data/hr_recruitment_data.xml
index 8cfb048e4402..0a5a6fad0826 100644
--- a/addons/hr_recruitment/data/hr_recruitment_data.xml
+++ b/addons/hr_recruitment/data/hr_recruitment_data.xml
@@ -221,7 +221,7 @@
             % if object.job_id.address_id:
             <div style="width:598px;margin:0px auto;border-left:1px solid #dddddd;border-right:1px solid #dddddd;border-bottom:1px solid #dddddd;">
                 <a href="https://maps.google.com/maps?q=${location}" target="new">
-                    <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&size=598x200&maptype=roadmap&format=png&visual_refresh=true&markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom;"/>
+                    <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&size=598x200&maptype=roadmap&format=png&visual_refresh=true&markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom;" alt="Google Maps"/>
                 </a>
             </div>
             % endif
@@ -360,7 +360,7 @@
             % if object.job_id.address_id:
             <div style="width:598px;margin:0px auto;border-left:1px solid #dddddd;border-right:1px solid #dddddd;border-bottom:1px solid #dddddd;">
                 <a href="https://maps.google.com/maps?q=${location}" target="new">
-                    <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&size=598x200&maptype=roadmap&format=png&visual_refresh=true&markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom;"/>
+                    <img src="http://maps.googleapis.com/maps/api/staticmap?autoscale=1&size=598x200&maptype=roadmap&format=png&visual_refresh=true&markers=size:mid%7Ccolor:0xa5117d%7Clabel:%7C${location}" style="vertical-align:bottom;" alt="Google Maps"/>
                 </a>
             </div>
             % endif
diff --git a/addons/hr_recruitment/views/hr_job_views.xml b/addons/hr_recruitment/views/hr_job_views.xml
index 201d58970cf9..cab60a278394 100644
--- a/addons/hr_recruitment/views/hr_job_views.xml
+++ b/addons/hr_recruitment/views/hr_job_views.xml
@@ -30,11 +30,11 @@
                                 <div class="o_kanban_card_header_title">
                                     <div class="o_primary"><t t-esc="record.name.value"/></div>
                                     <div t-if="record.alias_name.value and record.alias_domain.value and record.state.raw_value == 'recruit'" class="o_secondary o_job_alias">
-                                        <small> <i class="fa fa-envelope-o"></i> <field name="alias_id"/> </small>
+                                        <small> <i class="fa fa-envelope-o" role="img" aria-label="Alias" title="Alias"></i> <field name="alias_id"/> </small>
                                     </div>
                                 </div>
                                 <div class="o_kanban_manage_button_section">
-                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                 </div>
                             </div>
                             <div class="container o_kanban_card_content">
@@ -47,7 +47,7 @@
                                     <div name="kanban_boxes" class="row o_recruitment_kanban_boxes">
                                         <div class="o_recruitment_kanban_box o_kanban_primary_bottom bottom_block">
                                             <a name="action_get_attachment_tree_view" type="object">
-                                                <span title='Documents'><i class='fa fa-book'/>
+                                                <span title='Documents'><i class='fa fa-book' role="img" aria-label="Documents"/>
                                                 </span>
                                             </a>
                                         </div>
@@ -66,16 +66,16 @@
                                         </div>
                                     </div>
                                 </t>
-                            </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                            </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                 <div t-if="widget.editable" class="o_kanban_card_manage_settings row">
-                                    <div class="col-xs-8">
-                                        <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                    <div class="col-xs-8" role="menuitem" aria-haspopup="true">
+                                        <ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
                                     </div>
                                     <div class="col-xs-4">
-                                        <a t-if="record.state.raw_value == 'recruit'" name="set_open" type="object">Recruitment Done</a>
-                                        <a t-if="record.state.raw_value == 'open'" name="set_recruit" type="object">Start recruitment</a>
-                                        <br/>
-                                        <a name="edit_job" type="edit">Edit</a>
+                                        <a role="menuitem" t-if="record.state.raw_value == 'recruit'" name="set_open" type="object">Recruitment Done</a>
+                                        <a role="menuitem" t-if="record.state.raw_value == 'open'" name="set_recruit" type="object">Start recruitment</a>
+                                        <br role="separator"/>
+                                        <a role="menuitem" name="edit_job" type="edit">Edit</a>
                                     </div>
                                 </div>
                             </div>
diff --git a/addons/hr_recruitment/views/hr_recruitment_views.xml b/addons/hr_recruitment/views/hr_recruitment_views.xml
index 96e18b5436b5..cda14788ae33 100644
--- a/addons/hr_recruitment/views/hr_recruitment_views.xml
+++ b/addons/hr_recruitment/views/hr_recruitment_views.xml
@@ -290,13 +290,13 @@
                         <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_applicant_kanban oe_semantic_html_override">
                             <div class="o_dropdown_kanban dropdown">
 
-                                <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                <a class="dropdown-toggle btn" role="button" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                     <span class="fa fa-ellipsis-v"/>
                                 </a>
-                                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                    <t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t>
-                                    <li><a name="action_makeMeeting" type="object">Schedule Interview</a></li>
-                                    <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                <ul class="dropdown-menu" role="menu">
+                                    <t t-if="widget.deletable"><li><a role="menuitem" type="delete">Delete</a></li></t>
+                                    <li><a role="menuitem" name="action_makeMeeting" type="object">Schedule Interview</a></li>
+                                    <li role="menuitem" aira-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                                 </ul>
                             </div>
                             <div class="oe_kanban_content">
@@ -313,7 +313,7 @@
                                     </div>
                                 </div>
                                 <field name="categ_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
-                                <t t-if="record.partner_mobile.raw_value"><i class="fa fa-mobile mr4"/><field name="partner_mobile"/><br/></t>
+                                <t t-if="record.partner_mobile.raw_value"><i class="fa fa-mobile mr4" role="img" aria-label="Mobile" title="Mobile"/><field name="partner_mobile"/><br/></t>
                                 <div class="o_kanban_record_bottom mt4">
                                     <div class="oe_kanban_bottom_left">
                                         <div class="pull-left mr4" groups="base.group_user">
@@ -323,12 +323,12 @@
                                             <field name="activity_ids" widget="kanban_activity"/>
                                         </div>
                                         <t t-if="record.message_needaction_counter.raw_value">
-                                            <span class='oe_kanban_mail_new mr4' title='Unread Messages'><i class='fa fa-comments'/><t t-raw="record.message_needaction_counter.raw_value"/></span>
+                                            <span role="alert" class='oe_kanban_mail_new mr4' title='Unread Messages'><i class='fa fa-comments' role="img" aria-label="Unread messages"/><t t-raw="record.message_needaction_counter.raw_value"/></span>
                                         </t>
                                     </div>
                                     <div class="oe_kanban_bottom_right">
                                         <a name="action_get_attachment_tree_view" type="object">
-                                            <span title='Documents'><i class='fa fa-book'/>
+                                            <span title='Documents'><i class='fa fa-book' role="img" aria-label="Documents"/>
                                                 <t t-esc="record.attachment_number.raw_value"/>
                                             </span>
                                         </a>
@@ -338,7 +338,7 @@
                                             <field name="legend_blocked" invisible="1"/>
                                             <field name="legend_done" invisible="1"/>
                                         </div>
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="30" height="30" class="oe_kanban_avatar"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="30" height="30" class="oe_kanban_avatar"/>
                                     </div>
                                     
                                 </div>
diff --git a/addons/hr_recruitment/views/res_config_settings_views.xml b/addons/hr_recruitment/views/res_config_settings_views.xml
index e651f2bae83d..1c91baa043bc 100644
--- a/addons/hr_recruitment/views/res_config_settings_views.xml
+++ b/addons/hr_recruitment/views/res_config_settings_views.xml
@@ -16,7 +16,7 @@
                                     <field name="module_website_hr_recruitment"/>
                                 </div>
                                 <div class="o_setting_right_pane">
-                                    <label string="Online Posting"/>
+                                    <label for="module_website_hr_recruitment" string="Online Posting"/>
                                     <div class="text-muted">
                                         Publish available jobs on your website
                                     </div>
@@ -30,7 +30,7 @@
                                     <field name="module_hr_recruitment_survey"/>
                                 </div>
                                 <div class="o_setting_right_pane">
-                                    <label string="Interview Forms"/>
+                                    <label for="module_hr_recruitment_survey" string="Interview Forms"/>
                                     <div class="text-muted">
                                         Use interview forms during recruitment process
                                     </div>
diff --git a/addons/hr_timesheet/views/hr_timesheet_views.xml b/addons/hr_timesheet/views/hr_timesheet_views.xml
index caefdad4c90f..9b430471cdfe 100644
--- a/addons/hr_timesheet/views/hr_timesheet_views.xml
+++ b/addons/hr_timesheet/views/hr_timesheet_views.xml
@@ -176,7 +176,7 @@
                             <div t-attf-class="oe_kanban_global_click">
                                 <div class="row">
                                     <div class="col-xs-2">
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="40" height="40" class="oe_kanban_avatar pull-left"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="40" height="40" class="oe_kanban_avatar pull-left"/>
                                     </div>
                                     <div class="col-xs-10">
                                         <div>
@@ -191,7 +191,7 @@
                                 </div>
                                 <hr class="mt4 mb4"/>
                                 <span>
-                                    <i class="fa fa-calendar" aria-hidden="true"></i>
+                                    <i class="fa fa-calendar" role="img" aria-label="Date" title="Date"></i>
                                     <t t-esc="record.date.value"/>
                                 </span>
                                 <span class="pull-right">
diff --git a/addons/hr_timesheet/views/project_views.xml b/addons/hr_timesheet/views/project_views.xml
index 619878cf4597..3efe8b9942b4 100644
--- a/addons/hr_timesheet/views/project_views.xml
+++ b/addons/hr_timesheet/views/project_views.xml
@@ -77,7 +77,7 @@
                             </group>
                         </group>
                         <group name="timesheet_error" attrs="{'invisible': [('allow_timesheets', '!=', False)]}">
-                            <div class="alert alert-warning">
+                            <div class="alert alert-warning" role="alert">
                                 Your project is linked to an inactive analytic account. Change it, or reactivate the current one to timesheet on the project.
                             </div>
                         </group>
diff --git a/addons/iap/static/src/xml/iap_templates.xml b/addons/iap/static/src/xml/iap_templates.xml
index 4995c4527e32..7503e0aa3f80 100644
--- a/addons/iap/static/src/xml/iap_templates.xml
+++ b/addons/iap/static/src/xml/iap_templates.xml
@@ -19,8 +19,8 @@
     <t t-extend="DashboardApps">
         <t t-jquery=".o_web_settings_dashboard_pills" t-operation="after">
             <div class="text-center" style="display: inline-block">
-                <a t-att-href="widget.data.url" target="_blank">
-                <i class="fa fa-money fa-2x text-muted"/> In-App Purchases</a>
+                <a t-att-href="widget.data.url" target="_blank" class="fa fa-money fa-2x text-muted">
+                In-App Purchases</a>
             </div>
         </t>
     </t>
diff --git a/addons/im_livechat/static/src/xml/copy_clipboard.xml b/addons/im_livechat/static/src/xml/copy_clipboard.xml
index a6c1cb8a1974..61c17cebb17a 100644
--- a/addons/im_livechat/static/src/xml/copy_clipboard.xml
+++ b/addons/im_livechat/static/src/xml/copy_clipboard.xml
@@ -3,13 +3,13 @@
 
     <t t-name="CopyClipboardText">
         <button class="btn btn-xs btn-primary o_clipboard_button o_btn_text_copy">
-            <i class="fa fa-clipboard"/> Copy Text
+            <span class="fa fa-clipboard">Copy Text</span>
         </button>
     </t>
 
     <t t-name="CopyClipboardChar">
         <button class="btn btn-xs btn-primary o_clipboard_button o_btn_char_copy">
-            <i class="fa fa-clipboard"/> Copy Text
+            <span class="fa fa-clipboard">Copy Text</span>
         </button>
     </t>
 
diff --git a/addons/im_livechat/static/src/xml/im_livechat_backend.xml b/addons/im_livechat/static/src/xml/im_livechat_backend.xml
index 49018af65eb9..185f3157a49e 100644
--- a/addons/im_livechat/static/src/xml/im_livechat_backend.xml
+++ b/addons/im_livechat/static/src/xml/im_livechat_backend.xml
@@ -17,8 +17,7 @@
     <t t-extend="mail.discuss_mobile">
         <t t-jquery=".o_mail_mobile_tabs" t-operation="append">
             <div class="o_mail_mobile_tab" data-type="livechat">
-                <span class="fa fa-comments"/>
-                <span class="o_tab_title">Livechat</span>
+                <span class="fa fa-comments o_tab_title">Livechat</span>
             </div>
         </t>
     </t>
diff --git a/addons/im_livechat/views/im_livechat_channel_views.xml b/addons/im_livechat/views/im_livechat_channel_views.xml
index 3e1fa0bce284..86312084fbda 100644
--- a/addons/im_livechat/views/im_livechat_channel_views.xml
+++ b/addons/im_livechat/views/im_livechat_channel_views.xml
@@ -36,23 +36,23 @@
                         <t t-name="kanban-box">
                             <div class="oe_kanban_global_click">
                                 <div class="o_kanban_image">
-                                    <img t-att-src="kanban_image('im_livechat.channel', 'image_medium', record.id.raw_value)" class="img-responsive"/>
+                                    <img t-att-src="kanban_image('im_livechat.channel', 'image_medium', record.id.raw_value)" class="img-responsive" alt="Channel"/>
                                 </div>
                                 <div class="oe_kanban_details">
                                     <strong class="o_kanban_record_title"><field name="name"/></strong>
                                     <div>
                                         <p>
-                                            <i class="fa fa-user"></i>
+                                            <i class="fa fa-user" role="img" aria-label="User" title="User"></i>
                                             <t t-esc="(record.user_ids.raw_value || []).length"/> Operators
                                             <br/>
-                                            <i class="fa fa-comments"></i>
+                                            <i class="fa fa-comments" role="img" aria-label="Comments" title="Comments"></i>
                                             <t t-esc="record.nbr_channel.raw_value"/> Sessions
                                             <div>
                                                 <t t-if="record.rating_percentage_satisfaction.raw_value &gt; 0">
                                                     <a type="action" name="%(rating_rating_action_view_livechat_rating)d">
-                                                        <i class="fa fa-smile-o text-success" t-if="record.rating_percentage_satisfaction.raw_value &gt;= 70" title="Rating: Great"/>
-                                                        <i class="fa fa-meh-o text-warning" t-if="record.rating_percentage_satisfaction.raw_value &gt; 30 and record.rating_percentage_satisfaction.raw_value &lt; 70" title="Rating: Okay"/>
-                                                        <i class="fa fa-frown-o text-danger" t-if="record.rating_percentage_satisfaction.raw_value &lt;= 30" title="Rating: Bad"/>
+                                                        <i class="fa fa-smile-o text-success" t-if="record.rating_percentage_satisfaction.raw_value &gt;= 70" title="Rating: Great" role="img" aria-label="Happy face"/>
+                                                        <i class="fa fa-meh-o text-warning" t-if="record.rating_percentage_satisfaction.raw_value &gt; 30 and record.rating_percentage_satisfaction.raw_value &lt; 70" title="Rating: Okay" role="img" aria-label="Neutral face"/>
+                                                        <i class="fa fa-frown-o text-danger" t-if="record.rating_percentage_satisfaction.raw_value &lt;= 30" title="Rating: Bad" role="img" aria-label="Sad face"/>
                                                        <t t-esc="record.rating_percentage_satisfaction.raw_value"/>%
                                                    </a>
                                                 </t>
@@ -106,9 +106,9 @@
                                     <templates>
                                         <t t-name="kanban-box">
                                             <div>
-                                                <a t-if="!read_only_mode" type="delete" class="fa fa-times pull-right"/>
+                                                <a t-if="!read_only_mode" type="delete" class="fa fa-times pull-right" aria-label="Delete" title="Delete"/>
                                                 <div class="o_kanban_image">
-                                                    <img t-att-src="kanban_image('res.users', 'image', record.id.raw_value)"/>
+                                                    <img t-att-src="kanban_image('res.users', 'image', 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/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml b/addons/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml
index b17cc3698580..674134cbbfdd 100644
--- a/addons/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml
+++ b/addons/l10n_be_hr_payroll/views/l10n_be_hr_payroll_view.xml
@@ -62,7 +62,7 @@
                     <field name="car_atn" attrs="{'invisible': [('transport_mode_car', '=', False)]}" invisible="1"/>
                     <field name="transport_employer_cost" invisible="1"/>
                     <field name="transport_mode_public"/>
-                    <label string="Public Transport" attrs="{'invisible': [('transport_mode_public', '=', False)]}" name="public_transport_label"/>
+                    <span class="o_form_label" attrs="{'invisible': [('transport_mode_public', '=', False)]}" name="public_transport_label">Public Transport</span>
                     <div attrs="{'invisible': [('transport_mode_public', '=', False)]}" name="public_transport_div">
                         <div>
                             <label for="public_transport_employee_amount" class="oe_inline"/>
@@ -74,7 +74,7 @@
                         </div>
                     </div>
                     <field name="transport_mode_others"/>
-                    <label string="Other" attrs="{'invisible': [('transport_mode_others', '=', False)]}" name="others_label"/>
+                    <span class="o_form_label" attrs="{'invisible': [('transport_mode_others', '=', False)]}" name="others_label">Other</span>
                     <div attrs="{'invisible': [('transport_mode_others', '=', False)]}" class="o_row" name="others_div">
                         <field name="others_reimbursed_amount" class="oe_inline" nolabel="1"/>
                         <span>/ month</span>
diff --git a/addons/l10n_be_hr_payroll_fleet/views/res_config_settings_views.xml b/addons/l10n_be_hr_payroll_fleet/views/res_config_settings_views.xml
index f4800282ec2e..5e1647cab232 100644
--- a/addons/l10n_be_hr_payroll_fleet/views/res_config_settings_views.xml
+++ b/addons/l10n_be_hr_payroll_fleet/views/res_config_settings_views.xml
@@ -14,7 +14,7 @@
                             <div class="col-xs-12 col-md-6 o_setting_box">
                                 <div class="o_setting_left_pane"/>
                                 <div class="o_setting_right_pane">
-                                    <label string="New Car Request"/>
+                                    <span class="o_form_label">New Car Request</span>
                                     <div class="text-muted content-group mt16">
                                         <span>An employee cannot request a new car if there are more than </span>
                                         <field name="max_unused_cars" class="text-center oe_inline" />
diff --git a/addons/l10n_ch/views/res_config_settings_views.xml b/addons/l10n_ch/views/res_config_settings_views.xml
index 2fa7a54386cc..486f2e3e1836 100644
--- a/addons/l10n_ch/views/res_config_settings_views.xml
+++ b/addons/l10n_ch/views/res_config_settings_views.xml
@@ -32,7 +32,7 @@
                     <div class="col-xs-12 col-md-6 o_setting_box" id="l10n_ch-isr_print_scanline_offset">
                         <div class="o_setting_left_pane"/>
                         <div class="o_setting_right_pane">
-                            <label string="ISR scan line offset"/>
+                            <span class="o_form_label">ISR scan line offset</span>
                             <div class="text-muted">
                                 Offset to move the the scan line in mm
                             </div>
diff --git a/addons/l10n_fr_hr_payroll/views/res_config_settings_views.xml b/addons/l10n_fr_hr_payroll/views/res_config_settings_views.xml
index 4444039af5fb..60e08b966207 100644
--- a/addons/l10n_fr_hr_payroll/views/res_config_settings_views.xml
+++ b/addons/l10n_fr_hr_payroll/views/res_config_settings_views.xml
@@ -12,8 +12,8 @@
                     <div class="col-xs-12 col-md-6 o_setting_box">
                         <div class="o_setting_left_pane"/>
                         <div class="o_setting_right_pane">
-                            <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
-                            <label string="Paie"/>
+                            <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
+                            <span class="o_form_label">Paie</span>
                             <div class="content-group">
                                 <div class="row mt16">
                                     <label for="plafond_secu" class="col-md-3 o_light_label"/>
diff --git a/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth_view.xml b/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth_view.xml
index 3de7c0d4ebb3..1533a5c6e98b 100644
--- a/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth_view.xml
+++ b/addons/l10n_in_hr_payroll/wizard/hr_salary_employee_bymonth_view.xml
@@ -5,7 +5,7 @@
             <field name="model">hr.salary.employee.month</field>
             <field name="arch" type="xml">
             <form string="Employee Pay Head Breakup">
-                <label string="This wizard will print report which displays employees break-up of Net Head for a specified dates."/>
+                <span class="o_form_label">This wizard will print report which displays employees break-up of Net Head for a specified dates.</span>
                 <footer>
                     <button name="print_report" string="Print" type="object" class="btn-primary"/>
                     <button string="Cancel" class="btn-default" special="cancel" />
diff --git a/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail_view.xml b/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail_view.xml
index 1b9b3fb0eab2..fab60113887c 100644
--- a/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail_view.xml
+++ b/addons/l10n_in_hr_payroll/wizard/hr_yearly_salary_detail_view.xml
@@ -5,7 +5,7 @@
             <field name="model">yearly.salary.detail</field>
             <field name="arch" type="xml">
             <form string="Pay Head Employee Breakup">
-                <label string="This wizard will print report which display a pay head employee breakup for a specified dates."/>
+                <span class="o_form_label">This wizard will print report which display a pay head employee breakup for a specified dates.</span>
                 <footer>
                     <button name="print_report" string="Print" type="object" class="btn-primary"/>
                     <button string="Cancel" class="btn-default" special="cancel" />
diff --git a/addons/lunch/static/src/xml/lunch.xml b/addons/lunch/static/src/xml/lunch.xml
index 4efb8f9f5de4..6b454f0b4ecb 100644
--- a/addons/lunch/static/src/xml/lunch.xml
+++ b/addons/lunch/static/src/xml/lunch.xml
@@ -11,8 +11,7 @@
             <h3><t t-esc="supplier"/></h3>
             <div t-foreach='categories[supplier]' t-as='order' class="o_lunch_vignette">
                 <button type="button" class="pull-right o_add_button oe_edit_only oe_link" t-att-data-id="order.line_id">
-                    <span class="fa fa-plus-square"></span>
-                    <span>Add</span>
+                    <span class="fa fa-plus-square">Add</span>
                 </button>
                 <div>
                     <t t-esc="order.product_name"/>
diff --git a/addons/lunch/views/lunch_views.xml b/addons/lunch/views/lunch_views.xml
index 5281ed69a3b7..6016d9a0bc4d 100644
--- a/addons/lunch/views/lunch_views.xml
+++ b/addons/lunch/views/lunch_views.xml
@@ -105,17 +105,17 @@
                                     </div>
                                     <div class="col-xs-4 text-right">
                                         <span class="badge">
-                                            <strong><i class="fa fa-money"/> <field name="amount"/></strong>
+                                            <strong><i class="fa fa-money" role="img" aria-label="Amount" title="Amount"/> <field name="amount"/></strong>
                                         </span>
                                     </div>
                                 </div>
                                 <div class="row">
                                     <div class="col-xs-6">
-                                        <i class="fa fa-clock-o"/>
+                                        <i class="fa fa-clock-o" role="img" aria-label="Date" title="Date"/>
                                         <t t-esc="record.date.value"/>
                                     </div>
                                     <div class="col-xs-6">
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                     </div>
                                 </div>
                             </div>
@@ -213,9 +213,9 @@
               </p><p>
                 Here you can see today's orders grouped by vendors.
               </p><p>
-                Click on the <span class="fa fa-phone text-success"/> to announce that the order is ordered.<br/>
-                Click on the <span class="fa fa-check text-success"/> to announce that the order is received.<br/>
-                Click on the <span class="fa fa-times-circle text-danger"/> to announce that the order isn't available.
+                Click on the <span class="fa fa-phone text-success" role="img" aria-label="Order button" title="Order button"/> to announce that the order is ordered.<br/>
+                Click on the <span class="fa fa-check text-success" role="img" aria-label="Receive button" title="Receive button"/> to announce that the order is received.<br/>
+                Click on the <span class="fa fa-times-circle text-danger" role="img" aria-label="Cancel button" title="Cancel button"/> to announce that the order isn't available.
               </p>
             </field>
         </record>
@@ -234,9 +234,9 @@
               </p><p>
                 Summary of all lunch orders, grouped by vendor and by date.
               </p><p>
-                Click on the <span class="fa fa-phone text-success"/> to announce that the order is ordered.<br/>
-                Click on the <span class="fa fa-check text-success"/> to announce that the order is received.<br/>
-                Click on the <span class="fa fa-times-circle text-danger"/> red X to announce that the order isn't available.
+                Click on the <span class="fa fa-phone text-success" role="img" aria-label="Order button" title="Order button"/> to announce that the order is ordered.<br/>
+                Click on the <span class="fa fa-check text-success" role="img" aria-label="Receive button" title="Receive button"/> to announce that the order is received.<br/>
+                Click on the <span class="fa fa-times-circle text-danger" role="img" aria-label="Cancel button" title="Cancel button"/> red X to announce that the order isn't available.
               </p>
             </field>
         </record>
@@ -390,26 +390,26 @@
                                 </div>
                                 <div class="row">
                                     <div class="col-xs-6">
-                                        <i class="fa fa-money"/> <field name="price"/>
+                                        <i class="fa fa-money" role="img" aria-label="Money" title="Money"/> <field name="price"/>
                                     </div>
                                     <div class="col-xs-6 text-right">
-                                        <i class="fa fa-clock-o"/> <field name="date"/>
+                                        <i class="fa fa-clock-o" role="img" aria-label="Date" title="Date"/> <field name="date"/>
                                     </div>
                                 </div>
                                 <div class="row mt4">
                                     <div class="col-xs-6">
-                                        <a class="btn btn-xs btn-success" name="order" string="Order" type="object" attrs="{'invisible': ['|',('state','=','confirmed'),('state','=','ordered')]}" groups="lunch.group_lunch_manager">
-                                            <i class="fa fa-phone"/>
+                                        <a class="btn btn-xs btn-success" role="button" name="order" string="Order" type="object" attrs="{'invisible': ['|',('state','=','confirmed'),('state','=','ordered')]}" groups="lunch.group_lunch_manager">
+                                            <i class="fa fa-phone" role="img" aria-label="Order button" title="Order button"/>
                                         </a>
-                                        <a class="btn btn-xs btn-info" name="confirm" string="Receive" type="object" attrs="{'invisible': [('state','!=','ordered')]}" groups="lunch.group_lunch_manager">
-                                            <i class="fa fa-check"/>
+                                        <a class="btn btn-xs btn-info" role="button" name="confirm" string="Receive" type="object" attrs="{'invisible': [('state','!=','ordered')]}" groups="lunch.group_lunch_manager">
+                                            <i class="fa fa-check" role="img" aria-label="Receive button" title="Receive button"/>
                                         </a>
-                                        <a class="btn btn-xs btn-danger" name="cancel" string="Cancel" type="object" attrs="{'invisible': [('state','=','cancelled')]}" groups="lunch.group_lunch_manager">
-                                            <i class="fa fa-times"/>
+                                        <a class="btn btn-xs btn-danger" role="button" name="cancel" string="Cancel" type="object" attrs="{'invisible': [('state','=','cancelled')]}" groups="lunch.group_lunch_manager">
+                                            <i class="fa fa-times" role="img" aria-label="Cancel button" title="Cancel button"/>
                                         </a>
                                     </div>
                                     <div class="col-xs-6">
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                     </div>
                                 </div>
                             </div>
@@ -464,7 +464,7 @@
                                 <field name='date'/>
                             </group>
                             <div>
-                                <div attrs="{'invisible': ['|',('state','!=','new'),('alerts','=',False)]}" class="alert alert-danger oe_edit_only">
+                                <div attrs="{'invisible': ['|',('state','!=','new'),('alerts','=',False)]}" class="alert alert-danger oe_edit_only" role="alert">
                                     <field name='alerts'/>
                                 </div>
                             </div>
diff --git a/addons/mail/static/src/xml/activity.xml b/addons/mail/static/src/xml/activity.xml
index 9bdcfcdcb909..9d2f0d72ed8f 100644
--- a/addons/mail/static/src/xml/activity.xml
+++ b/addons/mail/static/src/xml/activity.xml
@@ -2,22 +2,22 @@
 <templates xml:space="preserve">
     <t t-name="mail.activity_items">
         <div class="o_thread_date_separator o_border_dashed" data-toggle="collapse" data-target="#o_chatter_planned_activities">
-            <span class="o_thread_date btn">
-                <i class="fa fa-fw fa-caret-down"/>
-                Planned activities
+            <a href="#" role="button" class="o_thread_date btn">
+                <span class="fa fa-fw fa-caret-down">
+                Planned activities</span>
                 <small class="o_chatter_planned_activities_summary ml8">
                     <span class="label img-circle label-danger"><t t-esc="nbOverdueActivities"/></span>
                     <span class="label img-circle label-warning"><t t-esc="nbTodayActivities"/></span>
                     <span class="label img-circle label-success"><t t-esc="nbPlannedActivities"/></span>
                 </small>
-            </span>
+            </a>
         </div>
         <div id="o_chatter_planned_activities" class="collapse in">
             <t t-foreach="activities" t-as="activity">
                 <div class="o_thread_message" style="margin-bottom: 10px">
                     <div class="o_thread_message_sidebar">
                         <div class="o_avatar_stack">
-                            <img t-attf-src="/web/image#{activity.user_id[0] >= 0 ? ('/res.users/' + activity.user_id[0] + '/image_small') : ''}" class="o_thread_message_avatar img-circle mb8" t-att-title="activity.user_id[1]"/>
+                            <img t-attf-src="/web/image#{activity.user_id[0] >= 0 ? ('/res.users/' + activity.user_id[0] + '/image_small') : ''}" class="o_thread_message_avatar img-circle mb8" t-att-title="activity.user_id[1]" t-att-alt="activity.user_id[1]"/>
                             <i t-att-class="'o_avatar_icon fa ' + activity.icon + ' bg-' + (activity.state == 'planned'? 'success' : (activity.state == 'today'? 'warning' : 'danger')) + '-full'"
                                t-att-title="activity.activity_type_id[1]"/>
                         </div>
@@ -30,7 +30,7 @@
                             <em> for </em>
                             <t t-esc="activity.user_id[1]" />
                             <a class="btn btn-link btn-info text-muted collapsed o_activity_info ml4" role="button" data-toggle="collapse" t-attf-data-target="#o_chatter_activity_info_#{activity.id}">
-                                <i class="fa fa-info-circle"></i>
+                                <i class="fa fa-info-circle" role="img" aria-label="Info" title="Info"></i>
                             </a>
                             <div class="o_thread_message_collapse collapse" t-attf-id="o_chatter_activity_info_#{activity.id}">
                                 <dl class="dl-horizontal well">
@@ -44,7 +44,7 @@
                                     </dd>
                                     <dt>Assigned to</dt>
                                     <dd class="mb8">
-                                        <img t-attf-src="/web/image#{activity.user_id[0] >= 0 ? ('/res.users/' + activity.user_id[0] + '/image_small') : ''}" height="18" width="18" class="img-circle mr4" t-att-title="activity.user_id[1]"/>
+                                        <img t-attf-src="/web/image#{activity.user_id[0] >= 0 ? ('/res.users/' + activity.user_id[0] + '/image_small') : ''}" height="18" width="18" class="img-circle mr4" t-att-title="activity.user_id[1]" t-att-alt="activity.user_id[1]"/>
                                         <b><t t-esc="activity.user_id[1]"/></b>
                                         <em>, due on </em><span t-attf-class="o_activity_color_#{activity.state}"><t t-esc="activity.date_deadline.format(date_format)"/></span>
                                     </dd>
@@ -55,14 +55,14 @@
                             <t t-raw="activity.note"/>
                         </div>
                         <div class="o_thread_message_tools btn-group">
-                            <a href="#" class="btn btn-link btn-success text-muted btn-sm o_activity_done o_activity_link mr8" t-att-data-activity-id="activity.id" t-att-data-previous-activity-type-id="activity.activity_type_id[0]" data-toggle="popover">
-                                <i class="fa fa-check"/> Mark Done
+                            <a role="button" href="#" class="btn btn-link btn-success text-muted btn-sm o_activity_done o_activity_link mr8" t-att-data-activity-id="activity.id" t-att-data-previous-activity-type-id="activity.activity_type_id[0]" data-toggle="popover">
+                                <span class="fa fa-check">Mark Done</span>
                             </a>
-                            <a href="#" class="btn btn-link btn-default text-muted btn-sm o_activity_edit o_activity_link" t-att-data-activity-id="activity.id">
-                                <i class="fa fa-pencil"/> Edit
+                            <a role="button" href="#" class="btn btn-link btn-default text-muted btn-sm o_activity_edit o_activity_link" t-att-data-activity-id="activity.id">
+                                <span class="fa fa-pencil">Edit</span>
                             </a>
-                            <a href="#" class="btn btn-link btn-sm btn-danger text-muted o_activity_unlink o_activity_link" t-att-data-activity-id="activity.id">
-                                <i class="fa fa-times"/> Cancel
+                            <a role="button" href="#" class="btn btn-link btn-sm btn-danger text-muted o_activity_unlink o_activity_link" t-att-data-activity-id="activity.id">
+                                <span class="fa fa-times">Cancel</span>
                             </a>
                         </div>
                     </div>
diff --git a/addons/mail/static/src/xml/chat_window.xml b/addons/mail/static/src/xml/chat_window.xml
index f1138db71d5c..7d0fce19ee69 100644
--- a/addons/mail/static/src/xml/chat_window.xml
+++ b/addons/mail/static/src/xml/chat_window.xml
@@ -20,15 +20,15 @@
 
     <t t-name="mail.ChatWindowsDropdown">
         <div t-attf-class="o_chat_window o_in_home_menu o_chat_window_dropdown dropup #{open ? 'open' : ''}">
-            <span class="o_chat_window_dropdown_toggler dropdown-toggle" data-toggle="dropdown">
-                <i class="fa fa-comments-o"/> <t t-esc="sessions.length"/>
+            <span role="alert" class="o_chat_window_dropdown_toggler dropdown-toggle" data-toggle="dropdown" title="Unread messages">
+                <i class="fa fa-comments-o" role="img" aria-label="Messages"/> <t t-esc="sessions.length"/>
                 <span class="o_total_unread_counter">
                     <t t-if="unread_counter"><t t-esc="unread_counter"/></t>
                 </span>
             </span>
-            <ul class="dropdown-menu">
+            <ul class="dropdown-menu" role="menu">
                 <t t-foreach="sessions" t-as="session">
-                    <li class="o_chat_header" t-att-data-session-id="session.id">
+                    <li role="menuitem" class="o_chat_header" t-att-data-session-id="session.id">
                         <t t-call="mail.ChatWindowHeaderContent">
                             <t t-set="status" t-value="session.window.status"/>
                             <t t-set="title" t-value="session.window.title"/>
@@ -42,7 +42,7 @@
 
     <t t-name="mail.ChatWindowHeaderContent">
         <span t-if="widget.isMobile">
-            <a href="#" class="o_chat_window_close fa fa-1x fa-arrow-left mr4"/>
+            <a href="#" class="o_chat_window_close fa fa-1x fa-arrow-left mr4" aria-label="Close chat window" title="Close chat window"/>
         </span>
         <span class="o_chat_title">
             <t t-if="status" t-call="mail.chat.UserStatus"/>
@@ -50,7 +50,7 @@
             <span t-if="unread_counter"> (<t t-esc="unread_counter"/>)</span>
         </span>
         <span t-if="!widget.isMobile" class="o_chat_window_buttons">
-            <a href="#" class="o_chat_window_close fa fa-close"/>
+            <a href="#" class="o_chat_window_close fa fa-close" aria-label="Close chat window" title="Close chat window"/>
         </span>
     </t>
 
diff --git a/addons/mail/static/src/xml/chatter.xml b/addons/mail/static/src/xml/chatter.xml
index 70f98258fc85..e6cd3995bc76 100644
--- a/addons/mail/static/src/xml/chatter.xml
+++ b/addons/mail/static/src/xml/chatter.xml
@@ -42,7 +42,7 @@
 
         <!-- Add a button to open the full composer dialog -->
         <t t-jquery=".o_composer_button_add_attachment" t-operation="after">
-            <button tabindex="6" class="btn btn-sm btn-icon fa fa-expand o_composer_button_full_composer" type="button"/>
+            <button tabindex="6" class="btn btn-sm btn-icon fa fa-expand o_composer_button_full_composer" type="button" title="Full composer" aria-label="Full composer"/>
         </t>
     </t>
 
@@ -57,7 +57,7 @@
             Log note
         </button>
         <button t-if="schedule_activity_btn" class="btn btn-sm btn-link o_chatter_button_schedule_activity" title="Log or schedule an activity" disabled="disabled">
-            <i class="fa fa-clock-o"/> <t t-if="isMobile">Activity</t><t t-else="">Schedule activity</t>
+            <i class="fa fa-clock-o" role="img" aria-label="Dates" title="Dates"/> <t t-if="isMobile">Activity</t><t t-else="">Schedule activity</t>
         </button>
     </t>
 
@@ -65,9 +65,9 @@
         Chatter main div
     -->
     <t t-name="mail.Chatter">
-        <div class="o_chatter">
+        <aside class="o_chatter">
             <div class="o_chatter_topbar"/>
-        </div>
+        </aside>
     </t>
 
 </templates>
diff --git a/addons/mail/static/src/xml/composer.xml b/addons/mail/static/src/xml/composer.xml
index d09b6bc4f229..752b9febdf96 100644
--- a/addons/mail/static/src/xml/composer.xml
+++ b/addons/mail/static/src/xml/composer.xml
@@ -3,7 +3,7 @@
 
      <div t-name="mail.ChatComposer" t-attf-class="o_chat_composer #{widget.extended ? 'o_chat_composer_extended' : (widget.notInline ? '' : 'o_chat_inline_composer')} #{widget.isMini ? 'o_chat_mini_composer' : ''}">
          <div class="o_composer_container">
-             <img t-if="widget.avatarURL" height="36" width="36" class="o_thread_message_sidebar o_chatter_avatar img-circle" t-att-src="widget.avatarURL"/>
+             <img t-if="widget.avatarURL" height="36" width="36" class="o_thread_message_sidebar o_chatter_avatar img-circle" t-att-src="widget.avatarURL" alt="Avatar"/>
              <div t-if="widget.extended" class="o_composer_subject">
                  <input tabindex="1" type="text" placeholder="Subject" class="o_input"/>
              </div>
@@ -11,9 +11,9 @@
                 <div class="o_composer_input">
                     <textarea class="o_input o_composer_text_field" tabindex="2" placeholder="Write something..."/>
                     <div class="o_chatter_composer_tools">
-                        <button tabindex="4" class="btn btn-sm btn-icon fa fa-smile-o o_composer_button_emoji" type="button" data-toggle="popover"/>
-                        <button tabindex="5" class="btn btn-sm btn-icon fa fa-paperclip o_composer_button_add_attachment" type="button"/>
-                        <button t-if="widget.options.isMobile" tabindex="3" class="btn btn-sm btn-icon fa fa-paper-plane-o o_composer_button_send" type="button"/>
+                        <button tabindex="4" class="btn btn-sm btn-icon fa fa-smile-o o_composer_button_emoji" type="button" data-toggle="popover" title="Emojis" aria-label="Emojis"/>
+                        <button tabindex="5" class="btn btn-sm btn-icon fa fa-paperclip o_composer_button_add_attachment" type="button" aria-label="Add attachment" title="Add attachment"/>
+                        <button t-if="widget.options.isMobile" tabindex="3" class="btn btn-sm btn-icon fa fa-paper-plane-o o_composer_button_send" type="button" title="Send" aria-label="Send"/>
                     </div>
                 </div>
              </div>
@@ -36,18 +36,18 @@
 
     <div t-name="mail.ChatComposer.emojis" class="o_mail_emoji_container">
         <t t-foreach="emojis" t-as="emoji">
-            <button t-att-data-emoji="emoji.source" class="btn btn-link o_mail_emoji" t-att-title="emoji.description">
+            <button t-att-data-emoji="emoji.source" class="btn btn-link o_mail_emoji" t-att-title="emoji.description" t-att-aria-label="emoji.description">
                 <t t-raw="emoji.unicode_source"/>
             </button>
         </t>
     </div>
 
     <t t-name="mail.AbstractMentionSuggestions">
-        <ul class="dropdown-menu" aria-labelledby="dropdownMailMentionMenu">
+        <ul class="dropdown-menu" role="menu">
             <t t-foreach="suggestions" t-as="suggestion">
-                <li t-if="suggestion.divider" class="divider"/>
+                <li role="separator" t-if="suggestion.divider" class="divider"/>
                 <li t-if="!suggestion.divider" class="o_mention_proposition" t-att-data-id="suggestion.id">
-                    <a href="#"/>
+                    <a role="menuitem" href="#"/>
                 </li>
             </t>
         </ul>
@@ -79,15 +79,15 @@
     </t>
 
     <t t-name="FieldMany2ManyTagsEmail" t-extend="FieldMany2ManyTag">
-        <t t-jquery="span[t-attf-class*=badge]" t-operation="replace">
+        <t t-jquery="button[t-attf-class*=badge]" t-operation="replace">
             <t t-set="email_error" t-value="''"/>
             <t t-if="el.email.indexOf('@') &lt; 0">
                 <t t-set="email_error" t-value="'o_tag_error'"/>
             </t>
-            <span t-attf-class="badge dropdown o_tag_color_0 #{email_error}" t-att-data-color="color" t-att-data-index="el_index" t-att-data-id="el.id">
+            <button t-attf-class="badge dropdown o_tag_color_0 #{email_error}" t-att-data-color="color" t-att-data-index="el_index" t-att-data-id="el.id">
                 <span class="o_badge_text" t-attf-title="#{el.email}"><t t-esc="el.display_name"/></span>
-                <span t-if="!readonly" class="fa fa-times o_delete"/>
-            </span>
+                <span t-if="!readonly" class="fa fa-times o_delete" role="img" aria-label="Delete" title="Delete"/>
+            </button>
         </t>
     </t>
 </templates>
diff --git a/addons/mail/static/src/xml/discuss.xml b/addons/mail/static/src/xml/discuss.xml
index 1eda1dfec1bd..7901a870ea3e 100644
--- a/addons/mail/static/src/xml/discuss.xml
+++ b/addons/mail/static/src/xml/discuss.xml
@@ -9,7 +9,7 @@
                 <t t-if="widget.notification_bar">
                     <div class="o_mail_annoying_notification_bar">
                         <span class="o_mail_request_permission">Odoo needs your permission to <a href="#"> enable desktop notifications</a>.</span>
-                        <span class="fa fa-close"></span>
+                        <span class="fa fa-close" role="button" aria-label="Close" title="Close"></span>
                     </div>
                 </t>
             </div>
@@ -19,13 +19,13 @@
         <div class="o_mail_chat_sidebar">
             <div t-attf-class="o_mail_chat_title_main o_mail_chat_channel_item #{(active_channel_id === 'channel_inbox') ? 'o_active': ''}"
                  data-channel-id="channel_inbox">
-                <span class="o_channel_name"><i class="fa fa-inbox mr8"/>Inbox</span>
+                <span class="o_channel_name fa fa-inbox mr8">Inbox</span>
                 <t t-set="counter" t-value="needaction_counter"/>
                 <t t-call="mail.chat.SidebarNeedaction"/>
             </div>
             <div t-attf-class="o_mail_chat_title_main o_mail_chat_title_starred o_mail_chat_channel_item #{(active_channel_id === 'channel_starred') ? 'o_active': ''}"
                  data-channel-id="channel_starred">
-                <span class="o_channel_name"><i class="fa fa-star-o mr8"/>Starred</span>
+                <span class="o_channel_name fa fa-star-o mr8">Starred</span>
                 <t t-set="counter" t-value="starred_counter"/>
                 <t t-call="mail.chat.SidebarNeedaction"/>
             </div>
@@ -87,10 +87,10 @@
         <t t-if="!disable_add_channel || !empty">
             <div class="o_mail_sidebar_title">
                 <h4 t-att-class="channel_type == 'public' ? 'o_mail_open_channels' : ''">
-                    <i t-if="channel_icon" t-attf-class="mr4 fa-fw fa #{channel_icon}"></i>
+                    <i t-if="channel_icon" t-attf-class="mr4 fa-fw fa #{channel_icon}" role="img" aria-label="Channel" title="Channel"></i>
                     <b><t t-esc="channel_title"/></b>
                 </h4>
-                <span t-if="!disable_add_channel" class="fa fa-plus o_add" title="Add" t-attf-data-type="#{channel_type}"/>
+                <span t-if="!disable_add_channel" class="fa fa-plus o_add" title="Add" t-attf-data-type="#{channel_type}" role="img" aria-label="Add"/>
             </div>
         </t>
     </t>
@@ -111,21 +111,21 @@
                     </span>
                     <span t-if="display_hash" class="o_mail_hash">#</span>
                     <t t-esc="channel.name"/>
-                    <i t-if="channel.mass_mailing" class="fa fa-envelope-o" title="Sends messages by email"/>
+                    <i t-if="channel.mass_mailing" class="fa fa-envelope-o" title="Sends messages by email" role="img" aria-label="Send by mail"/>
                 </span>
                 <span t-attf-class="fa fa-cog o_mail_channel_settings"
-                      title="Channel settings" t-att-data-channel-id="channel.id"/>
+                      title="Channel settings" role="img" aria-label="Channel settings" t-att-data-channel-id="channel.id"/>
                 <t t-call="mail.chat.SidebarNeedaction"/>
                 <span t-if="! channel.group_based_subscription" t-attf-class="fa fa-times o_mail_partner_unpin #{counter ? 'hide' : ''}"
-                      title="Leave this channel" t-att-data-channel-id="channel.id"/>
+                      title="Leave this channel" role="img" aria-label="Leave this channel" t-att-data-channel-id="channel.id"/>
             </div>
         </t>
     </t>
 
     <t t-name="mail.chat.UserStatus">
-        <i t-if="status == 'online'" class="o_mail_user_status o_user_online fa fa-circle" title="Online"/>
-        <i t-if="status == 'away'" class="o_mail_user_status o_user_idle fa fa-circle" title="Idle"/>
-        <i t-if="status == 'offline'" class="o_mail_user_status fa fa-circle-o" title="Offline"/>
+        <i t-if="status == 'online'" class="o_mail_user_status o_user_online fa fa-circle" title="Online" role="img" aria-label="User is online"/>
+        <i t-if="status == 'away'" class="o_mail_user_status o_user_idle fa fa-circle" title="Idle" role="img" aria-label="User is idle"/>
+        <i t-if="status == 'offline'" class="o_mail_user_status fa fa-circle-o" title="Offline" role="img" aria-label="User is offline"/>
     </t>
 
     <t t-name="mail.chat.MessageSentSnackbar">
@@ -174,20 +174,16 @@
             <div class="o_mail_chat_content"/>
             <div class="o_mail_mobile_tabs">
                 <div class="o_mail_mobile_tab" data-type="channel_inbox">
-                    <span class="fa fa-inbox"/>
-                    <span class="o_tab_title">Inbox</span>
+                    <span class="o_tab_title fa fa-inbox">Inbox</span>
                 </div>
                 <div class="o_mail_mobile_tab" data-type="dm">
-                    <span class="fa fa-user"/>
-                    <span class="o_tab_title">Chat</span>
+                    <span class="o_tab_title fa fa-user">Chat</span>
                 </div>
                 <div class="o_mail_mobile_tab" data-type="public">
-                    <span class="fa fa-users"/>
-                    <span class="o_tab_title">Channels</span>
+                    <span class="o_tab_title fa fa-users">Channels</span>
                 </div>
                 <div class="o_mail_mobile_tab" data-type="private">
-                    <span class="fa fa-eye-slash"/>
-                    <span class="o_tab_title">Private Channels</span>
+                    <span class="o_tab_title fa fa-eye-slash">Private Channels</span>
                 </div>
             </div>
         </div>
@@ -212,9 +208,9 @@
         <div t-attf-class="o_mail_channel_preview #{channel.unread_counter ? 'o_channel_unread' : ''}"
              t-att-data-channel_id="channel.id" t-att-data-res_id="channel.res_id" t-att-data-res_model="channel.model">
             <div t-attf-class="o_mail_channel_image #{channel.model? 'o_mail_channel_app' : ''}">
-                <img class="o_mail_channel_image" t-att-src="channel.image_src"/>
-                <i t-if="channel.status === 'online'" class="o_mail_user_status o_user_online fa fa-circle" title="Online"/>
-                <i t-if="channel.status === 'away'" class="o_mail_user_status o_user_idle fa fa-circle" title="Idle"/>
+                <img class="o_mail_channel_image" t-att-src="channel.image_src" alt="Channel"/>
+                <i t-if="channel.status === 'online'" class="o_mail_user_status o_user_online fa fa-circle" title="Online" role="img" aria-label="User is online"/>
+                <i t-if="channel.status === 'away'" class="o_mail_user_status o_user_idle fa fa-circle" title="Idle" role="img" aria-label="User is idle"/>
             </div>
             <div class="o_channel_info">
                 <div class="o_channel_title">
@@ -228,7 +224,7 @@
                 </div>
                 <div t-if="channel.last_message" class="o_last_message_preview">
                     <t t-if="channel.last_message.is_author">
-                        <span class="fa fa-mail-reply"/> You:
+                        <span class="fa fa-mail-reply" role="img" aria-label="Reply"/> You:
                     </t>
                     <t t-else="">
                         <t t-if="channel.last_message.displayed_author">
diff --git a/addons/mail/static/src/xml/extended_chat_window.xml b/addons/mail/static/src/xml/extended_chat_window.xml
index 3e183d99bd2c..c5188feadfa4 100644
--- a/addons/mail/static/src/xml/extended_chat_window.xml
+++ b/addons/mail/static/src/xml/extended_chat_window.xml
@@ -12,7 +12,7 @@
 
     <t t-extend="mail.ChatWindowHeaderContent">
         <t t-jquery=".o_chat_window_buttons" t-operation="prepend">
-            <a href="#" class="o_chat_window_expand fa fa-expand" title="Open in Discuss"/>
+            <a href="#" class="o_chat_window_expand fa fa-expand" title="Open in Discuss" aria-label="Open in discuss"/>
         </t>
     </t>
 
diff --git a/addons/mail/static/src/xml/followers.xml b/addons/mail/static/src/xml/followers.xml
index d50d334cb4fe..89df5c48b2cf 100644
--- a/addons/mail/static/src/xml/followers.xml
+++ b/addons/mail/static/src/xml/followers.xml
@@ -7,9 +7,9 @@
     <t t-name="mail.Followers">
         <div class="o_followers">
             <div class="o_followers_title_box">
-                <button class="btn btn-sm btn-link dropdown-toggle"
+                <button class="btn btn-sm btn-link dropdown-toggle" title="Dropdown menu - Followers"
                         data-toggle="dropdown" aria-expanded="false">
-                    <i class="fa fa-user"></i>
+                    <i class="fa fa-user" role="img" aria-label="Dropdown menu - Followers"></i>
                     <span class="o_followers_count"/>
                 </button>
                 <ul class="dropdown-menu o_followers_list" role="menu"></ul>
@@ -18,12 +18,10 @@
                 <div class="btn-group btn-group-sm o_subtypes_list">
                     <button class="btn btn-sm btn-link o_followers_follow_button o_followers_notfollow">
                         <span class="o_follow">Follow</span>
-                        <span class="fa fa-times o_followers_unfollow"/>
-                        <span class="o_followers_unfollow"> Unfollow</span>
-                        <span class="fa fa-check o_followers_following"/>
-                        <span class="o_followers_following"> Following</span>
+                        <span class="fa fa-times o_followers_unfollow"> Unfollow</span>
+                        <span class="fa fa-check o_followers_following"> Following</span>
                     </button><button class="btn btn-sm btn-link dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
-                        <span class="fa fa-bell"/>
+                        <span class="fa fa-bell" role="img" aria-label="Alarm menu" title="Alarm menu"/>
                     </button>
                     <ul class="dropdown-menu" role="menu"/>
                 </div>
@@ -35,8 +33,8 @@
         Partner or channel following the record
     -->
     <t t-name="mail.Followers.partner">
-        <li class='o_partner'>
-            <img t-att-src="record.avatar_url"/>
+        <li role="menuitem" class='o_partner'>
+            <img t-att-src="record.avatar_url" alt="Avatar"/>
             <a class="o_mail_redirect"
                href="#"
                t-att-title="record.name"
@@ -44,10 +42,12 @@
                t-att-data-oe-id="record.res_id"><t t-esc="record.name"/></a>
             <i t-if="record.is_editable" class="fa fa-pencil o_edit_subtype hide"
                title="Edit subscription"
+               aria-label="Edit subscription" role="img"
                t-att-data-follower-id="record.id"
                t-att-data-oe-id="record.res_id"
                t-att-data-oe-model="record.res_model"/>
             <i t-if="widget.isEditable" class="fa fa-remove o_remove_follower"
+               aria-label="Remove this follower" role="img"
                title="Remove this follower"/>
         </li>
     </t>
@@ -57,13 +57,13 @@
     -->
     <t t-name="mail.Followers.add_more">
         <t t-if="widget.isEditable">
-            <li class="o_add_follower">
+            <li role="menuitem" class="o_add_follower">
                 <a href="#"> Add Followers </a>
             </li>
-            <li class="o_add_follower_channel">
+            <li role="menuitem" class="o_add_follower_channel">
                 <a href="#"> Add Channels </a>
             </li>
-            <li t-if="widget.followers.length > 0" class="divider"/>
+            <li role="separator" t-if="widget.followers.length > 0" class="divider"/>
         </t>
     </t>
 
@@ -71,7 +71,7 @@
         Message subtypes of a follower subscription
     -->
     <t t-name="mail.Followers.subtype">
-        <li class="o_subtype">
+        <li role="menuitem" class="o_subtype">
             <div class="o_checkbox">
                 <input type="checkbox" t-att-checked="record.followed"
                        t-att-id="'input_mail_followers_subtype_'+record.id+(dialog ? '_in_dialog': '')"
@@ -81,12 +81,12 @@
             <span t-att-for="'input_mail_followers_subtype_'+record.id+(dialog ? '_in_dialog': '')">
                 <t t-esc="record.name"/>
             </span>
-            <i t-if="display_warning" class="fa fa-warning text-warning"/>
+            <i t-if="display_warning" class="fa fa-warning text-warning" role="img" aria-label="Warning" title="Warning"/>
         </li>
     </t>
     <t t-name="mail.Followers.subtypes.warning">
-        <span class="text-warning">
-            <i class="fa fa-warning"/> Be careful with channels following internal notifications
+        <span class="text-warning" role="alert">
+            <span class="fa fa-warning"> Be careful with channels following internal notifications</span>
         </span>
     </t>
 
diff --git a/addons/mail/static/src/xml/systray.xml b/addons/mail/static/src/xml/systray.xml
index a6e52ab555a8..6350e07d2da4 100644
--- a/addons/mail/static/src/xml/systray.xml
+++ b/addons/mail/static/src/xml/systray.xml
@@ -4,15 +4,15 @@
     <t t-name="mail.chat.MessagingMenu">
         <li class="o_mail_navbar_item">
             <a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" title="Conversations" href="#">
-                <i class="fa fa-comments"/> <span class="o_notification_counter badge"/>
+                <i class="fa fa-comments" role="img" aria-label="Messages"/> <span class="o_notification_counter badge"/>
             </a>
             <ul class="o_mail_navbar_dropdown dropdown-menu" role="menu">
-                <li t-if="widget.isMobile">
+                <li role="menuitem" t-if="widget.isMobile">
                     <div class="o_mail_navbar_mobile_header">
                         <button type="button" class="btn btn-default btn-sm o_new_message"> New message </button>
                     </div>
                 </li>
-                <li t-if="!widget.isMobile" class="o_mail_navbar_dropdown_top">
+                <li role="menuitem" t-if="!widget.isMobile" class="o_mail_navbar_dropdown_top">
                     <div>
                         <button type="button" class="btn btn-sm btn-link o_filter_button active"> All </button>
                         <button type="button" class="btn btn-sm btn-link o_filter_button" data-filter='chat'> Chat </button>
@@ -20,20 +20,17 @@
                     </div>
                     <button type="button" class="btn btn-sm btn-link o_new_message"> New message </button>
                 </li>
-                <li class="o_mail_navbar_dropdown_channels"/>
-                <li t-if="widget.isMobile">
+                <li role="menuitem" class="o_mail_navbar_dropdown_channels"/>
+                <li role="menuitem" t-if="widget.isMobile">
                     <div class="o_mail_mobile_tabs">
                         <div class="o_mail_mobile_tab o_filter_button active">
-                            <span class="fa fa-envelope"/>
-                            <span class="o_tab_title">All</span>
+                            <span class="o_tab_title fa fa-envelope">All</span>
                         </div>
                         <div class="o_mail_mobile_tab o_filter_button" data-filter='chat'>
-                            <span class="fa fa-user"/>
-                            <span class="o_tab_title">Chat</span>
+                            <span class="o_tab_title fa fa-user">Chat</span>
                         </div>
                         <div class="o_mail_mobile_tab o_filter_button" data-filter='channels'>
-                            <span class="fa fa-users"/>
-                            <span class="o_tab_title">Channels</span>
+                            <span class="o_tab_title fa fa-users">Channels</span>
                         </div>
                     </div>
                 </li>
@@ -61,7 +58,7 @@
         <t t-foreach="activities" t-as="activity">
             <div class="o_mail_channel_preview" t-att-data-res_model="activity.model" t-att-data-model_name="activity.name" data-filter='my'>
                 <div class="o_mail_channel_image o_mail_channel_app">
-                    <img t-att-src="activity.icon"/>
+                    <img t-att-src="activity.icon" alt="Activity"/>
                 </div>
                 <div class="o_channel_info">
                     <div class="o_channel_title">
@@ -85,10 +82,10 @@
     <t t-name="mail.chat.ActivityMenu">
         <li class="o_mail_navbar_item">
             <a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" title="Activities" href="#">
-                <i class="fa fa-clock-o"/> <span class="o_notification_counter badge"/>
+                <i class="fa fa-clock-o" role="img" aria-label="Activities"/> <span class="o_notification_counter badge"/>
             </a>
             <ul class="o_mail_navbar_dropdown dropdown-menu" role="menu">
-                <li class="o_mail_navbar_dropdown_channels"/>
+                <li role="menuitem" class="o_mail_navbar_dropdown_channels"/>
             </ul>
         </li>
     </t>
diff --git a/addons/mail/static/src/xml/thread.xml b/addons/mail/static/src/xml/thread.xml
index ca8ae9b8319a..60779ea65636 100644
--- a/addons/mail/static/src/xml/thread.xml
+++ b/addons/mail/static/src/xml/thread.xml
@@ -23,20 +23,20 @@
         <div class="o_viewer_content">
             <div class="o_viewer-header">
                 <span class="o_image_caption">
-                    <i class="fa fa-picture-o mr8" t-if="widget.activeAttachment.type == 'image'"/>
-                    <i class="fa fa-file-text mr8" t-if="widget.activeAttachment.type == 'application/pdf'"/>
-                    <i class="fa fa-video-camera mr8" t-if="widget.activeAttachment.type == 'video'"/>
+                    <i class="fa fa-picture-o mr8" t-if="widget.activeAttachment.type == 'image'" role="img" aria-label="Image" title="Image"/>
+                    <i class="fa fa-file-text mr8" t-if="widget.activeAttachment.type == 'application/pdf'" role="img" aria-label="PDF file" title="PDF file"/>
+                    <i class="fa fa-video-camera mr8" t-if="widget.activeAttachment.type == 'video'" role="img" aria-label="Video" title="Video"/>
                     <t t-esc="widget.activeAttachment.name"/>
-                    <a href="#" class="o_download_btn ml8 small" data-toggle="tooltip" data-placement="right" title="Download"><i class="fa fa-fw fa-download"/></a>
+                    <a role="button" href="#" class="o_download_btn ml8 small" data-toggle="tooltip" data-placement="right" title="Download"><i class="fa fa-fw fa-download" role="img" aria-label="Download"/></a>
                 </span>
-                <a class="o_close_btn pull-right" href="#">×</a>
+                <a role="button" class="o_close_btn pull-right" href="#" aria-label="Close" title="Close">×</a>
             </div>
             <div class="o_viewer_img_wrapper">
                 <div class="o_viewer_zoomer">
                     <div t-if="widget.activeAttachment.type == 'image'" class="o_loading_img text-center">
-                        <i class="fa fa-circle-o-notch fa-spin text-gray-light fa-3x fa-fw" aria-hidden="true"/>
+                        <i class="fa fa-circle-o-notch fa-spin text-gray-light fa-3x fa-fw" role="img" aria-label="Loading" title="Loading"/>
                     </div>
-                    <img t-if="widget.activeAttachment.type == 'image'" class="o_viewer_img" t-attf-src="/web/image/#{widget.activeAttachment.id}?unique=1"/>
+                    <img t-if="widget.activeAttachment.type == 'image'" class="o_viewer_img" t-attf-src="/web/image/#{widget.activeAttachment.id}?unique=1" alt="Viewer"/>
                     <iframe class="mt32 o_viewer_pdf" t-if="widget.activeAttachment.type == 'application/pdf'" t-attf-src="/web/static/lib/pdfjs/web/viewer.html?file=/web/content/#{widget.activeAttachment.id}" />
                     <video t-if="widget.activeAttachment.type == 'video'" class="o_viewer_video" controls="controls">
                         <source t-attf-src="/web/image/#{widget.activeAttachment.id}" t-att-data-type="widget.activeAttachment.mimetype"/>
@@ -45,31 +45,31 @@
             </div>
             <div t-if="widget.activeAttachment.type == 'image'" class="o_viewer_toolbar btn-toolbar" role="toolbar">
                 <div class="btn-group ml0" role="group">
-                    <a href="#" class="o_viewer_toolbar_btn btn o_zoom_in" data-toggle="tooltip" title="Zoom In"><i class="fa fa-fw fa-plus"/></a>
-                    <a href="#" class="o_viewer_toolbar_btn btn o_zoom_reset disabled" data-toggle="tooltip" title="Reset Zoom"><i class="fa fa-fw fa-search"/></a>
-                    <a href="#" class="o_viewer_toolbar_btn btn o_zoom_out disabled" data-toggle="tooltip" title="Zoom Out"><i class="fa fa-fw fa-minus"/></a>
+                    <a role="button" href="#" class="o_viewer_toolbar_btn btn o_zoom_in" data-toggle="tooltip" title="Zoom In"><i class="fa fa-fw fa-plus" role="img" aria-label="Zoom In"/></a>
+                    <a role="button" href="#" class="o_viewer_toolbar_btn btn o_zoom_reset disabled" data-toggle="tooltip" title="Reset Zoom"><i class="fa fa-fw fa-search" role="img" aria-label="Reset Zoom"/></a>
+                    <a role="button" href="#" class="o_viewer_toolbar_btn btn o_zoom_out disabled" data-toggle="tooltip" title="Zoom Out"><i class="fa fa-fw fa-minus" role="img" aria-label="Zoom Out"/></a>
                 </div>
                 <div class="btn-group ml8" role="group">
-                    <a href="#" class="o_viewer_toolbar_btn btn o_rotate" data-toggle="tooltip" title="Rotate"><i class="fa fa-fw fa-repeat"/></a>
+                    <a role="button" href="#" class="o_viewer_toolbar_btn btn o_rotate" data-toggle="tooltip" title="Rotate"><i class="fa fa-fw fa-repeat" role="img" aria-label="Rotate"/></a>
                 </div>
                 <div class="btn-group ml8" role="group">
-                    <a href="#" class="o_viewer_toolbar_btn btn o_print_btn" data-toggle="tooltip" title="Print"><i class="fa fa-fw fa-print"/></a>
-                    <a href="#" class="o_viewer_toolbar_btn btn o_download_btn" data-toggle="tooltip" title="Download"><i class="fa fa-fw fa-download"/></a>
+                    <a role="button" href="#" class="o_viewer_toolbar_btn btn o_print_btn" data-toggle="tooltip" title="Print"><i class="fa fa-fw fa-print" role="img" aria-label="Print"/></a>
+                    <a role="button" href="#" class="o_viewer_toolbar_btn btn o_download_btn" data-toggle="tooltip" title="Download"><i class="fa fa-fw fa-download" role="img" aria-label="Download"/></a>
                 </div>
             </div>
         </div>
     </t>
 
     <t t-name="DocumentViewer">
-        <div class="modal o_modal_fullscreen" tabindex="-1" data-keyboard="false" role="dialog" aria-hidden="true">
+        <div class="modal o_modal_fullscreen" tabindex="-1" data-keyboard="false" role="dialog">
             <t t-call="DocumentViewer.Content"/>
 
             <t t-if="widget.attachment.length != 1">
                 <a class="arrow arrow-left move_previous" href="#">
-                    <span class="fa fa-chevron-left"/>
+                    <span class="fa fa-chevron-left" role="img" aria-label="Previous" title="Previous"/>
                 </a>
                 <a class="arrow arrow-right move_next" href="#">
-                    <span class="fa fa-chevron-right"/>
+                    <span class="fa fa-chevron-right" role="img" aria-label="Next" title="Next"/>
                 </a>
             </t>
         </div>
@@ -88,7 +88,7 @@
                 </script>
             </head>
             <body onload='onload_img()'>
-                <img t-att-src='src' />
+                <img t-att-src='src' alt=""/>
             </body>
         </html>
     </t>
@@ -129,6 +129,7 @@
             <div t-if="options.display_avatar" class="o_thread_message_sidebar">
                 <t t-if="!message.mailto and message.author_id[0]">
                     <img t-if="message.avatar_src and message.display_author"
+                        alt=""
                         t-att-src="message.avatar_src"
                         data-oe-model="res.partner"
                         t-att-data-oe-id="message.author_redirect ? message.author_id[0] : ''"
@@ -136,6 +137,7 @@
                 </t>
                 <t t-if="message.mailto || !message.author_id[0]">
                     <img t-if="message.avatar_src and message.display_author"
+                        alt=""
                         t-att-src="message.avatar_src"
                         class="o_thread_message_avatar img-circle"/>
                 </t>
@@ -144,7 +146,7 @@
                 </span>
                 <i t-if="!message.display_author and options.display_stars and message.message_type != 'notification'"
                     t-att-class="'fa o_thread_message_star o_thread_icon ' + (message.is_starred ? 'fa-star' : 'fa-star-o')"
-                    t-att-data-message-id="message.id" title="Mark as Todo"/>
+                    t-att-data-message-id="message.id" title="Mark as Todo" role="img" aria-label="Mark as todo"/>
             </div>
             <div class="o_thread_message_core">
                 <p t-if="message.display_author" class="o_mail_info text-muted">
@@ -183,11 +185,11 @@
                         <span class="o_thread_tooltip_content">
                             <t t-foreach="message.customer_email_data" t-as="customer">
                                 <span>
-                                    <t t-if="customer[2] === 'sent'"><i class='fa fa-check'/></t>
-                                    <t t-if="customer[2] === 'bounce'"><i class='fa fa-exclamation'/></t>
-                                    <t t-if="customer[2] === 'exception'"><i class='fa fa-exclamation'/></t>
-                                    <t t-if="customer[2] === 'ready'"><i class='fa fa-send-o'/></t>
-                                    <t t-if="customer[2] === 'canceled'"><i class='fa fa-trash-o'/></t>
+                                    <t t-if="customer[2] === 'sent'"><i class='fa fa-check' title="Sent" role="img" aria-label="Sent"/></t>
+                                    <t t-if="customer[2] === 'bounce'"><i class='fa fa-exclamation' title="Bounced" role="img" aria-label="Bounced"/></t>
+                                    <t t-if="customer[2] === 'exception'"><i class='fa fa-exclamation' title="Error" role="img" aria-label="Error"/></t>
+                                    <t t-if="customer[2] === 'ready'"><i class='fa fa-send-o' title="Ready" role="img" aria-label="Ready"/></t>
+                                    <t t-if="customer[2] === 'canceled'"><i class='fa fa-trash-o' title="Canceled" role="img" aria-label="Canceled"/></t>
                                     <t t-esc="customer[1]"/>
                                 </span>
                                 <br />
@@ -197,13 +199,13 @@
                     <span t-attf-class="o_thread_icons">
                         <i t-if="options.display_stars and !message.is_system_notification and !message.needsModeration"
                             t-att-class="'fa fa-lg o_thread_icon o_thread_message_star ' + (message.is_starred ? 'fa-star' : 'fa-star-o')"
-                            t-att-data-message-id="message.id" title="Mark as Todo"/>
+                            t-att-data-message-id="message.id" title="Mark as Todo" role="img" aria-label="Mark as Todo"/>
                        <i t-if="message.record_name &amp;&amp; message.model != 'mail.channel' &amp;&amp; options.display_reply_icon"
                            class="fa fa-reply o_thread_icon o_thread_message_reply"
-                           t-att-data-message-id="message.id" title="Reply"/>
+                           t-att-data-message-id="message.id" title="Reply" role="img" aria-label="Reply"/>
                         <i t-if="message.is_needaction &amp;&amp; options.display_needactions"
                            class="fa fa-check o_thread_icon o_thread_message_needaction"
-                           t-att-data-message-id="message.id" title="Mark as Read"/>
+                           t-att-data-message-id="message.id" title="Mark as Read" role="img" aria-label="Mark as Read"/>
 
                         <t t-if="message.needsModeration and message.model === 'mail.channel'">
                             <t t-if="message.isModerator">
@@ -279,7 +281,7 @@
                     <t t-esc="value.changed_field"/>:
                     <t t-if="value.old_value">
                         <span> <t t-esc="value.old_value || ((value.field_type !== 'boolean') and '')"/> </span>
-                        <span t-if="value.old_value != value.new_value" class="fa fa-long-arrow-right"/>
+                        <span t-if="value.old_value != value.new_value" class="fa fa-long-arrow-right" role="img" aria-label="Changed" title="Changed"/>
                     </t>
                     <span t-if="value.old_value != value.new_value">
                         <t t-esc="value.new_value || ((value.field_type !== 'boolean') and '')"/>
@@ -307,7 +309,7 @@
                     <div t-attf-class="o_image_overlay o_attachment_view"  t-att-data-id="attachment.id">
                         <span class="o_attachment_title text-white"><t t-esc="attachment.name"/></span>
                         <a class="o_attachment_download" t-att-href='attachment.url'>
-                            <i t-attf-class="fa fa-download text-white" t-att-title="'Download ' + attachment.name" aria-hidden="true"></i>
+                            <i t-attf-class="fa fa-download text-white" t-att-title="'Download ' + attachment.name" role="img" aria-label="Download"></i>
                         </a>
                     </div>
                 </div>
@@ -328,10 +330,10 @@
                          t-att-style="type == 'image' ? 'background-image:url(/web/image/' + attachment.id + '/38x38/?crop=true' : '' "
                          t-att-data-mimetype="attachment.mimetype">
                     </div>
-                    <a t-elif="!editable" t-att-href='attachment.url' t-att-title="'Download ' + attachment.name">
+                    <a t-elif="!editable" t-att-href='attachment.url' t-att-title="'Download ' + attachment.name" aria-label="Download">
                         <span class="o_image o_hover" t-att-data-mimetype="attachment.mimetype" t-att-data-ext="ext"/>
                     </a>
-                    <span t-else="" class="o_image" t-att-data-mimetype="attachment.mimetype" t-att-data-ext="ext"/>
+                    <span t-else="" class="o_image" t-att-data-mimetype="attachment.mimetype" t-att-data-ext="ext" role="img" aria-label="Document not downloadable"/>
                 </div>
 
                 <div class="caption">
@@ -347,10 +349,10 @@
                 <div t-if="!editable" class="caption small">
                     <b t-if="has_preview" class="ml4 small text-uppercase o_attachment_view" t-att-data-id="attachment.id"><t t-esc="ext"/></b>
                     <a t-else="" class="ml4 small text-uppercase" t-att-href="attachment.url" t-att-title="'Download ' + attachment.name"><b><t t-esc='ext'/></b></a>
-                    <a class="ml4 o_attachment_download pull-right" t-att-title="'Download ' + attachment.name" t-att-href='attachment.url'><i t-attf-class="fa fa-download"/></a>
+                    <a class="ml4 o_attachment_download pull-right" t-att-title="'Download ' + attachment.name" t-att-href='attachment.url'><i t-attf-class="fa fa-download" role="img" aria-label="Download"/></a>
                 </div>
-                <div t-if="editable" class="o_attachment_uploaded"><i class="text-success fa fa-check"/></div>
-                <div t-if="editable" class="o_attachment_delete" t-att-data-id="attachment.id"><span class="text-white">×</span></div>
+                <div t-if="editable" class="o_attachment_uploaded"><i class="text-success fa fa-check" role="img" aria-label="Uploaded" title="Uploaded"/></div>
+                <div t-if="editable" class="o_attachment_delete" t-att-data-id="attachment.id"><span class="text-white" role="img" aria-label="Delete" title="Delete">×</span></div>
             </div>
         </div>
     </t>
@@ -358,7 +360,7 @@
      <t t-name="mail.ChatThread.LoadMore">
         <div class="o_thread_show_more">
             <t t-if="options.loadMoreOnScroll">
-                <span><i class="fa fa-spinner fa-spin"/> Loading older messages... </span>
+                <span><i class="fa fa-spinner fa-spin" role="img" aria-label="Please wait" title="Please wait"/> Loading older messages... </span>
             </t>
             <t t-else="">
                 <button class="btn btn-sm btn-link">-------- Show older messages --------</button>
diff --git a/addons/mail/static/src/xml/web_kanban_activity.xml b/addons/mail/static/src/xml/web_kanban_activity.xml
index dff33f6465ad..b078e2807224 100644
--- a/addons/mail/static/src/xml/web_kanban_activity.xml
+++ b/addons/mail/static/src/xml/web_kanban_activity.xml
@@ -3,8 +3,8 @@
 
 <t t-name="mail.KanbanActivity">
     <div class="o_kanban_inline_block dropdown o_kanban_selection o_mail_activity">
-        <a class="dropdown-toggle o_activity_btn" data-toggle="dropdown">
-            <span class="fa fa-clock-o fa-lg fa-fw" t-att-title="widget.selection[widget.activity_state]"/>
+        <a role="button" class="dropdown-toggle o_activity_btn" data-toggle="dropdown">
+            <span class="fa fa-clock-o fa-lg fa-fw" t-att-title="widget.selection[widget.activity_state]" role="img" t-att-aria-label="widget.selection[widget.activity_state]"/>
         </a>
         <ul class="dropdown-menu o_activity" role="menu">
         </ul>
@@ -13,49 +13,49 @@
 
 <t t-name="mail.KanbanActivityLoading">
     <li class="text-center o_no_activity">
-        <span class="fa fa-spinner fa-spin fa-2x" />
+        <span class="fa fa-spinner fa-spin fa-2x" role="img" aria-label="Loading..." title="Loading..."/>
     </li>
 </t>
 
 <t t-name="mail.KanbanActivityDropdown">
-    <li t-if="_.isEmpty(records)" class="text-center o_no_activity">
+    <li role="menuitem" t-if="_.isEmpty(records)" class="text-center o_no_activity">
         <span>No activities planned.</span>
     </li>
-    <li t-if="!_.isEmpty(records)">
-        <ul class="nav o_activity_log">
+    <li t-if="!_.isEmpty(records)" aria-haspopup="true" role="menu">
+        <ul class="nav o_activity_log" role="menu">
             <t t-foreach="_.keys(records)" t-as="key">
                 <t t-set="logs" t-value="records[key]" />
-                <li class="o_activity_label">
+                <li role="menuitem" class="o_activity_label">
                     <strong t-attf-class="o_activity_color_#{key}">
                         <t t-esc="selection[key]" /> (<t t-esc="logs.length"/>)
                     </strong>
                 </li>
-                <li t-foreach="logs" t-as="log" t-att-data-activity-id="log.id" class="o_schedule_activity">
+                <li role="menuitem" t-foreach="logs" t-as="log" t-att-data-activity-id="log.id" class="o_schedule_activity">
                     <div class="o_activity_title pull-left">
-                        <span t-attf-class="fa #{log.icon} fa-fw" />
+                        <span t-attf-class="fa #{log.icon} fa-fw" role="img" aria-label="Log" title="Log"/>
                         <strong>
                             <t t-esc="log.title_action or log.activity_type_id[1]" />
                         </strong>
                         <div>
-                            <span class="fa fa-clock-o fa-fw" />
+                            <span class="fa fa-clock-o fa-fw" role="img" aria-label="Deadline" title="Deadline"/>
                             <span t-att-title="log.date_deadline"><t t-esc="log.label_delay" /></span>
                             <t t-if="log.user_id[0] != uid">
-                                <span class="ml4 fa fa-user" />
+                                <span class="ml4 fa fa-user" role="img" aria-label="User" title="User"/>
                                 <span><t t-esc="log.user_id[1]" /></span>
                             </t>
                         </div>
                     </div>
                     <div class="pull-right">
-                        <span class="o_mark_as_done o_activity_link o_activity_link_kanban fa fa-check-circle fa-2x mt4" t-att-data-activity-id="log.id" title="Mark as done" />
+                        <span class="o_mark_as_done o_activity_link o_activity_link_kanban fa fa-check-circle fa-2x mt4" t-att-data-activity-id="log.id" title="Mark as done" role="img" aria-label="Mark as done"/>
                     </div>
                 </li>
             </t>
         </ul>
     </li>
-    <li class="o_schedule_activity text-center">
-        <span class="btn btn-link btn-block">
-            <i class="fa fa-plus fa-fw" aria-hidden="true"></i><strong>Schedule an activity</strong>
-        </span>
+    <li role="menuitem" class="o_schedule_activity text-center">
+        <a role="button" class="btn btn-link btn-block">
+            <strong class="fa fa-plus fa-fw">Schedule an activity</strong>
+        </a>
     </li>
 </t>
 
diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js
index 46de2e22d3f8..f42170c696e1 100644
--- a/addons/mail/static/tests/chatter_tests.js
+++ b/addons/mail/static/tests/chatter_tests.js
@@ -690,7 +690,7 @@ QUnit.test('chatter: Attachment viewer', function (assert) {
     assert.strictEqual($('.o_modal_fullscreen img.o_viewer_img[data-src="/web/image/1?unique=1"]').length, 1,
         "Modal popup should open with first image src");
     //  click on next button
-    $('.modal .arrow.arrow-right.move_next span').click();
+    $('[role="dialog"] .arrow.arrow-right.move_next span').click();
     assert.strictEqual($('.o_modal_fullscreen img.o_viewer_img[data-src="/web/image/2?unique=1"]').length, 1,
         "Modal popup should have now second image src");
     assert.strictEqual($('.o_modal_fullscreen .o_viewer_toolbar .o_download_btn').length, 1,
@@ -1172,8 +1172,8 @@ QUnit.test('followers widget: follow/unfollow, edit subtypes', function (assert)
 
     // click to unfollow
     form.$('.o_followers_follow_button').click(); // click to open the dropdown
-    assert.ok($('.modal').length, 'a confirm modal should be opened');
-    $('.modal .modal-footer .btn-primary').click(); // click on 'OK'
+    assert.ok($('[role="dialog"]').length, 'a confirm modal should be opened');
+    $('footer.modal-footer .btn-primary').click(); // click on 'OK'
     assert.strictEqual(form.$('.o_followers_count').text(), "0", 'should have no followers');
     assert.ok(form.$('.o_followers_follow_button.o_followers_notfollow').length,
         'should display the "Follow" button');
@@ -1366,9 +1366,9 @@ QUnit.test('fieldmany2many tags email', function (assert) {
     }).then(function (form) {
         // should read it 3 times (1 with the form view, one with the form dialog and one after save)
         assert.verifySteps([[12, 14], [14], [14]]);
-        assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] span.o_tag_color_0').length, 2,
+        assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] button.o_tag_color_0').length, 2,
             "two tags should be present");
-        var firstTag = form.$('.o_field_many2manytags[name="timmy"] span.o_tag_color_0').first();
+        var firstTag = form.$('.o_field_many2manytags[name="timmy"] button.o_tag_color_0').first();
         assert.strictEqual(firstTag.find('.o_badge_text').text(), "gold",
             "tag should only show display_name");
         assert.strictEqual(firstTag.find('.o_badge_text').attr('title'), "coucou@petite.perruche",
@@ -1377,16 +1377,16 @@ QUnit.test('fieldmany2many tags email', function (assert) {
         done();
     });
 
-    assert.strictEqual($('.modal-body.o_act_window').length, 1,
+    assert.strictEqual($('main.modal-body.o_act_window').length, 1,
         "there should be one modal opened to edit the empty email");
-    assert.strictEqual($('.modal-body.o_act_window input[name="display_name"]').val(), "silver",
+    assert.strictEqual($('main.modal-body input[name="display_name"]').val(), "silver",
         "the opened modal should be a form view dialog with the partner_type 14");
-    assert.strictEqual($('.modal-body.o_act_window input[name="email"]').length, 1,
+    assert.strictEqual($('main.modal-body input[name="email"]').length, 1,
         "there should be an email field in the modal");
 
     // set the email and save the modal (will render the form view)
-    $('.modal-body.o_act_window input[name="email"]').val('coucou@petite.perruche').trigger('input');
-    $('.modal-footer .btn-primary').click();
+    $('main.modal-body input[name="email"]').val('coucou@petite.perruche').trigger('input');
+    $('footer.modal-footer .btn-primary').click();
 });
 
 QUnit.test('fieldmany2many tags email (edition)', function (assert) {
@@ -1421,7 +1421,7 @@ QUnit.test('fieldmany2many tags email (edition)', function (assert) {
     });
 
     assert.verifySteps([[12]]);
-    assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] span.o_tag_color_0').length, 1,
+    assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] button.o_tag_color_0').length, 1,
         "should contain one tag");
 
     // add an other existing tag
@@ -1429,18 +1429,18 @@ QUnit.test('fieldmany2many tags email (edition)', function (assert) {
     $input.click(); // opens the dropdown
     $input.autocomplete('widget').find('li:first').click(); // add 'silver'
 
-    assert.strictEqual($('.modal-body.o_act_window').length, 1,
+    assert.strictEqual($('main.modal-body.o_act_window').length, 1,
         "there should be one modal opened to edit the empty email");
-    assert.strictEqual($('.modal-body.o_act_window input[name="display_name"]').val(), "silver",
-        "the opened modal should be a form view dialog with the partner_type 14");
-    assert.strictEqual($('.modal-body.o_act_window input[name="email"]').length, 1,
+    assert.strictEqual($('main.modal-body input[name="display_name"]').val(), "silver",
+        "the opened modal in edit mode should be a form view dialog with the partner_type 14");
+    assert.strictEqual($('main.modal-body input[name="email"]').length, 1,
         "there should be an email field in the modal");
 
     // set the email and save the modal (will rerender the form view)
-    $('.modal-body.o_act_window input[name="email"]').val('coucou@petite.perruche').trigger('input');
-    $('.modal-footer .btn-primary').click();
+    $('main.modal-body input[name="email"]').val('coucou@petite.perruche').trigger('input');
+    $('footer.modal-footer .btn-primary').click();
 
-    assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] span.o_tag_color_0').length, 2,
+    assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] button.o_tag_color_0').length, 2,
         "should contain the second tag");
     // should have read [14] three times: when opening the dropdown, when opening the modal, and
     // after the save
diff --git a/addons/mail/static/tests/discuss_moderation_tests.js b/addons/mail/static/tests/discuss_moderation_tests.js
index da8e8b1c68db..97ea5cb3c1db 100644
--- a/addons/mail/static/tests/discuss_moderation_tests.js
+++ b/addons/mail/static/tests/discuss_moderation_tests.js
@@ -551,7 +551,7 @@ QUnit.test('moderator: discard pending moderation message (reject without explan
         // check discard dialog prompt
         assert.strictEqual($('.modal-dialog').length, 1,
             "a dialog should be prompt to the moderator on click discard");
-        assert.strictEqual($('.modal-body').text(),
+        assert.strictEqual($('.modal-body:first').text(),
             "You are going to discard 1 message. Do you confirm the action?",
             "should warn the user on discard action");
         assert.strictEqual($('.modal-footer button').length, 2,
diff --git a/addons/mail/views/mail_channel_views.xml b/addons/mail/views/mail_channel_views.xml
index 24115dde2fb7..dde3d288b65f 100644
--- a/addons/mail/views/mail_channel_views.xml
+++ b/addons/mail/views/mail_channel_views.xml
@@ -61,7 +61,7 @@
                         </t>
                         <t t-name="kanban-box">
                             <div class="oe_module_vignette oe_kanban_global_click">
-                                <img t-att-src="kanban_image('mail.channel', 'image_medium', record.id.raw_value)" class="oe_module_icon"/>
+                                <img t-att-src="kanban_image('mail.channel', 'image_medium', record.id.raw_value)" class="oe_module_icon" alt="Channel"/>
                                 <div class="oe_module_desc">
                                     <h4 class="o_kanban_record_title">#<field name="name"/></h4>
                                     <p class="oe_module_name">
@@ -109,7 +109,7 @@
                             <field name="description" placeholder="Topics discussed in this group..."/>
                         </group>
                         <group name="group_alias" attrs="{'invisible': [('alias_domain', '=', False)]}">
-                            <label for="alias_id" string=" " class="fa fa-envelope-o" style="min-width: 20px;"/>
+                            <label for="alias_id" string=" " class="fa fa-envelope-o" style="min-width: 20px;" aria-label="Email" title="Email" role="img"/>
                             <div name="alias_def">
                                 <field name="alias_id" class="oe_read_only oe_inline"
                                         string="Email Alias" required="0"/>
diff --git a/addons/mail/views/mail_message_views.xml b/addons/mail/views/mail_message_views.xml
index 09bb34c86ac3..6993ca81e0a3 100644
--- a/addons/mail/views/mail_message_views.xml
+++ b/addons/mail/views/mail_message_views.xml
@@ -154,7 +154,7 @@
                                                 <t t-set="webimage" t-value="new RegExp('image.*(gif|jpeg|jpg|png)').test(record.mimetype.value)"/>
                                                 <div t-if="!webimage" class="o_image" t-att-data-mimetype="record.mimetype.value"/>
                                                 <div t-if="webimage" class="o_attachment_image">
-                                                    <img t-attf-src="/web/image/#{record.id.raw_value}?download=1"/>
+                                                    <img t-attf-src="/web/image/#{record.id.raw_value}?download=1" alt="Download"/>
                                                 </div>
                                             </a>
                                         </div>
diff --git a/addons/mail/views/res_config_settings_views.xml b/addons/mail/views/res_config_settings_views.xml
index 8450b6de760c..3abf7d094382 100644
--- a/addons/mail/views/res_config_settings_views.xml
+++ b/addons/mail/views/res_config_settings_views.xml
@@ -12,7 +12,7 @@
                         <div class="col-xs-12 col-md-6 o_setting_box">
                             <div class="o_setting_left_pane"/>
                             <div class="o_setting_right_pane">
-                                <label string="Activities"/>
+                                <span class="o_form_label">Activities</span>
                                 <div class="text-muted">
                                     Configure your activity types
                                 </div>
diff --git a/addons/mail/wizard/mail_resend_message_views.xml b/addons/mail/wizard/mail_resend_message_views.xml
index 85af6dc4b096..2ff9dfd3bd4b 100644
--- a/addons/mail/wizard/mail_resend_message_views.xml
+++ b/addons/mail/wizard/mail_resend_message_views.xml
@@ -20,7 +20,7 @@
                             <field name="resend" widget="boolean_toggle"/>
                         </tree>
                     </field>
-                    <p attrs="{'invisible':[('has_cancel', '==', False)]}"> <span class="fa fa-info-circle"/> Caution: It won't be possible to send this mail again to the recipients you did not select.</p>
+                    <p attrs="{'invisible':[('has_cancel', '==', False)]}"> <span class="fa fa-info-circle"> Caution: It won't be possible to send this mail again to the recipients you did not select.</span></p>
                     <footer>
                         <button string="Resend to selected" name="resend_mail_action" type="object" class="btn-primary o_mail_send"/>
                         <button string="Ignore all failure" name="cancel_mail_action" type="object" class="btn-default" />
diff --git a/addons/maintenance/views/maintenance_views.xml b/addons/maintenance/views/maintenance_views.xml
index 06709b3bb3b3..5e06a9eff59c 100644
--- a/addons/maintenance/views/maintenance_views.xml
+++ b/addons/maintenance/views/maintenance_views.xml
@@ -90,7 +90,7 @@
                             <label for="schedule_date"/>
                             <div class="o_row">
                                 <field name="schedule_date"/>
-                                <label string="for"/>
+                                <label for="duration" string="for"/>
                                 <field name="duration" class="oe_inline"/> hours
                             </div>
                             <field name="priority" widget="priority"/>
@@ -134,13 +134,13 @@
                         <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_semantic_html_override">
                             <div class="o_dropdown_kanban dropdown">
 
-                                <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                     <span class="fa fa-ellipsis-v"/>
                                 </a>
-                                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                    <t t-if="widget.editable"><li><a type="edit">Edit...</a></li></t>
-                                    <t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t>
-                                    <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                <ul class="dropdown-menu" role="menu">
+                                    <t t-if="widget.editable"><li><a role="menuitem" type="edit">Edit...</a></li></t>
+                                    <t t-if="widget.deletable"><li><a role="menuitem" type="delete">Delete</a></li></t>
+                                    <li role="menuitem" aria-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                                 </ul>
                             </div>
                             <div class="oe_kanban_content" tooltip="kanban-tooltip">
@@ -156,7 +156,7 @@
                                     <div class="oe_kanban_bottom_left">
                                         <field name="priority" widget="priority"/>
                                         <t t-if="record.message_needaction_counter.raw_value">
-                                            <span class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments'/><t t-raw="record.message_needaction_counter.raw_value"/></span>
+                                            <span role="alert" class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments' role="img" aria-label="Unread Messages"/><t t-raw="record.message_needaction_counter.raw_value"/></span>
                                         </t>
                                         <div class="o_kanban_inline_block ml4 mr4">
                                             <field name="activity_ids" widget="kanban_activity" />
@@ -164,7 +164,7 @@
                                     </div>
                                     <div class="oe_kanban_bottom_right">
                                         <field name="kanban_state" widget="state_selection"/>
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.technician_user_id.raw_value)" t-att-title="record.technician_user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.technician_user_id.raw_value)" t-att-title="record.technician_user_id.value" t-att-alt="record.technician_user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                     </div>
                                 </div>
                             </div>
@@ -431,15 +431,15 @@
                         <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
                             <div class="o_dropdown_kanban dropdown">
 
-                                <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                     <span class="fa fa-ellipsis-v"/>
                                 </a>
-                                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                    <t t-if="widget.editable"><li><a type="edit">Edit...</a></li></t>
-                                    <t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t>
-                                    <li class="divider"></li>
-                                    <li class="dropdown-header">Record Colour</li>
-                                    <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                <ul class="dropdown-menu" role="menu">
+                                    <t t-if="widget.editable"><li><a role="menuitem" type="edit">Edit...</a></li></t>
+                                    <t t-if="widget.deletable"><li><a role="menuitem" type="delete">Delete</a></li></t>
+                                    <li role="separator" class="divider"></li>
+                                    <li role="separator" class="dropdown-header">Record Colour</li>
+                                    <li role="menuitem" aria-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                                 </ul>
                             </div>
                             <div class="oe_kanban_content" tooltip="kanban-tooltip">
@@ -462,7 +462,7 @@
                                         <div class="o_kanban_inline_block">
                                             <field name="activity_ids" widget="kanban_activity" />
                                         </div>
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.owner_user_id.raw_value)" t-att-title="record.owner_user_id.value" width="27" height="27" class="oe_kanban_avatar"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.owner_user_id.raw_value)" t-att-title="record.owner_user_id.value" t-att-alt="record.owner_user_id.value" width="27" height="27" class="oe_kanban_avatar"/>
                                     </div>
                                 </div>
                             </div>
@@ -654,7 +654,7 @@
                         <div t-attf-class="oe_kanban_global_click">
                             <div class="mb4">
                                 <strong><field name="name"/></strong>
-                                <img t-att-src="kanban_image('res.users', 'image_small', record.technician_user_id.raw_value)" t-att-title="record.technician_user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                <img t-att-src="kanban_image('res.users', 'image_small', record.technician_user_id.raw_value)" t-att-title="record.technician_user_id.value" t-att-alt="record.technician_user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                             </div>
                             <div class="row mt4">
                                 <div class="col-xs-6">
@@ -825,7 +825,7 @@
                                         </a></div>
                                 </div>
                                 <div class="o_kanban_manage_button_section">
-                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                 </div>
                             </div>
                             <div class="container o_kanban_card_content">
@@ -872,38 +872,38 @@
                                         </div>
                                     </div>
                                 </div>
-                            </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                            </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                 <div class="row">
                                     <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view">
-                                        <div class="o_kanban_card_manage_title">
+                                        <div role="menuitem" class="o_kanban_card_manage_title">
                                             <span>View</span>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action">
                                                 All
                                             </a>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_todo': 1}">
                                                 To Do
                                             </a>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_progress': 1}">
                                                 In Progress
                                             </a>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_done': 1}">
                                                 Done
                                             </a>
                                         </div>
                                     </div>
                                     <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_new">
-                                        <div class="o_kanban_card_manage_title">
+                                        <div role="menuitem" class="o_kanban_card_manage_title">
                                             <span>Reporting</span>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(maintenance_request_action_reports)d" type="action" context="{'search_default_maintenance_team_id': active_id}">
                                             Maintenance Requests
                                             </a>
@@ -911,10 +911,10 @@
                                     </div>
                                 </div>
                                 <div t-if="widget.editable" class="o_kanban_card_manage_settings row">
-                                    <div class="col-xs-8">
-                                        <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                    <div class="col-xs-8" role="menuitem" aria-haspopup="true">
+                                        <ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
                                     </div>
-                                    <div class="col-xs-4 text-right">
+                                    <div role="menuitem" class="col-xs-4 text-right">
                                         <a type="edit">Settings</a>
                                     </div>
                                 </div>
diff --git a/addons/mass_mailing/data/mass_mailing_demo.xml b/addons/mass_mailing/data/mass_mailing_demo.xml
index 347a04deaf10..3a8b4a57e6e2 100644
--- a/addons/mass_mailing/data/mass_mailing_demo.xml
+++ b/addons/mass_mailing/data/mass_mailing_demo.xml
@@ -40,7 +40,7 @@
             <field name="use_default_to" eval="True"/>
             <field name="auto_delete" eval="True"/>
             <field name="body_html"><![CDATA[<div class="snippet_row bg-color" style="padding:0px;width:600px;margin:auto;background: #ffffff repeat top /100%">
-                <table cellpadding="0" cellspacing="0" style="border-collapse:collapse" width="100%"><tbody><tr><td style="padding:10px 10px 10px 5px" valign="center" width="270"> <a style="text-decoration:none" href="http://www.example.com"><strong>My Company</strong></a> </td><td style="padding:10px 15px 10px 10px;vertical-align:middle" valign="center" width="270"><table align="right" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse"><tbody><tr><td align="right"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x" style="color:#44B7B7;"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-google-plus-square fa-2x" style="color:#44B7B7;"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-linkedin-square fa-2x" style="color:#44B7B7;"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-twitter-square fa-2x" style="color:#44B7B7;"></span></a></td></tr></tbody></table></td></tr></tbody></table></div><div style="padding:0px;width:600px;margin:auto;background-color:#44B7B7;color:#168484"><table cellpadding="0" cellspacing="0" style="width:100%;background-color:inherit;border-collapse:collapse;color:inherit"><tbody><tr><td class="col_mv bg-color" style="text-align:left; padding-left:20px;vertical-align:middle;font-size:14px"><p style="margin:0;font-size:20px;color:#fff">You get a 20% discount for signing up!</p><p style="margin:0">Discount Code: <strong>45A9E77DGW8455</strong></p></td><td class="col_mv bg-color" style="padding:20px;text-align:center;vertical-align:middle">  <span class="fa fa-6x fa-ticket"></span>  </td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0;width:600px;max-width:600px;margin:0 auto;background: #fff repeat top /100%;color:#168484"><table style="width:100%;text-align:justify;margin:0 auto;inherit;border-collapse:collapse;color:inherit"><tbody><tr><td style="padding:10px 30px;font-size:14px;line-height:20px"><p style="margin:0">Dear ${object.name}</p><p style="margin:0">Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.<br></p><p style="margin:0">Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.</p><p style="margin:0">Kind Regards,</p><p style="margin:0">Michael Fletcher</p></td></tr></tbody></table></div><div style="padding:0;width:600px;max-width:600px;margin:0 auto"><table style="width:100%;text-align:justify;margin:0 auto;background-color:inherit;border-collapse:collapse"><tbody><tr><td class="col_mv bg-color" style="padding:10px 0;background-color:#168484;color:#fff"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-check fa-3x"></span>  </td><td style="padding-left:10px;color:#fff;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 1:</p><p style="margin:0">Place Order</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-truck fa-3x"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 2:</p><p style="margin:0">Shipping</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-dollar fa-3x"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 3:</p><p style="margin:0">Payment</p></td></tr></tbody></table></td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0px;width:600px;margin:auto;background: #414141 repeat top /100%;color:#44B7B7"><div style="padding:10px"><table cellpadding="0" cellspacing="0" style="margin: 0 auto;width:100%;border-collapse:collapse;color:inherit;color:inherit"><tbody><tr><td style="text-align:center"> <a target="_blank" style="text-decoration: none;" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x"></span></a><a target="_blank" style="text-decoration: none;" href="https://plus.google.com/+Odooapps"><span class="fa fa-google-plus-square fa-2x"></span></a><a target="_blank" style="text-decoration: none;" href="https://www.linkedin.com/company/odoo"><span class="fa fa-linkedin-square fa-2x"></span></a><a target="_blank" style="text-decoration: none;" href="https://twitter.com/Odoo"><span class="fa fa-twitter-square fa-2x"></span></a> </td></tr><tr><td style="font-size:12px;text-align:center;padding-top:10px;padding-bottom:5px"> <a href="/unsubscribe_from_list" style="color:#44B7B7">Unsubscribe</a>|<a href="/page/contactus" style="color:#44B7B7">Contact</a> </td></tr></tbody></table></div>
+                <table cellpadding="0" cellspacing="0" style="border-collapse:collapse" width="100%"><tbody><tr><td style="padding:10px 10px 10px 5px" valign="center" width="270"> <a style="text-decoration:none" href="http://www.example.com"><strong>My Company</strong></a> </td><td style="padding:10px 15px 10px 10px;vertical-align:middle" valign="center" width="270"><table align="right" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse"><tbody><tr><td align="right"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x" style="color:#44B7B7;" role="img" aria-label="Facebook" title="Facebook"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-google-plus-square fa-2x" style="color:#44B7B7;" role="img" aria-label="Google Plus" title="Google Plus"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-linkedin-square fa-2x" style="color:#44B7B7;" role="img" aria-label="LinkedIn" title="LinkedIn"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-twitter-square fa-2x" style="color:#44B7B7;" role="img" aria-label="Twitter" title="Twitter"></span></a></td></tr></tbody></table></td></tr></tbody></table></div><div style="padding:0px;width:600px;margin:auto;background-color:#44B7B7;color:#168484"><table cellpadding="0" cellspacing="0" style="width:100%;background-color:inherit;border-collapse:collapse;color:inherit"><tbody><tr><td class="col_mv bg-color" style="text-align:left; padding-left:20px;vertical-align:middle;font-size:14px"><p style="margin:0;font-size:20px;color:#fff">You get a 20% discount for signing up!</p><p style="margin:0">Discount Code: <strong>45A9E77DGW8455</strong></p></td><td class="col_mv bg-color" style="padding:20px;text-align:center;vertical-align:middle">  <span class="fa fa-6x fa-ticket" role="img" aria-label="Ticket" title="Ticket"></span>  </td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0;width:600px;max-width:600px;margin:0 auto;background: #fff repeat top /100%;color:#168484"><table style="width:100%;text-align:justify;margin:0 auto;inherit;border-collapse:collapse;color:inherit"><tbody><tr><td style="padding:10px 30px;font-size:14px;line-height:20px"><p style="margin:0">Dear ${object.name}</p><p style="margin:0">Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.<br></p><p style="margin:0">Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.</p><p style="margin:0">Kind Regards,</p><p style="margin:0">Michael Fletcher</p></td></tr></tbody></table></div><div style="padding:0;width:600px;max-width:600px;margin:0 auto"><table style="width:100%;text-align:justify;margin:0 auto;background-color:inherit;border-collapse:collapse"><tbody><tr><td class="col_mv bg-color" style="padding:10px 0;background-color:#168484;color:#fff"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-check fa-3x" role="img" aria-label="Check" title="Check"></span>  </td><td style="padding-left:10px;color:#fff;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 1:</p><p style="margin:0">Place Order</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-truck fa-3x" role="img" aria-label="Truck" title="Truck"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 2:</p><p style="margin:0">Shipping</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-dollar fa-3x" role="img" aria-label="Money" title="Money"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 3:</p><p style="margin:0">Payment</p></td></tr></tbody></table></td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0px;width:600px;margin:auto;background: #414141 repeat top /100%;color:#44B7B7"><div style="padding:10px"><table cellpadding="0" cellspacing="0" style="margin: 0 auto;width:100%;border-collapse:collapse;color:inherit;color:inherit"><tbody><tr><td style="text-align:center"> <a target="_blank" style="text-decoration: none;" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x" role="img" aria-label="Facebook" title="Facebook"></span></a><a target="_blank" style="text-decoration: none;" href="https://plus.google.com/+Odooapps"><span class="fa fa-google-plus-square fa-2x" role="img" aria-label="Google Plus" title="Google Plus"></span></a><a target="_blank" style="text-decoration: none;" href="https://www.linkedin.com/company/odoo"><span class="fa fa-linkedin-square fa-2x" role="img" aria-label="LinkedIn" title="LinkedIn"></span></a><a target="_blank" style="text-decoration: none;" href="https://twitter.com/Odoo"><span class="fa fa-twitter-square fa-2x" role="img" aria-label="Twitter" title="Twitter"></span></a> </td></tr><tr><td style="font-size:12px;text-align:center;padding-top:10px;padding-bottom:5px"> <a href="/unsubscribe_from_list" style="color:#44B7B7">Unsubscribe</a>|<a href="/page/contactus" style="color:#44B7B7">Contact</a> </td></tr></tbody></table></div>
             </div>]]></field>
         </record>
 
@@ -69,7 +69,7 @@
             <field name="reply_to_mode">email</field>
             <field name="reply_to"><![CDATA[Info <info@yourcompany.example.com>]]></field>
             <field name="body_html"><![CDATA[<div class="snippet_row bg-color" style="padding:0px;width:600px;margin:auto;background: #ffffff repeat top /100%">
-                <table cellpadding="0" cellspacing="0" style="border-collapse:collapse" width="100%"><tbody><tr><td style="padding:10px 10px 10px 5px" valign="center" width="270"> <a style="text-decoration:none" href="http://www.example.com"><strong>My Company</strong></a> </td><td style="padding:10px 15px 10px 10px;vertical-align:middle" valign="center" width="270"><table align="right" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse"><tbody><tr><td align="right"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x" style="color:#44B7B7;"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-google-plus-square fa-2x" style="color:#44B7B7;"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-linkedin-square fa-2x" style="color:#44B7B7;"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-twitter-square fa-2x" style="color:#44B7B7;"></span></a></td></tr></tbody></table></td></tr></tbody></table></div><div style="padding:0px;width:600px;margin:auto;background-color:#44B7B7;color:#168484"><table cellpadding="0" cellspacing="0" style="width:100%;background-color:inherit;border-collapse:collapse;color:inherit"><tbody><tr><td class="col_mv bg-color" style="text-align:left; padding-left:20px;vertical-align:middle;font-size:14px"><p style="margin:0;font-size:20px;color:#fff">You get a 20% discount for signing up!</p><p style="margin:0">Discount Code: <strong>45A9E77DGW8455</strong></p></td><td class="col_mv bg-color" style="padding:20px;text-align:center;vertical-align:middle">  <span class="fa fa-6x fa-ticket"></span>  </td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0;width:600px;max-width:600px;margin:0 auto;background: #fff repeat top /100%;color:#168484"><table style="width:100%;text-align:justify;margin:0 auto;inherit;border-collapse:collapse;color:inherit"><tbody><tr><td style="padding:10px 30px;font-size:14px;line-height:20px"><p style="margin:0">Dear ${object.name}</p><p style="margin:0">Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.<br></p><p style="margin:0">Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.</p><p style="margin:0">Kind Regards,</p><p style="margin:0">Michael Fletcher</p></td></tr></tbody></table></div><div style="padding:0;width:600px;max-width:600px;margin:0 auto"><table style="width:100%;text-align:justify;margin:0 auto;background-color:inherit;border-collapse:collapse"><tbody><tr><td class="col_mv bg-color" style="padding:10px 0;background-color:#168484;color:#fff"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-check fa-3x"></span>  </td><td style="padding-left:10px;color:#fff;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 1:</p><p style="margin:0">Place Order</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-truck fa-3x"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 2:</p><p style="margin:0">Shipping</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-dollar fa-3x"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 3:</p><p style="margin:0">Payment</p></td></tr></tbody></table></td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0px;width:600px;margin:auto;background: #414141 repeat top /100%;color:#44B7B7"><div style="padding:10px"><table cellpadding="0" cellspacing="0" style="margin: 0 auto;width:100%;border-collapse:collapse;color:inherit;color:inherit"><tbody><tr><td style="text-align:center"> <a target="_blank" style="text-decoration: none;" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x"></span></a><a target="_blank" style="text-decoration: none;" href="https://plus.google.com/+Odooapps"><span class="fa fa-google-plus-square fa-2x"></span></a><a target="_blank" style="text-decoration: none;" href="https://www.linkedin.com/company/odoo"><span class="fa fa-linkedin-square fa-2x"></span></a><a target="_blank" style="text-decoration: none;" href="https://twitter.com/Odoo"><span class="fa fa-twitter-square fa-2x"></span></a> </td></tr><tr><td style="font-size:12px;text-align:center;padding-top:10px;padding-bottom:5px"> <a href="/unsubscribe_from_list" style="color:#44B7B7">Unsubscribe</a>|<a href="/page/contactus" style="color:#44B7B7">Contact</a> </td></tr></tbody></table></div>
+                <table cellpadding="0" cellspacing="0" style="border-collapse:collapse" width="100%"><tbody><tr><td style="padding:10px 10px 10px 5px" valign="center" width="270"> <a style="text-decoration:none" href="http://www.example.com"><strong>My Company</strong></a> </td><td style="padding:10px 15px 10px 10px;vertical-align:middle" valign="center" width="270"><table align="right" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse"><tbody><tr><td align="right"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x" style="color:#44B7B7;" role="img" aria-label="Facebook" title="Facebook"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-google-plus-square fa-2x" style="color:#44B7B7;" role="img" aria-label="Google Plus" title="Google Plus"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-linkedin-square fa-2x" style="color:#44B7B7;" role="img" aria-label="LinkedIn" title="LinkedIn"></span></a></td><td align="right" style="padding-left:5px"><a target="_blank" href="https://www.facebook.com/Odoo"><span class="fa fa-twitter-square fa-2x" style="color:#44B7B7;" role="img" aria-label="Twitter" title="Twitter"></span></a></td></tr></tbody></table></td></tr></tbody></table></div><div style="padding:0px;width:600px;margin:auto;background-color:#44B7B7;color:#168484"><table cellpadding="0" cellspacing="0" style="width:100%;background-color:inherit;border-collapse:collapse;color:inherit"><tbody><tr><td class="col_mv bg-color" style="text-align:left; padding-left:20px;vertical-align:middle;font-size:14px"><p style="margin:0;font-size:20px;color:#fff">You get a 20% discount for signing up!</p><p style="margin:0">Discount Code: <strong>45A9E77DGW8455</strong></p></td><td class="col_mv bg-color" style="padding:20px;text-align:center;vertical-align:middle">  <span class="fa fa-6x fa-ticket" role="img" aria-label="Ticket" title="Ticket"></span>  </td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0;width:600px;max-width:600px;margin:0 auto;background: #fff repeat top /100%;color:#168484"><table style="width:100%;text-align:justify;margin:0 auto;inherit;border-collapse:collapse;color:inherit"><tbody><tr><td style="padding:10px 30px;font-size:14px;line-height:20px"><p style="margin:0">Dear ${object.name}</p><p style="margin:0">Great stories have personality. Consider telling a great story that provides personality. Writing a story with personality for potential clients will assist with making a relationship connection. This shows up in small quirks like word choices or phrases. Write from your point of view, not from someone else's experience.<br></p><p style="margin:0">Great stories are for everyone even when only written for just one person. If you try to write with a wide general audience in mind, your story will ring false and be bland. No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.</p><p style="margin:0">Kind Regards,</p><p style="margin:0">Michael Fletcher</p></td></tr></tbody></table></div><div style="padding:0;width:600px;max-width:600px;margin:0 auto"><table style="width:100%;text-align:justify;margin:0 auto;background-color:inherit;border-collapse:collapse"><tbody><tr><td class="col_mv bg-color" style="padding:10px 0;background-color:#168484;color:#fff"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-check fa-3x" role="img" aria-label="Check" title="Check"></span>  </td><td style="padding-left:10px;color:#fff;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 1:</p><p style="margin:0">Place Order</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-truck fa-3x" role="img" aria-label="Truck" title="Truck"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 2:</p><p style="margin:0">Shipping</p></td></tr></tbody></table></td><td class="col_mv bg-color" style="padding:10px 0;background-color:#FFFFFF;color:#808080"><table style="border-collapse:collapse;background-color:inherit"><tbody><tr><td rowspan="2" style="padding-left:10px">  <span class="fa fa-dollar fa-3x" role="img" aria-label="Money" title="Money"></span>  </td><td style="padding-left:10px;color:#808080;font-size:14px"><p style="font-weight:bold;font-size:18px;margin:0 0 3px 0">Step 3:</p><p style="margin:0">Payment</p></td></tr></tbody></table></td></tr></tbody></table></div><div class="snippet_row bg-color" style="padding:0px;width:600px;margin:auto;background: #414141 repeat top /100%;color:#44B7B7"><div style="padding:10px"><table cellpadding="0" cellspacing="0" style="margin: 0 auto;width:100%;border-collapse:collapse;color:inherit;color:inherit"><tbody><tr><td style="text-align:center"> <a target="_blank" style="text-decoration: none;" href="https://www.facebook.com/Odoo"><span class="fa fa-facebook-square fa-2x" role="img" aria-label="Facebook" title="Facebook"></span></a><a target="_blank" style="text-decoration: none;" href="https://plus.google.com/+Odooapps"><span class="fa fa-google-plus-square fa-2x" role="img" aria-label="Google Plus" title="Google Plus"></span></a><a target="_blank" style="text-decoration: none;" href="https://www.linkedin.com/company/odoo"><span class="fa fa-linkedin-square fa-2x" role="img" aria-label="LinkedIn" title="LinkedIn"></span></a><a target="_blank" style="text-decoration: none;" href="https://twitter.com/Odoo"><span class="fa fa-twitter-square fa-2x" role="img" aria-label="Twitter" title="Twitter"></span></a> </td></tr><tr><td style="font-size:12px;text-align:center;padding-top:10px;padding-bottom:5px"> <a href="/unsubscribe_from_list" style="color:#44B7B7">Unsubscribe</a>|<a href="/page/contactus" style="color:#44B7B7">Contact</a> </td></tr></tbody></table></div>
         </div>]]></field>
             <field name="attachment_ids" eval="[(4, ref('mass_mail_attach_1'))]"/>
         </record>
diff --git a/addons/mass_mailing/static/src/xml/mass_mailing.xml b/addons/mass_mailing/static/src/xml/mass_mailing.xml
index 71f00f2937d2..0cb519ed16df 100644
--- a/addons/mass_mailing/static/src/xml/mass_mailing.xml
+++ b/addons/mass_mailing/static/src/xml/mass_mailing.xml
@@ -1,20 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <templates id="template" xml:space="preserve">
     <div t-name="mass_mailing.theme_selector" class="o_mail_theme_selector">
-        <a href="#" class="btn btn-xs dropdown-toggle" data-toggle="dropdown">
-            <i class="fa fa-paint-brush"/> Change Style
+        <a role="button" href="#" class="btn btn-xs dropdown-toggle" data-toggle="dropdown">
+            <span class="fa fa-paint-brush">Change Style</span>
         </a>
-        <div class="dropdown-menu">
+        <div class="dropdown-menu" role="menu">
             <li t-foreach="themes" t-as="theme">
-                <a href="#">
+                <a role="menuitem" href="#">
                     <div class="o_thumb small"  t-attf-style="background-image: url(#{theme.img}_small.png)"/>
                     <div class="o_thumb large" t-attf-style="background-image: url(#{theme.img}_large.png)"/>
                     <div class="o_thumb logo" t-attf-style="background-image: url(#{theme.img}_logo.png)"/>
                 </a>
             </li>
             <li t-if="themes.length === 1" class="o_mass_mailing_themes_upgrade">
-                <a href="#">
-                    <div class="o_thumb"><i class="fa fa-plus"/></div>
+                <a role="menuitem" href="#">
+                    <div class="o_thumb"><i class="fa fa-plus" role="img" aria-label="Upgrade theme" title="Upgrade theme"/></div>
                 </a>
             </li>
         </div>
diff --git a/addons/mass_mailing/views/editor_field_html.xml b/addons/mass_mailing/views/editor_field_html.xml
index 560af01a7f1e..ed5ce631e619 100644
--- a/addons/mass_mailing/views/editor_field_html.xml
+++ b/addons/mass_mailing/views/editor_field_html.xml
@@ -26,7 +26,7 @@
         <t t-set="head">
             <link rel="stylesheet" href="/mass_mailing/static/src/css/mass_mailing_popup.css" type="text/css"/>
         </t>
-        <div class="modal-dialog modal-md show" id="o_newsletter_popup">
+        <div role="dialog" class="modal-dialog modal-md show" id="o_newsletter_popup">
             <div class="modal-content o_popup_modal_content">
                 <div class="o_popup_modal_body text-center">
                     <div class="o_popup_content_dev">
diff --git a/addons/mass_mailing/views/mass_mailing_stats_views.xml b/addons/mass_mailing/views/mass_mailing_stats_views.xml
index 7cf644dad93b..0090a92f214b 100644
--- a/addons/mass_mailing/views/mass_mailing_stats_views.xml
+++ b/addons/mass_mailing/views/mass_mailing_stats_views.xml
@@ -51,7 +51,7 @@
         <field name="model">mail.mail.statistics</field>
         <field name="arch" type="xml">
             <form string="Mail Statistics" create="0">
-                <div class="oe_form_box_info bg-info oe_text_center alert-info" attrs="{'invisible': [('exception', '=', False)]}">
+                <div class="oe_form_box_info bg-info oe_text_center alert-info" attrs="{'invisible': [('exception', '=', False)]}" role="alert">
                     <p><strong>This email could not be sent.</strong></p>
                 </div>
                 <sheet>
diff --git a/addons/mass_mailing/views/mass_mailing_views.xml b/addons/mass_mailing/views/mass_mailing_views.xml
index b0faff60be31..6648a015b2bb 100644
--- a/addons/mass_mailing/views/mass_mailing_views.xml
+++ b/addons/mass_mailing/views/mass_mailing_views.xml
@@ -84,7 +84,7 @@
                                         </strong>
                                     </div>
                                     <span class="badge" title="Number of bounced email.">
-                                        <i class="fa fa-exclamation-triangle"/> <t t-esc="record.message_bounce.value" title=""/>
+                                        <i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> <t t-esc="record.message_bounce.value" title=""/>
                                     </span>
                                 </div>
                                 <div class="o_kanban_record_body">
@@ -313,15 +313,15 @@
                                     </div>
                                     <div class="o_kanban_card_manage_pane">
                                         <div class="o_kanban_card_manage_section o_dropdown_kanban dropdown">
-                                            <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                            <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                                 <span class="fa fa-ellipsis-v"/>
                                             </a>
                                             <ul class="dropdown-menu" role="menu">
                                                 <li t-if="widget.editable">
-                                                    <a type="edit">Edit</a>
+                                                    <a role="menuitem" type="edit">Edit</a>
                                                 </li>
                                                 <li t-if="widget.deletable">
-                                                    <a type="delete">Delete</a>
+                                                    <a role="menuitem" type="delete">Delete</a>
                                                 </li>
                                             </ul>
                                         </div>
@@ -331,7 +331,7 @@
                                     <a class="o_project_kanban_box" name="%(action_view_mass_mailing_contacts_from_list)d" type="action">
                                         <div>
                                             <span class="badge">
-                                                <i class="fa fa-user"/>
+                                                <i class="fa fa-user" role="img" aria-label="Contacts" title="Contacts"/>
                                                 <t t-esc="record.contact_nbr.value"/>
                                             </span>
                                         </div>
@@ -433,7 +433,7 @@
                             </button>
                         </p>
                     </div>
-                    <div class="oe_form_box_info bg-info oe_text_center alert-info" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}">
+                    <div class="oe_form_box_info bg-info oe_text_center alert-info" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}" role="alert">
                         <p>
                             <button class="btn-link"
                                     name="%(action_view_mail_mail_statistics_mailing_list)d"
@@ -566,13 +566,13 @@
                         <t t-name="kanban-box">
                             <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_kanban_mass_mailing">
                                 <div class="o_dropdown_kanban dropdown">
-                                    <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                    <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                         <span class="fa fa-ellipsis-v"/>
                                     </a>
-                                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                    <ul class="dropdown-menu" role="menu">
+                                        <li role="menuitem" aria-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                                         <t t-if="widget.deletable">
-                                            <li><a type="delete">Delete</a></li>
+                                            <li><a role="menuitem" type="delete">Delete</a></li>
                                         </t>
                                     </ul>
                                 </div>
@@ -920,19 +920,19 @@
                             <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_kanban_mass_mailing_campaign">
                                 <div class="o_dropdown_kanban dropdown">
 
-                                    <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                    <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                         <span class="fa fa-ellipsis-v"/>
                                     </a>
-                                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
+                                    <ul class="dropdown-menu" role="menu">
                                         <t t-if="widget.editable">
-                                            <li><a type="edit">Settings</a></li>
+                                            <li><a role="menuitem" type="edit">Settings</a></li>
                                         </t>
                                         <t t-if="widget.deletable">
-                                            <li><a type="delete">Delete</a></li>
+                                            <li><a role="menuitem" type="delete">Delete</a></li>
                                         </t>
-                                        <li class="divider"/>
-                                        <li class="dropdown-header">Colour</li>
-                                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                        <li role="separator" class="divider"/>
+                                        <li role="separator" class="dropdown-header">Colour</li>
+                                        <li role="menuitem" aria-haspopup="true"><ul class="oe_kanban_colorpicker" role="menu" data-field="color"/></li>
                                     </ul>
                                 </div>
                                  <div class="oe_kanban_content">
@@ -958,7 +958,7 @@
                                             </div>
                                         </div>
                                         <div class="oe_kanban_bottom_right" style="height:90px">
-                                            <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="30" height="30" class="oe_kanban_avatar"/>
+                                            <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="30" height="30" class="oe_kanban_avatar"/>
                                         </div>
                                     </div>
                                 </div>
diff --git a/addons/mass_mailing/views/snippets_themes.xml b/addons/mass_mailing/views/snippets_themes.xml
index d2e52a2a6f7a..79bc68cdec90 100644
--- a/addons/mass_mailing/views/snippets_themes.xml
+++ b/addons/mass_mailing/views/snippets_themes.xml
@@ -22,7 +22,7 @@
             </div>
             <div id="email_designer_default_headers" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-angle-double-up"/> Headers
+                    <span class="fa fa-angle-double-up">Headers</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="mass_mailing.s_mail_block_header_social" t-thumbnail="/mass_mailing/static/src/img/blocks/block_header_social.png"/>
@@ -33,7 +33,7 @@
             </div>
             <div id="email_designer_default_body" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-clone"/> Body
+                    <span class="fa fa-clone">Body</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="mass_mailing.s_mail_block_title_text" t-thumbnail="/mass_mailing/static/src/img/blocks/block_title_text.png"/>
@@ -51,7 +51,7 @@
             </div>
             <div id="email_designer_default_extra" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-plus"/> Marketing Content
+                    <span class="fa fa-plus">Marketing Content</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="mass_mailing.s_mail_block_discount2" t-thumbnail="/mass_mailing/static/src/img/blocks/block_discount2.png"/>
@@ -62,7 +62,7 @@
             </div>
             <div id="email_designer_default_footer" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-angle-double-down"/> Footers
+                    <span class="fa fa-angle-double-down">Footers</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="mass_mailing.s_mail_block_footer_social" t-thumbnail="/mass_mailing/static/src/img/blocks/block_footer_social.png"/>
@@ -171,7 +171,7 @@
                                 </small>
                             </p>
                             <div class="o_mail_v_padding text-center">
-                                <a href="#" class="btn btn-primary">LOGIN</a>
+                                <a role="button" href="#" class="btn btn-primary">LOGIN</a>
                             </div>
 
                         </td>
@@ -278,7 +278,7 @@
                                     </tr>
                                     <tr>
                                         <td valign="top" class="text-center o_mail_h_padding o_mail_col_mv" style="padding-bottom: 20px;">
-                                            <a href="#" class="btn btn-block btn-primary">More</a>
+                                            <a role="button" href="#" class="btn btn-block btn-primary">More</a>
                                         </td>
                                     </tr>
                                 </tfoot>
@@ -334,7 +334,7 @@
                                     </tr>
                                     <tr>
                                         <td valign="top" class="text-center o_mail_h_padding o_mail_col_mv" style="padding-bottom: 20px;">
-                                            <a href="#" class="btn btn-block btn-primary">More</a>
+                                            <a role="button" href="#" class="btn btn-block btn-primary">More</a>
                                         </td>
                                     </tr>
                                 </tfoot>
@@ -363,7 +363,7 @@
                                     your content needs to be useful to your readers.
                                 </p>
                                 <div class="text-center" style="margin-top:15px;">
-                                    <a href="#" class="btn btn-link">Read More...</a>
+                                    <a role="button" href="#" class="btn btn-link">Read More...</a>
                                 </div>
                             </div>
                         </td>
@@ -378,7 +378,7 @@
                                     your content needs to be useful to your readers.
                                 </p>
                                 <div class="text-center" style="margin-top:15px;">
-                                    <a href="#" class="btn btn-link">Read More...</a>
+                                    <a role="button" href="#" class="btn btn-link">Read More...</a>
                                 </div>
                             </div>
                         </td>
@@ -403,7 +403,7 @@
                                     A short description
                                 </p>
                                 <div class="text-center" style="margin-top:15px;">
-                                    <a href="#" class="btn btn-link">Read More...</a>
+                                    <a role="button" href="#" class="btn btn-link">Read More...</a>
                                 </div>
                             </div>
                         </td>
@@ -416,7 +416,7 @@
                                     A short description
                                 </p>
                                 <div class="text-center" style="margin-top:15px;">
-                                    <a href="#" class="btn btn-link">Read More...</a>
+                                    <a role="button" href="#" class="btn btn-link">Read More...</a>
                                 </div>
                             </div>
                         </td>
@@ -429,7 +429,7 @@
                                     A short description
                                 </p>
                                 <div class="text-center" style="margin-top:15px;">
-                                    <a href="#" class="btn btn-link">Read More...</a>
+                                    <a role="button" href="#" class="btn btn-link">Read More...</a>
                                 </div>
                             </div>
                         </td>
@@ -453,7 +453,7 @@
                             <h3>Omnichannel sales</h3>
                             <p class="o_mail_no_margin" style="text-align:justify;">Get your inside sales (CRM) fully integrated with online sales (eCommerce), in-store sales (Point of Sale) and marketplaces like eBay and Amazon.</p>
                             <div class="text-center" style="margin-top:15px;">
-                                <a href="#" class="btn btn-link">Read More...</a>
+                                <a role="button" href="#" class="btn btn-link">Read More...</a>
                             </div>
                         </td>
                     </tr>
@@ -473,7 +473,7 @@
                             <h3>A unique value</h3>
                             <p class="o_mail_no_margin" style="text-align:justify;">The open source model of Odoo has allowed us to leverage thousands of developers and business experts to build hundreds of apps in just a few years.</p>
                             <div class="text-center" style="margin-top:15px;">
-                                <a href="#" class="btn btn-link">Read More...</a>
+                                <a role="button" href="#" class="btn btn-link">Read More...</a>
                             </div>
                         </td>
                         <td style="width:270px;text-align:center;vertical-align:middle" class="o_mail_img_container o_mail_h_padding o_mail_v_padding">
@@ -536,7 +536,7 @@
                     <tr>
                         <td class="o_mail_h_padding o_mail_v_padding bg-beta" style="padding:10px;">
                             &amp;nbsp;
-                            <a href="#" class="btn btn-primary">My Account</a>
+                            <a role="button" href="#" class="btn btn-primary">My Account</a>
                             &amp;nbsp;
                         </td>
                     </tr>
@@ -583,7 +583,7 @@
                     </tr>
                     <tr>
                         <td class="mb16 mt16 text-center">
-                            <a class="btn btn-primary">Use now</a>
+                            <a role="button" class="btn btn-primary">Use now</a>
                         </td>
                     </tr>
                 </tbody>
@@ -613,7 +613,7 @@
                                 </tr>
                                 <tr>
                                     <td class="text-center">
-                                        <a href="#" class="btn btn-primary">Redeem Discount!</a>
+                                        <a role="button" href="#" class="btn btn-primary">Redeem Discount!</a>
                                         &amp;nbsp;
                                     </td>
                                 </tr>
@@ -650,8 +650,8 @@
                             </p>
                         </div>
                         <div class="small mt16">
-                            <a href="#" class="btn btn-sm btn-primary">Registration</a>
-                            <a href="#" class="btn btn-sm btn-link" style="margin-left:10px">More Info</a>
+                            <a role="button" href="#" class="btn btn-sm btn-primary">Registration</a>
+                            <a role="button" href="#" class="btn btn-sm btn-link" style="margin-left:10px">More Info</a>
                         </div>
                     </td>
                 </tr>
@@ -671,7 +671,7 @@
                                 <tr>
                                     <td rowspan="2" class="text-right">
                                         &amp;nbsp;
-                                        <span class="fa fa-compass fa-2x text-delta"></span>
+                                        <span class="fa fa-compass fa-2x text-delta" role="img" aria-label="Choose" title="Choose"></span>
                                         &amp;nbsp;
                                     </td>
                                     <td style="padding-left:10px;">
@@ -686,7 +686,7 @@
                                 <tr>
                                     <td rowspan="2" class="text-right">
                                         &amp;nbsp;
-                                        <span class="fa fa-credit-card fa-2x text-delta"></span>
+                                        <span class="fa fa-credit-card fa-2x text-delta" role="img" aria-label="Order" title="Order"></span>
                                         &amp;nbsp;
                                     </td>
                                     <td style="padding-left:10px;">
@@ -701,7 +701,7 @@
                                 <tr>
                                     <td rowspan="2" class="text-right">
                                         &amp;nbsp;
-                                        <span class="fa fa-smile-o fa-2x text-delta"></span>
+                                        <span class="fa fa-smile-o fa-2x text-delta" role="img" aria-label="Enjoy" title="Enjoy"></span>
                                         &amp;nbsp;
                                     </td>
                                     <td style="padding-left:10px;">
@@ -725,12 +725,12 @@
                 <tbody>
                     <tr>
                         <td class="o_mail_footer_links">
-                            <a href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
+                            <a role="button" href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
                         </td>
                     </tr>
                     <tr>
                         <td>
-                            <p class="o_mail_footer_copy"><span class="fa fa-copyright"/> 2016 All Rights Reserved</p>
+                            <p class="o_mail_footer_copy"><span class="fa fa-copyright" role="img" aria-label="Copyright" title="Copyright"/> 2016 All Rights Reserved</p>
                         </td>
                     </tr>
                 </tbody>
@@ -750,10 +750,10 @@
                                 <strong><t t-esc="res_company.partner_id.name"/></strong>
                             </p>
                             <div class="o_mail_footer_links">
-                                <a href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
+                                <a role="button" href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
                             </div>
                             <div>
-                                <p class="o_mail_footer_copy"><span class="fa fa-copyright"/> 2016 All Rights Reserved</p>
+                                <p class="o_mail_footer_copy"><span class="fa fa-copyright" role="img" aria-label="Copyright" title="Copyright"/> 2016 All Rights Reserved</p>
                             </div>
                         </td>
                     </tr>
diff --git a/addons/mass_mailing/views/snippets_themes_options.xml b/addons/mass_mailing/views/snippets_themes_options.xml
index 3caafae46d58..53a73d711565 100644
--- a/addons/mass_mailing/views/snippets_themes_options.xml
+++ b/addons/mass_mailing/views/snippets_themes_options.xml
@@ -42,8 +42,8 @@
         data-selector="[data-oe-field='body_html'] > div:not(.o_layout), [data-oe-field='body_html'] .oe_structure > div, td, th"
         data-exclude=".o_mail_no_colorpicker, .o_mail_no_options">
         <li class="dropdown-submenu">
-            <a tabindex="-1" href="#"><i class="fa fa-eyedropper"/>Background Color</a>
-            <ul class="dropdown-menu">
+            <a tabindex="-1" href="#"><span class="fa fa-eyedropper">Background Color</span></a>
+            <ul class="dropdown-menu" role="menu">
                 <li></li>
             </ul>
         </li>
diff --git a/addons/membership/views/product_views.xml b/addons/membership/views/product_views.xml
index 3598f1b2b5ac..c08473cd647e 100644
--- a/addons/membership/views/product_views.xml
+++ b/addons/membership/views/product_views.xml
@@ -55,10 +55,10 @@
                                     <div class="o_kanban_record_headings">
                                         <strong class="o_kanban_record_title"><span class="mt4"><field name="name"/></span></strong>
                                     </div>
-                                    <span class="badge"><i class="fa fa-money"/> <field name="list_price"/></span>
+                                    <span class="badge"><i class="fa fa-money" role="img" aria-label="Price" title="Price"/> <field name="list_price"/></span>
                                 </div>
                                 <div class="o_kanban_record_body">
-                                    <i class="fa fa-clock-o" aria-hidden="true"></i><strong> From: </strong><field name="membership_date_from"/><strong> To:</strong> <field name="membership_date_to"/>
+                                    <i class="fa fa-clock-o" role="img" aria-label="Period" title="Period"></i><strong> From: </strong><field name="membership_date_from"/><strong> To:</strong> <field name="membership_date_to"/>
                                 </div>
                             </div>
                         </t>
diff --git a/addons/mrp/report/mrp_production_templates.xml b/addons/mrp/report/mrp_production_templates.xml
index 1e27b00e224b..9330a224f490 100644
--- a/addons/mrp/report/mrp_production_templates.xml
+++ b/addons/mrp/report/mrp_production_templates.xml
@@ -117,12 +117,12 @@
                                             </td>
                                             <td t-if="has_serial_number" width="15%">
                                                 <t t-if="has_serial_number and (ml.lot_id or ml.lot_name)">
-                                                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', ml.lot_id.name, 600, 100)" style="width:100%;height:35px"/>
+                                                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', ml.lot_id.name, 600, 100)" style="width:100%;height:35px" alt="Barcode"/>
                                                 </t>
                                             </td>
                                             <td t-if="has_product_barcode" width="15%" class="text-center">
                                                 <t t-if="line.product_id.barcode">
-                                                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', line.product_id.barcode, 600, 100)" style="width:100%;height:35px"/>
+                                                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', line.product_id.barcode, 600, 100)" style="width:100%;height:35px" alt="Barcode"/>
                                                 </t>
                                             </td>
                                         </tr>
diff --git a/addons/mrp/report/mrp_report_bom_structure.xml b/addons/mrp/report/mrp_report_bom_structure.xml
index 2122a9e10f74..de3dc0eed4af 100644
--- a/addons/mrp/report/mrp_report_bom_structure.xml
+++ b/addons/mrp/report/mrp_report_bom_structure.xml
@@ -79,13 +79,13 @@
                 <td>
                     <span t-att-style="space_td"/>
                     <t t-if="l['child_bom']">
-                        <span t-att-data-function="'get_bom'" class="o_mrp_bom_unfoldable fa fa-fw fa-caret-right"/>
+                        <span t-att-data-function="'get_bom'" class="o_mrp_bom_unfoldable fa fa-fw fa-caret-right" role="img" aria-label="Unfold" title="Unfold"/>
                     </t>
                     <span t-att-class="None if l['child_bom'] else 'o_mrp_bom_no_fold'">
                         <a t-att-data-res-id="l['prod_id']" t-att-data-model="'product.product'" class="o_mrp_bom_action"><t t-esc="l['prod_name']"/></a>
                     </span>
                     <t t-if="l['phantom_bom']">
-                        <span class="fa fa-dropbox" title="This is a BoM of type Kit!"/>
+                        <span class="fa fa-dropbox" title="This is a BoM of type Kit!" role="img" aria-label="This is a BoM of type Kit!"/>
                     </t>
                 </td>
                 <td><span><t t-esc="l['prod_qty']" t-options='{"widget": "float", "decimal_precision": "Product Unit of Measure"}'/></span></td>
@@ -103,7 +103,7 @@
             <tr class="o_mrp_bom_report_line o_mrp_bom_cost" t-att-data-id="'operation-' + str(data['bom'].id)" t-att-data-bom-id="data['bom'].id" t-att-parent_id="data['bom'].id" t-att-data-qty="data['bom_qty']" t-att-data-level="data['level']">
                 <td>
                     <span t-att-style="space_td"/>
-                    <span class="o_mrp_bom_unfoldable fa fa-fw fa-caret-right" t-att-data-function="'get_operations'"/>
+                    <span class="o_mrp_bom_unfoldable fa fa-fw fa-caret-right" t-att-data-function="'get_operations'" role="img" aria-label="Unfold" title="Unfold"/>
                     Operations
                 </td>
                 <td>
diff --git a/addons/mrp/views/ir_attachment_view.xml b/addons/mrp/views/ir_attachment_view.xml
index cf6b00982c77..a478dbf60621 100644
--- a/addons/mrp/views/ir_attachment_view.xml
+++ b/addons/mrp/views/ir_attachment_view.xml
@@ -23,7 +23,7 @@
                                                 <t t-set="webimage" t-value="new RegExp('image.*(gif|jpeg|jpg|png)').test(record.mimetype.value)"/>
                                                 <div t-if="!webimage" class="o_image" t-att-data-mimetype="record.mimetype.value"/>
                                                 <div t-if="webimage" class="o_attachment_image">
-                                                    <img t-attf-src="/web/image/#{record.ir_attachment_id.raw_value}?download=1"/>
+                                                    <img t-attf-src="/web/image/#{record.ir_attachment_id.raw_value}?download=1" alt="Download"/>
                                                 </div>
                                             </a>
                                         </div>
diff --git a/addons/mrp/views/mrp_bom_views.xml b/addons/mrp/views/mrp_bom_views.xml
index 3ae43fc95155..50faf5f24e6c 100644
--- a/addons/mrp/views/mrp_bom_views.xml
+++ b/addons/mrp/views/mrp_bom_views.xml
@@ -62,8 +62,8 @@
                                     <field name="sequence" widget="handle"/>
                                     <field name="product_id" context="{'default_type': 'product'}"/>
                                     <field name="has_attachments" invisible="1"/>
-                                    <button name="action_see_attachments" type="object" icon="fa-files-o" attrs="{'invisible': [('has_attachments', '=', False)]}"/>
-                                    <button name="action_see_attachments" type="object" icon="fa-file" attrs="{'invisible': [('has_attachments', '=', True)]}"/>
+                                    <button name="action_see_attachments" type="object" icon="fa-files-o" attrs="{'invisible': [('has_attachments', '=', False)]}" aria-label="No attachment" title="No attachment"/>
+                                    <button name="action_see_attachments" type="object" icon="fa-file" attrs="{'invisible': [('has_attachments', '=', True)]}" aria-label="Attachments" title="Attachments"/>
                                     <field name="product_qty"/>
                                     <field name="product_uom_id" options="{'no_open':True,'no_create':True}" groups="uom.group_uom"/>
                                     <field name="attribute_value_ids" widget="many2many_tags" options="{'no_create': True}" domain="[('product_ids.product_tmpl_id', '=', parent.product_tmpl_id)]" groups="product.group_product_variant"/>
diff --git a/addons/mrp/views/mrp_workcenter_views.xml b/addons/mrp/views/mrp_workcenter_views.xml
index 954da8358170..52bd2d3c331f 100644
--- a/addons/mrp/views/mrp_workcenter_views.xml
+++ b/addons/mrp/views/mrp_workcenter_views.xml
@@ -163,7 +163,7 @@
                                         </span>
                                     </div>
                                     <div class="o_kanban_manage_button_section">
-                                        <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                        <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                     </div>
                                 </div>
                                 <div class="container o_kanban_card_content">
@@ -233,48 +233,51 @@
                                         <div class="col-xs-12 o_kanban_primary_left" style="position:absolute; bottom:10px;" name="wc_stages">
                                             <a name="%(act_mrp_block_workcenter)d" type="action" class="o_status pull-right"
                                                 title="No workorder currently in progress. Click to mark work center as blocked."
+                                                aria-label="No workorder currently in progress. Click to mark work center as blocked."
                                                 attrs="{'invisible': [('working_state','in',('blocked','done'))]}"/>
                                             <a name="unblock" type="object" class=" o_status o_status_red pull-right"
                                                 title="Workcenter blocked, click to unblock."
+                                                aria-label="Workcenter blocked, click to unblock."
                                                 attrs="{'invisible': [('working_state','in',('normal','done'))]}"/>
                                             <a name="%(act_mrp_block_workcenter)d" type="action" class="o_status o_status_green pull-right"
                                                 title="Work orders in progress. Click to block work center."
+                                                aria-label="Work orders in progress. Click to block work center."
                                                 attrs="{'invisible': [('working_state','in',('normal','blocked'))]}"/>
                                         </div>
                                     </div>
-                                </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                                </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                     <div class="row">
                                         <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view">
-                                            <div class="o_kanban_card_manage_title">
+                                            <div role="menuitem" class="o_kanban_card_manage_title">
                                                 <span>Actions</span>
                                             </div>
-                                            <div name="plan_order">
+                                            <div role="menuitem" name="plan_order">
                                                 <a name="%(action_work_orders)d" type="action">Plan Orders</a>
                                             </div>
                                         </div>
                                         <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_new">
-                                            <div class="o_kanban_card_manage_title">
+                                            <div role="menuitem" class="o_kanban_card_manage_title">
                                                 <span>Reporting</span>
                                             </div>
-                                            <div>
+                                            <div role="menuitem">
                                                 <a name="%(mrp_workcenter_productivity_report_oee)d" type="action">OEE</a>
                                             </div>
-                                            <div>
+                                            <div role="menuitem">
                                                 <a name="%(mrp_workorder_workcenter_report)d" type="action" context="{'search_default_thisyear':True}">
                                                     Performance
                                                 </a>
                                             </div>
-                                            <div>
+                                            <div role="menuitem">
                                                 <a name="%(action_work_orders)d" type="action" context="{'search_default_waiting': 1}">Waiting Availability</a>
                                             </div>
                                         </div>
                                     </div>
 
                                     <div t-if="widget.editable" class="o_kanban_card_manage_settings row">
-                                        <div class="col-xs-8">
-                                            <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                        <div role="menuitem" aria-haspopup="true" class="col-xs-8">
+                                            <ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
                                         </div>
-                                        <div class="col-xs-4 text-right">
+                                        <div role="menuitem" class="col-xs-4 text-right">
                                             <a type="edit">Settings</a>
                                         </div>
                                     </div>
diff --git a/addons/mrp/views/mrp_workorder_views.xml b/addons/mrp/views/mrp_workorder_views.xml
index 16757f1acd42..f5afe548beb8 100644
--- a/addons/mrp/views/mrp_workorder_views.xml
+++ b/addons/mrp/views/mrp_workorder_views.xml
@@ -358,11 +358,11 @@
                                         <span><t t-esc="record.product_id.value"/></span> <span><t t-esc="record.qty_production.value"/> <t t-esc="record.product_uom_id.value"/></span>
                                     </div>
                                     <div class="oe_kanban_bottom_right" t-if="record.state.raw_value == 'progress'">
-                                        <span t-if="record.working_state.raw_value != 'blocked' and record.working_user_ids.raw_value.length > 0"><i class="fa fa-play"/></span>
-                                        <span t-if="record.working_state.raw_value != 'blocked' and record.working_user_ids.raw_value.length == 0 and record.last_working_user_id.raw_value"><i class="fa fa-pause"/></span>
-                                        <span t-if="record.working_state.raw_value == 'blocked' and (record.working_user_ids.raw_value.length == 0 or record.last_working_user_id.raw_value)"><i class="fa fa-stop"/></span>
+                                        <span t-if="record.working_state.raw_value != 'blocked' and record.working_user_ids.raw_value.length > 0"><i class="fa fa-play" role="img" aria-label="Run" title="Run"/></span>
+                                        <span t-if="record.working_state.raw_value != 'blocked' and record.working_user_ids.raw_value.length == 0 and record.last_working_user_id.raw_value"><i class="fa fa-pause" role="img" aria-label="Pause" title="Pause"/></span>
+                                        <span t-if="record.working_state.raw_value == 'blocked' and (record.working_user_ids.raw_value.length == 0 or record.last_working_user_id.raw_value)"><i class="fa fa-stop" role="img" aria-label="Stop" title="Stop"/></span>
                                         <t t-if="record.last_working_user_id.raw_value">
-                                            <img t-att-src="kanban_image('res.users', 'image_small', record.last_working_user_id.raw_value)" width="24" height="24" class="oe_kanban_avatar"/>
+                                            <img t-att-src="kanban_image('res.users', 'image_small', record.last_working_user_id.raw_value)" width="24" height="24" class="oe_kanban_avatar" alt="Avatar"/>
                                         </t>
                                     </div>
                                 </div>
diff --git a/addons/mrp/views/res_config_settings_views.xml b/addons/mrp/views/res_config_settings_views.xml
index 05330d1588d2..eb65b96220eb 100644
--- a/addons/mrp/views/res_config_settings_views.xml
+++ b/addons/mrp/views/res_config_settings_views.xml
@@ -79,7 +79,7 @@
                                 </div>
                                 <div class="o_setting_right_pane">
                                     <label string="Security Lead Time" for="use_manufacturing_lead"/>
-                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                    <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." role="img" aria-label="Values set here are company-specific." groups="base.group_multi_company"/>
                                     <div class="text-muted">
                                         Schedule manufacturing orders earlier to avoid delays
                                      </div>
diff --git a/addons/mrp/views/stock_picking_views.xml b/addons/mrp/views/stock_picking_views.xml
index e647d45705aa..800545b20371 100644
--- a/addons/mrp/views/stock_picking_views.xml
+++ b/addons/mrp/views/stock_picking_views.xml
@@ -22,7 +22,7 @@
                                 <div class="o_secondary"><field class="o_secondary"  name="warehouse_id"/></div>
                             </div>
                             <div class="o_kanban_manage_button_section">
-                                <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                             </div>
                         </div>
                         <div class="container o_kanban_card_content">
@@ -55,37 +55,37 @@
                                     </div>
                                 </div>
                             </div>
-                        </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                        </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                             <div class="row">
                                 <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view" name="picking_left_manage_pane">
-                                    <div class="o_kanban_card_manage_title">
+                                    <div role="menuitem" class="o_kanban_card_manage_title">
                                         <span>View</span>
                                     </div>
-                                    <div>
+                                    <div role="menuitem">
                                         <a name="%(mrp_production_action_picking_deshboard)d" type="action">All</a>
                                     </div>
-                                    <div>
+                                    <div role="menuitem">
                                         <a name="%(mrp_production_action_picking_deshboard)d" type="action" context="{'search_default_inprogress': 1}">In Progress</a>
                                     </div>
-                                    <div>
+                                    <div role="menuitem">
                                         <a name="%(mrp_production_action_picking_deshboard)d" type="action" context="{'search_default_planned': 1}">Planned</a>
                                     </div>
                                 </div>
                                 <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_new">
-                                    <div class="o_kanban_card_manage_title">
+                                    <div role="menuitem" class="o_kanban_card_manage_title">
                                         <span>New</span>
                                     </div>
-                                    <div>
+                                    <div role="menuitem">
                                         <a name="%(action_mrp_production_form)d" type="action">Production Order</a>
                                     </div>
                                 </div>
                             </div>
 
                             <div t-if="widget.editable" class="o_kanban_card_manage_settings row">
-                                <div class="col-xs-8">
-                                    <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                <div role="menuitem" aria-haspopup="true" class="col-xs-8">
+                                    <ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
                                 </div>
-                                <div class="col-xs-4 text-right">
+                                <div role="menuitem" class="col-xs-4 text-right">
                                     <a type="edit">Settings</a>
                                 </div>
                             </div>
diff --git a/addons/note/static/src/xml/systray.xml b/addons/note/static/src/xml/systray.xml
index 4b2052c3b851..827bf0159a82 100644
--- a/addons/note/static/src/xml/systray.xml
+++ b/addons/note/static/src/xml/systray.xml
@@ -3,11 +3,11 @@
     <t t-extend="mail.chat.ActivityMenuPreview">
         <t t-jquery="t[t-foreach*='activities'][t-as*='activity']" t-operation="after">
             <div class="o_note_show">
-                <a class="btn btn-block text-center">Add new note</a>
+                <a role="button" class="btn btn-block text-center">Add new note</a>
             </div>
             <div class="o_note o_mail_channel_preview hidden">
                 <div class="o_mail_channel_image o_mail_channel_app">
-                    <img src="/note/static/description/icon.png"/>
+                    <img src="/note/static/description/icon.png" alt="Channel"/>
                 </div>
                 <div class="o_channel_info">
                     <div class="o_channel_title">
@@ -15,7 +15,7 @@
                         <div class="o_note_datetime"/>
                         <span class="ml4">
                             <a class="o_note_set_datetime text-muted">
-                                <span class="fa fa-clock-o"/>
+                                <span class="fa fa-clock-o" role="img" aria-label="Set date and time" title="Set date and time"/>
                             </a>
                         </span>
                     </div>
@@ -29,4 +29,4 @@
             </div>
         </t>
     </t>
-</templates>
\ No newline at end of file
+</templates>
diff --git a/addons/note/views/note_views.xml b/addons/note/views/note_views.xml
index c0a06497c876..772b320dc126 100644
--- a/addons/note/views/note_views.xml
+++ b/addons/note/views/note_views.xml
@@ -97,17 +97,17 @@
                 <field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
 
                 <div class="o_dropdown_kanban dropdown">
-                    <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                    <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                         <span class="fa fa-ellipsis-v"/>
                     </a>
-                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                        <li><a type="delete">Delete</a></li>
-                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                    <ul class="dropdown-menu" role="menu">
+                        <li><a role="menuitem" type="delete">Delete</a></li>
+                        <li role="menuitem" aria-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                     </ul>
                 </div>
                   <span>
-                    <a name="action_close" type="object" t-if="record.open.raw_value"><i class="fa fa-check"/></a>
-                    <a name="action_open" type="object" t-if="!record.open.raw_value"><i class="fa fa-undo"/></a>
+                    <a name="action_close" type="object" t-if="record.open.raw_value"><i class="fa fa-check" role="img" aria-label="Opened" title="Opened"/></a>
+                    <a name="action_open" type="object" t-if="!record.open.raw_value"><i class="fa fa-undo" role="img" aria-label="Closed" title="Closed"/></a>
                   </span>
                 <!-- kanban note -->
                 <span t-attf-class="oe_kanban_content #{record.open.raw_value ? '' : 'note_text_line_through'}">
@@ -122,7 +122,7 @@
                 <t t-if="record.message_partner_ids.raw_value.length &gt; 1">
                     <div class="clearfix"></div>
                       <t t-foreach="record.message_partner_ids.raw_value" t-as="follower">
-                        <img t-att-src="kanban_image('res.partner', 'image_small', follower)" width="24" height="24" class="oe_kanban_avatar pull-right" t-att-data-member_id="follower"/>
+                        <img t-att-src="kanban_image('res.partner', 'image_small', follower)" width="24" height="24" class="oe_kanban_avatar pull-right" t-att-data-member_id="follower" alt="Follower"/>
                       </t>
                     <div class="clearfix"></div>
                 </t>
diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml
index 9a2edc47ffe0..f48ade3d7488 100644
--- a/addons/pad/static/src/xml/pad.xml
+++ b/addons/pad/static/src/xml/pad.xml
@@ -11,7 +11,7 @@
             </t>
             <t t-if="widget.mode === 'edit'">
                 <div class="oe_pad_switch_positioner oe_configured">
-                    <span class="fa fa-expand oe_pad_switch" />
+                    <span class="fa fa-expand oe_pad_switch" role="img" aria-label="Switch pad" title="Switch pad"/>
                 </div>
                 <div class="oe_pad_content oe_editing oe_configured" />
             </t>
diff --git a/addons/pad/static/tests/pad_tests.js b/addons/pad/static/tests/pad_tests.js
index f2ab3a42dfa8..a6b885429a7f 100644
--- a/addons/pad/static/tests/pad_tests.js
+++ b/addons/pad/static/tests/pad_tests.js
@@ -184,7 +184,7 @@ QUnit.module('pad widget', {
         });
         var def = form.canBeDiscarded();
 
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             "should have no confirmation modal opened");
 
         assert.strictEqual(def.state(), 'resolved',
@@ -221,7 +221,7 @@ QUnit.module('pad widget', {
         form.$buttons.find('.o_form_button_edit').click();
         var def = form.canBeDiscarded();
 
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             "should have no confirmation modal opened");
 
         assert.strictEqual(def.state(), 'resolved',
diff --git a/addons/payment/data/payment_acquirer_data.xml b/addons/payment/data/payment_acquirer_data.xml
index 6338737f21a8..da33107a13d9 100644
--- a/addons/payment/data/payment_acquirer_data.xml
+++ b/addons/payment/data/payment_acquirer_data.xml
@@ -22,8 +22,8 @@
                 A payment gateway to accept online payments via credit cards.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
             </ul>
         </field>
         <!-- https://www.buckaroo-payments.com/products/payment-methods/ -->
@@ -45,10 +45,10 @@
                 Ingenico Payment Services (formerly Ogone) supports credit cards, debit cards and bank transfers.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
-                <li><i class="fa fa-check"/>Subscriptions</li>
-                <li><i class="fa fa-check"/>Save Cards</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
+                <li><span class="fa fa-check">Subscriptions</span></li>
+                <li><span class="fa fa-check">Save Cards</span></li>
             </ul>
         </field>
         <!-- https://payment-services.ingenico.com/~/media/files/130806_product_sheet_ingenico_collect_en.ashx?la=en -->
@@ -68,8 +68,8 @@
                 A payment gateway to accept online payments via credit cards, debit cards and bank transfers.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
             </ul>
         </field>
         <!-- https://www.adyen.com/payment-methods -->
@@ -94,11 +94,11 @@
                 A payment gateway to accept online payments via credit cards and e-checks.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
-                <li><i class="fa fa-check"/>Subscriptions</li>
-                <li><i class="fa fa-check"/>Save Cards</li>
-                <li><i class="fa fa-check"/>Manual Capture</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
+                <li><span class="fa fa-check">Subscriptions</span></li>
+                <li><span class="fa fa-check">Save Cards</span></li>
+                <li><span class="fa fa-check">Manual Capture</span></li>
             </ul>
         </field>
         <!-- https://www.authorize.net/solutions/merchantsolutions/onlinemerchantaccount/ -->
@@ -134,8 +134,8 @@
                 A payment gateway from Atos Worldline to accept online payments via credit cards.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
             </ul>
         </field>
         <!-- http://sips.worldline.com/en-us/home/features/payment-types-and-acquirers.html -->
@@ -161,8 +161,8 @@
                 PayPal is the easiest way to accept payments via Paypal or credit cards.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
             </ul>
         </field>
         <!-- https://www.paypal.com/us/selfhelp/article/Which-credit-cards-can-I-accept-with-PayPal-Merchant-Services-FAQ1525#business -->
@@ -186,10 +186,10 @@
                 A payment gateway to accept online payments via credit cards.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
-                <li><i class="fa fa-check"/>Subscriptions</li>
-                <li><i class="fa fa-check"/>Save Cards</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
+                <li><span class="fa fa-check">Subscriptions</span></li>
+                <li><span class="fa fa-check">Save Cards</span></li>
             </ul>
         </field>
         <!--
@@ -215,7 +215,7 @@
                 A generic payment acquirer to send payment instructions to any payment acquirer.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
             </ul>
         </field>
     </record>
@@ -230,8 +230,8 @@
                 PayU India is an online payments solutions company serving the Indian market.
             </p>
             <ul class="list-inline">
-                <li><i class="fa fa-check"/>Online Payment</li>
-                <li><i class="fa fa-check"/>Payment Status Tracking</li>
+                <li><span class="fa fa-check">Online Payment</span></li>
+                <li><span class="fa fa-check">Payment Status Tracking</span></li>
             </ul>
         </field>
         <!-- https://www.payumoney.com/selfcare.html?userType=seller
diff --git a/addons/payment/static/src/js/payment_form.js b/addons/payment/static/src/js/payment_form.js
index f28a4747a8e4..0100afeb26c5 100644
--- a/addons/payment/static/src/js/payment_form.js
+++ b/addons/payment/static/src/js/payment_form.js
@@ -71,12 +71,12 @@ odoo.define('payment.payment_form', function (require) {
                         $(element).trigger("focusout");
                         if (element.dataset.isRequired && element.value.length === 0) {
                                 $(element).closest('div.form-group').addClass('has-error');
-                                $(element).closest('div.form-group').append('<div style="color: red" class="o_invalid_field">' + _.str.escapeHTML("The value is invalid.") + '</div>');
+                                $(element).closest('div.form-group').append('<div style="color: red" class="o_invalid_field" aria-invalid="true">' + _.str.escapeHTML("The value is invalid.") + '</div>');
                                 wrong_input = true;
                         }
                         else if ($(element).closest('div.form-group').hasClass('has-error')) {
                             wrong_input = true;
-                            $(element).closest('div.form-group').append('<div style="color: red" class="o_invalid_field">' + _.str.escapeHTML("The value is invalid.") + '</div>');
+                            $(element).closest('div.form-group').append('<div style="color: red" class="o_invalid_field" aria-invalid="true">' + _.str.escapeHTML("The value is invalid.") + '</div>');
                         }
                     });
 
@@ -234,13 +234,13 @@ odoo.define('payment.payment_form', function (require) {
                     $(element).trigger("focusout");
                     if (element.dataset.isRequired && element.value.length === 0) {
                             $(element).closest('div.form-group').addClass('has-error');
-                            var message = '<div style="color: red" class="o_invalid_field">' + _.str.escapeHTML("The value is invalid.") + '</div>';
+                            var message = '<div style="color: red" class="o_invalid_field" aria-invalid="true">' + _.str.escapeHTML("The value is invalid.") + '</div>';
                             $(element).closest('div.form-group').append(message);
                             wrong_input = true;
                     }
                     else if ($(element).closest('div.form-group').hasClass('has-error')) {
                         wrong_input = true;
-                        var message = '<div style="color: red" class="o_invalid_field">' + _.str.escapeHTML("The value is invalid.") + '</div>';
+                        var message = '<div style="color: red" class="o_invalid_field" aria-invalid="true">' + _.str.escapeHTML("The value is invalid.") + '</div>';
                         $(element).closest('div.form-group').append(message);
                     }
                 });
diff --git a/addons/payment/views/payment_portal_templates.xml b/addons/payment/views/payment_portal_templates.xml
index 1cb4873d5247..440f059e92eb 100644
--- a/addons/payment/views/payment_portal_templates.xml
+++ b/addons/payment/views/payment_portal_templates.xml
@@ -9,7 +9,7 @@
                   <div class="row">
                         <div class="col-sm-6">
                             <ol class="breadcrumb mt8">
-                                <li><a href="/my/home"><i class="fa fa-home"/></a></li>
+                                <li><a href="/my/home"><i class="fa fa-home" role="img" aria-label="Home" title="Home"/></a></li>
                                 <li>Payment Methods</li>
                             </ol>
                         </div>
@@ -46,7 +46,7 @@
             <div class="wrap">
                 <div class="container o_website_payment">
                     <h1>Payment</h1>
-                    <div t-if="error_msg" class="alert alert-danger col-md-7">
+                    <div t-if="error_msg" class="alert alert-danger col-md-7" role="alert">
                         <t t-esc="error_msg"/>
                     </div>
                     <div class="row mt32 mb32">
@@ -58,7 +58,7 @@
                                 <t t-set="prepare_tx_url" t-value="'/website_payment/transaction/v2/' + str(amount) + '/' + str(currency.id) + '/' + reference"/>
                                 <t t-set="form_action" t-value="'/website_payment/token/v2/' + str(amount) + '/' + str(currency.id) + '/' + reference"/>
                             </t>
-                            <div t-if="not (s2s_acquirers or form_acquirers)" class="alert alert-danger">
+                            <div t-if="not (s2s_acquirers or form_acquirers)" class="alert alert-danger" role="alert">
                                 <p>No payment acquirer found.</p>
                                 <p>Please configure a payment acquirer.</p>
                             </div>
@@ -78,7 +78,7 @@
                     <div class="row">
                         <div class="col-md-6">
                             <div class="form-horizontal">
-                                <div t-attf-class="alert alert-#{status}" t-raw="message"/>
+                                <div t-attf-class="alert alert-#{status}" t-raw="message" role="status"/>
                                 <div class="form-group">
                                     <label for="form_partner_name" class="col-sm-3 control-label">From</label>
                                     <div class="col-sm-9">
@@ -98,10 +98,10 @@
                                     </div>
                                 </div>
                                 <div class="col-sm-12">
-                                    <a t-attf-class="btn btn-#{status} pull-right" href="/my/home"><i class="fa fa-arrow-circle-right"/> Back to My Account</a>
+                                    <a role="button" t-attf-class="btn btn-#{status} pull-right" href="/my/home"><span class="fa fa-arrow-circle-right"> Back to My Account</span></a>
                                 </div>
                                 <div class="col-sm-6 col-sm-offset-6 text-muted mt16">
-                                    <span t-field="tx.acquirer_id.image_small" t-att-title="tx.acquirer_id.name" t-options='{"widget": "image", "style":"max-width: 60px; display: inline-block"}'/>
+                                    <span t-field="tx.acquirer_id.image_small" t-att-title="tx.acquirer_id.name" role="img" t-att-aria-label="tx.acquirer_id.name" t-options='{"widget": "image", "style":"max-width: 60px; display: inline-block"}'/>
                                     <span>Processed by <t t-esc="tx.acquirer_id.name"/>.</span>
                                 </div>
                             </div>
@@ -120,23 +120,23 @@
         -->
         <t t-set="thanks_msg" t-value="payment_tx_id.acquirer_id.post_msg"/>
         <t t-set="thanks_msg" t-value="thanks_msg and thanks_msg != '&lt;p&gt;&lt;br&gt;&lt;/p&gt;' and thanks_msg"/>
-        <div t-if="payment_tx_id and payment_tx_id.state == 'pending'" class="alert alert-warning alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+        <div t-if="payment_tx_id and payment_tx_id.state == 'pending'" class="alert alert-warning alert-dismissable" role="status">
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
             <span t-if='payment_tx_id.acquirer_id.pending_msg' t-raw="payment_tx_id.acquirer_id.pending_msg"/>
             <span t-if='thanks_msg' t-raw="thanks_msg"/>
         </div>
-        <div t-if="payment_tx_id and payment_tx_id.state == 'authorized'" class="alert alert-success alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+        <div t-if="payment_tx_id and payment_tx_id.state == 'authorized'" class="alert alert-success alert-dismissable" role="alert">
+            <button type="button" class="close" data-dismiss="alert" title="Dismiss" aria-label="Dismiss">&amp;times;</button>
             Your payment has been authorized.
             <span t-if='thanks_msg' t-raw="thanks_msg"/>
         </div>
         <div t-if="payment_tx_id and payment_tx_id.state == 'done'" class="alert alert-success alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+            <button type="button" class="close" data-dismiss="alert" title="Dismiss" aria-label="Dismiss">&amp;times;</button>
             <span t-if='payment_tx_id.acquirer_id.done_msg' t-raw="payment_tx_id.acquirer_id.done_msg"/>
             <span t-if='thanks_msg' t-raw="thanks_msg"/>
         </div>
         <div t-if="payment_tx_id and payment_tx_id.state == 'cancel'" class="alert alert-danger alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+            <button type="button" class="close" data-dismiss="alert" title="Dismiss" aria-label="Dismiss">&amp;times;</button>
             <span t-if='payment_tx_id.acquirer_id.cancel_msg' t-raw="payment_tx_id.acquirer_id.cancel_msg"/>
         </div>
         <div t-if="payment_tx_id.state_message">
diff --git a/addons/payment/views/payment_templates.xml b/addons/payment/views/payment_templates.xml
index 4fd6ac22ca81..12bdf7736564 100644
--- a/addons/payment/views/payment_templates.xml
+++ b/addons/payment/views/payment_templates.xml
@@ -128,20 +128,20 @@
                             <input t-if="mode == 'payment'" type="radio" name="pm_id" t-att-value="pm.id" t-att-checked="checked_pm_id == pm.id"/>
                             <span class="payment_option_name" t-esc="pm.name"/>
                             <t t-if="pm.verified">
-                                <i class="fa fa-check text-success" title="This payment method is verified by our system."></i>
+                                <i class="fa fa-check text-success" title="This payment method is verified by our system." role="img" aria-label="Ok"></i>
                             </t>
                             <t t-else="">
-                                <i class="fa fa-close text-danger" title="This payment method has not been verified by our system."></i>
+                                <i class="fa fa-close text-danger" title="This payment method has not been verified by our system." role="img" aria-label="Not verified"></i>
                             </t>
                         </label>
                         <button t-if="mode == 'manage'" name="delete_pm" t-att-value="pm.id" class="btn btn-primary btn-xs pull-right">
-                            <i class="fa fa-trash"></i> Delete
+                            <span class="fa fa-trash"> Delete</span>
                         </button>
                     </div>
                 </t>
             </div>
             <div t-if='back_button_txt' class="pull-left">
-                <a t-att-href="back_button_link or '#'" t-att-class="back_button_class or 'btn btn-lg btn-default'">
+                <a role="button" t-att-href="back_button_link or '#'" t-att-class="back_button_class or 'btn btn-lg btn-default'">
                     <i t-if="back_button_icon_class" t-attf-class="fa {{back_button_icon_class}}"/>
                     <t t-esc="back_button_txt"/>
                 </a>
diff --git a/addons/payment/views/payment_views.xml b/addons/payment/views/payment_views.xml
index a3ad281e7853..5c19a13c4fc5 100644
--- a/addons/payment/views/payment_views.xml
+++ b/addons/payment/views/payment_views.xml
@@ -143,7 +143,7 @@
                             <t t-set="installed" t-value="!record.module_id.value || (record.module_id.value &amp;&amp; record.module_state.raw_value === 'installed')"/>
                             <div t-attf-class="oe_kanban_global_click #{installed and record.website_published.raw_value ? 'oe_kanban_color_5' : 'oe_kanban_color_white'}">
                                 <div class="o_kanban_image">
-                                    <img type="open" t-att-src="kanban_image('payment.acquirer', 'image_small', record.id.raw_value)"/>
+                                    <img type="open" t-att-src="kanban_image('payment.acquirer', 'image_small', record.id.raw_value)" alt="Acquirer"/>
                                 </div>
                                 <div class="o_payment_acquirer_desc">
                                     <h3 class="mt4"><t t-esc="record.name.value"/></h3>
diff --git a/addons/payment_stripe/static/src/xml/stripe_templates.xml b/addons/payment_stripe/static/src/xml/stripe_templates.xml
index c5966fe62741..2591f6e53854 100644
--- a/addons/payment_stripe/static/src/xml/stripe_templates.xml
+++ b/addons/payment_stripe/static/src/xml/stripe_templates.xml
@@ -1,19 +1,19 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <templates id="template" xml:space="preserve">
 <t t-name="stripe.error">
-    <div class="modal fade">
+    <div role="dialog" class="modal fade">
         <div class="modal-dialog">
             <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                <header class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                     <h4 class="modal-title">Error</h4>
-                </div>
-                <div class="modal-body">
+                </header>
+                <main class="modal-body">
                     <t t-esc="msg"></t>
-                </div>
-                <div class="modal-footer">
-                    <a href="#" class="btn btn-link btn-xs" data-dismiss="modal">Close</a>
-                </div>
+                </main>
+                <footer class="modal-footer">
+                    <a role="button" href="#" class="btn btn-link btn-xs" data-dismiss="modal">Close</a>
+                </footer>
             </div>
         </div>
     </div>
diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js
index 1b59aa34cbac..c2de94aa33e3 100644
--- a/addons/point_of_sale/static/src/js/screens.js
+++ b/addons/point_of_sale/static/src/js/screens.js
@@ -836,6 +836,16 @@ var ProductListWidget = PosBaseWidget.extend({
             options.click_product_action(product);
         };
 
+        this.keypress_product_handler = function(ev){
+            if (e.which != 13 && e.which != 32) {
+                // Key is not space or enter
+                return;
+            }
+            ev.preventDefault();
+            var product = self.pos.db.get_product_by_id(this.dataset.productId);
+            options.click_product_action(product);
+        };
+
         this.product_list = options.product_list || [];
         this.product_cache = new DomCache();
 
@@ -908,6 +918,7 @@ var ProductListWidget = PosBaseWidget.extend({
         for(var i = 0, len = this.product_list.length; i < len; i++){
             var product_node = this.render_product(this.product_list[i]);
             product_node.addEventListener('click',this.click_product_handler);
+            product_node.addEventListener('keypress',this.keypress_product_handler);
             list_container.appendChild(product_node);
         }
     },
diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml
index 195514ec51be..a63581d43d2e 100644
--- a/addons/point_of_sale/static/src/xml/pos.xml
+++ b/addons/point_of_sale/static/src/xml/pos.xml
@@ -5,7 +5,7 @@
         <div class="pos">
             <div class="pos-topheader">
                 <div class="pos-branding">
-                    <img class="pos-logo" src="/point_of_sale/static/src/img/logo.png" />
+                    <img class="pos-logo" src="/point_of_sale/static/src/img/logo.png" alt="Logo"/>
                     <span class="placeholder-UsernameWidget"></span>
                 </div>
                 <div class="pos-rightheader">
@@ -52,16 +52,16 @@
         <div class="oe_status js_synch">
             <span class='js_msg oe_hidden'>0</span>
             <div class="js_connected oe_icon oe_green">
-                <i class='fa fa-fw fa-wifi'></i>
+                <i class='fa fa-fw fa-wifi' role="img" aria-label="Synchronisation Connected" title="Synchronisation Connected"></i>
             </div>
             <div class="js_connecting oe_icon oe_hidden">
-                <i class='fa fa-fw fa-spin fa-spinner'></i>
+                <i class='fa fa-fw fa-spin fa-spinner' role="img" aria-label="Synchronisation Connecting" title="Synchronisation Connecting"></i>
             </div>
             <div class="js_disconnected oe_icon oe_red oe_hidden">
-                <i class='fa fa-fw fa-wifi'></i>
+                <i class='fa fa-fw fa-wifi' role="img" aria-label="Synchronisation Disconnected" title="Synchronisation Disconnected"></i>
             </div>
             <div class="js_error oe_icon oe_red oe_hidden">
-                <i class='fa fa-fw fa-warning'></i>
+                <i class='fa fa-fw fa-warning' role="img" aria-label="Synchronisation Error" title="Synchronisation Error"></i>
             </div>
         </div>
     </t>
@@ -70,16 +70,16 @@
         <div class="oe_status js_proxy">
             <span class='js_msg oe_orange oe_hidden'></span>
             <div class="js_connected oe_icon oe_green">
-                <i class='fa fa-fw fa-sitemap'></i>
+                <i class='fa fa-fw fa-sitemap' role="img" aria-label="Proxy Connected" title="Proxy Connected"></i>
             </div>
             <div class="js_connecting oe_icon oe_hidden">
-                <i class='fa fa-fw fa-spin fa-spinner'></i>
+                <i class='fa fa-fw fa-spin fa-spinner' role="img" aria-label="Connecting to Proxy" title="Connecting to Proxy"></i>
             </div>
             <div class="js_warning oe_icon oe_orange oe_hidden">
-                <i class='fa fa-fw fa-sitemap'></i>
+                <i class='fa fa-fw fa-sitemap' role="img" aria-label="Proxy Warning" title="Proxy Warning"></i>
             </div>
             <div class="js_disconnected oe_icon oe_red oe_hidden">
-                <i class='fa fa-fw fa-sitemap'></i>
+                <i class='fa fa-fw fa-sitemap' role="img" aria-label="Proxy Disconnected" title="Proxy Disconnected"></i>
             </div>
         </div>
     </t>
@@ -87,7 +87,7 @@
     <t t-name="SaleDetailsButton">
         <div class="oe_status">
             <div class="js_connected oe_icon">
-                <i class='fa fa-fw fa-print'></i>
+                <i class='fa fa-fw fa-print' role="img" aria-label="Print" title="Print"></i>
             </div>
         </div>
     </t>
@@ -96,13 +96,13 @@
         <div class="oe_status">
             <span class="oe_customer_display_text"></span>
             <div class="js_warning oe_icon oe_orange oe_hidden">
-                <i class='fa fa-fw fa-desktop'></i>
+                <i class='fa fa-fw fa-desktop' role="img" aria-label="Client Screen Warning" title="Client Screen Warning"></i>
             </div>
              <div class="js_disconnected oe_icon oe_red">
-                <i class='fa fa-fw fa-desktop'></i>
+                <i class='fa fa-fw fa-desktop' role="img" aria-label="Client Screen Disconnected" title="Client Screen Disconnected"></i>
             </div>
             <div class="js_connected oe_icon oe_green oe_hidden">
-                <i class='fa fa-fw fa-desktop'></i>
+                <i class='fa fa-fw fa-desktop' role="img" aria-label="Client Screen Connected" title="Client Screen Connected"></i>
             </div>
         </div>
     </t>
@@ -125,20 +125,20 @@
 
     <t t-name="SetFiscalPositionButton">
         <div class='control-button'>
-            <i class='fa fa-book' /> <t t-esc='widget.get_current_fiscal_position_name()'/>
+            <i class='fa fa-book' role="img" aria-label="Set fiscal position" title="Set fiscal position"/> <t t-esc='widget.get_current_fiscal_position_name()'/>
         </div>
     </t>
 
     <t t-name="SetPricelistButton">
         <div class='control-button o_pricelist_button'>
-            <i class='fa fa-th-list' /> <t t-esc='widget.get_current_pricelist_name()'/>
+            <i class='fa fa-th-list' role="img" aria-label="Price list" title="Price list"/> <t t-esc='widget.get_current_pricelist_name()'/>
         </div>
     </t>
 
     <t t-name="ActionpadWidget">
         <div class="actionpad">
             <button t-attf-class='button set-customer #{ ( widget.pos.get_client() and widget.pos.get_client().name.length > 10) ? "decentered" : "" }' >
-                <i class='fa fa-user' /> 
+                <i class='fa fa-user' role="img" aria-label="Customer" title="Customer"/>
                 <t t-if="widget.pos.get_client()">
                     <t t-esc="widget.pos.get_client().name" />
                 </t>
@@ -148,7 +148,7 @@
             </button>
             <button class='button pay'>
                 <div class='pay-circle'>
-                    <i class='fa fa-chevron-right' /> 
+                    <i class='fa fa-chevron-right' role="img" aria-label="Pay" title="Pay"/>
                 </div>
                 Payment
             </button>
@@ -176,7 +176,7 @@
             <button class="input-button number-char">0</button>
             <button class="input-button number-char">.</button>
             <button class="input-button numpad-backspace">
-                <img style="pointer-events: none;" src="/point_of_sale/static/src/img/backspace.png" width="24" height="21" />
+                <img style="pointer-events: none;" src="/point_of_sale/static/src/img/backspace.png" width="24" height="21" alt="Backspace"/>
             </button>
         </div>
     </t>
@@ -184,7 +184,7 @@
     <t t-name="CategoryButton">
         <span class='category-button js-category-switch' t-att-data-category-id="category.id" >
             <div class="category-img">
-                <img t-att-src="image_url" />
+                <img t-att-src="image_url" alt="Category"/>
             </div>
             <div class="category-name">
                 <t t-esc="category.name"/>
@@ -204,12 +204,12 @@
             <div class="breadcrumbs">
                 <span class="breadcrumb">
                     <span class=" breadcrumb-button breadcrumb-home js-category-switch">
-                        <i class='fa fa-home'></i>
+                        <i class='fa fa-home' role="img" aria-label="Home" title="Home"></i>
                     </span>
                 </span>
                 <t t-foreach="widget.breadcrumb" t-as="category">
                     <span class="breadcrumb">
-                        <img src="/point_of_sale/static/src/img/bc-arrow-big.png" class="breadcrumb-arrow" />
+                        <img src="/point_of_sale/static/src/img/bc-arrow-big.png" class="breadcrumb-arrow" alt="Slash"/>
                         <span class="breadcrumb-button js-category-switch" t-att-data-category-id="category.id">
                             <t t-esc="category.name"/>
                         </span>
@@ -293,8 +293,7 @@
             <div class="screen-content">
                 <div class="top-content">
                     <span class='button back'>
-                        <i class='fa fa-angle-double-left'></i>
-                        Back
+                        <span class='fa fa-angle-double-left'>Back</span>
                     </span>
                     <h1 class='product-name'><t t-esc="widget.get_product_name()" /></h1>
                 </div>
@@ -309,8 +308,7 @@
                         123.14 €
                     </div>
                     <div class='buy-product'>
-                        Order
-                        <i class='fa fa-angle-double-right'></i>
+                        <span class='fa fa-suffix-angle-double-right'>Order </span>
                     </div>
                 </div>
             </div>
@@ -329,17 +327,17 @@
         <section class='client-details edit'>
             <div class='client-picture'>
                 <t t-if='!partner.id'>
-                    <i class='fa fa-camera'></i>
+                    <i class='fa fa-camera' role="img" aria-label="Picture" title="Picture"></i>
                 </t>
                 <t t-if='partner.id'>
-                    <img t-att-src='widget.partner_icon_url(partner.id)' />
+                    <img t-att-src='widget.partner_icon_url(partner.id)' alt="Partner"/>
                 </t>
                 <input type='file' class='image-uploader'></input>   
             </div>
             <input class='detail client-name' name='name' t-att-value='partner.name' placeholder='Name'></input>
             <div class='edit-buttons'>
-                <div class='button undo'><i class='fa fa-undo' /></div>
-                <div class='button save'><i class='fa fa-floppy-o' /></div>
+                <div class='button undo'><i class='fa fa-undo' role="img" aria-label="Undo" title="Undo"/></div>
+                <div class='button save'><i class='fa fa-floppy-o' role="img" aria-label="Save" title="Save"/></div>
             </div>
             <div class='client-details-box clearfix'>
                 <div class='client-details-left'>
@@ -402,11 +400,11 @@
     <t t-name="ClientDetails">
         <section class='client-details'>
             <div class='client-picture'>
-                <img t-att-src='widget.partner_icon_url(partner.id)' />
+                <img t-att-src='widget.partner_icon_url(partner.id)' alt="Partner logo"/>
             </div>
             <div class='client-name'><t t-esc='partner.name' /></div>
             <div class='edit-buttons'>
-                <div class='button edit'><i class='fa fa-pencil-square' /></div>
+                <div class='button edit'><i class='fa fa-pencil-square' role="img" aria-label="Edit" title="Edit"/></div>
             </div>
             <div class='client-details-box clearfix'>
                 <div class='client-details-left'>
@@ -476,21 +474,19 @@
             <div class="screen-content">
                 <section class="top-content">
                     <span class='button back'>
-                        <i class='fa fa-angle-double-left'></i>
-                        Cancel
+                        <span class='fa fa-angle-double-left'>Cancel</span>
                     </span>
                     <span class='searchbox'>
                         <input placeholder='Search Customers' />
                         <span class='search-clear'></span>
                     </span>
                     <span class='searchbox'></span>
-                    <span class='button new-customer'>
+                    <span class='button new-customer' role="img" aria-label="Add a customer" title="Add a customer">
                         <i class='fa fa-user'></i>
                         <i class='fa fa-plus'></i>
                     </span>
                     <span class='button next oe_hidden highlight'>
-                        Select Customer
-                        <i class='fa fa-angle-double-right'></i>
+                        <span class='fa fa-angle-double-right'>Select Customer</span>
                     </span>
                 </section>
                 <section class="full-content">
@@ -573,7 +569,7 @@
                                 </t>
                                     
                                 <td class='col-name' > <t t-esc='line.name' /> </td>
-                                <td class='delete-button' t-att-data-cid='line.cid'> <i class='fa fa-times-circle' /> </td>
+                                <td class='delete-button' t-att-data-cid='line.cid' aria-label="Delete" title="Delete"> <i class='fa fa-times-circle' /> </td>
                             </tr>
                         </t>
                         <t t-if='!line.selected'>
@@ -586,7 +582,7 @@
                                      </t>
                                 </td>
                                 <td class='col-name'> <t t-esc='line.name' /> </td>
-                                <td class='delete-button' t-att-data-cid='line.cid'> <i class='fa fa-times-circle' /> </td>
+                                <td class='delete-button' t-att-data-cid='line.cid' aria-label="Delete" title="Delete"> <i class='fa fa-times-circle' /> </td>
                             </tr>
                         </t>
                     </t>
@@ -622,7 +618,7 @@
             <button class="input-button number-char" data-action='0'>0</button>
             <button class="input-button number-char" t-att-data-action='widget.decimal_point'><t t-esc='widget.decimal_point'/></button>
             <button class="input-button numpad-backspace" data-action='BACKSPACE' >
-                <img src="/point_of_sale/static/src/img/backspace.png" width="24" height="21" />
+                <img src="/point_of_sale/static/src/img/backspace.png" width="24" height="21" alt="Backspace"/>
             </button>
         </div>
     </t>
@@ -643,13 +639,11 @@
             <div class='screen-content'>
                 <div class='top-content'>
                     <span class='button back'>
-                        <i class='fa fa-angle-double-left'></i>
-                        Back
+                        <i class='fa fa-angle-double-left'>Back</i>
                     </span>
                     <h1>Payment</h1>
                     <span class='button next'>
-                        Validate
-                        <i class='fa fa-angle-double-right'></i>
+                        <i class='fa fa-angle-double-right'>Validate</i>
                     </span>
                 </div>
                 <div class='left-content pc40 touch-scrollable scrollable-y'>
@@ -668,7 +662,7 @@
 
                     <div class='payment-buttons'>
                         <div class='button js_set_customer'>
-                            <i class='fa fa-user' /> 
+                            <i class='fa fa-user' role="img" aria-label="Customer" title="Customer"/> 
                             <span class='js_customer_name'> 
                                 <t t-if="widget.pos.get_client()">
                                     <t t-esc="widget.pos.get_client().name" />
@@ -681,18 +675,18 @@
                         <t t-if='widget.pos.config.module_account_invoicing'>
                             <t t-if='widget.pos.get_order()'>
                                 <div t-attf-class='button js_invoice #{ widget.pos.get_order().is_to_invoice() ? "highlight" : ""} '>
-                                    <i class='fa fa-file-text-o' /> Invoice
+                                    <i class='fa fa-file-text-o'> Invoice</i>
                                 </div>
                             </t>
                         </t>
                         <t t-if='widget.pos.config.tip_product_id'>
                             <div class='button js_tip'>
-                                <i class='fa fa-heart' /> Tip 
+                                <i class='fa fa-heart'> Tip</i>
                             </div>
                         </t>
                         <t t-if='widget.pos.config.iface_cashdrawer'>
                             <div class='button js_cashdrawer'>
-                                <i class='fa fa-archive' /> Open Cashbox
+                                <i class='fa fa-archive'> Open Cashbox</i>
                             </div>
                         </t>
                      </div>
@@ -707,13 +701,12 @@
                 <div class='top-content'>
                     <h1>Change: <span class='change-value'>0.00</span></h1>
                     <span class='button next'>
-                        Next Order
-                        <i class='fa fa-angle-double-right'></i>
+                        <span class='fa fa-suffix-angle-double-right'>Next Order </span>
                     </span>
                 </div>
                 <div class="centered-content touch-scrollable">
                     <div class="button print">
-                        <i class='fa fa-print'></i> Print Receipt
+                        <i class='fa fa-print'> Print Receipt</i>
                     </div>
                     <div class="pos-receipt-container">
                     </div>
@@ -733,7 +726,7 @@
     <t t-name="XmlReceipt">
         <receipt align='center' width='40' value-thousands-separator='' >
             <t t-if='receipt.company.logo'>
-                <img t-att-src='receipt.company.logo' />
+                <img t-att-src='receipt.company.logo' alt="Logo"/>
                 <br/>
             </t>
             <t t-if='!receipt.company.logo'>
@@ -898,7 +891,7 @@
     <t t-name="SaleDetailsReport">
         <receipt align='center' width='40' value-thousands-separator='' >
             <t t-if='pos.company_logo_base64'>
-                <img t-att-src='pos.company_logo_base64' />
+                <img t-att-src='pos.company_logo_base64' alt="Logo"/>
                 <br/>
             </t>
             <t t-if='!pos.company_logo_base64'>
@@ -980,7 +973,7 @@
 
 
     <t t-name="PopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-alert">
                 <p class="title"><t t-esc=" widget.options.title || 'Alert' " /></p>
                 <p class="body"><t t-esc=" widget.options.body || '' "/></p>
@@ -994,7 +987,7 @@
     </t>
 
     <t t-name="ErrorPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-error">
                 <p class="title"><t t-esc=" widget.options.title || 'Error' " /></p>
                 <p class="body"><t t-esc=" widget.options.body || '' "/></p>
@@ -1008,69 +1001,69 @@
     </t>
 
     <t t-name="ErrorTracebackPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-error">
-                <p class="title"><t t-esc=" widget.options.title || 'Error' " /></p>
-                <p class="body traceback"><t t-esc=" widget.options.body || '' "/></p>
-                <div class="footer">
+                <header class="title"><t t-esc=" widget.options.title || 'Error' " /></header>
+                <main class="body traceback"><t t-esc=" widget.options.body || '' "/></main>
+                <footer class="footer">
                     <div class="button cancel">
                         Ok
                     </div>
                     <a><div class="button icon download_error_file oe_hidden">
-                        <i class="fa fa-arrow-down"></i>
+                        <i class="fa fa-arrow-down" role="img" aria-label="Download error" title="Download error"></i>
                     </div></a>
                     <div class="button icon download">
-                        <i class="fa fa-download"></i>
+                        <i class="fa fa-download" role="img" aria-label="Download" title="Download"></i>
                     </div>
                     <div class="button icon email">
-                        <i class="fa fa-paper-plane"></i>
+                        <i class="fa fa-paper-plane" role="img" aria-label="Send by email" title="Send by email"></i>
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="ErrorBarcodePopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-barcode">
-                <p class="title">Unknown Barcode
+                <header class="title">Unknown Barcode
                     <br />
                     <span class='barcode'><t t-esc="widget.options.barcode" /></span>
-                </p>
-                <p class="body">
+                </header>
+                <main class="body">
                     The Point of Sale could not find any product, client, employee
                     or action associated with the scanned barcode.
-                </p>
-                <div class="footer">
+                </main>
+                <footer class="footer">
                     <div class="button cancel">
                         Ok
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="ConfirmPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-confirm">
-                <p class="title"><t t-esc=" widget.options.title || 'Confirm ?' " /></p>
-                <p class="body"><t t-esc="  widget.options.body || '' "/></p>
-                <div class="footer">
+                <header class="title"><t t-esc=" widget.options.title || 'Confirm ?' " /></header>
+                <main class="body"><t t-esc="  widget.options.body || '' "/></main>
+                <footer class="footer">
                     <div class="button confirm">
                         Confirm 
                     </div>
                     <div class="button cancel">
                         Cancel 
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="TextInputPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-textinput">
-                <p class="title"><t t-esc=" widget.options.title || '' " /></p>
+                <header class="title"><t t-esc=" widget.options.title || '' " /></header>
                 <input type='text' t-att-value="widget.options.value || ''"></input>
                 <div class="footer">
                     <div class="button confirm">
@@ -1085,10 +1078,10 @@
     </t>
 
     <t t-name="PackLotLinePopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-text">
-                <p class="title"><t t-esc=" widget.options.title || '' " /></p>
-                <div class='packlot-lines'>
+                <header class="title"><t t-esc=" widget.options.title || '' " /></header>
+                <main class='packlot-lines'>
                     <t t-if="widget.options.pack_lot_lines">
                         <t t-set="focus_lot_line" t-value="widget.focus_model || widget.options.pack_lot_lines.get_empty_model()"/>
                         <t t-foreach='widget.options.pack_lot_lines.models' t-as='lot_line'>
@@ -1097,43 +1090,43 @@
                                 t-att-autofocus="lot_line === focus_lot_line ? 'autofocus': undefined"
                                 class="popup-input packlot-line-input"
                                 placeholder="Serial/Lot Number"/>
-                            <i class="oe_link_icon remove-lot fa fa-trash-o"></i>
+                            <i class="oe_link_icon remove-lot fa fa-trash-o" role="img" aria-label="Remove" title="Remove"></i>
                         </t>
                     </t>
-                </div>
-                <div class="footer">
+                </main>
+                <footer class="footer">
                     <div class="button confirm">
                         Ok
                     </div>
                     <div class="button cancel">
                         Cancel
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="TextAreaPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-textinput">
-                <p class="title"><t t-esc=" widget.options.title || '' " /></p>
+                <title class="title"><t t-esc=" widget.options.title || '' " /></title>
                 <textarea rows="10" cols="40"><t t-esc="widget.options.value" /></textarea>
-                <div class="footer">
+                <footer class="footer">
                     <div class="button confirm">
                         Ok 
                     </div>
                     <div class="button cancel">
                         Cancel 
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="SelectionPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-selection">
-                <p class="title"><t t-esc=" widget.options.title || 'Select' " /></p>
+                <header class="title"><t t-esc=" widget.options.title || 'Select' " /></header>
                 <div class='selection scrollable-y touch-scrollable'>
                     <t t-foreach="widget.list || []" t-as="item">
                         <div t-attf-class="selection-item {{ widget.is_selected.call(widget, item.item) ? 'selected' : '' }}" t-att-data-item-index='item_index'>
@@ -1141,19 +1134,19 @@
                         </div>
                     </t>
                 </div>
-                <div class="footer">
+                <footer class="footer">
                     <div class="button cancel">
                         Cancel 
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="NumberPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-number">
-                <p class="title"><t t-esc=" widget.options.title || '' " /></p>
+                <header class="title"><t t-esc=" widget.options.title || '' " /></header>
                 <div class='popup-input value active'>
                     <t t-esc='widget.inputbuffer' />
                 </div>
@@ -1189,26 +1182,26 @@
                     <button class="input-button number-char" data-action='0'>0</button>
                     <button class="input-button number-char dot" t-att-data-action='widget.decimal_separator'><t t-esc='widget.decimal_separator'/></button>
                     <button class="input-button numpad-backspace" data-action='BACKSPACE' >
-                        <img style="pointer-events: none;" src="/point_of_sale/static/src/img/backspace.png" width="24" height="21" />
+                        <img style="pointer-events: none;" src="/point_of_sale/static/src/img/backspace.png" width="24" height="21" alt="Backspace"/>
                     </button>
                     <br />
                 </div>
-                <div class="footer centered">
+                <footer class="footer centered">
                     <div class="button cancel">
                         Cancel 
                     </div>
                     <div class="button confirm">
                         Ok
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="OrderImportPopupWidget">
-        <div class="modal-dialog">
+        <div role="dialog" class="modal-dialog">
             <div class="popup popup-import">
-                <p class="title">Finished Importing Orders</p>
+                <header class="title">Finished Importing Orders</header>
                 <t t-if="widget.options and widget.options.report">
                     <t t-set="report" t-value="widget.options.report" />
                     <t t-set="unpaid_skipped" t-value="(report.unpaid_skipped_existing || 0) + (report.unpaid_skipped_session || 0)" />
@@ -1232,19 +1225,19 @@
                         </t>
                     </ul>
                 </t>
-                <div class="footer">
+                <footer class="footer">
                     <div class="button cancel">
                         Ok
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </t>
 
     <t t-name="Product">
-        <span class='product' t-att-data-product-id="product.id">
+        <article class='product' t-att-data-product-id="product.id" tabindex="0" t-attf-aria-labelledby="article_product_#{product.id}">
             <div class="product-img">
-                <img t-att-src='image_url' /> 
+                <img t-att-src='image_url' alt="Product image"/> 
                 <t t-if="!product.to_weight">
                     <span class="price-tag">
                         <t t-esc="widget.format_currency(product.get_price(pricelist, 1),'Product Price')"/>
@@ -1256,10 +1249,10 @@
                     </span>
                 </t>
             </div>
-            <div class="product-name">
+            <div class="product-name" t-attf-id="article_product_#{product.id}">
                 <t t-esc="product.display_name"/>
             </div>
-        </span>
+        </article>
     </t>
 
     <t t-name="Orderline">
@@ -1267,7 +1260,10 @@
             <span class="product-name">
                 <t t-esc="line.get_product().display_name"/>
                 <t t-if="line.get_product().tracking!=='none'">
-                    <i t-attf-class="oe_link_icon fa fa-list oe_icon line-lot-icon #{line.has_valid_product_lot() ? 'oe_green' : 'oe_red' }"/>
+                    <i class="oe_link_icon fa fa-list oe_icon line-lot-icon oe_green" t-if="line.has_valid_product_lot()"
+                       aria-label="Valid product lot" role="img" title="Valid product lot"/>
+                    <i class="oe_link_icon fa fa-list oe_icon line-lot-icon oe_red" t-if="not(line.has_valid_product_lot())"
+                       aria-label="Invalid product lot" role="img" title="Invalid product lot"/>
                 </t>
             </span>
             <span class="price">
@@ -1305,7 +1301,7 @@
                 <div class="order">
                     <t t-if="orderlines.length === 0" >
                         <div class='order-empty'>
-                            <i class='fa fa-shopping-cart' />
+                            <i class='fa fa-shopping-cart' role="img" aria-label="Shopping cart" title="Shopping cart"/>
                             <h1>Your shopping cart is empty</h1>
                         </div>
                     </t>
@@ -1330,7 +1326,7 @@
     <t t-name="DebugWidget">
         <div class="debug-widget oe_hidden">
             <h1>Debug Window</h1>
-            <div class="toggle"><i class='fa fa-times' /></div>
+            <div class="toggle" title="Dismiss" role="img" aria-label="Dismiss"><i class='fa fa-times' /></div>
             <div class="content">
                 <p class="category">Electronic Scale</p>
                 <ul>
@@ -1387,7 +1383,7 @@
                 t-attf-pattern="[0-9]+([\\#{widget.decimal_point || '.' }][0-9]+)?"
                 step="0.01" t-att-value="line.get_amount_str()" />
             <span  class='paymentline-delete'>
-                <img src="/point_of_sale/static/src/img/search_reset.gif" />
+                <img src="/point_of_sale/static/src/img/search_reset.gif" alt="Delete"/>
             </span>
         </div>
     </t>
@@ -1399,7 +1395,7 @@
             </td>
             <td class="paymentline-amount pos-right-align">
                 <input type="number" step="0.01" t-att-value="line.get_amount_str()" />
-                <span class='delete-payment-line'><img src="/point_of_sale/static/src/img/search_reset.gif" /></span>
+                <span class='delete-payment-line'><img src="/point_of_sale/static/src/img/search_reset.gif" alt="Delete"/></span>
             </td>
         </tr>
     </t>
@@ -1427,10 +1423,10 @@
                 </t>
             </span>
             <span class="order-button square neworder-button">
-                <i class='fa fa-plus' />
+                <i class='fa fa-plus' role="img" aria-label="New order" title="New order"/>
             </span>
             <span class="order-button square deleteorder-button">
-                <i class='fa fa-minus' />
+                <i class='fa fa-minus' role="img" aria-label="Delete order" title="Delete order"/>
             </span>
         </div>
     </t>
diff --git a/addons/point_of_sale/views/point_of_sale_dashboard.xml b/addons/point_of_sale/views/point_of_sale_dashboard.xml
index 87460fcfc289..b87f14b3b12a 100644
--- a/addons/point_of_sale/views/point_of_sale_dashboard.xml
+++ b/addons/point_of_sale/views/point_of_sale_dashboard.xml
@@ -82,7 +82,7 @@
                                     <div class="o_secondary mt16"><t t-esc="record.pos_session_username.value || unused_message"/></div>
                                 </div>
                                 <div class="o_kanban_manage_button_section">
-                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                 </div>
                             </div>
                             <div class="container o_kanban_card_content">
@@ -118,31 +118,31 @@
                                         </div>
                                     </div>
                                 </div>
-                            </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                            </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                 <div class="row">
                                     <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view">
-                                        <div class="o_kanban_card_manage_title">
+                                        <div role="menuitem" class="o_kanban_card_manage_title">
                                             <span>View</span>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(action_pos_session_filtered)d" type="action">Sessions</a>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(action_pos_order_filtered)d" type="action">Sales Orders</a>
                                         </div>
                                     </div>
                                     <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_new">
-                                        <div class="o_kanban_card_manage_title">
+                                        <div role="menuitem" class="o_kanban_card_manage_title">
                                             <span>Reporting</span>
                                         </div>
-                                        <div>
+                                        <div role="menuitem">
                                             <a name="%(action_report_pos_order_all_filtered)d" type="action">Orders</a>
                                         </div>
                                     </div>
                                 </div>
 
                                 <div t-if="widget.editable" class="o_kanban_card_manage_settings row" groups="point_of_sale.group_pos_manager">
-                                    <div class="col-xs-12">
+                                    <div role="menuitem" class="col-xs-12">
                                         <a type="edit">Settings</a>
                                     </div>
                                 </div>
diff --git a/addons/point_of_sale/views/pos_category_view.xml b/addons/point_of_sale/views/pos_category_view.xml
index 87307940351e..a83d1a40f059 100644
--- a/addons/point_of_sale/views/pos_category_view.xml
+++ b/addons/point_of_sale/views/pos_category_view.xml
@@ -43,7 +43,7 @@
                         <div t-attf-class="oe_kanban_global_click">
                             <div class="row">
                                 <div class="col-xs-4">
-                                    <img height="100" width="100" t-att-src="kanban_image('pos.category', 'image_medium', record.id.raw_value)"/>
+                                    <img height="100" width="100" t-att-src="kanban_image('pos.category', 'image_medium', record.id.raw_value)" alt="Category"/>
                                 </div>
                                 <div class="col-xs-8">
                                     <strong class="o_kanban_record_title"><field name="name"/></strong>
diff --git a/addons/point_of_sale/views/pos_config_view.xml b/addons/point_of_sale/views/pos_config_view.xml
index 3deb441ce917..66ae56dbe112 100644
--- a/addons/point_of_sale/views/pos_config_view.xml
+++ b/addons/point_of_sale/views/pos_config_view.xml
@@ -283,7 +283,7 @@
                     <div class="row mt16 o_settings_container">
                         <div class="col-xs-12 col-md-6 o_setting_box" id="payment_methods">
                             <div class="o_setting_right_pane">
-                                <label string="Payment Methods"/>
+                                <span class="o_form_label">Payment Methods</span>
                                 <div class="text-muted">
                                     Payment methods available
                                 </div>
@@ -331,7 +331,7 @@
                     <div class="row mt16 o_settings_container" id="receipt">
                         <div id="order_reference" class="col-xs-12 col-md-6 o_setting_box" groups="base.group_no_one">
                             <div class="o_setting_right_pane">
-                                <label string="Order Reference"/>
+                                <span class="o_form_label">Order Reference</span>
                                 <div class="text-muted">
                                     Generation of your order references
                                 </div>
@@ -440,7 +440,7 @@
                     <div class="row mt16 o_settings_container">
                         <div class="col-xs-12 col-md-6 o_setting_box">
                             <div class="o_setting_right_pane">
-                                <label string="Journal Entries"/>
+                                <span class="o_form_label">Journal Entries</span>
                                 <div class="text-muted">
                                     Configuration for journal entries of PoS orders
                                 </div>
diff --git a/addons/point_of_sale/views/pos_order_view.xml b/addons/point_of_sale/views/pos_order_view.xml
index e1388c947d2d..906d88445078 100644
--- a/addons/point_of_sale/views/pos_order_view.xml
+++ b/addons/point_of_sale/views/pos_order_view.xml
@@ -122,7 +122,7 @@
                                 <div class="o_kanban_record_headings">
                                     <strong class="o_kanban_record_title"><span><t t-esc="record.user_id.value"/></span></strong>
                                 </div>
-                                <strong><span class="badge"><i class="fa fa-money"/> <field name="amount_total"/></span></strong>
+                                <strong><span class="badge"><i class="fa fa-money" role="img" aria-label="Amount" title="Amount"/> <field name="amount_total"/></span></strong>
                             </div>
                             <div class="row">
                                 <div class="col-xs-12">
diff --git a/addons/point_of_sale/views/pos_session_view.xml b/addons/point_of_sale/views/pos_session_view.xml
index 5c2c961c7a15..e901a693e5ca 100644
--- a/addons/point_of_sale/views/pos_session_view.xml
+++ b/addons/point_of_sale/views/pos_session_view.xml
@@ -172,7 +172,7 @@
                                     <span><field name="start_at" /></span>
                                 </div>
                                 <div class="oe_kanban_bottom_right">
-                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                 </div>
                             </div>
                         </div>
diff --git a/addons/point_of_sale/views/pos_templates.xml b/addons/point_of_sale/views/pos_templates.xml
index 57895f2637b3..953fab6db6b5 100644
--- a/addons/point_of_sale/views/pos_templates.xml
+++ b/addons/point_of_sale/views/pos_templates.xml
@@ -117,7 +117,7 @@
             <li data-choose-image="true" data-no-preview="true"><a href="#"><b>Set Custom Image...</b></a></li>
             <li class="hidden pos-use_default_logo" data-background=""><a href="#">Default company logo</a></li>
             <li class="divider"/>
-            <li data-toggle-class="pos-hidden"><a href="#"><i class="fa fa-eye-slash"/>Hide</a></li>
+            <li data-toggle-class="pos-hidden"><a href="#"><i class="fa fa-eye-slash">Hide</i></a></li>
         </div>
     </div>
 </template>
diff --git a/addons/point_of_sale/views/report_userlabel.xml b/addons/point_of_sale/views/report_userlabel.xml
index 104d6d8a5b41..911606e11c1c 100644
--- a/addons/point_of_sale/views/report_userlabel.xml
+++ b/addons/point_of_sale/views/report_userlabel.xml
@@ -14,7 +14,7 @@
                         </thead>
                         <tbody>
                             <tr>
-                                <td><img t-if="user.barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN13', user.barcode, 300, 50)" style="width:100%;height:35%;"/></td>
+                                <td><img t-if="user.barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN13', user.barcode, 300, 50)" style="width:100%;height:35%;" alt="Barcode"/></td>
                                 <td><strong t-field="user.name"/></td>
                             </tr>
                         </tbody>
diff --git a/addons/point_of_sale/views/res_config_settings_views.xml b/addons/point_of_sale/views/res_config_settings_views.xml
index 78620638c294..74a9c769b3bb 100644
--- a/addons/point_of_sale/views/res_config_settings_views.xml
+++ b/addons/point_of_sale/views/res_config_settings_views.xml
@@ -13,7 +13,7 @@
                         <div class="col-xs-12 col-md-6 o_setting_box" title="This tax is applied to any new product created in the catalog.">
                             <div class="o_setting_right_pane">
                                 <div>
-                                    <label string="Default Sales Tax"/>
+                                    <label string="Default Sales Tax" for="sale_tax_id"/>
                                     <div class="text-muted">
                                         Default sales tax for products
                                     </div>
diff --git a/addons/point_of_sale/views/res_partner_view.xml b/addons/point_of_sale/views/res_partner_view.xml
index 5a532aec6e5b..aca19bd1f10e 100644
--- a/addons/point_of_sale/views/res_partner_view.xml
+++ b/addons/point_of_sale/views/res_partner_view.xml
@@ -26,7 +26,7 @@
                     <field name="pos_order_count"/>
                 </field>
                 <xpath expr="//div[hasclass('oe_kanban_partner_links')]" position="inside">
-                    <span t-if="record.pos_order_count.value>0" class="badge"><i class="fa fa-fw fa-shopping-bag"/><t t-esc="record.pos_order_count.value"/></span>
+                    <span t-if="record.pos_order_count.value>0" class="badge"><i class="fa fa-fw fa-shopping-bag" role="img" aria-label="Shopping cart" title="Shopping cart"/><t t-esc="record.pos_order_count.value"/></span>
                 </xpath>
             </field>
         </record>
diff --git a/addons/point_of_sale/wizard/pos_open_statement.xml b/addons/point_of_sale/wizard/pos_open_statement.xml
index 9ae3d8450a48..264b4d6cb35a 100644
--- a/addons/point_of_sale/wizard/pos_open_statement.xml
+++ b/addons/point_of_sale/wizard/pos_open_statement.xml
@@ -6,7 +6,7 @@
             <field name="arch" type="xml">
                 <form string="Open Statements">
                     <separator string="Do you want to open cash registers?"/>
-                    <label string="The system will open all cash registers, so that you can start recording payments. We suggest you to control the opening balance of each register, using their CashBox tab."/>
+                    <span class="o_form_label">The system will open all cash registers, so that you can start recording payments. We suggest you to control the opening balance of each register, using their CashBox tab.</span>
                     <footer>
                         <button name="open_statement" type="object" string="Open Registers" class="btn-primary"/>
                         <button string="Cancel" class="btn-default" special="cancel"/>
diff --git a/addons/portal/static/src/xml/portal_chatter.xml b/addons/portal/static/src/xml/portal_chatter.xml
index 7ff4c1acfd2f..cebc9384bf48 100644
--- a/addons/portal/static/src/xml/portal_chatter.xml
+++ b/addons/portal/static/src/xml/portal_chatter.xml
@@ -24,7 +24,7 @@
             <t t-if="widget.options['display_composer']">
                 <div class="media">
                     <div class="media-left">
-                        <img class="o_portal_chatter_avatar pull-left" t-attf-src="/web/image/res.partner/#{widget.options['partner_id']}/image_small/50x50"/>
+                        <img alt="Avatar" class="o_portal_chatter_avatar pull-left" t-attf-src="/web/image/res.partner/#{widget.options['partner_id']}/image_small/50x50"/>
                     </div>
                     <div class="media-body">
                         <form class="o_portal_chatter_composer_form" t-attf-action="/mail/chatter_post" method="POST">
@@ -36,7 +36,7 @@
                                 <input type='hidden' name="token" t-att-value="widget.options['token']" t-if="widget.options['token']"/>
                                 <input type='hidden' name="sha_in" t-att-value="widget.options['sha_in']" t-if="widget.options['sha_in']"/>
                                 <input type='hidden' name="sha_time" t-att-value="widget.options['sha_time']" t-if="widget.options['sha_time']"/>
-                                <div class="alert alert-danger mt8 mb0 o_portal_chatter_composer_error" style="display:none;">
+                                <div class="alert alert-danger mt8 mb0 o_portal_chatter_composer_error" style="display:none;" role="alert">
                                     Oops! Something went wrong. Try to reload the page and log in.
                                 </div>
                                 <button t-attf-class="o_portal_chatter_composer_btn btn btn-primary mt8 o_website_message_post_helper" type="submit">Send</button>
@@ -85,7 +85,7 @@
             <t t-if="!_.isEmpty(widget.get('pager'))">
                 <ul class="pagination" t-if="widget.get('pager')['pages'].length &gt; 1">
                     <li t-if="widget.get('pager')['page'] != widget.get('pager')['page_previous']" t-att-data-page="widget.get('pager')['page_previous']" class="o_portal_chatter_pager_btn">
-                        <a href="#"><i class="fa fa-chevron-left"/></a>
+                        <a href="#"><i class="fa fa-chevron-left" role="img" aria-label="Previous" title="Previous"/></a>
                     </li>
                     <t t-foreach="widget.get('pager')['pages']" t-as="page">
                         <li t-att-data-page="page" t-att-class="page == widget.get('pager')['page'] ? 'o_portal_chatter_pager_btn active' : 'o_portal_chatter_pager_btn'">
@@ -93,7 +93,7 @@
                         </li>
                     </t>
                     <li t-if="widget.get('pager')['page'] != widget.get('pager')['page_next']" t-att-data-page="widget.get('pager')['page_next']" class="o_portal_chatter_pager_btn">
-                        <a href="#"><i class="fa fa-chevron-right"/></a>
+                        <a href="#"><i class="fa fa-chevron-right" role="img" aria-label="Next" title="Next"/></a>
                     </li>
                 </ul>
             </t>
diff --git a/addons/portal/static/src/xml/portal_signature.xml b/addons/portal/static/src/xml/portal_signature.xml
index 3ef5c8f1ea09..50a834949121 100644
--- a/addons/portal/static/src/xml/portal_signature.xml
+++ b/addons/portal/static/src/xml/portal_signature.xml
@@ -9,7 +9,7 @@
             <div class="panel panel-default mt16 mb0" id="o_portal_sign_draw">
                 <div class="panel-heading">
                     <div class="pull-right">
-                        <a id="o_portal_sign_clear" class="btn btn-xs">Clear</a>
+                        <a role="button" id="o_portal_sign_clear" class="btn btn-xs">Clear</a>
                     </div>
                     <strong>Draw your signature</strong>
                 </div>
@@ -21,7 +21,7 @@
         </form>
     </t>
     <t t-name="portal.portal_signature_success">
-        <div class="alert alert-success" role="alert">
+        <div class="alert alert-success" role="status">
             <strong>Thank You !</strong><br />
             <span t-esc="widget.success"/>
             <a t-att-href="widget.redirect_url">Click here to see your document.</a>
diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml
index b9d3c4b0707d..56cb88203f90 100644
--- a/addons/portal/views/portal_templates.xml
+++ b/addons/portal/views/portal_templates.xml
@@ -74,7 +74,7 @@
                     <div t-if="not no_breadcrumbs" class="row">
                         <div t-attf-class="col-sm-12">
                             <ol t-if="page_name != 'home'" class="breadcrumb o_portal_submenu">
-                                <li><a href="/my/home"><i class="fa fa-home"/></a></li>
+                                <li><a href="/my/home" aria-label="Home" title="Home"><i class="fa fa-home"/></a></li>
                                 <li t-if="page_name == 'my_details'">Your Details</li>
                             </ol>
                             <t t-call='portal.record_pager'/>
@@ -94,7 +94,7 @@
                                     <t t-call="portal.portal_contact"/>
                                 </div>
                                 <div class="o_portal_my_details">
-                                    <h3 class="page-header">Your Details <a href="/my/account" class="btn btn-default btn-xs">Change</a></h3>
+                                    <h3 class="page-header">Your Details <a role="button" href="/my/account" class="btn btn-default btn-xs">Change</a></h3>
                                     <div t-field="user_id.partner_id" t-options='{"widget": "contact", "fields": ["email", "phone", "address", "name"]}'/>
                                 </div>
                                 <div class="o_my_archives" t-if="archive_groups">
@@ -276,7 +276,7 @@
                     <div class="col-md-8">
                         <div class="row">
                             <div class="col-md-12">
-                              <div t-if="error_message" class="alert alert-danger">
+                              <div t-if="error_message" class="alert alert-danger" role="alert">
                                   <t t-foreach="error_message" t-as="err"><t t-esc="err"/><br /></t>
                               </div>
                             </div>
@@ -343,8 +343,7 @@
                         </div>
                         <div class="clearfix">
                             <button type="submit" class="btn btn-primary pull-right mb32 ">
-                                Confirm
-                                <span class="fa fa-long-arrow-right" />
+                                <span class="fa fa-long-arrow-right">Confirm</span>
                             </button>
                         </div>
                     </div>
@@ -356,8 +355,8 @@
     <template id="record_pager" name="Portal Record Pager">
         <t t-if='prev_record or next_record'>
           <div class="ml8 record_pager btn-group btn-group-xs pull-right" role="group">
-            <a t-att-class="'btn btn-default %s' % ('disabled' if not prev_record else '')" t-att-href="prev_record or '#'" ><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
-            <a t-att-class="'btn btn-default %s' % ('disabled' if not next_record else '')" t-att-href="next_record or '#'" ><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
+            <a role="button" t-att-class="'btn btn-default %s' % ('disabled' if not prev_record else '')" t-att-href="prev_record or '#'" ><i class="fa fa-arrow-left" role="img" aria-label="Previous" title="Previous"></i></a>
+            <a role="button" t-att-class="'btn btn-default %s' % ('disabled' if not next_record else '')" t-att-href="next_record or '#'" ><i class="fa fa-arrow-right" role="img" aria-label="Next" title="Previous"></i></a>
           </div>
         </t>
     </template>
diff --git a/addons/pos_discount/static/src/xml/discount_templates.xml b/addons/pos_discount/static/src/xml/discount_templates.xml
index 65a38afb97d1..8287f54f5a9c 100644
--- a/addons/pos_discount/static/src/xml/discount_templates.xml
+++ b/addons/pos_discount/static/src/xml/discount_templates.xml
@@ -3,7 +3,7 @@
 
     <t t-name="DiscountButton">
         <div class='control-button js_discount'>
-            <i class='fa fa-tag' /> Discount
+            <i class='fa fa-tag'> Discount</i>
         </div>
     </t>
 
diff --git a/addons/pos_mercury/static/src/xml/pos_mercury.xml b/addons/pos_mercury/static/src/xml/pos_mercury.xml
index acf830e25430..5ec3587efae1 100644
--- a/addons/pos_mercury/static/src/xml/pos_mercury.xml
+++ b/addons/pos_mercury/static/src/xml/pos_mercury.xml
@@ -2,7 +2,7 @@
 
 <templates id="template" inherit_id="point_of_sale.template">
   <t t-name="PaymentTransactionPopupWidget">
-    <div class="modal-dialog">
+    <div role="dialog" class="modal-dialog">
       <div class="popup">
         <p class="title">Electronic Payment</p>
         <p class="body"></p>
diff --git a/addons/pos_mercury/views/pos_config_setting_views.xml b/addons/pos_mercury/views/pos_config_setting_views.xml
index 99f0f9d786f6..83b850636d83 100644
--- a/addons/pos_mercury/views/pos_config_setting_views.xml
+++ b/addons/pos_mercury/views/pos_config_setting_views.xml
@@ -10,7 +10,7 @@
                     <button name="%(pos_mercury.action_configuration_form)d" icon="fa-arrow-right" type="action" string="Vantiv Accounts" class="btn-link"/>
                 </div>
                 <div>
-                    <a href="https://www.odoo.com/page/point-of-sale-hardware#part_8" target="_blank"><i class="fa fa-fw fa-arrow-right"/>Buy a card reader</a>
+                    <a href="https://www.odoo.com/page/point-of-sale-hardware#part_8" target="_blank"><span class="fa fa-fw fa-arrow-right">Buy a card reader</span></a>
                 </div>
             </div>
         </field>
diff --git a/addons/pos_reprint/static/src/xml/reprint.xml b/addons/pos_reprint/static/src/xml/reprint.xml
index fa782fbd2f70..8183db3e353f 100644
--- a/addons/pos_reprint/static/src/xml/reprint.xml
+++ b/addons/pos_reprint/static/src/xml/reprint.xml
@@ -3,14 +3,13 @@
 
     <t t-name="ReprintButton">
         <div class='control-button js_reprint'>
-            <i class="fa fa-retweet"></i> Reprint Receipt
+            <span class="fa fa-retweet"> Reprint Receipt</span>
         </div>
     </t>
 
     <t t-name="ReprintReceiptScreenWidget" t-extend="ReceiptScreenWidget">
         <t t-jquery="div.top-content" t-operation="inner">
-            <span class='button back'>
-                <i class='fa fa-angle-double-left'></i>
+            <span class='button back fa fa-angle-double-left'>
                 Back
             </span>
         </t>
diff --git a/addons/pos_restaurant/static/src/xml/floors.xml b/addons/pos_restaurant/static/src/xml/floors.xml
index 5e6e54d0c158..7606ff776de8 100644
--- a/addons/pos_restaurant/static/src/xml/floors.xml
+++ b/addons/pos_restaurant/static/src/xml/floors.xml
@@ -34,7 +34,7 @@
 
     <t t-name="TransferOrderButton">
         <div class='control-button'>
-            <i class='fa fa-arrow-right' /> Transfer
+            <span class='fa fa-arrow-right' > Transfer</span>
         </div>
     </t>
 
@@ -79,7 +79,7 @@
 
     <t t-name="BackToFloorButton">
         <span class="order-button floor-button">
-            <i class='fa fa-angle-double-left'/>
+            <i class='fa fa-angle-double-left' role="img" aria-label="Back to floor" title="Back to floor"/>
             <t t-esc="floor.name"/>
             <span class='table-name'>
                 ( <t t-esc="table.name" /> )
@@ -104,60 +104,60 @@
                 </t>
                 <div class='floor-map' t-att-style='widget.get_floor_style()' >
                     <div class='empty-floor oe_hidden'>
-                        This floor has no tables yet, use the <i class="fa fa-plus"></i> button in the editing toolbar to create new tables.
+                        This floor has no tables yet, use the <i class="fa fa-plus" role="img" aria-label="Add button" title="Add button"></i> button in the editing toolbar to create new tables.
                     </div>
                     <div class='tables'></div>
-                    <span t-if="widget.pos.user.role == 'manager'" class='edit-button editing'><i class='fa fa-pencil'></i></span>
+                    <span t-if="widget.pos.user.role == 'manager'" class='edit-button editing'><i class='fa fa-pencil' role="img" aria-label="Edit" title="Edit"></i></span>
                     <div class='edit-bar oe_hidden'>
                         <span class='edit-button new-table'>
-                            <i class='fa fa-plus'></i>
+                            <i class='fa fa-plus' role="img" aria-label="Add" title="Add"></i>
                         </span>
                         <span class='edit-button dup-table needs-selection'>
-                            <i class='fa fa-files-o'></i>
+                            <i class='fa fa-files-o' role="img" aria-label="Duplicate" title="Duplicate"></i>
                         </span>
                         <span class='edit-button rename needs-selection'>
-                            <i class='fa fa-font'></i>
+                            <i class='fa fa-font' role="img" aria-label="Rename" title="Rename"></i>
                         </span>
                         <span class='edit-button seats needs-selection'>
-                            <i class='fa fa-user'></i>
+                            <i class='fa fa-user' role="img" aria-label="Seats" title="Seats"></i>
                         </span>
                         <span class='edit-button shape needs-selection'>
-                            <span class='button-option square'><i class='fa fa-square-o'></i></span>
-                            <span class='button-option round oe_hidden'><i class='fa fa-circle-o'></i></span>
+                            <span class='button-option square'><i class='fa fa-square-o' role="img" aria-label="Square Shape" title="Square Shape"></i></span>
+                            <span class='button-option round oe_hidden'><i class='fa fa-circle-o' role="img" aria-label="Round Shape" title="Round Shape"></i></span>
                         </span> 
                         <span class='edit-button color'>
-                            <i class='fa fa-tint'></i>
+                            <i class='fa fa-tint' role="img" aria-label="Tint" title="Tint"></i>
                             <div class='color-picker fg-picker oe_hidden'>
-                                <div  class='close-picker'>
+                                <div  class='close-picker' title="Close" role="img" aria-label="Close">
                                     <i class='fa fa-times' />
                                 </div>
-                                <span class='color tl'  style='background-color:#EB6D6D' />
-                                <span class='color'     style='background-color:#35D374' />
-                                <span class='color tr'  style='background-color:#6C6DEC' />
-                                <span class='color'     style='background-color:#EBBF6D' />
-                                <span class='color'     style='background-color:#EBEC6D' />
-                                <span class='color'     style='background-color:#AC6DAD' />
-                                <span class='color bl'  style='background-color:#6C6D6D' />
-                                <span class='color'     style='background-color:#ACADAD' />
-                                <span class='color br'  style='background-color:#4ED2BE' />
+                                <span class='color tl'  style='background-color:#EB6D6D' role="img" aria-label="Red" title="Red"/>
+                                <span class='color'     style='background-color:#35D374' role="img" aria-label="Green" title="Green"/>
+                                <span class='color tr'  style='background-color:#6C6DEC' role="img" aria-label="Blue" title="Blue"/>
+                                <span class='color'     style='background-color:#EBBF6D' role="img" aria-label="Orange" title="Orange"/>
+                                <span class='color'     style='background-color:#EBEC6D' role="img" aria-label="Yellow" title="Yellow"/>
+                                <span class='color'     style='background-color:#AC6DAD' role="img" aria-label="Purple" title="Purple"/>
+                                <span class='color bl'  style='background-color:#6C6D6D' role="img" aria-label="Grey" title="Grey"/>
+                                <span class='color'     style='background-color:#ACADAD' role="img" aria-label="Light grey" title="Light grey"/>
+                                <span class='color br'  style='background-color:#4ED2BE' role="img" aria-label="Turquoise" title="Turquoise"/>
                             </div>
                             <div class='color-picker bg-picker oe_hidden'>
-                                <div  class='close-picker'>
+                                <div  class='close-picker' title="Close" role="img" aria-label="Close">
                                     <i class='fa fa-times' />
                                 </div>
-                                <span class='color tl'  style='background-color:rgb(244, 149, 149)' />
-                                <span class='color'     style='background-color:rgb(130, 233, 171)' />
-                                <span class='color tr'  style='background-color:rgb(136, 137, 242)' />
-                                <span class='color'     style='background-color:rgb(255, 214, 136)' />
-                                <span class='color'     style='background-color:rgb(254, 255, 154)' />
-                                <span class='color'     style='background-color:rgb(209, 171, 210)' />
-                                <span class='color bl'  style='background-color:rgb(75, 75, 75)'    />
-                                <span class='color'     style='background-color:rgb(210, 210, 210)' />
-                                <span class='color br'  style='background-color:rgb(127, 221, 236)' />
+                                <span class='color tl'  style='background-color:rgb(244, 149, 149)' role="img" aria-label="Red" title="Red"/>
+                                <span class='color'     style='background-color:rgb(130, 233, 171)' role="img" aria-label="Green" title="Green"/>
+                                <span class='color tr'  style='background-color:rgb(136, 137, 242)' role="img" aria-label="Blue" title="Blue"/>
+                                <span class='color'     style='background-color:rgb(255, 214, 136)' role="img" aria-label="Orange" title="Orange"/>
+                                <span class='color'     style='background-color:rgb(254, 255, 154)' role="img" aria-label="Yellow" title="Yellow"/>
+                                <span class='color'     style='background-color:rgb(209, 171, 210)' role="img" aria-label="Purple" title="Purple"/>
+                                <span class='color bl'  style='background-color:rgb(75, 75, 75)'    role="img" aria-label="Grey" title="Grey"/>
+                                <span class='color'     style='background-color:rgb(210, 210, 210)' role="img" aria-label="Light grey" title="Light grey"/>
+                                <span class='color br'  style='background-color:rgb(127, 221, 236)' role="img" aria-label="Turquoise" title="Turquoise"/>
                             </div>
                         </span>
                         <span class='edit-button trash needs-selection'>
-                            <i class='fa fa-trash'></i>
+                            <i class='fa fa-trash' role="img" aria-label="Delete" title="Delete"></i>
                         </span>
                     </div>
                     
diff --git a/addons/pos_restaurant/static/src/xml/multiprint.xml b/addons/pos_restaurant/static/src/xml/multiprint.xml
index 282d07421c2d..8a57465562a0 100644
--- a/addons/pos_restaurant/static/src/xml/multiprint.xml
+++ b/addons/pos_restaurant/static/src/xml/multiprint.xml
@@ -2,8 +2,7 @@
 <templates id="template" xml:space="preserve">
 
     <t t-name="SubmitOrderButton">
-        <span class="control-button order-submit">
-            <i class="fa fa-cutlery"></i>
+        <span class="control-button order-submit fa fa-cutlery">
             Order
         </span>
     </t>
diff --git a/addons/pos_restaurant/static/src/xml/notes.xml b/addons/pos_restaurant/static/src/xml/notes.xml
index 931a91ce0578..2ce586f266ca 100644
--- a/addons/pos_restaurant/static/src/xml/notes.xml
+++ b/addons/pos_restaurant/static/src/xml/notes.xml
@@ -5,7 +5,7 @@
         <t t-jquery=".info-list" t-operation="append">
             <t t-if="line.get_note()">
                 <li class="info orderline-note">
-                    <i class='fa fa-tag'/><t t-esc="line.get_note()" />
+                    <i class='fa fa-tag' role="img" aria-label="Note" title="Note"/><t t-esc="line.get_note()" />
                 </li>
             </t>
         </t>
@@ -13,7 +13,7 @@
 
     <t t-name="OrderlineNoteButton">
         <div class='control-button'>
-            <i class='fa fa-tag' /> Note
+            <span class='fa fa-tag'> Note</span>
         </div>
     </t>
     
diff --git a/addons/pos_restaurant/static/src/xml/printbill.xml b/addons/pos_restaurant/static/src/xml/printbill.xml
index 0c3f5ae75300..31a6e0772d20 100644
--- a/addons/pos_restaurant/static/src/xml/printbill.xml
+++ b/addons/pos_restaurant/static/src/xml/printbill.xml
@@ -6,18 +6,16 @@
             <div class='screen-content'>
                 <div class='top-content'>
                     <span class='button back'>
-                        <i class='fa fa-angle-double-left'></i>
-                        Back
+                        <span class='fa fa-angle-double-left'> Back</span>
                     </span>
                     <h1>Bill Printing</h1>
                     <span class='button next'>
-                        Ok 
-                        <i class='fa fa-angle-double-right'></i>
+                        <span class='fa fa-suffix-angle-double-right'> Ok</span>
                     </span>
                 </div>
                 <div class="centered-content">
                     <div class="button print">
-                        <i class='fa fa-print'></i> Print 
+                        <span class='fa fa-print'> Print</span>
                     </div>
                     <div class="pos-receipt-container">
                     </div>
@@ -28,15 +26,14 @@
 
     <t t-name="PrintBillButton">
         <span class="control-button order-printbill">
-            <i class="fa fa-print"></i>
-            Bill
+            <span class="fa fa-print"> Bill</span>
         </span>
     </t>
 
     <t t-name="BillReceipt">
         <receipt align='center' width='40' value-thousands-separator='' >
             <t t-if='receipt.company.logo'>
-                <img t-att-src='receipt.company.logo' />
+                <img t-att-src='receipt.company.logo' alt="Logo"/>
                 <br/>
             </t>
             <t t-if='!receipt.company.logo'>
diff --git a/addons/pos_restaurant/static/src/xml/splitbill.xml b/addons/pos_restaurant/static/src/xml/splitbill.xml
index afca40714279..8c5d8bc58b85 100644
--- a/addons/pos_restaurant/static/src/xml/splitbill.xml
+++ b/addons/pos_restaurant/static/src/xml/splitbill.xml
@@ -3,8 +3,7 @@
 
     <t t-name="SplitbillButton">
         <span class="control-button order-split">
-            <i class="fa fa-files-o"></i>
-            Split
+            <span class="fa fa-files-o"> Split</span>
         </span>
     </t>
 
@@ -58,8 +57,7 @@
             <div class='screen-content'>
                 <div class='top-content'>
                     <span class='button back'>
-                        <i class='fa fa-angle-double-left'></i>
-                        Back
+                        <span class='fa fa-angle-double-left'> Back</span>
                     </span>
                     <h1>Bill Splitting</h1>
                 </div>
@@ -75,7 +73,7 @@
                     </div>
                     <div class='paymentmethods'>
                         <div class='button payment'>
-                            <i class='fa fa-chevron-right' /> Payment
+                            <span class='fa fa-chevron-right'> Payment</span>
                         </div>
                     </div>
                 </div>
diff --git a/addons/pos_restaurant/views/pos_config_views.xml b/addons/pos_restaurant/views/pos_config_views.xml
index 5eb19f82fcc3..84a266d196a1 100644
--- a/addons/pos_restaurant/views/pos_config_views.xml
+++ b/addons/pos_restaurant/views/pos_config_views.xml
@@ -16,7 +16,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="iface_printbill"/>
-                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants"/>
+                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants" role="img" aria-label="For bars and restaurants"/>
                         <div class="text-muted">
                             Allow to print bill before payment
                         </div>
@@ -30,7 +30,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="iface_splitbill"/>
-                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants"/>
+                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants" role="img" aria-label="For bars and restaurants"/>
                         <div class="text-muted">
                             Split total or order lines
                         </div>
@@ -45,7 +45,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="tip_product_id" string="Tips"/>
-                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants"/>
+                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants" role="img" aria-label="For bars and restaurants"/>
                         <div class="text-muted">
                             Accept customer tips or convert their change to a tip
                         </div>
@@ -67,7 +67,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="is_order_printer"/>
-                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants"/>
+                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants" role="img" aria-label="For bars and restaurants"/>
                         <div class="text-muted">
                             Print orders at the kitchen, at the bar, etc.
                         </div>
@@ -92,7 +92,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="is_table_management"/>
-                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants"/>
+                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants" role="img" aria-label="For bars and restaurants"/>
                         <div class="text-muted">
                             Manage table orders
                         </div>
@@ -115,7 +115,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="iface_orderline_notes"/>
-                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants"/>
+                        <span class="fa fa-lg fa-cutlery" title="For bars and restaurants" role="img" aria-label="For bars and restaurants"/>
                         <div class="text-muted">
                             Add notes to orderlines
                         </div>
diff --git a/addons/product/report/product_product_templates.xml b/addons/product/report/product_product_templates.xml
index 912ef7f74966..2e918ee71e4a 100644
--- a/addons/product/report/product_product_templates.xml
+++ b/addons/product/report/product_product_templates.xml
@@ -17,9 +17,9 @@
             <tbody>
                 <tr style="width: 1in;">
                     <td style="border: 2px solid black;text-align: center; vertical-align: middle;" class="col-xs-5">
-                        <img t-if="product.barcode and len(product.barcode) == 13" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN13', product.barcode, 600, 150)" style="width:100%;height:20%;"/>
-                        <img t-elif="product.barcode and len(product.barcode) == 8" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN8', product.barcode, 600, 150)" style="width:100%;height:20%;"/>
-                        <img t-else="" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', product.barcode, 600, 150)" style="width:100%;height:20%;"/>
+                        <img alt="Barcode" t-if="product.barcode and len(product.barcode) == 13" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN13', product.barcode, 600, 150)" style="width:100%;height:20%;"/>
+                        <img alt="Barcode" t-elif="product.barcode and len(product.barcode) == 8" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN8', product.barcode, 600, 150)" style="width:100%;height:20%;"/>
+                        <img alt="Barcode" t-else="" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', product.barcode, 600, 150)" style="width:100%;height:20%;"/>
                         <span t-field="product.barcode"/>
                     </td>
                     <td style="border: 2px solid black; text-align: center;" class="col-xs-7">
diff --git a/addons/product/views/product_pricelist_views.xml b/addons/product/views/product_pricelist_views.xml
index 22928e638a5f..3e5aa07bc27d 100644
--- a/addons/product/views/product_pricelist_views.xml
+++ b/addons/product/views/product_pricelist_views.xml
@@ -58,7 +58,7 @@
                     <group col="6" attrs="{'invisible':[('compute_price', '!=', 'formula')]}">
                         <field name="base" colspan="6"/>
 
-                        <label string="New Price ="/>
+                        <span class="o_form_label">New Price =</span>
                         <div>
                             <span attrs="{'invisible':[('base', '!=', 'list_price')]}">Public Price  -  </span>
                             <span attrs="{'invisible':[('base', '!=', 'standard_price')]}">Cost  -  </span>
@@ -119,7 +119,7 @@
                                     <div class="o_kanban_record_headings">
                                         <strong class="o_kanban_record_title"><span><field name="name"/></span></strong>
                                     </div>
-                                    <strong><i class="fa fa-money" aria-hidden="true"></i> <field name="currency_id"/></strong>
+                                    <strong><i class="fa fa-money" role="img" aria-label="Currency" title="Currency"></i> <field name="currency_id"/></strong>
                                 </div>
                             </div>
                         </t>
diff --git a/addons/product/views/product_template_views.xml b/addons/product/views/product_template_views.xml
index cc4206a73be6..abcfc5c8327a 100644
--- a/addons/product/views/product_template_views.xml
+++ b/addons/product/views/product_template_views.xml
@@ -75,7 +75,7 @@
                     <t t-name="kanban-box">
                         <div class="oe_kanban_global_click">
                             <div class="o_kanban_image">
-                                <img t-att-src="kanban_image('product.template', 'image_small', record.id.raw_value)"/>
+                                <img t-att-src="kanban_image('product.template', 'image_small', record.id.raw_value)" alt="Product"/>
                             </div>
                             <div class="oe_kanban_details">
                                 <strong class="o_kanban_record_title">
diff --git a/addons/product/views/product_views.xml b/addons/product/views/product_views.xml
index 259798735bf5..906a11090ed7 100644
--- a/addons/product/views/product_views.xml
+++ b/addons/product/views/product_views.xml
@@ -363,7 +363,7 @@
                         <t t-name="kanban-box">
                             <div class="oe_kanban_global_click">
                                 <div class="o_kanban_image">
-                                    <img t-att-src="kanban_image('product.product', 'image_small', record.id.raw_value)"/>
+                                    <img t-att-src="kanban_image('product.product', 'image_small', record.id.raw_value)" alt="Product"/>
                                 </div>
                                 <div class="oe_kanban_details">
                                     <strong class="o_kanban_record_title"><field name="name"/></strong>
diff --git a/addons/product_email_template/data/product_demo.xml b/addons/product_email_template/data/product_demo.xml
index ed14c3a90266..a43f01d04018 100644
--- a/addons/product_email_template/data/product_demo.xml
+++ b/addons/product_email_template/data/product_demo.xml
@@ -31,7 +31,7 @@
         <table>
             <tr>
                 <td>
-                    <img src="/product_email_template/static/img/online_training.png"/>
+                    <img src="/product_email_template/static/img/online_training.png" alt="Online training"/>
                 </td>
                 <td style="height: auto;margin-top:10px;margin-bottom:10px;font-size:18px;color: #646464;">
                     <strong>There are three components to the training</strong>
@@ -609,4 +609,4 @@
             <field name="email_template_id" ref="product_online_training_email_template"/>
         </record>
 
-</odoo>
\ No newline at end of file
+</odoo>
diff --git a/addons/project/data/project_mail_template_data.xml b/addons/project/data/project_mail_template_data.xml
index a7d4dcc15f4f..73f9a844ba99 100644
--- a/addons/project/data/project_mail_template_data.xml
+++ b/addons/project/data/project_mail_template_data.xml
@@ -18,7 +18,7 @@
                 <tbody>
                     <tr>
                         <td style="padding:2px;width:30%;">
-                            <img src="web/static/src/img/logo.png"/>
+                            <img src="web/static/src/img/logo.png" alt="Logo"/>
                         </td>
                         <td style="vertical-align: top; padding: 8px 10px;text-align: left;font-size: 14px;">
                             <a href="web/login" style="float:right ;margin:15px auto;background: #875A7B;border-radius: 5px;color: #ffffff;font-size: 16px;padding: 10px 20px 10px 20px;text-decoration: none;">Auto Login</a>
diff --git a/addons/project/static/src/js/tour.js b/addons/project/static/src/js/tour.js
index e49c13251364..18087cdbc3b7 100644
--- a/addons/project/static/src/js/tour.js
+++ b/addons/project/static/src/js/tour.js
@@ -27,7 +27,7 @@ tour.register('project_tour', {
     content: _t('This will create new project and redirect us to its tasks.'),
     position: 'right',
     run: function (actions) {
-        actions.auto(".modal:visible .btn.btn-primary");
+        actions.auto('[role="dialog"]:visible .btn.btn-primary');
     },
 }, {
     trigger: ".o_kanban_project_tasks .o_column_quick_create input",
diff --git a/addons/project/static/src/xml/project.xml b/addons/project/static/src/xml/project.xml
index 0406bb9f8558..99949bf1861b 100644
--- a/addons/project/static/src/xml/project.xml
+++ b/addons/project/static/src/xml/project.xml
@@ -4,7 +4,7 @@
         <div t-if="attachment_ids.length > 0" class="ml32 mr0 o_kanban_task_cover_container">
             <t t-foreach="attachment_ids" t-as="attachment">
                 <div t-attf-class="o_kanban_task_cover_image#{cover_id == attachment['id'] ? ' o_selected' : ''}">
-                    <img t-attf-src="/web/image/#{attachment['id']}?unique=1" t-att-data-id="attachment['id']" t-att-data-name="attachment['name']"/>
+                    <img t-attf-src="/web/image/#{attachment['id']}?unique=1" t-att-data-id="attachment['id']" t-att-data-name="attachment['name']" alt="Attachment"/>
                 </div>
             </t>
         </div>
diff --git a/addons/project/static/tests/project_tests.js b/addons/project/static/tests/project_tests.js
index e659658a7a2b..e8994c418985 100644
--- a/addons/project/static/tests/project_tests.js
+++ b/addons/project/static/tests/project_tests.js
@@ -118,12 +118,12 @@ QUnit.module('project', {
         assert.strictEqual(kanban.$('img').length, 0, "Initially there is no image.");
         kanban.$('.o_dropdown_kanban [data-type=set_cover]').eq(0).click();
         // single click on image
-        $('.modal').find("img[data-id='1']").click();
-        $('.modal-footer .btn-primary').click();
+        $('[role="dialog"]').find("img[data-id='1']").click();
+        $('footer.modal-footer .btn-primary').click();
         assert.strictEqual(kanban.$('img[data-src*="/web/image/1"]').length, 1, "Image inserted in record");
         $('.o_dropdown_kanban [data-type=set_cover]').eq(1).click();
         // double click on image
-        $('.modal').find("img[data-id='2']").dblclick();
+        $('[role="dialog"]').find("img[data-id='2']").dblclick();
         assert.strictEqual(kanban.$('img[data-src*="/web/image/2"]').length, 1, "Image inserted after double click");
         // varify write on both kanban record
         assert.verifySteps([1,2]);
diff --git a/addons/project/views/project_portal_templates.xml b/addons/project/views/project_portal_templates.xml
index 391f46b38a7d..006b9ec4a0e8 100644
--- a/addons/project/views/project_portal_templates.xml
+++ b/addons/project/views/project_portal_templates.xml
@@ -101,8 +101,8 @@
                         </div>
                         <div class="col-md-6">
                             <div class="pull-right">
-                                <a t-attf-href="/my/tasks?filterby=#{project.id}" class="btn btn-default btn-lg">
-                                    <span class="fa fa-tasks" />
+                                <a role="button" t-attf-href="/my/tasks?filterby=#{project.id}" class="btn btn-default btn-lg">
+                                    <span class="fa fa-tasks" role="img" aria-label="Tasks" title="Tasks"/>
                                     <span t-esc="project.task_count" />
                                     <span t-field="project.label_tasks" />
                                 </a>
@@ -170,7 +170,7 @@
                             <h4>
                                 Task - <span t-field="task.name"/> (#<span t-esc="task.id"/>)
                                 <span t-field="task.stage_id.name" class="pull-right label label-info" title="Current stage of this task"/>
-                                <a class="btn btn-info" t-att-href="'/web#return_label=Website&amp;model=project.task&amp;id=%s&amp;view_type=form' % (task.id)" groups="project.group_project_user">Edit Task</a>
+                                <a role="button" class="btn btn-info" t-att-href="'/web#return_label=Website&amp;model=project.task&amp;id=%s&amp;view_type=form' % (task.id)" groups="project.group_project_user">Edit Task</a>
                             </h4>
                         </div>
                     </div>
diff --git a/addons/project/views/project_rating_templates.xml b/addons/project/views/project_rating_templates.xml
index 7ac2e9463bae..f1c0fa297a90 100644
--- a/addons/project/views/project_rating_templates.xml
+++ b/addons/project/views/project_rating_templates.xml
@@ -27,10 +27,10 @@
                                                 <span class="label label-default pull-right"><t t-esc="project.privacy_visibility"/></span>
                                                 <h4><t t-esc="project.name"/></h4>
                                                 <p t-if="project.date"  class="text-muted">
-                                                    <i class="fa fa-calendar"/> End date : <t t-esc="project.date"/>
+                                                    <span class="fa fa-calendar"> End date</span> : <t t-esc="project.date"/>
                                                 </p>
                                                 <p t-if="project.alias_name and project.alias_domain"  class="text-muted">
-                                                    <i class="fa fa-envelope"/> Email : <t t-esc="project.alias_name"/>@<t t-esc="project.alias_domain"/>
+                                                    <span class="fa fa-envelope"> Email</span> : <t t-esc="project.alias_name"/>@<t t-esc="project.alias_domain"/>
                                                 </p>
                                                 <div class="row">
                                                     <div class="col-md-6 text-center">
@@ -41,8 +41,8 @@
                                             </div>
                                             <div class="caption">
                                                 <p>
-                                                    <a t-att-href="'/project/rating/%s' % project.id" class="btn btn-primary btn-lg btn-block">
-                                                        <i class="fa fa-arrow-circle-right "/> See the feedbacks
+                                                    <a role="button" t-att-href="'/project/rating/%s' % project.id" class="btn btn-primary btn-lg btn-block">
+                                                        <span class="fa fa-arrow-circle-right "> See the feedbacks</span>
                                                     </a>
                                                 </p>
                                             </div>
@@ -79,8 +79,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-sm-1">
-                        <img t-if="partner_stat['rated_partner'].image" class="o_top_partner_image" t-attf-src="data:image/png;base64,#{partner_stat['rated_partner'].image}"/>
-                        <img  t-if="not partner_stat['rated_partner'].image" class="o_top_partner_image" src='/web/static/src/img/placeholder.png'/>
+                        <img t-if="partner_stat['rated_partner'].image" class="o_top_partner_image" t-attf-src="data:image/png;base64,#{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"/>
                     </div>
                     <div class="col-sm-4 o_smiley_no_padding_right">
                         <span class="ml8" t-esc="partner_stat['rated_partner'].name"/>
@@ -88,31 +88,31 @@
                     <div class="col-sm-4 o_smiley_no_padding_right">
                         <div class="col-sm-4 o_smiley_no_padding_right o_smiley_no_padding_left">
                             <span t-if="partner_stat['rating_10']">
-                                <img title="happy" class="o_top_partner_rating_image" src='/rating/static/src/img/rating_10.png'/>
+                                <img title="happy" alt="Happy face" class="o_top_partner_rating_image" src='/rating/static/src/img/rating_10.png'/>
                                 <span class="o_rating_count" t-esc="partner_stat['rating_10']"/>
                             </span>
                             <span t-if="not partner_stat['rating_10']">
-                                <img title="happy" class="o_top_partner_rating_image o_lighter_smileys" src='/rating/static/src/img/rating_10.png'/>
+                                <img title="happy" alt="Happy face" class="o_top_partner_rating_image o_lighter_smileys" src='/rating/static/src/img/rating_10.png'/>
                                 <span class="o_rating_count o_lighter_smileys" t-esc="partner_stat['rating_10']"/>
                             </span>
                         </div>
                         <div class="col-sm-4 o_smiley_no_padding_right o_smiley_no_padding_left">
                             <span t-if="partner_stat['rating_5']">
-                                <img title="happy" class="o_top_partner_rating_image" src='/rating/static/src/img/rating_5.png'/>
+                                <img title="average" alt="Neutral face" class="o_top_partner_rating_image" src='/rating/static/src/img/rating_5.png'/>
                                 <span class="o_rating_count" t-esc="partner_stat['rating_5']"/>
                             </span>
                             <span t-if="not partner_stat['rating_5']">
-                                <img title="happy" class="o_top_partner_rating_image o_lighter_smileys" src='/rating/static/src/img/rating_5.png'/>
+                                <img title="average" alt="Neutral face" class="o_top_partner_rating_image o_lighter_smileys" src='/rating/static/src/img/rating_5.png'/>
                                 <span class="o_rating_count o_lighter_smileys" t-esc="partner_stat['rating_5']"/>
                             </span>
                         </div>
                         <div class="col-sm-4 o_smiley_no_padding_right o_smiley_no_padding_left">
                            <span t-if="partner_stat['rating_1']">
-                                <img title="happy" class="o_top_partner_rating_image" src='/rating/static/src/img/rating_1.png'/>
+                                <img title="bad" alt="Sad face" class="o_top_partner_rating_image" src='/rating/static/src/img/rating_1.png'/>
                                 <span class="o_rating_count" t-esc="partner_stat['rating_1']"/>
                             </span>
                             <span t-if="not partner_stat['rating_1']">
-                                <img title="happy" class="o_top_partner_rating_image o_lighter_smileys" src='/rating/static/src/img/rating_1.png'/>
+                                <img title="bad" alt="Sad face" class="o_top_partner_rating_image o_lighter_smileys" src='/rating/static/src/img/rating_1.png'/>
                                 <span class="o_rating_count o_lighter_smileys" t-esc="partner_stat['rating_1']"/>
                             </span>
                         </div>
@@ -128,8 +128,8 @@
             <div t-attf-id="rating_#{rating.id}" class="container hidden">
                 <div class="row">
                     <div class="col-md-2">
-                        <img t-if="rating.partner_id.image" class="o_top_partner_image" t-attf-src="data:image/png;base64,#{rating.partner_id.image}"/>
-                        <img  t-if="not rating.partner_id.image" class="o_top_partner_image" src='/web/static/src/img/placeholder.png'/>
+                        <img t-if="rating.partner_id.image" class="o_top_partner_image" t-attf-src="data:image/png;base64,#{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"/>
                     </div>
                     <div class="col-md-10">
                         <div class="mt4">
@@ -160,6 +160,7 @@
                                         <t t-foreach="ratings" t-as="rating">
                                             <img t-attf-src='/rating/static/src/img/rating_#{int(rating.rating)}.png'
                                                 class="mt4 o_rating_image"
+                                                t-att-alt="rating.name"
                                                 t-att-data-id="rating.id"
                                                 t-att-data-rating-date="rating.write_date"/>
                                             <t t-call="project.portal_project_rating_popover"/>
diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml
index d0dfcfaa0edd..b5a54bd0dc51 100644
--- a/addons/project/views/project_views.xml
+++ b/addons/project/views/project_views.xml
@@ -236,7 +236,7 @@
                                     </div>
                                     <div class="col-xs-4">
                                         <div class="oe_kanban_bottom_right">
-                                            <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                            <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                         </div>
                                     </div>
                                 </div>
@@ -309,36 +309,36 @@
                                                 </span>
                                             </div>
                                             <div t-if="record.alias_name.value and record.alias_domain.value">
-                                                <span><i class="fa fa-envelope"></i> <t t-esc="record.alias_id.value"/></span>
+                                                <span><i class="fa fa-envelope" role="img" aria-label="Domain Alias" title="Domain Alias"></i> <t t-esc="record.alias_id.value"/></span>
                                             </div>
                                             <div t-if="record.rating_status.raw_value != 'no'" class="mt8 text-primary" title="Percentage of happy ratings over the past 30 days. Get rating details from the More menu." groups="project.group_project_rating">
                                                 <b>
                                                     <t t-if="record.percentage_satisfaction_project.value == -1">
-                                                        <i class="fa fa-smile-o"/> No rating yet
+                                                        <span class="fa fa-smile-o"> No rating yet</span>
                                                     </t>
                                                     <t t-if="record.percentage_satisfaction_project.value != -1">
                                                         <a name="action_view_all_rating" type="object" context="{'search_default_rating_last_30_days':1}">
-                                                            <i class="fa fa-smile-o"/> <t t-esc="record.percentage_satisfaction_project.value"/>%
+                                                            <i class="fa fa-smile-o" role="img" aria-label="Percentage of satisfaction" title="Percentage of satisfaction"/> <t t-esc="record.percentage_satisfaction_project.value"/>%
                                                         </a>
                                                     </t>
                                                 </b>
                                             </div>
                                         </div>
                                     </div>
-                                    <div class="o_kanban_card_manage_pane dropdown-menu" groups="project.group_project_manager">
+                                    <div class="o_kanban_card_manage_pane dropdown-menu" groups="project.group_project_manager" role="menu">
                                         <div class="o_kanban_card_manage_section o_kanban_manage_reports">
-                                            <div>
+                                            <div role="menuitem">
                                                 <a type="edit">Edit</a>
                                             </div>
-                                            <div t-if="record.rating_status.raw_value != 'no'">
+                                            <div role="menuitem" t-if="record.rating_status.raw_value != 'no'">
                                                 <a name="action_view_all_rating" type="object">Customer Ratings</a>
                                             </div>
                                         </div>
-                                        <div class="o_no_padding_kanban_colorpicker">
-                                            <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                        <div role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
+                                            <ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
                                         </div>
                                     </div>
-                                    <a class="o_kanban_manage_toggle_button o_left" href="#" groups="project.group_project_manager"><i class="fa fa-ellipsis-v" /></a>
+                                    <a class="o_kanban_manage_toggle_button o_left" href="#" groups="project.group_project_manager"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                     <span class="o_right"><field name="is_favorite" widget="boolean_favorite" nolabel="1" force_save="1" /></span>
                                 </div>
 
@@ -552,17 +552,17 @@
                                         </small>
                                     </div>
                                     <div class="o_dropdown_kanban dropdown" groups="base.group_user">
-                                        <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
-                                            <span class="fa fa-ellipsis-v" aria-hidden="true"/>
+                                        <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
+                                            <span class="fa fa-ellipsis-v"/>
                                         </a>
-                                        <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                            <li t-if="widget.editable"><a type="set_cover">Set Cover Image</a></li>
-                                            <li t-if="widget.editable"><a type="edit">Edit Task</a></li>
-                                            <li t-if="widget.deletable"><a type="delete">Delete</a></li>
-                                            <li class="divider"></li>
-                                            <li class="dropdown-header">Record's Colour</li>
-                                            <li>
-                                                <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                        <ul class="dropdown-menu" role="menu">
+                                            <li t-if="widget.editable"><a role="menuitem" type="set_cover">Set Cover Image</a></li>
+                                            <li t-if="widget.editable"><a role="menuitem" type="edit">Edit Task</a></li>
+                                            <li t-if="widget.deletable"><a role="menuitem" type="delete">Delete</a></li>
+                                            <li role="separator" class="divider"></li>
+                                            <li role="separator" class="dropdown-header">Record's Colour</li>
+                                            <li role="menuitem" aria-haspopup="true">
+                                                <ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
                                             </li>
                                         </ul>
                                     </div>
@@ -578,17 +578,17 @@
                                         <field name="priority" widget="priority"/>
                                         <field name="activity_ids" widget="kanban_activity"/>
                                         <t t-if="record.message_needaction_counter.raw_value">
-                                            <span class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments'/><t t-raw="record.message_needaction_counter.raw_value"/></span>
+                                            <span role="alert" class='oe_kanban_mail_new' title='Unread Messages'><i class='fa fa-comments' role="img" aria-label="Unread Messages"/><t t-raw="record.message_needaction_counter.raw_value"/></span>
                                         </t>
                                         <b t-if="record.rating_ids.raw_value.length">
-                                            <span style="font-weight:bold;" class="fa fa-fw mt4 fa-smile-o text-success" t-if="record.rating_last_value.value == 10" title="Latest Rating: Satisfied"/>
-                                            <span style="font-weight:bold;" class="fa fa-fw mt4 fa-meh-o text-warning" t-if="record.rating_last_value.value == 5" title="Latest Rating: Not Satisfied"/>
-                                            <span style="font-weight:bold;" class="fa fa-fw mt4 fa-frown-o text-danger" t-if="record.rating_last_value.value == 1" title="Latest Rating: Higly Dissatisfied"/>
+                                            <span style="font-weight:bold;" class="fa fa-fw mt4 fa-smile-o text-success" t-if="record.rating_last_value.value == 10" title="Latest Rating: Satisfied" role="img" aria-label="Happy face"/>
+                                            <span style="font-weight:bold;" class="fa fa-fw mt4 fa-meh-o text-warning" t-if="record.rating_last_value.value == 5" title="Latest Rating: Not Satisfied" role="img" aria-label="Neutral face"/>
+                                            <span style="font-weight:bold;" class="fa fa-fw mt4 fa-frown-o text-danger" t-if="record.rating_last_value.value == 1" title="Latest Rating: Higly Dissatisfied" role="img" aria-label="Sad face"/>
                                         </b>
                                     </div>
                                     <div class="oe_kanban_bottom_right">
                                         <field name="kanban_state" widget="state_selection" groups="base.group_user"/>
-                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
+                                        <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
                                     </div>
                                 </div>
                             </div>
@@ -777,17 +777,23 @@
                                 You can define here labels that will be displayed for the state instead
                                 of the default labels.
                             </p>
-                            <label for="legend_normal" string=" " class="o_status oe_project_kanban_legend"/>
+                            <label for="legend_normal" string=" " class="o_status oe_project_kanban_legend"
+                                title="Task in progress. Click to block or set as done."
+                                aria-label="Task in progress. Click to block or set as done." role="img"/>
                             <field name="legend_normal" nolabel="1"/>
-                            <label for="legend_blocked" string=" " class="o_status o_status_red oe_project_kanban_legend"/>
+                            <label for="legend_blocked" string=" " class="o_status o_status_red oe_project_kanban_legend"
+                                title="Task is blocked. Click to unblock or set as done."
+                                aria-label="Task is blocked. Click to unblock or set as done." role="img"/>
                             <field name="legend_blocked" nolabel="1"/>
-                            <label for="legend_done" string=" " class="o_status o_status_green oe_project_kanban_legend"/>
+                            <label for="legend_done" string=" " class="o_status o_status_green oe_project_kanban_legend"
+                                title="This step is done. Click to block or set in progress."
+                                aria-label="This step is done. Click to block or set in progress." role="img"/>
                             <field name="legend_done" nolabel="1"/>
 
                             <p class="text-muted" colspan="2">
                                 You can also give a tooltip about the use of the stars available in the kanban and form views.
                             </p>
-                            <label for="legend_priority" string=" " class="fa fa-star fa-lg o_star_on oe_project_kanban_legend"/>
+                            <label for="legend_priority" string=" " class="fa fa-star fa-lg o_star_on oe_project_kanban_legend" aria-label="Legend priority" title="Legend priority" role="img"/>
                             <field name="legend_priority" nolabel="1"/>
 
                             <p class="text-muted" colspan="2">
diff --git a/addons/purchase/views/portal_templates.xml b/addons/purchase/views/portal_templates.xml
index 7e23f335940e..ec5d49dc5506 100644
--- a/addons/purchase/views/portal_templates.xml
+++ b/addons/purchase/views/portal_templates.xml
@@ -48,7 +48,7 @@
                 <span class="label label-info"><i class="fa fa-fw fa-file-text"/> Waiting for Bill</span>
               </t>
               <t t-if="order.state == 'cancel'">
-                <span class="label label-default"><i class="fa fa-fw fa-remove"/> Cancelled</span>
+                <span class="label label-default fa fa-fw fa-remove"> Cancelled</span>
               </t>
             </td>
             <td><span t-field="order.amount_total" t-options='{"widget": "monetary", "display_currency": order.currency_id}'/>
@@ -100,7 +100,7 @@
               <t t-foreach="order.order_line" t-as="ol">
                 <div class="row purchases_vertical_align">
                   <div class="col-md-1 text-center">
-                      <img t-att-src="'/web/image/purchase.order.line/%s/product_image/48x48' % ol.id"/>
+                      <img t-att-src="'/web/image/purchase.order.line/%s/product_image/48x48' % ol.id" alt="Product"/>
                   </div>
                   <div id='product_name' class="col-md-5">
                     <span t-esc="ol.product_id.name"/>
diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml
index 49c047e84f7e..9d19a329efd4 100644
--- a/addons/purchase/views/purchase_views.xml
+++ b/addons/purchase/views/purchase_views.xml
@@ -154,8 +154,8 @@
                         </button>
                     </div>
                     <div class="oe_title">
-                        <label string="Request for Quotation " attrs="{'invisible': [('state','not in',('draft','sent','bid'))]}"/>
-                        <label string="Purchase Order " attrs="{'invisible': [('state','in',('draft','sent','bid'))]}"/>
+						<span class="o_form_label" attrs="{'invisible': [('state','not in',('draft','sent','bid'))]}">Request for Quotation </span>
+						<span class="o_form_label" attrs="{'invisible': [('state','in',('draft','sent','bid'))]}">Purchase Order </span>
                         <h1>
                             <field name="name" readonly="1"/>
                         </h1>
@@ -441,7 +441,7 @@
                         <label for="order_id" class="oe_edit_only"/>
                         <h1>
                             <field name="order_id" class="oe_inline"/>
-                            <label string="," attrs="{'invisible':[('date_order','=',False)]}"/>
+                            <label string="," for="date_order" attrs="{'invisible':[('date_order','=',False)]}"/>
                             <field name="date_order" class="oe_inline"/>
                         </h1>
                         <label for="partner_id" class="oe_edit_only"/>
diff --git a/addons/purchase/views/res_config_settings_views.xml b/addons/purchase/views/res_config_settings_views.xml
index e702ee0d9108..0cadad1eb124 100644
--- a/addons/purchase/views/res_config_settings_views.xml
+++ b/addons/purchase/views/res_config_settings_views.xml
@@ -20,7 +20,7 @@
                             </div>
                             <div class="o_setting_right_pane">
                                 <label for="po_order_approval"/>
-                                <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                 <div class="text-muted">
                                     Managers must approve orders
                                 </div>
@@ -110,7 +110,7 @@
                                 </div>
                                 <div class="content-group" attrs="{'invisible': [('group_manage_vendor_price', '=', False)]}">
                                     <div class="mt16">
-                                        <a class="btn-link fa fa-arrow-right" target="_blank" href="https://www.odoo.com/documentation/user/11.0/general/base_import/import_faq.html">
+                                        <a role="button" class="btn-link fa fa-arrow-right" target="_blank" href="https://www.odoo.com/documentation/user/11.0/general/base_import/import_faq.html">
                                         How to import
                                         </a>
                                     </div>
diff --git a/addons/purchase/views/res_partner_views.xml b/addons/purchase/views/res_partner_views.xml
index 886f43f387f2..af6e9e01ba73 100644
--- a/addons/purchase/views/res_partner_views.xml
+++ b/addons/purchase/views/res_partner_views.xml
@@ -42,7 +42,7 @@
                     <field name="purchase_order_count"/>
                 </field>
                 <xpath expr="//div[hasclass('oe_kanban_partner_links')]" position="inside">
-                    <span t-if="record.purchase_order_count.value>0" class="badge"><i class="fa fa-fw fa-shopping-cart"/><t t-esc="record.purchase_order_count.value"/></span>
+                    <span t-if="record.purchase_order_count.value>0" class="badge"><i class="fa fa-fw fa-shopping-cart" role="img" aria-label="Shopping cart" title="Shopping cart"/><t t-esc="record.purchase_order_count.value"/></span>
                 </xpath>
             </field>
         </record>
diff --git a/addons/purchase_requisition/views/purchase_requisition_views.xml b/addons/purchase_requisition/views/purchase_requisition_views.xml
index 57cb2d81ce13..05227046064e 100644
--- a/addons/purchase_requisition/views/purchase_requisition_views.xml
+++ b/addons/purchase_requisition/views/purchase_requisition_views.xml
@@ -263,7 +263,7 @@
                                     <field name="vendor_id"/>
                                 </div>
                                 <div class="oe_kanban_bottom_right">
-                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
+                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar pull-right"/>
                                 </div>
                             </div>
                         </div>
diff --git a/addons/purchase_stock/data/mail_data.xml b/addons/purchase_stock/data/mail_data.xml
index 09984703d734..9e00feab2331 100644
--- a/addons/purchase_stock/data/mail_data.xml
+++ b/addons/purchase_stock/data/mail_data.xml
@@ -2,7 +2,7 @@
 <odoo>
 
     <template id="exception_on_po">
-        <div class="alert alert-warning">
+        <div class="alert alert-warning" role="alert">
           Exception(s) occurred on the purchase order(s):
           <t t-foreach="purchase_order_ids" t-as="purchase_order">
               <a href="#" data-oe-model="purchase.order" t-att-data-oe-id="purchase_order.id"><t t-esc="purchase_order.name"/></a>.
diff --git a/addons/rating/views/rating_template.xml b/addons/rating/views/rating_template.xml
index b6fa5304b54a..09c74853f587 100644
--- a/addons/rating/views/rating_template.xml
+++ b/addons/rating/views/rating_template.xml
@@ -10,11 +10,11 @@
                 </t>
                 <div class="container">
                     <div class="text-center" style="margin-top:128px">
-                        <i class="fa fa-check-circle fa-5x text-success" />
+                        <i class="fa fa-check-circle fa-5x text-success" role="img" aria-label="Thank you!" title="Thank you!"/>
                     </div>
                     <h2 class="text-center">We appreciate your feedback!</h2>
                     <div class="text-center">
-                        <a t-att-href="web_base_url" class="btn btn-primary">Go to our website</a>
+                        <a role="button" t-att-href="web_base_url" class="btn btn-primary">Go to our website</a>
                     </div>
                 </div>
             </t>
@@ -31,7 +31,7 @@
                         <h1 class="text-center">Thanks! We appreciate your feedback.</h1>
                         <h4 class="text-center text-muted" style="margin-bottom: 32px;">Your rating has been submitted.</h4>
                         <div class="pull-left">
-                            <img t-attf-src='/rating/static/src/img/rating_#{rate}.png'/>
+                            <img t-attf-src='/rating/static/src/img/rating_#{rate}.png' t-att-alt="rate.name"/>
                         </div>
                         <div style="margin-left: 80px;">
                             you are <b t-esc="rate_name"></b><br/>
diff --git a/addons/rating/views/rating_view.xml b/addons/rating/views/rating_view.xml
index a7ec28584bb5..66d279da9110 100644
--- a/addons/rating/views/rating_view.xml
+++ b/addons/rating/views/rating_view.xml
@@ -69,7 +69,7 @@
                         <t t-name="kanban-box">
                             <div class="oe_kanban_global_click">
                                 <div class="o_kanban_image">
-                                    <img t-attf-src="/rating/static/src/img/rating_#{record.rating.raw_value}.png" />
+                                    <img t-attf-src="/rating/static/src/img/rating_#{record.rating.raw_value}.png" t-att-alt="record.rating.name"/>
                                 </div>
                                 <div class="oe_kanban_details">
                                     <strong>
@@ -96,7 +96,7 @@
                                             on <field name="create_date" />
                                         </li>
                                     </ul>
-                                    <i t-if="record.feedback.raw_value" class="fa fa-comment pull-right mt4" t-attf-title="Feedback:\n#{record.feedback.raw_value}" />
+                                    <i t-if="record.feedback.raw_value" class="fa fa-comment pull-right mt4" t-attf-title="Feedback:\n#{record.feedback.raw_value}"  t-attf-aria-label="Feedback:\n#{record.feedback.raw_value}" role="img"/>
                                 </div>
                             </div>
                         </t>
diff --git a/addons/repair/wizard/repair_cancel_views.xml b/addons/repair/wizard/repair_cancel_views.xml
index e41c90c34d9c..9836653bfa8c 100644
--- a/addons/repair/wizard/repair_cancel_views.xml
+++ b/addons/repair/wizard/repair_cancel_views.xml
@@ -10,7 +10,7 @@
             <field name="arch" type="xml">
                 <form string="Cancel Repair Order">
                     <group>
-                        <label string="This operation will cancel the Repair process, but will not cancel it's Invoice. Do you want to continue?"/>
+                        <span class="o_form_label">This operation will cancel the Repair process, but will not cancel it's Invoice. Do you want to continue?</span>
                     </group>
                     <footer>
                         <button name="cancel_repair" string="Yes" type="object" class="btn-primary"/>
diff --git a/addons/sale/views/res_config_settings_views.xml b/addons/sale/views/res_config_settings_views.xml
index b2e4615e890e..558bd567c015 100644
--- a/addons/sale/views/res_config_settings_views.xml
+++ b/addons/sale/views/res_config_settings_views.xml
@@ -200,7 +200,7 @@
                             </div>
                             <div class="o_setting_right_pane">
                                 <label for="use_sale_note"/>
-                                <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                                <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." aria-label="Values set here are company-specific." groups="base.group_multi_company" role="img"/>
                                 <div class="text-muted">
                                     Show standard terms &amp; conditions on orders
                                 </div>
@@ -379,7 +379,7 @@
                         <div class="col-xs-12 col-md-6 o_setting_box" groups="base.group_no_one">
                             <div class="o_setting_left_pane"/>
                             <div class="o_setting_right_pane">
-                                <label string="Down Payments"/>
+                                <span class="o_form_label">Down Payments</span>
                                 <div class="text-muted">
                                     Product used for down payments
                                 </div>
diff --git a/addons/sale/views/res_partner_views.xml b/addons/sale/views/res_partner_views.xml
index c5b01919c3fc..53d5577fb462 100644
--- a/addons/sale/views/res_partner_views.xml
+++ b/addons/sale/views/res_partner_views.xml
@@ -28,7 +28,7 @@
                     <field name="sale_order_count"/>
                 </field>
                 <xpath expr="//div[hasclass('oe_kanban_partner_links')]" position="inside">
-                    <span t-if="record.sale_order_count.value>0" class="badge"><i class="fa fa-fw fa-usd"/><t t-esc="record.sale_order_count.value"/></span>
+                    <span t-if="record.sale_order_count.value>0" class="badge"><i class="fa fa-fw fa-usd" role="img" aria-label="Sale orders" title="Sales orders"/><t t-esc="record.sale_order_count.value"/></span>
                 </xpath>
             </field>
         </record>
diff --git a/addons/sale/views/sale_portal_templates.xml b/addons/sale/views/sale_portal_templates.xml
index 08441e9d6c55..91057c2c26c9 100644
--- a/addons/sale/views/sale_portal_templates.xml
+++ b/addons/sale/views/sale_portal_templates.xml
@@ -58,10 +58,10 @@
                         <td><span t-field="quotation.validity_date"/></td>
                         <td>
                           <t t-if="quotation.state == 'cancel'">
-                            <span class="label label-default"><i class="fa fa-fw fa-remove"/> Cancelled</span>
+                            <span class="label label-default"><span class="fa fa-fw fa-remove"> Cancelled</span></span>
                           </t>
                           <t t-if="quotation.is_expired">
-                            <span class="label label-default"><i class="fa fa-fw fa-clock-o"/> Expired</span>
+                            <span class="label label-default"><span class="fa fa-fw fa-clock-o"> Expired</span></span>
                           </t>
                         </td>
                         <td><span t-field="quotation.amount_total" t-options='{"widget": "monetary", "display_currency": quotation.pricelist_id.currency_id}'/>
@@ -108,7 +108,7 @@
                         </td>
                         <td>
                             <t t-if="order.state == 'done'">
-                                <span class="label label-success hidden-xs"><i class="fa fa-fw fa-check"></i><span class="hidden-xs"> Done</span></span>
+                                <span class="label label-success hidden-xs"><i class="fa fa-fw fa-check" role="img" aria-label="Done" title="Done"></i><span class="hidden-xs"> Done</span></span>
                             </t>
                         </td>
                         <td><span t-field="order.amount_total" t-options='{"widget": "monetary", "display_currency": order.pricelist_id.currency_id}'/></td>
@@ -138,27 +138,27 @@
                         <t t-else="">Order</t>
                         <span t-esc="order.name"/>
                         <t t-if="order.state == 'cancel'">
-                            <span class="label label-default"><i class="fa fa-fw fa-remove"/> Cancelled</span>
+                            <span class="label label-default"><span class="fa fa-fw fa-remove"> Cancelled</span></span>
                         </t>
                         <t t-if="order.state == 'done'">
-                            <span class="label label-success"><i class="fa fa-fw fa-check" /> Done</span>
+                            <span class="label label-success"><span class="fa fa-fw fa-check"> Done</span></span>
                         </t>
                     </h4>
                 </div>
                 <div class="col-md-6 col-sm-3 col-xs-3 hidden-print" id="o_portal_order_actions">
                     <t t-if="order.state == 'sent' and portal_confirmation == 'sign'" name="portal_confirmation_sign">
-                        <a class="btn btn-primary ml8 pull-right" href="#portal_sign">
-                            <i class="fa fa-arrow-circle-right"/> Accept &amp; Sign
+                        <a role="button" class="btn btn-primary ml8 pull-right" href="#portal_sign">
+                            <span class="fa fa-arrow-circle-right"> Accept &amp; Sign</span>
                         </a>
                     </t>
                     <t t-if="order.state == 'sale' and portal_confirmation == 'sign'">
-                        <a class="btn btn-success ml8 pull-right" disabled="disabled"
+                        <a role="button" class="btn btn-success ml8 pull-right" disabled="disabled"
                             t-attf-title="Order signed on #{order.confirmation_date} by #{order.partner_id.name}">
-                            <i class="fa fa-check-circle"/> Signed
+                            <span class="fa fa-check-circle"> Signed</span>
                         </a>
                     </t>
                     <a target="_blank" t-att-href="'/my/orders/pdf/%s?%s' % (order.id, keep_query())" class="ml8 pull-right mt4 mr8" title="Download">
-                        <i class="fa fa-download fa-2x" aria-hidden="true"/>
+                        <i class="fa fa-download fa-2x" role="img" aria-label="Download"/>
                     </a>
                 </div>
               </div>
@@ -188,14 +188,14 @@
                       <t t-foreach="invoices" t-as="i">
                         <t t-set="report_url" t-value="'/my/invoices/pdf/%s?%s' % (i.id, 'access_token=%s' % i.access_token if access_token else '')"/>
                         <div>
-                          <a t-att-href="report_url"><span class="fa fa-download"/></a>
+                          <a t-att-href="report_url"><span class="fa fa-download" role="img" aria-label="Download" title="Download"/></a>
                           <a t-att-href="report_url"><span t-esc="i.number"/></a>
                           <span class="text-muted" t-field="i.date_invoice"/>
                           <t t-if="i.state == 'paid'">
-                            <span class="label label-success orders_label_text_align"><i class="fa fa-fw fa-check"/> Paid</span>
+                            <span class="label label-success orders_label_text_align"><span class="fa fa-fw fa-check"> Paid</span></span>
                           </t>
                           <t t-if="i.state != 'paid'">
-                            <span class="label label-info orders_label_text_align"><i class="fa fa-fw fa-clock-o"/> Waiting</span>
+                            <span class="label label-info orders_label_text_align"><span class="fa fa-fw fa-clock-o"> Waiting</span></span>
                           </t>
                         </div>
                       </t>
@@ -337,7 +337,7 @@
 
     <template id="portal_order_error" name="Order error/warning display">
         <div class="row mr16">
-            <div t-attf-class="'col-md-12 mr16 ml16 alert alert-dismissable' #{'alert-danger' if error else 'alert-warning'}">
+            <div t-attf-class="'col-md-12 mr16 ml16 alert alert-dismissable' #{'alert-danger' if error else 'alert-warning'}" role="alert">
                 <a href="#" class="close" data-dismiss="alert" aria-label="close" title="close">×</a>
                 <t t-if="error == 'generic'" name="generic">
                     There was an error processing this page.
@@ -348,7 +348,7 @@
 
     <template id="portal_order_success" name="Order success display">
         <div class="row mr16">
-            <div class="col-md-12 mr16 ml16 alert alert-dismissable alert-success">
+            <div class="col-md-12 mr16 ml16 alert alert-dismissable alert-success" role="status">
                 <a href="#" class="close" data-dismiss="alert" aria-label="close" title="close">×</a>
             </div>
         </div>
diff --git a/addons/sale/wizard/sale_make_invoice_advance_views.xml b/addons/sale/wizard/sale_make_invoice_advance_views.xml
index b3bbc373917d..5cf44b9a7d5a 100644
--- a/addons/sale/wizard/sale_make_invoice_advance_views.xml
+++ b/addons/sale/wizard/sale_make_invoice_advance_views.xml
@@ -20,8 +20,8 @@
                         <div attrs="{'invisible': [('advance_payment_method', 'not in', ('fixed','percentage'))]}">
                             <field name="amount"
                                 attrs="{'required': [('advance_payment_method', 'in', ('fixed','percentage'))]}" class="oe_inline" widget="monetary"/>
-                            <label string="%%"
-                                attrs="{'invisible': [('advance_payment_method', '!=', 'percentage')]}" class="oe_inline"/>
+                            <span
+                                attrs="{'invisible': [('advance_payment_method', '!=', 'percentage')]}" class="oe_inline">%</span>
                         </div>
                         <field name="deposit_account_id" class="oe_inline"
                             attrs="{'invisible': ['|', ('advance_payment_method', 'not in', ('fixed', 'percentage')), ('product_id', '!=', False)]}" groups="account.group_account_manager"/>
diff --git a/addons/sale_management/static/src/js/tour.js b/addons/sale_management/static/src/js/tour.js
index 89c792e104af..11cbc958661b 100644
--- a/addons/sale_management/static/src/js/tour.js
+++ b/addons/sale_management/static/src/js/tour.js
@@ -48,11 +48,14 @@ tour.register('sale_tour', {
     in_modal: false,
     run: function (actions) {
         actions.auto();
-        if ($(".modal-footer .btn-primary").length) {
-            actions.auto(".modal-footer .btn-primary");
+        if ($('.modal-dialog:has(div.o_dialog_warning) footer.modal-footer .btn-primary').length) {
+            $('.modal-dialog:has(div.o_dialog_warning) footer.modal-footer .btn-primary').trigger('click');
         }
     },
     id: "quotation_product_selected",
+}, {
+    trigger: ".modal-dialog:has(div.o_dialog_warning) footer.modal-footer .btn-primary",
+    position: "right",
 }, {
     trigger: ".o_form_button_save",
     extra_trigger: ".o_sale_order",
diff --git a/addons/sale_payment/views/sale_portal_templates.xml b/addons/sale_payment/views/sale_portal_templates.xml
index 11e07dae31d4..cc71dce40263 100644
--- a/addons/sale_payment/views/sale_portal_templates.xml
+++ b/addons/sale_payment/views/sale_portal_templates.xml
@@ -3,13 +3,13 @@
         <xpath expr="//t[@name='portal_confirmation_sign']" position="after">
             <t t-set="payment_tx_id" t-value="order.get_portal_last_transaction()"/>
             <t t-if="order.amount_total and not invoices and order.state in ('sent', 'sale') and portal_confirmation == 'pay' and payment_tx_id and payment_tx_id.state != 'done'" name="portal_confirmation_pay">
-                <a class="btn btn-primary ml8 pull-right" href="#portal_pay">
-                    <i class="fa fa-arrow-circle-right"/> Pay Now
+                <a class="btn btn-primary ml8 pull-right" href="#portal_pay" role="button">
+                    <span class="fa fa-arrow-circle-right"> Pay Now</span>
                 </a>
             </t>
             <t t-if="invoices and order.state in ('sale', 'done') and portal_confirmation == 'pay'">
-                <a class="btn btn-primary ml8 pull-right" disabled="disabled">
-                    <i class="fa fa-check-circle"/> Done
+                <a role="button" class="btn btn-primary ml8 pull-right" disabled="disabled">
+                    <span class="fa fa-check-circle"> Done</span>
                 </a>
             </t>
         </xpath>
@@ -52,10 +52,10 @@
                         <span t-esc="tx.reference"/>
                         <span class="text-muted" t-field="tx.create_date"/>
                         <t t-if="tx.state == 'done'">
-                            <span class="label label-success orders_label_text_align"><i class="fa fa-fw fa-check"/> Done</span>
+                            <span class="label label-success orders_label_text_align"><span class="fa fa-fw fa-check"> Done</span></span>
                         </t>
                         <t t-if="tx.state != 'done'">
-                            <span class="label label-info orders_label_text_align"><i class="fa fa-fw fa-clock-o"/> Waiting</span>
+                            <span class="label label-info orders_label_text_align"><span class="fa fa-fw fa-clock-o"> Waiting</span></span>
                             <t t-if="tx.state_message"><br /><span t-esc="tx.state_message"/></t>
                         </t>
                     </div>
diff --git a/addons/sale_stock/static/src/js/tour.js b/addons/sale_stock/static/src/js/tour.js
index 690150677de7..9822d124df0b 100644
--- a/addons/sale_stock/static/src/js/tour.js
+++ b/addons/sale_stock/static/src/js/tour.js
@@ -13,15 +13,15 @@ odoo.define("sale_stock.tour", function (require) {
     };
 
     tour.tours.sale_tour.steps.splice(quotation_product_selected_step_index+1, 0, {
-        trigger: ".o_dialog_warning + .modal-footer .btn-primary",
+        trigger: "footer.modal-footer .btn-primary",
         auto: true,
     }, {
         trigger: "body:not(:has(.o_dialog_warning))",
         auto: true,
         in_modal: false,
         run: function (actions) {
-            if ($('.modal-footer .btn-primary').length){
-                actions.auto(".modal-footer .btn-primary");
+            if ($('footer.modal-footer .btn-primary').length){
+                actions.auto('footer.modal-footer .btn-primary');
             }
         },
     });
diff --git a/addons/sale_stock/views/res_config_settings_views.xml b/addons/sale_stock/views/res_config_settings_views.xml
index 532b26f4ecd3..12ce0dfd8605 100644
--- a/addons/sale_stock/views/res_config_settings_views.xml
+++ b/addons/sale_stock/views/res_config_settings_views.xml
@@ -94,7 +94,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="use_security_lead"/>
-                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." role="img" aria-label="Values set here are company-specific." groups="base.group_multi_company"/>
                         <div class="text-muted">
                             Schedule deliveries earlier to avoid delays
                         </div>
diff --git a/addons/sale_stock/views/sale_stock_portal_template.xml b/addons/sale_stock/views/sale_stock_portal_template.xml
index ece6a8e07832..1c2cbb396ac4 100644
--- a/addons/sale_stock/views/sale_stock_portal_template.xml
+++ b/addons/sale_stock/views/sale_stock_portal_template.xml
@@ -10,20 +10,20 @@
                     <t t-foreach="order.picking_ids.filtered(lambda picking: picking.picking_type_id.code != 'internal')" t-as="i">
                         <t t-set="report_url" t-value="'/my/picking/pdf/%s?%s' % (i.id, keep_query())"/>
                         <div id='picking_info'>
-                            <a t-att-href="report_url"><span class="fa fa-download"/></a>
+                            <a t-att-href="report_url"><span class="fa fa-download" role="img" aria-label="Download" title="Download"/></a>
                             <a t-att-href="report_url"><span t-field="i.name"/></a>
                             <span class="text-muted" t-field="i.date" t-options='{"widget": "date"}'/>
                             <t t-if="i.state == 'done'">
-                                <span class="label label-success label-text-align"><i class="fa fa-fw fa-truck"/> Shipped</span>
+                                <span class="label label-success label-text-align"><span class="fa fa-fw fa-truck"> Shipped</span></span>
                             </t>
                             <t t-if="i.state == 'partially_available'">
-                                <span class="label label-warning label-text-align"><i class="fa fa-fw fa-clock-o"/> Partially Available</span>
+                                <span class="label label-warning label-text-align"><span class="fa fa-fw fa-clock-o"> Partially Available</span></span>
                             </t>
                             <t t-if="i.state == 'cancel'">
-                                <span class="label label-danger label-text-align"><i class="fa fa-fw fa-times"/> Cancelled</span>
+                                <span class="label label-danger label-text-align"><span class="fa fa-fw fa-times"> Cancelled</span></span>
                             </t>
                             <t t-if="i.state in ['draft', 'waiting', 'confirmed', 'assigned']">
-                                <span class="label label-info label-text-align"><i class="fa fa-fw fa-clock-o"/> Preparation</span>
+                                <span class="label label-info label-text-align"><span class="fa fa-fw fa-clock-o"> Preparation</span></span>
                             </t>
                         </div>
                     </t>
diff --git a/addons/sale_stock/views/stock_config_settings_views.xml b/addons/sale_stock/views/stock_config_settings_views.xml
index 3b07c6542b98..040572b94e7f 100644
--- a/addons/sale_stock/views/stock_config_settings_views.xml
+++ b/addons/sale_stock/views/stock_config_settings_views.xml
@@ -41,7 +41,7 @@
                     </div>
                     <div class="o_setting_right_pane">
                         <label for="use_security_lead"/>
-                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." groups="base.group_multi_company"/>
+                        <span class="fa fa-lg fa-building-o" title="Values set here are company-specific." role="img" aria-label="Values set here are company-specific." groups="base.group_multi_company"/>
                         <div class="text-muted">
                             Schedule deliveries earlier to avoid delays
                         </div>
@@ -56,4 +56,4 @@
         </field>
     </record>
 
-</odoo>
\ No newline at end of file
+</odoo>
diff --git a/addons/sale_stock/views/stock_views.xml b/addons/sale_stock/views/stock_views.xml
index 196b8e8aa770..1a39a3e96e71 100644
--- a/addons/sale_stock/views/stock_views.xml
+++ b/addons/sale_stock/views/stock_views.xml
@@ -8,7 +8,7 @@
         </template>
 
         <template id="exception_on_so">
-            <div class="alert alert-warning"> 
+            <div class="alert alert-warning" role="alert"> 
                 Exception(s) occurred on the sale order(s):
                 <t t-foreach="sale_order_ids" t-as="sale_order">
                     <a href="#" data-oe-model="sale.order" t-att-data-oe-id="sale_order.id"><t t-esc="sale_order.name"/></a>.
@@ -42,7 +42,7 @@
         </template>
 
         <template id="exception_on_picking">
-            <div class="alert alert-warning"> 
+            <div class="alert alert-warning" role="alert"> 
                 Exception(s) occurred on the picking:
                 <a href="#" data-oe-model="stock.picking" t-att-data-oe-id="origin_picking.id"><t t-esc="origin_picking.name"/></a>.
                 Manual actions may be needed.
diff --git a/addons/sale_timesheet/views/hr_timesheet_templates.xml b/addons/sale_timesheet/views/hr_timesheet_templates.xml
index 5503066c3c31..875d797fcb98 100644
--- a/addons/sale_timesheet/views/hr_timesheet_templates.xml
+++ b/addons/sale_timesheet/views/hr_timesheet_templates.xml
@@ -26,7 +26,7 @@
                             <div class="o_timesheet_plan_stat_buttons oe_button_box">
                                 <t t-foreach="stat_buttons" t-as="stat_button">
                                     <button class="btn btn-sm oe_stat_button" t-att-data-domain="stat_button['domain']" t-att-data-res-model="stat_button['res_model']">
-                                        <div t-attf-class="fa fa-fw o_button_icon #{stat_button['icon']}"></div>
+                                        <div t-attf-class="fa fa-fw o_button_icon #{stat_button['icon']}" role="img" aria-label="Statistics" title="Statistics"></div>
                                         <div name="task_count" class="o_field_widget o_stat_info o_readonly_modifier" t-att-title="stat_button['name']">
                                             <span class="o_stat_value" t-if="stat_button.get('count')">
                                                 <t t-esc="stat_button['count']"/>
diff --git a/addons/sale_timesheet/views/res_config_settings_views.xml b/addons/sale_timesheet/views/res_config_settings_views.xml
index 3d5dafd454cc..16102a8b2ce9 100644
--- a/addons/sale_timesheet/views/res_config_settings_views.xml
+++ b/addons/sale_timesheet/views/res_config_settings_views.xml
@@ -12,7 +12,7 @@
                 <div name="timesheet_billing" class="row mt16 o_settings_container" title="Sell services (e.g. project, maintenance), record time spent using Timesheets app and invoice them based on a fixed price (ordered quantity) or on the time spent (delivered quantity)">
                     <div class="col-xs-12 col-md-6 o_setting_box">
                         <div class="o_setting_right_pane">
-                            <label string="Time Billing"/>
+                            <span class="o_form_label">Time Billing</span>
                             <div class="text-muted">
                                 Sell services and invoice time spent
                             </div>
diff --git a/addons/sales_team/views/crm_team_views.xml b/addons/sales_team/views/crm_team_views.xml
index df971e6caa37..925c7651efa9 100644
--- a/addons/sales_team/views/crm_team_views.xml
+++ b/addons/sales_team/views/crm_team_views.xml
@@ -77,11 +77,11 @@
                                             <t t-name="kanban-box">
                                                 <div class="oe_kanban_global_click" style="max-width: 200px">
                                                     <div class="o_kanban_record_top">
-                                                        <img t-att-src="kanban_image('res.users', 'image_small', record.id.raw_value)" height="40" width="40" class="oe_avatar oe_kanban_avatar_smallbox mb0"/>
+                                                        <img t-att-src="kanban_image('res.users', 'image_small', record.id.raw_value)" height="40" width="40" class="oe_avatar oe_kanban_avatar_smallbox mb0" alt="Avatar"/>
                                                         <div class="o_kanban_record_headings ml8">
                                                             <strong class="o_kanban_record_title"><field name="name"/></strong>
                                                         </div>
-                                                        <a t-if="! read_only_mode" type="delete" class="text-danger">
+                                                        <a t-if="! read_only_mode" type="delete" class="text-danger" aria-label="Delete" title="Delete">
                                                             <i class="fa fa-times"></i>
                                                         </a>
                                                     </div>
diff --git a/addons/sales_team/views/sales_team_dashboard.xml b/addons/sales_team/views/sales_team_dashboard.xml
index 18f3ade00136..ffdac9852ed7 100644
--- a/addons/sales_team/views/sales_team_dashboard.xml
+++ b/addons/sales_team/views/sales_team_dashboard.xml
@@ -20,7 +20,7 @@
                                     <div class="o_primary"><field name="name"/></div>
                                 </div>
                                 <div class="o_kanban_manage_button_section">
-                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                    <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                 </div>
                             </div>
                             <div class="container o_kanban_card_content">
@@ -41,35 +41,35 @@
                                     <div class="col-xs-12 o_kanban_primary_bottom bottom_block">
                                     </div>
                                 </div>
-                            </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                            </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                 <div class="row">
                                     <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_view">
-                                        <div class="o_kanban_card_manage_title">
+                                        <div role="menuitem" class="o_kanban_card_manage_title">
                                             <span>View</span>
                                         </div>
                                     </div>
                                     <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_new">
-                                        <div class="o_kanban_card_manage_title">
+                                        <div role="menuitem" class="o_kanban_card_manage_title">
                                             <span>New</span>
                                         </div>
                                     </div>
                                     <div class="col-xs-4 o_kanban_card_manage_section o_kanban_manage_reports">
-                                        <div class="o_kanban_card_manage_title">
+                                        <div role="menuitem" class="o_kanban_card_manage_title">
                                             <span>Reporting</span>
                                         </div>
                                     </div>
                                 </div>
 
                                 <div t-if="widget.editable" class="o_kanban_card_manage_settings row" groups="sales_team.group_sale_manager">
-                                    <div class="col-xs-8">
-                                        <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                    <div role="menuitem" aria-haspopup="true" class="col-xs-8">
+                                        <ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
                                     </div>
-                                    <div class="col-xs-4 text-right">
+                                    <div role="menuitem" class="col-xs-4 text-right">
                                         <a type="edit">Settings</a>
                                     </div>
                                 </div>
                                 <div class="row mb16">
-                                    <div class="col-xs-6">
+                                    <div role="menuitem" class="col-xs-6">
                                         <field name="is_favorite" widget="boolean_favorite" />
                                     </div>
                                 </div>
diff --git a/addons/sms/static/src/xml/sms_widget.xml b/addons/sms/static/src/xml/sms_widget.xml
index 46ac81f28854..93c361cbd89f 100644
--- a/addons/sms/static/src/xml/sms_widget.xml
+++ b/addons/sms/static/src/xml/sms_widget.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <templates>
     <t t-name="sms.sms_count">
-        <span class="pull-right"><span class="text-muted o_sms_count"></span> <a href="https://iap-services.odoo.com/iap/sms/pricing" target="_blank" class="fa fa-lg fa-info"/></span>
+        <span class="pull-right"><span class="text-muted o_sms_count"></span> <a href="https://iap-services.odoo.com/iap/sms/pricing" target="_blank" class="fa fa-lg fa-info" aria-label="SMS Pricing" title="SMS Pricing"/></span>
     </t>
 </templates>
diff --git a/addons/sms/views/res_partner_views.xml b/addons/sms/views/res_partner_views.xml
index a35d5f105165..33d20fd193e1 100644
--- a/addons/sms/views/res_partner_views.xml
+++ b/addons/sms/views/res_partner_views.xml
@@ -16,6 +16,8 @@
                         type="action"
                         name="%(sms.send_sms_form_action)d"
                         class="btn-xs btn-link mb4 fa fa-envelope-o"
+                        aria-label="Send SMS"
+                        title="Send SMS"
                         attrs="{'invisible':[('phone', '=', False)]}"
                         context="{'field_name': 'phone'}"
                     />
@@ -29,6 +31,8 @@
                         type="action"
                         name="%(sms.send_sms_form_action)d"
                         class="btn-xs btn-link mb4 fa fa-envelope-o"
+                        aria-label="Send SMS"
+                        title="Send SMS"
                         attrs="{'invisible':[('mobile', '=', False)]}"
                         context="{'field_name': 'mobile'}"
                         />
diff --git a/addons/stock/report/report_location_barcode.xml b/addons/stock/report/report_location_barcode.xml
index 7759058e737e..7cf706d04677 100644
--- a/addons/stock/report/report_location_barcode.xml
+++ b/addons/stock/report/report_location_barcode.xml
@@ -14,7 +14,7 @@
             <t t-foreach="page_docs" t-as="o">
                 <t t-if="o.barcode"><t t-set="content" t-value="o.barcode"/></t>
                 <t t-if="not o.barcode"><t t-set="content" t-value="o.name"/></t>
-                <img class="barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s&amp;humanreadable=1' % ('Code128', content, 600, 100)"/>
+                <img class="barcode" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s&amp;humanreadable=1' % ('Code128', content, 600, 100)" alt="Barcode"/>
             </t>
         </div>
     </t>
diff --git a/addons/stock/report/report_lot_barcode.xml b/addons/stock/report/report_lot_barcode.xml
index 1728782a2efa..259ba9f904cd 100644
--- a/addons/stock/report/report_lot_barcode.xml
+++ b/addons/stock/report/report_lot_barcode.xml
@@ -27,13 +27,13 @@
                             </table>
                         </div>
                         <div class="col-xs-4">
-                            <img class="image" t-att-src="'data:image/png;base64,%s' % to_text(res_company.logo)" style="border:auto;"/>
+                            <img class="image" t-att-src="'data:image/png;base64,%s' % to_text(res_company.logo)" style="border:auto;" alt="Logo"/>
                         </div>
                     </div>
                     <div class="row">
                         <div class="col-xs-12 mt32">
                             <table class="table table-condensed" style="border-bottom: 3px solid black !important;"><thead><th> </th></thead></table>
-                            <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px"/>
+                            <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px" alt="Barcode"/>
                             <p class="text-center" t-field="o.name"></p>
                         </div>
                     </div>
@@ -43,4 +43,4 @@
     </t>
 </template>
 </data>
-</odoo>
\ No newline at end of file
+</odoo>
diff --git a/addons/stock/report/report_package_barcode.xml b/addons/stock/report/report_package_barcode.xml
index a36dc14db4ea..92e547053468 100644
--- a/addons/stock/report/report_package_barcode.xml
+++ b/addons/stock/report/report_package_barcode.xml
@@ -7,7 +7,7 @@
             <t>
                 <div class="page">
                     <div class="oe_structure"/>
-                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)"
+                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" alt="Barcode"
                         style="width:300px;height:50px" class="pull-right mb16"/>
                     <h1 t-field="o.name" class="mt0 pull-left"/>
                     <div class="row o_packaging_type" t-if="o.packaging_id">
@@ -59,7 +59,7 @@
                     <div class="oe_structure"/>
                     <div class="row">
                         <div class="col-xs-12 text-center">
-                            <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:600px;height:100px"/>
+                            <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:600px;height:100px" alt="Barcode"/>
                             <p t-field="o.name"  style="font-size:20px;"></p>
                         </div>
                     </div>
diff --git a/addons/stock/report/report_stockpicking_operations.xml b/addons/stock/report/report_stockpicking_operations.xml
index f12594093349..8b429cb96cad 100644
--- a/addons/stock/report/report_stockpicking_operations.xml
+++ b/addons/stock/report/report_stockpicking_operations.xml
@@ -9,7 +9,7 @@
                         <div class="page">
                             <div class="row mb16">
                                 <div class="col-xs-4 pull-right" name="right_box">
-                                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px;"/>
+                                    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px;" alt="Barcode"/>
                                 </div>
                             </div>
                             <div class="row">
@@ -116,15 +116,15 @@
                                                     </div>
                                                 </td>
                                                 <td width="15%" class=" text-center h6" t-if="has_serial_number">
-                                                    <img t-if="has_serial_number and (ml.lot_id or ml.lot_name)" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s&amp;humanreadable=1' % ('Code128', ml.lot_id.name, 600, 100)" style="width:100%;height:35px;"/>
+                                                    <img t-if="has_serial_number and (ml.lot_id or ml.lot_name)" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s&amp;humanreadable=1' % ('Code128', ml.lot_id.name, 600, 100)" style="width:100%;height:35px;" alt="Barcode"/>
 
                                                 </td>
                                                 <td width="15%" class="text-center" t-if="has_barcode">
                                                     <t t-if="product_barcode != move.product_id.barcode">
                                                         <span t-if="move.product_id and move.product_id.barcode">
-                                                            <img t-if="len(move.product_id.barcode) == 13" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN13', move.product_id.barcode, 600, 100)" style="width:100%;height:35px"/>
-                                                            <img t-elif="len(move.product_id.barcode) == 8" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN8', move.product_id.barcode, 600, 100)" style="width:100%;height:35px"/>
-                                                            <img t-else="" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', move.product_id.barcode, 600, 100)" style="width:100%;height:35px"/>
+                                                            <img t-if="len(move.product_id.barcode) == 13" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN13', move.product_id.barcode, 600, 100)" style="width:100%;height:35px" alt="Barcode"/>
+                                                            <img t-elif="len(move.product_id.barcode) == 8" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('EAN8', move.product_id.barcode, 600, 100)" style="width:100%;height:35px" alt="Barcode"/>
+                                                            <img t-else="" t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', move.product_id.barcode, 600, 100)" style="width:100%;height:35px" alt="Barcode"/>
 
                                                         </span>
                                                         <t t-set="product_barcode" t-value="move.product_id.barcode"/>
@@ -148,7 +148,7 @@
                                     <tr t-foreach="o.package_level_ids.sorted(key=lambda p: p.package_id.name)" t-as="package">
                                         <t t-set="package" t-value="package.with_context({'picking_id':o.id})" />
                                         <td><span t-field="package.package_id.name"/></td>
-                                        <td><img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', package.package_id.name, 600, 100)" style="width:300px    ;height:50px"/></td>
+                                        <td><img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('Code128', package.package_id.name, 600, 100)" style="width:300px    ;height:50px" alt="Barcode"/></td>
                                         <td><span t-field="package.location_id"/></td>
                                         <td><span t-field="package.location_dest_id"/></td>
                                     </tr>
diff --git a/addons/stock/static/src/xml/stock_traceability_report_backend.xml b/addons/stock/static/src/xml/stock_traceability_report_backend.xml
index e0ff61dc1d84..d6a30fb94143 100644
--- a/addons/stock/static/src/xml/stock_traceability_report_backend.xml
+++ b/addons/stock/static/src/xml/stock_traceability_report_backend.xml
@@ -6,16 +6,16 @@
         <button type="button" class='btn btn-primary btn-sm o_stock-widget-pdf'>PRINT</button>
     </t>
 
-    <div t-name='stockReports.errorModal' class="modal" id="editable_error" tabindex="-1" data-backdrop="static" role="dialog" aria-hidden="true" style="z-index:9999;">
+    <div role="dialog" t-name='stockReports.errorModal' class="modal" id="editable_error" tabindex="-1" data-backdrop="static" style="z-index:9999;">
         <div class="modal-dialog modal-sm">
             <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                <header class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                     <h3 class="modal-title">Error</h3>
-                </div>
-                <div class="modal-body">
+                </header>
+                <main class="modal-body">
                     <p id='insert_error' class='text-center'></p>
-                </div>
+                </main>
             </div>
         </div>
     </div>
diff --git a/addons/stock/static/src/xml/stock_traceability_report_line.xml b/addons/stock/static/src/xml/stock_traceability_report_line.xml
index 48d309d8a27e..4fafadc5a04d 100644
--- a/addons/stock/static/src/xml/stock_traceability_report_line.xml
+++ b/addons/stock/static/src/xml/stock_traceability_report_line.xml
@@ -3,11 +3,11 @@
 <templates>
 
     <t t-name="foldable">
-        <span t-att-class="'o_stock_reports_foldable ' + lineId + ' o_stock_reports_caret_icon'"><i class="fa fa-fw fa-caret-down"></i></span>
+        <span t-att-class="'o_stock_reports_foldable ' + lineId + ' o_stock_reports_caret_icon'"><i class="fa fa-fw fa-caret-down" role="img" aria-label="Fold" title="Fold"></i></span>
     </t>
 
     <t t-name="unfoldable">
-        <span t-att-class="'o_stock_reports_unfoldable ' + lineId + ' o_stock_reports_caret_icon'"><i class="fa fa-fw fa-caret-right"></i></span>
+        <span t-att-class="'o_stock_reports_unfoldable ' + lineId + ' o_stock_reports_caret_icon'"><i class="fa fa-fw fa-caret-right" role="img" aria-label="Unfold" title="Unfold"></i></span>
     </t>
 
     <t t-name="report_mrp_line">
@@ -33,7 +33,7 @@
                     <t t-if="column == 1">
                         <span t-att-style="space_td" t-att-class="domainClass"></span>
                         <t t-if="l.unfoldable">
-                            <span class="o_stock_reports_unfoldable o_stock_reports_caret_icon"><i class="fa fa-fw fa-caret-right"></i></span>
+                            <span class="o_stock_reports_unfoldable o_stock_reports_caret_icon"><i class="fa fa-fw fa-caret-right" role="img" aria-label="Unfold" title="Unfold"></i></span>
                         </t>
                     </t>
                     <t t-if="l.reference == c">
diff --git a/addons/stock/views/report_stock_traceability.xml b/addons/stock/views/report_stock_traceability.xml
index 8b2e2c7fc48d..6d717cd73781 100644
--- a/addons/stock/views/report_stock_traceability.xml
+++ b/addons/stock/views/report_stock_traceability.xml
@@ -24,10 +24,10 @@
                       <td t-att-data-id="a.get('id')" t-att-data-model="a['model']" t-att-data-model_id="a['model_id']" t-att-class="tdclass" t-att-data-level="a['level']">
                         <t t-if="column == 1">
                             <t t-if="a.get('unfoldable') and not a.get('is_used')">
-                                <span t-att-data-id="a['id']" class="o_stock_reports_unfoldable o_stock_reports_caret_icon"><i class="fa fa-fw fa-caret-right"></i></span>
+                                <span t-att-data-id="a['id']" class="o_stock_reports_unfoldable o_stock_reports_caret_icon"><i class="fa fa-fw fa-caret-right" role="img" aria-label="Unfold" title="Unfold"></i></span>
                             </t>
                             <t t-if="a.get('is_used')">
-                                <span class="o_stock_reports_stream" title="Traceability Report"><i class="fa fa-fw fa-level-up fa-rotate-270"></i></span>
+                                <span role="img" class="o_stock_reports_stream" title="Traceability Report" aria-label="Traceability Report"><i class="fa fa-fw fa-level-up fa-rotate-270"></i></span>
                             </t>
                         </t>
                         <t t-if="a['reference'] == c">
diff --git a/addons/stock/views/stock_inventory_views.xml b/addons/stock/views/stock_inventory_views.xml
index 37d72d168a37..e40566f33ded 100644
--- a/addons/stock/views/stock_inventory_views.xml
+++ b/addons/stock/views/stock_inventory_views.xml
@@ -97,7 +97,7 @@
                             </div>
                             <div class="o_kanban_record_bottom">
                                 <div class="oe_kanban_bottom_left">
-                                    <i class="fa fa-clock-o"/> <t t-esc="record.date.value"/>
+                                    <i class="fa fa-clock-o" role="img" aria-label="Date" title="Date"/> <t t-esc="record.date.value"/>
                                 </div>
                             </div>
                         </div>
diff --git a/addons/stock/views/stock_move_views.xml b/addons/stock/views/stock_move_views.xml
index f5f95765ea5e..4771536baaf7 100644
--- a/addons/stock/views/stock_move_views.xml
+++ b/addons/stock/views/stock_move_views.xml
@@ -456,7 +456,7 @@
                                     </div>
                                     <div class="col-xs-8">
                                         <span class="pull-right">
-                                            <i class="fa fa-clock-o"/> <field name="date"/>
+                                            <i class="fa fa-clock-o" role="img" aria-label="Date" title="Date"/> <field name="date"/>
                                         </span>
                                     </div>
                                 </div>
diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml
index fc836adb87f4..71e1635d3b46 100644
--- a/addons/stock/views/stock_picking_views.xml
+++ b/addons/stock/views/stock_picking_views.xml
@@ -640,7 +640,7 @@
                                             <div class="o_secondary"><field class="o_secondary"  name="warehouse_id"/></div>
                                         </div>
                                         <div class="o_kanban_manage_button_section">
-                                            <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" /></a>
+                                            <a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
                                         </div>
                                     </div>
                                     <div class="container o_kanban_card_content">
@@ -690,40 +690,40 @@
                                                 </div>
                                             </div>
                                         </div>
-                                    </div><div class="container o_kanban_card_manage_pane dropdown-menu">
+                                    </div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
                                         <div class="row">
                                             <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_view">
-                                                <div class="o_kanban_card_manage_title">
+                                                <div role="menuitem" class="o_kanban_card_manage_title">
                                                     <span>View</span>
                                                 </div>
-                                                <div>
+                                                <div role="menuitem">
                                                     <a name="get_stock_picking_action_picking_type" type="object">All</a>
                                                 </div>
-                                                <div>
+                                                <div role="menuitem">
                                                     <a name="%(action_picking_tree_ready)d" type="action">Ready</a>
                                                 </div>
-                                                <div>
+                                                <div role="menuitem">
                                                     <a name="get_action_picking_tree_waiting" type="object">Waiting</a>
                                                 </div>
                                             </div>
                                             <div class="col-xs-6 o_kanban_card_manage_section o_kanban_manage_new">
-                                                <div class="o_kanban_card_manage_title">
+                                                <div role="menuitem" class="o_kanban_card_manage_title">
                                                     <span>New</span>
                                                 </div>
-                                                <div>
+                                                <div role="menuitem">
                                                     <a name="%(action_picking_form)d" type="action" context="{'default_immediate_transfer': True}">Immediate Transfer</a>
                                                 </div>
-                                                <div>
+                                                <div role="menuitem">
                                                     <a name="%(action_picking_form)d" type="action">Planned Transfer</a>
                                                 </div>
                                             </div>
                                         </div>
 
                                         <div t-if="widget.editable" class="o_kanban_card_manage_settings row">
-                                            <div class="col-xs-8">
-                                                <ul class="oe_kanban_colorpicker" data-field="color"/>
+                                            <div class="col-xs-8" role="menuitem" aria-haspopup="true">
+                                                <ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
                                             </div>
-                                            <div class="col-xs-4 text-right">
+                                            <div role="menuitem" class="col-xs-4 text-right">
                                                 <a type="edit">Settings</a>
                                             </div>
                                         </div>
diff --git a/addons/stock/views/stock_scrap_views.xml b/addons/stock/views/stock_scrap_views.xml
index 6bde30ca512f..365442903e47 100644
--- a/addons/stock/views/stock_scrap_views.xml
+++ b/addons/stock/views/stock_scrap_views.xml
@@ -86,7 +86,7 @@
                                         <span t-esc="record.name.value"/>
                                     </strong>
                                     <strong t-if="record.date_expected.value" class="col-xs-6 text-right">
-                                        <i class="fa fa-clock-o"/><span t-esc="record.date_expected.value"/>
+                                        <i class="fa fa-clock-o" role="img" aria-label="Expected date" title="Expected date"/><span t-esc="record.date_expected.value"/>
                                     </strong>
                                     <div class="col-xs-12">
                                         <span t-esc="record.product_id.value"/>
diff --git a/addons/stock/views/stock_template.xml b/addons/stock/views/stock_template.xml
index 4ca47b3013d7..119fbd2ff6c7 100644
--- a/addons/stock/views/stock_template.xml
+++ b/addons/stock/views/stock_template.xml
@@ -102,7 +102,7 @@
     </template>
 
     <template id="exception_on_picking">
-        <div class="alert alert-warning"> Exception(s) occurred on the picking
+        <div class="alert alert-warning" role="alert"> Exception(s) occurred on the picking
             <a href="#" data-oe-model="stock.picking" t-att-data-oe-id="origin_picking.id"><t t-esc="origin_picking.name"/></a>.
             Manual actions may be needed.
             <div class="mt16">
diff --git a/addons/stock_account/views/stock_account_views.xml b/addons/stock_account/views/stock_account_views.xml
index 77747cdea5ce..0ee6b9bd7755 100644
--- a/addons/stock_account/views/stock_account_views.xml
+++ b/addons/stock_account/views/stock_account_views.xml
@@ -79,7 +79,7 @@
                     <field name="currency_id" invisible="1"/>
                     <field name="stock_value" sum="Stock Valuation" widget="monetary"/>
                     <field name="cost_method" invisible="1"/>
-                    <button name="action_valuation_at_date_details" type="object" icon="fa-info-circle" attrs="{'invisible': [('cost_method', '!=', 'fifo')]}" />
+                    <button name="action_valuation_at_date_details" type="object" icon="fa-info-circle" aria-label="Valuation" title="Valuation" attrs="{'invisible': [('cost_method', '!=', 'fifo')]}" />
                 </tree>
             </field>
         </record>
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 77362b076b9d..b904605ecd11 100644
--- a/addons/stock_landed_costs/views/stock_landed_cost_views.xml
+++ b/addons/stock_landed_costs/views/stock_landed_cost_views.xml
@@ -135,7 +135,7 @@
                                         </span>
                                     </div>
                                     <div class="col-xs-6">
-                                        <i class="fa fa-clock-o"/><span t-esc="record.date.value"/>
+                                        <i class="fa fa-clock-o" title="Date" role="img" aria-label="Date"/><span t-esc="record.date.value"/>
                                     </div>
                                     <div class="col-xs-6 text-right">
                                         <field name="account_journal_id"/>
diff --git a/addons/stock_picking_batch/views/stock_picking_batch_views.xml b/addons/stock_picking_batch/views/stock_picking_batch_views.xml
index 5666a0e10fd2..79d4bb30db7b 100644
--- a/addons/stock_picking_batch/views/stock_picking_batch_views.xml
+++ b/addons/stock_picking_batch/views/stock_picking_batch_views.xml
@@ -74,7 +74,7 @@
                             <div class="o_kanban_record_bottom">
                                 <div class="oe_kanban_bottom_left"/>
                                 <div class="oe_kanban_bottom_right">
-                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
+                                    <img t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)" t-att-title="record.user_id.value" t-att-alt="record.user_id.value" width="24" height="24" class="oe_kanban_avatar"/>
                                 </div>
                             </div>
                         </div>
diff --git a/addons/survey/views/survey_result.xml b/addons/survey/views/survey_result.xml
index a28c6d788905..02f66f1aa92d 100644
--- a/addons/survey/views/survey_result.xml
+++ b/addons/survey/views/survey_result.xml
@@ -7,11 +7,11 @@
             <div class="container js_surveyresult">
                 <t t-call="survey.back" />
                 <div class="jumbotron mt32">
-                    <h1><span t-field="survey.title" /> <span style="font-size:1.5em;" class="fa fa-bar-chart-o pull-right "/></h1>
+                    <h1><span t-field="survey.title" /> <span style="font-size:1.5em;" class="fa fa-bar-chart-o pull-right " role="img" aria-label="Chart" title="Chart"/></h1>
                     <div t-field="survey.description" class="oe_no_empty" />
                 </div>
                 <div class="panel panel-default hidden-print">
-                    <div class="panel-heading"><span class="fa fa-filter"></span>  Filters <span t-if="filter_display_data" class="pull-right text-primary clear_survey_filter"><i class="fa fa-times"></i> Clear All Filters</span></div>
+                    <div class="panel-heading"><span class="fa fa-filter"> Filters </span><span t-if="filter_display_data" class="pull-right text-primary clear_survey_filter"><i class="fa fa-times"> Clear All Filters</i></span></div>
                     <div class="panel-body">
                         <span t-if="filter_finish == True">
                             <span class="label label-default only_left_radius filter-all">All surveys</span><span class="label label-primary only_right_radius filter-finished">Finished surveys</span>
@@ -20,7 +20,7 @@
                             <span class="label label-primary only_left_radius filter-all">All surveys</span><span class="label label-default only_right_radius filter-finished">Finished surveys</span>
                         </span>
                         <span t-foreach="filter_display_data" t-as="filter_data">
-                            <span class="label label-primary only_left_radius"><i class="fa fa-filter"></i></span><span class="label label-primary no_radius" t-esc="filter_data['question_text']"></span><span class="label label-success only_right_radius" t-esc="' > '.join(filter_data['labels'])"></span>
+                            <span class="label label-primary only_left_radius"><i class="fa fa-filter" role="img" aria-label="Filter" title="Filter"></i></span><span class="label label-primary no_radius" t-esc="filter_data['question_text']"></span><span class="label label-success only_right_radius" t-esc="' > '.join(filter_data['labels'])"></span>
                         </span>
                     </div>
                 </div>
@@ -135,33 +135,33 @@
     <template id="result_choice" name="Choice Result">
         <div>
             <!-- Tabs -->
-            <ul class="nav nav-tabs hidden-print">
+            <ul class="nav nav-tabs hidden-print" role="tablist">
                 <li class="active" t-if="question.type != 'simple_choice'">
-                    <a t-att-href="'#graph_question_%d' % question.id" data-toggle="tab">
-                        <i class="fa fa-bar-chart-o"></i> Graph
+                    <a t-att-href="'#graph_question_%d' % question.id" t-att-aria-controls="'graph_question_%d' % question.id" data-toggle="tab" role="tab">
+                        <span class="fa fa-bar-chart-o"> Graph</span>
                     </a>
                 </li>
                 <li class="active" t-if="question.type == 'simple_choice'">
-                    <a t-att-href="'#graph_question_%d' % question.id" data-toggle="tab">
-                        <i class="fa fa-bar-chart-o"></i> Pie Chart
+                    <a t-att-href="'#graph_question_%d' % question.id" t-att-aria-controls="'graph_question_%d' % question.id" data-toggle="tab" role="tab">
+                        <span class="fa fa-bar-chart-o"> Pie Chart</span>
                     </a>
                 </li>
                 <li>
-                    <a t-att-href="'#data_question_%d' % question.id" data-toggle="tab">
-                        <i class="fa fa-list-alt"></i> Data
+                    <a t-att-href="'#data_question_%d' % question.id" t-att-aria-controls="'data_question_%d' % question.id" data-toggle="tab" role="tab">
+                        <span class="fa fa-list-alt"> Data</span>
                     </a>
                 </li>
             </ul>
             <div class="tab-content">
-                <div class="tab-pane active survey_graph" t-if="question.type != 'simple_choice'" t-att-id="'graph_question_%d' % question.id" t-att-data-question_id="question.id" data-graph_type="bar" t-att-graph-data="graph_data">
+                <div role="tabpanel" class="tab-pane active survey_graph" t-if="question.type != 'simple_choice'" t-att-id="'graph_question_%d' % question.id" t-att-data-question_id="question.id" data-graph_type="bar" t-att-graph-data="graph_data">
                     <!-- svg element for drawing bar chart -->
                     <svg style="height:20em"></svg>
                 </div>
-                <div class="tab-pane active survey_graph" t-if="question.type == 'simple_choice'" t-att-id="'graph_question_%d' % question.id" t-att-data-question_id="question.id" data-graph_type="pie" t-att-graph-data="graph_data">
+                <div role="tabpanel" class="tab-pane active survey_graph" t-if="question.type == 'simple_choice'" t-att-id="'graph_question_%d' % question.id" t-att-data-question_id="question.id" data-graph_type="pie" t-att-graph-data="graph_data">
                     <!-- svg element for drawing pie chart -->
                     <svg style="height:20em"></svg>
                 </div>
-                <div class="tab-pane" t-att-id="'data_question_%d' % question.id">
+                <div role="tabpanel" class="tab-pane" t-att-id="'data_question_%d' % question.id">
                     <table class="table table-hover table-condensed">
                         <thead>
                             <tr>
@@ -177,7 +177,7 @@
                                 <td class="survey_answer">
                                     <span t-esc="round(user_input['count']*100.0/(input_summary['answered'] or 1),2)"></span> %
                                     <span t-esc="user_input['count']" class="label label-primary">Vote</span>
-                                    <i class="fa fa-filter text-primary invisible survey_filter" t-att-data-question_id="question.id" t-att-data-answer_id="user_input['answer_id']"></i>
+                                    <i class="fa fa-filter text-primary invisible survey_filter" t-att-data-question_id="question.id" t-att-data-answer_id="user_input['answer_id']" role="img" aria-label="Filter question" title="Filter question"/>
                                 </td>
                             </tr>
                         </tbody>
@@ -199,26 +199,24 @@
     <template id="result_matrix" name="Matrix Result">
         <t t-set="matrix_result" t-value="prepare_result"/>
         <!-- Tabs -->
-        <ul class="nav nav-tabs hidden-print">
+        <ul class="nav nav-tabs hidden-print" role="tablist">
             <li class="active">
-                <a t-att-href="'#graph_question_%d' % question.id" data-toggle="tab">
-                    <i class="fa fa-bar-chart"></i>
-                    Graph
+                <a t-att-href="'#graph_question_%d' % question.id" t-att-aria-controls="'graph_question_%d' % question.id" data-toggle="tab" role="tab">
+                    <span class="fa fa-bar-chart">Graph</span>
                 </a>
             </li>
             <li>
-                <a t-att-href="'#data_question_%d' % question.id" data-toggle="tab">
-                    <i class="fa fa-list-alt"></i>
-                    Data
+                <a t-att-href="'#data_question_%d' % question.id" t-att-aria-controls="'data_question_%d' % question.id" data-toggle="tab" role="tab">
+                    <span class="fa fa-list-alt">Data</span>
                 </a>
             </li>
         </ul>
         <div class="tab-content">
-            <div class="tab-pane active with-3d-shadow with-transitions survey_graph" t-att-id="'graph_question_%d' % question.id" t-att-data-question_id= "question.id" data-graph_type= "multi_bar" t-att-graph-data="graph_data">
+            <div role="tabpanel" class="tab-pane active with-3d-shadow with-transitions survey_graph" t-att-id="'graph_question_%d' % question.id" t-att-data-question_id= "question.id" data-graph_type= "multi_bar" t-att-graph-data="graph_data">
                 <!-- svg element for drawing Multibar chart -->
                 <svg style="height:20em"></svg>
             </div>
-            <div class="tab-pane" t-att-id="'data_question_%d' % question.id">
+            <div role="tabpanel" class="tab-pane" t-att-id="'data_question_%d' % question.id">
                 <table class="table table-hover table-condensed text-right">
                     <thead>
                         <tr>
@@ -235,7 +233,7 @@
                             </td>
                             <td class="survey_answer" t-foreach="matrix_result['answers']" t-as="answer_id">
                                 <span t-esc="round(matrix_result['result'][(row_id,answer_id)]*100.0/(input_summary['answered'] or 1),2)"></span> %
-                                <span class="label label-primary" t-esc="matrix_result['result'][(row_id,answer_id)]"></span><i class="fa fa-filter text-primary invisible survey_filter" t-att-data-question_id="question.id" t-att-data-row_id="row_id" t-att-data-answer_id="answer_id"></i>
+                                <span class="label label-primary" t-esc="matrix_result['result'][(row_id,answer_id)]"></span><i class="fa fa-filter text-primary invisible survey_filter" t-att-data-question_id="question.id" t-att-data-row_id="row_id" t-att-data-answer_id="answer_id" role="img" aria-label="Survey filter" title="Survey filter"></i>
                             </td>
                         </tr>
                     </tbody>
@@ -261,22 +259,21 @@
             <span class="label label-default only_left_radius">Minimum </span> <span class="label label-danger only_right_radius" t-esc="number_result['min']"></span>
             <span class="label label-default only_left_radius">Average </span> <span class="label label-warning only_right_radius" t-esc="number_result['average']"></span>
         </span>
-        <ul class="nav nav-tabs hidden-print">
+        <ul class="nav nav-tabs hidden-print" role="tablist">
             <li class="active">
-                <a t-att-href="'#most_common_%d' % question.id" data-toggle="tab">
-                    <i class="fa fa-list-ol"></i>
-                    Most Common <span t-esc="len(number_result['most_common'])"></span>
+                <a t-att-href="'#most_common_%d' % question.id" t-att-aria-controls="'most_common_%d' % question.id" data-toggle="tab" role="tab">
+                    <span class="fa fa-list-ol">Most Common </span>
+                    <span t-esc="len(number_result['most_common'])"></span>
                 </a>
             </li>
             <li>
-                <a t-att-href="'#data_question_%d' % question.id" data-toggle="tab">
-                    <i class="fa fa-list-alt"></i>
-                    All Data
+                <a t-att-href="'#data_question_%d' % question.id" t-att-aria-controls="'data_question_%d' % question.id" data-toggle="tab" role="tab">
+                    <span class="fa fa-list-alt">All Data</span>
                 </a>
             </li>
         </ul>
         <div class="tab-content">
-            <div class="tab-pane active with-3d-shadow with-transitions" t-att-id="'most_common_%d' % question.id">
+            <div role="tabpanel" class="tab-pane active with-3d-shadow with-transitions" t-att-id="'most_common_%d' % question.id">
                 <table class="table table-hover table-condensed">
                      <thead>
                          <tr>
@@ -296,7 +293,7 @@
                      </tbody>
                 </table>
             </div>
-            <div class="tab-pane" t-att-id="'data_question_%d' % question.id">
+            <div role="tabpanel" class="tab-pane" t-att-id="'data_question_%d' % question.id">
                 <table class="table table-hover table-condensed" t-att-id="'table_question_%d' % question.id">
                     <thead>
                         <tr>
@@ -323,7 +320,7 @@
                 <div class="jumbotron mt32">
                     <h2 class="text-muted">
                         <span>
-                            <i style="font-size:1.8em" class="fa fa-users pull-right"></i>
+                            <i style="font-size:1.8em" class="fa fa-users pull-right" role="img" aria-label="No answer" title="No answer"></i>
                         </span>
                         Sorry, No one answered this survey yet
                     </h2>
diff --git a/addons/survey/views/survey_templates.xml b/addons/survey/views/survey_templates.xml
index a8f0574b68a9..ec103a8867dc 100644
--- a/addons/survey/views/survey_templates.xml
+++ b/addons/survey/views/survey_templates.xml
@@ -99,7 +99,7 @@
     <!-- Back Button to redirect in form view of survey -->
     <template id="back" name="Back">
         <div groups="website.group_website_publisher" t-ignore="true" class="pull-right">
-            <a t-attf-href="/web#view_type=form&amp;model=survey.survey&amp;id=#{survey.id}&amp;action=survey.action_survey_form" class="btn btn-default">Back to Survey</a>
+            <a role="button" t-attf-href="/web#view_type=form&amp;model=survey.survey&amp;id=#{survey.id}&amp;action=survey.action_survey_form" class="btn btn-default">Back to Survey</a>
         </div>
     </template>
 
@@ -114,7 +114,7 @@
                 <header>
                     <div><title>Odoo</title></div>
                     <div class="text-center">
-                        <img t-attf-src="/web/binary/company_logo"/>
+                        <img t-attf-src="/web/binary/company_logo" alt="Logo"/>
                     </div>
                 </header>
                 <div id="wrap" class="oe_structure oe_empty"/>
@@ -146,7 +146,7 @@
                     <div class='jumbotron mt32'>
                         <h1 t-field='survey.title' />
                         <div t-field='survey.description' class="oe_no_empty"/>
-                        <a class="btn btn-primary btn-lg" t-att-href="'/survey/fill/%s/%s' % (slug(survey), token)">
+                        <a role="button" class="btn btn-primary btn-lg" t-att-href="'/survey/fill/%s/%s' % (slug(survey), token)">
                             Start Survey
                         </a>
                     </div>
@@ -197,7 +197,7 @@
                     <t t-if="question.type == 'simple_choice'"><t t-call="survey.simple_choice"/></t>
                     <t t-if="question.type == 'multiple_choice'"><t t-call="survey.multiple_choice"/></t>
                     <t t-if="question.type == 'matrix'"><t t-call="survey.matrix"/></t>
-                    <div class="js_errzone alert alert-danger" style="display:none;"></div>
+                    <div class="js_errzone alert alert-danger" style="display:none;" role="alert"></div>
                 </div>
             </t>
             <div class="text-center mt16 mb16">
@@ -208,15 +208,15 @@
         </form>
 
         <!-- Modal used to display error message, i.c.o. ajax error -->
-        <div class="modal fade" id="AJAXErrorModal" role="dialog" aria-labelledby="AJAXErrorModal" aria-hidden="true" >
+        <div role="dialog" class="modal fade" id="AJAXErrorModal" >
             <div class="modal-dialog">
                 <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                    <header class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                         <h4 class="modal-title">A problem has occured</h4>
-                    </div>
-                    <div class="modal-body"><p>Something went wrong while contacting survey server. <strong class="text-danger">Your answers have probably not been recorded.</strong> Try refreshing.</p></div>
-                    <div class="modal-footer"><button type="button" class="btn btn-primary" data-dismiss="modal">Close</button></div>
+                    </header>
+                    <main class="modal-body"><p>Something went wrong while contacting survey server. <strong class="text-danger">Your answers have probably not been recorded.</strong> Try refreshing.</p></main>
+                    <footer class="modal-footer"><button type="button" class="btn btn-primary" data-dismiss="modal">Close</button></footer>
                 </div>
             </div>
         </div>
@@ -363,7 +363,7 @@
                                         <t t-if="question.type == 'simple_choice'"><t t-call="survey.simple_choice"/></t>
                                         <t t-if="question.type == 'multiple_choice'"><t t-call="survey.multiple_choice"/></t>
                                         <t t-if="question.type == 'matrix'"><t t-call="survey.matrix"/></t>
-                                        <div class="js_errzone alert alert-danger" style="display:none;"></div>
+                                        <div class="js_errzone alert alert-danger" style="display:none;" role="alert"></div>
                                     </div>
                                 </t>
                                 <hr/>
diff --git a/addons/survey/views/survey_views.xml b/addons/survey/views/survey_views.xml
index cc966c7bf346..94db82a6a8ef 100644
--- a/addons/survey/views/survey_views.xml
+++ b/addons/survey/views/survey_views.xml
@@ -239,15 +239,15 @@
                         <div t-name="kanban-box" t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
                             <div class="o_dropdown_kanban dropdown" t-if="widget.editable">
 
-                                <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                     <span class="fa fa-ellipsis-v"/>
                                 </a>
-                                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                    <li><a type="edit">Edit Survey</a></li>
-                                    <li t-if="widget.deletable"><a type="delete">Delete</a></li>
-                                    <li class="divider"/>
-                                    <li>Color</li>
-                                    <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                <ul class="dropdown-menu" role="menu">
+                                    <li><a role="menuitem" type="edit">Edit Survey</a></li>
+                                    <li t-if="widget.deletable"><a role="menuitem" type="delete">Delete</a></li>
+                                    <li role="separator" class="divider"/>
+                                    <li role="separator">Color</li>
+                                    <li role="menuitem" aria-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                                 </ul>
                             </div>
                             <div class="o_kanban_record_top">
@@ -411,30 +411,30 @@
                                 <div class="col-md-6 col-md-offset-3 o_preview_questions">
                                     <!-- Multiple Lines Text Zone -->
                                     <div attrs="{'invisible': [('type', '!=', 'free_text')]}">
-                                            <i class="fa fa-align-justify fa-4x"/>
+                                            <i class="fa fa-align-justify fa-4x" role="img" aria-label="Multiple lines" title="Multiple Lines"/>
                                     </div>
                                     <!-- Single Line Text Zone -->
                                     <div attrs="{'invisible': [('type', '!=', 'textbox')]}">
-                                        <i class="fa fa-minus fa-4x"/>
+                                        <i class="fa fa-minus fa-4x" role="img" aria-label="Single Line" title="Single Line"/>
                                     </div>
                                     <!-- Numerical Value -->
                                     <div attrs="{'invisible': [('type', '!=', 'numerical_box')]}">
-                                        <i class="fa fa-2x">123..</i>
+                                        <i class="fa fa-2x" role="img" aria-label="Numeric" title="Numeric">123..</i>
                                     </div>
                                     <!-- Date and Time -->
                                     <div attrs="{'invisible': [('type', '!=', 'date')]}">
                                         <p class="o_datetime">YYYY-MM-DD
-                                            <i class="fa fa-calendar fa-2x"/>
+                                            <i class="fa fa-calendar fa-2x" role="img" aria-label="Calendar" title="Calendar"/>
                                         </p>
                                     </div>
                                     <!-- Multiple choice: only one answer -->
-                                    <div attrs="{'invisible': [('type', '!=', 'simple_choice')]}">
+                                    <div attrs="{'invisible': [('type', '!=', 'simple_choice')]}" role="img" aria-label="Multiple choice with one answer" title="Multiple choice with one answer">
                                         <div class="row"><i class="fa fa-circle-o  fa-lg"/> answer</div>
                                         <div class="row"><i class="fa fa-dot-circle-o fa-lg"/> answer</div>
                                         <div class="row"><i class="fa fa-circle-o  fa-lg"/> answer</div>
                                     </div>
                                     <!-- Multiple choice: multiple answers allowed -->
-                                    <div attrs="{'invisible': [('type', '!=', 'multiple_choice')]}">
+                                    <div attrs="{'invisible': [('type', '!=', 'multiple_choice')]}" role="img" aria-label="Multiple choice with multiple answers" title="Multiple choice with multiple answers">
                                         <div class="row"><i class="fa fa-square-o fa-lg"/> answer</div>
                                         <div class="row"><i class="fa fa-check-square-o fa-lg"/> answer</div>
                                         <div class="row"><i class="fa fa-square-o fa-lg"/> answer</div>
@@ -449,21 +449,21 @@
                                         </div>
                                         <div class="row o_matrix_row">
                                             <div class="col-md-3">Row1</div>
-                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg"/></div>
-                                            <div class="col-md-3"><i class="fa fa-dot-circle-o fa-lg"/></div>
-                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg"/></div>
+                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg" role="img" aria-label="Not checked" title="Not checked"/></div>
+                                            <div class="col-md-3"><i class="fa fa-dot-circle-o fa-lg" role="img" aria-label="Checked" title="Checked"/></div>
+                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg" role="img" aria-label="Not checked" title="Not checked"/></div>
                                         </div>
                                         <div class="row o_matrix_row">
                                             <div class="col-md-3">Row2</div>
-                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg"/></div>
-                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg"/></div>
-                                            <div class="col-md-3"><i class="fa fa-dot-circle-o fa-lg"/></div>
+                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg" role="img" aria-label="Not checked" title="Not checked"/></div>
+                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg" role="img" aria-label="Not checked" title="Not checked"/></div>
+                                            <div class="col-md-3"><i class="fa fa-dot-circle-o fa-lg" role="img" aria-label="Checked" title="Checked"/></div>
                                         </div>
                                         <div class="row o_matrix_row">
                                             <div class="col-md-3">Row3</div>
-                                            <div class="col-md-3"><i class="fa fa-dot-circle-o fa-lg"/></div>
-                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg"/></div>
-                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg"/></div>
+                                            <div class="col-md-3"><i class="fa fa-dot-circle-o fa-lg" role="img" aria-label="Checked" title="Checked"/></div>
+                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg" role="img" aria-label="Not checked" title="Not checked"/></div>
+                                            <div class="col-md-3"><i class="fa fa-circle-o fa-lg" role="img" aria-label="Not checked" title="Not checked"/></div>
                                         </div>
                                     </div>
                                 </div>
diff --git a/addons/theme_bootswatch/views/theme_bootswatch_templates.xml b/addons/theme_bootswatch/views/theme_bootswatch_templates.xml
index a27043dfb89f..142c9d5afc52 100644
--- a/addons/theme_bootswatch/views/theme_bootswatch_templates.xml
+++ b/addons/theme_bootswatch/views/theme_bootswatch_templates.xml
@@ -2,15 +2,15 @@
 <odoo>
     <template id="theme_customize" inherit_id="website.theme_customize">
         <xpath expr="div" position="replace">
-            <div id="theme_customize_modal" class="modal fade bs-example-modal-sm">
+            <div role="dialog" id="theme_customize_modal" class="modal fade bs-example-modal-sm">
                 <div class="modal-dialog">
                 <div class="modal-content">
                     <div class="loading_backdrop"></div>
-                        <div class="modal-header">
+                        <header class="modal-header">
                             <button type="button" class="close">×</button>
                             <h4 class="modal-title">Customize your theme</h4>
-                        </div>
-                        <div class="modal-body">
+                        </header>
+                        <main class="modal-body">
                             <div class="row">
                                 <div class="col-xs-4 col-xs-offset-4">
                                     <label class="checked">
@@ -79,7 +79,7 @@
                                     </label>
                                 </div>
                             </div>
-                        </div>
+                        </main>
                     </div>
                 </div>
             </div>
diff --git a/addons/theme_default/views/theme_default_templates.xml b/addons/theme_default/views/theme_default_templates.xml
index 5b98ef506d51..72382b058e0a 100644
--- a/addons/theme_default/views/theme_default_templates.xml
+++ b/addons/theme_default/views/theme_default_templates.xml
@@ -19,18 +19,18 @@
 
 <template id="customize_modal" inherit_id="website.theme_customize" name="theme_default modal">
   <xpath expr="div" position="replace">
-    <div id="theme_customize_modal" class="modal fade">
+    <div role="dialog" id="theme_customize_modal" class="modal fade">
       <div class="modal-dialog">
           <div class="modal-content">
 
               <div class="loading_backdrop"></div>
-              <div class="modal-header text-center">
+              <header class="modal-header text-center">
                   <button type="button" class="close">×</button>
-                  <!-- <a class="btn btn-primary" href="/web#return_label=Website&amp;action=website.action_module_theme">Click here to change theme</a> -->
+                  <!-- <a role="button" class="btn btn-primary" href="/web#return_label=Website&amp;action=website.action_module_theme">Click here to change theme</a> -->
                   <hr style="margin: 20px -10px 10px -10px;"/>
                   <h4 class="modal-title">Customize this default theme</h4>
-              </div>
-              <div class="modal-body">
+              </header>
+              <main class="modal-body">
                   <h5 class="modal-h5">LAYOUT</h5>
                   <table name="layout">
                       <tr>
@@ -114,7 +114,7 @@
                           </td>
                       </tr>
                   </table>
-              </div>
+              </main>
           </div>
       </div>
   </div>
diff --git a/addons/web/static/lib/fontawesome/css/font-awesome-suffix.css b/addons/web/static/lib/fontawesome/css/font-awesome-suffix.css
new file mode 100644
index 000000000000..f5651cf8e024
--- /dev/null
+++ b/addons/web/static/lib/fontawesome/css/font-awesome-suffix.css
@@ -0,0 +1,2145 @@
+/*!
+ *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  Suffix version by Odoo S.A.
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+   readers do not read off random characters that represent icons */
+.fa-suffix-glass:after {
+  content: "\f000";
+}
+.fa-suffix-music:after {
+  content: "\f001";
+}
+.fa-suffix-search:after {
+  content: "\f002";
+}
+.fa-suffix-envelope-o:after {
+  content: "\f003";
+}
+.fa-suffix-heart:after {
+  content: "\f004";
+}
+.fa-suffix-star:after {
+  content: "\f005";
+}
+.fa-suffix-star-o:after {
+  content: "\f006";
+}
+.fa-suffix-user:after {
+  content: "\f007";
+}
+.fa-suffix-film:after {
+  content: "\f008";
+}
+.fa-suffix-th-large:after {
+  content: "\f009";
+}
+.fa-suffix-th:after {
+  content: "\f00a";
+}
+.fa-suffix-th-list:after {
+  content: "\f00b";
+}
+.fa-suffix-check:after {
+  content: "\f00c";
+}
+.fa-suffix-remove:after,
+.fa-suffix-close:after,
+.fa-suffix-times:after {
+  content: "\f00d";
+}
+.fa-suffix-search-plus:after {
+  content: "\f00e";
+}
+.fa-suffix-search-minus:after {
+  content: "\f010";
+}
+.fa-suffix-power-off:after {
+  content: "\f011";
+}
+.fa-suffix-signal:after {
+  content: "\f012";
+}
+.fa-suffix-gear:after,
+.fa-suffix-cog:after {
+  content: "\f013";
+}
+.fa-suffix-trash-o:after {
+  content: "\f014";
+}
+.fa-suffix-home:after {
+  content: "\f015";
+}
+.fa-suffix-file-o:after {
+  content: "\f016";
+}
+.fa-suffix-clock-o:after {
+  content: "\f017";
+}
+.fa-suffix-road:after {
+  content: "\f018";
+}
+.fa-suffix-download:after {
+  content: "\f019";
+}
+.fa-suffix-arrow-circle-o-down:after {
+  content: "\f01a";
+}
+.fa-suffix-arrow-circle-o-up:after {
+  content: "\f01b";
+}
+.fa-suffix-inbox:after {
+  content: "\f01c";
+}
+.fa-suffix-play-circle-o:after {
+  content: "\f01d";
+}
+.fa-suffix-rotate-right:after,
+.fa-suffix-repeat:after {
+  content: "\f01e";
+}
+.fa-suffix-refresh:after {
+  content: "\f021";
+}
+.fa-suffix-list-alt:after {
+  content: "\f022";
+}
+.fa-suffix-lock:after {
+  content: "\f023";
+}
+.fa-suffix-flag:after {
+  content: "\f024";
+}
+.fa-suffix-headphones:after {
+  content: "\f025";
+}
+.fa-suffix-volume-off:after {
+  content: "\f026";
+}
+.fa-suffix-volume-down:after {
+  content: "\f027";
+}
+.fa-suffix-volume-up:after {
+  content: "\f028";
+}
+.fa-suffix-qrcode:after {
+  content: "\f029";
+}
+.fa-suffix-barcode:after {
+  content: "\f02a";
+}
+.fa-suffix-tag:after {
+  content: "\f02b";
+}
+.fa-suffix-tags:after {
+  content: "\f02c";
+}
+.fa-suffix-book:after {
+  content: "\f02d";
+}
+.fa-suffix-bookmark:after {
+  content: "\f02e";
+}
+.fa-suffix-print:after {
+  content: "\f02f";
+}
+.fa-suffix-camera:after {
+  content: "\f030";
+}
+.fa-suffix-font:after {
+  content: "\f031";
+}
+.fa-suffix-bold:after {
+  content: "\f032";
+}
+.fa-suffix-italic:after {
+  content: "\f033";
+}
+.fa-suffix-text-height:after {
+  content: "\f034";
+}
+.fa-suffix-text-width:after {
+  content: "\f035";
+}
+.fa-suffix-align-left:after {
+  content: "\f036";
+}
+.fa-suffix-align-center:after {
+  content: "\f037";
+}
+.fa-suffix-align-right:after {
+  content: "\f038";
+}
+.fa-suffix-align-justify:after {
+  content: "\f039";
+}
+.fa-suffix-list:after {
+  content: "\f03a";
+}
+.fa-suffix-dedent:after,
+.fa-suffix-outdent:after {
+  content: "\f03b";
+}
+.fa-suffix-indent:after {
+  content: "\f03c";
+}
+.fa-suffix-video-camera:after {
+  content: "\f03d";
+}
+.fa-suffix-photo:after,
+.fa-suffix-image:after,
+.fa-suffix-picture-o:after {
+  content: "\f03e";
+}
+.fa-suffix-pencil:after {
+  content: "\f040";
+}
+.fa-suffix-map-marker:after {
+  content: "\f041";
+}
+.fa-suffix-adjust:after {
+  content: "\f042";
+}
+.fa-suffix-tint:after {
+  content: "\f043";
+}
+.fa-suffix-edit:after,
+.fa-suffix-pencil-square-o:after {
+  content: "\f044";
+}
+.fa-suffix-share-square-o:after {
+  content: "\f045";
+}
+.fa-suffix-check-square-o:after {
+  content: "\f046";
+}
+.fa-suffix-arrows:after {
+  content: "\f047";
+}
+.fa-suffix-step-backward:after {
+  content: "\f048";
+}
+.fa-suffix-fast-backward:after {
+  content: "\f049";
+}
+.fa-suffix-backward:after {
+  content: "\f04a";
+}
+.fa-suffix-play:after {
+  content: "\f04b";
+}
+.fa-suffix-pause:after {
+  content: "\f04c";
+}
+.fa-suffix-stop:after {
+  content: "\f04d";
+}
+.fa-suffix-forward:after {
+  content: "\f04e";
+}
+.fa-suffix-fast-forward:after {
+  content: "\f050";
+}
+.fa-suffix-step-forward:after {
+  content: "\f051";
+}
+.fa-suffix-eject:after {
+  content: "\f052";
+}
+.fa-suffix-chevron-left:after {
+  content: "\f053";
+}
+.fa-suffix-chevron-right:after {
+  content: "\f054";
+}
+.fa-suffix-plus-circle:after {
+  content: "\f055";
+}
+.fa-suffix-minus-circle:after {
+  content: "\f056";
+}
+.fa-suffix-times-circle:after {
+  content: "\f057";
+}
+.fa-suffix-check-circle:after {
+  content: "\f058";
+}
+.fa-suffix-question-circle:after {
+  content: "\f059";
+}
+.fa-suffix-info-circle:after {
+  content: "\f05a";
+}
+.fa-suffix-crosshairs:after {
+  content: "\f05b";
+}
+.fa-suffix-times-circle-o:after {
+  content: "\f05c";
+}
+.fa-suffix-check-circle-o:after {
+  content: "\f05d";
+}
+.fa-suffix-ban:after {
+  content: "\f05e";
+}
+.fa-suffix-arrow-left:after {
+  content: "\f060";
+}
+.fa-suffix-arrow-right:after {
+  content: "\f061";
+}
+.fa-suffix-arrow-up:after {
+  content: "\f062";
+}
+.fa-suffix-arrow-down:after {
+  content: "\f063";
+}
+.fa-suffix-mail-forward:after,
+.fa-suffix-share:after {
+  content: "\f064";
+}
+.fa-suffix-expand:after {
+  content: "\f065";
+}
+.fa-suffix-compress:after {
+  content: "\f066";
+}
+.fa-suffix-plus:after {
+  content: "\f067";
+}
+.fa-suffix-minus:after {
+  content: "\f068";
+}
+.fa-suffix-asterisk:after {
+  content: "\f069";
+}
+.fa-suffix-exclamation-circle:after {
+  content: "\f06a";
+}
+.fa-suffix-gift:after {
+  content: "\f06b";
+}
+.fa-suffix-leaf:after {
+  content: "\f06c";
+}
+.fa-suffix-fire:after {
+  content: "\f06d";
+}
+.fa-suffix-eye:after {
+  content: "\f06e";
+}
+.fa-suffix-eye-slash:after {
+  content: "\f070";
+}
+.fa-suffix-warning:after,
+.fa-suffix-exclamation-triangle:after {
+  content: "\f071";
+}
+.fa-suffix-plane:after {
+  content: "\f072";
+}
+.fa-suffix-calendar:after {
+  content: "\f073";
+}
+.fa-suffix-random:after {
+  content: "\f074";
+}
+.fa-suffix-comment:after {
+  content: "\f075";
+}
+.fa-suffix-magnet:after {
+  content: "\f076";
+}
+.fa-suffix-chevron-up:after {
+  content: "\f077";
+}
+.fa-suffix-chevron-down:after {
+  content: "\f078";
+}
+.fa-suffix-retweet:after {
+  content: "\f079";
+}
+.fa-suffix-shopping-cart:after {
+  content: "\f07a";
+}
+.fa-suffix-folder:after {
+  content: "\f07b";
+}
+.fa-suffix-folder-open:after {
+  content: "\f07c";
+}
+.fa-suffix-arrows-v:after {
+  content: "\f07d";
+}
+.fa-suffix-arrows-h:after {
+  content: "\f07e";
+}
+.fa-suffix-bar-chart-o:after,
+.fa-suffix-bar-chart:after {
+  content: "\f080";
+}
+.fa-suffix-twitter-square:after {
+  content: "\f081";
+}
+.fa-suffix-facebook-square:after {
+  content: "\f082";
+}
+.fa-suffix-camera-retro:after {
+  content: "\f083";
+}
+.fa-suffix-key:after {
+  content: "\f084";
+}
+.fa-suffix-gears:after,
+.fa-suffix-cogs:after {
+  content: "\f085";
+}
+.fa-suffix-comments:after {
+  content: "\f086";
+}
+.fa-suffix-thumbs-o-up:after {
+  content: "\f087";
+}
+.fa-suffix-thumbs-o-down:after {
+  content: "\f088";
+}
+.fa-suffix-star-half:after {
+  content: "\f089";
+}
+.fa-suffix-heart-o:after {
+  content: "\f08a";
+}
+.fa-suffix-sign-out:after {
+  content: "\f08b";
+}
+.fa-suffix-linkedin-square:after {
+  content: "\f08c";
+}
+.fa-suffix-thumb-tack:after {
+  content: "\f08d";
+}
+.fa-suffix-external-link:after {
+  content: "\f08e";
+}
+.fa-suffix-sign-in:after {
+  content: "\f090";
+}
+.fa-suffix-trophy:after {
+  content: "\f091";
+}
+.fa-suffix-github-square:after {
+  content: "\f092";
+}
+.fa-suffix-upload:after {
+  content: "\f093";
+}
+.fa-suffix-lemon-o:after {
+  content: "\f094";
+}
+.fa-suffix-phone:after {
+  content: "\f095";
+}
+.fa-suffix-square-o:after {
+  content: "\f096";
+}
+.fa-suffix-bookmark-o:after {
+  content: "\f097";
+}
+.fa-suffix-phone-square:after {
+  content: "\f098";
+}
+.fa-suffix-twitter:after {
+  content: "\f099";
+}
+.fa-suffix-facebook-f:after,
+.fa-suffix-facebook:after {
+  content: "\f09a";
+}
+.fa-suffix-github:after {
+  content: "\f09b";
+}
+.fa-suffix-unlock:after {
+  content: "\f09c";
+}
+.fa-suffix-credit-card:after {
+  content: "\f09d";
+}
+.fa-suffix-feed:after,
+.fa-suffix-rss:after {
+  content: "\f09e";
+}
+.fa-suffix-hdd-o:after {
+  content: "\f0a0";
+}
+.fa-suffix-bullhorn:after {
+  content: "\f0a1";
+}
+.fa-suffix-bell:after {
+  content: "\f0f3";
+}
+.fa-suffix-certificate:after {
+  content: "\f0a3";
+}
+.fa-suffix-hand-o-right:after {
+  content: "\f0a4";
+}
+.fa-suffix-hand-o-left:after {
+  content: "\f0a5";
+}
+.fa-suffix-hand-o-up:after {
+  content: "\f0a6";
+}
+.fa-suffix-hand-o-down:after {
+  content: "\f0a7";
+}
+.fa-suffix-arrow-circle-left:after {
+  content: "\f0a8";
+}
+.fa-suffix-arrow-circle-right:after {
+  content: "\f0a9";
+}
+.fa-suffix-arrow-circle-up:after {
+  content: "\f0aa";
+}
+.fa-suffix-arrow-circle-down:after {
+  content: "\f0ab";
+}
+.fa-suffix-globe:after {
+  content: "\f0ac";
+}
+.fa-suffix-wrench:after {
+  content: "\f0ad";
+}
+.fa-suffix-tasks:after {
+  content: "\f0ae";
+}
+.fa-suffix-filter:after {
+  content: "\f0b0";
+}
+.fa-suffix-briefcase:after {
+  content: "\f0b1";
+}
+.fa-suffix-arrows-alt:after {
+  content: "\f0b2";
+}
+.fa-suffix-group:after,
+.fa-suffix-users:after {
+  content: "\f0c0";
+}
+.fa-suffix-chain:after,
+.fa-suffix-link:after {
+  content: "\f0c1";
+}
+.fa-suffix-cloud:after {
+  content: "\f0c2";
+}
+.fa-suffix-flask:after {
+  content: "\f0c3";
+}
+.fa-suffix-cut:after,
+.fa-suffix-scissors:after {
+  content: "\f0c4";
+}
+.fa-suffix-copy:after,
+.fa-suffix-files-o:after {
+  content: "\f0c5";
+}
+.fa-suffix-paperclip:after {
+  content: "\f0c6";
+}
+.fa-suffix-save:after,
+.fa-suffix-floppy-o:after {
+  content: "\f0c7";
+}
+.fa-suffix-square:after {
+  content: "\f0c8";
+}
+.fa-suffix-navicon:after,
+.fa-suffix-reorder:after,
+.fa-suffix-bars:after {
+  content: "\f0c9";
+}
+.fa-suffix-list-ul:after {
+  content: "\f0ca";
+}
+.fa-suffix-list-ol:after {
+  content: "\f0cb";
+}
+.fa-suffix-strikethrough:after {
+  content: "\f0cc";
+}
+.fa-suffix-underline:after {
+  content: "\f0cd";
+}
+.fa-suffix-table:after {
+  content: "\f0ce";
+}
+.fa-suffix-magic:after {
+  content: "\f0d0";
+}
+.fa-suffix-truck:after {
+  content: "\f0d1";
+}
+.fa-suffix-pinterest:after {
+  content: "\f0d2";
+}
+.fa-suffix-pinterest-square:after {
+  content: "\f0d3";
+}
+.fa-suffix-google-plus-square:after {
+  content: "\f0d4";
+}
+.fa-suffix-google-plus:after {
+  content: "\f0d5";
+}
+.fa-suffix-money:after {
+  content: "\f0d6";
+}
+.fa-suffix-caret-down:after {
+  content: "\f0d7";
+}
+.fa-suffix-caret-up:after {
+  content: "\f0d8";
+}
+.fa-suffix-caret-left:after {
+  content: "\f0d9";
+}
+.fa-suffix-caret-right:after {
+  content: "\f0da";
+}
+.fa-suffix-columns:after {
+  content: "\f0db";
+}
+.fa-suffix-unsorted:after,
+.fa-suffix-sort:after {
+  content: "\f0dc";
+}
+.fa-suffix-sort-down:after,
+.fa-suffix-sort-desc:after {
+  content: "\f0dd";
+}
+.fa-suffix-sort-up:after,
+.fa-suffix-sort-asc:after {
+  content: "\f0de";
+}
+.fa-suffix-envelope:after {
+  content: "\f0e0";
+}
+.fa-suffix-linkedin:after {
+  content: "\f0e1";
+}
+.fa-suffix-rotate-left:after,
+.fa-suffix-undo:after {
+  content: "\f0e2";
+}
+.fa-suffix-legal:after,
+.fa-suffix-gavel:after {
+  content: "\f0e3";
+}
+.fa-suffix-dashboard:after,
+.fa-suffix-tachometer:after {
+  content: "\f0e4";
+}
+.fa-suffix-comment-o:after {
+  content: "\f0e5";
+}
+.fa-suffix-comments-o:after {
+  content: "\f0e6";
+}
+.fa-suffix-flash:after,
+.fa-suffix-bolt:after {
+  content: "\f0e7";
+}
+.fa-suffix-sitemap:after {
+  content: "\f0e8";
+}
+.fa-suffix-umbrella:after {
+  content: "\f0e9";
+}
+.fa-suffix-paste:after,
+.fa-suffix-clipboard:after {
+  content: "\f0ea";
+}
+.fa-suffix-lightbulb-o:after {
+  content: "\f0eb";
+}
+.fa-suffix-exchange:after {
+  content: "\f0ec";
+}
+.fa-suffix-cloud-download:after {
+  content: "\f0ed";
+}
+.fa-suffix-cloud-upload:after {
+  content: "\f0ee";
+}
+.fa-suffix-user-md:after {
+  content: "\f0f0";
+}
+.fa-suffix-stethoscope:after {
+  content: "\f0f1";
+}
+.fa-suffix-suitcase:after {
+  content: "\f0f2";
+}
+.fa-suffix-bell-o:after {
+  content: "\f0a2";
+}
+.fa-suffix-coffee:after {
+  content: "\f0f4";
+}
+.fa-suffix-cutlery:after {
+  content: "\f0f5";
+}
+.fa-suffix-file-text-o:after {
+  content: "\f0f6";
+}
+.fa-suffix-building-o:after {
+  content: "\f0f7";
+}
+.fa-suffix-hospital-o:after {
+  content: "\f0f8";
+}
+.fa-suffix-ambulance:after {
+  content: "\f0f9";
+}
+.fa-suffix-medkit:after {
+  content: "\f0fa";
+}
+.fa-suffix-fighter-jet:after {
+  content: "\f0fb";
+}
+.fa-suffix-beer:after {
+  content: "\f0fc";
+}
+.fa-suffix-h-square:after {
+  content: "\f0fd";
+}
+.fa-suffix-plus-square:after {
+  content: "\f0fe";
+}
+.fa-suffix-angle-double-left:after {
+  content: "\f100";
+}
+.fa-suffix-angle-double-right:after {
+  content: "\f101";
+}
+.fa-suffix-angle-double-up:after {
+  content: "\f102";
+}
+.fa-suffix-angle-double-down:after {
+  content: "\f103";
+}
+.fa-suffix-angle-left:after {
+  content: "\f104";
+}
+.fa-suffix-angle-right:after {
+  content: "\f105";
+}
+.fa-suffix-angle-up:after {
+  content: "\f106";
+}
+.fa-suffix-angle-down:after {
+  content: "\f107";
+}
+.fa-suffix-desktop:after {
+  content: "\f108";
+}
+.fa-suffix-laptop:after {
+  content: "\f109";
+}
+.fa-suffix-tablet:after {
+  content: "\f10a";
+}
+.fa-suffix-mobile-phone:after,
+.fa-suffix-mobile:after {
+  content: "\f10b";
+}
+.fa-suffix-circle-o:after {
+  content: "\f10c";
+}
+.fa-suffix-quote-left:after {
+  content: "\f10d";
+}
+.fa-suffix-quote-right:after {
+  content: "\f10e";
+}
+.fa-suffix-spinner:after {
+  content: "\f110";
+}
+.fa-suffix-circle:after {
+  content: "\f111";
+}
+.fa-suffix-mail-reply:after,
+.fa-suffix-reply:after {
+  content: "\f112";
+}
+.fa-suffix-github-alt:after {
+  content: "\f113";
+}
+.fa-suffix-folder-o:after {
+  content: "\f114";
+}
+.fa-suffix-folder-open-o:after {
+  content: "\f115";
+}
+.fa-suffix-smile-o:after {
+  content: "\f118";
+}
+.fa-suffix-frown-o:after {
+  content: "\f119";
+}
+.fa-suffix-meh-o:after {
+  content: "\f11a";
+}
+.fa-suffix-gamepad:after {
+  content: "\f11b";
+}
+.fa-suffix-keyboard-o:after {
+  content: "\f11c";
+}
+.fa-suffix-flag-o:after {
+  content: "\f11d";
+}
+.fa-suffix-flag-checkered:after {
+  content: "\f11e";
+}
+.fa-suffix-terminal:after {
+  content: "\f120";
+}
+.fa-suffix-code:after {
+  content: "\f121";
+}
+.fa-suffix-mail-reply-all:after,
+.fa-suffix-reply-all:after {
+  content: "\f122";
+}
+.fa-suffix-star-half-empty:after,
+.fa-suffix-star-half-full:after,
+.fa-suffix-star-half-o:after {
+  content: "\f123";
+}
+.fa-suffix-location-arrow:after {
+  content: "\f124";
+}
+.fa-suffix-crop:after {
+  content: "\f125";
+}
+.fa-suffix-code-fork:after {
+  content: "\f126";
+}
+.fa-suffix-unlink:after,
+.fa-suffix-chain-broken:after {
+  content: "\f127";
+}
+.fa-suffix-question:after {
+  content: "\f128";
+}
+.fa-suffix-info:after {
+  content: "\f129";
+}
+.fa-suffix-exclamation:after {
+  content: "\f12a";
+}
+.fa-suffix-superscript:after {
+  content: "\f12b";
+}
+.fa-suffix-subscript:after {
+  content: "\f12c";
+}
+.fa-suffix-eraser:after {
+  content: "\f12d";
+}
+.fa-suffix-puzzle-piece:after {
+  content: "\f12e";
+}
+.fa-suffix-microphone:after {
+  content: "\f130";
+}
+.fa-suffix-microphone-slash:after {
+  content: "\f131";
+}
+.fa-suffix-shield:after {
+  content: "\f132";
+}
+.fa-suffix-calendar-o:after {
+  content: "\f133";
+}
+.fa-suffix-fire-extinguisher:after {
+  content: "\f134";
+}
+.fa-suffix-rocket:after {
+  content: "\f135";
+}
+.fa-suffix-maxcdn:after {
+  content: "\f136";
+}
+.fa-suffix-chevron-circle-left:after {
+  content: "\f137";
+}
+.fa-suffix-chevron-circle-right:after {
+  content: "\f138";
+}
+.fa-suffix-chevron-circle-up:after {
+  content: "\f139";
+}
+.fa-suffix-chevron-circle-down:after {
+  content: "\f13a";
+}
+.fa-suffix-html5:after {
+  content: "\f13b";
+}
+.fa-suffix-css3:after {
+  content: "\f13c";
+}
+.fa-suffix-anchor:after {
+  content: "\f13d";
+}
+.fa-suffix-unlock-alt:after {
+  content: "\f13e";
+}
+.fa-suffix-bullseye:after {
+  content: "\f140";
+}
+.fa-suffix-ellipsis-h:after {
+  content: "\f141";
+}
+.fa-suffix-ellipsis-v:after {
+  content: "\f142";
+}
+.fa-suffix-rss-square:after {
+  content: "\f143";
+}
+.fa-suffix-play-circle:after {
+  content: "\f144";
+}
+.fa-suffix-ticket:after {
+  content: "\f145";
+}
+.fa-suffix-minus-square:after {
+  content: "\f146";
+}
+.fa-suffix-minus-square-o:after {
+  content: "\f147";
+}
+.fa-suffix-level-up:after {
+  content: "\f148";
+}
+.fa-suffix-level-down:after {
+  content: "\f149";
+}
+.fa-suffix-check-square:after {
+  content: "\f14a";
+}
+.fa-suffix-pencil-square:after {
+  content: "\f14b";
+}
+.fa-suffix-external-link-square:after {
+  content: "\f14c";
+}
+.fa-suffix-share-square:after {
+  content: "\f14d";
+}
+.fa-suffix-compass:after {
+  content: "\f14e";
+}
+.fa-suffix-toggle-down:after,
+.fa-suffix-caret-square-o-down:after {
+  content: "\f150";
+}
+.fa-suffix-toggle-up:after,
+.fa-suffix-caret-square-o-up:after {
+  content: "\f151";
+}
+.fa-suffix-toggle-right:after,
+.fa-suffix-caret-square-o-right:after {
+  content: "\f152";
+}
+.fa-suffix-euro:after,
+.fa-suffix-eur:after {
+  content: "\f153";
+}
+.fa-suffix-gbp:after {
+  content: "\f154";
+}
+.fa-suffix-dollar:after,
+.fa-suffix-usd:after {
+  content: "\f155";
+}
+.fa-suffix-rupee:after,
+.fa-suffix-inr:after {
+  content: "\f156";
+}
+.fa-suffix-cny:after,
+.fa-suffix-rmb:after,
+.fa-suffix-yen:after,
+.fa-suffix-jpy:after {
+  content: "\f157";
+}
+.fa-suffix-ruble:after,
+.fa-suffix-rouble:after,
+.fa-suffix-rub:after {
+  content: "\f158";
+}
+.fa-suffix-won:after,
+.fa-suffix-krw:after {
+  content: "\f159";
+}
+.fa-suffix-bitcoin:after,
+.fa-suffix-btc:after {
+  content: "\f15a";
+}
+.fa-suffix-file:after {
+  content: "\f15b";
+}
+.fa-suffix-file-text:after {
+  content: "\f15c";
+}
+.fa-suffix-sort-alpha-asc:after {
+  content: "\f15d";
+}
+.fa-suffix-sort-alpha-desc:after {
+  content: "\f15e";
+}
+.fa-suffix-sort-amount-asc:after {
+  content: "\f160";
+}
+.fa-suffix-sort-amount-desc:after {
+  content: "\f161";
+}
+.fa-suffix-sort-numeric-asc:after {
+  content: "\f162";
+}
+.fa-suffix-sort-numeric-desc:after {
+  content: "\f163";
+}
+.fa-suffix-thumbs-up:after {
+  content: "\f164";
+}
+.fa-suffix-thumbs-down:after {
+  content: "\f165";
+}
+.fa-suffix-youtube-square:after {
+  content: "\f166";
+}
+.fa-suffix-youtube:after {
+  content: "\f167";
+}
+.fa-suffix-xing:after {
+  content: "\f168";
+}
+.fa-suffix-xing-square:after {
+  content: "\f169";
+}
+.fa-suffix-youtube-play:after {
+  content: "\f16a";
+}
+.fa-suffix-dropbox:after {
+  content: "\f16b";
+}
+.fa-suffix-stack-overflow:after {
+  content: "\f16c";
+}
+.fa-suffix-instagram:after {
+  content: "\f16d";
+}
+.fa-suffix-flickr:after {
+  content: "\f16e";
+}
+.fa-suffix-adn:after {
+  content: "\f170";
+}
+.fa-suffix-bitbucket:after {
+  content: "\f171";
+}
+.fa-suffix-bitbucket-square:after {
+  content: "\f172";
+}
+.fa-suffix-tumblr:after {
+  content: "\f173";
+}
+.fa-suffix-tumblr-square:after {
+  content: "\f174";
+}
+.fa-suffix-long-arrow-down:after {
+  content: "\f175";
+}
+.fa-suffix-long-arrow-up:after {
+  content: "\f176";
+}
+.fa-suffix-long-arrow-left:after {
+  content: "\f177";
+}
+.fa-suffix-long-arrow-right:after {
+  content: "\f178";
+}
+.fa-suffix-apple:after {
+  content: "\f179";
+}
+.fa-suffix-windows:after {
+  content: "\f17a";
+}
+.fa-suffix-android:after {
+  content: "\f17b";
+}
+.fa-suffix-linux:after {
+  content: "\f17c";
+}
+.fa-suffix-dribbble:after {
+  content: "\f17d";
+}
+.fa-suffix-skype:after {
+  content: "\f17e";
+}
+.fa-suffix-foursquare:after {
+  content: "\f180";
+}
+.fa-suffix-trello:after {
+  content: "\f181";
+}
+.fa-suffix-female:after {
+  content: "\f182";
+}
+.fa-suffix-male:after {
+  content: "\f183";
+}
+.fa-suffix-gittip:after,
+.fa-suffix-gratipay:after {
+  content: "\f184";
+}
+.fa-suffix-sun-o:after {
+  content: "\f185";
+}
+.fa-suffix-moon-o:after {
+  content: "\f186";
+}
+.fa-suffix-archive:after {
+  content: "\f187";
+}
+.fa-suffix-bug:after {
+  content: "\f188";
+}
+.fa-suffix-vk:after {
+  content: "\f189";
+}
+.fa-suffix-weibo:after {
+  content: "\f18a";
+}
+.fa-suffix-renren:after {
+  content: "\f18b";
+}
+.fa-suffix-pagelines:after {
+  content: "\f18c";
+}
+.fa-suffix-stack-exchange:after {
+  content: "\f18d";
+}
+.fa-suffix-arrow-circle-o-right:after {
+  content: "\f18e";
+}
+.fa-suffix-arrow-circle-o-left:after {
+  content: "\f190";
+}
+.fa-suffix-toggle-left:after,
+.fa-suffix-caret-square-o-left:after {
+  content: "\f191";
+}
+.fa-suffix-dot-circle-o:after {
+  content: "\f192";
+}
+.fa-suffix-wheelchair:after {
+  content: "\f193";
+}
+.fa-suffix-vimeo-square:after {
+  content: "\f194";
+}
+.fa-suffix-turkish-lira:after,
+.fa-suffix-try:after {
+  content: "\f195";
+}
+.fa-suffix-plus-square-o:after {
+  content: "\f196";
+}
+.fa-suffix-space-shuttle:after {
+  content: "\f197";
+}
+.fa-suffix-slack:after {
+  content: "\f198";
+}
+.fa-suffix-envelope-square:after {
+  content: "\f199";
+}
+.fa-suffix-wordpress:after {
+  content: "\f19a";
+}
+.fa-suffix-openid:after {
+  content: "\f19b";
+}
+.fa-suffix-institution:after,
+.fa-suffix-bank:after,
+.fa-suffix-university:after {
+  content: "\f19c";
+}
+.fa-suffix-mortar-board:after,
+.fa-suffix-graduation-cap:after {
+  content: "\f19d";
+}
+.fa-suffix-yahoo:after {
+  content: "\f19e";
+}
+.fa-suffix-google:after {
+  content: "\f1a0";
+}
+.fa-suffix-reddit:after {
+  content: "\f1a1";
+}
+.fa-suffix-reddit-square:after {
+  content: "\f1a2";
+}
+.fa-suffix-stumbleupon-circle:after {
+  content: "\f1a3";
+}
+.fa-suffix-stumbleupon:after {
+  content: "\f1a4";
+}
+.fa-suffix-delicious:after {
+  content: "\f1a5";
+}
+.fa-suffix-digg:after {
+  content: "\f1a6";
+}
+.fa-suffix-pied-piper-pp:after {
+  content: "\f1a7";
+}
+.fa-suffix-pied-piper-alt:after {
+  content: "\f1a8";
+}
+.fa-suffix-drupal:after {
+  content: "\f1a9";
+}
+.fa-suffix-joomla:after {
+  content: "\f1aa";
+}
+.fa-suffix-language:after {
+  content: "\f1ab";
+}
+.fa-suffix-fax:after {
+  content: "\f1ac";
+}
+.fa-suffix-building:after {
+  content: "\f1ad";
+}
+.fa-suffix-child:after {
+  content: "\f1ae";
+}
+.fa-suffix-paw:after {
+  content: "\f1b0";
+}
+.fa-suffix-spoon:after {
+  content: "\f1b1";
+}
+.fa-suffix-cube:after {
+  content: "\f1b2";
+}
+.fa-suffix-cubes:after {
+  content: "\f1b3";
+}
+.fa-suffix-behance:after {
+  content: "\f1b4";
+}
+.fa-suffix-behance-square:after {
+  content: "\f1b5";
+}
+.fa-suffix-steam:after {
+  content: "\f1b6";
+}
+.fa-suffix-steam-square:after {
+  content: "\f1b7";
+}
+.fa-suffix-recycle:after {
+  content: "\f1b8";
+}
+.fa-suffix-automobile:after,
+.fa-suffix-car:after {
+  content: "\f1b9";
+}
+.fa-suffix-cab:after,
+.fa-suffix-taxi:after {
+  content: "\f1ba";
+}
+.fa-suffix-tree:after {
+  content: "\f1bb";
+}
+.fa-suffix-spotify:after {
+  content: "\f1bc";
+}
+.fa-suffix-deviantart:after {
+  content: "\f1bd";
+}
+.fa-suffix-soundcloud:after {
+  content: "\f1be";
+}
+.fa-suffix-database:after {
+  content: "\f1c0";
+}
+.fa-suffix-file-pdf-o:after {
+  content: "\f1c1";
+}
+.fa-suffix-file-word-o:after {
+  content: "\f1c2";
+}
+.fa-suffix-file-excel-o:after {
+  content: "\f1c3";
+}
+.fa-suffix-file-powerpoint-o:after {
+  content: "\f1c4";
+}
+.fa-suffix-file-photo-o:after,
+.fa-suffix-file-picture-o:after,
+.fa-suffix-file-image-o:after {
+  content: "\f1c5";
+}
+.fa-suffix-file-zip-o:after,
+.fa-suffix-file-archive-o:after {
+  content: "\f1c6";
+}
+.fa-suffix-file-sound-o:after,
+.fa-suffix-file-audio-o:after {
+  content: "\f1c7";
+}
+.fa-suffix-file-movie-o:after,
+.fa-suffix-file-video-o:after {
+  content: "\f1c8";
+}
+.fa-suffix-file-code-o:after {
+  content: "\f1c9";
+}
+.fa-suffix-vine:after {
+  content: "\f1ca";
+}
+.fa-suffix-codepen:after {
+  content: "\f1cb";
+}
+.fa-suffix-jsfiddle:after {
+  content: "\f1cc";
+}
+.fa-suffix-life-bouy:after,
+.fa-suffix-life-buoy:after,
+.fa-suffix-life-saver:after,
+.fa-suffix-support:after,
+.fa-suffix-life-ring:after {
+  content: "\f1cd";
+}
+.fa-suffix-circle-o-notch:after {
+  content: "\f1ce";
+}
+.fa-suffix-ra:after,
+.fa-suffix-resistance:after,
+.fa-suffix-rebel:after {
+  content: "\f1d0";
+}
+.fa-suffix-ge:after,
+.fa-suffix-empire:after {
+  content: "\f1d1";
+}
+.fa-suffix-git-square:after {
+  content: "\f1d2";
+}
+.fa-suffix-git:after {
+  content: "\f1d3";
+}
+.fa-suffix-y-combinator-square:after,
+.fa-suffix-yc-square:after,
+.fa-suffix-hacker-news:after {
+  content: "\f1d4";
+}
+.fa-suffix-tencent-weibo:after {
+  content: "\f1d5";
+}
+.fa-suffix-qq:after {
+  content: "\f1d6";
+}
+.fa-suffix-wechat:after,
+.fa-suffix-weixin:after {
+  content: "\f1d7";
+}
+.fa-suffix-send:after,
+.fa-suffix-paper-plane:after {
+  content: "\f1d8";
+}
+.fa-suffix-send-o:after,
+.fa-suffix-paper-plane-o:after {
+  content: "\f1d9";
+}
+.fa-suffix-history:after {
+  content: "\f1da";
+}
+.fa-suffix-circle-thin:after {
+  content: "\f1db";
+}
+.fa-suffix-header:after {
+  content: "\f1dc";
+}
+.fa-suffix-paragraph:after {
+  content: "\f1dd";
+}
+.fa-suffix-sliders:after {
+  content: "\f1de";
+}
+.fa-suffix-share-alt:after {
+  content: "\f1e0";
+}
+.fa-suffix-share-alt-square:after {
+  content: "\f1e1";
+}
+.fa-suffix-bomb:after {
+  content: "\f1e2";
+}
+.fa-suffix-soccer-ball-o:after,
+.fa-suffix-futbol-o:after {
+  content: "\f1e3";
+}
+.fa-suffix-tty:after {
+  content: "\f1e4";
+}
+.fa-suffix-binoculars:after {
+  content: "\f1e5";
+}
+.fa-suffix-plug:after {
+  content: "\f1e6";
+}
+.fa-suffix-slideshare:after {
+  content: "\f1e7";
+}
+.fa-suffix-twitch:after {
+  content: "\f1e8";
+}
+.fa-suffix-yelp:after {
+  content: "\f1e9";
+}
+.fa-suffix-newspaper-o:after {
+  content: "\f1ea";
+}
+.fa-suffix-wifi:after {
+  content: "\f1eb";
+}
+.fa-suffix-calculator:after {
+  content: "\f1ec";
+}
+.fa-suffix-paypal:after {
+  content: "\f1ed";
+}
+.fa-suffix-google-wallet:after {
+  content: "\f1ee";
+}
+.fa-suffix-cc-visa:after {
+  content: "\f1f0";
+}
+.fa-suffix-cc-mastercard:after {
+  content: "\f1f1";
+}
+.fa-suffix-cc-discover:after {
+  content: "\f1f2";
+}
+.fa-suffix-cc-amex:after {
+  content: "\f1f3";
+}
+.fa-suffix-cc-paypal:after {
+  content: "\f1f4";
+}
+.fa-suffix-cc-stripe:after {
+  content: "\f1f5";
+}
+.fa-suffix-bell-slash:after {
+  content: "\f1f6";
+}
+.fa-suffix-bell-slash-o:after {
+  content: "\f1f7";
+}
+.fa-suffix-trash:after {
+  content: "\f1f8";
+}
+.fa-suffix-copyright:after {
+  content: "\f1f9";
+}
+.fa-suffix-at:after {
+  content: "\f1fa";
+}
+.fa-suffix-eyedropper:after {
+  content: "\f1fb";
+}
+.fa-suffix-paint-brush:after {
+  content: "\f1fc";
+}
+.fa-suffix-birthday-cake:after {
+  content: "\f1fd";
+}
+.fa-suffix-area-chart:after {
+  content: "\f1fe";
+}
+.fa-suffix-pie-chart:after {
+  content: "\f200";
+}
+.fa-suffix-line-chart:after {
+  content: "\f201";
+}
+.fa-suffix-lastfm:after {
+  content: "\f202";
+}
+.fa-suffix-lastfm-square:after {
+  content: "\f203";
+}
+.fa-suffix-toggle-off:after {
+  content: "\f204";
+}
+.fa-suffix-toggle-on:after {
+  content: "\f205";
+}
+.fa-suffix-bicycle:after {
+  content: "\f206";
+}
+.fa-suffix-bus:after {
+  content: "\f207";
+}
+.fa-suffix-ioxhost:after {
+  content: "\f208";
+}
+.fa-suffix-angellist:after {
+  content: "\f209";
+}
+.fa-suffix-cc:after {
+  content: "\f20a";
+}
+.fa-suffix-shekel:after,
+.fa-suffix-sheqel:after,
+.fa-suffix-ils:after {
+  content: "\f20b";
+}
+.fa-suffix-meanpath:after {
+  content: "\f20c";
+}
+.fa-suffix-buysellads:after {
+  content: "\f20d";
+}
+.fa-suffix-connectdevelop:after {
+  content: "\f20e";
+}
+.fa-suffix-dashcube:after {
+  content: "\f210";
+}
+.fa-suffix-forumbee:after {
+  content: "\f211";
+}
+.fa-suffix-leanpub:after {
+  content: "\f212";
+}
+.fa-suffix-sellsy:after {
+  content: "\f213";
+}
+.fa-suffix-shirtsinbulk:after {
+  content: "\f214";
+}
+.fa-suffix-simplybuilt:after {
+  content: "\f215";
+}
+.fa-suffix-skyatlas:after {
+  content: "\f216";
+}
+.fa-suffix-cart-plus:after {
+  content: "\f217";
+}
+.fa-suffix-cart-arrow-down:after {
+  content: "\f218";
+}
+.fa-suffix-diamond:after {
+  content: "\f219";
+}
+.fa-suffix-ship:after {
+  content: "\f21a";
+}
+.fa-suffix-user-secret:after {
+  content: "\f21b";
+}
+.fa-suffix-motorcycle:after {
+  content: "\f21c";
+}
+.fa-suffix-street-view:after {
+  content: "\f21d";
+}
+.fa-suffix-heartbeat:after {
+  content: "\f21e";
+}
+.fa-suffix-venus:after {
+  content: "\f221";
+}
+.fa-suffix-mars:after {
+  content: "\f222";
+}
+.fa-suffix-mercury:after {
+  content: "\f223";
+}
+.fa-suffix-intersex:after,
+.fa-suffix-transgender:after {
+  content: "\f224";
+}
+.fa-suffix-transgender-alt:after {
+  content: "\f225";
+}
+.fa-suffix-venus-double:after {
+  content: "\f226";
+}
+.fa-suffix-mars-double:after {
+  content: "\f227";
+}
+.fa-suffix-venus-mars:after {
+  content: "\f228";
+}
+.fa-suffix-mars-stroke:after {
+  content: "\f229";
+}
+.fa-suffix-mars-stroke-v:after {
+  content: "\f22a";
+}
+.fa-suffix-mars-stroke-h:after {
+  content: "\f22b";
+}
+.fa-suffix-neuter:after {
+  content: "\f22c";
+}
+.fa-suffix-genderless:after {
+  content: "\f22d";
+}
+.fa-suffix-facebook-official:after {
+  content: "\f230";
+}
+.fa-suffix-pinterest-p:after {
+  content: "\f231";
+}
+.fa-suffix-whatsapp:after {
+  content: "\f232";
+}
+.fa-suffix-server:after {
+  content: "\f233";
+}
+.fa-suffix-user-plus:after {
+  content: "\f234";
+}
+.fa-suffix-user-times:after {
+  content: "\f235";
+}
+.fa-suffix-hotel:after,
+.fa-suffix-bed:after {
+  content: "\f236";
+}
+.fa-suffix-viacoin:after {
+  content: "\f237";
+}
+.fa-suffix-train:after {
+  content: "\f238";
+}
+.fa-suffix-subway:after {
+  content: "\f239";
+}
+.fa-suffix-medium:after {
+  content: "\f23a";
+}
+.fa-suffix-yc:after,
+.fa-suffix-y-combinator:after {
+  content: "\f23b";
+}
+.fa-suffix-optin-monster:after {
+  content: "\f23c";
+}
+.fa-suffix-opencart:after {
+  content: "\f23d";
+}
+.fa-suffix-expeditedssl:after {
+  content: "\f23e";
+}
+.fa-suffix-battery-4:after,
+.fa-suffix-battery:after,
+.fa-suffix-battery-full:after {
+  content: "\f240";
+}
+.fa-suffix-battery-3:after,
+.fa-suffix-battery-three-quarters:after {
+  content: "\f241";
+}
+.fa-suffix-battery-2:after,
+.fa-suffix-battery-half:after {
+  content: "\f242";
+}
+.fa-suffix-battery-1:after,
+.fa-suffix-battery-quarter:after {
+  content: "\f243";
+}
+.fa-suffix-battery-0:after,
+.fa-suffix-battery-empty:after {
+  content: "\f244";
+}
+.fa-suffix-mouse-pointer:after {
+  content: "\f245";
+}
+.fa-suffix-i-cursor:after {
+  content: "\f246";
+}
+.fa-suffix-object-group:after {
+  content: "\f247";
+}
+.fa-suffix-object-ungroup:after {
+  content: "\f248";
+}
+.fa-suffix-sticky-note:after {
+  content: "\f249";
+}
+.fa-suffix-sticky-note-o:after {
+  content: "\f24a";
+}
+.fa-suffix-cc-jcb:after {
+  content: "\f24b";
+}
+.fa-suffix-cc-diners-club:after {
+  content: "\f24c";
+}
+.fa-suffix-clone:after {
+  content: "\f24d";
+}
+.fa-suffix-balance-scale:after {
+  content: "\f24e";
+}
+.fa-suffix-hourglass-o:after {
+  content: "\f250";
+}
+.fa-suffix-hourglass-1:after,
+.fa-suffix-hourglass-start:after {
+  content: "\f251";
+}
+.fa-suffix-hourglass-2:after,
+.fa-suffix-hourglass-half:after {
+  content: "\f252";
+}
+.fa-suffix-hourglass-3:after,
+.fa-suffix-hourglass-end:after {
+  content: "\f253";
+}
+.fa-suffix-hourglass:after {
+  content: "\f254";
+}
+.fa-suffix-hand-grab-o:after,
+.fa-suffix-hand-rock-o:after {
+  content: "\f255";
+}
+.fa-suffix-hand-stop-o:after,
+.fa-suffix-hand-paper-o:after {
+  content: "\f256";
+}
+.fa-suffix-hand-scissors-o:after {
+  content: "\f257";
+}
+.fa-suffix-hand-lizard-o:after {
+  content: "\f258";
+}
+.fa-suffix-hand-spock-o:after {
+  content: "\f259";
+}
+.fa-suffix-hand-pointer-o:after {
+  content: "\f25a";
+}
+.fa-suffix-hand-peace-o:after {
+  content: "\f25b";
+}
+.fa-suffix-trademark:after {
+  content: "\f25c";
+}
+.fa-suffix-registered:after {
+  content: "\f25d";
+}
+.fa-suffix-creative-commons:after {
+  content: "\f25e";
+}
+.fa-suffix-gg:after {
+  content: "\f260";
+}
+.fa-suffix-gg-circle:after {
+  content: "\f261";
+}
+.fa-suffix-tripadvisor:after {
+  content: "\f262";
+}
+.fa-suffix-odnoklassniki:after {
+  content: "\f263";
+}
+.fa-suffix-odnoklassniki-square:after {
+  content: "\f264";
+}
+.fa-suffix-get-pocket:after {
+  content: "\f265";
+}
+.fa-suffix-wikipedia-w:after {
+  content: "\f266";
+}
+.fa-suffix-safari:after {
+  content: "\f267";
+}
+.fa-suffix-chrome:after {
+  content: "\f268";
+}
+.fa-suffix-firefox:after {
+  content: "\f269";
+}
+.fa-suffix-opera:after {
+  content: "\f26a";
+}
+.fa-suffix-internet-explorer:after {
+  content: "\f26b";
+}
+.fa-suffix-tv:after,
+.fa-suffix-television:after {
+  content: "\f26c";
+}
+.fa-suffix-contao:after {
+  content: "\f26d";
+}
+.fa-suffix-500px:after {
+  content: "\f26e";
+}
+.fa-suffix-amazon:after {
+  content: "\f270";
+}
+.fa-suffix-calendar-plus-o:after {
+  content: "\f271";
+}
+.fa-suffix-calendar-minus-o:after {
+  content: "\f272";
+}
+.fa-suffix-calendar-times-o:after {
+  content: "\f273";
+}
+.fa-suffix-calendar-check-o:after {
+  content: "\f274";
+}
+.fa-suffix-industry:after {
+  content: "\f275";
+}
+.fa-suffix-map-pin:after {
+  content: "\f276";
+}
+.fa-suffix-map-signs:after {
+  content: "\f277";
+}
+.fa-suffix-map-o:after {
+  content: "\f278";
+}
+.fa-suffix-map:after {
+  content: "\f279";
+}
+.fa-suffix-commenting:after {
+  content: "\f27a";
+}
+.fa-suffix-commenting-o:after {
+  content: "\f27b";
+}
+.fa-suffix-houzz:after {
+  content: "\f27c";
+}
+.fa-suffix-vimeo:after {
+  content: "\f27d";
+}
+.fa-suffix-black-tie:after {
+  content: "\f27e";
+}
+.fa-suffix-fonticons:after {
+  content: "\f280";
+}
+.fa-suffix-reddit-alien:after {
+  content: "\f281";
+}
+.fa-suffix-edge:after {
+  content: "\f282";
+}
+.fa-suffix-credit-card-alt:after {
+  content: "\f283";
+}
+.fa-suffix-codiepie:after {
+  content: "\f284";
+}
+.fa-suffix-modx:after {
+  content: "\f285";
+}
+.fa-suffix-fort-awesome:after {
+  content: "\f286";
+}
+.fa-suffix-usb:after {
+  content: "\f287";
+}
+.fa-suffix-product-hunt:after {
+  content: "\f288";
+}
+.fa-suffix-mixcloud:after {
+  content: "\f289";
+}
+.fa-suffix-scribd:after {
+  content: "\f28a";
+}
+.fa-suffix-pause-circle:after {
+  content: "\f28b";
+}
+.fa-suffix-pause-circle-o:after {
+  content: "\f28c";
+}
+.fa-suffix-stop-circle:after {
+  content: "\f28d";
+}
+.fa-suffix-stop-circle-o:after {
+  content: "\f28e";
+}
+.fa-suffix-shopping-bag:after {
+  content: "\f290";
+}
+.fa-suffix-shopping-basket:after {
+  content: "\f291";
+}
+.fa-suffix-hashtag:after {
+  content: "\f292";
+}
+.fa-suffix-bluetooth:after {
+  content: "\f293";
+}
+.fa-suffix-bluetooth-b:after {
+  content: "\f294";
+}
+.fa-suffix-percent:after {
+  content: "\f295";
+}
+.fa-suffix-gitlab:after {
+  content: "\f296";
+}
+.fa-suffix-wpbeginner:after {
+  content: "\f297";
+}
+.fa-suffix-wpforms:after {
+  content: "\f298";
+}
+.fa-suffix-envira:after {
+  content: "\f299";
+}
+.fa-suffix-universal-access:after {
+  content: "\f29a";
+}
+.fa-suffix-wheelchair-alt:after {
+  content: "\f29b";
+}
+.fa-suffix-question-circle-o:after {
+  content: "\f29c";
+}
+.fa-suffix-blind:after {
+  content: "\f29d";
+}
+.fa-suffix-audio-description:after {
+  content: "\f29e";
+}
+.fa-suffix-volume-control-phone:after {
+  content: "\f2a0";
+}
+.fa-suffix-braille:after {
+  content: "\f2a1";
+}
+.fa-suffix-assistive-listening-systems:after {
+  content: "\f2a2";
+}
+.fa-suffix-asl-interpreting:after,
+.fa-suffix-american-sign-language-interpreting:after {
+  content: "\f2a3";
+}
+.fa-suffix-deafness:after,
+.fa-suffix-hard-of-hearing:after,
+.fa-suffix-deaf:after {
+  content: "\f2a4";
+}
+.fa-suffix-glide:after {
+  content: "\f2a5";
+}
+.fa-suffix-glide-g:after {
+  content: "\f2a6";
+}
+.fa-suffix-signing:after,
+.fa-suffix-sign-language:after {
+  content: "\f2a7";
+}
+.fa-suffix-low-vision:after {
+  content: "\f2a8";
+}
+.fa-suffix-viadeo:after {
+  content: "\f2a9";
+}
+.fa-suffix-viadeo-square:after {
+  content: "\f2aa";
+}
+.fa-suffix-snapchat:after {
+  content: "\f2ab";
+}
+.fa-suffix-snapchat-ghost:after {
+  content: "\f2ac";
+}
+.fa-suffix-snapchat-square:after {
+  content: "\f2ad";
+}
+.fa-suffix-pied-piper:after {
+  content: "\f2ae";
+}
+.fa-suffix-first-order:after {
+  content: "\f2b0";
+}
+.fa-suffix-yoast:after {
+  content: "\f2b1";
+}
+.fa-suffix-themeisle:after {
+  content: "\f2b2";
+}
+.fa-suffix-google-plus-circle:after,
+.fa-suffix-google-plus-official:after {
+  content: "\f2b3";
+}
+.fa-suffix-fa:after,
+.fa-suffix-font-awesome:after {
+  content: "\f2b4";
+}
+.fa-suffix-handshake-o:after {
+  content: "\f2b5";
+}
+.fa-suffix-envelope-open:after {
+  content: "\f2b6";
+}
+.fa-suffix-envelope-open-o:after {
+  content: "\f2b7";
+}
+.fa-suffix-linode:after {
+  content: "\f2b8";
+}
+.fa-suffix-address-book:after {
+  content: "\f2b9";
+}
+.fa-suffix-address-book-o:after {
+  content: "\f2ba";
+}
+.fa-suffix-vcard:after,
+.fa-suffix-address-card:after {
+  content: "\f2bb";
+}
+.fa-suffix-vcard-o:after,
+.fa-suffix-address-card-o:after {
+  content: "\f2bc";
+}
+.fa-suffix-user-circle:after {
+  content: "\f2bd";
+}
+.fa-suffix-user-circle-o:after {
+  content: "\f2be";
+}
+.fa-suffix-user-o:after {
+  content: "\f2c0";
+}
+.fa-suffix-id-badge:after {
+  content: "\f2c1";
+}
+.fa-suffix-drivers-license:after,
+.fa-suffix-id-card:after {
+  content: "\f2c2";
+}
+.fa-suffix-drivers-license-o:after,
+.fa-suffix-id-card-o:after {
+  content: "\f2c3";
+}
+.fa-suffix-quora:after {
+  content: "\f2c4";
+}
+.fa-suffix-free-code-camp:after {
+  content: "\f2c5";
+}
+.fa-suffix-telegram:after {
+  content: "\f2c6";
+}
+.fa-suffix-thermometer-4:after,
+.fa-suffix-thermometer:after,
+.fa-suffix-thermometer-full:after {
+  content: "\f2c7";
+}
+.fa-suffix-thermometer-3:after,
+.fa-suffix-thermometer-three-quarters:after {
+  content: "\f2c8";
+}
+.fa-suffix-thermometer-2:after,
+.fa-suffix-thermometer-half:after {
+  content: "\f2c9";
+}
+.fa-suffix-thermometer-1:after,
+.fa-suffix-thermometer-quarter:after {
+  content: "\f2ca";
+}
+.fa-suffix-thermometer-0:after,
+.fa-suffix-thermometer-empty:after {
+  content: "\f2cb";
+}
+.fa-suffix-shower:after {
+  content: "\f2cc";
+}
+.fa-suffix-bathtub:after,
+.fa-suffix-s15:after,
+.fa-suffix-bath:after {
+  content: "\f2cd";
+}
+.fa-suffix-podcast:after {
+  content: "\f2ce";
+}
+.fa-suffix-window-maximize:after {
+  content: "\f2d0";
+}
+.fa-suffix-window-minimize:after {
+  content: "\f2d1";
+}
+.fa-suffix-window-restore:after {
+  content: "\f2d2";
+}
+.fa-suffix-times-rectangle:after,
+.fa-suffix-window-close:after {
+  content: "\f2d3";
+}
+.fa-suffix-times-rectangle-o:after,
+.fa-suffix-window-close-o:after {
+  content: "\f2d4";
+}
+.fa-suffix-bandcamp:after {
+  content: "\f2d5";
+}
+.fa-suffix-grav:after {
+  content: "\f2d6";
+}
+.fa-suffix-etsy:after {
+  content: "\f2d7";
+}
+.fa-suffix-imdb:after {
+  content: "\f2d8";
+}
+.fa-suffix-ravelry:after {
+  content: "\f2d9";
+}
+.fa-suffix-eercast:after {
+  content: "\f2da";
+}
+.fa-suffix-microchip:after {
+  content: "\f2db";
+}
+.fa-suffix-snowflake-o:after {
+  content: "\f2dc";
+}
+.fa-suffix-superpowers:after {
+  content: "\f2dd";
+}
+.fa-suffix-wpexplorer:after {
+  content: "\f2de";
+}
+.fa-suffix-meetup:after {
+  content: "\f2e0";
+}
diff --git a/addons/web/static/lib/pdfjs/web/ui_utils.js b/addons/web/static/lib/pdfjs/web/ui_utils.js
index 7e798e342700..5480224846bc 100644
--- a/addons/web/static/lib/pdfjs/web/ui_utils.js
+++ b/addons/web/static/lib/pdfjs/web/ui_utils.js
@@ -348,6 +348,10 @@ var ProgressBar = (function ProgressBarClosure() {
       this.div.classList.remove('indeterminate');
       var progressSize = this.width * this._percent / 100;
       this.div.style.width = progressSize + this.units;
+      // Add attributes for screen readers and analysis tools
+      this.bar.setAttribute('aria-valuemin', 0);
+      this.bar.setAttribute('aria-valuemax', 100);
+      this.bar.setAttribute('aria-valuenow', this._percent);
     },
 
     get percent() {
@@ -377,6 +381,7 @@ var ProgressBar = (function ProgressBarClosure() {
       }
       this.visible = false;
       this.bar.classList.add('hidden');
+      this.bar.setAttribute('aria-hidden', "true")
       document.body.classList.remove('loadingInProgress');
     },
 
@@ -387,6 +392,7 @@ var ProgressBar = (function ProgressBarClosure() {
       this.visible = true;
       document.body.classList.add('loadingInProgress');
       this.bar.classList.remove('hidden');
+      this.bar.setAttribute('aria-hidden', "false")
     }
   };
 
diff --git a/addons/web/static/lib/qweb/qweb-test-attributes.xml b/addons/web/static/lib/qweb/qweb-test-attributes.xml
index e16ef8a3f0ee..b599b76b6295 100644
--- a/addons/web/static/lib/qweb/qweb-test-attributes.xml
+++ b/addons/web/static/lib/qweb/qweb-test-attributes.xml
@@ -5,9 +5,9 @@
     <result id="static"><![CDATA[<div foo="a" bar="b" baz="c"></div>]]></result>
 
     <t t-name="static-void">
-        <img src="/test.jpg"/>
+        <img src="/test.jpg" alt="Test"/>
     </t>
-    <result id="static-void"><![CDATA[<img src="/test.jpg"/>]]></result>
+    <result id="static-void"><![CDATA[<img src="/test.jpg" alt="Test"/>]]></result>
 
     <t t-name="fixed-literal">
         <div t-att-foo="'bar'"/>
diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js
index 94a0afaa32ac..6ce745399265 100644
--- a/addons/web/static/lib/qweb/qweb2.js
+++ b/addons/web/static/lib/qweb/qweb2.js
@@ -471,10 +471,10 @@ QWeb2.Engine = (function() {
                     if (this.debug && window.console) {
                         console.log(code);
                     }
-                    this.tools.exception("Error evaluating template: " + error, { template: name });
+                    this.tools.exception("Error evaluating template: " + error, { template: template });
                 }
                 if (!tcompiled) {
-                    this.tools.exception("Error evaluating template: (IE?)" + error, { template: name });
+                    this.tools.exception("Error evaluating template: (IE?)" + error, { template: template });
                 }
                 this.compiled_templates[template] = tcompiled;
                 return this.render(template, dict);
diff --git a/addons/web/static/src/js/core/dialog.js b/addons/web/static/src/js/core/dialog.js
index 7d4796886b70..6ebd94ef13ea 100644
--- a/addons/web/static/src/js/core/dialog.js
+++ b/addons/web/static/src/js/core/dialog.js
@@ -17,12 +17,13 @@ var _t = core._t;
  *   always exists during the lifecycle of the dialog.
  **/
 var Dialog = Widget.extend({
+    tagName: 'main',
     xmlDependencies: ['/web/static/src/xml/dialog.xml'],
     custom_events: _.extend({}, Widget.prototype.custom_events, {
         focus_control_button: '_onFocusControlButton',
     }),
     events: _.extend({} , Widget.prototype.events, {
-        'keydown .modal-footer button':'_onFooterButtonKeyDown',
+        'keydown footer.modal-footer button':'_onFooterButtonKeyDown',
     }),
     /**
      * @param {Widget} parent
@@ -92,7 +93,7 @@ var Dialog = Widget.extend({
                     self.$modal.find('.modal-dialog').addClass('modal-sm');
                     break;
             }
-            self.$footer = self.$modal.find(".modal-footer");
+            self.$footer = self.$modal.find("footer");
             self.set_buttons(self.buttons);
             self.$modal.on('hidden.bs.modal', _.bind(self.destroy, self));
         });
@@ -168,7 +169,17 @@ var Dialog = Widget.extend({
 
         var self = this;
         this.appendTo($('<div/>')).then(function () {
-            self.$modal.find(".modal-body").replaceWith(self.$el);
+            var $main = self.$modal.find("main:first");
+            if ($main.length === 0) {
+                $main = self.$modal.find(".modal-body:first");
+            }
+            if (self.$el.tagName !== 'MAIN') {
+                self.$el.removeClass(".modal-body");
+                self.$el = $('<main class="modal-body"/>').append(self.$el);
+            }
+            $main.replaceWith(self.$el);
+            self.$modal.attr('open', true);
+            self.$modal.removeAttr("aria-hidden");
             self.$modal.modal('show');
             self._opened.resolve();
         });
@@ -201,11 +212,13 @@ var Dialog = Widget.extend({
         $('.tooltip').remove(); //remove open tooltip if any to prevent them staying when modal has disappeared
         if (this.$modal) {
             this.$modal.modal('hide');
+            this.$modal.removeAttr('open');
+            this.$modal.attr('aria-hidden', true);
             this.$modal.remove();
         }
 
         if (!isFocusSet) {
-            var modals = $('body > .modal').filter(':visible');
+            var modals = $('body > [role="dialog"]').filter(':visible');
             if (modals.length) {
                 modals.last().focus();
                 // Keep class modal-open (deleted by bootstrap hide fnct) on body to allow scrolling inside the modal
@@ -287,9 +300,9 @@ Dialog.alert = function (owner, message, options) {
     return new Dialog(owner, _.extend({
         size: 'medium',
         buttons: buttons,
-        $content: $('<div>', {
+        $content: $('<main role="alert"/>').append($('<p>', {
             text: message,
-        }),
+        })),
         title: _t("Alert"),
     }, options)).open({shouldFocusButtons:true});
 };
@@ -312,9 +325,9 @@ Dialog.confirm = function (owner, message, options) {
     return new Dialog(owner, _.extend({
         size: 'medium',
         buttons: buttons,
-        $content: $('<div>', {
+        $content: $('<main role="alert">').append($('<p>', {
             text: message,
-        }),
+        })),
         title: _t("Confirmation"),
     }, options)).open({shouldFocusButtons:true});
 };
@@ -345,7 +358,7 @@ Dialog.safeConfirm = function (owner, message, options) {
             text: message,
         });
     }
-    $content = $('<div/>').append($content, $securityCheck);
+    $content = $('<main role="alert"/>').append($content, $securityCheck);
 
     var buttons = [
         {
diff --git a/addons/web/static/src/js/fields/abstract_field.js b/addons/web/static/src/js/fields/abstract_field.js
index 9bb61475b83f..eab0093ed503 100644
--- a/addons/web/static/src/js/fields/abstract_field.js
+++ b/addons/web/static/src/js/fields/abstract_field.js
@@ -310,6 +310,7 @@ var AbstractField = Widget.extend({
      */
     removeInvalidClass: function () {
         this.$el.removeClass('o_field_invalid');
+        this.$el.removeAttr('aria-invalid');
     },
 
     /**
@@ -317,6 +318,7 @@ var AbstractField = Widget.extend({
      */
     setInvalidClass: function () {
         this.$el.addClass('o_field_invalid');
+        this.$el.attr('aria-invalid', 'true');
     },
 
     /**
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 43b4e349a66b..0cf9271de9db 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -397,9 +397,10 @@ var LinkButton = AbstractField.extend({
         if (this.value) {
             var className = this.attrs.icon || 'fa-globe';
 
-            this.$el.html("<span />");
+            this.$el.html("<span role='img'/>");
             this.$el.addClass("fa "+ className);
             this.$el.attr('title', this.value);
+            this.$el.attr('aria-label', this.value);
         }
     },
 
@@ -1460,6 +1461,7 @@ var PriorityWidget = AbstractField.extend({
     _renderStar: function (tag, isFull, index, tip) {
         return $(tag)
             .attr('title', tip)
+            .attr('aria-label', tip)
             .attr('data-index', index)
             .addClass('o_priority_star fa')
             .toggleClass('fa-star', isFull)
@@ -1529,7 +1531,8 @@ var AttachmentImage = AbstractField.extend({
         if (this.value) {
             this.$el.empty().append($('<img>/', {
                 src: "/web/image/" + this.value.data.id + "?unique=1",
-                title: this.value.data.display_name
+                title: this.value.data.display_name,
+                alt: _("Image")
             }));
         }
     }
@@ -1598,7 +1601,9 @@ var StateSelectionWidget = AbstractField.extend({
         this.$('.o_status')
             .removeClass('o_status_red o_status_green')
             .addClass(currentState.state_class)
-            .prop('special_click', true);
+            .prop('special_click', true)
+            .parent().attr('title', currentState.state_name)
+            .attr('aria-label', currentState.state_name);
 
         // Render "FormSelection.Items" and move it into "FormSelection"
         var $items = $(qweb.render('FormSelection.items', {
@@ -1662,8 +1667,9 @@ var FavoriteWidget = AbstractField.extend({
      * @private
      */
     _render: function () {
-        var template = this.attrs.nolabel ? '<a href="#"><i class="fa %s" title="%s"></i></a>' : '<a href="#"><i class="fa %s"></i> %s</a>';
-        this.$el.empty().append(_.str.sprintf(template, this.value ? 'fa-star' : 'fa-star-o', this.value ? _t('Remove from Favorites') : _t('Add to Favorites')));
+        var tip = this.value ? _t('Remove from Favorites') : _t('Add to Favorites');
+        var template = this.attrs.nolabel ? '<a href="#"><i class="fa %s" title="%s" aria-label="%s" role="img"></i></a>' : '<a href="#"><i class="fa %s" role="img" aria-label="%s"> %s</i></a>';
+        this.$el.empty().append(_.str.sprintf(template, this.value ? 'fa-star' : 'fa-star-o', tip, tip));
     },
 
     //--------------------------------------------------------------------------
@@ -2043,7 +2049,10 @@ var FieldProgressBar = AbstractField.extend({
             widthComplete = 100;
         }
 
-        this.$('.o_progress').toggleClass('o_progress_overflow', value > max_value);
+        this.$('.o_progress').toggleClass('o_progress_overflow', value > max_value)
+            .attr('aria-valuemin', '0')
+            .attr('aria-valuemax', max_value)
+            .attr('aria-valuenow', value);
         this.$('.o_progressbar_complete').css('width', widthComplete + '%');
 
         if (!this.write_mode) {
@@ -2100,6 +2109,7 @@ var FieldToggleBoolean = AbstractField.extend({
             .toggleClass('text-muted', !this.value);
         var title = this.value ? this.attrs.options.active : this.attrs.options.inactive;
         this.$el.attr('title', title);
+        this.$el.attr('aria-pressed', this.value);
     },
 
     //--------------------------------------------------------------------------
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index c86411b6cd90..83ce59f1eb6f 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -1867,7 +1867,7 @@ var FormFieldMany2ManyTags = FieldMany2ManyTags.extend({
         var $target = $(ev.currentTarget);
         var color = $target.data('color');
         var id = $target.data('id');
-        var tag = this.$("span.badge[data-id='" + id + "']");
+        var tag = this.$("button.badge[data-id='" + id + "']");
         var currentColor = tag.data('color');
         var changes = {};
 
diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js
index 9834c9c18de6..13a00dda0467 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -50,6 +50,7 @@ var BasicRenderer = AbstractRenderer.extend({
                 invalidFields.push(widget.name);
             }
             widget.$el.toggleClass('o_field_invalid', !canBeSaved);
+            widget.$el.attr('aria-invalid', !canBeSaved);
         });
         return invalidFields;
     },
diff --git a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
index fad822efdb94..7af6b677dcf4 100644
--- a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
+++ b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js
@@ -166,6 +166,9 @@ var KanbanColumnProgressBar = Widget.extend({
             if (count > 0) {
                 $bar.addClass('o_bar_has_records');
                 $bar.css('width', (count * 100 / self.groupCount) + '%');
+                $bar.attr('aria-valuemin', 0);
+                $bar.attr('aria-valuemax', self.groupCount);
+                $bar.attr('aria-valuenow', count);
             } else {
                 $bar.css('width', '');
             }
diff --git a/addons/web/static/src/js/views/kanban/kanban_column_quick_create.js b/addons/web/static/src/js/views/kanban/kanban_column_quick_create.js
index 170b950a49d3..f554d333bc94 100644
--- a/addons/web/static/src/js/views/kanban/kanban_column_quick_create.js
+++ b/addons/web/static/src/js/views/kanban/kanban_column_quick_create.js
@@ -216,7 +216,7 @@ var ColumnQuickCreate = Widget.extend({
         }
 
         // ignore clicks in modals
-        if ($(event.target).closest('.modal').length) {
+        if ($(event.target).closest('[role="dialog"]').length) {
             return;
         }
 
diff --git a/addons/web/static/src/js/views/kanban/kanban_record.js b/addons/web/static/src/js/views/kanban/kanban_record.js
index 30bafaab117c..66171d2693cf 100644
--- a/addons/web/static/src/js/views/kanban/kanban_record.js
+++ b/addons/web/static/src/js/views/kanban/kanban_record.js
@@ -17,7 +17,21 @@ var widgetRegistry = require('web.widget_registry');
 var _t = core._t;
 var QWeb = core.qweb;
 
-var NB_KANBAN_RECORD_COLORS = 12;
+var KANBAN_RECORD_COLORS = [
+    _t('No color'),
+    _t('Red'),
+    _t('Orange'),
+    _t('Yellow'),
+    _t('Light blue'),
+    _t('Dark purple'),
+    _t('Salmon pink'),
+    _t('Medium blue'),
+    _t('Dark blue'),
+    _t('Fushia'),
+    _t('Green'),
+    _t('Purple'),
+];
+var NB_KANBAN_RECORD_COLORS = KANBAN_RECORD_COLORS.length;
 
 var KanbanRecord = Widget.extend({
     events: {
@@ -126,6 +140,17 @@ var KanbanRecord = Widget.extend({
         }
         return 0;
     },
+    /**
+     * Computes a color name from value
+     *
+     * @private
+     * @param {number | string} variable
+     * @returns {integer} the color name
+     */
+    _getColorname: function (variable) {
+        var colorID = this._getColorID(variable);
+        return KANBAN_RECORD_COLORS[colorID];
+    },
     /**
      * @private
      * @param {string} model the name of the model
@@ -284,6 +309,7 @@ var KanbanRecord = Widget.extend({
     _render: function () {
         this._replaceElement(this.qweb.render('kanban-box', this.qweb_context));
         this.$el.addClass('o_kanban_record').attr("tabindex",0);
+        this.$el.attr('role', 'article');
         this.$el.data('record', this);
         if (this.$el.hasClass('oe_kanban_global_click') ||
             this.$el.hasClass('oe_kanban_global_click_edit')) {
@@ -338,6 +364,7 @@ var KanbanRecord = Widget.extend({
             kanban_image: this._getImageURL.bind(this),
             kanban_color: this._getColorClassname.bind(this),
             kanban_getcolor: this._getColorID.bind(this),
+            kanban_getcolorname: this._getColorname.bind(this),
             kanban_compute_domain: this._computeDomain.bind(this),
             read_only_mode: this.read_only_mode,
             record: this.record,
@@ -354,8 +381,10 @@ var KanbanRecord = Widget.extend({
     _setupColor: function () {
         var color_field = this.$el.attr('color');
         if (color_field && color_field in this.fields) {
+            var colorHelp = _.str.sprintf(_t("Card color: %s"), this._getColorname(this.recordData[color_field]));
             var colorClass = this._getColorClassname(this.recordData[color_field]);
             this.$el.addClass(colorClass);
+            this.$el.prepend('<span title="' + colorHelp + '" aria-label="' + colorHelp +'" role="img" class="oe_kanban_color_help"/>');
         }
     },
     /**
diff --git a/addons/web/static/src/js/views/kanban/kanban_record_quick_create.js b/addons/web/static/src/js/views/kanban/kanban_record_quick_create.js
index bf7e60b68c3b..749938e8b9ed 100644
--- a/addons/web/static/src/js/views/kanban/kanban_record_quick_create.js
+++ b/addons/web/static/src/js/views/kanban/kanban_record_quick_create.js
@@ -232,7 +232,7 @@ var RecordQuickCreate = Widget.extend({
         }
 
         // ignore clicks in modals
-        if ($(ev.target).closest('.modal').length) {
+        if ($(ev.target).closest('[role="dialog"]').length) {
             return;
         }
 
diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js
index 07aa8eacb4e0..9ec82878e70f 100644
--- a/addons/web/static/src/js/views/list/list_editable_renderer.js
+++ b/addons/web/static/src/js/views/list/list_editable_renderer.js
@@ -527,7 +527,7 @@ ListRenderer.include({
     _renderRows: function () {
         var $rows = this._super();
         if (this.addCreateLine) {
-            var $a = $('<a href="#">').text(_t("Add a line"));
+            var $a = $('<a href="#" role="button">').text(_t("Add a line"));
             var $td = $('<td>')
                         .attr('colspan', this._getNumberOfCols())
                         .addClass('o_field_x2many_list_row_add')
@@ -923,9 +923,9 @@ ListRenderer.include({
 
         // ignore clicks in modals, except if the list is in a modal, and the
         // click is performed in that modal
-        var $clickModal = $(event.target).closest('.modal');
+        var $clickModal = $(event.target).closest('[role="dialog"]');
         if ($clickModal.length) {
-            var $listModal = this.$el.closest('.modal');
+            var $listModal = this.$el.closest('[role="dialog"]');
             if ($clickModal.prop('id') !== $listModal.prop('id')) {
                 return;
             }
diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js
index bf206eae32c3..e84d6687cc9e 100644
--- a/addons/web/static/src/js/views/list/list_renderer.js
+++ b/addons/web/static/src/js/views/list/list_renderer.js
@@ -549,6 +549,10 @@ var ListRenderer = BasicRenderer.extend({
             .toggleClass('o-sort-up', isNodeSorted ? order[0].asc : false)
             .addClass(field.sortable && 'o_column_sortable');
 
+        if (isNodeSorted) {
+            $th.attr('aria-sort', order[0].asc ? 'ascending': 'descending');
+        }
+
         if (field.type === 'float' || field.type === 'integer' || field.type === 'monetary') {
             $th.css({textAlign: 'right'});
         }
diff --git a/addons/web/static/src/js/views/pivot/pivot_renderer.js b/addons/web/static/src/js/views/pivot/pivot_renderer.js
index b5648d358a97..b39530761618 100644
--- a/addons/web/static/src/js/views/pivot/pivot_renderer.js
+++ b/addons/web/static/src/js/views/pivot/pivot_renderer.js
@@ -96,6 +96,11 @@ var PivotRenderer = AbstractRenderer.extend({
                     $cell.data('id', cell.id).data('measure', cell.measure);
                     if (cell.id === this.state.sortedColumn.id && cell.measure === this.state.sortedColumn.measure) {
                         $cell.addClass('o_pivot_measure_row_sorted_' + this.state.sortedColumn.order);
+                        if (this.state.sortedColumn.order == 'asc') {
+                            $cell.attr('aria-sorted', 'ascending');
+                        } else {
+                            $cell.attr('aria-sorted', 'descending');
+                        }
                     }
                 }
                 $row.append($cell);
diff --git a/addons/web/static/src/js/widgets/change_password.js b/addons/web/static/src/js/widgets/change_password.js
index c05fa30408b0..b2e4e013335b 100644
--- a/addons/web/static/src/js/widgets/change_password.js
+++ b/addons/web/static/src/js/widgets/change_password.js
@@ -28,7 +28,7 @@ var ChangePassword = AbstractAction.extend({
         var $button = self.$('.oe_form_button');
         $button.appendTo(this.getParent().$footer);
         $button.eq(1).click(function () {
-            self.$el.parents('.modal').modal('hide');
+            self.$el.parents('[role="dialog"]').modal('hide');
         });
         $button.eq(0).click(function () {
             self._rpc({
diff --git a/addons/web/static/src/js/widgets/debug_manager.js b/addons/web/static/src/js/widgets/debug_manager.js
index 4b86b76c36df..4bdc27448a01 100644
--- a/addons/web/static/src/js/widgets/debug_manager.js
+++ b/addons/web/static/src/js/widgets/debug_manager.js
@@ -848,7 +848,7 @@ if (config.debug) {
                         if (action) {
                             var controller = parent.getCurrentControllerInDialog();
                             self.debugManager = new DebugManager(self);
-                            var $header = self.$modal.find('.modal-header:first');
+                            var $header = self.$modal.find('header.modal-header:first');
                             return self.debugManager.prependTo($header).then(function () {
                                 self.debugManager.update('action', action, controller.widget);
                             });
diff --git a/addons/web/static/src/js/widgets/domain_selector_dialog.js b/addons/web/static/src/js/widgets/domain_selector_dialog.js
index 46b54089c5fe..d0c0030b1007 100644
--- a/addons/web/static/src/js/widgets/domain_selector_dialog.js
+++ b/addons/web/static/src/js/widgets/domain_selector_dialog.js
@@ -43,7 +43,7 @@ return Dialog.extend({
         var self = this;
         this.opened().then(function () {
             // this restores default modal height (bootstrap) and allows field selector to overflow
-            self.$el.css('overflow', 'visible').closest('.modal-dialog').css('height', 'auto');
+            self.$el.css('overflow', 'visible').closest('[role="dialog"]').css('height', 'auto');
         });
         return $.when(
             this._super.apply(this, arguments),
diff --git a/addons/web/static/src/scss/ui.scss b/addons/web/static/src/scss/ui.scss
index 8911b4f10abe..d88f21f83a10 100644
--- a/addons/web/static/src/scss/ui.scss
+++ b/addons/web/static/src/scss/ui.scss
@@ -9,3 +9,7 @@
 .ui-autocomplete {
     z-index: $zindex-modal + 1;
 }
+
+[aria-hidden="true"], [aria-hidden="1"] {
+    display: none!important;
+}
diff --git a/addons/web/static/src/scss/utils.scss b/addons/web/static/src/scss/utils.scss
index efb8dce7598a..cf04a8d32f8c 100644
--- a/addons/web/static/src/scss/utils.scss
+++ b/addons/web/static/src/scss/utils.scss
@@ -337,6 +337,14 @@
         }
     }
 }
+.oe_kanban_color_help {
+    bottom: 0px;
+    left: -1px;
+    top: 0px;
+    width: 6px;
+    position: absolute;
+    right: auto;
+}
 @mixin o-kanban-slim-col {
     position: relative;
     @include o-flex(0, 0, auto);
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 328f1ab93b5c..45bd3555d692 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -6,13 +6,13 @@
 <div t-name="Loading" class="o_loading"/>
 
 <t t-name="WidgetLabel.tooltip">
-    <div class="oe_tooltip_string" t-if="widget.string">
+    <div class="oe_tooltip_string" t-if="widget.string" role="tooltip">
         <t t-esc="widget.string"/> <t t-if="debug and widget.nolabel">(nolabel)</t>
     </div>
-    <p t-if="widget.attrs.help || widget.field.help" class="oe_tooltip_help">
+    <p t-if="widget.attrs.help || widget.field.help" class="oe_tooltip_help" role="tooltip">
         <t t-esc="widget.attrs.help || widget.field.help"/>
     </p>
-    <ul t-if="debug" class="oe_tooltip_technical">
+    <ul t-if="debug" class="oe_tooltip_technical" role="tooltip">
         <li data-item="field" t-if="widget.name">
             <span class="oe_tooltip_technical_title">Field:</span>
             <t t-esc="widget.name"/>
@@ -70,7 +70,7 @@
     </ul>
 </t>
 <t t-name="WidgetButton.tooltip">
-    <div class="oe_tooltip_string" t-if="debug || node.attrs.string">
+    <div class="oe_tooltip_string" t-if="debug || node.attrs.string" role="tooltip">
         <t t-if="debug">
             Button
             <t t-if="node.attrs.string">: </t>
@@ -78,10 +78,10 @@
         </t>
         <t t-esc="node.attrs.string"/>
     </div>
-    <p t-if="node.attrs.help" class="oe_tooltip_help">
+    <p t-if="node.attrs.help" class="oe_tooltip_help" role="tooltip">
         <t t-esc="node.attrs.help"/>
     </p>
-    <ul t-if="debug" class="oe_tooltip_technical">
+    <ul t-if="debug" class="oe_tooltip_technical" role="tooltip">
         <li data-item="object">
             <span class="oe_tooltip_technical_title">Object:</span>
             <t t-esc="state.model"/>
@@ -115,18 +115,18 @@
 </t>
 
 <t t-name="Notification">
-    <div t-attf-class="o_notification #{widget.className}" t-translation="off">
-        <a t-if="widget.sticky" class="fa fa-times o_close" href="#"/>
+    <div t-attf-class="o_notification #{widget.className}" t-translation="off" role="alertdialog">
+        <a t-if="widget.sticky" class="fa fa-times o_close" href="#" title="Close" aria-label="Close"/>
         <div class="o_notification_title">
-            <span t-attf-class="o_icon fa fa-3x #{widget.icon}"/>
+            <span t-attf-class="o_icon fa fa-3x #{widget.icon}" role="img" t-attf-aria-label="Notification #{widget.name}" t-attf-title="Notification #{widget.name}"/>
             <t t-raw="widget.title"/>
         </div>
         <div class="o_notification_content" t-if="widget.message"><t t-raw="widget.message"/></div>
         <div t-if="widget.buttons.length" class="o_buttons">
             <button t-foreach="widget.buttons" t-as="button" t-attf-class="btn btn-sm #{button.primary ? 'btn-primary' : 'btn-default'}" type="button">
                 <t t-if="button.icon">
-                    <i t-if="button.icon.indexOf('fa-') === 0" t-attf-class="fa fa-fw o_button_icon #{button.icon}"/>
-                    <img t-else="" t-att-src="button.icon"/>
+                    <i t-if="button.icon.indexOf('fa-') === 0" t-attf-class="fa fa-fw o_button_icon #{button.icon}" role="img" t-att-aria-label="button.name" t-att-title="button.name"/>
+                    <img t-else="" t-att-src="button.icon" t-att-alt="button.name"/>
                 </t>
                 <span><t t-esc="button.text"/></span>
             </button>
@@ -134,7 +134,7 @@
     </div>
 </t>
 
-<div t-name="CrashManager.warning" class="o_dialog_warning">
+<div t-name="CrashManager.warning" class="o_dialog_warning" role="alert">
     <t t-js="d">
         var message = (d.message !== undefined) ? d.message : d.error.data.message;
         d.html_error = context.engine.tools.html_escape(message).replace(/\n/g, '<br/>');
@@ -144,7 +144,7 @@
 <div t-name="CrashManager.error" class="o_dialog_error">
     <div class="alert alert-warning clearfix" role="alert">
         <button class="btn btn-sm btn-primary pull-right ml8 o_clipboard_button">
-            <i class="fa fa-clipboard mr8"/>Copy the full error to clipboard
+            <span class="fa fa-clipboard mr8">Copy the full error to clipboard</span>
         </button>
         <p><b>An error occurred</b></p>
         <p>Please use the copy button to report the error to your support service.</p>
@@ -152,13 +152,13 @@
 
     <t t-set="errUID" t-value="_.uniqueId()"/>
     <button class="btn btn-sm btn-link" t-att-data-target="'#o_error_detail' + errUID" data-toggle="collapse">See details</button>
-    <div t-att-id="'o_error_detail' + errUID" class="collapse alert alert-danger o_error_detail">
+    <div t-att-id="'o_error_detail' + errUID" class="collapse alert alert-danger o_error_detail" role="alert">
         <pre><t t-esc="error.message"/></pre>
         <pre><t t-esc="error.data.debug"/></pre>
     </div>
 </div>
 
-<form t-name="ChangePassword" name="change_password_form" method="POST">
+<form t-name="ChangePassword" name="change_password_form" method="POST" aria-atomic="true">
     <div class="o_form_view">
         <table class="o_group o_inner_group o_label_nowrap">
             <tr>
@@ -182,23 +182,23 @@
 
 <t t-name="ControlPanel">
     <div class="o_control_panel">
-        <ol class="breadcrumb"/>
-        <div class="o_cp_searchview"/>
+        <ol class="breadcrumb" role="navigation"/>
+        <div class="o_cp_searchview" role="search"/>
         <div class="o_cp_left">
-            <div class="o_cp_buttons"/>
-            <div class="o_cp_sidebar"/>
+            <div class="o_cp_buttons" role="toolbar" aria-label="Control panel toolbar"/>
+            <aside class="o_cp_sidebar"/>
         </div>
         <div class="o_cp_right">
-            <div class="btn-group o_search_options"/>
-            <div class="o_cp_pager"/>
-            <div class="btn-group btn-group-sm o_cp_switch_buttons"/>
+            <div class="btn-group o_search_options" role="search"/>
+            <nav class="o_cp_pager" role="search" aria-label="Pager"/>
+            <nav class="btn-group btn-group-sm o_cp_switch_buttons" role="toolbar" aria-label="View switcher"/>
         </div>
     </div>
 </t>
 <t t-name="X2ManyControlPanel">
     <div class="o_x2m_control_panel">
-        <div class="o_cp_buttons"/>
-        <div class="o_cp_pager"/>
+        <nav class="o_cp_buttons" aria-label="Control panel toolbar" role="toolbar"/>
+        <nav class="o_cp_pager" aria-label="Pager" role="toolbar"/>
     </div>
 </t>
 
@@ -206,41 +206,41 @@
     <t t-foreach="views" t-as="view">
         <button type="button" t-att-accesskey="view.accessKey"
             t-attf-class="btn btn-icon fa fa-lg #{view.icon} o_cp_switch_#{view.type}"
-            t-att-aria-label="view.type"
-            t-att-data-view-type="view.type" t-att-title="view.label" tabindex="-1"/>
+            t-attf-aria-label="View #{view.type}"
+            t-att-data-view-type="view.type" t-attf-title="View #{view.type}" tabindex="-1"/>
     </t>
 </t>
 
 <t t-name="WebClient.DebugManager">
-    <li class="o_debug_manager">
-        <a href="#" title="Open Developer Tools" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1">
+    <li class="o_debug_manager" role="menuitem">
+        <a href="#" title="Open Developer Tools" aria-label="Open Developer Tools" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1">
             <span class="fa fa-bug"/>
         </a>
         <ul class="dropdown-menu o_debug_dropdown" role="menu"/>
     </li>
 </t>
 <t t-name="WebClient.DebugManager.Global">
-    <li><a href="#" data-action="perform_js_tests">Run JS Tests</a></li>
-    <li><a href="#" data-action="perform_js_mobile_tests">Run JS Mobile Tests</a></li>
-    <li><a href="#" data-action="select_view">Open View</a></li>
+    <li><a role="menuitem" href="#" data-action="perform_js_tests">Run JS Tests</a></li>
+    <li><a role="menuitem" href="#" data-action="perform_js_mobile_tests">Run JS Mobile Tests</a></li>
+    <li><a role="menuitem" href="#" data-action="select_view">Open View</a></li>
     <t t-if="manager._events">
-        <li class="divider"/>
-        <li><a href="#" data-action="show_timelines">Toggle Timelines</a></li>
-        <li><a href="#" data-action="requests_clear">Clear Events</a></li>
+        <li class="divider" role="separator"/>
+        <li><a role="menuitem" href="#" data-action="show_timelines">Toggle Timelines</a></li>
+        <li><a role="menuitem" href="#" data-action="requests_clear">Clear Events</a></li>
     </t>
-    <li class="divider o_debug_leave_section"/>
-    <li><a href="#" data-action="split_assets">Activate Assets Debugging</a></li>
-    <li><a href="#" data-action="regenerateAssets">Regenerate Assets Bundles</a></li>
-    <li><a href="#" data-action="leave_debug_mode">Leave the Developer Tools</a></li>
+    <li class="divider o_debug_leave_section" role="separator"/>
+    <li><a role="menuitem" href="#" data-action="split_assets">Activate Assets Debugging</a></li>
+    <li><a role="menuitem" href="#" data-action="regenerateAssets">Regenerate Assets Bundles</a></li>
+    <li><a role="menuitem" href="#" data-action="leave_debug_mode">Leave the Developer Tools</a></li>
 </t>
 <t t-name="WebClient.DebugManager.Action">
     <t t-if="action">
-        <li class="divider"/>
-        <li><a href="#" data-action="edit" t-att-data-model="action.type" t-att-data-id="action.id">Edit Action</a></li>
+        <li class="divider" role="separator"/>
+        <li><a role="menuitem" href="#" data-action="edit" t-att-data-model="action.type" t-att-data-id="action.id">Edit Action</a></li>
         <t t-if="action.res_model">
-            <li><a href="#" data-action="get_view_fields">View Fields</a></li>
-            <li><a href="#" data-action="manage_filters">Manage Filters</a></li>
-            <li><a href="#" data-action="translate">Technical Translation</a></li>
+            <li><a role="menuitem" href="#" data-action="get_view_fields">View Fields</a></li>
+            <li><a role="menuitem" href="#" data-action="manage_filters">Manage Filters</a></li>
+            <li><a role="menuitem" href="#" data-action="translate">Technical Translation</a></li>
         </t>
     </t>
 </t>
@@ -248,7 +248,7 @@
     <dl><t t-foreach="fields" t-as="field">
         <dt><h4><t t-esc="field"/></h4></dt>
         <dd>
-            <dl><ul><li t-foreach="field_value" t-as="attribute">
+            <dl><ul role="menu"><li role="menuitem" t-foreach="field_value" t-as="attribute">
                 <strong><t t-esc="attribute"/></strong>:
                 <t t-esc="attribute_value"/>
             </li></ul></dl>
@@ -257,21 +257,21 @@
 </t>
 <t t-name="WebClient.DebugManager.View">
     <t t-if="view">
-        <li class="divider"/>
+        <li role="separator" class="divider"/>
         <t t-if="view.type === 'form'">
-            <li><a href="#" data-action="set_defaults">Set Defaults</a></li>
+            <li><a role="menuitem" href="#" data-action="set_defaults">Set Defaults</a></li>
             <t t-if="controller.getSelectedIds().length === 1">
-                <li><a href="#" data-action="get_metadata">View Metadata</a></li>
+                <li><a role="menuitem" href="#" data-action="get_metadata">View Metadata</a></li>
             </t>
         </t>
-        <li><a href="#" data-action="fvg">Fields View Get</a></li>
+        <li><a role="menuitem" href="#" data-action="fvg">Fields View Get</a></li>
         <t t-if="can_edit">
             <li>
-              <a href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="view.fieldsView.view_id">
+              <a role="menuitem" href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="view.fieldsView.view_id">
                 Edit View: <t t-esc="_.str.capitalize(view.type)"/>
               </a>
             </li>
-            <li t-if="searchview and searchview.$el.is(':visible')"><a href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="action.searchFieldsView.view_id">Edit SearchView</a></li>
+            <li t-if="searchview and searchview.$el.is(':visible')"><a role="menuitem" href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="action.searchFieldsView.view_id">Edit SearchView</a></li>
         </t>
     </t>
 </t>
@@ -332,7 +332,7 @@
                 </a>
             </t>
             <ul class="dropdown-menu" role="menu">
-                <li t-foreach="widget.items[section.name]" t-as="item" t-att-class="item.classname">
+                <li role="menuitem" t-foreach="widget.items[section.name]" t-as="item" t-att-class="item.classname">
                     <t t-if="section.name == 'files'">
                         <t t-set="item.title">
                             <b>Attachment : </b><br/>
@@ -351,10 +351,10 @@
                     </t>
                     <a t-att-title="item.title or None" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url or '#'">
                         <t t-raw="item.label"/>
-                        <span t-if="section.name == 'files' and widget.options.editable and !item.callback" class="fa fa-trash-o o_sidebar_delete_attachment" t-att-data-id="item.id" title="Delete this attachment"/>
+                        <span t-if="section.name == 'files' and widget.options.editable and !item.callback" class="fa fa-trash-o o_sidebar_delete_attachment" t-att-data-id="item.id" title="Delete this attachment" role="img" aria-label="Delete this attachment"/>
                     </a>
                 </li>
-                <li t-if="section.name == 'files' and widget.options.editable" class="o_sidebar_add_attachment">
+                <li role="menuitem" t-if="section.name == 'files' and widget.options.editable" class="o_sidebar_add_attachment">
                     <t t-call="HiddenInputFile">
                         <t t-set="fileupload_id" t-value="widget.fileuploadId"/>
                         <t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
@@ -371,7 +371,7 @@
 </t>
 
 <t t-name="ListView.buttons">
-    <div class="o_list_buttons">
+    <div class="o_list_buttons" role="toolbar" aria-label="Main actions">
         <t t-if="widget.is_action_enabled('create')">
             <button type="button" class="btn btn-primary btn-sm o_list_button_add" accesskey="c">
                 Create
@@ -387,7 +387,7 @@
 </t>
 
 <t t-name="FormView.buttons">
-    <div class="o_form_buttons_view">
+    <div class="o_form_buttons_view" role="toolbar" aria-label="Main actions">
         <button t-if="widget.is_action_enabled('edit')" type="button"
                 class="btn btn-primary btn-sm o_form_button_edit" accesskey="a">
             Edit
@@ -397,7 +397,7 @@
             Create
         </button>
     </div>
-    <div class="o_form_buttons_edit">
+    <div class="o_form_buttons_edit" role="toolbar" aria-label="Main actions">
         <button type="button"
                 class="btn btn-primary btn-sm o_form_button_save" accesskey="s">
             Save
@@ -409,7 +409,7 @@
     </div>
 </t>
 <t t-name="SaveCancelButton.tooltip">
-    <div class="oe_tooltip_string">
+    <div class="oe_tooltip_string" role="alert">
         <div class="tooltip-inner">
             Hit ENTER to SAVE<br/>
             Hit ESCAPE to DISCARD
@@ -417,7 +417,7 @@
     </div>
 </t>
 <t t-name="CreateButton.tooltip">
-    <div class="oe_tooltip_string">
+    <div class="oe_tooltip_string" role="tooltip">
         <div class="tooltip-inner">
             Hit ENTER to CREATE<br/>
             Hit DOWN to navigate to the list bellow
@@ -425,14 +425,14 @@
     </div>
 </t>
 <t t-name="FormButton.tooltip">
-    <div class="oe_tooltip_string">
+    <div class="oe_tooltip_string" role="tooltip">
         <div class="tooltip-inner">
             Hit ENTER to 
             <t t-esc="title"></t>
         </div>
     </div>
 </t>
-<form t-name="FormView.set_default">
+<form t-name="FormView.set_default" aria-atomic="true">
     <t t-set="args" t-value="widget.args"/>
     <table style="width: 100%">
         <tr>
@@ -489,25 +489,25 @@
     </table>
 </form>
 <t t-name="GraphView.buttons">
-    <div class="btn-group btn-group-sm" role="group">
+    <div class="btn-group btn-group-sm" role="toolbar" aria-label="Main actions">
         <button class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
             Measures <span class="caret"/>
         </button>
-        <ul class="dropdown-menu o_graph_measures_list">
+        <ul class="dropdown-menu o_graph_measures_list" role="menu">
             <li t-foreach="measures" t-as="measure" t-att-data-field="measure[0]">
-                <a href="#"><t t-esc="measure[1].string"/><t t-if="measure[1].type === 'many2one'"> (count)</t></a>
+                <a role="menuitem" href="#"><t t-esc="measure[1].string"/><t t-if="measure[1].type === 'many2one'"> (count)</t></a>
             </li>
-            <li class="divider"></li>
-            <li data-field="__count__"><a href="#">Count</a></li>
+            <li role="separator" class="divider"></li>
+            <li data-field="__count__"><a role="menuitem" href="#">Count</a></li>
         </ul>
     </div>
-    <div class="btn-group btn-group-sm">
-        <button class="btn btn-default fa fa-bar-chart-o o_graph_button" title="Bar Chart" data-mode="bar"/>
-        <button class="btn btn-default fa fa-line-chart o_graph_button" title="Line Chart" data-mode="line"/>
-        <button class="btn btn-default fa fa-pie-chart o_graph_button" title="Pie Chart" data-mode="pie"/>
+    <div class="btn-group btn-group-sm" role="toolbar" aria-label="Change graph">
+        <button class="btn btn-default fa fa-bar-chart-o o_graph_button" title="Bar Chart" aria-label="Bar Chart" data-mode="bar"/>
+        <button class="btn btn-default fa fa-line-chart o_graph_button" title="Line Chart" aria-label="Line Chart" data-mode="line"/>
+        <button class="btn btn-default fa fa-pie-chart o_graph_button" title="Pie Chart" aria-label="Pie Chart" data-mode="pie"/>
     </div>
 </t>
-<div t-name="GraphView.error" class="o_view_nocontent" >
+<div t-name="GraphView.error" class="o_view_nocontent" role="alert">
     <div class="o_nocontent_help">
         <p class="o_view_nocontent_empty_folder"><t t-esc="title"/></p>
         <p><t t-esc="description"/></p>
@@ -518,51 +518,51 @@
     <div class="o_field_selection"/>
 </div>
 <t t-name="PivotView.buttons">
-    <div class="btn-group btn-group-sm" role="group">
+    <div class="btn-group btn-group-sm" role="toolbar" aria-label="Main actions">
         <button class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
             Measures <span class="caret"/>
         </button>
-        <ul class="dropdown-menu o_pivot_measures_list">
+        <ul class="dropdown-menu o_pivot_measures_list" role="menu">
             <li t-foreach="measures" t-as="measure" t-att-data-field="measure[0]">
-                <a href="#"><t t-esc="measure[1].string"/><t t-if="measure[1].type === 'many2one'"> (count)</t></a>
+                <a role="menuitem" href="#"><t t-esc="measure[1].string"/><t t-if="measure[1].type === 'many2one'"> (count)</t></a>
             </li>
-            <li class="divider"></li>
-            <li data-field="__count"><a href="#">Count</a></li>
+            <li role="separator" class="divider"></li>
+            <li data-field="__count"><a role="menuitem" href="#">Count</a></li>
         </ul>
     </div>
-    <div class="btn-group btn-group-sm">
-        <button class="btn btn-default fa fa-expand o_pivot_flip_button" title="Flip axis"/>
-        <button class="btn btn-default fa fa-arrows-alt o_pivot_expand_button" title="Expand all"/>
-        <button class="btn btn-default fa fa-download o_pivot_download" title="Download xls"/>
+    <div class="btn-group btn-group-sm" role="toolbar" aria-label="Pivot settings">
+        <button class="btn btn-default fa fa-expand o_pivot_flip_button" title="Flip axis" aria-label="Flip axis"/>
+        <button class="btn btn-default fa fa-arrows-alt o_pivot_expand_button" title="Expand all" aria-label="Expand all"/>
+        <button class="btn btn-default fa fa-download o_pivot_download" title="Download xls" aria-label="Download xls"/>
     </div>
 </t>
 <t t-name="PivotView.FieldSelection">
     <ul class="dropdown-menu o_pivot_field_menu" role="menu">
         <t t-foreach="fields" t-as="field">
             <t t-if="(field[1].type === 'date') || (field[1].type === 'datetime')">
-                <li t-att-data-field="field[0]" t-attf-class="o_inline_dropdown#{field[2] ? ' disabled' : ''}">
+                <li role="menuitem" aria-haspopup="true" t-att-data-field="field[0]" t-attf-class="o_inline_dropdown#{field[2] ? ' disabled' : ''}">
                     <a href="#" class="o_pivot_field_selection">
                         <t t-esc="field[1].string"/>
                     </a>
-                    <ul class="dropdown-menu">
-                        <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'day'">Day</a></li>
-                        <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'week'">Week</a></li>
-                        <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'month'">Month</a></li>
-                        <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'quarter'">Quarter</a></li>
-                        <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'year'">Year</a></li>
+                    <ul class="dropdown-menu" role="menu">
+                        <li t-att-data-field="field[0]"><a role="menuitem" href="#" t-att-data-interval="'day'">Day</a></li>
+                        <li t-att-data-field="field[0]"><a role="menuitem" href="#" t-att-data-interval="'week'">Week</a></li>
+                        <li t-att-data-field="field[0]"><a role="menuitem" href="#" t-att-data-interval="'month'">Month</a></li>
+                        <li t-att-data-field="field[0]"><a role="menuitem" href="#" t-att-data-interval="'quarter'">Quarter</a></li>
+                        <li t-att-data-field="field[0]"><a role="menuitem" href="#" t-att-data-interval="'year'">Year</a></li>
                     </ul>
                 </li>
             </t>
             <t t-else="">
                 <li t-att-data-field="field[0]" t-att-class="(field[2] ? 'disabled' : '')">
-                    <a href="#"><t t-esc="field[1].string"/></a>
+                    <a role="menuitem" href="#"><t t-esc="field[1].string"/></a>
                 </li>
             </t>
         </t>
     </ul>
 </t>
 <div t-name="PivotView.nodata">
-    <div class="o_view_nocontent">
+    <div class="o_view_nocontent" role="alert">
         <div class="o_nocontent_help">
             <p class="o_view_nocontent_empty_folder">
                 No data to display
@@ -575,15 +575,15 @@
 </div>
 
 <t t-name="FormSelection">
-    <div class="btn-group o_selection">
-        <a href="#" data-toggle="dropdown"><span class="o_status"/></a>
+    <div class="btn-group o_selection" aria-atomic="true">
+        <a href="#" data-toggle="dropdown" aria-label="Dropdown menu" title="Dropdown menu"><span class="o_status"/></a>
         <ul class="dropdown-menu state" role="menu">
         </ul>
     </div>
 </t>
 <t t-name="FormSelection.items">
     <li t-foreach="states" t-as="rec" t-att-data-value="rec.name">
-        <a href="#">
+        <a role="menuitem" href="#">
             <span t-att-class="'o_status ' + (rec.state_class &amp;&amp; rec.state_class || '')"/>
             <t t-raw="rec.state_name"/>
         </a>
@@ -591,34 +591,34 @@
 </t>
 <t t-name="FieldDomain.content">
     <div t-if="hasModel" class="o_field_domain_panel">
-        <i class="fa fa-arrow-right"/>
+        <i class="fa fa-arrow-right" role="img" aria-label="Domain" title="Domain"/>
 
         <button t-if="isValid" class="btn btn-xs btn-default o_domain_show_selection_button" type="button">
             <t t-esc="nbRecords"/> record(s)
         </button>
-        <span t-else="" class="text-warning"><i class="fa fa-exclamation-triangle"/> Invalid domain</span>
+        <span t-else="" class="text-warning" role="alert"><i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> Invalid domain</span>
 
         <button t-if="inDialogEdit" class="btn btn-xs btn-primary o_field_domain_dialog_button">Edit Domain</button>
     </div>
     <div t-else="">Select a model to add a filter.</div>
 </t>
 <t t-name="DomainNode.ControlPanel">
-    <div t-if="!widget.readonly &amp;&amp; !widget.noControlPanel" class="o_domain_node_control_panel">
-        <button class="btn o_domain_delete_node_button"><i class="fa fa-times"/></button>
-        <button class="btn o_domain_add_node_button"><i class="fa fa-plus-circle"/></button>
-        <button class="btn o_domain_add_node_button" data-branch="1"><i class="fa fa-ellipsis-h"/></button>
+    <div t-if="!widget.readonly &amp;&amp; !widget.noControlPanel" class="o_domain_node_control_panel" role="toolbar" aria-label="Domain node">
+        <button class="btn o_domain_delete_node_button" title="Delete node" aria-label="Delete node"><i class="fa fa-times"/></button>
+        <button class="btn o_domain_add_node_button" title="Add node" aria-label="Add node"><i class="fa fa-plus-circle"/></button>
+        <button class="btn o_domain_add_node_button" title="Add branch" aria-label="Add branch" data-branch="1"><i class="fa fa-ellipsis-h"/></button>
     </div>
 </t>
 <t t-name="DomainTree.OperatorSelector">
-    <div t-if="!widget.readonly" class="btn-group o_domain_tree_operator_selector">
+    <div t-if="!widget.readonly" class="btn-group o_domain_tree_operator_selector" aria-atomic="true">
         <button class="btn btn-xs btn-primary o_domain_tree_operator_caret" data-toggle="dropdown">
             <t t-if="widget.operator === '&amp;'">All</t>
             <t t-if="widget.operator === '|'">Any</t>
             <t t-if="widget.operator === '!'">None</t>
         </button>
-        <ul class="dropdown-menu">
-            <li><a href="#" data-operator="&amp;">All</a></li>
-            <li><a href="#" data-operator="|">Any</a></li>
+        <ul class="dropdown-menu" role="menu">
+            <li><a role="menuitem" href="#" data-operator="&amp;">All</a></li>
+            <li><a role="menuitem" href="#" data-operator="|">Any</a></li>
         </ul>
     </div>
     <strong t-else="">
@@ -627,10 +627,10 @@
         <t t-if="widget.operator === '!'">NONE</t>
     </strong>
 </t>
-<div t-name="DomainSelector" t-attf-class="o_domain_node o_domain_tree o_domain_selector #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}">
+<div aria-atomic="true" t-name="DomainSelector" t-attf-class="o_domain_node o_domain_tree o_domain_selector #{widget.readonly ? 'o_read_mode' : 'o_edit_mode'}">
     <t t-if="widget.children.length === 0">
         <span>Match <strong>all records</strong></span>
-        <button t-if="!widget.readonly" class="btn btn-xs btn-primary o_domain_add_first_node_button"><i class="fa fa-plus"/> Add filter</button>
+        <button t-if="!widget.readonly" class="btn btn-xs btn-primary o_domain_add_first_node_button"><span class="fa fa-plus"> Add filter</span></button>
     </t>
     <t t-else="">
         <div class="o_domain_tree_header">
@@ -686,12 +686,12 @@
                 <t t-if="_.contains(['in', 'not in'], widget.operator)">
                     <div class="o_domain_leaf_value_input">
                         <span class="badge" t-foreach="widget.displayValue" t-as="val">
-                            <t t-esc="val"/> <i class="o_domain_leaf_value_remove_tag_button fa fa-times" t-att-data-value="val"/>
+                            <t t-esc="val"/> <i class="o_domain_leaf_value_remove_tag_button fa fa-times" t-att-data-value="val" role="img" aria-label="Remove tag" title="Remove tag"/>
                         </span>
                     </div>
                     <div class="o_domain_leaf_value_tags">
                         <input placeholder="Add new value" type="text" class="o_input"/>
-                        <button class="btn btn-xs btn-primary fa fa-plus o_domain_leaf_value_add_tag_button"/>
+                        <button class="btn btn-xs btn-primary fa fa-plus o_domain_leaf_value_add_tag_button" aria-label="Add tag" title="Add tag"/>
                     </div>
                 </t>
                 <t t-else="">
@@ -724,16 +724,16 @@
         </t>
     </div>
 </div>
-<div t-name="ModelFieldSelector" t-attf-class="o_field_selector#{!widget.options.readonly ? ' o_edit_mode o_input' : ''}">
+<div aria-atomic="true" t-name="ModelFieldSelector" t-attf-class="o_field_selector#{!widget.options.readonly ? ' o_edit_mode o_input' : ''}">
     <div class="o_field_selector_value" tabindex="0"/>
     <div class="o_field_selector_controls" tabindex="0">
-        <i class="fa fa-exclamation-triangle o_field_selector_warning hidden" title="Invalid field chain"/>
+        <i role="alert" class="fa fa-exclamation-triangle o_field_selector_warning hidden" title="Invalid field chain" aria-label="Invalid field chain"/>
     </div>
     <div t-if="!widget.options.readonly" class="o_field_selector_popover hidden" tabindex="0">
         <div class="o_field_selector_popover_header text-center">
-            <i class="fa fa-arrow-left o_field_selector_popover_option o_field_selector_prev_page"/>
+            <i class="fa fa-arrow-left o_field_selector_popover_option o_field_selector_prev_page" title="Previous" role="img" aria-label="Previous"/>
             <div class="o_field_selector_title"/>
-            <i class="fa fa-times o_field_selector_popover_option o_field_selector_close"/>
+            <i class="fa fa-times o_field_selector_popover_option o_field_selector_close" title="Close" role="img" aria-label="Close"/>
         </div>
         <div class="o_field_selector_popover_body">
             <ul class="o_field_selector_page"/>
@@ -746,7 +746,7 @@
 <t t-name="ModelFieldSelector.value">
     <t t-foreach="chain" t-as="fieldName">
         <t t-if="fieldName_index > 0">
-            <i class="fa fa-chevron-right"/>
+            <i class="fa fa-chevron-right" role="img" aria-label="Followed by" title="Followed by"/>
         </t>
         <span class="o_field_selector_chain_part">
             <t t-set="fieldInfo" t-value="_.findWhere(pages[fieldName_index], {'name': fieldName})"/>
@@ -761,13 +761,13 @@
             t-att-data-name="line.name">
             <t t-esc="line.string"/>
             <div t-if="debug" class="text-muted o_field_selector_item_title"><t t-esc="line.name"/> (<t t-esc="line.type"/>)</div>
-            <i t-if="relationToFollow" class="fa fa-chevron-right o_field_selector_relation_icon"/>
+            <i t-if="relationToFollow" class="fa fa-chevron-right o_field_selector_relation_icon" role="img" aria-label="Relation to follow" title="Relation to follow"/>
         </li>
     </t>
 </ul>
 <t t-name="web.datepicker">
     <t t-set="placeholder" t-value="widget.getParent().node and widget.getParent().node.attrs.placeholder"/>
-    <div class="o_datepicker">
+    <div class="o_datepicker" aria-atomic="true">
         <input type="text"
             class="o_datepicker_input o_input"
             t-att-name="widget.name"
@@ -786,7 +786,7 @@
         t-att-id="widget.idForLabel"/>
 </t>
 <t t-name="FieldRadio.button">
-    <div class="o_radio_item">
+    <div class="o_radio_item" aria-atomic="true">
         <input type="radio" class="o_radio_input" t-att-checked="checked ? true : undefined"
             t-att-data-value="value[0]" t-att-data-index="index" t-att-id="id"/>
         <label class="o_form_label" t-att-for="id"><t t-esc="value[1]"/></label>
@@ -804,7 +804,7 @@
         <a t-if="!widget.nodeOptions.no_open" class="o_form_uri" href="#"/>
         <span t-if="widget.nodeOptions.no_open"/>
     </t>
-    <div t-if="widget.mode === 'edit'" class="o_field_widget o_field_many2one">
+    <div t-if="widget.mode === 'edit'" class="o_field_widget o_field_many2one" aria-atomic="true">
         <div class="o_input_dropdown">
             <input type="text" class="o_input"
                 t-att-barcode_events="widget.nodeOptions.barcode_events"
@@ -812,9 +812,9 @@
                 t-att-autofocus="widget.attrs.autofocus"
                 t-att-placeholder="widget.attrs.placeholder"
                 t-att-id="widget.idForLabel"/>
-            <span class="o_dropdown_button" draggable="false"/>
+            <a role="button" class="o_dropdown_button" draggable="false"/>
         </div>
-        <button type="button" t-if="!widget.nodeOptions.no_open" class="fa fa-external-link btn btn-default o_external_button" tabindex="-1" draggable="false"/>
+        <button type="button" t-if="!widget.nodeOptions.no_open" class="fa fa-external-link btn btn-default o_external_button" tabindex="-1" draggable="false" aria-label="External link" title="External link"/>
     </div>
 </t>
 <t t-name="FieldReference" t-extend="FieldMany2One">
@@ -828,23 +828,29 @@
 <t t-name="FieldMany2ManyTag">
     <t t-foreach="elements" t-as="el">
         <t t-set="color" t-value="el[colorField] || 0"/>
-        <span t-attf-class="badge dropdown o_tag_color_#{color}" t-att-data-color="color" t-att-data-index="el_index" t-att-data-id="el.id">
-            <span class="o_badge_text"><t t-esc="el.display_name"/></span>
-            <span t-if="!readonly" class="fa fa-times o_delete"/>
-        </span>
+        <t t-set="colornames" t-value="['No color', 'Red', 'Orange', 'Yellow', 'Light blue', 'Dark purple', 'Salmon pink', 'Medium blue', 'Dark blue', 'Fushia', 'Green', 'Purple']"/>
+        <button t-attf-class="badge dropdown o_tag_color_#{color}" t-att-data-color="color" t-att-data-index="el_index" t-att-data-id="el.id" t-attf-title="Tag color: #{colornames[color]}">
+            <span class="o_badge_text"><span role="img" t-attf-aria-label="Tag color: #{colornames[color]}"/><t t-esc="el.display_name"/></span>
+            <a t-if="!readonly" class="fa fa-times o_delete" title="Delete" aria-label="Delete"/>
+        </button>
     </t>
 </t>
 <t t-name="FieldMany2ManyTag.colorpicker">
     <div class="o_colorpicker dropdown-menu tagcolor_dropdown_menu" role="menu">
         <ul>
-            <li t-foreach="11" t-as="color">
-                <a href="#"
-                   t-att-data-id="tag_id"
-                   t-att-data-color="color+1"
-                   t-attf-class="o_tag_color_#{color+1}"/>
-            </li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_1" data-color="1" title="Red" aria-label="Red"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_2" data-color="2" title="Orange" aria-label="Orange"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_3" data-color="3" title="Yellow" aria-label="Yellow"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_4" data-color="4" title="Light blue" aria-label="Light blue"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_5" data-color="5" title="Dark purple" aria-label="Dark purple"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_6" data-color="6" title="Salmon pink" aria-label="Salmon pink"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_7" data-color="7" title="Medium blue" aria-label="Medium blue"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_8" data-color="8" title="Dark blue" aria-label="Dark blue"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_9" data-color="9" title="Fushia" aria-label="Fushia"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_10" data-color="10" title="Green" aria-label="Green"/></li>
+            <li><a role="menuitem" href="#" t-att-data-id="tag_id" class="o_tag_color_11" data-color="11" title="Purple" aria-label="Purple"/></li>
             <li> <!-- checkbox for tag color 0 -->
-                <div class="o_hide_in_kanban"
+                <div role="menuitem" class="o_hide_in_kanban"
                      t-att-data-id="tag_id"
                      t-att-data-color="0">
                     <div class="o_checkbox">
@@ -857,7 +863,7 @@
     </div>
 </t>
 <t t-name="ProgressBar">
-    <div class="o_progressbar">
+    <div class="o_progressbar" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
         <div t-if="widget.title" class="o_progressbar_title"><t t-esc="widget.title"/></div><div class="o_progress">
             <div class="o_progressbar_complete"/>
         </div><div class="o_progressbar_value"/>
@@ -887,18 +893,26 @@
     </t>
 </t>
 <t t-name="FieldStatus.content.button">
-    <t t-set="disabled" t-value="!clickable || i.selected"/>
-    <button type="button" t-att-data-value="i.id" t-att-disabled="disabled ? 'disabled' : undefined"
-        t-attf-class="btn btn-sm o_arrow_button btn-#{i.selected ? 'primary' : 'default'}#{disabled ? ' disabled' : ''}">
-        <t t-esc="i.display_name"/>
+    <t t-set="disabled" t-value="!clickable"/>
+    <button type="button" t-att-data-value="i.id" disabled="disabled" title="Current state" aria-pressed="true"
+        class="btn btn-sm o_arrow_button btn-primary disabled" t-if="i.selected" aria-current="step">
+        <t t-esc="i.display_name" role="img" t-attf-aria-label="#{i.display_name} is current state"/>
+    </button>
+    <button type="button" t-att-data-value="i.id" disabled="disabled" title="Not active state" aria-pressed="false"
+        class="btn btn-sm o_arrow_button btn-default disabled" t-if="!i.selected and disabled">
+        <t t-esc="i.display_name" role="img" t-attf-aria-label="#{i.display_name} is not current state"/>
+    </button>
+    <button type="button" t-att-data-value="i.id" title="Not active state, click to change it" aria-pressed="false"
+        class="btn btn-sm o_arrow_button btn-default" t-if="!i.selected and !disabled">
+        <t t-esc="i.display_name" role="img" t-attf-aria-label="Click to change current state to #{i.display_name}"/>
     </button>
 </t>
 <t t-name="FieldBinaryImage">
-    <div class="o_field_image">
+    <div class="o_field_image" aria-atomic="true">
         <t t-if="widget.mode !== 'readonly'">
             <div class="o_form_image_controls">
-                <span class="fa fa-pencil fa-lg pull-left o_select_file_button" title="Edit"/>
-                <span class="fa fa-trash-o fa-lg pull-right o_clear_file_button" title="Clear"/>
+                <button class="fa fa-pencil fa-lg pull-left o_select_file_button" title="Edit" aria-label="Edit"/>
+                <button class="fa fa-trash-o fa-lg pull-right o_clear_file_button" title="Clear" aria-label="Clear"/>
 
                 <span class="o_form_binary_progress">Uploading...</span>
                 <t t-call="HiddenInputFile">
@@ -911,6 +925,7 @@
 </t>
 <t t-name="FieldBinaryImage-img">
     <img class="img img-responsive"
+        alt="Binary file"
         t-att-src='url'
         t-att-border="widget.readonly ? 0 : 1"
         t-att-name="widget.name"/>
@@ -918,7 +933,7 @@
 <t t-name="FieldBinaryFile">
     <a t-if="widget.mode === 'readonly'" href="javascript:void(0)" class="o_form_uri"/>
 
-    <div t-if="widget.mode !== 'readonly'" class="o_field_binary_file">
+    <div t-if="widget.mode !== 'readonly'" class="o_field_binary_file" aria-atomic="true">
         <input type="text" class="o_input"
             readonly="readonly"
             t-att-name="widget.name"
@@ -926,8 +941,8 @@
             t-att-autofocus="widget.attrs.autofocus"/>
 
         <button type="button" class="btn btn-sm btn-primary o_select_file_button" title="Select">Upload your file</button>
-        <button type="button" class="btn btn-sm btn-default fa fa-pencil o_select_file_button" title="Select"/>
-        <button type="button" class="btn btn-sm btn-default fa fa-trash-o o_clear_file_button" title="Clear"/>
+        <button type="button" class="btn btn-sm btn-default fa fa-pencil o_select_file_button" title="Select" aria-label="Select"/>
+        <button type="button" class="btn btn-sm btn-default fa fa-trash-o o_clear_file_button" title="Clear" aria-label="Clear"/>
 
         <span class="o_form_binary_progress">Uploading...</span>
         <t t-call="HiddenInputFile">
@@ -938,7 +953,7 @@
 </t>
 
 <t t-name="HiddenInputFile">
-    <div t-attf-class="o_hidden_input_file #{fileupload_class or ''}" t-att-style="fileupload_style">
+    <div t-attf-class="o_hidden_input_file #{fileupload_class or ''}" t-att-style="fileupload_style" aria-atomic="true">
         <form class="o_form_binary_form" t-att-target="fileupload_id"
               method="post" enctype="multipart/form-data" t-att-action="fileupload_action || '/web/binary/upload'">
             <input type="hidden" name="csrf_token" t-att-value="csrf_token"/>
@@ -953,12 +968,12 @@
 </t>
 
 <t t-name="FieldPdfViewer">
-    <div class="o_field_pdfviewer">
-        <div t-if="widget.mode !== 'readonly'" class="o_form_pdf_controls mt8">
+    <div class="o_field_pdfviewer" aria-atomic="true">
+        <div t-if="widget.mode !== 'readonly'" class="o_form_pdf_controls mt8" role="toolbar" aria-label="PDF controls">
             <span class="o_form_binary_progress">Uploading...</span>
             <button type="button" class="btn btn-sm btn-primary o_select_file_button" title="Select">Upload your file</button>
-            <button class="btn btn-sm btn-default fa fa-pencil o_select_file_button" title="Select" type="button"></button>
-            <button class="btn btn-sm btn-default fa fa-trash-o o_clear_file_button" title="Clear" type="button"></button>
+            <button class="btn btn-sm btn-default fa fa-pencil o_select_file_button" title="Select" aria-label="Select" type="button"></button>
+            <button class="btn btn-sm btn-default fa fa-trash-o o_clear_file_button" title="Clear" aria-label="Clear" type="button"></button>
         </div>
         <iframe class="o_pdfview_iframe o_field_pdfviewer"/>
         <t t-call="HiddenInputPDFFile">
@@ -976,10 +991,10 @@
     </t>
 </t>
 
-<div t-name="FieldBinaryFileUploader" t-attf-class="oe_fileupload #{widget.attrs.class ? widget.attrs.class :''}">
+<div t-name="FieldBinaryFileUploader" t-attf-class="oe_fileupload #{widget.attrs.class ? widget.attrs.class :''}" aria-atomic="true">
     <div class="oe_placeholder_files"/>
     <div t-if="widget.mode !== 'readonly'" class="oe_add">
-        <button class="btn btn-default o_attach"><span class="fa fa-paperclip"/> <t t-esc="widget.string"/></button>
+        <button class="btn btn-default o_attach" title="Attach"><span class="fa fa-paperclip" aria-label="Attach"/> <t t-esc="widget.string"/></button>
         <t t-call="HiddenInputFile">
             <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
             <t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
@@ -990,7 +1005,7 @@
         </t>
     </div>
 </div>
-<div t-name="FieldBinaryFileUploader.files" class="oe_attachments">
+<div t-name="FieldBinaryFileUploader.files" class="oe_attachments" aria-atomic="true">
     <t t-if="widget.mode === 'readonly'">
         <div t-foreach="widget.value.data" t-as="file">
             <a target="_blank" t-att-href="widget.metadata[file.id].url" t-attf-title="#{(file.data.name || file.data.filename) + (file.data.date?' \n('+file.data.date+')':'' )}"><t t-raw="file.data.name || file.data.filename"/></a>
@@ -1000,19 +1015,20 @@
         <div t-foreach="widget.value.data" t-as="file" class="oe_attachment">
             <t t-if="!file.data.upload">
                 <div>
-                    <a href="#" class="fa fa-times pull-right oe_delete" title="Delete this file" t-att-data-id="file.data.id"/>
+                    <a href="#" class="fa fa-times pull-right oe_delete" title="Delete this file" aria-label="Delete this file" t-att-data-id="file.data.id"/>
                     <t t-raw="file.data.name || file.data.filename"/>
                 </div>
                 <a class="o_image" target="_blank" t-att-href="widget.metadata[file.id] ? widget.metadata[file.id].url : false"
                    t-att-title="file.data.name"
+                   t-att-aria-label="file.data.name"
                    t-att-data-mimetype="file.data.mimetype"
                    t-attf-data-src="/web/image/#{file.data.id}/100x80"/>
             </t>
         </div>
         <div t-foreach="widget.uploadingFiles" t-as="file" class="oe_attachment">
             <div>Uploading...</div>
-            <a t-att-title="file.name" t-att-name="file.name" class="o_image">
-                <i class="fa fa-spinner fa-spin fa-5x fa-fw"></i>
+            <a t-att-title="file.name" t-att-aria-label="file.name" t-att-name="file.name" class="o_image">
+                <i class="fa fa-spinner fa-spin fa-5x fa-fw" role="img" aria-label="Loading, please wait..." title="Loading, please wait..."></i>
             </a>
             <div><t t-esc="file.name"/></div>
         </div>
@@ -1087,12 +1103,12 @@
 
 
 
-<div t-name="SearchView" class="o_searchview">
-    <span class="o_searchview_more fa" title="Advanced Search..."/>
+<div t-name="SearchView" class="o_searchview" role="search" aria-autocomplete="list">
+    <span class="o_searchview_more fa" title="Advanced Search..." role="img" aria-label="Advanced Search..."/>
     <div class="o_searchview_input_container"/>
 </div>
 <t t-name="SearchViewMobile">
-    <div class="o_searchview">
+    <div class="o_searchview" role="search" aria-autocomplete="list">
         <button class="o_enable_searchview btn btn-sm fa fa-search"/>
         <div class="o_mobile_search o_hidden">
             <div class="o_mobile_search_header">
@@ -1109,14 +1125,14 @@
     </div>
 </t>
 
-<input t-name="SearchView.InputView" type="text" class="o_searchview_input" accesskey="Q" placeholder="Search..."/>
-<div t-name="SearchView.FacetView" tabindex="0" class="o_searchview_facet">
+<input t-name="SearchView.InputView" type="text" class="o_searchview_input" accesskey="Q" placeholder="Search..." role="searchbox" aria-haspopup="true"/>
+<div t-name="SearchView.FacetView" tabindex="0" class="o_searchview_facet" role="img" aria-label="search">
     <span t-if="widget.model.has('icon')" t-att-class="'fa ' + widget.model.get('icon') + ' o_searchview_facet_label'"/>
     <span t-if="!widget.model.has('icon')" class="o_searchview_facet_label">
         <t t-esc="widget.model.get('category')"/>
     </span>
     <div class="o_facet_values"/>
-    <div class="fa fa-sm fa-remove o_facet_remove"/>
+    <div class="fa fa-sm fa-remove o_facet_remove" role="img" aria-label="Remove" title="Remove"/>
 </div>
 <span t-name="SearchView.FacetView.Value">
     <t t-esc="widget.model.get('label') + (widget.intervalLabel ? (': ' + widget.intervalLabel) : '')"/>
@@ -1129,7 +1145,7 @@
     <li t-foreach="widget.filters" t-as="filter" t-if="!filter.visible || filter.visible()"
             t-att-title="filter.attrs.string ? filter.attrs.help : undefined"
             t-att-data-index="filter_index">
-        <a href="#"><t t-esc="filter.attrs.string or filter.attrs.help or filter.attrs.name or 'Ω'"/></a>
+        <a role="menuitem" href="#"><t t-esc="filter.attrs.string or filter.attrs.help or filter.attrs.name or 'Ω'"/></a>
     </li>
 </t>
 <t t-name="SearchView.field">
@@ -1192,7 +1208,7 @@
     </div>
 </t>
 <t t-name="SearchView.extended_search.proposition">
-    <li class="o_filter_condition">
+    <li role="menuitem" class="o_filter_condition">
         <span class="o_or_filter">or</span>
         <span>
             <select class="o_input o_searchview_extended_prop_field">
@@ -1203,7 +1219,7 @@
                     </option>
                 </t>
             </select>
-            <span class="o_searchview_extended_delete_prop fa fa-trash-o"/>
+            <span class="o_searchview_extended_delete_prop fa fa-trash-o" role="img" aria-label="Delete" title="Delete"/>
         </span>
         <select class="o_input o_searchview_extended_prop_op"/>
         <span class="o_searchview_extended_prop_value"/>
@@ -1225,32 +1241,32 @@
 </t>
 
 <div t-name="SearchView.FavoriteMenu" class="btn-group o_dropdown">
-    <button class="o_dropdown_toggler_btn btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1">
+    <button class="o_dropdown_toggler_btn btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false" tabindex="-1" aria-label="Favorites" title="Favorites">
         <span class="fa fa-star"/> Favorites <span t-attf-class="#{widget.isMobile ? 'fa fa-chevron-right pull-right mt4' : 'caret'}"/>
     </button>
     <ul class="dropdown-menu o_favorites_menu" role="menu">
         <li class="divider user_filter"/>
         <li class="divider shared_filter"/>
         <li class="o_save_search o_closed_menu">
-            <a href="#">Save current search</a>
+            <a role="menuitem" href="#">Save current search</a>
         </li>
-        <li class="o_save_name">
+        <li role="menuitem" class="o_save_name">
             <input type="text"></input>
         </li>
-        <li class="o_save_name">
+        <li role="menuitem" class="o_save_name">
             <span><div class="o_checkbox"><input type="checkbox"/><span/></div> Use by default</span>
         </li>
-        <li class="o_save_name">
-            <span><div class="o_checkbox"><input type="checkbox"/><span/></div> Share with all users </span><span class="fa fa-users"/>
+        <li role="menuitem" class="o_save_name">
+            <span><div class="o_checkbox"><input type="checkbox"/><span/></div> Share with all users </span><span class="fa fa-users" role="img" aria-label="Users" title="Users"/>
         </li>
         <li class="o_save_name">
-            <button type="button" class="btn btn-primary btn-sm">Save</button>
+            <button role="menuitem" type="button" class="btn btn-primary btn-sm">Save</button>
         </li>
     </ul>
 </div>
 
 <div t-name="ExportDialog" class="o_export">
-    <p>
+    <p role="status">
         This wizard will export all data that matches the current search criteria to a CSV file.
         You can export all data or only the fields that can be reimported after modification.
     </p>
@@ -1293,16 +1309,16 @@
     </div>
 </div>
 <p t-name="Export.DomainMessage">
-    <strong t-if="!record.ids_to_export">Please pay attention that all records matching your search filter will be exported. Not only the selected ids.</strong>
-    <strong t-if="record.ids_to_export">Please note that only the selected ids will be exported.</strong>
+    <strong t-if="!record.ids_to_export" role="alert">Please pay attention that all records matching your search filter will be exported. Not only the selected ids.</strong>
+    <strong t-if="record.ids_to_export" role="alert">Please note that only the selected ids will be exported.</strong>
 </p>
 <div t-name="Export.TreeItems"
     t-foreach="fields" t-as="field"
     t-att-data-id="field.id"
     class="o_export_tree_item"
-    tabindex="-1"> <!-- tabindex make the div focusable -->
+    tabindex="-1" role="treeitem"> <!-- tabindex make the div focusable -->
     <span t-if="field.children &amp;&amp; (field.id).split('/').length != 3"
-          class="o_expand_parent fa fa-plus"/>
+          class="o_expand_parent fa fa-plus" role="img" aria-label="Expand parents" title="Expand parents"/>
     <span class="o_tree_column" t-att-title="debug and field.id or None"><t t-esc="field.string"/></span>
 </div>
 <t t-name="Export.SaveList">
@@ -1322,14 +1338,14 @@
 <t t-name="Throbber">
     <div>
         <div class="oe_blockui_spin" style="height: 50px">
-            <img src="/web/static/src/img/spin.png" style="animation: fa-spin 1s infinite steps(12);"/>
+            <img src="/web/static/src/img/spin.png" style="animation: fa-spin 1s infinite steps(12);" alt="Loading..."/>
         </div>
         <br />
         <div class="oe_throbber_message" style="color:white"></div>
     </div>
 </t>
 <t t-name="Spinner">
-    <div class="o_spinner"><i class="fa fa-spinner fa-spin"/></div>
+    <div class="o_spinner"><i class="fa fa-spinner fa-spin" role="img" aria-label="Loading, please wait..." title="Loading, please wait..."/></div>
 </t>
 <t t-name="M2ODialog">
     <div>
@@ -1338,7 +1354,7 @@
     </div>
 </t>
 <t t-name="FieldMany2ManyCheckBoxes">
-    <div>
+    <div aria-atomic="true">
         <div t-foreach="widget.m2mValues" t-as="m2m_value">
             <t t-set="id_for_label" t-value="'o_many2many_checkbox_' + _.uniqueId()"/>
             <div class="o_checkbox">
@@ -1354,7 +1370,7 @@
     <span class="o_stat_text"><t t-esc="text"/></span>
 </t>
 <t t-name="toggle_button">
-    <button type="button" class="o_icon_button" t-att-title="widget.string" t-att-aria-label="widget.string">
+    <button type="button" class="o_icon_button" t-att-title="widget.string" t-att-aria-label="widget.string" aria-pressed="false">
         <i class="fa fa-circle" t-att-title="widget.string"/>
     </button>
 </t>
@@ -1363,14 +1379,14 @@
     <span class="o_pager_counter">
         <span class="o_pager_value"></span> / <span class="o_pager_limit"></span>
     </span>
-    <span class="btn-group btn-group-sm">
+    <span class="btn-group btn-group-sm" aria-atomic="true">
         <!-- accesskeys not wanted in X2Many widgets -->
         <t t-if="widget.options.withAccessKey">
             <t t-set="att_prev" t-value="{'accesskey': 'p'}" />
             <t t-set="att_next" t-value="{'accesskey': 'n'}" />
         </t>
-        <button type="button" class="fa fa-chevron-left btn btn-icon o_pager_previous" t-att="att_prev" aria-label="Previous" tabindex="-1"/>
-        <button type="button" class="fa fa-chevron-right btn btn-icon o_pager_next" t-att="att_next" aria-label="Next" tabindex="-1"/>
+        <button type="button" class="fa fa-chevron-left btn btn-icon o_pager_previous" t-att="att_prev" aria-label="Previous" title="Next" tabindex="-1"/>
+        <button type="button" class="fa fa-chevron-right btn btn-icon o_pager_next" t-att="att_next" aria-label="Next" title="Next" tabindex="-1"/>
     </span>
 </div>
 
@@ -1381,15 +1397,15 @@
 </t>
 
 <t t-name="notification-box">
-    <div t-attf-class="o_notification_box mb0 alert alert-dismissible alert-{{type}}" role="alert">
+    <div t-attf-class="o_notification_box mb0 alert alert-dismissible alert-{{type}}" role="alertdialog">
         <button type="button" class="close" data-dismiss="alert" aria-label="Close">
-            <span aria-hidden="true" class="fa fa-times"></span>
+            <span class="fa fa-times"></span>
         </button>
     </div>
 </t>
 
 <t t-name="translation-alert">
-    <div>
+    <div role="alertdialog">
         Please update translations of :
         <t t-foreach="fields" t-as="field">
             <strong><a class="oe_field_translate" t-att-name="field.name" href="#"><t t-esc="field.string"/><t t-if="!field_last">, </t></a></strong>
@@ -1400,7 +1416,7 @@
 <t t-name="UserMenu">
     <li class="o_user_menu">
         <a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" href="#">
-            <img class="img-circle oe_topbar_avatar" t-att-src="_s + '/web/static/src/img/user_menu_avatar.png'"/>
+            <img class="img-circle oe_topbar_avatar" t-att-src="_s + '/web/static/src/img/user_menu_avatar.png'" alt="Avatar"/>
             <span class="oe_topbar_name"/>
         </a>
         <ul class="dropdown-menu" role="menu">
@@ -1410,17 +1426,17 @@
 </t>
 
 <t t-name="UserMenu.Actions">
-    <li><a href="#" data-menu="documentation">Documentation</a></li>
-    <li><a href="#" data-menu="support">Support</a></li>
-    <li class="divider"/>
-    <li><a href="#" data-menu="settings">Preferences</a></li>
-    <li><a href="#" data-menu="account">My Odoo.com account</a></li>
-    <li><a href="#" data-menu="logout">Log out</a></li>
+    <li><a role="menuitem" href="#" data-menu="documentation">Documentation</a></li>
+    <li><a role="menuitem" href="#" data-menu="support">Support</a></li>
+    <li role="separator" class="divider"/>
+    <li><a role="menuitem" href="#" data-menu="settings">Preferences</a></li>
+    <li><a role="menuitem" href="#" data-menu="account">My Odoo.com account</a></li>
+    <li><a role="menuitem" href="#" data-menu="logout">Log out</a></li>
 </t>
 
 <t t-name="SwitchCompanyMenu">
     <li class="o_switch_company_menu">
-        <a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" href="#">
+        <a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" href="#" aria-label="Dropdown menu" title="Dropdown menu">
             <span t-attf-class="#{widget.isMobile ? 'fa fa-building-o' : 'oe_topbar_name'}"/> <span class="caret"/>
         </a>
         <ul class="dropdown-menu" role="menu"/>
@@ -1428,35 +1444,35 @@
 </t>
 
 <t t-name="EnterpriseUpgrade">
-    <div class="row">
+    <div class="row" role="status">
         <div class="col-xs-6">
             Get this feature and much more with Odoo Enterprise!
             <ul class="list-unstyled">
-                <li><i class="fa fa-check"></i> Access to all Enterprise Apps</li>
-                <li><i class="fa fa-check"></i> New design</li>
-                <li><i class="fa fa-check"></i> Mobile support</li>
-                <li><i class="fa fa-check"></i> Upgrade to future versions</li>
-                <li><i class="fa fa-check"></i> Bugfixes guarantee</li>
-                <li><a href="http://www.odoo.com/editions" target="_blank"><i class="fa fa-plus"></i> And more</a></li>
+                <li><span class="fa fa-check"> Access to all Enterprise Apps</span></li>
+                <li><span class="fa fa-check"> New design</span></li>
+                <li><span class="fa fa-check"> Mobile support</span></li>
+                <li><span class="fa fa-check"> Upgrade to future versions</span></li>
+                <li><span class="fa fa-check"> Bugfixes guarantee</span></li>
+                <li><a href="http://www.odoo.com/editions" target="_blank"><span class="fa fa-plus"> And more</span></a></li>
             </ul>
         </div>
         <div class="col-xs-6">
-            <img class="img-responsive" t-att-src='_s + "/web/static/src/img/enterprise_upgrade.jpg"' draggable="false"/>
+            <img class="img-responsive" t-att-src='_s + "/web/static/src/img/enterprise_upgrade.jpg"' draggable="false" alt="Upgrade to enterprise"/>
         </div>
     </div>
 </t>
 
 <t t-name="BaseSetting.Tabs">
     <t t-foreach="tabItems" t-as="tab">
-        <div class="tab" t-attf-data-key="#{tab.key}">
+        <div class="tab" t-attf-data-key="#{tab.key}" role="tab">
             <div class="icon hidden-xs" t-attf-style="background : url('#{imgurl}') no-repeat center;background-size:contain;"/> <span class="app_name"><t t-esc="tab.string"/></span>
         </div>
     </t>
 </t>
 
 <t t-name="BaseSetting.SearchHeader">
-    <div class="settingSearchHeader o_hidden">
-        <img class="icon" t-att-src="imgurl"></img>
+    <div class="settingSearchHeader o_hidden" role="search">
+        <img class="icon" t-att-src="imgurl" alt="Search"></img>
         <span class="appName"><t t-esc="string"/></span>
     </div>
 </t>
diff --git a/addons/web/static/src/xml/dialog.xml b/addons/web/static/src/xml/dialog.xml
index 68c3ab3f2e31..eb1a67ee98d7 100644
--- a/addons/web/static/src/xml/dialog.xml
+++ b/addons/web/static/src/xml/dialog.xml
@@ -3,15 +3,15 @@
 
 <!-- These templates are accessible in backend and frontend -->
 
-<div t-name="Dialog" t-attf-class="modal#{technical ? ' o_technical_modal' : ''}" tabindex="-1" data-backdrop="static" role="dialog" aria-hidden="true" t-att-id="_.uniqueId('modal_')">
+<div role="dialog" t-name="Dialog" t-attf-class="modal#{technical ? ' o_technical_modal' : ''}" tabindex="-1" data-backdrop="static" t-att-id="_.uniqueId('modal_')">
     <div class="modal-dialog">
         <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-hidden="true" tabindex="-1">×</button>
+            <header class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close" tabindex="-1">×</button>
                 <h4 class="modal-title"><t t-raw="title"/><span class="o_subtitle text-muted small"><t t-esc="subtitle"/></span></h4>
-            </div>
-            <div class="modal-body"/>
-            <div class="modal-footer"/>
+            </header>
+            <main class="modal-body"/>
+            <footer class="modal-footer"/>
         </div>
     </div>
 </div>
diff --git a/addons/web/static/src/xml/kanban.xml b/addons/web/static/src/xml/kanban.xml
index 67514072c95e..4b62f52cda85 100644
--- a/addons/web/static/src/xml/kanban.xml
+++ b/addons/web/static/src/xml/kanban.xml
@@ -9,18 +9,19 @@
 </t>
 
 <t t-name="KanbanView.Group">
-    <div t-attf-class="o_kanban_group#{widget.data_records.length == 0 ? ' o_kanban_no_records' : ''}" t-att-data-id="widget.id or widget.db_id">
+    <div t-attf-class="o_kanban_group#{widget.data_records.length == 0 ? ' o_kanban_no_records' : ''}" t-att-data-id="widget.id or widget.db_id"
+        role="feed" t-attf-aria-labelledby="kanban_header_#{widget.id or widget.db_id}">
         <div class="o_kanban_header">
             <div class="o_kanban_header_title" t-att-title="widget.data_records.length + ' records'" data-delay="500">
-                <span class="o_column_title"><t t-esc="widget.title"/></span>
-                <span class="o_column_unfold"><i class="fa fa-arrows-h"/></span>
+                <span t-attf-id="#kanban_header_#{widget.id or widget.db_id}" class="o_column_title"><t t-esc="widget.title"/></span>
+                <span class="o_column_unfold"><i class="fa fa-arrows-h" role="img" aria-label="Unfold" title="Unfold"/></span>
                 <span class="o_kanban_config dropdown">
-                    <a class="dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-gear"/></a>
+                    <a class="dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-gear" role="img" aria-label="Settings" title="Settings"/></a>
                     <ul class="dropdown-menu" role="menu">
-                        <li><a class="o_kanban_toggle_fold" href="#">Fold</a></li>
+                        <li><a role="menuitem" class="o_kanban_toggle_fold" href="#">Fold</a></li>
                         <t t-if="widget.grouped_by_m2o">
-                            <li t-if="widget.editable and widget.id"><a class="o_column_edit" href="#">Edit Stage</a></li>
-                            <li t-if="widget.deletable and widget.id"><a class="o_column_delete" href="#">Delete</a></li>
+                            <li t-if="widget.editable and widget.id"><a role="menuitem" class="o_column_edit" href="#">Edit Stage</a></li>
+                            <li t-if="widget.deletable and widget.id"><a role="menuitem" class="o_column_delete" href="#">Delete</a></li>
                         </t>
                         <t t-if="widget.has_active_field">
                             <li><a class="o_column_archive_records" href="#">Archive All</a></li>
@@ -28,7 +29,7 @@
                         </t>
                     </ul>
                 </span>
-                <span t-if="widget.quick_create" class="o_kanban_quick_add"><i class="fa fa-plus"/></span>
+                <span t-if="widget.quick_create" class="o_kanban_quick_add"><i class="fa fa-plus" role="img" aria-label="Quick add" title="Quick add"/></span>
             </div>
         </div>
         <div t-if="widget.remaining > 0" class="o_kanban_load_more">
@@ -44,7 +45,7 @@
 <t t-name="KanbanView.ColumnQuickCreate">
     <div class="o_column_quick_create">
         <div class="o_quick_create_folded">
-            <span class="o_kanban_add_column"><i class="fa fa-plus"/></span>
+            <span class="o_kanban_add_column"><i class="fa fa-plus" role="img" aria-label="Add column" title="Add column"/></span>
             <span class="o_kanban_title">Add a Column</span>
         </div>
         <div class="o_quick_create_unfolded">
@@ -56,7 +57,7 @@
                     </span>
                 </div>
                 <t t-if="widget.examples">
-                    <span class="btn-link o_kanban_examples">Examples</span>
+                    <a href="#" role="button" class="btn-link o_kanban_examples">Examples</a>
                 </t>
                 <span class="o_discard_msg text-muted pull-right">Esc to discard</span>
             </div>
@@ -76,9 +77,18 @@
 </t>
 
 <t t-name="KanbanColorPicker">
-    <li t-foreach="12" t-as="color">
-        <a href="#" t-att-data-color="color_index" t-attf-class="oe_kanban_color_#{color}"/>
-    </li>
+    <li><a role="menuitem" href="#" data-color="0" class="oe_kanban_color_0" title="No color" aria-label="No color"/></li>
+    <li><a role="menuitem" href="#" data-color="1" class="oe_kanban_color_1" title="Red" aria-label="Red"/></li>
+    <li><a role="menuitem" href="#" data-color="2" class="oe_kanban_color_2" title="Orange" aria-label="Orange"/></li>
+    <li><a role="menuitem" href="#" data-color="3" class="oe_kanban_color_3" title="Yellow" aria-label="Yellow"/></li>
+    <li><a role="menuitem" href="#" data-color="4" class="oe_kanban_color_4" title="Light blue" aria-label="Light blue"/></li>
+    <li><a role="menuitem" href="#" data-color="5" class="oe_kanban_color_5" title="Dark purple" aria-label="Dark purple"/></li>
+    <li><a role="menuitem" href="#" data-color="6" class="oe_kanban_color_6" title="Salmon pink" aria-label="Salmon pink"/></li>
+    <li><a role="menuitem" href="#" data-color="7" class="oe_kanban_color_7" title="Medium blue" aria-label="Medium blue"/></li>
+    <li><a role="menuitem" href="#" data-color="8" class="oe_kanban_color_8" title="Dark blue" aria-label="Dark blue"/></li>
+    <li><a role="menuitem" href="#" data-color="9" class="oe_kanban_color_9" title="Fushia" aria-label="Fushia"/></li>
+    <li><a role="menuitem" href="#" data-color="10" class="oe_kanban_color_10" title="Green" aria-label="Green"/></li>
+    <li><a role="menuitem" href="#" data-color="11" class="oe_kanban_color_11" title="Purple" aria-label="Purple"/></li>
 </t>
 
 <t t-name="GraphCustomTooltip">
@@ -103,6 +113,7 @@
                 <div t-attf-class="progress-bar transition-off bg-#{color_value}-full#{count ? ' o_bar_has_records' : ''}#{widget.activeFilter ? ' active progress-bar-striped' : ''}"
                     t-att-data-filter="color"
                     t-attf-data-original-title="#{count} #{color}"
+                    aria-valuemin="0" aria-valuemax="100" t-att-aria-valuenow="count*100" role="progressbar"
                     t-attf-style="width: #{count ? (count * 100 / widget.groupCount) : 0}%;"/>
             </t>
         </div>
@@ -116,7 +127,7 @@
         <ul class="nav nav-pills nav-stacked">
             <t t-foreach="examples" t-as="example">
                 <li t-att-class="example_index == 0 and 'active' or None">
-                    <a data-toggle="tab" t-attf-href="#example_#{example_index}"> <t t-esc="example.name"/> </a>
+                    <a t-attf-aria-controls="example_#{example_index}" data-toggle="tab" role="tab" t-attf-href="#example_#{example_index}"> <t t-esc="example.name"/> </a>
                 </li>
             </t>
         </ul>
@@ -124,7 +135,7 @@
     <div class="o_kanban_examples_dialog_content">
         <div class="tab-content">
             <t t-foreach="examples" t-as="example">
-                <div t-attf-id="example_#{example_index}" t-attf-class="tab-pane fade #{example_index == 0 and 'active in' or ''}">
+                <div role="tabpanel" t-attf-id="example_#{example_index}" t-attf-class="tab-pane fade #{example_index == 0 and 'active in' or ''}">
                     <div t-if="example.description" class="o_kanban_examples_description">
                         <t t-raw="example.description"/> <!-- description is supposed to be properly escaped -->
                     </div>
@@ -147,7 +158,7 @@
     <div class="o_kanban_examples_ghost">
         <div class="o_ghost_content"/>
         <div class="o_ghost_content o_ghost_tag"/>
-        <img class="pull-right o_ghost_avatar" src="/base/static/img/avatar.png"/>
+        <img class="pull-right o_ghost_avatar" src="/base/static/img/avatar.png" alt="Avatar"/>
     </div>
 </t>
 
diff --git a/addons/web/static/src/xml/web_calendar.xml b/addons/web/static/src/xml/web_calendar.xml
index 7f65ed93a08e..41f772cd52ff 100644
--- a/addons/web/static/src/xml/web_calendar.xml
+++ b/addons/web/static/src/xml/web_calendar.xml
@@ -1,7 +1,7 @@
 <template>
     <div t-name="CalendarView" class="o_calendar_container">
         <div class="o_calendar_view">
-            <div class="o_calendar_buttons"/>
+            <div class="o_calendar_buttons" role="toolbar" aria-label="Calendar toolbar"/>
             <div class="o_calendar_widget" />
         </div>
         <div class="o_calendar_sidebar_container hidden-xs">
@@ -44,17 +44,17 @@
                         <input type="checkbox" name="selection" t-att-checked="(filter.active ? true : undefined)"/><span/>
                     </div>
                     <t t-if="filter.value == 'all'">
-                        <span><i class="fa fa-users fa-fw o_cal_avatar"/></span>
+                        <span><i class="fa fa-users fa-fw o_cal_avatar" role="img" aria-label="Avatar" title="Avatar"/></span>
                     </t>
                     <t t-if="widget.avatar_field &amp;&amp; (filter.value != 'all')">
-                        <img t-attf-src="/web/image/#{widget.avatar_model}/#{filter.value}/#{widget.avatar_field}" class="o_cal_avatar"/>
+                        <img t-attf-src="/web/image/#{widget.avatar_model}/#{filter.value}/#{widget.avatar_field}" class="o_cal_avatar" alt="Avatar"/>
                     </t>
                     <t t-set="color" t-value="widget.getColor(filter.color_index)"/>
                     <span t-if="typeof color === 'number'" t-attf-class="color_filter o_underline_color_#{widget.getColor(filter.color_index)}"><t t-esc="filter.label"/></span>
                     <span t-elif="color" t-attf-style="border-bottom: 4px solid #{color};"><t t-esc="filter.label"/></span>
                     <span t-else=""><t t-esc="filter.label"/></span>
                     <t t-if="filter.id">
-                        <span class="o_remove fa fa-times" title="Remove this favorite from the list"/>
+                        <span class="o_remove fa fa-times" title="Remove this favorite from the list" role="img" aria-label="Remove this favorite from the list"/>
                    </t>
                 </div>
             </div>
@@ -64,9 +64,9 @@
     <t t-name="CalendarView.buttons">
         <div class="o_calendar_buttons">
             <t t-if="!isMobile">
-                <button class="o_calendar_button_prev btn btn-sm btn-primary"><span class="fa fa-arrow-left"/></button>
+                <button class="o_calendar_button_prev btn btn-sm btn-primary" aria-label="Previous" title="Previous"><span class="fa fa-arrow-left"/></button>
                 <button class="o_calendar_button_today btn btn-sm btn-primary">Today</button>
-                <button class="o_calendar_button_next btn btn-sm btn-primary"><span class="fa fa-arrow-right"/></button>
+                <button class="o_calendar_button_next btn btn-sm btn-primary" aria-label="Next" title="Next"><span class="fa fa-arrow-right"/></button>
             </t>
             <div class="btn-group btn-group-sm">
                 <button type="button" class="o_calendar_button_day btn btn-sm btn-default">Day</button>
@@ -78,15 +78,15 @@
 
     <t t-name="CalendarView.TodayButtonMobile">
         <span class="fa-stack o_calendar_button_today">
-            <i class="fa fa-calendar-o fa-stack-2x"></i>
+            <i class="fa fa-calendar-o fa-stack-2x" role="img" aria-label="Today" title="Today"></i>
             <strong class="o_calendar_text fa-stack-1x"><t t-esc="moment().date()"/></strong>
         </span>
     </t>
 
-    <div t-name="CalendarView.quick_create" class="o_calendar_quick_create">
+    <main t-name="CalendarView.quick_create" class="o_calendar_quick_create">
         <div class="form-group">
             <label for='name' class='control-label'>Summary:</label>
             <input type='text' name='name' class="o_input" t-att-value="widget.dataTemplate.name or None"/>
         </div>
-    </div>
+    </main>
 </template>
diff --git a/addons/web/static/tests/chrome/action_manager_tests.js b/addons/web/static/tests/chrome/action_manager_tests.js
index b0a901733634..07febe832343 100644
--- a/addons/web/static/tests/chrome/action_manager_tests.js
+++ b/addons/web/static/tests/chrome/action_manager_tests.js
@@ -2624,12 +2624,12 @@ QUnit.module('ActionManager', {
         // go back to kanban view
         $('.o_control_panel .breadcrumb li:first a').click();
 
-        assert.strictEqual($('.modal .modal-body').text(),
+        assert.strictEqual($('main.modal-body:first').text(),
             "The record has been modified, your changes will be discarded. Do you want to proceed?",
             "should display a modal dialog to confirm discard action");
 
         // cancel
-        $('.modal .modal-footer button.btn-default').click();
+        $('footer.modal-footer button.btn-default').click();
 
         assert.strictEqual(actionManager.$('.o_form_view').length, 1,
             "should still be in form view");
@@ -2638,7 +2638,7 @@ QUnit.module('ActionManager', {
         $('.o_control_panel .breadcrumb li:first a').click();
 
         // confirm discard
-        $('.modal .modal-footer button.btn-primary').click();
+        $('footer.modal-footer button.btn-primary').click();
 
         assert.strictEqual(actionManager.$('.o_form_view').length, 0,
             "should no longer be in form view");
@@ -3001,8 +3001,8 @@ QUnit.module('ActionManager', {
 
         assert.strictEqual($('.o_technical_modal .o_form_view').length, 1,
             "should have rendered a form view in a modal");
-        assert.ok($('.o_technical_modal .modal-body').hasClass('o_act_window'),
-            "modal-body element should have classname 'o_act_window'");
+        assert.ok($('.o_technical_modal main').hasClass('o_act_window'),
+            "dialog main element should have classname 'o_act_window'");
         assert.ok($('.o_technical_modal .o_form_view').hasClass('o_form_editable'),
             "form view should be in edit mode");
 
@@ -3032,11 +3032,11 @@ QUnit.module('ActionManager', {
         });
         actionManager.doAction(5);
 
-        assert.strictEqual($('.o_technical_modal .modal-body button.infooter').length, 0,
+        assert.strictEqual($('.o_technical_modal main button.infooter').length, 0,
             "the button should not be in the body");
-        assert.strictEqual($('.o_technical_modal .modal-footer button.infooter').length, 1,
+        assert.strictEqual($('.o_technical_modal footer button.infooter').length, 1,
             "the button should be in the footer");
-        assert.strictEqual($('.o_technical_modal .modal-footer button').length, 1,
+        assert.strictEqual($('.o_technical_modal footer button').length, 1,
             "the modal footer should only contain one button");
 
         actionManager.destroy();
@@ -3066,7 +3066,7 @@ QUnit.module('ActionManager', {
             type: 'ir.actions.client',
         });
 
-        assert.strictEqual($('.modal .o_test').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_test').length, 1,
             "should have rendered the client action in a dialog");
         assert.verifySteps(['on_attach_callback']);
 
diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js
index 9cda103eedd3..e285626f7637 100644
--- a/addons/web/static/tests/fields/basic_fields_tests.js
+++ b/addons/web/static/tests/fields/basic_fields_tests.js
@@ -1842,7 +1842,7 @@ QUnit.module('basic_fields', {
 
         // Actual flow: click on an element of the m2m to get its form view
         form.$('tbody td:contains(gold)').click();
-        assert.strictEqual($('.modal-dialog').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             'The modal should have opened');
         assert.verifySteps([
             "The view's image should have been fetched",
@@ -2570,7 +2570,7 @@ QUnit.module('basic_fields', {
 
         // switch to form view
         form.$('.o_field_widget[name=p] .o_data_row').click();
-        assert.strictEqual($('.modal .o_field_date[name=datetime]').text(), '02/07/2017',
+        assert.strictEqual($('[role="dialog"] .o_field_date[name=datetime]').text(), '02/07/2017',
             'the datetime (date widget) should be correctly displayed in form view');
 
         form.destroy();
@@ -2614,7 +2614,7 @@ QUnit.module('basic_fields', {
 
         // switch to form view
         form.$('.o_field_widget[name=p] .o_data_row').click();
-        assert.strictEqual($('.modal .o_field_date[name=datetime]').text(), '02/08/2017',
+        assert.strictEqual($('[role="dialog"] .o_field_date[name=datetime]').text(), '02/08/2017',
             'the datetime (date widget) should be correctly displayed in form view');
 
         form.destroy();
@@ -4602,13 +4602,13 @@ QUnit.module('basic_fields', {
 
         // open the selection
         form.$(".o_domain_show_selection_button").click();
-        assert.strictEqual($('.modal .o_list_view .o_data_row').length, 2,
+        assert.strictEqual($('[role="dialog"] .o_list_view .o_data_row').length, 2,
             "should have open a list view with 2 records in a dialog");
 
         // click on a record -> should not open the record
         // we don't actually check that it doesn't open the record because even
         // if it tries to, it will crash as we don't define an arch in this test
-        $('.modal .o_list_view .o_data_row:first .o_data_cell').click();
+        $('[role="dialog"] .o_list_view .o_data_row:first .o_data_cell').click();
 
         form.destroy();
     });
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index 9b42c5188910..95b12e9137dd 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -206,7 +206,7 @@ QUnit.module('relational_fields', {
 
         form.$('.o_external_button').click(); // click on the external button (should do an RPC)
 
-        assert.strictEqual($('.modal .modal-title').text().trim(), 'Open: custom label',
+        assert.strictEqual($('[role="dialog"] .modal-title').text().trim(), 'Open: custom label',
                         "dialog title should display the custom string label");
 
         // TODO: test that we can edit the record in the dialog, and that the value is correctly
@@ -246,7 +246,7 @@ QUnit.module('relational_fields', {
         // click on the external button (should do an RPC)
         form.$('.o_external_button').click();
         // save and close modal
-        $('.modal .modal-footer .btn-primary:first').click();
+        $('footer.modal-footer .btn-primary:first').click();
         // save form
         form.$buttons.find('.o_form_button_save').click();
         // click next on pager
@@ -315,10 +315,10 @@ QUnit.module('relational_fields', {
         // click on the external button (should do an RPC)
         form.$('.o_external_button').click();
 
-        $('.modal input[name="foo"]').val('brandon').trigger('input');
+        $('[role="dialog"] input[name="foo"]').val('brandon').trigger('input');
 
         // save and close modal
-        $('.modal .modal-footer .btn-primary:first').click();
+        $('footer.modal-footer .btn-primary:first').click();
         // save form
         form.$buttons.find('.o_form_button_save').click();
         // click next on pager
@@ -372,7 +372,7 @@ QUnit.module('relational_fields', {
         assert.strictEqual(form.$('button.o_external_button:visible').length, 1,
             "should still have an open record button");
         form.$('input.o_input').trigger('focusout');
-        assert.strictEqual($('.modal button:contains(Create and edit)').length, 0,
+        assert.strictEqual($('[role="dialog"] button:contains(Create and edit)').length, 0,
             "there should not be a quick create modal");
 
         form.destroy();
@@ -471,10 +471,10 @@ QUnit.module('relational_fields', {
         // open the many2one in form view and change something
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_external_button').click();
-        $('.modal-body input[name="other_field"]').val('wood').trigger('input');
+        $('main.modal-body input[name="other_field"]').val('wood').trigger('input');
 
         // save the modal and make sure an onchange is triggered
-        $('.modal .modal-footer .btn-primary').first().click();
+        $('footer.modal-footer .btn-primary').first().click();
         assert.verifySteps(['read', 'get_formview_id', 'load_views', 'read', 'write', 'onchange', 'read']);
 
         // save the main record, and check that no extra rpcs are done (record
@@ -572,20 +572,20 @@ QUnit.module('relational_fields', {
         form.$('.o_field_many2one input').click();
         // click on 'Search More' (mouseenter required by ui-autocomplete)
         $dropdown.find('.o_m2o_dropdown_option:contains(Search)').mouseenter().click();
-        assert.ok($('.modal .o_list_view').length, "should have opened a list view in a modal");
-        assert.ok(!$('.modal .o_list_view .o_list_record_selector').length,
+        assert.ok($('[role="dialog"] .o_list_view').length, "should have opened a list view in a modal");
+        assert.ok(!$('[role="dialog"] .o_list_view .o_list_record_selector').length,
             "there should be no record selector in the list view");
-        assert.ok(!$('.modal .modal-footer .o_select_button').length,
+        assert.ok(!$('footer.modal-footer .o_select_button').length,
             "there should be no 'Select' button in the footer");
-        assert.ok($('.modal tbody tr').length > 10, "list should contain more than 10 records");
+        assert.ok($('[role="dialog"] tbody tr').length > 10, "list should contain more than 10 records");
         // filter the list using the searchview
-        $('.modal .o_searchview_input').trigger({type: 'keypress', which: 80}); // P
-        $('.modal .o_searchview_input').trigger({type: 'keydown', which: 13}); // enter
-        assert.strictEqual($('.modal tbody tr').length, 10,
+        $('[role="dialog"] .o_searchview_input').trigger({type: 'keypress', which: 80}); // P
+        $('[role="dialog"] .o_searchview_input').trigger({type: 'keydown', which: 13}); // enter
+        assert.strictEqual($('[role="dialog"] tbody tr').length, 10,
             "list should be restricted to records containing a P (10 records)");
         // choose a record
-        $('.modal tbody tr:contains(Partner 20)').click(); // choose record 'Partner 20'
-        assert.ok(!$('.modal').length, "should have closed the modal");
+        $('[role="dialog"] tbody tr:contains(Partner 20)').click(); // choose record 'Partner 20'
+        assert.ok(!$('[role="dialog"]').length, "should have closed the modal");
         assert.ok(!$dropdown.is(':visible'), 'should have closed the dropdown');
         assert.strictEqual(form.$('.o_field_many2one input').val(), 'Partner 20',
                     'value of the m2o should have been correctly updated');
@@ -1690,7 +1690,7 @@ QUnit.module('relational_fields', {
             form.$('.o_data_cell').click();
             form.$('.o_external_button').click();
 
-            var $modal = $('.modal-dialog');
+            var $modal = $('[role="dialog"]');
             assert.equal($modal.length, 1,
                 'There should be 1 modal opened');
 
@@ -1702,7 +1702,7 @@ QUnit.module('relational_fields', {
                                   {position: 'top'});
 
             // Saving the modal and then the original model
-            $modal.find('.modal-footer .btn-primary').click();
+            $modal.find('footer.modal-footer .btn-primary').click();
             form.$buttons.find('.o_form_button_save').click();
 
             assert.verifySteps(['onchange sequence', 'partner_type write']);
@@ -1900,7 +1900,7 @@ QUnit.module('relational_fields', {
         form.$('.o_field_many2one input').focus();
         form.$('.o_field_many2one input').val('new partner').trigger('keyup').trigger('focusout');
 
-        $('.modal .modal-footer .btn-primary').first().click();
+        $('footer.modal-footer .btn-primary').first().click();
 
         form.destroy();
     });
@@ -1928,14 +1928,14 @@ QUnit.module('relational_fields', {
 
         // cancel the many2one creation with Cancel button
         form.$('.o_field_many2one input').focus().val('new product').trigger('keyup').trigger('blur');
-        assert.strictEqual($('.modal').length, 1, "there should be one opened modal");
-        $('.modal .modal-footer .btn:contains(Cancel)').click();
+        assert.strictEqual($('[role="dialog"]').length, 1, "there should be one opened modal");
+        $('footer.modal-footer .btn:contains(Cancel)').click();
         assert.strictEqual(form.$('.o_field_many2one input').val(), "",
             'the many2one should not set a value as its creation has been cancelled (with Cancel button)');
 
         // cancel the many2one creation with Close button
         form.$('.o_field_many2one input').focus().val('new product').trigger('keyup').trigger('blur');
-        $('.modal .modal-header button').click();
+        $('header.modal-header button').click();
         assert.strictEqual(form.$('.o_field_many2one input').val(), "",
             'the many2one should not set a value as its creation has been cancelled (with Close button)');
 
@@ -1944,16 +1944,16 @@ QUnit.module('relational_fields', {
         form.$('.o_field_many2one input').autocomplete('widget').find('a').first().click();
         assert.strictEqual(form.$('input').val(), "xphone", "should have selected xphone");
         form.$('.o_field_many2one input').focus().val('new product').trigger('keyup').trigger('blur');
-        assert.strictEqual($('.modal').length, 1, "there should be one opened modal");
-        $('.modal .modal-footer .btn:contains(Cancel)').click();
+        assert.strictEqual($('[role="dialog"]').length, 1, "there should be one opened modal");
+        $('footer.modal-footer .btn:contains(Cancel)').click();
         assert.strictEqual(form.$('.o_field_many2one input').val(), "xphone",
             'should have restored the many2one with its previous selected value (xphone)');
 
         // confirm the many2one creation
         form.$('.o_field_many2one input').focus();
         form.$('.o_field_many2one input').val('new partner').trigger('keyup').trigger('blur');
-        $('.modal .modal-footer .btn-primary').click();
-        assert.strictEqual($('.modal .o_form_view').length, 1,
+        $('footer.modal-footer .btn-primary').click();
+        assert.strictEqual($('[role="dialog"] .o_form_view').length, 1,
             'a new modal should be opened and contain a form view');
 
         form.destroy();
@@ -1976,7 +1976,7 @@ QUnit.module('relational_fields', {
         form.$('.o_field_many2one input').focus();
         form.$('.o_field_many2one input').val('new partner').trigger('keyup').trigger('focusout');
 
-        assert.strictEqual($('.modal').length, 0, "should not display the create modal");
+        assert.strictEqual($('[role="dialog"]').length, 0, "should not display the create modal");
         form.destroy();
     });
 
@@ -2019,14 +2019,14 @@ QUnit.module('relational_fields', {
             "there should be an external button displayed");
 
         form.$('.o_field_many2one .o_external_button').click();
-        assert.strictEqual($('.modal .o_form_view.o_form_readonly').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_form_view.o_form_readonly').length, 1,
             "there should be a readonly form view opened");
 
-        $('.modal .o_form_button_cancel').click();
+        $('[role="dialog"] .o_form_button_cancel').click();
 
         form.$('.o_field_many2one input').val('new product').trigger('keyup').trigger('focusout');
 
-        assert.strictEqual($('.modal').length, 0, "should not display the create modal");
+        assert.strictEqual($('[role="dialog"]').length, 0, "should not display the create modal");
         form.destroy();
     });
 
@@ -2143,10 +2143,10 @@ QUnit.module('relational_fields', {
             }));
             concurrency.delay(0).then(function() {
                 $input.blur();
-                assert.strictEqual($('.modal').length, 1,
+                assert.strictEqual($('[role="dialog"]').length, 1,
                     "should have one modal in body");
                 // Check that discarding clears $input
-                $('.modal .o_form_button_cancel').click();
+                $('[role="dialog"] .o_form_button_cancel').click();
                 assert.strictEqual($input.val(), '',
                     "the field should be empty");
                 form.destroy();
@@ -2202,7 +2202,7 @@ QUnit.module('relational_fields', {
                 which: $.ui.keyCode.ENTER,
                 keyCode: $.ui.keyCode.ENTER,
             }));
-            assert.strictEqual($('div.modal').length, 0, "should not have any modal in DOM");
+            assert.strictEqual($('[role="dialog"]').length, 0, "should not have any modal in DOM");
             assert.verifySteps(['name_search', 'onchange', 'write', 'read']);
             list.destroy();
             relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY;
@@ -2258,7 +2258,7 @@ QUnit.module('relational_fields', {
                 keyCode: $.ui.keyCode.ENTER,
             }));
             def.resolve();
-            assert.strictEqual($('div.modal').length, 0, "should not have any modal in DOM");
+            assert.strictEqual($('[role="dialog"]').length, 0, "should not have any modal in DOM");
             assert.verifySteps(['name_search', 'onchange', 'write', 'read']);
             list.destroy();
             relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY;
@@ -2409,15 +2409,15 @@ QUnit.module('relational_fields', {
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_data_row td:contains(first record)').click();
         form.$('.o_external_button').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "should have one modal in body");
 
         // Changing the 'trululu' value
-        $('.modal input[name="display_name"]').val('test').trigger('input');
-        $('.modal button.btn-primary').click();
+        $('[role="dialog"] input[name="display_name"]').val('test').trigger('input');
+        $('[role="dialog"] button.btn-primary').click();
 
         // Test whether the value has changed
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             "the modal should be closed");
         assert.equal(form.$('.o_data_cell:contains(test)').text(), 'test',
             "the partner name should have been updated to 'test'");
@@ -2504,7 +2504,7 @@ QUnit.module('relational_fields', {
         form.$buttons.find('.btn.btn-primary.btn-sm.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
 
-        var $modal = $('.modal-dialog.modal-lg');
+        var $modal = $('.modal-lg');
 
         assert.equal($modal.length, 1,
             'There should be one modal');
@@ -2532,7 +2532,7 @@ QUnit.module('relational_fields', {
         // Third round: re-add 1 records
         form.$('.o_field_x2many_list_row_add a').click();
 
-        $modal = $('.modal-dialog.modal-lg');
+        $modal = $('.modal-lg');
 
         assert.equal($modal.length, 1,
             'There should be one modal');
@@ -3370,7 +3370,7 @@ QUnit.module('relational_fields', {
         assert.equal(form.$('.o_field_one2many td[class="o_data_cell"]').text(), "blurp#21#22#23#24#25#26#27#28#29",
             "should display the records in order with the changes");
 
-        $('.modal .modal-footer button:first').click();
+        $('footer.modal-footer button:first').click();
 
         assert.equal(form.$('.o_field_one2many td[class="o_data_cell"]').text(), "#20#21#22#23#24#25#26#27#28#29",
             "should cancel changes and display the records in order");
@@ -3402,7 +3402,7 @@ QUnit.module('relational_fields', {
         assert.equal(form.$('.o_field_one2many td[class="o_data_cell"]').text(), "#20#39#40#41#42#43#44#45#46#47",
             "should display the records in order after resequence");
 
-        $('.modal .modal-footer button:first').click();
+        $('footer.modal-footer button:first').click();
 
         assert.equal(form.$('.o_field_one2many td[class="o_data_cell"]').text(), "#20#21#22#23#24#25#26#27#28#29",
             "should cancel changes and display the records in order");
@@ -3750,62 +3750,62 @@ QUnit.module('relational_fields', {
         // in its relation
         form.$('.o_data_row').click();
 
-        assert.strictEqual($('.modal').length, 1, "should have opened a dialog");
-        assert.strictEqual($('.modal .o_data_row').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 1, "should have opened a dialog");
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 0,
             "there should be no record in the one2many in the dialog");
 
         // add a many2many subrecord
-        $('.modal .o_field_x2many_list_row_add a').click();
+        $('[role="dialog"] .o_field_x2many_list_row_add a').click();
 
-        assert.strictEqual($('.modal').length, 2,
+        assert.strictEqual($('[role="dialog"]').length, 2,
             "should have opened a second dialog");
 
         // select a many2many subrecord
-        $('.modal:nth(1) .o_list_view .o_data_cell:first').click();
+        $('[role="dialog"]:nth(1) .o_list_view .o_data_cell:first').click();
 
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "second dialog should be closed");
-        assert.strictEqual($('.modal .o_data_row').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 1,
             "there should be one record in the one2many in the dialog");
-        assert.notOk($('.modal .o_x2m_control_panel .o_cp_pager div').is(':visible'),
+        assert.notOk($('[role="dialog"] .o_x2m_control_panel .o_cp_pager div').is(':visible'),
             'm2m pager should be hidden');
 
         // click on 'Save & Close'
-        $('.modal .modal-footer .btn-primary:first').click();
+        $('footer.modal-footer .btn-primary:first').click();
 
-        assert.strictEqual($('.modal').length, 0, "dialog should be closed");
+        assert.strictEqual($('[role="dialog"]').length, 0, "dialog should be closed");
 
         // reopen o2m record, and another m2m subrecord in its relation, but
         // discard the changes
         form.$('.o_data_row').click();
 
-        assert.strictEqual($('.modal').length, 1, "should have opened a dialog");
-        assert.strictEqual($('.modal .o_data_row').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1, "should have opened a dialog");
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 1,
             "there should be one record in the one2many in the dialog");
 
         // add another m2m subrecord
-        $('.modal .o_field_x2many_list_row_add a').click();
+        $('[role="dialog"] .o_field_x2many_list_row_add a').click();
 
-        assert.strictEqual($('.modal').length, 2,
+        assert.strictEqual($('[role="dialog"]').length, 2,
             "should have opened a second dialog");
 
-        $('.modal:nth(1) .o_list_view .o_data_cell:first').click();
+        $('[role="dialog"]:nth(1) .o_list_view .o_data_cell:first').click();
 
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "second dialog should be closed");
-        assert.strictEqual($('.modal .o_data_row').length, 2,
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 2,
             "there should be two records in the one2many in the dialog");
 
         // click on 'Discard'
-        $('.modal .modal-footer .btn-default').click();
+        $('footer.modal-footer .btn-default').click();
 
-        assert.strictEqual($('.modal').length, 0, "dialog should be closed");
+        assert.strictEqual($('[role="dialog"]').length, 0, "dialog should be closed");
 
         // reopen o2m record to check that second changes have properly been discarded
         form.$('.o_data_row').click();
 
-        assert.strictEqual($('.modal').length, 1, "should have opened a dialog");
-        assert.strictEqual($('.modal .o_data_row').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1, "should have opened a dialog");
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 1,
             "there should be one record in the one2many in the dialog");
 
         form.destroy();
@@ -4158,8 +4158,8 @@ QUnit.module('relational_fields', {
         checkRead = true;
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o-kanban-button-new').click();
-        $('.modal input').val('new record').trigger('input');
-        $('.modal .modal-footer .btn-primary:first').click(); // save and close
+        $('[role="dialog"] input').val('new record').trigger('input');
+        $('footer.modal-footer .btn-primary:first').click(); // save and close
         // checks
         assert.strictEqual(readIDs, undefined, "should not have read any record");
         assert.strictEqual(form.$('span:contains(new record)').length, 0,
@@ -4195,8 +4195,8 @@ QUnit.module('relational_fields', {
         readIDs = undefined;
         // add and delete a record in page 1
         form.$('.o-kanban-button-new').click();
-        $('.modal input').val('new record page 1').trigger('input');
-        $('.modal .modal-footer .btn-primary:first').click(); // save and close
+        $('[role="dialog"] input').val('new record page 1').trigger('input');
+        $('footer.modal-footer .btn-primary:first').click(); // save and close
         assert.strictEqual(form.$('.o_kanban_record:first span:contains(relational record 11)').length,
             1, 'first record should be the one with id 11 (next checks rely on that)');
         form.$('.delete_icon:first').click();
@@ -4210,8 +4210,8 @@ QUnit.module('relational_fields', {
         readIDs = undefined;
         form.$('.delete_icon:first').click();
         form.$('.o-kanban-button-new').click();
-        $('.modal input').val('new record page 2').trigger('input');
-        $('.modal .modal-footer .btn-primary:first').click(); // save and close
+        $('[role="dialog"] input').val('new record page 2').trigger('input');
+        $('footer.modal-footer .btn-primary:first').click(); // save and close
         assert.strictEqual(readIDs, undefined, "should not have read any record");
         // checks
         assert.strictEqual(form.$('.o_kanban_record:not(".o_kanban_ghost")').length, 5,
@@ -4255,13 +4255,13 @@ QUnit.module('relational_fields', {
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
         $('input[name="turtle_int"]').val('5').trigger('input');
-        $('.modal-footer button.btn-primary').first().click();
+        $('footer.modal-footer button.btn-primary').first().click();
         assert.strictEqual(form.$('tbody tr:eq(1) td.o_data_cell').text(), '5',
             'should display 5 in the foo field');
         form.$('tbody tr:eq(1) td.o_data_cell').click();
 
         $('input[name="turtle_int"]').val('3').trigger('input');
-        $('.modal-footer button.btn-primary').first().click();
+        $('footer.modal-footer button.btn-primary').first().click();
         assert.strictEqual(form.$('tbody tr:eq(1) td.o_data_cell').text(), '3',
             'should now display 3 in the foo field');
         form.destroy();
@@ -4358,7 +4358,7 @@ QUnit.module('relational_fields', {
         form.$buttons.find('.o_form_button_cancel').click();
         assert.strictEqual(form.$('.o_field_one2many tbody td').first().text(), 'new value',
             "changes shouldn't have been discarded yet, waiting for user confirmation");
-        $('.modal .modal-footer .btn-primary').click();
+        $('footer.modal-footer .btn-primary').click();
         assert.strictEqual(form.$('.o_field_one2many tbody td').first().text(), 'relational record 1',
             "display name of first record in o2m list should be 'relational record 1'");
 
@@ -4557,15 +4557,15 @@ QUnit.module('relational_fields', {
         // edit existing subrecord
         form.$('.oe_kanban_global_click').click();
 
-        $('.modal .o_form_view input').val('new name').trigger('input');
-        $('.modal .modal-footer .btn-primary').click(); // save
+        $('[role="dialog"] .o_form_view input').val('new name').trigger('input');
+        $('footer.modal-footer .btn-primary').click(); // save
         assert.strictEqual(form.$('.o_kanban_record span:first').text(), 'new name',
             'value of subrecord should have been updated');
 
         // create a new subrecord
         form.$('.o-kanban-button-new').click();
-        $('.modal .o_form_view input').val('new subrecord 1').trigger('input');
-        $('.modal .modal-footer .btn-primary').click(); // save and close
+        $('[role="dialog"] .o_form_view input').val('new subrecord 1').trigger('input');
+        $('footer.modal-footer .btn-primary').click(); // save and close
         assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 2,
             'should contain 2 records');
         assert.strictEqual(form.$('.o_kanban_record:nth(1) span').text(), 'new subrecord 1',
@@ -4573,10 +4573,10 @@ QUnit.module('relational_fields', {
 
         // create two new subrecords
         form.$('.o-kanban-button-new').click();
-        $('.modal .o_form_view input').val('new subrecord 2').trigger('input');
-        $('.modal .modal-footer .btn-primary:nth(1)').click(); // save and new
-        $('.modal .o_form_view input').val('new subrecord 3').trigger('input');
-        $('.modal .modal-footer .btn-primary').click(); // save and close
+        $('[role="dialog"] .o_form_view input').val('new subrecord 2').trigger('input');
+        $('footer.modal-footer .btn-primary:nth(1)').click(); // save and new
+        $('[role="dialog"] .o_form_view input').val('new subrecord 3').trigger('input');
+        $('footer.modal-footer .btn-primary').click(); // save and close
         assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 4,
             'should contain 4 records');
 
@@ -4742,8 +4742,8 @@ QUnit.module('relational_fields', {
         // edit existing subrecord
         form.$('.o_list_view tbody tr:first() td:eq(1)').click();
 
-        $('.modal .o_form_view input').val('new name').trigger('input');
-        $('.modal .modal-footer .btn-primary').click(); // save
+        $('[role="dialog"] .o_form_view input').val('new name').trigger('input');
+        $('footer.modal-footer .btn-primary').click(); // save
         assert.strictEqual(form.$('.o_list_view tbody td:first()').text(), 'new name',
             'value of subrecord should have been updated');
         assert.strictEqual(nbWrite, 0, "should not have write anything in DB");
@@ -4789,9 +4789,9 @@ QUnit.module('relational_fields', {
             '"Add an item" link should not be available in readonly');
 
         form.$('.o_list_view tbody td:first()').click();
-        assert.ok($('.modal .o_form_readonly').length,
+        assert.ok($('[role="dialog"] .o_form_readonly').length,
             'in readonly, clicking on a subrecord should open it in readonly in a dialog');
-        $('.modal .o_form_button_cancel').click(); // close the dialog
+        $('[role="dialog"] .o_form_button_cancel').click(); // close the dialog
 
         form.$buttons.find('.o_form_button_edit').click();
 
@@ -4800,7 +4800,7 @@ QUnit.module('relational_fields', {
 
         // edit existing subrecord
         form.$('.o_list_view tbody td:first()').click();
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             'in edit, clicking on a subrecord should not open a dialog');
         assert.ok(form.$('.o_list_view tbody tr:first()').hasClass('o_selected_row'),
             'first row should be in edition');
@@ -4898,7 +4898,7 @@ QUnit.module('relational_fields', {
 
         // cancel the edition
         form.$buttons.find('.o_form_button_cancel').click();
-        $('.modal-footer button.btn-primary').first().click();
+        $('footer.modal-footer button.btn-primary').first().click();
         assert.strictEqual(form.$('tr.o_data_row').length, 1,
             "should have 1 data rows");
 
@@ -5054,7 +5054,7 @@ QUnit.module('relational_fields', {
         form.$buttons.find('.o_form_button_cancel').click();
 
         // confirm the discard operation
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
 
         assert.strictEqual(form.$('.o_cp_pager').text().trim(), '1-3 / 4',
             "pager should still be visible");
@@ -5129,7 +5129,7 @@ QUnit.module('relational_fields', {
             "pager should still display the correct total");
 
         // click on cancel
-        $('.modal .modal-footer .btn-default').click(); // click on cancel
+        $('footer.modal-footer .btn-default').click(); // click on cancel
 
         assert.strictEqual(form.$('.o_cp_pager').text().trim(), '1-3 / 4',
             "pager should again display the correct total");
@@ -5169,7 +5169,7 @@ QUnit.module('relational_fields', {
 
         // discard
         form.$buttons.find('.o_form_button_cancel').click();
-        $('.modal .modal-footer .btn-primary').click();
+        $('footer.modal-footer .btn-primary').click();
 
         assert.strictEqual(form.$('tr.o_data_row').length, 1,
             "should have 1 data row");
@@ -5216,17 +5216,17 @@ QUnit.module('relational_fields', {
 
         // click elsewhere,
         form.$('label.o_form_label').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             'a confirmation model should be opened');
 
         // click on cancel, the line should still be selected
-        $('.modal .modal-footer button.btn-default').click();
+        $('footer.modal-footer button.btn-default').click();
         assert.strictEqual(form.$('tr.o_data_row.o_selected_row').length, 1,
             "should still have 1 selected data row");
 
         // click elsewhere, and click on ok (on the confirmation dialog)
         form.$('label.o_form_label').click();
-        $('.modal .modal-footer button.btn-primary').click();
+        $('footer.modal-footer button.btn-primary').click();
         assert.strictEqual(form.$('tr.o_data_row').length, 0,
             "should have 0 data rows (invalid line has been discarded");
 
@@ -5427,17 +5427,17 @@ QUnit.module('relational_fields', {
         });
 
         form.$('.o_field_x2many_list_row_add a').click();
-        $('.modal .o_field_x2many_list_row_add a').click();
+        $('[role="dialog"] .o_field_x2many_list_row_add a').click();
 
-        assert.strictEqual($('.modal .o_data_row.o_selected_row').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_data_row.o_selected_row').length, 1,
             "there should be a row in edition in the dialog");
 
         // trigger keydown ESCAPE in the edited row
-        $('.modal .o_data_cell input').trigger({type: 'keydown', which: $.ui.keyCode.ESCAPE});
+        $('[role="dialog"] .o_data_cell input').trigger({type: 'keydown', which: $.ui.keyCode.ESCAPE});
 
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "dialog should still be open");
-        assert.strictEqual($('.modal .o_data_row').length, 0,
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 0,
             "the row should have been removed");
 
         form.destroy();
@@ -6042,8 +6042,8 @@ QUnit.module('relational_fields', {
 
         // click to create a subrecord
         form.$('tbody td.o_field_x2many_list_row_add a').click();
-        $('.modal input').val('new record').trigger('input');
-        $('.modal .modal-footer button:eq(0)').click(); // save and close
+        $('[role="dialog"] input').val('new record').trigger('input');
+        $('footer.modal-footer button:eq(0)').click(); // save and close
 
         assert.ok(!form.$('.o_x2m_control_panel .o_cp_pager div').is(':visible'),
             'o2m pager should be hidden');
@@ -6098,14 +6098,14 @@ QUnit.module('relational_fields', {
 
         form.$('tbody td.o_field_x2many_list_row_add a').click();
 
-        $('.modal .o_field_many2one input').click();
+        $('[role="dialog"] .o_field_many2one input').click();
 
-        var $dropdown = $('.modal .o_field_many2one input').autocomplete('widget');
+        var $dropdown = $('[role="dialog"] .o_field_many2one input').autocomplete('widget');
 
         $dropdown.find('li:eq(1) a').mouseenter();
         $dropdown.find('li:eq(1) a').click();
 
-        $('.modal .modal-footer button:eq(0)').click(); // save and close
+        $('footer.modal-footer button:eq(0)').click(); // save and close
 
         assert.strictEqual(form.$('tbody td:contains(xpad)').length, 1,
             "should display 'xpad' on a td");
@@ -6157,16 +6157,16 @@ QUnit.module('relational_fields', {
         form.$('tbody td.o_field_x2many_list_row_add a').click();
 
         // write in the many2one field, value = 37 (xphone)
-        $('.modal .o_field_many2one input').click();
-        var $dropdown = $('.modal .o_field_many2one input').autocomplete('widget');
+        $('[role="dialog"] .o_field_many2one input').click();
+        var $dropdown = $('[role="dialog"] .o_field_many2one input').autocomplete('widget');
         $dropdown.find('li:eq(0) a').mouseenter();
         $dropdown.find('li:eq(0) a').click();
 
         // write in the integer field
-        $('.modal .modal-body input.o_field_widget').val('123').trigger('input');
+        $('main.modal-body input.o_field_widget').val('123').trigger('input');
 
         // save and close
-        $('.modal .modal-footer button:eq(0)').click();
+        $('footer.modal-footer button:eq(0)').click();
 
         assert.strictEqual(form.$('tbody td:contains(xphone)').length, 1,
             "should display 'xphone' in a td");
@@ -6174,28 +6174,28 @@ QUnit.module('relational_fields', {
         // reopen the record in form view
         form.$('tbody td:contains(xphone)').click();
 
-        assert.strictEqual($('.modal .modal-body input').val(), "xphone",
+        assert.strictEqual($('main.modal-body input').val(), "xphone",
             "should display 'xphone' in an input");
 
-        $('.modal .modal-body input.o_field_widget').val('456').trigger('input');
+        $('main.modal-body input.o_field_widget').val('456').trigger('input');
 
         // discard
-        $('.modal .modal-footer span:contains(Discard)').click();
+        $('footer.modal-footer span:contains(Discard)').click();
 
         // reopen the record in form view
         form.$('tbody td:contains(xphone)').click();
 
-        assert.strictEqual($('.modal .modal-body input.o_field_widget').val(), "123",
+        assert.strictEqual($('main.modal-body input.o_field_widget').val(), "123",
             "should display 123 (previous change has been discarded)");
 
         // write in the many2one field, value = 41 (xpad)
-        $('.modal .o_field_many2one input').click();
-        $dropdown = $('.modal .o_field_many2one input').autocomplete('widget');
+        $('[role="dialog"] .o_field_many2one input').click();
+        $dropdown = $('[role="dialog"] .o_field_many2one input').autocomplete('widget');
         $dropdown.find('li:eq(1) a').mouseenter();
         $dropdown.find('li:eq(1) a').click();
 
         // save and close
-        $('.modal .modal-footer button:eq(0)').click();
+        $('footer.modal-footer button:eq(0)').click();
 
         assert.strictEqual(form.$('tbody td:contains(xpad)').length, 1,
             "should display 'xpad' in a td");
@@ -6245,7 +6245,7 @@ QUnit.module('relational_fields', {
         form.$('tr.o_data_row:eq(0) td:contains(xphone)').click();
 
         // write in the many2one field
-        $('.modal .o_field_many2one input').click();
+        $('[role="dialog"] .o_field_many2one input').click();
 
         form.destroy();
     });
@@ -6513,29 +6513,29 @@ QUnit.module('relational_fields', {
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
 
-        assert.strictEqual($('.modal .o_data_row').length, 2,
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 2,
             "sould have 2 records in the select view (the last one is not displayed because it is already selected)");
 
-        $('.modal .o_data_row:first .o_list_record_selector input').click();
-        $('.modal .o_select_button').click();
+        $('[role="dialog"] .o_data_row:first .o_list_record_selector input').click();
+        $('[role="dialog"] .o_select_button').click();
         $('.o_form_button_save').click();
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
 
-        assert.strictEqual($('.modal .o_data_row').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 1,
             "sould have 1 record in the select view");
 
-        $('.modal-footer button:eq(1)').click();
-        $('.modal input.o_field_widget[name="turtle_foo"]').val('tototo').trigger('input');
-        $('.modal input.o_field_widget[name="turtle_int"]').val(50).trigger('input');
-        var $many2one = $('.modal [name="product_id"] input').click();
+        $('footer.modal-footer button:eq(1)').click();
+        $('[role="dialog"] input.o_field_widget[name="turtle_foo"]').val('tototo').trigger('input');
+        $('[role="dialog"] input.o_field_widget[name="turtle_int"]').val(50).trigger('input');
+        var $many2one = $('[role="dialog"] [name="product_id"] input').click();
         var $dropdown = $many2one.autocomplete('widget');
         $dropdown.find('li:first a').mouseenter();
         $dropdown.find('li:first a').click();
 
-        $('.modal-footer button:contains(&):first').click();
+        $('footer.modal-footer button:contains(&):first').click();
 
-        assert.strictEqual($('.modal').length, 0, "sould close the modals");
+        assert.strictEqual($('[role="dialog"]').length, 0, "sould close the modals");
 
         assert.strictEqual(form.$('.o_data_row').length, 3,
             "sould have 3 records in one2many list");
@@ -6593,34 +6593,34 @@ QUnit.module('relational_fields', {
         });
 
         form.$('.o_data_row:first').click();
-        assert.strictEqual($('.modal .modal-title').first().text().trim(), 'Open: one2many turtle field',
+        assert.strictEqual($('[role="dialog"] .modal-title').first().text().trim(), 'Open: one2many turtle field',
             "modal should use the python field string as title");
-        $('.modal .o_form_button_cancel').click();
+        $('[role="dialog"] .o_form_button_cancel').click();
         form.$buttons.find('.o_form_button_edit').click();
 
         // edit the first one2many record
         form.$('.o_data_row:first').click();
-        var $many2one = $('.modal [name="product_id"] input').click();
+        var $many2one = $('[role="dialog"] [name="product_id"] input').click();
         var $dropdown = $many2one.autocomplete('widget');
         $dropdown.find('li:first a').mouseenter();
         $dropdown.find('li:first a').click();
-        $('.modal-footer button:first').click();
+        $('footer.modal-footer button:first').click();
 
         $('.o_form_button_save').click(); // don't save anything because the one2many does not change
 
         // add a one2many record
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
-        $('.modal .o_data_row:first .o_list_record_selector input').click();
-        $('.modal .o_select_button').click();
+        $('[role="dialog"] .o_data_row:first .o_list_record_selector input').click();
+        $('[role="dialog"] .o_select_button').click();
 
         // edit the second one2many record
         form.$('.o_data_row:eq(1)').click();
-        $many2one = $('.modal [name="product_id"] input').click();
+        $many2one = $('[role="dialog"] [name="product_id"] input').click();
         $dropdown = $many2one.autocomplete('widget');
         $dropdown.find('li:first a').mouseenter();
         $dropdown.find('li:first a').click();
-        $('.modal-footer button:first').click();
+        $('footer.modal-footer button:first').click();
 
         $('.o_form_button_save').click();
 
@@ -6812,10 +6812,10 @@ QUnit.module('relational_fields', {
 
         form.$buttons.find('.o_form_button_edit').click();
         form.$('tbody td.o_field_x2many_list_row_add a').click();
-        $('.modal-footer button.btn-primary').first().click();
+        $('footer.modal-footer button.btn-primary').first().click();
 
-        assert.strictEqual($('.modal').length, 1, "should still have an open modal");
-        assert.strictEqual($('.modal tbody label.o_field_invalid').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1, "should still have an open modal");
+        assert.strictEqual($('[role="dialog"] tbody label.o_field_invalid').length, 1,
             "should have displayed invalid fields");
         form.destroy();
     });
@@ -7011,9 +7011,9 @@ QUnit.module('relational_fields', {
         });
 
         form.$('.o_field_one2many .o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal').length, 1, "form view dialog should be opened");
-        $('.modal-body input[name="model_name"]').val('partner').trigger('input');
-        $('.modal-footer button:first').click();
+        assert.strictEqual($('[role="dialog"]').length, 1, "form view dialog should be opened");
+        $('main.modal-body input[name="model_name"]').val('partner').trigger('input');
+        $('footer.modal-footer button:first').click();
 
         assert.strictEqual(form.$('.o_field_one2many tbody tr:first').text(), "coucouhas changed[]",
             "the onchange should create one new record and remove the existing");
@@ -7112,9 +7112,9 @@ QUnit.module('relational_fields', {
 
         form.$('.o_data_row:first').click();
 
-        assert.strictEqual($('.modal .o_field_widget').text(), "xphone",
+        assert.strictEqual($('[role="dialog"] .o_field_widget').text(), "xphone",
             'should display the form view dialog with the many2one value');
-        $('.modal-footer button').click(); // close the modal
+        $('footer.modal-footer button').click(); // close the modal
 
         form.$buttons.find('.o_form_button_edit').click();
 
@@ -7368,7 +7368,7 @@ QUnit.module('relational_fields', {
 
         form.$('.o_data_row:first').click();
 
-        assert.strictEqual($('.modal .o_field_widget[name="partner_ids"] .o_list_view').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_field_widget[name="partner_ids"] .o_list_view').length, 1,
             'should display many2many list view in the modal');
 
         form.destroy();
@@ -7400,7 +7400,7 @@ QUnit.module('relational_fields', {
 
         form.$('.o_data_row:first').click();
 
-        assert.strictEqual($('.modal .o_field_widget[name="turtle_foo"]').text(), 'blip',
+        assert.strictEqual($('[role="dialog"] .o_field_widget[name="turtle_foo"]').text(), 'blip',
             'should open the modal and display the form field');
 
         form.destroy();
@@ -7449,14 +7449,14 @@ QUnit.module('relational_fields', {
 
         form.$('.o_data_row:first').click(); // edit first record
 
-        var $input = $('.modal .o_field_many2manytags input');
+        var $input = $('[role="dialog"] .o_field_many2manytags input');
         $input.click(); // opens the dropdown
         $input.autocomplete('widget').find('li').click(); // add 'first record'
 
         // add a many2many tag and save
-        $('.modal .o_field_x2many_list_row_add a').click();
-        $('.modal .o_field_widget[name=name]').val('test').trigger('input');
-        $('.modal .modal-footer .btn-primary').click(); // save
+        $('[role="dialog"] .o_field_x2many_list_row_add a').click();
+        $('[role="dialog"] .o_field_widget[name=name]').val('test').trigger('input');
+        $('footer.modal-footer .btn-primary').click(); // save
 
         form.$buttons.find('.o_form_button_save').click();
 
@@ -7510,13 +7510,13 @@ QUnit.module('relational_fields', {
         form.$('.o_external_button').click();
 
         // click on add, to add a new partner in the m2m
-        $('.modal .o_field_x2many_list_row_add a').click();
+        $('[role="dialog"] .o_field_x2many_list_row_add a').click();
 
         // select the partner_type 'gold' (this closes the 2nd modal)
-        $('.modal td:contains(gold)').click();
+        $('[role="dialog"] td:contains(gold)').click();
 
         // confirm the changes in the modal
-        $('.modal .modal-footer .btn-primary').click();
+        $('footer.modal-footer .btn-primary').click();
 
         form.$buttons.find('.o_form_button_save').click();
         form.destroy();
@@ -7585,7 +7585,7 @@ QUnit.module('relational_fields', {
 
         form.$('.o_data_row:first').click();
 
-        assert.strictEqual($('.modal .o_field_widget[name="turtle_foo"]').text(), 'blip',
+        assert.strictEqual($('[role="dialog"] .o_field_widget[name="turtle_foo"]').text(), 'blip',
             'should open the modal and display the form field');
 
         form.destroy();
@@ -8080,7 +8080,7 @@ QUnit.module('relational_fields', {
         // try to add a second line and check that it is correctly waiting
         // for the onchange to return
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal').length, 0, "no modal should be displayed");
+        assert.strictEqual($('[role="dialog"]').length, 0, "no modal should be displayed");
         assert.strictEqual($('.o_field_invalid').length, 0,
             "no field should be marked as invalid");
         assert.strictEqual(form.$('.o_data_row').length, 1,
@@ -8384,11 +8384,11 @@ QUnit.module('relational_fields', {
 
         form.$('.o_data_row td:first').click(); // open the record
 
-        assert.strictEqual($('.modal .o_field_many2manytags[name="timmy"]').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_field_many2manytags[name="timmy"]').length, 1,
             "timmy should be displayed in the form view");
-        assert.strictEqual($('.modal .o_field_many2manytags[name="timmy"] .badge').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_field_many2manytags[name="timmy"] .badge').length, 1,
             "m2mtags should contain one tag");
-        assert.strictEqual($('.modal .o_field_many2manytags[name="timmy"] .o_badge_text').text(),
+        assert.strictEqual($('[role="dialog"] .o_field_many2manytags[name="timmy"] .o_badge_text').text(),
             'gold', "tag name should have been correctly loaded");
 
         form.destroy();
@@ -8464,10 +8464,10 @@ QUnit.module('relational_fields', {
         });
 
         form.$('.o_field_x2many_list_row_add a').click();
-        $('.modal .o_field_x2many_list_row_add a').click();
-        $('.modal .o_data_cell input').val('new record').trigger('input');
+        $('[role="dialog"] .o_field_x2many_list_row_add a').click();
+        $('[role="dialog"] .o_data_cell input').val('new record').trigger('input');
         checkOnchange = true;
-        $('.modal .modal-footer .btn-primary').click(); // save (should trigger the onchange)
+        $('footer.modal-footer .btn-primary').click(); // save (should trigger the onchange)
 
         form.destroy();
     });
@@ -8788,7 +8788,7 @@ QUnit.module('relational_fields', {
 
         assert.strictEqual(form.$('.o_data_row.o_selected_row').length, 1,
             "line should not have been removed and should still be in edition");
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "a confirmation dialog should be opened");
         assert.ok(form.$('.o_field_widget[name=int_field]').hasClass('o_field_invalid'),
             "should indicate that int_field is invalid");
@@ -8986,9 +8986,9 @@ QUnit.module('relational_fields', {
         // open the new subrecord to check the value of the nested o2m, and to
         // ensure that it will be saved
         form.$('.o_data_cell:first').click();
-        assert.strictEqual($('.modal .o_data_cell').text(), 'test nested',
+        assert.strictEqual($('[role="dialog"] .o_data_cell').text(), 'test nested',
             "should have added the new row to the nested one2many");
-        $('.modal .modal-footer .btn-primary').click();
+        $('footer.modal-footer .btn-primary').click();
 
         form.$buttons.find('.o_form_button_save').click();
 
@@ -9276,26 +9276,26 @@ QUnit.module('relational_fields', {
 
         // add a new record
         form.$('.o_field_x2many_list_row_add a').click();
-        $('.modal .o_field_widget').val('new record').trigger('input');
-        $('.modal .modal-footer .btn-primary:first').click(); // Save & Close
+        $('[role="dialog"] .o_field_widget').val('new record').trigger('input');
+        $('footer.modal-footer .btn-primary:first').click(); // Save & Close
 
         assert.strictEqual(form.$('.o_data_row .o_data_cell').text(), 'new record',
             "should display the new record");
 
         // reopen freshly added record and edit it
         form.$('.o_data_row .o_data_cell').click();
-        $('.modal .o_field_widget').val('new record edited').trigger('input');
+        $('[role="dialog"] .o_field_widget').val('new record edited').trigger('input');
 
         // save it, and choose to directly create another record
-        $('.modal .modal-footer .btn-primary:nth(1)').click(); // Save & New
+        $('footer.modal-footer .btn-primary:nth(1)').click(); // Save & New
 
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "the model should still be open");
-        assert.strictEqual($('.modal .o_field_widget').text(), '',
+        assert.strictEqual($('[role="dialog"] .o_field_widget').text(), '',
             "should have cleared the input");
 
-        $('.modal .o_field_widget').val('another new record').trigger('input');
-        $('.modal .modal-footer .btn-primary:first').click(); // Save & Close
+        $('[role="dialog"] .o_field_widget').val('another new record').trigger('input');
+        $('footer.modal-footer .btn-primary:first').click(); // Save & Close
 
         assert.strictEqual(form.$('.o_data_row .o_data_cell').text(),
             'new record editedanother new record', "should display the two records");
@@ -9461,19 +9461,19 @@ QUnit.module('relational_fields', {
         // edit existing subrecord
         form.$('.oe_kanban_global_click:first()').click();
 
-        $('.modal .o_form_view input').val('new name').trigger('input');
-        $('.modal .modal-footer .btn-primary').click(); // save
+        $('[role="dialog"] .o_form_view input').val('new name').trigger('input');
+        $('footer.modal-footer .btn-primary').click(); // save
         assert.strictEqual(form.$('.o_kanban_record:first() span').text(), 'new name',
             'value of subrecord should have been updated');
 
         // add subrecords
         // -> single select
         form.$('.o_field_many2many .o-kanban-button-new').click();
-        assert.ok($('.modal .o_list_view').length, "should have opened a list view in a modal");
-        assert.strictEqual($('.modal .o_list_view tbody .o_list_record_selector').length, 3,
+        assert.ok($('[role="dialog"] .o_list_view').length, "should have opened a list view in a modal");
+        assert.strictEqual($('[role="dialog"] .o_list_view tbody .o_list_record_selector').length, 3,
             "list view should contain 3 records");
-        $('.modal .o_list_view tbody tr:contains(red)').click(); // select red
-        assert.ok(!$('.modal .o_list_view').length, "should have closed the modal");
+        $('[role="dialog"] .o_list_view tbody tr:contains(red)').click(); // select red
+        assert.ok(!$('[role="dialog"] .o_list_view').length, "should have closed the modal");
         assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 3,
             'kanban should now contain 3 records');
         assert.ok(form.$('.o_kanban_record:contains(red)').length,
@@ -9481,23 +9481,23 @@ QUnit.module('relational_fields', {
 
         // -> multiple select
         form.$('.o_field_many2many .o-kanban-button-new').click();
-        assert.ok($('.modal .o_select_button').prop('disabled'), "select button should be disabled");
-        assert.strictEqual($('.modal .o_list_view tbody .o_list_record_selector').length, 2,
+        assert.ok($('[role="dialog"] .o_select_button').prop('disabled'), "select button should be disabled");
+        assert.strictEqual($('[role="dialog"] .o_list_view tbody .o_list_record_selector').length, 2,
             "list view should contain 2 records");
-        $('.modal .o_list_view thead .o_list_record_selector input').click(); // select all
-        $('.modal .o_select_button').click(); // validate selection
-        assert.ok(!$('.modal .o_select_button').prop('disabled'), "select button should be enabled");
-        assert.ok(!$('.modal .o_list_view').length, "should have closed the modal");
+        $('[role="dialog"] .o_list_view thead .o_list_record_selector input').click(); // select all
+        $('[role="dialog"] .o_select_button').click(); // validate selection
+        assert.ok(!$('[role="dialog"] .o_select_button').prop('disabled'), "select button should be enabled");
+        assert.ok(!$('[role="dialog"] .o_list_view').length, "should have closed the modal");
         assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 5,
             'kanban should now contain 5 records');
         // -> created record
         form.$('.o_field_many2many .o-kanban-button-new').click();
-        $('.modal .modal-footer .btn-primary:nth(1)').click(); // click on 'Create'
-        assert.ok($('.modal .o_form_view.o_form_editable').length,
+        $('footer.modal-footer .btn-primary:nth(1)').click(); // click on 'Create'
+        assert.ok($('[role="dialog"] .o_form_view.o_form_editable').length,
             "should have opened a form view in edit mode, in a modal");
-        $('.modal .o_form_view input').val('A new type').trigger('input');
-        $('.modal:nth(1) .modal-footer .btn-primary:first()').click(); // click on 'Save & Close'
-        assert.ok(!$('.modal').length, "should have closed both modals");
+        $('[role="dialog"] .o_form_view input').val('A new type').trigger('input');
+        $('[role="dialog"]:nth(1) footer .btn-primary:first()').click(); // click on 'Save & Close'
+        assert.ok(!$('[role="dialog"]').length, "should have closed both modals");
         assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 6,
             'kanban should now contain 6 records');
         assert.ok(form.$('.o_kanban_record:contains(A new type)').length,
@@ -9592,7 +9592,7 @@ QUnit.module('relational_fields', {
             'delete icon should be visible in edit');
 
         form.$('.o-kanban-button-new').click(); // click on 'Add'
-        assert.strictEqual($('.modal .modal-footer .btn-primary').length, 1, // only button 'Select'
+        assert.strictEqual($('footer.modal-footer .btn-primary').length, 1, // only button 'Select'
             '"Create" button should not be available in the modal');
 
         form.destroy();
@@ -9655,19 +9655,19 @@ QUnit.module('relational_fields', {
         // edit existing subrecord
         form.$('.o_list_view tbody tr:first()').click();
 
-        $('.modal .o_form_view input').val('new name').trigger('input');
-        $('.modal .modal-footer .btn-primary').click(); // save
+        $('[role="dialog"] .o_form_view input').val('new name').trigger('input');
+        $('footer.modal-footer .btn-primary').click(); // save
         assert.strictEqual(form.$('.o_list_view tbody td:first()').text(), 'new name',
             'value of subrecord should have been updated');
 
         // add new subrecords
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal .o_list_view').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_list_view').length, 1,
             "a modal should be open");
-        assert.strictEqual($('.modal .o_list_view .o_data_row').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_list_view .o_data_row').length, 1,
             "the list should contain one row");
-        $('.modal .o_list_view .o_data_row').click(); // select a record
-        assert.strictEqual($('.modal .o_list_view').length, 0,
+        $('[role="dialog"] .o_list_view .o_data_row').click(); // select a record
+        assert.strictEqual($('[role="dialog"] .o_list_view').length, 0,
             "the modal should be closed");
         assert.strictEqual(form.$('.o_list_view td.o_list_number').length, 3,
             'should contain 3 subrecords');
@@ -9758,7 +9758,7 @@ QUnit.module('relational_fields', {
 
         // edit existing subrecord
         form.$('.o_list_view tbody td:first()').click();
-        assert.ok(!$('.modal').length,
+        assert.ok(!$('[role="dialog"]').length,
             'in edit, clicking on a subrecord should not open a dialog');
         assert.ok(form.$('.o_list_view tbody tr:first()').hasClass('o_selected_row'),
             'first row should be in edition');
@@ -9776,12 +9776,12 @@ QUnit.module('relational_fields', {
 
         // add new subrecords
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal .o_list_view').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_list_view').length, 1,
             "a modal should be open");
-        assert.strictEqual($('.modal .o_list_view .o_data_row').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_list_view .o_data_row').length, 1,
             "the list should contain one row");
-        $('.modal .o_list_view .o_data_row').click(); // select a record
-        assert.strictEqual($('.modal .o_list_view').length, 0,
+        $('[role="dialog"] .o_list_view .o_data_row').click(); // select a record
+        assert.strictEqual($('[role="dialog"] .o_list_view').length, 0,
             "the modal should be closed");
         assert.strictEqual(form.$('.o_list_view td.o_list_number').length, 3,
             'should contain 3 subrecords');
@@ -10048,7 +10048,7 @@ QUnit.module('relational_fields', {
         });
 
         form.$('.o_field_x2many_list_row_add a').click();
-        $('.modal .o_data_row:first').click(); // add a first record to the relation
+        $('[role="dialog"] .o_data_row:first').click(); // add a first record to the relation
 
         assert.strictEqual(form.$('.o_data_row').length, 1,
             "the record should have been added to the relation");
@@ -10056,7 +10056,7 @@ QUnit.module('relational_fields', {
             "inner m2m should have been fetched and correctly displayed");
 
         form.$('.o_field_x2many_list_row_add a').click();
-        $('.modal .o_data_row:first').click(); // add a second record to the relation
+        $('[role="dialog"] .o_data_row:first').click(); // add a second record to the relation
 
         assert.strictEqual(form.$('.o_data_row').length, 2,
             "the second record should have been added to the relation");
@@ -10109,13 +10109,13 @@ QUnit.module('relational_fields', {
         });
 
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal .o_data_row').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 1,
             "should contain only one row (gold)");
 
-        $('.modal .o_searchview_input').trigger({type: 'keypress', which: 115}); // s
-        $('.modal .o_searchview_input').trigger({type: 'keydown', which: 13}); // enter
+        $('[role="dialog"] .o_searchview_input').trigger({type: 'keypress', which: 115}); // s
+        $('[role="dialog"] .o_searchview_input').trigger({type: 'keydown', which: 13}); // enter
 
-        assert.strictEqual($('.modal .o_data_row').length, 0, "should contain no row");
+        assert.strictEqual($('[role="dialog"] .o_data_row').length, 0, "should contain no row");
 
         form.destroy();
     });
@@ -10149,8 +10149,8 @@ QUnit.module('relational_fields', {
         form.$buttons.find('.o_form_button_edit').click();
         form.$('td.o_data_cell:first').click();
 
-        $('.modal-body input[type="checkbox"]').click();
-        $('.modal .modal-footer .btn-primary').first().click();
+        $('main.modal-body input[type="checkbox"]').click();
+        $('footer.modal-footer .btn-primary').first().click();
 
         // there is nothing left to save -> should not do a 'write' RPC
         form.$buttons.find('.o_form_button_save').click();
@@ -10806,9 +10806,9 @@ QUnit.module('relational_fields', {
         assert.strictEqual($input.autocomplete('widget').find('li').length, 3,
             "autocomplete dropdown should have 3 entries (2 values + 'Search and Edit...')");
         $input.autocomplete('widget').find('li:first()').click(); // adds a tag
-        assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] > span').length, 1,
+        assert.strictEqual(form.$('.o_field_many2manytags[name="timmy"] > button').length, 1,
             "should contain 1 tag");
-        assert.ok(form.$('.o_field_many2manytags[name="timmy"] > span:contains("gold")').length,
+        assert.ok(form.$('.o_field_many2manytags[name="timmy"] > button:contains("gold")').length,
             "should contain newly added tag 'gold'");
 
         form.destroy();
@@ -10841,18 +10841,18 @@ QUnit.module('relational_fields', {
                 return this._super.apply(this, arguments);
             },
         });
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 2,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 2,
             "should contain 2 tags");
-        assert.ok(form.$('span:contains(gold)').length,
+        assert.ok(form.$('button:contains(gold)').length,
             'should have fetched and rendered gold partner tag');
-        assert.ok(form.$('span:contains(silver)').length,
+        assert.ok(form.$('button:contains(silver)').length,
             'should have fetched and rendered silver partner tag');
-        assert.strictEqual(form.$('span:first()').data('color'), 2,
+        assert.strictEqual(form.$('button:first()').data('color'), 2,
             'should have correctly fetched the color');
 
         form.$buttons.find('.o_form_button_edit').click();
 
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 2,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 2,
             "should still contain 2 tags in edit mode");
         assert.ok(form.$('.o_tag_color_2 .o_badge_text:contains(gold)').length,
             'first tag should still contain "gold" and be color 2 in edit mode');
@@ -10867,46 +10867,46 @@ QUnit.module('relational_fields', {
         assert.strictEqual($input.autocomplete('widget').find('li a:contains("red")').length, 1,
             "autocomplete dropdown should contain 'red'");
         $input.autocomplete('widget').find('li').click(); // add 'red'
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 3,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 3,
             "should contain 3 tags");
-        assert.ok(form.$('.o_field_many2manytags > span:contains("red")').length,
+        assert.ok(form.$('.o_field_many2manytags > button:contains("red")').length,
             "should contain newly added tag 'red'");
-        assert.ok(form.$('.o_field_many2manytags > span[data-color=8]:contains("red")').length,
+        assert.ok(form.$('.o_field_many2manytags > button[data-color=8]:contains("red")').length,
             "should have fetched the color of added tag");
 
         // remove tag with id 14
-        form.$('.o_field_many2manytags span[data-id=14] .o_delete').click();
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 2,
+        form.$('.o_field_many2manytags button[data-id=14] .o_delete').click();
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 2,
             "should contain 2 tags");
-        assert.ok(!form.$('.o_field_many2manytags > span:contains("silver")').length,
+        assert.ok(!form.$('.o_field_many2manytags > button:contains("silver")').length,
             "should not contain tag 'silver' anymore");
 
         // save the record (should do the write RPC with the correct commands)
         form.$buttons.find('.o_form_button_save').click();
 
         // checkbox 'Hide in Kanban'
-        $input = form.$('.o_field_many2manytags span[data-id=13]'); // selects 'red' tag
+        $input = form.$('.o_field_many2manytags button[data-id=13]'); // selects 'red' tag
         $input.click(); // opens the colorpicker dropdown
-        assert.ok(form.$('.o_field_many2manytags span[data-id=13] .o_colorpicker .o_checkbox'), "should have a checkbox in the colorpicker dropdown menu");
+        assert.ok(form.$('.o_field_many2manytags button[data-id=13] .o_colorpicker .o_checkbox'), "should have a checkbox in the colorpicker dropdown menu");
 
         $input.click();
-        var $checkBox = form.$('.o_field_many2manytags span[data-id=13] .o_colorpicker .o_checkbox input');
+        var $checkBox = form.$('.o_field_many2manytags button[data-id=13] .o_colorpicker .o_checkbox input');
         assert.notOk($checkBox.is(':checked'), "should have unticked checkbox in colorpicker dropdown menu");
 
         $checkBox.mousedown();
-        $input = form.$('.o_field_many2manytags span[data-id=13]'); // refresh
+        $input = form.$('.o_field_many2manytags button[data-id=13]'); // refresh
         assert.equal($input.data('color'), "0", "should become transparent when toggling on checkbox");
 
         $input.click();
-        $checkBox = form.$('.o_field_many2manytags span[data-id=13] .o_colorpicker .o_checkbox input'); // refresh
+        $checkBox = form.$('.o_field_many2manytags button[data-id=13] .o_colorpicker .o_checkbox input'); // refresh
         assert.ok($checkBox.is(':checked'), "should have a ticked checkbox in colorpicker dropdown menu after mousedown");
 
         $checkBox.mousedown();
-        $input = form.$('.o_field_many2manytags span[data-id=13]'); // refresh
+        $input = form.$('.o_field_many2manytags button[data-id=13]'); // refresh
         assert.equal($input.data('color'), "8", "should revert to old color when toggling off checkbox");
 
         $input.click();
-        $checkBox = form.$('.o_field_many2manytags span[data-id=13] .o_colorpicker .o_checkbox input'); // refresh
+        $checkBox = form.$('.o_field_many2manytags button[data-id=13] .o_colorpicker .o_checkbox input'); // refresh
         assert.notOk($checkBox.is(':checked'), "should have an unticked checkbox in colorpicker dropdown menu after 2nd click");
 
         // TODO: it would be nice to test the behaviors of the autocomplete dropdown
@@ -10939,9 +10939,9 @@ QUnit.module('relational_fields', {
                 return this._super.apply(this, arguments);
             }
         });
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 1,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 1,
             "should contain 1 tag");
-        assert.ok(form.$('span:contains(gold)').length,
+        assert.ok(form.$('button:contains(gold)').length,
             'should have fetched and rendered gold partner tag');
 
         form.$buttons.find('.o_form_button_edit').click();
@@ -10954,9 +10954,9 @@ QUnit.module('relational_fields', {
         assert.strictEqual($input.autocomplete('widget').find('li a:contains("silver")').length, 1,
             "autocomplete dropdown should contain 'silver'");
         $input.autocomplete('widget').find('li').click(); // add 'silver'
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 2,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 2,
             "should contain 2 tags");
-        assert.ok(form.$('.o_field_many2manytags > span:contains("silver")').length,
+        assert.ok(form.$('.o_field_many2manytags > button:contains("silver")').length,
             "should contain newly added tag 'silver'");
 
         form.destroy();
@@ -10989,9 +10989,9 @@ QUnit.module('relational_fields', {
         assert.strictEqual($input.autocomplete('widget').find('li').length, 3,
             "autocomplete dropdown should have 3 entries (2 values + 'Search and Edit...')");
         $input.autocomplete('widget').find('li:first()').click(); // adds a tag
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 1,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 1,
             "should contain 1 tag");
-        assert.ok(form.$('.o_field_many2manytags > span:contains("gold")').length,
+        assert.ok(form.$('.o_field_many2manytags > button:contains("gold")').length,
             "should contain newly added tag 'gold'");
 
         // save the record (should do the write RPC with the correct commands)
@@ -11016,20 +11016,20 @@ QUnit.module('relational_fields', {
         });
 
         // First checks that default color 0 is rendered as 0 color
-        assert.ok(form.$('span:first()').is('.o_tag_color_0'),
+        assert.ok(form.$('button:first()').is('.o_tag_color_0'),
             'first tag color should be 0');
 
         // Update the color in readonly
-        form.$('span:first()').click();
+        form.$('button:first()').click();
         $('.o_colorpicker a[data-color="1"]').trigger('mousedown'); // choose color 1
-        assert.strictEqual(form.$('span:first()').data('color'), 1,
+        assert.strictEqual(form.$('button:first()').data('color'), 1,
             'should have correctly updated the color (in readonly)');
 
         // Update the color in edit
         form.$buttons.find('.o_form_button_edit').click();
-        form.$('span:first()').click();
+        form.$('button:first()').click();
         $('.o_colorpicker a[data-color="6"]').trigger('mousedown'); // choose color 6
-        assert.strictEqual(form.$('span:first()').data('color'), 6,
+        assert.strictEqual(form.$('button:first()').data('color'), 6,
             'should have correctly updated the color (in edit)');
         form.destroy();
     });
@@ -11136,14 +11136,14 @@ QUnit.module('relational_fields', {
         form.$('.o_field_many2one input').click();
         $dropdown.find('.o_m2o_dropdown_option:contains(Search)').mouseenter().click();  // Open Search More
 
-        $('.modal .o_search_options .fa-bars').click();
-        $('.modal .o_search_options .o_group_by_menu a:contains(Bar)').click(); // group by 'Bar'
+        $('[role="dialog"] .o_search_options .fa-bars').click();
+        $('[role="dialog"] .o_search_options .o_group_by_menu a:contains(Bar)').click(); // group by 'Bar'
 
-        $('.modal .o_group_header:first').click();
-        assert.strictEqual($('.modal tbody:nth(1) .o_data_row').length, 7,
+        $('[role="dialog"] .o_group_header:first').click();
+        assert.strictEqual($('[role="dialog"] tbody:nth(1) .o_data_row').length, 7,
             "should display 7 records in the first page");
-        $('.modal .o_group_header:first .o_pager_next').click();
-        assert.strictEqual($('.modal tbody:nth(1) .o_data_row').length, 1,
+        $('[role="dialog"] .o_group_header:first .o_pager_next').click();
+        assert.strictEqual($('[role="dialog"] tbody:nth(1) .o_data_row').length, 1,
             "should display 1 record in the second page");
 
         form.destroy();
@@ -11167,7 +11167,7 @@ QUnit.module('relational_fields', {
                 '</form>',
             res_id: 1,
         });
-        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > span').length, 100,
+        assert.strictEqual(form.$('.o_field_widget[name="partner_ids"] > button').length, 100,
             'should have rendered 100 tags');
         form.destroy();
     });
@@ -11192,14 +11192,14 @@ QUnit.module('relational_fields', {
         });
 
         form.$buttons.find('.o_form_button_edit').click();
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 1,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 1,
             "should contain one tag");
 
         // update foo, which will trigger an onchange and update timmy
         // -> m2mtags input should not have taken the focus
         form.$('input:first').focus();
         form.$('input:first').val('trigger onchange').trigger('input');
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 0,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 0,
             "should contain no tags");
         assert.strictEqual(form.$('input:first').get(0), document.activeElement,
             "foo input should have kept the focus");
@@ -11207,14 +11207,14 @@ QUnit.module('relational_fields', {
         // add a tag -> m2mtags input should still have the focus
         form.$('.o_field_many2manytags input').click(); // opens the dropdown
         form.$('.o_field_many2manytags input').autocomplete('widget').find('li:first').click();
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 1,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 1,
             "should contain a tag");
         assert.strictEqual(form.$('.o_field_many2manytags input').get(0), document.activeElement,
             "m2m tags input should have kept the focus");
 
         // remove a tag -> m2mtags input should still have the focus
         form.$('.o_field_many2manytags .o_delete').click();
-        assert.strictEqual(form.$('.o_field_many2manytags > span').length, 0,
+        assert.strictEqual(form.$('.o_field_many2manytags > button').length, 0,
             "should contain no tags");
         assert.strictEqual(form.$('.o_field_many2manytags input').get(0), document.activeElement,
             "m2m tags input should have kept the focus");
@@ -11700,8 +11700,8 @@ QUnit.module('relational_fields', {
 
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
-        var $dropdown = $('.modal .o_field_many2one input').autocomplete('widget');
-        $('.modal input').val('new record').trigger('keydown');
+        var $dropdown = $('[role="dialog"] .o_field_many2one input').autocomplete('widget');
+        $('[role="dialog"] input').val('new record').trigger('keydown');
         concurrency.delay(0).then(function () {
             $dropdown.find('li:first()').click(); // quick create 'new record'
             assert.verifySteps(['name_create']);
@@ -11747,7 +11747,7 @@ QUnit.module('relational_fields', {
         $cell_o2m.click();
 
         // In modal
-        var $modal = $('.modal-dialog.modal-lg');
+        var $modal = $('.modal-lg');
         assert.equal($modal.length, 1,
             'there should be one modal opened');
 
@@ -11793,7 +11793,7 @@ QUnit.module('relational_fields', {
         form.$('.o_data_cell').click();
 
         // In modal
-        var $modal = $('.modal-dialog.modal-lg');
+        var $modal = $('.modal-lg');
         assert.equal($modal.length, 1,
             'there should be one modal opened');
 
@@ -11881,9 +11881,9 @@ QUnit.module('relational_fields', {
 
         form.$('.o_external_button').click(); // click on the external button (should do an RPC)
 
-        assert.strictEqual($('.modal .modal-title').text().trim(), 'Open: custom label',
+        assert.strictEqual($('[role="dialog"] .modal-title').text().trim(), 'Open: custom label',
                         "dialog title should display the custom string label");
-        $('.modal .o_form_button_cancel').click();
+        $('[role="dialog"] .o_form_button_cancel').click();
 
         form.$('.o_field_widget select').val('partner_type').trigger('change');
         assert.strictEqual(form.$('.o_field_widget input').val(), "",
@@ -12096,7 +12096,7 @@ QUnit.module('relational_fields', {
         // Add a record in the list
         x2mList.find('.o_field_x2many_list_row_add a').click();
 
-        var modal = $('.modal-dialog.modal-lg');
+        var modal = $('.modal-lg');
 
         var nameInput = modal.find('input.o_input[name=display_name]');
         nameInput.val('michelangelo').trigger('input');
diff --git a/addons/web/static/tests/fields/upgrade_fields_tests.js b/addons/web/static/tests/fields/upgrade_fields_tests.js
index 427ec7b54e33..14f20bba8adc 100644
--- a/addons/web/static/tests/fields/upgrade_fields_tests.js
+++ b/addons/web/static/tests/fields/upgrade_fields_tests.js
@@ -33,7 +33,7 @@ QUnit.module('upgrade_fields', {
         });
 
         form.$('input:checkbox').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "the 'Upgrade to Enterprise' dialog should be opened");
 
         form.destroy();
diff --git a/addons/web/static/tests/services/notification_service_tests.js b/addons/web/static/tests/services/notification_service_tests.js
index 68227093cea4..feb3a6005507 100644
--- a/addons/web/static/tests/services/notification_service_tests.js
+++ b/addons/web/static/tests/services/notification_service_tests.js
@@ -45,7 +45,7 @@ QUnit.module('Services', {
         });
         var $notification = $('body .o_notification_manager .o_notification');
         assert.strictEqual(_.str.trim($notification.html().replace(/\s+/g, ' ')),
-            "<div class=\"o_notification_title\"> <span class=\"o_icon fa fa-3x fa-lightbulb-o\"></span> a </div> <div class=\"o_notification_content\">b</div>",
+            "<div class=\"o_notification_title\"> <span role=\"img\" aria-label=\"Notification undefined\" class=\"o_icon fa fa-3x fa-lightbulb-o\" title=\"Notification undefined\"></span> a </div> <div class=\"o_notification_content\">b</div>",
             "should display notification");
         assert.strictEqual($notification.find('.o_close').length, 0, "should not display the close button in ");
         setTimeout(function () {
@@ -68,7 +68,7 @@ QUnit.module('Services', {
         });
         var $notification = $('body .o_notification_manager .o_notification');
         assert.strictEqual(_.str.trim($notification.html().replace(/\s+/g, ' ')),
-            "<div class=\"o_notification_title\"> <span class=\"o_icon fa fa-3x fa-exclamation\"></span> a </div> <div class=\"o_notification_content\">b</div>",
+            "<div class=\"o_notification_title\"> <span role=\"img\" aria-label=\"Notification undefined\" class=\"o_icon fa fa-3x fa-exclamation\" title=\"Notification undefined\"></span> a </div> <div class=\"o_notification_content\">b</div>",
             "should display notification");
         view.destroy();
         setTimeout(done);
@@ -184,7 +184,7 @@ QUnit.module('Services', {
         var $notification = $('body .o_notification_manager .o_notification');
         assert.strictEqual($notification.eq(0).find('.o_close').length, 1, "should display the close button in notification");
         assert.strictEqual(_.str.trim($notification.eq(0).html().replace(/\s+/g, ' ')),
-            "<a class=\"fa fa-times o_close\" href=\"#\"></a> <div class=\"o_notification_title\"> <span class=\"o_icon fa fa-3x fa-question-circle-o\"></span> a0 </div> <div class=\"o_notification_content\">b0</div> <div class=\"o_buttons\"> <button type=\"button\" class=\"btn btn-sm btn-primary\"> <span>accept0</span> </button><button type=\"button\" class=\"btn btn-sm btn-default\"> <span>refuse0</span> </button> </div>",
+            "<a aria-label=\"Close\" class=\"fa fa-times o_close\" href=\"#\" title=\"Close\"></a> <div class=\"o_notification_title\"> <span role=\"img\" aria-label=\"Notification undefined\" class=\"o_icon fa fa-3x fa-question-circle-o\" title=\"Notification undefined\"></span> a0 </div> <div class=\"o_notification_content\">b0</div> <div class=\"o_buttons\"> <button type=\"button\" class=\"btn btn-sm btn-primary\"> <span>accept0</span> </button><button type=\"button\" class=\"btn btn-sm btn-default\"> <span>refuse0</span> </button> </div>",
             "should display notification");
 
         $notification.find('.o_buttons button:contains(accept0)').click();
diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js
index 0a7ca319c2f3..5a07924413e8 100644
--- a/addons/web/static/tests/views/calendar_tests.js
+++ b/addons/web/static/tests/views/calendar_tests.js
@@ -213,8 +213,8 @@ QUnit.module('Views', {
         $sidebar.find('input[type="text"]').trigger('click');
         assert.strictEqual($('ul.ui-autocomplete li:not(.o_m2o_dropdown_option)').text(), "partner 4", "should display the last choice in one2many autocomplete"); // TODO: remove :not(.o_m2o_dropdown_option) because can't have "create & edit" choice
         $sidebar.find('.o_calendar_filter_item .o_remove').first().trigger('click');
-        assert.ok($('.modal button.btn:contains(Ok)').length, "should display the confirm message");
-        $('.modal button.btn:contains(Ok)').trigger('click');
+        assert.ok($('footer.modal-footer button.btn:contains(Ok)').length, "should display the confirm message");
+        $('footer.modal-footer button.btn:contains(Ok)').trigger('click');
         assert.strictEqual($sidebar.find('.o_calendar_filter:has(h3:contains(attendees)) .o_calendar_filter_item').length, 3, "click on remove then should display 3 filter items for 'attendees'");
         calendar.destroy();
     });
@@ -295,19 +295,19 @@ QUnit.module('Views', {
 
         calendar.$('.fc-event:contains(event 4) .fc-content').trigger('click');
 
-        assert.ok($('.modal-body').length, "should open the form view in dialog when click on event");
-        assert.ok($('.modal button.btn:contains(Edit)').length, "formViewDialog should be in readonly mode");
-        assert.ok($('.modal button.btn:contains(Delete)').length, "formViewDialog should have a delete button");
+        assert.ok($('main.modal-body').length, "should open the form view in dialog when click on event");
+        assert.ok($('footer.modal-footer button.btn:contains(Edit)').length, "formViewDialog should be in readonly mode");
+        assert.ok($('footer.modal-footer button.btn:contains(Delete)').length, "formViewDialog should have a delete button");
 
-        $('.modal button.btn:contains(Edit)').trigger('click');
+        $('footer.modal-footer button.btn:contains(Edit)').trigger('click');
 
-        assert.ok($('.modal-body').length, "should switch the modal in edit mode");
-        assert.notOk($('.modal button.btn:contains(Delete)').length, "formViewDialog should not have a delete button in edit mode");
+        assert.ok($('main.modal-body').length, "should switch the modal in edit mode");
+        assert.notOk($('footer.modal-footer button.btn:contains(Delete)').length, "formViewDialog should not have a delete button in edit mode");
 
-        $('.modal-body input:first').val('event 4 modified').trigger('input');
-        $('.modal button.btn:contains(Save)').trigger('click');
+        $('main.modal-body input:first').val('event 4 modified').trigger('input');
+        $('footer.modal-footer button.btn:contains(Save)').trigger('click');
 
-        assert.notOk($('.modal-body').length, "save button should close the modal");
+        assert.notOk($('main.modal-body').length, "save button should close the modal");
         assert.ok(calendar.$('.fc-event:contains(event 4 modified)').length, "should display the updated records");
 
         // create a new event, quick create only
@@ -317,12 +317,12 @@ QUnit.module('Views', {
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
 
-        assert.ok($('.modal-dialog.modal-sm').length, "should open the quick create dialog");
+        assert.ok($('.modal-sm').length, "should open the quick create dialog");
 
-        $('.modal-body input:first').val('new event in quick create').trigger('input');
-        $('.modal button.btn:contains(Create)').trigger('click').trigger('click');
+        $('main.modal-body input:first').val('new event in quick create').trigger('input');
+        $('footer.modal-footer button.btn:contains(Create)').trigger('click').trigger('click');
 
-        assert.strictEqual(calendar.$('.fc-event:contains(new event in quick create)').length, 1, "should display the new record");
+        assert.strictEqual(calendar.$('.fc-event:contains(new event in quick create)').length, 1, "should display the new record after quick create");
         assert.strictEqual(calendar.$('td.fc-event-container[colspan]').length, 2, "should the new record have only one day");
 
         // create a new event, quick create only (validated by pressing enter key)
@@ -330,9 +330,9 @@ QUnit.module('Views', {
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
 
-        assert.ok($('.modal-dialog.modal-sm').length, "should open the quick create dialog");
+        assert.ok($('.modal-sm').length, "should open the quick create dialog");
 
-        $('.modal-body input:first')
+        $('main.modal-body input:first')
             .val('new event in quick create validated by pressing enter key.')
             .trigger($.Event('keyup', {keyCode: $.ui.keyCode.ENTER}))
             .trigger($.Event('keyup', {keyCode: $.ui.keyCode.ENTER}));
@@ -347,20 +347,20 @@ QUnit.module('Views', {
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
 
-        assert.strictEqual($('.modal-dialog.modal-sm').length, 1, "should open the quick create dialog");
+        assert.strictEqual($('.modal-sm').length, 1, "should open the quick create dialog");
 
-        $('.modal-body input:first').val('coucou').trigger('input');
-        $('.modal button.btn:contains(Edit)').trigger('click');
+        $('main.modal-body input:first').val('coucou').trigger('input');
+        $('footer.modal-footer button.btn:contains(Edit)').trigger('click');
 
-        assert.strictEqual($('.modal-dialog.modal-lg .o_form_view').length, 1, "should open the slow create dialog");
-        assert.strictEqual($('.modal-dialog.modal-lg .modal-title').text(), "Create: Events",
+        assert.strictEqual($('.modal-lg .o_form_view').length, 1, "should open the slow create dialog");
+        assert.strictEqual($('.modal-lg .modal-title').text(), "Create: Events",
             "should use the string attribute as modal title");
-        assert.strictEqual($('.modal-dialog.modal-lg .o_form_view input[name="name"]').val(), "coucou",
+        assert.strictEqual($('.modal-lg .o_form_view input[name="name"]').val(), "coucou",
             "should have set the name from the quick create dialog");
 
         $('.modal-lg button.btn:contains(Save)').trigger('click');
 
-        assert.strictEqual(calendar.$('.fc-event:contains(coucou)').length, 1, "should display the new record");
+        assert.strictEqual(calendar.$('.fc-event:contains(coucou)').length, 1, "should display the new record with string attribute");
 
         // create a new event with 2 days
 
@@ -370,14 +370,14 @@ QUnit.module('Views', {
         testUtils.triggerMouseEvent($cell.next(), "mousemove");
         testUtils.triggerMouseEvent($cell.next(), "mouseup");
 
-        $('.modal input:first').val('new event in quick create 2').trigger('input');
-        $('.modal button.btn:contains(Edit)').trigger('click');
+        $('.modal-dialog input:first').val('new event in quick create 2').trigger('input');
+        $('footer.modal-footer button.btn:contains(Edit)').trigger('click');
 
         assert.strictEqual($('.modal-lg input:first').val(), 'new event in quick create 2', "should open the formViewDialog with default values");
 
         $('.modal-lg button.btn:contains(Save)').trigger('click');
 
-        assert.notOk($('.modal').length, "should close dialogs");
+        assert.notOk($('[role="dialog"]').length, "should close dialogs");
         var $newevent2 = calendar.$('.fc-event:contains(new event in quick create 2)');
         assert.ok($newevent2.length, "should display the 2 days new record");
         assert.strictEqual($newevent2.closest('.fc-event-container').attr('colspan'), "2", "the new record should have 2 days");
@@ -385,9 +385,9 @@ QUnit.module('Views', {
         // delete the a record
 
         calendar.$('.fc-event:contains(event 4) .fc-content').trigger('click');
-        $('.modal button.btn:contains(Delete)').trigger('click');
-        assert.ok($('.modal button.btn:contains(Ok)').length, "should display the confirm message");
-        $('.modal button.btn:contains(Ok)').trigger('click');
+        $('footer.modal-footer button.btn:contains(Delete)').trigger('click');
+        assert.ok($('footer.modal-footer button.btn:contains(Ok)').length, "should display the confirm message");
+        $('footer.modal-footer button.btn:contains(Ok)').trigger('click');
         assert.notOk(calendar.$('.fc-event:contains(event 4) .fc-content').length, "the record should be deleted");
 
         assert.strictEqual(calendar.$('.fc-event-container .fc-event').length, 10, "should display 10 events");
@@ -439,18 +439,18 @@ QUnit.module('Views', {
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
 
-        assert.strictEqual($('.modal-dialog.modal-sm .modal-title').text(), 'Create: Events',
+        assert.strictEqual($('.modal-sm .modal-title').text(), 'Create: Events',
             "should open the quick create dialog");
 
-        $('.modal-body input:first').val('new event in quick create').trigger('input');
-        $('.modal button.btn:contains(Create)').trigger('click').trigger('click');
+        $('main.modal-body input:first').val('new event in quick create').trigger('input');
+        $('footer.modal-footer button.btn:contains(Create)').trigger('click').trigger('click');
 
         // If the event is not default-prevented, a traceback will be raised, which we do not want
         assert.ok(event.isDefaultPrevented(), "fail deferred event should have been default-prevented");
 
-        assert.strictEqual($('.modal-dialog.modal-lg .modal-title').text(), 'Create: Events',
+        assert.strictEqual($('.modal-lg .modal-title').text(), 'Create: Events',
             "should have switched to a bigger modal for an actual create rather than quickcreate");
-        assert.strictEqual($('.modal-dialog.modal-lg .modal-body .o_form_view.o_form_editable').length, 1,
+        assert.strictEqual($('.modal-lg main .o_form_view.o_form_editable').length, 1,
             "should open the full event form view in a dialog");
 
         calendar.destroy();
@@ -1328,7 +1328,7 @@ QUnit.module('Views', {
         var $cell = calendar.$('.fc-day-grid .fc-row:eq(4) .fc-day:eq(2)');
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
-        $('.modal-body input:first').val('coucou').trigger('input');
+        $('main.modal-body input:first').val('coucou').trigger('input');
 
         testUtils.intercept(calendar, 'do_action', function (event) {
             assert.deepEqual(event.data.action,
@@ -1385,7 +1385,7 @@ QUnit.module('Views', {
         var $cell = calendar.$('.fc-day-grid .fc-row:eq(4) .fc-day:eq(2)');
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
-        $('.modal-body input:first').val('coucou').trigger('input');
+        $('main.modal-body input:first').val('coucou').trigger('input');
 
         testUtils.intercept(calendar, 'do_action', function (event) {
             assert.deepEqual(event.data.action,
@@ -1463,7 +1463,7 @@ QUnit.module('Views', {
         var $cell = calendar.$('.fc-day-grid .fc-row:eq(4) .fc-day:eq(2)');
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
-        $('.modal-body input:first').val('coucou').trigger('input');
+        $('main.modal-body input:first').val('coucou').trigger('input');
 
         testUtils.intercept(calendar, 'do_action', function (event) {
             assert.deepEqual(event.data.action,
@@ -1600,8 +1600,8 @@ QUnit.module('Views', {
         testUtils.triggerPositionalMouseEvent(left, top + 200, "mousemove");
         testUtils.triggerPositionalMouseEvent(left, top + 200, "mouseup");
 
-        $('.modal-body input:first').val('coucou').trigger('input');
-        $('.modal button.btn:contains(Create)').trigger('click');
+        $('main.modal-body input:first').val('coucou').trigger('input');
+        $('footer.modal-footer button.btn:contains(Create)').trigger('click');
 
         assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should add the missing filter (active)");
         assert.strictEqual(calendar.$('.fc-event').length, 4, "should display the created item");
@@ -1617,8 +1617,8 @@ QUnit.module('Views', {
         testUtils.triggerPositionalMouseEvent(left, top + 200, "mousemove");
         testUtils.triggerPositionalMouseEvent(left, top + 200, "mouseup");
 
-        $('.modal-body input:first').val('coucou 2').trigger('input');
-        $('.modal button.btn:contains(Create)').trigger('click');
+        $('main.modal-body input:first').val('coucou 2').trigger('input');
+        $('footer.modal-footer button.btn:contains(Create)').trigger('click');
 
         assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should have the same filters");
         assert.strictEqual(calendar.$('.fc-event').length, 4, "should not display the created item");
@@ -1697,10 +1697,10 @@ QUnit.module('Views', {
         testUtils.triggerPositionalMouseEvent(left, top + 200, "mousemove");
         testUtils.triggerPositionalMouseEvent(left, top + 200, "mouseup");
 
-        $('.modal-body input:first').val('coucou').trigger('input');
+        $('main.modal-body input:first').val('coucou').trigger('input');
 
-        $('.modal button.btn:contains(Edit)').trigger('click');
-        $('.modal button.btn:contains(Save)').trigger('click');
+        $('footer.modal-footer button.btn:contains(Edit)').trigger('click');
+        $('footer.modal-footer button.btn:contains(Save)').trigger('click');
 
         assert.strictEqual(calendar.$('.o_calendar_filter_item').length, 6, "should add the missing filter (active)");
         assert.strictEqual(calendar.$('.fc-event').length, 4, "should display the created item");
@@ -1906,10 +1906,10 @@ QUnit.module('Views', {
             "should open the quick create dialog");
 
         // Creating the event
-        $('.modal-body input:first').val('new event in quick create').trigger('input');
-        $('.modal button.btn:contains(Create)').trigger('click').trigger('click');
+        $('main.modal-body input:first').val('new event in quick create').trigger('input');
+        $('footer.modal-footer button.btn:contains(Create)').trigger('click').trigger('click');
         assert.strictEqual(calendar.$('.fc-event:contains(new event in quick create)').length, 1,
-            "should display the new record");
+            "should display the new record after quick create dialog");
 
         calendar.destroy();
         $view.remove();
@@ -1989,14 +1989,14 @@ QUnit.module('Views', {
         var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)');
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
-        var $input = $('.modal-body input:first');
+        var $input = $('[role="dialog"] input:first');
         $input.val('new event in quick create').trigger('input');
         // Simulate ENTER pressed on Create button (after a TAB)
         $input.trigger($.Event('keyup', {
             which: $.ui.keyCode.ENTER,
             keyCode: $.ui.keyCode.ENTER,
         }));
-        $('.modal-footer button:first').click();
+        $('footer.modal-footer button:first').click();
         def.resolve();
         assert.strictEqual(createCount, 1,
             "should create only one event");
@@ -2221,7 +2221,7 @@ QUnit.module('Views', {
         var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)');
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
-        var $input = $('.modal-body input:first');
+        var $input = $('main.modal-body input:first');
         $input.val("It's just a fleshwound").trigger('input');
         $('.modal button.btn:contains(Create)').trigger('click');
 
@@ -2268,7 +2268,7 @@ QUnit.module('Views', {
         var $cell = calendar.$('.fc-day-grid .fc-row:eq(2) .fc-day:eq(2)');
         testUtils.triggerMouseEvent($cell, "mousedown");
         testUtils.triggerMouseEvent($cell, "mouseup");
-        var $input = $('.modal-body input:first');
+        var $input = $('main.modal-body input:first');
         $input.val("It's just a fleshwound").trigger('input');
         $('.modal button.btn:contains(Create)').trigger('click');
 
diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js
index 18c82adb0a57..44ac724995bd 100644
--- a/addons/web/static/tests/views/form_tests.js
+++ b/addons/web/static/tests/views/form_tests.js
@@ -2131,13 +2131,13 @@ QUnit.module('Views', {
             "should display the name of the many2many on the original form");
         form.$('td:contains(gold)').click();
 
-        assert.strictEqual($('.modal-dialog').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             'The partner_type modal should have opened');
-        assert.strictEqual($('.modal-dialog').find('td:contains(first record)').length, 1,
+        assert.strictEqual($('[role="dialog"]').find('td:contains(first record)').length, 1,
             "should display the name of the many2many on the modal form");
 
-        $('.modal-dialog').find('td:contains(first record)').click();
-        assert.strictEqual($('.modal-dialog').length, 2,
+        $('[role="dialog"]').find('td:contains(first record)').click();
+        assert.strictEqual($('[role="dialog"]').length, 2,
             'There should be 2 modals (partner on top of partner_type) opened');
 
         form.destroy();
@@ -2167,7 +2167,7 @@ QUnit.module('Views', {
 
         // click on discard
         form.$buttons.find('.o_form_button_cancel').click();
-        assert.ok(!$('.modal:visible').length, 'no confirm modal should be displayed');
+        assert.ok(!$('[role="dialog"]:visible').length, 'no confirm modal should be displayed');
         assert.strictEqual(form.$('.o_field_widget').text(), 'yop', 'field in readonly should display yop');
 
         assert.strictEqual(nbWrite, 0, 'no write RPC should have been done');
@@ -2200,14 +2200,14 @@ QUnit.module('Views', {
 
         // click on discard and cancel the confirm request
         form.$buttons.find('.o_form_button_cancel').click();
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-default').click(); // click on cancel
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-default').click(); // click on cancel
         assert.strictEqual(form.$('input').val(), 'new value', 'input should still contain new value');
 
         // click on discard and confirm
         form.$buttons.find('.o_form_button_cancel').click();
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
         assert.strictEqual(form.$('.o_field_widget').text(), 'yop', 'field in readonly should display yop');
 
         assert.strictEqual(nbWrite, 0, 'no write RPC should have been done');
@@ -2287,7 +2287,7 @@ QUnit.module('Views', {
 
         // click on discard and confirm
         form.$buttons.find('.o_form_button_cancel').click();
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
 
         assert.notOk(form.$el.prop('outerHTML').match('xphone'),
             "the string xphone should not be present after discarding");
@@ -2317,7 +2317,7 @@ QUnit.module('Views', {
 
         form.$buttons.find('.o_form_button_cancel').click();
 
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             'there should not be a confirm modal');
 
         form.destroy();
@@ -2351,17 +2351,17 @@ QUnit.module('Views', {
 
         // discard the changes and check it has properly been discarded
         form.$buttons.find('.o_form_button_cancel').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             'there should be a confirm modal');
         assert.strictEqual(form.$('input').val(), 'DEF', 'input should be DEF');
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
         assert.strictEqual(form.$('input').val(), 'ABC', 'input should now be ABC');
 
         // redirty and discard the field foo (to make sure initial changes haven't been lost)
         form.$('input').val('GHI').trigger('input');
         form.$buttons.find('.o_form_button_cancel').click();
         assert.strictEqual(form.$('input').val(), 'GHI', 'input should be GHI');
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
         assert.strictEqual(form.$('input').val(), 'ABC', 'input should now be ABC');
 
         form.destroy();
@@ -2395,7 +2395,7 @@ QUnit.module('Views', {
 
         form.$buttons.find('.o_form_button_cancel').click();
 
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             'there should not be a confirm modal');
 
         form.destroy();
@@ -2436,15 +2436,15 @@ QUnit.module('Views', {
 
         // click on the pager to switch to the next record and cancel the confirm request
         form.pager.$('.o_pager_next').click(); // click on next
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-default').click(); // click on cancel
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-default').click(); // click on cancel
         assert.strictEqual(form.$('input').val(), 'new value', 'input should still contain new value');
         assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should still be 1');
 
         // click on the pager to switch to the next record and confirm
         form.pager.$('.o_pager_next').click(); // click on next
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
         assert.strictEqual(form.$('input').val(), 'blip', 'input should contain blip');
         assert.strictEqual(form.pager.$('.o_pager_value').text(), "2", 'pager value should be 2');
 
@@ -2483,7 +2483,7 @@ QUnit.module('Views', {
 
         // click on the pager to switch to the next record and cancel the confirm request
         form.pager.$('.o_pager_next').click(); // click on next
-        assert.strictEqual($('.modal:visible').length, 0, 'no confirm modal should be displayed');
+        assert.strictEqual($('[role="dialog"]:visible').length, 0, 'no confirm modal should be displayed');
         assert.strictEqual(form.pager.$('.o_pager_value').text(), "2", 'pager value should be 2');
 
         assert.strictEqual(form.$('.o_priority .fa-star-o').length, 2,
@@ -2495,7 +2495,7 @@ QUnit.module('Views', {
             'priority widget should have been updated');
 
         form.pager.$('.o_pager_next').click(); // click on next
-        assert.strictEqual($('.modal:visible').length, 0, 'no confirm modal should be displayed');
+        assert.strictEqual($('[role="dialog"]:visible').length, 0, 'no confirm modal should be displayed');
         assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should be 1');
 
         // switch to edit mode
@@ -2506,8 +2506,8 @@ QUnit.module('Views', {
         form.$('input').val('wrong value').trigger('input');
 
         form.$buttons.find('.o_form_button_cancel').click();
-        assert.strictEqual($('.modal').length, 1, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        assert.strictEqual($('[role="dialog"]').length, 1, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
         form.pager.$('.o_pager_next').click(); // click on next
         assert.strictEqual(form.pager.$('.o_pager_value').text(), "2", 'pager value should be 2');
         form.destroy();
@@ -2736,16 +2736,16 @@ QUnit.module('Views', {
         assert.strictEqual(form.pager.$('.o_pager_limit').text(), "3", 'pager limit should be 3');
         assert.strictEqual(form.$('span:contains(yop)').length, 1,
             'should have a field with foo value for record 1');
-        assert.ok(!$('.modal:visible').length, 'no confirm modal should be displayed');
+        assert.ok(!$('[role="dialog"]:visible').length, 'no confirm modal should be displayed');
 
         // open sidebar
         form.sidebar.$('button.o_dropdown_toggler_btn').click();
         form.sidebar.$('a:contains(Delete)').click();
 
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
 
         // confirm the delete
-        $('.modal .modal-footer button.btn-primary').click();
+        $('footer.modal-footer button.btn-primary').click();
 
         assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should be 1');
         assert.strictEqual(form.pager.$('.o_pager_limit').text(), "2", 'pager limit should be 2');
@@ -2784,9 +2784,9 @@ QUnit.module('Views', {
         testUtils.intercept(form, 'history_back', function () {
             assert.step('history_back');
         });
-        assert.strictEqual($('.modal').length, 1, 'a confirm modal should be displayed');
-        $('.modal .modal-footer button.btn-primary').click();
-        assert.strictEqual($('.modal').length, 0, 'no confirm modal should be displayed');
+        assert.strictEqual($('[role="dialog"]').length, 1, 'a confirm modal should be displayed');
+        $('footer.modal-footer button.btn-primary').click();
+        assert.strictEqual($('[role="dialog"]').length, 0, 'no confirm modal should be displayed');
 
         assert.verifySteps(['read', 'unlink', 'history_back']);
         form.destroy();
@@ -3354,7 +3354,7 @@ QUnit.module('Views', {
         // open a subrecord and trigger an onchange
         readInModal = true;
         form.$('.o_data_row .o_data_cell:first').click();
-        $('.modal .o_field_widget[name=name]').val("new name").trigger('input');
+        $('[role="dialog"] .o_field_widget[name=name]').val("new name").trigger('input');
 
         form.destroy();
     });
@@ -3582,7 +3582,7 @@ QUnit.module('Views', {
 
         // discard changes
         form.$buttons.find('.o_form_button_cancel').click();
-        $('.modal .modal-footer .btn-primary').click();
+        $('footer.modal-footer .btn-primary').click();
         assert.strictEqual(form.$('span[name="foo"]').text(), "blip",
             "field foo should still be displayed to initial value");
 
@@ -3627,13 +3627,13 @@ QUnit.module('Views', {
 
         assert.strictEqual(form.$('.o_field_widget[name="foo"]').val(), "1234",
             "field foo should still contain new value");
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             "Confirm dialog should not be displayed");
 
         // complete the write
         def.resolve();
 
-        assert.strictEqual($('.modal').length, 0,
+        assert.strictEqual($('[role="dialog"]').length, 0,
             "Confirm dialog should not be displayed");
         assert.strictEqual(form.$('.o_field_widget[name="foo"]').text(), "1234",
             "value should have been saved and rerendered in readonly");
@@ -3804,9 +3804,9 @@ QUnit.module('Views', {
             "onchange should have been correctly applied on field in o2m list");
 
         form.$('.o_data_row').click(); // edit the o2m in the dialog
-        assert.strictEqual($('.modal .modal-title').text().trim(), 'Open: one2many field',
+        assert.strictEqual($('[role="dialog"] .modal-title').text().trim(), 'Open: one2many field',
             "the field string is displayed in the modal title");
-        assert.strictEqual($('.modal .o_field_widget').val(), 'foo changed',
+        assert.strictEqual($('[role="dialog"] .o_field_widget').val(), 'foo changed',
             "the onchange value hasn't been discarded when opening the o2m");
 
         form.destroy();
@@ -3898,20 +3898,20 @@ QUnit.module('Views', {
             "the initial value should be the default one");
 
         form.$('.o_data_row td:first').click(); // edit the o2m in a dialog
-        $('.modal input:nth(1)').val(77).trigger('input');
-        assert.strictEqual($('.modal input:first').val(), '[blip] 77',
+        $('[role="dialog"] input:nth(1)').val(77).trigger('input');
+        assert.strictEqual($('[role="dialog"] input:first').val(), '[blip] 77',
             "onchange should have been correctly applied");
-        $('.modal .modal-footer .btn-primary').click(); // save the dialog
+        $('footer.modal-footer .btn-primary').click(); // save the dialog
         assert.strictEqual(form.$('.o_data_row td:first').text(), '[blip] 77',
             "onchange should have been correctly applied");
 
         // create a new o2m record
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal .modal-title').text().trim(), 'Create custom label',
+        assert.strictEqual($('[role="dialog"] .modal-title').text().trim(), 'Create custom label',
             "the custom field label is applied in the modal title");
-        assert.strictEqual($('.modal input:first').val(), '[blip] 14',
+        assert.strictEqual($('[role="dialog"] input:first').val(), '[blip] 14',
             "onchange should have been correctly applied after default get");
-        $('.modal .modal-footer .btn-primary').click(); // save the dialog
+        $('footer.modal-footer .btn-primary').click(); // save the dialog
         assert.strictEqual(form.$('.o_data_row:nth(1) td:first').text(), '[blip] 14',
             "onchange should have been correctly applied after default get");
 
@@ -4340,10 +4340,10 @@ QUnit.module('Views', {
 
         // add a o2m subrecord
         form.$('.o_field_x2many_list_row_add a').click();
-        $('.modal-body .o_field_one2many .o_field_x2many_list_row_add a').click();
-        $('.modal-body input').val('xtv').trigger('input');
-        $('.modal-footer button:first').click(); // save & close
-        assert.strictEqual($('.modal').length, 0,
+        $('main.modal-body .o_field_one2many .o_field_x2many_list_row_add a').click();
+        $('main.modal-body input').val('xtv').trigger('input');
+        $('footer.modal-footer button:first').click(); // save & close
+        assert.strictEqual($('[role="dialog"]').length, 0,
             "dialog should be closed");
 
         var row = form.$('.o_field_one2many .o_list_view .o_data_row');
@@ -4639,7 +4639,7 @@ QUnit.module('Views', {
         assert.strictEqual(row.children()[1].textContent, '1 record',
             "the cell should contains the number of record: 1");
         row.click();
-        var modal_row = $('.modal-body .o_form_sheet .o_field_one2many .o_list_view .o_data_row');
+        var modal_row = $('main.modal-body .o_form_sheet .o_field_one2many .o_list_view .o_data_row');
         assert.strictEqual(modal_row.children().length, 2,
             "the row should contains the 2 fields defined in the form view");
         assert.strictEqual($(modal_row).text(), "gold2",
@@ -4986,29 +4986,29 @@ QUnit.module('Views', {
         form.$buttons.find('.o_form_button_edit').click();
         // Open first dialog
         form.$('.o_external_button').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "One FormViewDialog should be opened");
-        var $firstModal = $('.modal');
-        assert.strictEqual($('.modal .modal-title').first().text().trim(), 'Open: Product',
+        var $firstModal = $('[role="dialog"]');
+        assert.strictEqual($('[role="dialog"] .modal-title').first().text().trim(), 'Open: Product',
             "dialog title should display the python field string as label");
         assert.strictEqual($firstModal.find('input').val(), 'xphone',
             "display_name should be correctly displayed");
 
         // Open second dialog
         $firstModal.find('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal').length, 2,
+        assert.strictEqual($('[role="dialog"]').length, 2,
             "two FormViewDialogs should be opened");
-        var $secondModal = $('.modal:nth(1)');
+        var $secondModal = $('[role="dialog"]:nth(1)');
         // Add new value
         $secondModal.find('input').val('xtv').trigger('input');
-        $secondModal.find('.modal-footer button:first').click(); // Save & close
-        assert.strictEqual($('.modal').length, 1,
+        $secondModal.find('footer.modal-footer button:first').click(); // Save & close
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "last opened dialog should be closed");
 
         // Check that data in first dialog is correctly updated
         assert.strictEqual($firstModal.find('tr.o_data_row td').text(), 'xtv',
             "should have added a line with xtv as new record");
-        $firstModal.find('.modal-footer button:first').click(); // Save & close
+        $firstModal.find('footer.modal-footer button:first').click(); // Save & close
         form.destroy();
     });
 
@@ -5210,12 +5210,12 @@ QUnit.module('Views', {
             "record 1 should be first");
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "FormViewDialog should be opened");
-        $('.modal input[name="foo"]').val('xop').trigger("input");
-        $('.modal .modal-footer button:eq(1)').click(); // Save & new
-        $('.modal input[name="foo"]').val('zop').trigger("input");
-        $('.modal .modal-footer button:first').click(); // Save & close
+        $('[role="dialog"] input[name="foo"]').val('xop').trigger("input");
+        $('footer.modal-footer button:eq(1)').click(); // Save & new
+        $('[role="dialog"] input[name="foo"]').val('zop').trigger("input");
+        $('footer.modal-footer button:first').click(); // Save & close
 
         // client-side sort
         assert.ok(form.$('.o_field_one2many tbody tr:eq(0) td:contains(zop)').length,
@@ -5237,8 +5237,8 @@ QUnit.module('Views', {
         // client-side sort on edit
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_one2many tbody tr:eq(1) td:contains(yop)').click();
-        $('.modal input[name="foo"]').val('zzz').trigger("input");
-        $('.modal .modal-footer button:first').click(); // Save
+        $('[role="dialog"] input[name="foo"]').val('zzz').trigger("input");
+        $('footer.modal-footer button:first').click(); // Save
         assert.ok(form.$('.o_field_one2many tbody tr:eq(0) td:contains(zzz)').length,
             "record zzz should be first");
         assert.ok(form.$('.o_field_one2many tbody tr:eq(1) td:contains(zop)').length,
@@ -5524,7 +5524,7 @@ QUnit.module('Views', {
         });
 
         form.$('.o_data_row:first').click();
-        assert.strictEqual($('.modal .modal-title').first().text().trim(), 'Open: custom label',
+        assert.strictEqual($('[role="dialog"] .modal-title').first().text().trim(), 'Open: custom label',
             "modal should use the python field string as title");
 
         form.destroy();
@@ -5610,10 +5610,10 @@ QUnit.module('Views', {
         form.$buttons.find('.o_form_button_edit').click();
         form.$('[name="product_id"] .o_external_button').click();
 
-        assert.strictEqual($('.modal-body .o_field_translate').length, 1,
+        assert.strictEqual($('main.modal-body .o_field_translate').length, 1,
             "there should be a translate button in the modal");
 
-        $('.modal-body .o_field_translate').click();
+        $('main.modal-body .o_field_translate').click();
 
         assert.strictEqual(nbTranslateCalls, 1, "should call_button translate once");
 
@@ -5780,7 +5780,7 @@ QUnit.module('Views', {
         form.$('.o_statusbar_buttons button').click();
         assert.ok(form.$('.o_statusbar_buttons button').prop('disabled'),
             'button should be disabled');
-        $('.modal .modal-footer button.btn-default').click();
+        $('footer.modal-footer button.btn-default').click();
         assert.ok(!form.$('.o_statusbar_buttons button').prop('disabled'),
             'button should no longer be disabled');
 
@@ -5789,7 +5789,7 @@ QUnit.module('Views', {
         // click on button, and click on ok in confirm dialog
         form.$('.o_statusbar_buttons button').click();
         assert.verifySteps(['default_get']);
-        $('.modal .modal-footer button.btn-primary').click();
+        $('footer.modal-footer button.btn-primary').click();
 
         assert.verifySteps(['default_get', 'create', 'read', 'execute_action']);
 
@@ -5845,17 +5845,17 @@ QUnit.module('Views', {
 
         form.$('.o_external_button').click();
 
-        assert.notOk($('.modal .oe_button_box button').attr('disabled'),
+        assert.notOk($('[role="dialog"] .oe_button_box button').attr('disabled'),
             "stat buttons should be enabled");
 
-        $('.modal .oe_button_box button').click();
+        $('[role="dialog"] .oe_button_box button').click();
 
-        assert.ok($('.modal .oe_button_box button').attr('disabled'),
+        assert.ok($('[role="dialog"] .oe_button_box button').attr('disabled'),
             "stat buttons should be disabled");
 
         def.resolve();
 
-        assert.notOk($('.modal .oe_button_box button').attr('disabled'),
+        assert.notOk($('[role="dialog"] .oe_button_box button').attr('disabled'),
             "stat buttons should be enabled");
 
         form.destroy();
@@ -6034,16 +6034,16 @@ QUnit.module('Views', {
 
         form.$buttons.find('.o_form_button_edit').click();
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "One FormViewDialog should be opened");
         // set a value on the m2o
         var $dropdown = form.$('.o_field_many2one input').autocomplete('widget');
-        $('.modal .o_field_many2one input').click();
+        $('[role="dialog"] .o_field_many2one input').click();
         $dropdown.find('li:first()').click();
 
-        $('.modal .modal-footer button:eq(1)').click(); // Save & new
-        $('.modal .o_field_many2one input').click();
-        $('.modal .modal-footer button:first').click(); // Save & close
+        $('footer.modal-footer button:eq(1)').click(); // Save & new
+        $('[role="dialog"] .o_field_many2one input').click();
+        $('footer.modal-footer button:first').click(); // Save & close
         form.destroy();
     });
 
@@ -6133,20 +6133,20 @@ QUnit.module('Views', {
         });
 
         form.$('.o_field_x2many_list_row_add a').click();
-        assert.strictEqual($('.modal input.o_field_widget[name=foo]').length, 1,
+        assert.strictEqual($('[role="dialog"] input.o_field_widget[name=foo]').length, 1,
             'foo should be editable');
         checkOnchange = true;
-        $('.modal .o_field_widget[name=foo]').val('foo value').trigger('input');
-        $('.modal .o_field_widget[name=display_name]').val('readonly').trigger('input');
-        assert.strictEqual($('.modal span.o_field_widget[name=foo]').length, 1,
+        $('[role="dialog"] .o_field_widget[name=foo]').val('foo value').trigger('input');
+        $('[role="dialog"] .o_field_widget[name=display_name]').val('readonly').trigger('input');
+        assert.strictEqual($('[role="dialog"] span.o_field_widget[name=foo]').length, 1,
             'foo should be readonly');
-        $('.modal .modal-footer .btn-primary').click(); // close the modal
+        $('footer.modal-footer .btn-primary').click(); // close the modal
         checkOnchange = false;
 
         form.$('.o_data_row').click(); // re-open previous record
-        assert.strictEqual($('.modal .o_field_widget[name=foo]').text(), 'foo value',
+        assert.strictEqual($('[role="dialog"] .o_field_widget[name=foo]').text(), 'foo value',
             "the edited value should have been kept");
-        $('.modal .modal-footer .btn-primary').click(); // close the modal
+        $('footer.modal-footer .btn-primary').click(); // close the modal
 
         form.$buttons.find('.o_form_button_save').click(); // save the record
 
@@ -6219,8 +6219,8 @@ QUnit.module('Views', {
         form.$buttons.find('.o_form_button_save').click(); // save duplicated record
 
         form.sidebar.$('a:contains(Delete)').click(); // delete duplicated record
-        assert.strictEqual($('.modal').length, 1, "should have opened a confirm dialog");
-        $('.modal .modal-footer .btn-primary').click(); // confirm
+        assert.strictEqual($('[role="dialog"]').length, 1, "should have opened a confirm dialog");
+        $('footer.modal-footer .btn-primary').click(); // confirm
 
         assert.strictEqual(form.$('.o_field_widget').text(), 'first record',
             "should have come back to previous record");
@@ -6301,12 +6301,12 @@ QUnit.module('Views', {
         });
 
         form.$('.o_external_button').click(); // open the many2one record in a modal
-        $('.modal .o_external_button').click(); // in the modal, open the many2one record in another modal
+        $('[role="dialog"] .o_external_button').click(); // in the modal, open the many2one record in another modal
 
-        $('.modal:nth(1) .o_field_widget[name=display_name]').val('new name').trigger('input');
-        $('.modal:nth(1) .modal-footer .btn-primary').first().click(); // save changes
+        $('[role="dialog"]:nth(1) .o_field_widget[name=display_name]').val('new name').trigger('input');
+        $('[role="dialog"]:nth(1) footer .btn-primary').first().click(); // save changes
 
-        assert.strictEqual($('.modal .o_field_widget[name=trululu] input').val(), 'new name',
+        assert.strictEqual($('[role="dialog"] .o_field_widget[name=trululu] input').val(), 'new name',
             "record should have been reloaded");
         assert.verifySteps([
             "read", // main record
@@ -6409,11 +6409,11 @@ QUnit.module('Views', {
             viewOptions: {mode: 'edit'},
         });
         form.$('.o_external_button').click();
-        assert.strictEqual($('.modal-body .o_form_view .o_list_view .o_data_cell').text(), "yopblip",
+        assert.strictEqual($('main.modal-body .o_form_view .o_list_view .o_data_cell').text(), "yopblip",
             "table has some initial order");
 
-        $('.modal-body .o_form_view .o_list_view th').click();
-        assert.strictEqual($('.modal-body .o_form_view .o_list_view .o_data_cell').text(), "blipyop",
+        $('main.modal-body .o_form_view .o_list_view th').click();
+        assert.strictEqual($('main.modal-body .o_form_view .o_list_view .o_data_cell').text(), "blipyop",
             "table is now sorted");
         form.destroy();
     });
@@ -6849,7 +6849,7 @@ QUnit.module('Views', {
         core.bus.on('clear_cache', form, assert.step.bind(assert, 'clear_cache'));
 
         form.sidebar.$('a:contains(Delete)').click();
-        $('.modal .modal-footer .btn-primary').click(); // confirm
+        $('footer.modal-footer .btn-primary').click(); // confirm
 
         assert.verifySteps(['unlink', 'clear_cache']);
 
diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js
index 04c1c603118f..2cc7a2431efc 100644
--- a/addons/web/static/tests/views/kanban_tests.js
+++ b/addons/web/static/tests/views/kanban_tests.js
@@ -182,12 +182,12 @@ QUnit.module('Views', {
             "last column should contain 3 records");
         envIDs = [4];
         kanban.$('.o_kanban_group:last .o_column_archive_records').click(); // Click on 'Archive All'
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-default').click(); // Click on 'Cancel'
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-default').click(); // Click on 'Cancel'
         assert.strictEqual(kanban.$('.o_kanban_group:last .o_kanban_record').length, 3, "still last column should contain 3 records");
         kanban.$('.o_kanban_group:last .o_column_archive_records').click();
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-primary').click(); // Click on 'Ok'
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-primary').click(); // Click on 'Ok'
         assert.strictEqual(kanban.$('.o_kanban_group:last .o_kanban_record').length, 0, "last column should not contain any records");
         kanban.destroy();
     });
@@ -1204,16 +1204,16 @@ QUnit.module('Views', {
                 which: $.ui.keyCode.ENTER,
             }));
 
-        assert.strictEqual($('.modal .o_form_view.o_form_editable').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_form_view.o_form_editable').length, 1,
             "a form view dialog should have been opened (in edit)");
-        assert.strictEqual($('.modal .o_field_many2one input').val(), 'hello',
+        assert.strictEqual($('[role="dialog"] .o_field_many2one input').val(), 'hello',
             "the correct product_id should already be set");
 
         // specify a name and save
-        $('.modal input[name=foo]').val('test').trigger('input');
-        $('.modal-footer .btn-primary').click();
+        $('[role="dialog"] input[name=foo]').val('test').trigger('input');
+        $('footer.modal-footer .btn-primary').click();
 
-        assert.strictEqual($('.modal').length, 0, "the modal should be closed");
+        assert.strictEqual($('[role="dialog"]').length, 0, "the modal should be closed");
         assert.strictEqual(kanban.$('.o_kanban_group:first .o_kanban_record').length, 3,
             "there should be 3 records in first column");
         var $firstRecord = kanban.$('.o_kanban_group:first .o_kanban_record:first');
@@ -1793,13 +1793,13 @@ QUnit.module('Views', {
 
         // delete second column (first cancel the confirm request, then confirm)
         kanban.$('.o_kanban_group:last .o_column_delete').click(); // click on delete
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-default').click(); // click on cancel
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-default').click(); // click on cancel
         assert.strictEqual(kanban.$('.o_kanban_group:last').data('id'), 5,
             'column [5, "xmo"] should still be there');
         kanban.$('.o_kanban_group:last .o_column_delete').click(); // click on delete
-        assert.ok($('.modal').length, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-primary').click(); // click on confirm
+        assert.ok($('[role="dialog"]').length, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-primary').click(); // click on confirm
         assert.strictEqual(kanban.$('.o_kanban_group:last').data('id'), 3,
             'last column should now be [3, "hello"]');
         assert.strictEqual(kanban.$('.o_kanban_group').length, 2, "should still have two columns");
@@ -1870,7 +1870,7 @@ QUnit.module('Views', {
         assert.strictEqual(kanban.$('.o_kanban_group').length, 3, "should have two columns");
 
         kanban.$('.o_kanban_group:last .o_column_delete').click();
-        $('.modal .modal-footer .btn-primary').click();
+        $('footer.modal-footer .btn-primary').click();
 
         assert.strictEqual(kanban.$('.o_kanban_group').length, 2, "should have twos columns");
 
@@ -1912,33 +1912,33 @@ QUnit.module('Views', {
 
         // edit the title of column [5, 'xmo'] and close without saving
         kanban.$('.o_kanban_group[data-id=5] .o_column_edit').click(); // click on 'Edit'
-        assert.ok($('.modal .o_form_editable').length, 'a form view should be open in a modal');
-        assert.strictEqual($('.modal .o_form_editable input').val(), 'xmo',
+        assert.ok($('[role="dialog"] .o_form_editable').length, 'a form view should be open in a modal');
+        assert.strictEqual($('[role="dialog"] .o_form_editable input').val(), 'xmo',
             'the name should be "xmo"');
-        $('.modal .o_form_editable input').val('ged').trigger('input'); // change the value
+        $('[role="dialog"] .o_form_editable input').val('ged').trigger('input'); // change the value
         nbRPCs = 0;
-        $('.modal .modal-header .close').click(); // click on the cross to close the modal
-        assert.ok(!$('.modal').length, 'the modal should be closed');
+        $('header.modal-header .close').click(); // click on the cross to close the modal
+        assert.ok(!$('[role="dialog"]').length, 'the modal should be closed');
         assert.strictEqual(kanban.$('.o_kanban_group[data-id=5] .o_column_title').text(), 'xmo',
             'title of the column should still be "xmo"');
         assert.strictEqual(nbRPCs, 0, 'no RPC should have been done');
 
         // edit the title of column [5, 'xmo'] and discard
         kanban.$('.o_kanban_group[data-id=5] .o_column_edit').click(); // click on 'Edit'
-        $('.modal .o_form_editable input').val('ged').trigger('input'); // change the value
+        $('[role="dialog"] .o_form_editable input').val('ged').trigger('input'); // change the value
         nbRPCs = 0;
-        $('.modal .modal-footer .btn-default').click(); // click on discard
-        assert.ok(!$('.modal').length, 'the modal should be closed');
+        $('footer.modal-footer .btn-default').click(); // click on discard
+        assert.ok(!$('[role="dialog"]').length, 'the modal should be closed');
         assert.strictEqual(kanban.$('.o_kanban_group[data-id=5] .o_column_title').text(), 'xmo',
             'title of the column should still be "xmo"');
         assert.strictEqual(nbRPCs, 0, 'no RPC should have been done');
 
         // edit the title of column [5, 'xmo'] and save
         kanban.$('.o_kanban_group[data-id=5] .o_column_edit').click(); // click on 'Edit'
-        $('.modal .o_form_editable input').val('ged').trigger('input'); // change the value
+        $('[role="dialog"] .o_form_editable input').val('ged').trigger('input'); // change the value
         nbRPCs = 0;
-        $('.modal .modal-footer .btn-primary').click(); // click on save
-        assert.ok(!$('.modal').length, 'the modal should be closed');
+        $('footer.modal-footer .btn-primary').click(); // click on save
+        assert.ok(!$('[role="dialog"]').length, 'the modal should be closed');
         assert.strictEqual(kanban.$('.o_kanban_group[data-id=5] .o_column_title').text(), 'ged',
             'title of the column should be "ged"');
         assert.strictEqual(nbRPCs, 4, 'should have done 1 write, 1 read_group and 2 search_read');
@@ -2058,16 +2058,16 @@ QUnit.module('Views', {
         // click to see the examples
         kanban.$('.o_column_quick_create .o_kanban_examples').click();
 
-        assert.strictEqual($('.modal .o_kanban_examples_dialog').length, 1,
+        assert.strictEqual($('[role="dialog"] .o_kanban_examples_dialog').length, 1,
             "should have open the examples dialog");
-        assert.strictEqual($('.modal .o_kanban_examples_dialog_nav li').length, 2,
+        assert.strictEqual($('[role="dialog"] .o_kanban_examples_dialog_nav li').length, 2,
             "should have two examples (in the menu)");
-        assert.strictEqual($('.modal .o_kanban_examples_dialog_nav a').text(),
+        assert.strictEqual($('[role="dialog"] .o_kanban_examples_dialog_nav a').text(),
             ' A first example  A second example ', "example names should be correct");
-        assert.strictEqual($('.modal .o_kanban_examples_dialog_content .tab-pane').length, 2,
+        assert.strictEqual($('[role="dialog"] .o_kanban_examples_dialog_content .tab-pane').length, 2,
             "should have two examples");
 
-        var $firstPane = $('.modal .o_kanban_examples_dialog_content .tab-pane:first');
+        var $firstPane = $('[role="dialog"] .o_kanban_examples_dialog_content .tab-pane:first');
         assert.strictEqual($firstPane.find('.o_kanban_examples_group').length, 3,
             "there should be 3 stages in the first example");
         assert.strictEqual($firstPane.find('h6').text(), 'Column 1Column 2Column 3',
@@ -2075,7 +2075,7 @@ QUnit.module('Views', {
         assert.strictEqual($firstPane.find('.o_kanban_examples_description').text().trim(),
             "Some description", "the correct description should be displayed");
 
-        var $secondPane = $('.modal .o_kanban_examples_dialog_content .tab-pane:nth(1)');
+        var $secondPane = $('[role="dialog"] .o_kanban_examples_dialog_content .tab-pane:nth(1)');
         assert.strictEqual($secondPane.find('.o_kanban_examples_group').length, 2,
             "there should be 2 stages in the second example");
         assert.strictEqual($secondPane.find('h6').text(), 'Col 1Col 2',
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 8aa70c1c0993..ed57c6968ac4 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -880,7 +880,7 @@ QUnit.module('Views', {
         list.sidebar.$('a:contains(Delete)').click();
         assert.ok($('body').hasClass('modal-open'), 'body should have modal-open clsss');
 
-        $('body .modal-dialog button span:contains(Ok)').click();
+        $('body [role="dialog"] button span:contains(Ok)').click();
 
         assert.strictEqual(list.$('tbody td.o_list_record_selector').length, 3, "should have 3 records");
         list.destroy();
@@ -916,13 +916,13 @@ QUnit.module('Views', {
 
         assert.verifySteps(['/web/dataset/search_read']);
         list.sidebar.$('a:contains(Archive)').click();
-        assert.strictEqual($('.modal').length, 1, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-default').click(); // Click on 'Cancel'
+        assert.strictEqual($('[role="dialog"]').length, 1, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-default').click(); // Click on 'Cancel'
         assert.strictEqual(list.$('tbody td.o_list_record_selector').length, 4, "still should have 4 records");
 
         list.sidebar.$('a:contains(Archive)').click();
-        assert.strictEqual($('.modal').length, 1, 'a confirm modal should be displayed');
-        $('.modal .modal-footer .btn-primary').click(); // Click on 'Ok'
+        assert.strictEqual($('[role="dialog"]').length, 1, 'a confirm modal should be displayed');
+        $('footer.modal-footer .btn-primary').click(); // Click on 'Ok'
         assert.strictEqual(list.$('tbody td.o_list_record_selector').length, 3, "should have 3 records");
         assert.verifySteps(['/web/dataset/search_read', '/web/dataset/call_kw/foo/write', '/web/dataset/search_read']);
         list.destroy();
@@ -2759,10 +2759,10 @@ QUnit.module('Views', {
         list.$('.o_data_cell:first').click();
         list.$('input[name="foo"]').val("hello").trigger('input');
         list.$buttons.find('.o_list_button_discard').click();
-        assert.strictEqual($('.modal:visible').length, 1,
+        assert.strictEqual($('[role="dialog"]:visible').length, 1,
             "a modal to ask for discard should be visible");
 
-        $('.modal:visible .btn-primary').click();
+        $('[role="dialog"]:visible .btn-primary').click();
         assert.strictEqual(list.$('.o_data_cell:first').text(), "yop",
             "first cell should still contain 'yop'");
 
@@ -3555,7 +3555,7 @@ QUnit.module('Views', {
         // delete a record
         list.$('.o_data_row:first .o_list_record_selector input').click();
         list.sidebar.$('a:contains(Delete)').click();
-        $('.modal .modal-footer .btn-primary').click(); // confirm
+        $('footer.modal-footer .btn-primary').click(); // confirm
 
         assert.verifySteps([
             'create',
diff --git a/addons/web/static/tests/views/view_dialogs_tests.js b/addons/web/static/tests/views/view_dialogs_tests.js
index 39484795f5a4..2d6af1b5e140 100644
--- a/addons/web/static/tests/views/view_dialogs_tests.js
+++ b/addons/web/static/tests/views/view_dialogs_tests.js
@@ -90,9 +90,9 @@ QUnit.module('Views', {
             res_id: 1,
         }).open();
 
-        assert.notOk($('div.modal .modal-body button').length,
+        assert.notOk($('main.modal-body button').length,
             "should not have any button in body");
-        assert.strictEqual($('div.modal .modal-footer button').length, 1,
+        assert.strictEqual($('footer.modal-footer button').length, 1,
             "should have only one button in footer");
         parent.destroy();
     });
@@ -118,7 +118,7 @@ QUnit.module('Views', {
             res_id: 1,
         }).open();
 
-        assert.strictEqual($('div.modal button.btn-primary').length, 1,
+        assert.strictEqual($('[role="dialog"] button.btn-primary').length, 1,
             "should have 1 buttons in modal");
 
         $('.o_field_x2many_list_row_add a').click();
@@ -127,7 +127,7 @@ QUnit.module('Views', {
             keyCode: $.ui.keyCode.ESCAPE,
         }));
 
-        assert.strictEqual($('div.modal button.btn-primary').length, 1,
+        assert.strictEqual($('[role="dialog"] button.btn-primary').length, 1,
             "should still have 1 buttons in modal");
         parent.destroy();
     });
@@ -334,14 +334,14 @@ QUnit.module('Views', {
         form.$('.o_field_widget .o_field_many2one[name=instrument] input').click();
         $('ul.ui-autocomplete.ui-front.ui-menu.ui-widget.ui-widget-content li.o_m2o_dropdown_option').first().click();
 
-        var $modal = $('.modal-dialog.modal-lg');
+        var $modal = $('.modal-lg');
 
         assert.equal($modal.length, 1,
             'There should be one modal');
 
         $modal.find('.o_field_x2many_list_row_add a').click();
 
-        var $modals = $('.modal-dialog.modal-lg');
+        var $modals = $('.modal-lg');
 
         assert.equal($modals.length, 2,
             'There should be two modals');
@@ -351,7 +351,7 @@ QUnit.module('Views', {
 
         $second_modal.find('.o_select_button').click();
 
-        $modal = $('.modal-dialog.modal-lg');
+        $modal = $('.modal-lg');
 
         assert.equal($modal.length, 1,
             'There should be one modal');
diff --git a/addons/web/static/tests/widgets/data_export_tests.js b/addons/web/static/tests/widgets/data_export_tests.js
index 4569a5a6290d..4948db074744 100644
--- a/addons/web/static/tests/widgets/data_export_tests.js
+++ b/addons/web/static/tests/widgets/data_export_tests.js
@@ -107,15 +107,15 @@ QUnit.module('widgets', {
         list.$('thead th.o_list_record_selector input').click();
         list.sidebar.$('a:contains(Export)').click();
 
-        assert.strictEqual($('.modal').length, 1, "a modal dialog should be open");
+        assert.strictEqual($('[role="dialog"]').length, 1, "a modal dialog should be open");
         assert.strictEqual($('span.o_tree_column:contains(Activities)').length, 1,
             "the Activities field should be in the list of exportable fields");
 
         // select the field Description, click on add, then export and close
-        $('.modal span:contains(Description)').click();
-        $('.modal .o_add_field').click();
-        $('.modal span:contains(Export To File)').click();
-        $('.modal span:contains(Close)').click();
+        $('[role="dialog"] span:contains(Description)').click();
+        $('[role="dialog"] .o_add_field').click();
+        $('[role="dialog"] span:contains(Export To File)').click();
+        $('[role="dialog"] span:contains(Close)').click();
 
         list.destroy();
         framework.blockUI = blockUI;
@@ -185,26 +185,26 @@ QUnit.module('widgets', {
         // Open the export modal
         list.$('thead th.o_list_record_selector input').click();
         list.sidebar.$('a:contains(Export)').click();
-        assert.strictEqual($('.modal').length, 1,
+        assert.strictEqual($('[role="dialog"]').length, 1,
             "a modal dialog should be open");
 
         // Select 'Activities' in fields to export
-        assert.strictEqual($('.modal select.o_fields_list option').length, 0,
+        assert.strictEqual($('[role="dialog"] select.o_fields_list option').length, 0,
             "the fields list should be empty");
-        $('.modal .o_export_tree_item:contains(Activities)').click();
-        $('.modal button:contains(Add)').click();
-        assert.strictEqual($('.modal select.o_fields_list option').length, 1,
+        $('[role="dialog"] .o_export_tree_item:contains(Activities)').click();
+        $('[role="dialog"] button:contains(Add)').click();
+        assert.strictEqual($('[role="dialog"] select.o_fields_list option').length, 1,
             "there should be one item in the fields list");
 
         // Save fields list
-        $('.modal a:contains(Save fields list)').click();
-        $('.modal .o_save_list > input').val('fields list').trigger('input');
-        $('.modal .o_save_list > button').click();
+        $('[role="dialog"] a:contains(Save fields list)').click();
+        $('[role="dialog"] .o_save_list > input').val('fields list').trigger('input');
+        $('[role="dialog"] .o_save_list > button').click();
         assert.verifySteps(['build_search_data', 'create'],
             "create should have been called");
 
         // Close the modal and destroy list
-        $('.modal button span:contains(Close)').click();
+        $('[role="dialog"] button span:contains(Close)').click();
         list.destroy();
 
         // restore create function
diff --git a/addons/web/views/database_manager.html b/addons/web/views/database_manager.html
index 11037f13d258..789105fc9a8f 100644
--- a/addons/web/views/database_manager.html
+++ b/addons/web/views/database_manager.html
@@ -5,6 +5,7 @@
   <title>Odoo</title>
   <link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon">
   <link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css">
+  <link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome-suffix.css">
   <link rel="stylesheet" href="/web/static/lib/bootstrap/css/bootstrap.css">
   <script src="/web/static/lib/jquery/jquery.js" type="text/javascript"></script>
   <script src="/web/static/lib/bootstrap/js/modal.js"></script>
diff --git a/addons/web/views/report_templates.xml b/addons/web/views/report_templates.xml
index 5c08be5df9fe..10d79c49c3f9 100644
--- a/addons/web/views/report_templates.xml
+++ b/addons/web/views/report_templates.xml
@@ -18,6 +18,7 @@
         <link href="https://fonts.googleapis.com/css?family=Work+Sans:thin,light,regular,medium,bold,semi-bold" rel="stylesheet"/>
 
         <link href="/web/static/lib/fontawesome/css/font-awesome.css" rel="stylesheet" type="text/css"/>
+        <link href="/web/static/lib/fontawesome/css/font-awesome-suffix.css" rel="stylesheet" type="text/css"/>
 
 
         <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/report.scss"/>
@@ -152,7 +153,7 @@
             <div class="pull-right">
                 <h3 class="mt0 text-right" t-field="company.report_header"/>
             </div>
-            <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)" class="pull-left"/>
+            <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)" class="pull-left" alt="Logo"/>
             <div class="pull-left company_address">
                 <div>
                     <strong t-field="company.partner_id.name"/>
@@ -170,10 +171,10 @@
         <div class="footer o_background_footer">
             <div class="text-center">
                 <ul class="list-inline">
-                    <li t-if="company.phone"><i class="fa fa-phone"/> <span t-field="company.phone"/></li>
-                    <li t-if="company.email"><i class="fa fa-at"/> <span t-field="company.email"/></li>
-                    <li t-if="company.website"><i class="fa fa-globe"/> <span t-field="company.website"/></li>
-                    <li t-if="company.vat"><i class="fa fa-building-o"/><t t-esc="company.country_id.vat_label or 'TIN'"/>: <span t-field="company.vat"/></li>
+                    <li t-if="company.phone"><i class="fa fa-phone" role="img" aria-label="Phone" title="Phone"/> <span t-field="company.phone"/></li>
+                    <li t-if="company.email"><i class="fa fa-at" role="img" aria-label="Email" title="Email"/> <span t-field="company.email"/></li>
+                    <li t-if="company.website"><i class="fa fa-globe" role="img" aria-label="Website" title="Website"/> <span t-field="company.website"/></li>
+                    <li t-if="company.vat"><i class="fa fa-building-o" role="img" aria-label="Fiscal number"/><t t-esc="company.country_id.vat_label or 'TIN'"/>: <span t-field="company.vat"/></li>
                 </ul>
                 <div t-field="company.report_footer"/>
                 <div t-if="not type_html" class="text-muted">
@@ -190,7 +191,7 @@
         <div class="header o_boxed_header">
             <div class="row mb8">
                 <div class="col-xs-6">
-                    <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)"/>
+                    <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)" alt="Logo"/>
                 </div>
                 <div class="col-xs-6 text-right mb4">
                     <h4 class="mt0" t-field="company.report_header"/>
@@ -226,7 +227,7 @@
         <div class="header o_clean_header">
             <div class="row">
                 <div class="col-xs-6">
-                    <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)"/>
+                    <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)" alt="Logo"/>
                 </div>
                 <div class="col-xs-5 col-xs-offset-1" name="company_address">
                     <ul class="list-unstyled">
@@ -269,7 +270,7 @@
         <div class="header">
             <div class="row">
                 <div class="col-xs-3 mb4">
-                    <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)" style="max-height: 45px;"/>
+                    <img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % to_text(company.logo)" style="max-height: 45px;" alt="Logo"/>
                 </div>
                 <div class="col-xs-9 text-right" style="margin-top:22px;" t-field="company.report_header" name="moto"/>
             </div>
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index ea0fb57a38d7..de81593b37a8 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -39,6 +39,7 @@
 
         <link rel="stylesheet" type="text/css" href="/web/static/lib/jquery.ui/jquery-ui.css"/>
         <link rel="stylesheet" type="text/css" href="/web/static/lib/fontawesome/css/font-awesome.css"/>
+        <link rel="stylesheet" type="text/css" href="/web/static/lib/fontawesome/css/font-awesome-suffix.css"/>
         <link rel="stylesheet" type="text/scss" href="/web/static/lib/bootstrap-datetimepicker/src/scss/_bootstrap-datetimepicker.scss"/>
         <link rel="stylesheet" type="text/css" href="/web/static/lib/select2/select2.css"/>
         <link rel="stylesheet" type="text/css" href="/web/static/lib/select2-bootstrap-css/select2-bootstrap.css"/>
@@ -331,7 +332,7 @@
             <div class="row">
                 <div class="col-md-6 col-md-offset-3 o_database_list">
                     <div class="text-center">
-                        <img t-attf-src="/web/binary/company_logo{{ '?dbname='+db if db else '' }}"/>
+                        <img t-attf-src="/web/binary/company_logo{{ '?dbname='+db if db else '' }}" alt="Logo"/>
                     </div>
                     <t t-raw="0"/>
                     <div class="text-center" t-if="not disable_footer">
@@ -355,7 +356,7 @@
                     <div class="input-group">
                         <input type="text" name="db" t-att-value="request.db" id="db" class="form-control" required="required" readonly="readonly"/>
                         <span class="input-group-btn">
-                          <a href="/web/database/selector" class="btn btn-default">Select <i class="fa fa-database"></i></a>
+                          <a role="button" href="/web/database/selector" class="btn btn-default">Select <i class="fa fa-database" role="img" aria-label="Database" title="Database"></i></a>
                         </span>
                     </div>
                 </div>
@@ -370,10 +371,10 @@
                     <input type="password" name="password" id="password" class="form-control" required="required" autocomplete="current-password" t-att-autofocus="'autofocus' if login else None" maxlength="4096"/>
                 </div>
 
-                <p class="alert alert-danger" t-if="error">
+                <p class="alert alert-danger" t-if="error" role="alert">
                     <t t-esc="error"/>
                 </p>
-                <p class="alert alert-success" t-if="message">
+                <p class="alert alert-success" t-if="message" role="status">
                     <t t-esc="message"/>
                 </p>
 
@@ -386,13 +387,13 @@
     </template>
 
     <template id="web.menu">
-        <ul class="nav navbar-nav navbar-left oe_application_menu_placeholder" style="display: none;">
+        <ul class="nav navbar-nav navbar-left oe_application_menu_placeholder" style="display: none;" role="menu">
             <li t-foreach="menu_data['children']" t-as="menu">
                 <t t-call="web.menu_link"/>
             </li>
             <li id="menu_more_container" class="dropdown" style="display: none;">
-                <a href="#" class="dropdown-toggle" data-toggle="dropdown">More <b class="caret"></b></a>
-                <ul id="menu_more" class="dropdown-menu"></ul>
+                <a role="menuitem" aria-haspopup="true" href="#" class="dropdown-toggle" data-toggle="dropdown" id="more_menu_button">More <b class="caret"></b></a>
+                <ul id="menu_more" class="dropdown-menu" role="menu"></ul>
             </li>
         </ul>
 
@@ -402,7 +403,7 @@
     <template id="web.menu_secondary">
         <a class="o_sub_menu_logo" t-att-href="'/web/?debug' if debug else '/web'">
             <span class="oe_logo_edit">Edit Company data</span>
-            <img src='/web/binary/company_logo'/>
+            <img src='/web/binary/company_logo' alt="Logo"/>
         </a>
         <div class="o_sub_menu_content">
             <t t-foreach="menu_data['children']" t-as="menu">
@@ -432,6 +433,7 @@
     <template id="web.menu_link">
         <t t-set="debug_param" t-value="'?&amp;debug=' if debug else ''"/>
         <a t-att-href="'/web%s#menu_id=%s&amp;action=%s' % (debug_param, menu['id'], menu['action'] and menu['action'].split(',')[1] or '')"
+            role="menuitem"
             t-att-class="'oe_menu_toggler' if menu.get('children') else 'oe_menu_leaf'"
             t-att-data-menu="menu['id']"
             t-att-data-menu-xmlid="menu.get('xmlid')"
@@ -690,23 +692,25 @@
             <t t-set="head" t-value="head_web + (head or '')"/>
             <t t-set="body_classname" t-value="'o_web_client'"/>
 
-            <nav id="oe_main_menu_navbar" class="navbar navbar-inverse" groups="base.group_user,base.group_portal">
-                <div class="navbar-header">
-                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
-                        <span class="icon-bar"></span>
-                        <span class="icon-bar"></span>
-                        <span class="icon-bar"></span>
-                    </button>
-                </div>
-                <div class="navbar-collapse collapse">
-                    <t t-call="web.menu"/>
-                </div>
-            </nav>
+            <header id="oe_main_menu_navbar">
+                <nav class="navbar navbar-inverse" groups="base.group_user,base.group_portal">
+                    <div class="navbar-header">
+                        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
+                            <span class="icon-bar"></span>
+                            <span class="icon-bar"></span>
+                            <span class="icon-bar"></span>
+                        </button>
+                    </div>
+                    <div class="navbar-collapse collapse">
+                        <t t-call="web.menu"/>
+                    </div>
+                </nav>
+            </header>
             <div class="o_main">
-                <div class="o_sub_menu" groups="base.group_user,base.group_portal">
+                <aside class="o_sub_menu" groups="base.group_user,base.group_portal" aria-label="Submenu">
                     <t t-call="web.menu_secondary"/>
-                </div>
-                <div class="o_main_content"/>
+                </aside>
+                <main class="o_main_content"/>
             </div>
         </t>
     </template>
diff --git a/addons/web_diagram/static/tests/diagram_tests.js b/addons/web_diagram/static/tests/diagram_tests.js
index 8d453f8be1ad..41c0ed4d32c3 100644
--- a/addons/web_diagram/static/tests/diagram_tests.js
+++ b/addons/web_diagram/static/tests/diagram_tests.js
@@ -152,9 +152,9 @@ QUnit.module('Views', {
                 "diagram should only have the default nodes at start");
 
             diagram.$buttons.find('.o_diagram_new_button').click();
-            $('.modal .modal-body input:first').val('a new node').trigger('input');
-            $('.modal .modal-body input:last').val(1).trigger('input');
-            $('.modal .modal-footer button.btn-primary').click();  // save
+            $('main.modal-body input:first').val('a new node').trigger('input');
+            $('main.modal-body input:last').val(1).trigger('input');
+            $('footer.modal-footer button.btn-primary').click();  // save
 
             assert.strictEqual(diagram.$('.o_diagram ellipse').length, 3,
                 "diagram should contain 3 'ellipse' nodes now (nodes 2, 3 and the new one)");
@@ -184,8 +184,8 @@ QUnit.module('Views', {
                 "diagram first node should have default name at first");
 
             CuteNode.double_click_callback({id: 1});
-            $('.modal .modal-body input:first').val('An edited node').trigger('input');
-            $('.modal .modal-footer button.btn-primary').click();  // save
+            $('main.modal-body input:first').val('An edited node').trigger('input');
+            $('footer.modal-footer button.btn-primary').click();  // save
 
             assert.strictEqual(diagram.$('text').first().text(), 'An edited node',
                 "diagram first node should now have new name");
@@ -212,7 +212,7 @@ QUnit.module('Views', {
                 "diagram should contain 2 'ellipse' nodes (nodes 2 and 3)");
 
             CuteNode.destruction_callback({id: 2});
-            $('.modal .modal-footer button.btn-primary').click();  // Confirm
+            $('footer.modal-footer button.btn-primary').click();  // Confirm
 
             assert.strictEqual(diagram.$('.o_diagram ellipse').length, 1,
                 "diagram should contain 1 'ellipse' nodes (node 2)");
@@ -245,8 +245,8 @@ QUnit.module('Views', {
                 get_start: function () {return {id: 1};},
                 get_end: function () {return {id: 3};},
             });
-            $('.modal .modal-body input:first').val('a transition from 1 to 3').trigger('input');
-            $('.modal .modal-footer button.btn-primary').click();  // Confirm
+            $('main.modal-body input:first').val('a transition from 1 to 3').trigger('input');
+            $('footer.modal-footer button.btn-primary').click();  // Confirm
 
             assert.strictEqual(diagram.$('.o_diagram path').length, 5,
                 "diagram should contain 4 'path' nodes (#raphael-marker-block, transitions 1, 2, 3, and the new one)");
@@ -278,8 +278,8 @@ QUnit.module('Views', {
                 "diagram should only have the default edges at start");
 
             CuteEdge.double_click_callback({id: 1});
-            $('.modal .modal-body input:first').val('An edited edge').trigger('input');
-            $('.modal .modal-footer button.btn-primary').click();  // save
+            $('main.modal-body input:first').val('An edited edge').trigger('input');
+            $('footer.modal-footer button.btn-primary').click();  // save
 
             assert.strictEqual(diagram.$('text:contains(a transition from 1 to 2)').length, 0,
                 "diagram edge should not have default name anymore");
@@ -310,7 +310,7 @@ QUnit.module('Views', {
                 "diagram edge should have default name at start");
 
             CuteEdge.destruction_callback({id: 3});
-            $('.modal .modal-footer button.btn-primary').click();  // Confirm
+            $('footer.modal-footer button.btn-primary').click();  // Confirm
 
             assert.strictEqual(diagram.$('.o_diagram path').length, 3,
                 "diagram should contain 3 'path' nodes (#raphael-marker-block, and transitions 1 and 2)");
diff --git a/addons/web_editor/static/lib/summernote/src/js/Renderer.js b/addons/web_editor/static/lib/summernote/src/js/Renderer.js
index 2c2c8f4ac00b..c6142333d30b 100644
--- a/addons/web_editor/static/lib/summernote/src/js/Renderer.js
+++ b/addons/web_editor/static/lib/summernote/src/js/Renderer.js
@@ -94,18 +94,18 @@ define([
      * @param {String} [footer='']
      */
     var tplDialog = function (className, title, body, footer) {
-      return '<div class="' + className + ' modal" aria-hidden="false">' +
+      return '<div class="' + className + ' modal" role="dialog" aria-hidden="false">' +
                '<div class="modal-dialog">' +
                  '<div class="modal-content">' +
                    (title ?
-                   '<div class="modal-header">' +
+                   '<header class="modal-header">' +
                      '<button type="button" class="close" aria-hidden="true" tabindex="-1">&times;</button>' +
                      '<h4 class="modal-title">' + title + '</h4>' +
-                   '</div>' : ''
+                   '</header>' : ''
                    ) +
-                   '<div class="modal-body">' + body + '</div>' +
+                   '<main class="modal-body">' + body + '</main>' +
                    (footer ?
-                   '<div class="modal-footer">' + footer + '</div>' : ''
+                   '<header class="modal-footer">' + footer + '</header>' : ''
                    ) +
                  '</div>' +
                '</div>' +
@@ -817,7 +817,7 @@ define([
       $dialog.addClass('note-air-layout');
       $dialog.attr('id', 'note-dialog-' + id);
       $dialog.find('button.close, a.modal-close').click(function () {
-        $(this).closest('.modal').modal('hide');
+        $(this).closest('[role="dialog"]').modal('hide');
       });
       $dialog.appendTo($container);
     };
@@ -905,7 +905,7 @@ define([
       var $dialogContainer = options.dialogsInBody ? $(document.body) : $editor;
       var $dialog = $(tplDialogs(langInfo, options)).prependTo($dialogContainer);
       $dialog.find('button.close, a.modal-close').click(function () {
-        $(this).closest('.modal').modal('hide');
+        $(this).closest('[role="dialog"]').modal('hide');
       });
 
       //09. Editor/Holder switch
diff --git a/addons/web_editor/static/src/js/backend/fields.js b/addons/web_editor/static/src/js/backend/fields.js
index a636b7e5be3b..00c84c5fe921 100644
--- a/addons/web_editor/static/src/js/backend/fields.js
+++ b/addons/web_editor/static/src/js/backend/fields.js
@@ -400,7 +400,7 @@ var FieldTextHtml = AbstractField.extend({
         return src;
     },
     old_initialize_content: function () {
-        this.$el.closest('.modal-body').css('max-height', 'none');
+        this.$el.closest('main.modal-body').css('max-height', 'none');
         this.$iframe = this.$el.find('iframe');
         this.document = null;
         this.$body = $();
diff --git a/addons/web_editor/static/src/js/tours/rte.js b/addons/web_editor/static/src/js/tours/rte.js
index 6d865116ec25..6d686353cfb0 100644
--- a/addons/web_editor/static/src/js/tours/rte.js
+++ b/addons/web_editor/static/src/js/tours/rte.js
@@ -157,7 +157,7 @@ tour.register('rte', {
     trigger: '#editor-media-icon.active span.fa:first',
 }, {
     content: "save pictogram",
-    trigger: '.modal-footer > .btn-primary',
+    trigger: 'footer.modal-footer .btn-primary',
     extra_trigger: '#editor-media-icon.active span.o_selected',
 }, {
     content: "select a size for the pictogram",
@@ -180,8 +180,8 @@ tour.register('rte', {
     extra_trigger: 'a#link-preview:containsRegex(/^<span [^>]+><\\/span>$/) > span.fa.fa-3x.pull-right',
 }, {
     content: "save link",
-    trigger: '.modal-footer > .btn-primary',
-    extra_trigger: 'a#link-preview.btn.btn-success:containsRegex(/^<span [^>]+><\\/span>$/) > span.fa.fa-3x.pull-right',
+    trigger: 'footer.modal-footer .btn-primary',
+    extra_trigger: 'a#link-preview.btn.btn-success span.fa.fa-3x.pull-right',
 }, {
     content: "click on other picture",
     trigger: '#editable_area > section .row > div:last img',
@@ -200,7 +200,7 @@ tour.register('rte', {
     extra_trigger: 'a#link-preview:containsRegex(/^<img [^>]+>$/) img',
 }, {
     content: "save link",
-    trigger: '.modal-footer > .btn-primary',
+    trigger: 'footer.modal-footer .btn-primary',
     extra_trigger: 'a#link-preview.btn.btn-success[href="mailto:test@test.test"]:containsRegex(/^<img [^>]+>$/) img',
 }, {
     content: "select for triple enter then double backspace",
diff --git a/addons/web_editor/static/src/js/widgets/widgets.js b/addons/web_editor/static/src/js/widgets/widgets.js
index d0df042fa827..8ff47ba2c5ab 100644
--- a/addons/web_editor/static/src/js/widgets/widgets.js
+++ b/addons/web_editor/static/src/js/widgets/widgets.js
@@ -1166,7 +1166,7 @@ var MediaDialog = Dialog.extend({
         var self = this;
         var defs = [this._super.apply(this, arguments)];
         this.$modal.addClass('note-image-dialog');
-        this.$modal.find('.modal-dialog').addClass('o_select_media_dialog');
+        this.$modal.find('[role="dialog"]').addClass('o_select_media_dialog');
 
         if (this.imageDialog) {
             defs.push(this.imageDialog.appendTo(this.$("#editor-media-image")));
diff --git a/addons/web_editor/static/src/xml/ace.xml b/addons/web_editor/static/src/xml/ace.xml
index 6687d65645d7..a9cd23cbaaff 100644
--- a/addons/web_editor/static/src/xml/ace.xml
+++ b/addons/web_editor/static/src/xml/ace.xml
@@ -7,8 +7,8 @@
             <div class="btn-group o_ace_type_switcher">
                 <button type="button" class="btn btn-sm btn-info dropdown-toggle" data-toggle="dropdown">XML (HTML)</button>
                 <ul class="dropdown-menu" role="menu">
-                    <li><a href="#" class="o_ace_type_switcher_choice" data-type="xml">XML (HTML)</a></li>
-                    <li><a href="#" class="o_ace_type_switcher_choice" data-type="scss">SCSS (CSS)</a></li>
+                    <li><a role="menuitem" href="#" class="o_ace_type_switcher_choice" data-type="xml">XML (HTML)</a></li>
+                    <li><a role="menuitem" href="#" class="o_ace_type_switcher_choice" data-type="scss">SCSS (CSS)</a></li>
                 </ul>
             </div>
             <select id="ace-view-list" class="o_res_list"/>
@@ -33,7 +33,7 @@
         <div id="ace-view-id">
             <span/>
             <div class="pull-right">
-                <button data-action="reset" type="button" class="btn btn-xs btn-danger"><i class="fa fa-undo"/> Reset</button>
+                <button data-action="reset" type="button" class="btn btn-xs btn-danger" icon="fa-undo" string="Reset"></button>
                 <button data-action="format" type="button" class="btn btn-xs btn-link">Format</button>
             </div>
         </div>
diff --git a/addons/web_editor/static/src/xml/backend.xml b/addons/web_editor/static/src/xml/backend.xml
index 082efdbc5a02..40be4f05d07c 100644
--- a/addons/web_editor/static/src/xml/backend.xml
+++ b/addons/web_editor/static/src/xml/backend.xml
@@ -9,7 +9,7 @@
 
     <t t-name="web_editor.FieldTextHtml.button.translate">
         <div class="btn-group pull-right">
-            <button t-if="widget.field.translate" class="o_field_translate btn btn-default btn-sm btn-small" style="height: 24px; padding: 1px 17px 0px 5px">
+            <button t-if="widget.field.translate" class="o_field_translate btn btn-default btn-sm btn-small" style="height: 24px; padding: 1px 17px 0px 5px" aria-label="Translate" title="Translate">
                 <span class="fa fa-language fa-lg oe_input_icon"/>
             </button>
         </div>
@@ -18,7 +18,7 @@
     <t t-name="web_editor.FieldTextHtml.fullscreen">
         <span style="margin: 5px; position: fixed; top: 0; right: 0; z-index: 2000;">
             <button class="o_fullscreen btn btn-primary" style="width: 24px; height: 24px; background-color: #337ab7; border: 1px solid #2e6da4; border-radius: 4px; padding: 0; position: relative;">
-                <img src="/web_editor/font_to_img/61541/rgb(255,255,255)/16" style="position: absolute; top: 3px; left: 4px;"/>
+                <img src="/web_editor/font_to_img/61541/rgb(255,255,255)/16" style="position: absolute; top: 3px; left: 4px;" alt="Fullscreen"/>
             </button>
         </span>
     </t>
diff --git a/addons/web_editor/static/src/xml/editor.xml b/addons/web_editor/static/src/xml/editor.xml
index 9821ceb38bdd..e0626801e683 100644
--- a/addons/web_editor/static/src/xml/editor.xml
+++ b/addons/web_editor/static/src/xml/editor.xml
@@ -9,8 +9,8 @@
         <div id="web_editor-top-edit">
             <div id="web_editor-toolbars"/>
             <form class="navbar-form text-muted">
-                <button type="button" class="btn btn-sm btn-default" data-action="cancel"><i class="fa fa-times"/> Discard</button>
-                <button type="button" class="btn btn-sm btn-primary" data-action="save"><i class="fa fa-floppy-o"/> Save</button>
+                <button type="button" class="btn btn-sm btn-default fa fa-times" data-action="cancel">Discard</button>
+                <button type="button" class="btn btn-sm btn-primary fa fa-floppy-o" data-action="save">Save</button>
             </form>
         </div>
     </t>
@@ -46,34 +46,34 @@
 
     <!-- Media Dialog (allows to choose an img/pictogram/video) -->
     <div t-name="web_editor.dialog.media">
-        <ul class="nav nav-tabs">
-            <li class="active"><a href="#editor-media-image" data-toggle="tab" t-att-class="widget.noImages ? 'hidden' : ''">Image</a></li>
-            <li><a href="#editor-media-document" data-toggle="tab" t-att-class="widget.noDocuments ? 'hidden' : ''">Document</a></li>
-            <li><a href="#editor-media-icon" data-toggle="tab" t-att-class="widget.noIcons ? 'hidden' : ''">Pictogram</a></li>
-            <li><a href="#editor-media-video" data-toggle="tab" t-att-class="widget.noVideos ? 'hidden' : ''">Video</a></li>
+        <ul class="nav nav-tabs" role="tablist">
+            <li class="active"><a role="tab" href="#editor-media-image" aria-controls="editor-media-image" data-toggle="tab" t-att-class="widget.noImages ? 'hidden' : ''">Image</a></li>
+            <li><a role="tab" href="#editor-media-document" aria-controls="editor-media-document" data-toggle="tab" t-att-class="widget.noDocuments ? 'hidden' : ''">Document</a></li>
+            <li><a role="tab" href="#editor-media-icon" aria-controls="editor-media-icon" data-toggle="tab" t-att-class="widget.noIcons ? 'hidden' : ''">Pictogram</a></li>
+            <li><a role="tab" href="#editor-media-video" aria-controls="editor-media-video" data-toggle="tab" t-att-class="widget.noVideos ? 'hidden' : ''">Video</a></li>
             <li class="search pull-right">
                 <ul class="pager mb0 mt0">
                     <li class="previous">
-                        <a class="btn btn-default disabled" href="#"><i class="fa fa-angle-left"/>&#32;Previous</a>
+                        <a role="button" class="btn btn-default disabled" href="#"><span class="fa fa-angle-left">&#32;Previous</span></a>
                     </li>
                     <li class="next">
-                        <a class="btn btn-default disabled" href="#">Next&#32;<i class="fa fa-angle-right"/></a>
+                        <a role="button" class="btn btn-default disabled" href="#"><span class="fa fa-suffix-angle-right">Next&#32;</span></a>
                     </li>
                 </ul>
             </li>
             <li class="search pull-right">
                 <div class="form-group">
                     <input class="form-control" id="icon-search" type="search"/>
-                    <span class="fa fa-search"/>
+                    <span class="fa fa-search" title="Search" role="img" aria-label="Search"/>
                 </div>
             </li>
         </ul>
         <!-- Tab panes -->
         <div class="tab-content">
-            <div class="tab-pane fade in active" id="editor-media-image"/>
-            <div class="tab-pane fade" id="editor-media-document"/>
-            <div class="tab-pane fade" id="editor-media-icon"/>
-            <div class="tab-pane fade" id="editor-media-video"/>
+            <div role="tabpanel" class="tab-pane fade in active" id="editor-media-image"/>
+            <div role="tabpanel" class="tab-pane fade" id="editor-media-document"/>
+            <div role="tabpanel" class="tab-pane fade" id="editor-media-icon"/>
+            <div role="tabpanel" class="tab-pane fade" id="editor-media-video"/>
         </div>
     </div>
 
@@ -100,7 +100,7 @@
                         </button>
                         <ul class="dropdown-menu" role="menu">
                             <li>
-                                <a class="o_upload_image_button_no_optimization">Upload image without optimization</a>
+                                <a role="menuitem" class="o_upload_image_button_no_optimization">Upload image without optimization</a>
                             </li>
                         </ul>
                     </div>
@@ -122,20 +122,20 @@
         </form>
     </t>
     <t t-name="web_editor.dialog.image.existing">
-        <div class="modal" tabindex="-1" role="dialog" aria-hidden="true">
+        <div role="dialog" class="modal" tabindex="-1">
             <div class="modal-dialog select-image">
                 <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <header class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                         <h3 class="modal-title">Select a Picture</h3>
-                    </div>
-                    <div class="modal-body has-error">
+                    </header>
+                    <main class="modal-body has-error">
                         <div class="existing-attachments"/>
                         <div class="help-block"/>
-                    </div>
-                    <div class="modal-footer">
-                        <a data-dismiss="modal" href="#" aria-hidden="true">Discard</a>
-                    </div>
+                    </main>
+                    <footer class="modal-footer">
+                        <a data-dismiss="modal" href="#" aria-label="Discard">Discard</a>
+                    </footer>
                 </div>
             </div>
         </div>
@@ -144,9 +144,9 @@
         <div class="existing-attachments">
             <div class="row mt16" t-as="row" t-foreach="rows">
                 <div class="col-sm-2 o_existing_attachment_cell" t-as="attachment" t-foreach="row">
-                    <i t-if="attachment.res_model === 'ir.ui.view'" class="fa fa-times o_existing_attachment_remove" title="This file is a public view attachment" t-att-data-id="attachment.id"/>
-                    <i t-else="" class="fa fa-times o_existing_attachment_remove" title="This file is attached to the current record" t-att-data-id="attachment.id"/>
-                    <div class="o_attachment_border" t-att-style="attachment.res_model === 'ir.ui.view' ? null : 'border: 1px solid #5cb85c;'"><div t-att-data-src="attachment.src" t-att-data-url="attachment.url" t-att-alt="attachment.name" t-att-title="attachment.name" t-att-data-id="attachment.id" t-att-data-mimetype="attachment.mimetype" class="o_image o_image_loading"/></div>
+                    <i t-if="attachment.res_model === 'ir.ui.view'" class="fa fa-times o_existing_attachment_remove" title="This file is a public view attachment" role="img" aria-label="This file is a public view attachment" t-att-data-id="attachment.id"/>
+                    <i t-else="" class="fa fa-times o_existing_attachment_remove" title="This file is attached to the current record" role="img" aria-label="This file is attached to the current record" t-att-data-id="attachment.id"/>
+                    <div class="o_attachment_border" t-att-style="attachment.res_model === 'ir.ui.view' ? null : 'border: 1px solid #5cb85c;'"><div t-att-data-src="attachment.src" t-att-data-url="attachment.url" role="img" t-att-aria-label="attachment.name" t-att-title="attachment.name" t-att-data-id="attachment.id" t-att-data-mimetype="attachment.mimetype" class="o_image o_image_loading"/></div>
                 </div>
             </div>
         </div>
@@ -180,6 +180,7 @@
             <span t-foreach="data.cssData" t-as="cssData"
                 t-att-data-id="cssData.names[0]"
                 t-att-title="cssData.names[0]"
+                t-att-aria-label="cssData.names[0]" role="img"
                 t-attf-class="font-icons-icon #{data.base} #{cssData.names[0]}"
                 t-att-data-alias="cssData.names.join(',')"/>
         </t>
@@ -192,7 +193,7 @@
                 <div class="form-group" id="o_video_form_group">
                     <label class="mt8" for="o_video_text">Video code <small class="text-muted">(URL or Embed)</small></label>
                     <textarea class="form-control url" id="o_video_text" placeholder="Copy-paste your URL or embed code here"/>
-                    <label class="control-label o_validate_feedback" for="o_video_text"><i class="fa fa-check"/><i class="fa fa-exclamation-triangle"/></label>
+                    <label class="control-label o_validate_feedback" for="o_video_text"><i class="fa fa-check" role="img" aria-label="Checked" title="Checked"/><i class="fa fa-exclamation-triangle" role="img" aria-label="Attention" title="Attention"/></label>
                 </div>
                 <div class="text-right">
                     <small class="text-muted">Accepts <b><i>Youtube</i></b>, <b><i>Instagram</i></b>, <b><i>Vine.co</i></b>, <b><i>Vimeo</i></b>, <b><i>Dailymotion</i></b> and <b><i>Youku</i></b> videos</small>
@@ -265,13 +266,13 @@
                     <label class="control-label col-sm-3">Color</label>
                     <div class="col-sm-9">
                         <div class="o_link_dialog_color">
-                            <label t-attf-class="o_link_dialog_color_item o_btn_preview btn btn-link text-center" data-color="">
+                            <label role="button" t-attf-class="o_link_dialog_color_item o_btn_preview btn btn-link text-center" data-color="">
                                 <span>L</span>
                                 <input class="hidden link-style" name="link_style_color" type="radio" value=""/>
                                 <i class="fa"/>
                             </label>
                             <t t-foreach="['primary', 'default', 'success', 'info', 'warning', 'danger', 'alpha', 'beta', 'gamma', 'delta', 'epsilon']" t-as="color">
-                                <label t-attf-class="o_link_dialog_color_item o_btn_preview btn btn-#{color}">
+                                <label role="button" t-attf-class="o_link_dialog_color_item o_btn_preview btn btn-#{color}" t-attf-aria-label="Color for #{color}" t-attf-title="Color for #{color}">
                                     <input type="radio" name="link_style_color" class="hidden link-style" t-att-value="color"/>
                                     <i class="fa"/>
                                 </label>
@@ -293,7 +294,7 @@
                 <div class="form-group text-center">
                     <label>Preview</label>
                     <div style="overflow: auto; max-width: 100%; max-height: 200px;">
-                        <a href="#" id="link-preview"/>
+                        <a href="#" id="link-preview" aria-label="Preview" title="Preview"/>
                     </div>
                 </div>
             </div>
@@ -302,7 +303,7 @@
 
     <!-- Crop Image Dialog (allows to crop image on the page) -->
     <div t-name="web_editor.dialog.crop_image" class="o_crop_image_dialog">
-        <div t-if="widget.imageData.isExternalImage" class="alert alert-warning text-center">
+        <div t-if="widget.imageData.isExternalImage" class="alert alert-warning text-center" role="alert">
             <i class="fa fa-exclamation-triangle fa-2x"/>
             <h4>This image is an external image</h4>
             <p>
diff --git a/addons/web_editor/static/src/xml/snippets.xml b/addons/web_editor/static/src/xml/snippets.xml
index 594a76159513..3eecae059ad3 100644
--- a/addons/web_editor/static/src/xml/snippets.xml
+++ b/addons/web_editor/static/src/xml/snippets.xml
@@ -10,14 +10,14 @@
             </div>
             <div class="oe_overlay_options" contentEditable="false">
                 <div class="btn-group">
-                    <a href="#" class="btn btn-default btn-sm oe_snippet_parent" title="Select Parent Container"><i class="fa fa-lg fa-level-up"/></a>
+                    <a role="button" href="#" class="btn btn-default btn-sm oe_snippet_parent" title="Select Parent Container" aria-label="Select Parent Container"><i class="fa fa-lg fa-level-up"/></a>
                     <div class="dropdown oe_options hidden btn-group">
-                        <a href="#" data-toggle="dropdown" class="btn btn-primary btn-sm" title="Customize">Customize</a>
+                        <a role="button" href="#" data-toggle="dropdown" class="btn btn-primary btn-sm" title="Customize">Customize</a>
                         <ul class="dropdown-menu" role="menu"/>
                     </div>
-                    <a href="#" class="btn btn-default btn-sm oe_snippet_move" title="Drag to Move"><i class="fa fa-arrows ml4 mr4"></i></a>
-                    <a href="#" class="btn btn-default btn-sm oe_snippet_clone" title="Duplicate Container"><i class="fa fa-files-o ml4 mr4"></i></a>
-                    <a href="#" class="btn btn-default btn-sm oe_snippet_remove" title="Remove Block"><i class="fa fa-trash-o ml4 mr4"></i></a>
+                    <a role="button" href="#" class="btn btn-default btn-sm oe_snippet_move" title="Drag to Move" aria-label="Drag to Move"><i class="fa fa-arrows ml4 mr4"></i></a>
+                    <a role="button" href="#" class="btn btn-default btn-sm oe_snippet_clone" title="Duplicate Container" aria-label="Duplicate Container"><i class="fa fa-files-o ml4 mr4"></i></a>
+                    <a role="button" href="#" class="btn btn-default btn-sm oe_snippet_remove" title="Remove Block" aria-label="Remove Block"><i class="fa fa-trash-o ml4 mr4"></i></a>
                 </div>
             </div>
         </div>
@@ -27,7 +27,7 @@
     <div t-name="web_editor.snippet.option.colorpicker" class="colorpicker">
         <div class="note-palette-title">Background Color</div>
         <div class="btn-group palette-reset">
-            <div class="note-color-reset" data-event="foreColor" data-value="inherit" title="None">
+            <div class="note-color-reset" data-event="foreColor" data-value="inherit" title="None" role="img" aria-label="No color">
                 <i class="fa fa-ban"/>
             </div>
         </div>
@@ -40,16 +40,16 @@
     <!-- t-field options -->
     <t t-name="web_editor.many2one.button">
         <div class="btn-group">
-            <a href="#" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" title="Search Contact"><i class="fa fa-search"></i></a>
+            <a role="button" href="#" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" title="Search Contact" aria-label="Search Contact">><i class="fa fa-search"></i></a>
             <ul class="dropdown-menu contact_menu" role="menu">
-                <li><a><input href="#" type="email" placeholder="Search"/></a></li>
+                <li><a role="menuitem"><input href="#" type="email" placeholder="Search"/></a></li>
             </ul>
         </div>
     </t>
 
     <t t-name="web_editor.many2one.search">
         <t t-foreach="contacts" t-as="item">
-            <li><a href="#" t-att-data-id="item.id" t-att-data-name="item.display_name"><t t-esc="item.display_name"/> <t t-if="item.city or item.country_id"><small class="text-muted">(<t t-esc="item.city"/> <t t-esc="item.country_id and item.country_id[1]"/>)</small></t></a></li>
+            <li><a role="menuitem" href="#" t-att-data-id="item.id" t-att-data-name="item.display_name"><t t-esc="item.display_name"/> <t t-if="item.city or item.country_id"><small class="text-muted">(<t t-esc="item.city"/> <t t-esc="item.country_id and item.country_id[1]"/>)</small></t></a></li>
         </t>
     </t>
 </templates>
diff --git a/addons/web_editor/views/snippets.xml b/addons/web_editor/views/snippets.xml
index 096ea58a2ce1..6dbd57764ab7 100644
--- a/addons/web_editor/views/snippets.xml
+++ b/addons/web_editor/views/snippets.xml
@@ -6,7 +6,7 @@
     <div id="o_scroll">
         <div id="snippet_structure" class="o_panel">
             <div class="o_panel_header">
-                <i class="fa fa-th-large"/> First Panel
+                <span class="fa fa-th-large"> First Panel</span>
             </div>
             <div class="o_panel_body"/>
         </div>
diff --git a/addons/web_settings_dashboard/static/src/xml/dashboard.xml b/addons/web_settings_dashboard/static/src/xml/dashboard.xml
index f7ccf053e8d7..34c564a6af57 100644
--- a/addons/web_settings_dashboard/static/src/xml/dashboard.xml
+++ b/addons/web_settings_dashboard/static/src/xml/dashboard.xml
@@ -24,7 +24,7 @@
 
     <t t-name="DashboardApps">
         <div class="text-center o_web_settings_dashboard_apps">
-            <i class="fa fa-cog fa-4x text-muted o_browse_apps" style="cursor: pointer;"></i>
+            <i class="fa fa-cog fa-4x text-muted o_browse_apps" style="cursor: pointer;" role="img" aria-label="Browse Apps" title="Browse Apps"></i>
             <div class="o_web_settings_dashboard_header">
                 <t t-set="installed_apps" t-value="widget.data.installed_apps"/>
                 <t t-if="installed_apps">
@@ -40,8 +40,8 @@
                 <a class="btn btn-primary btn-block o_browse_apps" role="button"><strong>Browse Apps</strong></a>
             </div>
             <div class="o_web_settings_dashboard_pills">
-                <a href="https://www.odoo.com/apps/modules" target="_blank" class="pull-left"><i class="fa fa-rocket fa-2x text-muted"/> App store</a>
-                <a href="https://www.odoo.com/apps/themes" target="_blank" class="pull-right"><i class="fa fa-picture-o fa-2x text-muted"/> Theme store</a>
+                <a href="https://www.odoo.com/apps/modules" target="_blank" class="pull-left"><span class="fa fa-rocket fa-2x text-muted"> App store</span></a>
+                <a href="https://www.odoo.com/apps/themes" target="_blank" class="pull-right"><span class="fa fa-picture-o fa-2x text-muted"> Theme store</span></a>
             </div>
             <div class="clearfix"/>
         </div>
@@ -52,13 +52,13 @@
             <span class="o_badge_text">
                 <t t-esc='email'/>
             </span>
-            <span class="fa fa-times o_badge_remove" title="Remove Email" role="button"/>
+            <a href="#" class="fa fa-times o_badge_remove" title="Remove Email" aria-label="Remove Email" role="button"/>
         </span>
     </t>
 
     <t t-name="DashboardInvitations">
         <div class="text-center o_web_settings_dashboard_invitations">
-            <i class="fa fa-users fa-4x text-muted o_web_settings_dashboard_access_rights" style="cursor: pointer;"></i>
+            <i class="fa fa-users fa-4x text-muted o_web_settings_dashboard_access_rights" style="cursor: pointer;" role="img" aria-label="Access rights" title="Access rights"></i>
             <div class="o_web_settings_dashboard_header">
                 <t t-set="active_users" t-value="widget.data.active_users"></t>
                 <t t-set="pending_users" t-value="widget.data.pending_users"></t>
@@ -75,7 +75,7 @@
             <div class="o_web_settings_dashboard_invitation_form">
                 <p><strong>Invite new users:</strong></p>
                 <input class="o_user_emails o_input mt8" type="text" placeholder="Enter e-mail addresses"/>
-                <button class="btn btn-primary btn-block o_web_settings_dashboard_invite mt16" role="button" data-loading-text="Inviting..."><strong>Invite</strong></button>
+                <button class="btn btn-primary btn-block o_web_settings_dashboard_invite mt16" data-loading-text="Inviting..."><strong>Invite</strong></button>
             </div>
             <div class="o_web_settings_dashboard_pending_users mt8">
                 <t t-if="pending_users.length">
@@ -94,7 +94,7 @@
 
     <t t-name="DashboardShare">
         <div class="text-center o_web_settings_dashboard_share">
-            <i class="fa fa-share-alt fa-4x text-muted"/>
+            <i class="fa fa-share-alt fa-4x text-muted" role="img" aria-label="Share" title="Share"/>
             <div class="o_web_settings_dashboard_header">Share the Love</div>
             <div>
                 <small class="text-muted text-center o_web_settings_dashboard_compact_subtitle">
@@ -102,9 +102,9 @@
                 </small>
             </div>
             <div class="row mt16">
-                <div class="col-xs-4"><a href="#"><i class="fa fa-twitter-square fa-4x tw_share"/></a></div>
-                <div class="col-xs-4"><a href="#"><i class="fa fa-facebook-square fa-4x fb_share"/></a></div>
-                <div class="col-xs-4"><a href="#"><i class="fa fa-linkedin-square fa-4x li_share"/></a></div>
+                <div class="col-xs-4"><a href="#" aria-label="Twitter" title="Twitter"><i class="fa fa-twitter-square fa-4x tw_share"/></a></div>
+                <div class="col-xs-4"><a href="#" aria-label="Facebook" title="Facebook"><i class="fa fa-facebook-square fa-4x fb_share"/></a></div>
+                <div class="col-xs-4"><a href="#" aria-label="LinkedIn" title="LinkedIn"><i class="fa fa-linkedin-square fa-4x li_share"/></a></div>
             </div>
             <hr/>
             <t t-set="server_version" t-value="widget.data.server_version"/>
@@ -119,7 +119,7 @@
                     </div>
                     <div>
                         <div class="tab-content">
-                            <div id="settings" class="tab-pane active text-muted text-center o_web_settings_dashboard_compact_subtitle">
+                            <div role="tabpanel" id="settings" class="tab-pane active text-muted text-center o_web_settings_dashboard_compact_subtitle">
                                 <small>Copyright © 2004-2016 <a target="_blank" href="https://www.odoo.com" style="text-decoration: underline;">Odoo S.A.</a> <a target="_blank" href="http://www.gnu.org/licenses/lgpl.html" style="text-decoration: underline;">GNU LGPL Licensed</a></small>
                             </div>
                         </div>
@@ -145,7 +145,7 @@
             <div class="text-center o_web_settings_dashboard_enterprise">
                 <div class="text-center o_web_settings_dashboard_header">Odoo Enterprise</div>
                 <div class="mb16"><a href="http://www.odoo.com/editions" target="_blank">Get more features with the Enterprise Edition!</a></div>
-                <div><img class="img img-responsive" t-att-src='_s + "/web/static/src/img/enterprise_upgrade.jpg"'/></div>
+                <div><img class="img img-responsive" t-att-src='_s + "/web/static/src/img/enterprise_upgrade.jpg"' alt="Upgrade to enterprise"/></div>
                 <div>
                     <a class="btn btn-primary btn-block o_confirm_upgrade" role="button"><strong>Upgrade Now</strong></a>
                 </div>
@@ -155,7 +155,7 @@
 
     <t t-name="DashboardTranslations">
         <div class="text-center o_web_settings_dashboard_translations mt8">
-            <i class="fa fa-globe fa-4x text-muted"></i>
+            <i class="fa fa-globe fa-4x text-muted" role="img" aria-label="Translations" title="Translations"></i>
             <div class="o_web_settings_dashboard_header">
                 Translations
             </div>
@@ -165,14 +165,14 @@
                 </small>
             </div>
             <div class="mt16">
-                <a class="btn btn-primary btn-block o_load_translations"><strong>Load a Translation</strong></a>
+                <a role="button" class="btn btn-primary btn-block o_load_translations"><strong>Load a Translation</strong></a>
             </div>
         </div>
     </t>
 
     <t t-name="DashboardCompany">
         <div class="text-center o_web_settings_dashboard_company mt8">
-            <i class="fa fa-suitcase fa-4x text-muted"></i>
+            <i class="fa fa-suitcase fa-4x text-muted" role="img" aria-label="Company" title="Company"></i>
             <div class="o_web_settings_dashboard_header">
                 <t t-esc="widget.data.company_name"></t>
             </div>
@@ -182,7 +182,7 @@
                 </small>
             </div>
             <div class="mt16">
-                <a class="btn btn-primary btn-block o_setup_company"><strong>Set Up</strong></a>
+                <a role="button" class="btn btn-primary btn-block o_setup_company"><strong>Set Up</strong></a>
             </div>
         </div>
     </t>
diff --git a/addons/web_tour/static/src/js/tour_manager.js b/addons/web_tour/static/src/js/tour_manager.js
index 628493a6cb28..c9206d06ec2a 100644
--- a/addons/web_tour/static/src/js/tour_manager.js
+++ b/addons/web_tour/static/src/js/tour_manager.js
@@ -160,7 +160,7 @@ return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, {
     update: function (tour_name) {
         if (this.paused) return;
 
-        this.$modal_displayed = $('.modal:visible').last();
+        this.$modal_displayed = $('[role="dialog"]:visible').last();
 
         tour_name = this.running_tour || tour_name;
         if (tour_name) {
@@ -325,7 +325,14 @@ return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, {
     _set_running_tour_timeout: function (tour_name, step) {
         this._stop_running_tour_timeout();
         this.running_tour_timeout = setTimeout((function() {
-            this._consume_tour(tour_name, _.str.sprintf("Tour %s failed at step %s", tour_name, step.trigger));
+            var message;
+            if (step.extra_trigger) {
+                message = _.str.sprintf('Tour %s failed at step "%s" with trigger "%s" and extra trigger "%s"',
+                    tour_name, step.content, step.trigger, step.extra_trigger);
+            } else {
+                message = _.str.sprintf('Tour %s failed at step "%s" with trigger "%s"', tour_name, step.content, step.trigger);
+            }
+            this._consume_tour(tour_name, message);
         }).bind(this), (step.timeout || RUNNING_TOUR_TIMEOUT) + this.running_step_delay);
     },
     _stop_running_tour_timeout: function () {
@@ -357,11 +364,12 @@ return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, {
     STEPS: {
         MENU_MORE: {
             edition: "community",
-            trigger: "body > nav",
+            trigger: "body > header > nav",
+            content: _t('Click on the <i>More icon</i> to show hidden apps.'),
             position: "bottom",
             auto: true,
             run: function (actions) {
-                actions.auto("#menu_more_container > a");
+                actions.auto("#more_menu_button");
             },
         },
 
diff --git a/addons/web_tour/static/src/xml/debug_manager.xml b/addons/web_tour/static/src/xml/debug_manager.xml
index 5ec3aa9e7482..11c259e9944b 100644
--- a/addons/web_tour/static/src/xml/debug_manager.xml
+++ b/addons/web_tour/static/src/xml/debug_manager.xml
@@ -26,7 +26,7 @@
             <tr t-foreach="tours" t-as="tour">
                 <td><t t-esc="tour"/></td>
                 <td><t t-esc="tours[tour].url"/></td>
-                <td><button type="button" class="btn btn-sm btn-primary fa fa-play o_start_tour" t-att-data-name="tour"/></td>
+                <td><button type="button" class="btn btn-sm btn-primary fa fa-play o_start_tour" t-att-data-name="tour" aria-label="Tour" title="Tour"/></td>
             </tr>
         </table>
     </div>
diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml
index 9ba425ed7e79..b8e493c15054 100644
--- a/addons/website/data/website_data.xml
+++ b/addons/website/data/website_data.xml
@@ -73,7 +73,7 @@
                                       </div>
                                   </div>
                                   <div class="text-center mt64" name="mail_button">
-                                      <a t-attf-href="mailto:{{ res_company.email }}" class="btn btn-primary" id="o_contact_mail">Send us an email</a>
+                                      <a role="button" t-attf-href="mailto:{{ res_company.email }}" class="btn btn-primary" id="o_contact_mail">Send us an email</a>
                                   </div>
                               </div>
                               <div class="col-md-4 mb32">
diff --git a/addons/website/data/website_demo.xml b/addons/website/data/website_demo.xml
index cf4f94537556..dda6c96a3f6d 100644
--- a/addons/website/data/website_demo.xml
+++ b/addons/website/data/website_demo.xml
@@ -97,8 +97,8 @@ response = request.website.render("website.template_partner_post", {'partner': p
                     </div>
                     <div class="form-group">
                         <div class="col-sm-offset-2 col-sm-10">
-                            <button type="submit" class="btn btn-primary">
-                                Send <span class="fa fa-long-arrow-right"/>
+                            <button type="submit" class="btn btn-primary" aria-label="Send">
+                                <span class="fa fa-suffix-long-arrow-right">Send </span>
                             </button>
                         </div>
                     </div>
@@ -151,7 +151,7 @@ response = request.render("website.template_partner_comment", {
                                   <h2>Homepage 0.0.0.0</h2>
                                   <h3>Click to customize this text</h3>
                                   <p>
-                                    <a class="btn btn-success btn-large" href="/contactus">Contact us</a>
+                                    <a role="button" class="btn btn-success btn-large" href="/contactus">Contact us</a>
                                   </p>
                                 </div>
                                 <span class="carousel-img col-md-6 hidden-sm hidden-xs"> </span>
@@ -159,10 +159,10 @@ response = request.render("website.template_partner_comment", {
                             </div>
                           </div>
                         </div>
-                        <div class="carousel-control left hidden" data-slide="prev" data-target="#myCarousel0" href="#myCarousel0" style="width: 10%">
+                        <div class="carousel-control left hidden" data-slide="prev" data-target="#myCarousel0" href="#myCarousel0" style="width: 10%" role="img" aria-label="Previous" title="Previous">
                           <i class="fa fa-chevron-left"/>
                         </div>
-                        <div class="carousel-control right hidden" data-slide="next" data-target="#myCarousel0" href="#myCarousel0" style="width: 10%">
+                        <div class="carousel-control right hidden" data-slide="next" data-target="#myCarousel0" href="#myCarousel0" style="width: 10%" role="img" aria-label="Next" title="Next">
                           <i class="fa fa-chevron-right"/>
                         </div>
                       </div>
@@ -198,7 +198,7 @@ response = request.render("website.template_partner_comment", {
                                       </div>
                                   </div>
                                   <div class="text-center mt64" name="mail_button">
-                                      <a t-attf-href="mailto:{{ res_company.email }}" class="btn btn-primary" id="o_contact_mail">Send us an email</a>
+                                      <a role="button" t-attf-href="mailto:{{ res_company.email }}" class="btn btn-primary" id="o_contact_mail">Send us an email</a>
                                   </div>
                               </div>
                               <div class="col-md-4 mb32">
diff --git a/addons/website/static/src/js/content/snippets.animation.js b/addons/website/static/src/js/content/snippets.animation.js
index 602556c03cc0..7221ee40e6c1 100644
--- a/addons/website/static/src/js/content/snippets.animation.js
+++ b/addons/website/static/src/js/content/snippets.animation.js
@@ -740,7 +740,7 @@ registry.gallery = Animation.extend({
             $(this).siblings().filter('.modal-backdrop').remove(); // bootstrap leaves a modal-backdrop
             $(this).remove();
         });
-        $modal.find('.modal-content, .modal-body.o_slideshow').css('height', '100%');
+        $modal.find('[role="dialog"] .modal-content, main.modal-body.o_slideshow').css('height', '100%');
         $modal.appendTo(document.body);
 
         this.carousel = new registry.gallery_slider($modal.find('.carousel').carousel());
diff --git a/addons/website/static/src/js/menu/mobile_view.js b/addons/website/static/src/js/menu/mobile_view.js
index acfd28042c9e..0969efda7a1a 100644
--- a/addons/website/static/src/js/menu/mobile_view.js
+++ b/addons/website/static/src/js/menu/mobile_view.js
@@ -17,7 +17,7 @@ var MobilePreviewDialog = Dialog.extend({
     start: function () {
         var self = this;
         this.$modal.addClass('oe_mobile_preview');
-        this.$modal.on('click', '.modal-header', function () {
+        this.$modal.on('click', 'header.modal-header', function () {
             self.$el.toggleClass('o_invert_orientation');
         });
         this.$iframe = $('<iframe/>', {
diff --git a/addons/website/static/src/js/tours/rte.js b/addons/website/static/src/js/tours/rte.js
index fb2a0cacea15..cc828154722c 100644
--- a/addons/website/static/src/js/tours/rte.js
+++ b/addons/website/static/src/js/tours/rte.js
@@ -9,15 +9,15 @@ tour.register('rte_translator', {
     wait_for: base.ready(),
 }, [{
     content: "click on Add a language",
-    trigger: '.js_language_selector a:has(i.fa)',
+    trigger: '.js_language_selector a:has(span.fa)',
 }, {
     content: "select french",
     trigger: 'select[name="lang"]',
     run: 'text "fr_BE"',
 }, {
     content: "load french",
-    trigger: '.modal-footer button:first',
-    extra_trigger: '.modal select[name="lang"]:propValueContains(fr_BE)',
+    trigger: 'footer.modal-footer button:first',
+    extra_trigger: '[role="dialog"] select[name="lang"]:propValueContains(fr_BE)',
 }, {
     content : "click language dropdown",
     trigger : '.js_language_selector .dropdown-toggle',
@@ -72,7 +72,7 @@ tour.register('rte_translator', {
     trigger: 'html:not(:has(#wrap p span)) .o_menu_systray a[data-action="translate"]',
 }, {
     content: "close modal",
-    trigger: '.modal-footer .btn-default',
+    trigger: 'footer.modal-footer .btn-default',
 }, {
     content: "check if translation is activate",
     trigger: '[data-oe-translation-id]',
@@ -101,8 +101,8 @@ tour.register('rte_translator', {
     run: 'text test french placeholder',
 }, {
     content: "close modal",
-    trigger: '.modal-footer > .btn-primary',
-    extra_trigger: '.modal input:propValue(test french placeholder)',
+    trigger: 'footer.modal-footer .btn-primary',
+    extra_trigger: '[role="dialog"] input:propValue(test french placeholder)',
 }, {
     content: "save translation",
     trigger: 'button[data-action=save]',
diff --git a/addons/website/static/src/xml/website.backend.xml b/addons/website/static/src/xml/website.backend.xml
index 347402caf576..a5e14c2c0bce 100644
--- a/addons/website/static/src/xml/website.backend.xml
+++ b/addons/website/static/src/xml/website.backend.xml
@@ -90,7 +90,7 @@
     </t>
 
     <t t-name="website.GoToButtons">
-        <a href="/" class="btn btn-primary" title="Go to Website">
+        <a role="button" href="/" class="btn btn-primary" title="Go to Website">
             Go to Website
         </a>
     </t>
diff --git a/addons/website/static/src/xml/website.contentMenu.xml b/addons/website/static/src/xml/website.contentMenu.xml
index 57448d290823..2b98b0d0be7d 100644
--- a/addons/website/static/src/xml/website.contentMenu.xml
+++ b/addons/website/static/src/xml/website.contentMenu.xml
@@ -3,16 +3,16 @@
 <t t-name="website.contentMenu.dialog.submenu">
     <li t-att-data-menu-id="submenu.id">
         <div class="input-group">
-            <span class="input-group-addon fa fa-bars"/>
+            <span class="input-group-addon fa fa-bars" role="img" aria-label="Dropdown menu" title="Dropdown menu"/>
             <span class="form-control">
                 <span class="js_menu_label">
                     <t t-esc="submenu.name"/>
                 </span>
-                <i t-if="submenu.is_homepage" class="pull-right fa fa-home" style="margin-top: 3px"/>
+                <i t-if="submenu.is_homepage" class="pull-right fa fa-home" style="margin-top: 3px" role="img" aria-label="Home" title="Home"/>
             </span>
             <span class="input-group-btn">
-                <button type="button" class="btn btn-primary js_edit_menu fa fa-pencil-square-o"/>
-                <button type="button" class="btn btn-danger js_delete_menu fa fa-trash-o"/>
+                <button type="button" class="btn btn-primary js_edit_menu fa fa-pencil-square-o" aria-label="Edit menu" title="Edit menu"/>
+                <button type="button" class="btn btn-danger js_delete_menu fa fa-trash-o" aria-label="Delete menu" title="Delete menu"/>
             </span>
         </div>
         <t t-set="children" t-value="submenu.children"/>
@@ -46,7 +46,7 @@
             Drag a menu to the right to create a sub-menu
         </small>
         <a href="#" class="js_add_menu">
-            <i class="fa fa-plus-circle"/> Add Menu Entry
+            <span class="fa fa-plus-circle"> Add Menu Entry</span>
         </a>
     </div>
 </div>
diff --git a/addons/website/static/src/xml/website.facebook_page.xml b/addons/website/static/src/xml/website.facebook_page.xml
index cdc0267d69bb..4d362582a7b0 100644
--- a/addons/website/static/src/xml/website.facebook_page.xml
+++ b/addons/website/static/src/xml/website.facebook_page.xml
@@ -50,9 +50,9 @@
         <div class="col-md-6" style="border-left: 1px solid #eeeeee;">
             <div class="form-group text-center">
                 <label>Preview</label>
-                <div class="alert alert-warning hidden facebook_page_warning text-center">
+                <div class="alert alert-warning hidden facebook_page_warning text-center" role="alert">
                     <div>
-                        <i class="fa fa-exclamation-triangle fa-3x" aria-hidden="true"></i>
+                        <i class="fa fa-exclamation-triangle fa-3x" role="img" aria-label="Warning" title="Warning"></i>
                     </div>
                     <h4 class="mb0">Invalid Facebook Page Url</h4>
                     <div>Please enter valid facebook page URL for preview</div>
diff --git a/addons/website/static/src/xml/website.gallery.xml b/addons/website/static/src/xml/website.gallery.xml
index 76bf650e76d7..08226cb911b5 100644
--- a/addons/website/static/src/xml/website.gallery.xml
+++ b/addons/website/static/src/xml/website.gallery.xml
@@ -14,21 +14,21 @@
             <div class="carousel-inner container" style="padding: 0;">
                  <t t-foreach="srcs" t-as="src">
                     <div t-attf-class="item #{src_index == index and 'active' or ''}">
-                        <img t-attf-class="img img-responsive #{userStyle}" t-att-src="src"/>
+                        <img t-attf-class="img img-responsive #{userStyle}" t-att-src="src" alt="Slide image"/>
                     </div>
                  </t>
             </div>
 
             <ul class="carousel-indicators">
-                <li class="fa fa-chevron-left o_indicators_left" style="overflow: hidden; padding: 12px; border: 0;"></li>
+                <li class="fa fa-chevron-left o_indicators_left" style="overflow: hidden; padding: 12px; border: 0;" aria-label="Previous" title="Previous"></li>
                 <t t-foreach="srcs" t-as="src">
                     <li t-attf-data-target="##{id}" t-att-data-slide-to="src_index" t-att-class="src_index == index and 'active'" t-attf-style="background-image: url(#{src})"></li>
                 </t>
-                <li class="fa fa-chevron-right o_indicators_right" style="overflow: hidden; padding: 12px; border: 0;"></li>
+                <li class="fa fa-chevron-right o_indicators_right" style="overflow: hidden; padding: 12px; border: 0;" aria-label="Next" title="Next"></li>
             </ul>
 
-            <a class="carousel-control left" t-attf-href="##{id}" data-slide="prev"><span class="fa fa-chevron-left" /></a>
-            <a class="carousel-control right" t-attf-href="##{id}" data-slide="next"><span class="fa fa-chevron-right" /></a>
+            <a class="carousel-control left" t-attf-href="##{id}" data-slide="prev" aria-label="Previous" title="Previous"><span class="fa fa-chevron-left"/></a>
+            <a class="carousel-control right" t-attf-href="##{id}" data-slide="next" aria-label="Next" title="Next"><span class="fa fa-chevron-right"/></a>
         </div>
     </t>
 
@@ -43,14 +43,14 @@
         ========================================================================
     -->
     <t t-name="website.gallery.slideshow.lightbox">
-        <div class="modal o_technical_modal fade" aria-labbelledby="Image Gallery Dialog" aria-hidden="true">
+        <div role="dialog" class="modal o_technical_modal fade" aria-labbelledby="Image Gallery Dialog">
             <div class="modal-dialog modal-lg" role="Picture Gallery"
                 t-attf-style="min-width: #{dim.min_width}px ; min-height: #{dim.min_height}px ; max-width: #{dim.max_width}px ; max-height: #{dim.max_height}px ; height: #{dim.height}px ;">
                 <div class="modal-content">
-                    <div class="modal-body o_slideshow">
-                        <button type="button" class="close" data-dismiss="modal" style="position: absolute; right: 12px; top: 10px;"><span aria-hidden="true">&amp;times;</span><span class="sr-only">Close</span></button>
+                    <main class="modal-body o_slideshow">
+                        <button type="button" class="close" data-dismiss="modal" style="position: absolute; right: 12px; top: 10px;"><span role="img" aria-label="Close">&amp;times;</span><span class="sr-only">Close</span></button>
                         <t t-call="website.gallery.slideshow"></t>
-                    </div>
+                    </main>
 
                 </div>
             </div>
diff --git a/addons/website/static/src/xml/website.pageProperties.xml b/addons/website/static/src/xml/website.pageProperties.xml
index 098bb5533b50..7ee6b1fb4853 100644
--- a/addons/website/static/src/xml/website.pageProperties.xml
+++ b/addons/website/static/src/xml/website.pageProperties.xml
@@ -40,12 +40,12 @@
 
 <div t-name="website.pagesMenu.page_info" class="o_page_management_info">
     <form class="form-horizontal">
-        <ul class="nav nav-tabs">
-            <li class="active"><a data-toggle="tab" href="#basic_page_info">Name</a></li>
-            <li><a data-toggle="tab" href="#advances_page_info">Publish</a></li>
+        <ul class="nav nav-tabs" role="tablist">
+            <li class="active"><a aria-controls="basic_page_info" data-toggle="tab" href="#basic_page_info" role="tab">Name</a></li>
+            <li><a aria-controls="advances_page_info" data-toggle="tab" href="#advances_page_info" role="tab">Publish</a></li>
         </ul>
         <div class="tab-content mt16">
-            <div id="basic_page_info" class="tab-pane fade in active">
+            <div role="tabpanel" id="basic_page_info" class="tab-pane fade in active">
                 <div class="form-group">
                     <label class="control-label col-sm-3" for="page_name">Page Name</label>
                     <div class="col-sm-9">
@@ -85,7 +85,7 @@
                     </div>
                 </div>
             </div>
-            <div id="advances_page_info" class="tab-pane fade">
+            <div role="tabpanel" id="advances_page_info" class="tab-pane fade">
                 <div class="form-group">
                     <label class="control-label col-sm-3" for="is_menu">Show in Top Menu</label>
                     <div class="col-sm-2">
@@ -111,7 +111,7 @@
                 <div class="form-group">
                     <label class="control-label col-sm-3" for="is_indexed">
                         Indexed
-                        <i class="fa fa-question-circle-o" title="Hide this page from search results" aria-hidden="true"></i>
+                        <i class="fa fa-question-circle-o" title="Hide this page from search results" role="img" aria-label="Info"></i>
                     </label>
                     <div class="col-sm-2">
                         <a>
@@ -126,10 +126,10 @@
                     <label class="control-label col-sm-3" for="is_published">Publish</label>
                     <div class="col-sm-2">
                         <a>
-                            <label class="o_switch js_publish_btn" for="is_published" >
+                            <button class="o_switch js_publish_btn">
                                 <input type="checkbox" t-att-checked="widget.page.website_published ? true : undefined" id="is_published"/>
                                 <span/>
-                            </label>
+                            </button>
                         </a>
                     </div>
                 </div>
@@ -139,7 +139,7 @@
                         <div class='input-group date' id='date_publish_container'>
                             <input type='text' class="form-control" name="date_publish" id="date_publish" />
                             <span class="input-group-addon">
-                                <span class="fa fa-calendar"></span>
+                                <span class="fa fa-calendar" role="img" aria-label="Publish date" title="Publish date"></span>
                             </span>
                         </div>
                     </div>
diff --git a/addons/website/static/src/xml/website.seo.xml b/addons/website/static/src/xml/website.seo.xml
index 7afd4ad32e90..081378725961 100644
--- a/addons/website/static/src/xml/website.seo.xml
+++ b/addons/website/static/src/xml/website.seo.xml
@@ -87,7 +87,7 @@
     </t>
 
     <t t-name="website.seo_tip">
-        <div t-attf-class="alert alert-#{ widget.type }">
+        <div t-attf-class="alert alert-#{ widget.type }" role="alert">
             <t t-raw="widget.message"/>
         </div>
     </t>
diff --git a/addons/website/static/src/xml/website.share.xml b/addons/website/static/src/xml/website.share.xml
index 832dc9698a89..b534f6e9cc7a 100644
--- a/addons/website/static/src/xml/website.share.xml
+++ b/addons/website/static/src/xml/website.share.xml
@@ -4,7 +4,7 @@
         <div class="row clearfix" style='font-size:16px'>
             <div class="col-xs-12 css_editable_mode_hidden">
                 <t t-foreach="medias" t-as="media">
-                    <a style="cursor: pointer" t-attf-class="fa-stack fa-lg share #{media}">
+                    <a style="cursor: pointer" t-attf-class="fa-stack fa-lg share #{media}" t-att-aria-label="media" t-att-title="media">
                         <span class="fa fa-square fa-stack-2x"></span>
                         <span t-attf-class="oe_social_#{media} fa fa-#{media} fa-stack-1x fa-inverse"></span>
                     </a>
diff --git a/addons/website/static/src/xml/website.xml b/addons/website/static/src/xml/website.xml
index bc0425471763..bdd5aa429419 100644
--- a/addons/website/static/src/xml/website.xml
+++ b/addons/website/static/src/xml/website.xml
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <templates id="template" xml:space="preserve">
     <t t-name="website.prompt">
-        <div class="modal o_technical_modal" tabindex="-1" role="dialog" aria-hidden="true">
+        <div role="dialog" class="modal o_technical_modal" tabindex="-1">
                 <div class="modal-dialog">
                 <div class="modal-content">
-                    <div class="modal-header" t-if="window_title">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <header class="modal-header" t-if="window_title">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                         <h3 class="modal-title"><t t-esc="window_title"/></h3>
-                    </div>
-                    <div class="modal-body">
+                    </header>
+                    <main class="modal-body">
                         <form class="form-horizontal" role="form" t-att-id="id">
                             <div class="form-group mb0">
                                 <label for="page-name" class="col-sm-3 control-label">
@@ -21,11 +21,11 @@
                                 </div>
                             </div>
                         </form>
-                    </div>
-                    <div class="modal-footer">
+                    </main>
+                    <footer class="modal-footer">
                         <button type="button" class="btn btn-sm btn-primary btn-continue">Continue</button>
-                        <button type="button" class="btn btn-sm btn-default" data-dismiss="modal" aria-hidden="true">Cancel</button>
-                    </div>
+                        <button type="button" class="btn btn-sm btn-default" data-dismiss="modal" aria-label="Cancel">Cancel</button>
+                    </footer>
                 </div>
             </div>
         </div>
diff --git a/addons/website/views/res_config_settings_views.xml b/addons/website/views/res_config_settings_views.xml
index b2d1e0598c7d..b25ba33a4b8f 100644
--- a/addons/website/views/res_config_settings_views.xml
+++ b/addons/website/views/res_config_settings_views.xml
@@ -15,13 +15,13 @@
                             <div class="row mt16 o_settings_container" id="webmaster_settings">
                                 <div class="col-xs-12 col-md-6 o_setting_box" id="domain_setting">
                                     <div class="o_setting_right_pane">
-                                        <label string="Website Title"/>
+                                        <span class="o_form_label">Website Title</span>
                                         <div class="text-muted">
                                             Name and favicon of your website
                                         </div>
                                         <div class="content-group">
                                             <div class="row mt16">
-                                                <label class="col-md-3 o_light_label" string="Name"/>
+                                                <label class="col-md-3 o_light_label" string="Name" for="website_name"/>
                                                 <field name="website_name"/>
                                             </div>
                                             <div class="row">
@@ -119,7 +119,7 @@
                                             </div>
                                         </div>
                                         <div attrs="{'invisible': [('has_google_maps', '=', False)]}">
-                                            <a class="btn-link fa fa-arrow-right" target="_blank"
+                                            <a role="button" class="btn-link fa fa-arrow-right" target="_blank"
                                                href="https://console.developers.google.com/flows/enableapi?apiid=maps_backend,static_maps_backend&amp;keyType=CLIENT_SIDE&amp;reusekey=true">
                                                 Create a Google Project and Get a Key
                                             </a>
diff --git a/addons/website/views/snippets.xml b/addons/website/views/snippets.xml
index f720fc8e40e6..c65c753ca445 100644
--- a/addons/website/views/snippets.xml
+++ b/addons/website/views/snippets.xml
@@ -27,7 +27,7 @@
                         <div class="carousel-content col-md-4 col-md-offset-1 mt64">
                             <h2>Your Slide Title</h2>
                             <h4>Click to customize this text</h4>
-                            <p><a href="/contactus" class="btn btn-warning btn-large">Contact us</a></p>
+                            <p><a role="button" href="/contactus" class="btn btn-warning btn-large">Contact us</a></p>
                         </div>
                         <div class="carousel-img col-md-6 col-md-offset-1 hidden-sm hidden-xs">
                             <img class="img-responsive" src="/web/image/website.s_banner_default_image" alt="Slider Odoo Image"/>
@@ -36,8 +36,8 @@
                 </div>
             </div>
         </div>
-        <div class="carousel-control left hidden" data-target="#myCarousel" data-slide="prev" style="width: 10%"><i class="fa fa-chevron-left"></i></div>
-        <div class="carousel-control right hidden" data-target="#myCarousel" data-slide="next" style="width: 10%"><i class="fa fa-chevron-right"></i></div>
+        <div class="carousel-control left hidden" data-target="#myCarousel" data-slide="prev" style="width: 10%" role="img" aria-label="Previous" title="Previous"><i class="fa fa-chevron-left"></i></div>
+        <div class="carousel-control right hidden" data-target="#myCarousel" data-slide="next" style="width: 10%" role="img" aria-label="Next" title="Next"><i class="fa fa-chevron-right"></i></div>
     </div>
 </template>
 
@@ -94,7 +94,7 @@
                 <div class="col-md-offset-1 col-md-8">
                     <h1>Sell Online. Easily.</h1>
                     <p>Write one sentence to convince visitor about your message.</p>
-                    <a class="btn btn-warning btn-lg" href="/contactus">Contact us</a>
+                    <a role="button" class="btn btn-warning btn-lg" href="/contactus">Contact us</a>
                 </div>
             </div>
         </div>
@@ -148,21 +148,21 @@
         <div class="container">
             <div class="row">
                 <div class="col-md-4 text-center">
-                    <span class="fa fa-suitcase fa-5x"></span>
+                    <span class="fa fa-suitcase fa-5x" role="img" aria-label="Suitcase" title="Suitcase"></span>
                     <div>
                         <h3 class="mt8 mb0">First Feature</h3>
                         <p class="text-muted">Tell what's the value for the<br/>customer for this feature.</p>
                     </div>
                 </div>
                 <div class="col-md-4 text-center">
-                    <span class="fa fa-lock fa-5x"></span>
+                    <span class="fa fa-lock fa-5x" role="img" aria-label="Lock" title="Lock"></span>
                     <div>
                         <h3 class="mt8 mb0">Second Feature</h3>
                         <p class="text-muted">Write what the customer would like to know,<br/>not what you want to show.</p>
                     </div>
                 </div>
                 <div class="col-md-4 text-center">
-                    <span class="fa fa-heart fa-5x"></span>
+                    <span class="fa fa-heart fa-5x" role="img" aria-label="Heart" title="Heart"></span>
                     <div>
                         <h3 class="mt8 mb0">Third Feature</h3>
                         <p class="text-muted">A small explanation of this great<br/>feature, in clear words.</p>
@@ -274,20 +274,20 @@
     <div class="oe_share s_share">
         <h3>
             <span>Share</span>
-            <a target="_Blank" class="oe_share_facebook" href="https://www.facebook.com/sharer/sharer.php?u={url}"><i class="fa fa-facebook-square"></i></a>
-            <a target="_Blank" class="oe_share_twitter" href="https://twitter.com/intent/tweet?text={title}&amp;url={url}"><i class="fa fa-twitter"></i></a>
-            <a target="_Blank" class="oe_share_linkedin" href="http://www.linkedin.com/shareArticle?mini=true&amp;url={url}&amp;title={title}&amp;"><i class="fa fa-linkedin"></i></a>
-            <a target="_Blank" class="oe_share_google" href="https://plus.google.com/share?url={url}"><i class="fa fa-google-plus-square"></i></a>
-            <a href="mailto:?body={url}&amp;subject={title}"><i class="fa fa-envelope-o"></i></a>
+            <a target="_Blank" class="oe_share_facebook" href="https://www.facebook.com/sharer/sharer.php?u={url}" aria-label="Facebook" title="Facebook"><i class="fa fa-facebook-square"></i></a>
+            <a target="_Blank" class="oe_share_twitter" href="https://twitter.com/intent/tweet?text={title}&amp;url={url}" aria-label="Twitter" title="Twitter"><i class="fa fa-twitter"></i></a>
+            <a target="_Blank" class="oe_share_linkedin" href="http://www.linkedin.com/shareArticle?mini=true&amp;url={url}&amp;title={title}&amp;" aria-label="LinkedIn" title="LinkedIn"><i class="fa fa-linkedin"></i></a>
+            <a target="_Blank" class="oe_share_google" href="https://plus.google.com/share?url={url}" aria-label="Google Plus" title="Google Plus"><i class="fa fa-google-plus-square"></i></a>
+            <a href="mailto:?body={url}&amp;subject={title}" aria-label="Email" title="Email"><i class="fa fa-envelope-o"></i></a>
         </h3>
     </div>
 </template>
 
 <template id="s_facebook_page" name="Facebook Page">
     <div class="o_facebook_page">
-        <div class="o_facebook_alert alert alert-info">
+        <div class="o_facebook_alert alert alert-info" role="status">
             <span class="o_add_facebook_page">
-                <i class="fa fa-plus-circle"/> Add Facebook Page
+                <span class="fa fa-plus-circle"> Add Facebook Page</span>
             </span>
         </div>
     </div>
@@ -296,7 +296,7 @@
 <template id="s_image_gallery" name="Image Gallery">
     <section class="o_gallery o_spc-medium o_slideshow s_image_gallery" data-columns="3" style="height: 500px; overflow: hidden;">
         <div class="container">
-            <div class="alert alert-info css_editable_mode_display text-center" ><span class="o_add_images" style="cursor: pointer;"><i class="fa fa-plus-circle"/> Add Images</span></div>
+            <div class="alert alert-info css_editable_mode_display text-center" role="status"><span class="o_add_images" style="cursor: pointer;"><span class="fa fa-plus-circle"> Add Images</span></span></div>
         </div>
     </section>
 </template>
@@ -328,7 +328,7 @@
                             <p class="text-muted">
                                 <i>Instant setup, satisfied or reimbursed.</i>
                             </p>
-                            <a href="/contactus" class="btn btn-primary btn-lg">Order now</a>
+                            <a role="button" href="/contactus" class="btn btn-primary btn-lg">Order now</a>
                         </div>
                     </div>
                 </div>
@@ -350,7 +350,7 @@
                         </ul>
                         <div class="panel-footer text-center">
                             <p class="text-muted"><i>Instant setup, satisfied or reimbursed.</i></p>
-                            <a href="/contactus" class="btn btn-primary btn-lg">Order now</a>
+                            <a role="button" href="/contactus" class="btn btn-primary btn-lg">Order now</a>
                         </div>
                     </div>
                 </div>
@@ -372,7 +372,7 @@
                         </ul>
                         <div class="panel-footer text-center">
                             <p class="text-muted"><i>Instant setup, satisfied or reimbursed.</i></p>
-                            <a href="/contactus" class="btn btn-primary btn-lg">Contact us</a>
+                            <a role="button" href="/contactus" class="btn btn-primary btn-lg">Contact us</a>
                         </div>
                     </div>
                 </div>
@@ -391,7 +391,7 @@
                 <div class="col-md-6 pt16 pb16">
                     <div class="row s_no_resize_cols">
                         <div class="col-md-4">
-                            <img src="/web/image/website.s_company_team_image_1" class="img-responsive img-circle center-block shadow"/>
+                            <img alt="Company team" src="/web/image/website.s_company_team_image_1" class="img-responsive img-circle center-block shadow"/>
                         </div>
                         <div class="col-md-8">
                             <h4>Tony Fred, CEO</h4>
@@ -406,7 +406,7 @@
                 <div class="col-md-6 pt16 pb16">
                     <div class="row s_no_resize_cols">
                         <div class="col-md-4">
-                            <img src="/web/image/website.s_company_team_image_2" class="img-responsive img-circle center-block shadow"/>
+                            <img alt="Company team" src="/web/image/website.s_company_team_image_2" class="img-responsive img-circle center-block shadow"/>
                         </div>
                         <div class="col-md-8">
                             <h4>Mich Stark, COO</h4>
@@ -421,7 +421,7 @@
                 <div class="col-md-6 pt16 pb16">
                     <div class="row s_no_resize_cols">
                         <div class="col-md-4">
-                            <img src="/web/image/website.s_company_team_image_3" class="img-responsive img-circle center-block shadow"/>
+                            <img alt="Company team" src="/web/image/website.s_company_team_image_3" class="img-responsive img-circle center-block shadow"/>
                         </div>
                         <div class="col-md-8">
                             <h4>Aline Turner, CTO</h4>
@@ -436,7 +436,7 @@
                 <div class="col-md-6 pt16 pb16">
                     <div class="row s_no_resize_cols">
                         <div class="col-md-4">
-                            <img src="/web/image/website.s_company_team_image_4" class="img-responsive img-circle center-block shadow"/>
+                            <img alt="Company team" src="/web/image/website.s_company_team_image_4" class="img-responsive img-circle center-block shadow"/>
                         </div>
                         <div class="col-md-8">
                             <h4>Iris Joe, CFO</h4>
@@ -465,7 +465,7 @@
                     </p>
                 </div>
                 <div class="col-md-3">
-                    <a href="/contactus" class="btn btn-primary btn-lg pull-right mt8">
+                    <a role="button" href="/contactus" class="btn btn-primary btn-lg pull-right mt8" aria-label="Contact Us Now" title="">
                         <span>Contact Us Now</span>
                         <i class="fa fa-chevron-right"></i>
                     </a>
@@ -577,17 +577,17 @@
                             <h5 class="text-muted">Add a great slogan</h5>
                         </div>
                         <div class="col-md-12">
-                            <span style="min-width: 45px" class="fa fa-2x fa-comment pull-left mb16"></span>
+                            <span style="min-width: 45px" class="fa fa-2x fa-comment pull-left mb16" role="img" aria-label="Change icons" title="Change icons"></span>
                             <h4 class="mt0 mb0">Change Icons</h4>
                             <p>Click on the icon to adapt it to your feature</p><br/>
                         </div>
                         <div class="col-md-12">
-                            <span style="min-width: 45px" class="fa fa-2x fa-columns pull-left mb16"></span>
+                            <span style="min-width: 45px" class="fa fa-2x fa-columns pull-left mb16" role="img" aria-label="Duplicate" title="Duplicate"></span>
                             <h4 class="mt0 mb0">Duplicate</h4>
                             <p>Duplicate blocks to add more features.</p><br/>
                         </div>
                         <div class="col-md-12">
-                            <span style="min-width: 45px" class="fa fa-2x fa-user pull-left mb16"></span>
+                            <span style="min-width: 45px" class="fa fa-2x fa-user pull-left mb16" role="img" aria-label="Delete blocks" title="Delete blocks"></span>
                             <h4 class="mt0 mb0">Delete Blocks</h4>
                             <p>Select and delete blocks to remove some features.</p><br/>
                         </div>
@@ -600,17 +600,17 @@
                             <h5 class="text-muted">Add a great slogan</h5>
                         </div>
                         <div class="col-md-12">
-                            <span style="min-width: 45px" class="fa fa-2x fa-magic pull-left mb16"></span>
+                            <span style="min-width: 45px" class="fa fa-2x fa-magic pull-left mb16" role="img" aria-label="Great value" title="Great value"></span>
                             <h4 class="mt0 mb0">Great Value</h4>
                             <p>Tell features the visitor would like to know, not what you'd like to say.</p>
                         </div>
                         <div class="col-md-12">
-                            <span style="min-width: 45px" class="fa fa-2x fa-bolt pull-left mb16"></span>
+                            <span style="min-width: 45px" class="fa fa-2x fa-bolt pull-left mb16" role="img" aria-label="Change background" title="Change background"></span>
                             <h4 class="mt0 mb0">Change Background</h4>
                             <p>From the main container, you can change the background to highlight features.</p>
                         </div>
                         <div class="col-md-12">
-                            <span style="min-width: 45px" class="fa fa-2x fa-picture-o pull-left mb16"></span>
+                            <span style="min-width: 45px" class="fa fa-2x fa-picture-o pull-left mb16" role="img" aria-label="Sample images" title="Change background"></span>
                             <h4 class="mt0 mb0">Sample images</h4>
                             <p>All these icons are licensed under creative commons so that you can use them.</p>
                         </div>
@@ -688,7 +688,7 @@
         <div id="o_scroll">
             <div id="snippet_structure" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-th-large"/> Structure
+                    <span class="fa fa-th-large"> Structure</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="website.s_title" t-thumbnail="/website/static/src/img/blocks/block_title.png"/>
@@ -706,7 +706,7 @@
 
             <div id="snippet_feature" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-diamond"/> Feature
+                    <span class="fa fa-diamond"> Feature</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="website.s_image_gallery" t-thumbnail="/website/static/src/img/blocks/block_image_gallery.png"/>
@@ -721,7 +721,7 @@
 
             <div id="snippet_effect" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-magic icon-fix"/> Effect
+                    <span class="fa fa-magic icon-fix"> Effect</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="website.s_parallax" t-thumbnail="/website/static/src/img/blocks/block_parallax.png"/>
@@ -731,7 +731,7 @@
 
             <div id="snippet_content" class="o_panel">
                 <div class="o_panel_header">
-                    <i class="fa fa-indent"/> Inner content
+                    <span class="fa fa-indent"> Inner content</span>
                 </div>
                 <div class="o_panel_body">
                     <t t-snippet="website.s_well" t-thumbnail="/website/static/src/img/blocks/block_well.png"/>
@@ -764,58 +764,58 @@
     <t t-call="web_editor.snippet_options"/>
 
     <div data-js='gallery' data-selector=".o_gallery">
-        <li data-add-images="true" data-no-preview="true"><a href="#"><i class="fa fa-plus-circle"/>Add images</a></li>
-        <li data-remove-all-images="true" data-no-preview="true"><a href="#"><i class="fa fa-trash"/>Remove all images</a></li>
+        <li data-add-images="true" data-no-preview="true"><a href="#"><span class="fa fa-plus-circle">Add images</span></a></li>
+        <li data-remove-all-images="true" data-no-preview="true"><a href="#"><span class="fa fa-trash">Remove all images</span></a></li>
         <li class="separator"/>
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-magic"/>Mode</a>
-            <ul class="dropdown-menu">
-                <li data-mode="nomode"><a href="#">Float</a></li>
-                <li data-mode="masonry"><a href="#">Masonry</a></li>
-                <li data-mode="grid"><a href="#">Grid</a></li>
-                <li data-mode="slideshow"><a href="#">Slideshow</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-magic">Mode</span></a>
+            <ul class="dropdown-menu" role="menu">
+                <li data-mode="nomode"><a role="menuitem" href="#">Float</a></li>
+                <li data-mode="masonry"><a role="menuitem" href="#">Masonry</a></li>
+                <li data-mode="grid"><a role="menuitem" href="#">Grid</a></li>
+                <li data-mode="slideshow"><a role="menuitem" href="#">Slideshow</a></li>
             </ul>
         </li>
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-clock-o"/>Slideshow speed</a>
-            <ul class="dropdown-menu">
-                 <li data-interval="1000"><a href="#">1s</a></li>
-                 <li data-interval="2000"><a href="#">2s</a></li>
-                 <li data-interval="3000"><a href="#">3s</a></li>
-                 <li data-interval="5000"><a href="#">5s</a></li>
-                 <li data-interval="10000"><a href="#">10s</a></li>
-                 <li data-interval="0"><a href="#">Disable autoplay</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-clock-o">Slideshow speed</span></a>
+            <ul class="dropdown-menu" role="menu">
+                 <li data-interval="1000"><a role="menuitem" href="#">1s</a></li>
+                 <li data-interval="2000"><a role="menuitem" href="#">2s</a></li>
+                 <li data-interval="3000"><a role="menuitem" href="#">3s</a></li>
+                 <li data-interval="5000"><a role="menuitem" href="#">5s</a></li>
+                 <li data-interval="10000"><a role="menuitem" href="#">10s</a></li>
+                 <li data-interval="0"><a role="menuitem" href="#">Disable autoplay</a></li>
             </ul>
         </li>
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-th"/>Columns</a>
-            <ul class="dropdown-menu">
-                <li data-columns="1"><a href="#">1</a></li>
-                <li data-columns="2"><a href="#">2</a></li>
-                <li data-columns="3"><a href="#">3</a></li>
-                <li data-columns="4"><a href="#">4</a></li>
-                <li data-columns="6"><a href="#">6</a></li>
-                <li data-columns="12"><a href="#">12</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-th">Columns</span></a>
+            <ul class="dropdown-menu" role="menu">
+                <li data-columns="1"><a role="menuitem" href="#">1</a></li>
+                <li data-columns="2"><a role="menuitem" href="#">2</a></li>
+                <li data-columns="3"><a role="menuitem" href="#">3</a></li>
+                <li data-columns="4"><a role="menuitem" href="#">4</a></li>
+                <li data-columns="6"><a role="menuitem" href="#">6</a></li>
+                <li data-columns="12"><a role="menuitem" href="#">12</a></li>
             </ul>
         </li>
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-arrows-h"/>Images spacing</a>
+            <a tabindex="-2" href="#"><span class="fa fa-arrows-h">Images spacing</span></a>
 
-            <ul class="dropdown-menu">
-                <li data-select-class="o_spc-none"><a href="#">None</a></li>
-                <li data-select-class="o_spc-small"><a href="#">Small</a></li>
-                <li data-select-class="o_spc-medium"><a href="#">Medium</a></li>
-                <li data-select-class="o_spc-big"><a href="#">Big</a></li>
+            <ul class="dropdown-menu" role="menu">
+                <li data-select-class="o_spc-none"><a role="menuitem" href="#">None</a></li>
+                <li data-select-class="o_spc-small"><a role="menuitem" href="#">Small</a></li>
+                <li data-select-class="o_spc-medium"><a role="menuitem" href="#">Medium</a></li>
+                <li data-select-class="o_spc-big"><a role="menuitem" href="#">Big</a></li>
             </ul>
         </li>
         <li class="dropdown-submenu">
-           <a tabindex="-2" href="#"><i class="fa fa-paint-brush"/>Styling</a>
-           <ul class="dropdown-menu">
-               <li data-styling=""><a href="#">Square</a></li>
-               <li data-styling="img-rounded"><a href="#">Rounded corners</a></li>
-               <li data-styling="img-thumbnail"><a href="#">Thumbnails</a></li>
-               <li data-styling="img-circle"><a href="#">Circle</a></li>
-               <li data-styling="shadow"><a href="#">Shadows</a></li>
+           <a tabindex="-2" href="#"><span class="fa fa-paint-brush">Styling</span></a>
+           <ul class="dropdown-menu" role="menu">
+               <li data-styling=""><a role="menuitem" href="#">Square</a></li>
+               <li data-styling="img-rounded"><a role="menuitem" href="#">Rounded corners</a></li>
+               <li data-styling="img-thumbnail"><a role="menuitem" href="#">Thumbnails</a></li>
+               <li data-styling="img-circle"><a role="menuitem" href="#">Circle</a></li>
+               <li data-styling="shadow"><a role="menuitem" href="#">Shadows</a></li>
            </ul>
         </li>
         <li class="separator"/>
@@ -824,14 +824,14 @@
     <div data-js="background"
         data-selector="section, :not(.o_gallery > .container) > .carousel, .parallax, .s_banner .carousel-content">
         <li data-choose-image="true" data-no-preview="true">
-            <a tabindex="-1" href="#"><i class="fa fa-picture-o"/>Choose Background Image</a>
+            <a tabindex="-1" href="#"><span class="fa fa-picture-o">Choose Background Image</span></a>
         </li>
     </div>
 
     <div data-js="background_position"
         data-selector="section, :not(.o_gallery > .container) > .carousel, .s_banner .carousel-content">
         <li class="background_position_li" data-background-position="true" data-no-preview="true">
-            <a tabindex="-1" href="#"><i class="fa fa-arrows"/>Background Image Sizing</a>
+            <a tabindex="-1" href="#"><span class="fa fa-arrows">Background Image Sizing</span></a>
         </li>
     </div>
 
@@ -839,8 +839,8 @@
         data-selector="section, :not(.o_gallery > .container) > .carousel"
         data-exclude=".parallax">
         <li class="dropdown-submenu">
-            <a tabindex="-1" href="#"><i class="fa fa-eyedropper"/>Background Color</a>
-            <ul class="dropdown-menu">
+            <a tabindex="-1" href="#"><span class="fa fa-eyedropper">Background Color</span></a>
+            <ul class="dropdown-menu" role="menu">
                 <li></li>
             </ul>
         </li>
@@ -851,8 +851,8 @@
         data-palette-default="transparent_grayscale"
         data-palette-title="Overlay Color">
         <li class="dropdown-submenu">
-            <a tabindex="-1" href="#"><i class="fa fa-eyedropper"/>Overlay color</a>
-            <ul class="dropdown-menu">
+            <a tabindex="-1" href="#"><span class="fa fa-eyedropper">Overlay color</span></a>
+            <ul class="dropdown-menu" role="menu">
                 <li></li>
             </ul>
         </li>
@@ -860,12 +860,12 @@
 
     <div data-js='gallery_img' data-selector=".o_gallery img">
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-refresh"/>Re-order</a>
-            <ul class="dropdown-menu" data-no-preview="true">
-                <li data-position="first"><a href="#">Move to first</a></li>
-                <li data-position="prev"><a href="#">Move to previous</a></li>
-                <li data-position="next"><a href="#">Move to next</a></li>
-                <li data-position="last"><a href="#">Move to last</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-refresh">Re-order</span></a>
+            <ul class="dropdown-menu" role="menu" data-no-preview="true">
+                <li data-position="first"><a role="menuitem" href="#">Move to first</a></li>
+                <li data-position="prev"><a role="menuitem" href="#">Move to previous</a></li>
+                <li data-position="next"><a role="menuitem" href="#">Move to next</a></li>
+                <li data-position="last"><a role="menuitem" href="#">Move to last</a></li>
             </ul>
         </li>
     </div>
@@ -874,18 +874,18 @@
         data-selector=":not(.o_gallery > .container) > .carousel">
         <li class="divider"></li>
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-clock-o"/>Slideshow speed</a>
-            <ul class="dropdown-menu">
-                 <li data-interval="1000"><a href="#">1s</a></li>
-                 <li data-interval="2000"><a href="#">2s</a></li>
-                 <li data-interval="3000"><a href="#">3s</a></li>
-                 <li data-interval="5000"><a href="#">5s</a></li>
-                 <li data-interval="10000"><a href="#">10s</a></li>
-                 <li data-interval="0"><a href="#">Disable autoplay</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-clock-o">Slideshow speed</span></a>
+            <ul class="dropdown-menu" role="menu">
+                 <li data-interval="1000"><a role="menuitem" href="#">1s</a></li>
+                 <li data-interval="2000"><a role="menuitem" href="#">2s</a></li>
+                 <li data-interval="3000"><a role="menuitem" href="#">3s</a></li>
+                 <li data-interval="5000"><a role="menuitem" href="#">5s</a></li>
+                 <li data-interval="10000"><a role="menuitem" href="#">10s</a></li>
+                 <li data-interval="0"><a role="menuitem" href="#">Disable autoplay</a></li>
             </ul>
         </li>
-        <li data-add-slide="true" data-no-preview="true"><a href="#"><i class="fa fa-plus-circle"/>Add Slide</a></li>
-        <li data-remove-slide="true" data-no-preview="true"><a href="#" ><i class="fa fa-trash-o"/>Remove Slide</a></li>
+        <li data-add-slide="true" data-no-preview="true"><a href="#"><span class="fa fa-plus-circle">Add Slide</span></a></li>
+        <li data-remove-slide="true" data-no-preview="true"><a href="#" ><span class="fa fa-trash-o">Remove Slide</span></a></li>
     </div>
 
     <div data-selector="section, :not(.o_gallery > .container) > .carousel, .parallax"
@@ -900,14 +900,14 @@
         data-target="> * > .row"
         data-exclude=".s_text_block_image_fw, .s_company_team, .s_big_picture">
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-columns"/>Number of columns</a>
-            <ul class="dropdown-menu" data-no-preview="true">
-                <li data-select-count="1"><a href="#">1</a></li>
-                <li data-select-count="2"><a href="#">2</a></li>
-                <li data-select-count="3"><a href="#">3</a></li>
-                <li data-select-count="4"><a href="#">4</a></li>
-                <li data-select-count="5"><a href="#">5</a></li>
-                <li data-select-count="6"><a href="#">6</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-columns">Number of columns</span></a>
+            <ul class="dropdown-menu" role="menu" data-no-preview="true">
+                <li data-select-count="1"><a role="menuitem" href="#">1</a></li>
+                <li data-select-count="2"><a role="menuitem" href="#">2</a></li>
+                <li data-select-count="3"><a role="menuitem" href="#">3</a></li>
+                <li data-select-count="4"><a role="menuitem" href="#">4</a></li>
+                <li data-select-count="5"><a role="menuitem" href="#">5</a></li>
+                <li data-select-count="6"><a role="menuitem" href="#">6</a></li>
             </ul>
         </li>
     </div>
@@ -930,39 +930,39 @@
 
     <div data-selector=".o_image_floating">
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-expand"/>Margin</a>
-            <ul class="dropdown-menu">
-                <li data-select-class="o_margin_xl"><a href="#">Extra-Large</a></li>
-                <li data-select-class="o_margin_l"><a href="#">Large</a></li>
-                <li data-select-class="o_margin_m"><a href="#">Medium</a></li>
-                <li data-select-class="o_margin_s"><a href="#">Small</a></li>
-                <li data-select-class=""><a href="#">None</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-expand">Margin</span></a>
+            <ul class="dropdown-menu" role="menu">
+                <li data-select-class="o_margin_xl"><a role="menuitem" href="#">Extra-Large</a></li>
+                <li data-select-class="o_margin_l"><a role="menuitem" href="#">Large</a></li>
+                <li data-select-class="o_margin_m"><a role="menuitem" href="#">Medium</a></li>
+                <li data-select-class="o_margin_s"><a role="menuitem" href="#">Small</a></li>
+                <li data-select-class=""><a role="menuitem" href="#">None</a></li>
             </ul>
         </li>
     </div>
 
     <div data-selector=".o_image_floating">
         <li class="dropdown-submenu">
-            <a tabindex="-2" href="#"><i class="fa fa-magnet"/>Float</a>
-            <ul class="dropdown-menu" data-no-preview="true">
-                <li data-select-class="pull-left"><a href="#">Left</a></li>
-                <li data-select-class="pull-right"><a href="#">Right</a></li>
+            <a tabindex="-2" href="#"><span class="fa fa-magnet">Float</span></a>
+            <ul class="dropdown-menu" role="menu" data-no-preview="true">
+                <li data-select-class="pull-left"><a role="menuitem" href="#">Left</a></li>
+                <li data-select-class="pull-right"><a role="menuitem" href="#">Right</a></li>
             </ul>
         </li>
     </div>
 
     <div data-js="parallax" data-selector=".parallax">
         <li class="dropdown-submenu">
-            <a tabindex="-1" href="#"><i class="fa fa-clock-o"/>Scroll Speed</a>
-            <ul class="dropdown-menu" name="parallax-scroll">
-                <li data-scroll="0"><a href="#">No-scroll</a></li>
-                <li class="separator"/>
-                <li data-scroll="1"><a href="#">Fixed</a></li>
-                <li class="separator"/>
-                <li data-scroll="0.6"><a href="#">Very Slow</a></li>
-                <li data-scroll="1.2"><a href="#">Slow</a></li>
-                <li data-scroll="1.6"><a href="#">Fast</a></li>
-                <li data-scroll="2"><a href="#">Very Fast</a></li>
+            <a tabindex="-1" href="#"><span class="fa fa-clock-o">Scroll Speed</span></a>
+            <ul class="dropdown-menu" role="menu" name="parallax-scroll">
+                <li data-scroll="0"><a role="menuitem" href="#">No-scroll</a></li>
+                <li class="separator" role="separator"/>
+                <li data-scroll="1"><a role="menuitem" href="#">Fixed</a></li>
+                <li class="separator" role="separator"/>
+                <li data-scroll="0.6"><a role="menuitem" href="#">Very Slow</a></li>
+                <li data-scroll="1.2"><a role="menuitem" href="#">Slow</a></li>
+                <li data-scroll="1.6"><a role="menuitem" href="#">Fast</a></li>
+                <li data-scroll="2"><a role="menuitem" href="#">Very Fast</a></li>
             </ul>
         </li>
     </div>
@@ -974,7 +974,7 @@
 
     <div data-js="facebookPage" data-selector=".o_facebook_page">
         <li data-fb-page-options="true" data-no-preview="true">
-            <a href="#"><i class="fa fa-facebook"/>Options</a>
+            <a href="#"><span class="fa fa-facebook">Options</span></a>
         </li>
     </div>
 
diff --git a/addons/website/views/website_navbar_templates.xml b/addons/website/views/website_navbar_templates.xml
index 9c5c213acbea..48d024646554 100644
--- a/addons/website/views/website_navbar_templates.xml
+++ b/addons/website/views/website_navbar_templates.xml
@@ -10,13 +10,13 @@
                 <ul id="oe_applications">
                     <li class="dropdown active">
                         <a class="dropdown full" data-toggle="dropdown" href="#">
-                            <i class="fa fa-th-large"/> WEBSITE <b class="caret"/>
+                            <span class="fa fa-th-large"> WEBSITE </span><b class="caret"/>
                         </a>
-                        <ul class="dropdown-menu">
+                        <ul class="dropdown-menu" role="menu">
                             <li t-as="menu" t-foreach="menu_data['children']">
                                 <t t-set="debug_param" t-value="'?&amp;debug=' if debug else ''"/>
-                                <a t-att-class="'oe_menu_toggler' if menu.get('children') else 'oe_menu_leaf'" t-att-data-action-id="menu['action'] and menu['action'].split(',')[1] or None" t-att-data-action-model="menu['action'] and menu['action'].split(',')[0] or None" t-att-data-menu="menu['id']" t-att-data-menu-xmlid="menu.get('xmlid')" t-att-href="'/web%s#menu_id=%s&amp;action=%s' % (debug_param, menu['id'], menu['action'] and menu['action'].split(',')[1] or '')">
-                                    <i t-attf-class="fa #{menu.get('icon')} fa-lg fa-fw" t-if="menu.get('icon')"/>
+                                <a role="menuitem" t-att-class="'oe_menu_toggler' if menu.get('children') else 'oe_menu_leaf'" t-att-data-action-id="menu['action'] and menu['action'].split(',')[1] or None" t-att-data-action-model="menu['action'] and menu['action'].split(',')[0] or None" t-att-data-menu="menu['id']" t-att-data-menu-xmlid="menu.get('xmlid')" t-att-href="'/web%s#menu_id=%s&amp;action=%s' % (debug_param, menu['id'], menu['action'] and menu['action'].split(',')[1] or '')">
+                                    <i t-attf-class="fa #{menu.get('icon')} fa-lg fa-fw" t-if="menu.get('icon')" role="img" aria-label="Menu" title="Menu"/>
                                     <span class="oe_menu_text">
                                         <t t-esc="menu['name']"/>
                                     </span>
@@ -26,34 +26,34 @@
                     </li>
                 </ul>
 
-                <button type="button" class="fa fa-bars pull-right visible-xs-block o_mobile_menu_toggle"/>
+                <button type="button" class="fa fa-bars pull-right visible-xs-block o_mobile_menu_toggle" aria-label="Menu" title="Menu"/>
 
                 <ul class="o_menu_sections" groups="website.group_website_designer">
                     <!-- Content -->
                     <li t-if="editable" class="dropdown" id="content-menu">
                         <a id="content-menu-button" class="dropdown-toggle waves" data-toggle="dropdown" href="#">Content</a>
                         <ul class="dropdown-menu" role="menu">
-                            <li><a data-action="edit_menu" href="#" title="Edit Top Menu">Edit Menu</a></li>
-                            <li><a href="/website/pages" title="Manage Your Website Pages">Manage Pages</a></li>
+                            <li><a role="menuitem" data-action="edit_menu" href="#" title="Edit Top Menu">Edit Menu</a></li>
+                            <li><a role="menuitem" href="/website/pages" title="Manage Your Website Pages">Manage Pages</a></li>
                             <li t-if="deletable" role="separator" class="divider"></li>
-                            <li t-if="deletable"><a href="#" data-action="page_properties">Page Properties</a></li>
+                            <li t-if="deletable"><a role="menuitem" href="#" data-action="page_properties">Page Properties</a></li>
                         </ul>
                     </li>
                     <!-- Customize -->
                     <li class="dropdown" id="customize-menu">
                         <a class="dropdown-toggle waves" data-toggle="dropdown" href="#">Customize</a>
                         <ul class="dropdown-menu" role="menu">
-                            <li id="theme_customize"><a href="#" data-action="customize_theme">Customize Theme</a></li>
-                            <li id="html_editor"><a href="#" data-action="ace">HTML/CSS Editor</a></li>
-                            <li id="install_apps"><a href="/web#action=website.action_website_configuration">Settings</a></li>
-                            <li class="divider"/>
+                            <li id="theme_customize"><a role="menuitem" href="#" data-action="customize_theme">Customize Theme</a></li>
+                            <li id="html_editor"><a role="menuitem" href="#" data-action="ace">HTML/CSS Editor</a></li>
+                            <li id="install_apps"><a role="menuitem" href="/web#action=website.action_website_configuration">Settings</a></li>
+                            <li class="divider" role="separator"/>
                         </ul>
                     </li>
                     <!-- Promote -->
                     <li class="dropdown" id="promote-menu">
                         <a class="dropdown-toggle waves" data-toggle="dropdown" href="#">Promote</a>
                         <ul class="dropdown-menu oe_promote_menu" role="menu">
-                            <li><a data-action="promote-current-page" href="#" title="Promote page on the web">Optimize SEO</a></li>
+                            <li><a role="menuitem" data-action="promote-current-page" href="#" title="Promote page on the web">Optimize SEO</a></li>
                         </ul>
                     </li>
                 </ul>
@@ -61,38 +61,38 @@
                 <ul class="o_menu_systray hidden-xs" groups="website.group_website_publisher">
                     <li t-if="'website_published' in main_object.fields_get()" t-attf-class="js_publish_management #{main_object.website_published and 'css_published' or 'css_unpublished'}" t-att-data-id="main_object.id" t-att-data-object="main_object._name" t-att-data-controller="publish_controller">
                         <a>
-                            <label class="o_switch o_switch_danger js_publish_btn" for="id" >
+                            <button class="o_switch o_switch_danger js_publish_btn">
                                 <input type="checkbox" t-att-checked="main_object.website_published" id="id"/>
                                 <span/>
                                 <span class="css_publish">Unpublished</span>
                                 <span class="css_unpublish">Published</span>
-                            </label>
+                            </button>
                         </a>
                     </li>
                     <!-- Mobile preview -->
                     <li class="o_mobile_preview" id="mobile-menu">
-                        <a data-action="show-mobile-preview" href="#"><span title="Mobile preview" class="fa fa-mobile"/></a>
+                        <a data-action="show-mobile-preview" href="#"><span title="Mobile preview" role="img" aria-label="Mobile preview" class="fa fa-mobile"/></a>
                     </li>
                     <!-- Page Edition -->
                     <li class="o_new_content_menu" id="new-content-menu">
-                        <a href="#"><span class="fa fa-plus"/>New</a>
+                        <a href="#"><span class="fa fa-plus">New</span></a>
                         <div id="o_new_content_menu_choices" class="o_hidden">
                             <ul>
-                                <li groups="website.group_website_designer"><a href="#" data-action="new_page"><i class="fa fa-file-o"/><p>New Page</p></a></li>
+                                <li groups="website.group_website_designer"><a href="#" data-action="new_page" aria-label="New page" title="New page"><i class="fa fa-file-o"/><p>New Page</p></a></li>
                             </ul>
                         </div>
                     </li>
                     <li t-if="not translatable" id="edit-page-menu">
-                        <a data-action="edit" href="#"><span class="fa fa-pencil"/>Edit</a>
+                        <a data-action="edit" href="#"><span class="fa fa-pencil">Edit</span></a>
                     </li>
                     <li t-if="'website_published' in main_object.fields_get() and main_object._name != 'website.page'">
-                        <a class="btn btn-primary btn-xs dropdown-toggle css_edit_dynamic" data-toggle="dropdown">
+                        <a role="button" class="btn btn-primary btn-xs dropdown-toggle css_edit_dynamic" data-toggle="dropdown">
                             <span class="caret"></span>
                             <span class="sr-only">Toggle Dropdown</span>
                         </a>
                         <ul class="dropdown-menu" role="menu">
                             <li id="edit-in-backend">
-                                <a style="text-align: left;" t-attf-href="/web#return_label=Website&amp;view_type=form&amp;model=#{main_object._name}&amp;id=#{main_object.id}&amp;action=#{action}"
+                                <a role="menuitem" style="text-align: left;" t-attf-href="/web#return_label=Website&amp;view_type=form&amp;model=#{main_object._name}&amp;id=#{main_object.id}&amp;action=#{action}"
                                    class="btn btn-link btn-xs" title='Edit in backend'>Edit in backend</a>
                             </li>
                         </ul>
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 6d84577b4d5b..7f8efab47046 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -70,7 +70,7 @@
     <li t-if="submenu.is_visible and not submenu.child_id.filtered(lambda menu: menu.is_visible)" t-att-class="
         'active' if submenu.clean_url() and unslug_url(request.httprequest.path) == unslug_url(submenu.clean_url()) else None
         ">
-        <a t-att-href="submenu.clean_url()" t-ignore="true" t-att-target="'_blank' if submenu.new_window else None">
+        <a role="menuitem" t-att-href="submenu.clean_url()" t-ignore="true" t-att-target="'_blank' if submenu.new_window else None">
             <span t-field="submenu.name"/>
         </a>
     </li>
@@ -234,7 +234,7 @@
 <template id="layout_logo_show" inherit_id="website.layout" customize_show="True" name="Show Logo">
     <xpath expr="//header//a[hasclass('navbar-brand')]" position="replace">
         <a href="/" class="navbar-brand logo">
-            <span t-field="res_company.logo" t-options="{'widget': 'image'}" t-att-alt="'Logo of %s' % res_company.name" t-att-title="res_company.name" />
+            <span t-field="res_company.logo" t-options="{'widget': 'image'}" role="img" t-att-aria-label="'Logo of %s' % res_company.name" t-att-title="res_company.name" />
         </a>
     </xpath>
 </template>
@@ -336,8 +336,8 @@
         <li groups="website.group_website_publisher">
             <t t-set="url_return" t-value="url_for('', '[lang]') + '?' + keep_query()"/>
             <a t-attf-href="/web#action=base.action_view_base_language_install&amp;website_id=#{website.id if website else ''}&amp;url_return=#{url_return}">
-                <i class="fa fa-plus-circle"/>
-                Add a language...
+                <span class="fa fa-plus-circle">
+                    Add a language...</span>
             </a>
         </li>
     </ul>
@@ -355,7 +355,7 @@
             <ul class="dropdown-menu" role="menu" t-att-aria-labelledby="'dopprod-%s' % object.id">
                 <t t-raw="0"/>
                 <li t-if="publish_edit">
-                    <a t-attf-href="/web#return_label=Website&amp;view_type=form&amp;model=#{object._name}&amp;id=#{object.id}&amp;action=#{action}"
+                    <a role="menuitem" t-attf-href="/web#return_label=Website&amp;view_type=form&amp;model=#{object._name}&amp;id=#{object.id}&amp;action=#{action}"
                     title='Edit in backend'>Edit</a>
                 </li>
             </ul>
@@ -402,12 +402,12 @@
     - 'loading': on the container/modal when the new css is loading
 -->
 <template id="website.theme_customize" name="Theme Modal for Customization">
-  <div id="theme_customize_modal" class="modal fade">
+  <div role="dialog" id="theme_customize_modal" class="modal fade">
       <div class="modal-dialog">
           <div class="modal-content">
-            <div class="modal-header text-center">
+            <header class="modal-header text-center">
                 <h4 class="modal-title">Please install a theme in order to customize your website.</h4>
-            </div>
+            </header>
           </div>
       </div>
   </div>
@@ -486,8 +486,8 @@
                     Information about the <t t-esc="res_company.name"/> instance of Odoo, the <a target="_blank" href="https://www.odoo.com">Open Source ERP</a>.
                 </p>
 
-                <div class="alert alert-warning alert-dismissable mt16" groups="website.group_website_publisher">
-                   <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                <div class="alert alert-warning alert-dismissable mt16" groups="website.group_website_publisher" role="status">
+                   <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                    <p>
                      Note: To hide this page, uncheck it from the top Customize menu.
                    </p>
@@ -578,7 +578,7 @@
         <div class="container">
             <div class="well mt32">
                 <p>This page does not exist, but you can create it as you are administrator of this site.</p>
-                <a class="btn btn-primary js_disable_on_click" t-attf-href="/website/add/#{ path }#{ from_template and '?template=%s' % from_template }">Create Page</a>
+                <a role="button" class="btn btn-primary js_disable_on_click" t-attf-href="/website/add/#{ path }#{ from_template and '?template=%s' % from_template }">Create Page</a>
             </div>
             <div class="text-center text-muted">Edit the content below this line to adapt the default "page not found" page.</div>
         </div>
@@ -739,15 +739,15 @@
             </script>
         </head>
         <body>
-            <div id="reset_template_confirmation" class="modal" tabindex="-1" role="dialog" aria-hidden="true" t-ignore="true">
+            <div role="dialog" id="reset_template_confirmation" class="modal" tabindex="-1" aria-hidden="true" t-ignore="true">
                 <div class="modal-dialog">
                     <form class="form-horizontal" role="form">
                     <div class="modal-content">
-                        <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                        <header class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                             <h3 class="modal-title">Reset templates</h3>
-                        </div>
-                        <div class="modal-body">
+                        </header>
+                        <main class="modal-body">
                             <div class="form-group mb0">
                                 <label for="page-name" class="col-sm-9">
                                     <p>The selected templates will be reset to their factory settings.</p>
@@ -757,11 +757,11 @@
                                     <input type="text" class="form-control" required="required" placeholder="yes"/>
                                 </div>
                             </div>
-                        </div>
-                        <div class="modal-footer">
+                        </main>
+                        <footer class="modal-footer">
                             <input type="submit" value="Confirm" class="btn btn-primary"/>
-                            <button type="button" class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
-                        </div>
+                            <button type="button" class="btn" data-dismiss="modal" aria-label="Cancel">Cancel</button>
+                        </footer>
                     </div>
                     </form>
                 </div>
@@ -785,7 +785,7 @@
                         <h1 class="container mt32"><t t-esc="status_code"/>: <t t-esc="status_message"/></h1>
                     </div>
                     <div class="container" t-if="views">
-                        <div class="alert alert-danger" t-if="qweb_exception and editable">
+                        <div class="alert alert-danger" t-if="qweb_exception and editable" role="alert">
                             <h4>Template fallback</h4>
                             <p>An error occured while rendering the template <code t-esc="qweb_exception.qweb['template']"/>.</p>
                             <p>If this error is caused by a change of yours in the templates, you have the possibility to reset one or more templates to their <strong>factory settings</strong>.</p>
@@ -849,12 +849,12 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml
                 "widget": "contact",
                 "fields": ["name", "address", "phone", "mobile", "email"]}'/>
         <t t-if="not res_company.google_map_img()">
-            <span class="fa fa-map-marker fa-fw mt16"/> <a t-att-href="res_company.google_map_link()" target="_BLANK"> Google Maps</a>
+            <span class="fa fa-map-marker fa-fw mt16" role="img" aria-label="Address" title="Address"/> <a t-att-href="res_company.google_map_link()" target="_BLANK"> Google Maps</a>
         </t>
     </address>
     <t t-if="res_company.google_map_img()">
         <a t-att-href="res_company.google_map_link()" target="_BLANK">
-           <img class="thumbnail img-responsive" t-att-src="res_company.google_map_img()" />
+           <img class="thumbnail img-responsive" t-att-src="res_company.google_map_img()" alt="Google Maps"/>
         </a>
     </t>
 </template>
@@ -865,7 +865,7 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml
             <input type="text" name="search" class="search-query form-control oe_search_box" placeholder="Search..." t-att-value="search" />
         </div>
         <span class="input-group-btn">
-           <button type="submit" class="btn btn-default oe_search_button"><i class="fa fa-search"/></button>
+           <button type="submit" class="btn btn-default oe_search_button" aria-label="Search" title="Search"><i class="fa fa-search"/></button>
         </span>
     </div>
 </template>
@@ -888,13 +888,13 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml
           </form>
           <div t-if="searchbar_sortings" class="dropdown pull-right mt8 mr8">
               <button class="btn btn-default" type="button" data-toggle="dropdown">
-                  <span class="fa fa-sort fa-lg" />
+                  <span class="fa fa-sort fa-lg" role="img" aria-label="Sort" title="Sort"/>
                   <span class='hidden-xs hidden-sm hidden-md' t-esc="searchbar_sortings[sortby].get('label', 'Newest')"/>
-                  <span class="caret"></span>
+                  <span class="caret" role="img" aria-label="Dropdown menu" title="Dropdown menu"></span>
               </button>
-              <ul class="dropdown-menu" aria-labelledby="portal_searchbar_sortby">
+              <ul class="dropdown-menu" role="menu" aria-labelledby="portal_searchbar_sortby">
                   <li t-foreach="searchbar_sortings" t-as="option" t-attf-class="#{sortby == option and 'active'}">
-                      <a t-att-href="request.httprequest.path + '?' + keep_query('*', sortby=option)">
+                      <a role="menuitem" t-att-href="request.httprequest.path + '?' + keep_query('*', sortby=option)">
                           <span t-esc="searchbar_sortings[option].get('label')"/>
                       </a>
                   </li>
@@ -915,25 +915,25 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml
                     <tr class="active">
                       <th>Name</th>
                       <th>Url</th>
-                      <th class="col-md-1 text-center"><i title="Is the page included in the main menu?" class="fa fa-thumb-tack" aria-hidden="true"></i></th>
-                      <th class="col-md-1 text-center"><i title="Is the page published?" class="fa fa-eye" aria-hidden="true"></i></th>
-                      <th class="col-md-1 text-center"><i title="Is the page indexed by search engines?" class="fa fa-globe" aria-hidden="true"></i></th>
+                      <th class="col-md-1 text-center"><i title="Is the page included in the main menu?" role="img" aria-label="Is the page included in the main menu?" class="fa fa-thumb-tack"></i></th>
+                      <th class="col-md-1 text-center"><i title="Is the page published?" role="img" aria-label="Is the page published?" class="fa fa-eye"></i></th>
+                      <th class="col-md-1 text-center"><i title="Is the page indexed by search engines?" role="img" aria-label="Is the page indexed by search engines?" class="fa fa-globe"></i></th>
                       <th class="col-sm-3 col-md-2"></th>
                     </tr>
                   </thead>
                   <t t-foreach="pages" t-as="page">
                       <tr>
-                          <td><i t-if="page.is_homepage" class="fa fa-home"></i> <span style="word-break: break-all;" t-esc="page.name"/></td>
+                          <td><i t-if="page.is_homepage" class="fa fa-home" role="img" aria-label="Home" title="Home"></i> <span style="word-break: break-all;" t-esc="page.name"/></td>
                           <td><a style="word-break: break-all;" t-attf-href="{{page.url}}"><t t-esc="page.url"/></a></td>
-                          <td class="text-center"><i t-att-class="'fa fa-check' if page.menu_ids else 'fa fa-times text-muted'" aria-hidden="true"></i></td>
+                          <td class="text-center"><i t-att-class="'fa fa-check' if page.menu_ids else 'fa fa-times text-muted'" role="img" t-att-aria-label="'Checked' if page.menu_ids else 'Not checked'" t-att-title="'Checked' if page.menu_ids else 'Not checked'"></i></td>
                           <t t-set='date_formatted'><t  t-options='{"widget": "date"}' t-esc="page.date_publish"/></t>
-                          <td class="text-center"><i t-att-title="not page.is_visible and page.website_published and 'This page will be visible on ' + date_formatted" t-att-class="'fa fa-check' if page.is_visible and page.website_published else 'fa fa-eye-slash' if not page.is_visible and page.website_published else 'fa fa-times text-muted'" aria-hidden="true"></i></td>
-                          <td class="text-center"><i t-att-class="'fa fa-check' if page.website_indexed else 'fa fa-times text-muted'" aria-hidden="true"></i></td>
+                          <td class="text-center"><i t-att-title="not page.is_visible and page.website_published and 'This page will be visible on ' + date_formatted" role="img" t-att-aria-label="not page.is_visible and page.website_published and 'This page will be visible on ' + date_formatted" t-att-class="'fa fa-check' if page.is_visible and page.website_published else 'fa fa-eye-slash' if not page.is_visible and page.website_published else 'fa fa-times text-muted'"></i></td>
+                          <td class="text-center"><i t-att-class="'fa fa-check' if page.website_indexed else 'fa fa-times text-muted'" role="img" t-att-aria-label="'Checked' if page.website_indexed else 'Not checked'" t-att-title="'Checked' if page.website_indexed else 'Not checked'"></i></td>
                           <td class="text-right">
-                              <a class="mr4 fa fa-cog js_page_properties" t-att-data-id="page.id" href="#" title="Manage this page"></a>
-                              <a class="mr4 fa fa-pencil-square-o" t-attf-href="/web#id=#{page.view_id.id}&amp;view_type=form&amp;model=ir.ui.view" title="Edit code in backend"></a>
-                              <a class="mr4 fa fa-clone js_clone_page" t-att-data-id="page.id" href="#" title="Clone this page"></a>
-                              <a class="fa fa-trash js_delete_page" t-att-data-id="page.id" href="#" title="Delete this page"></a>
+                              <a class="mr4 fa fa-cog js_page_properties" t-att-data-id="page.id" href="#" title="Manage this page" aria-label="Manage this page"></a>
+                              <a class="mr4 fa fa-pencil-square-o" t-attf-href="/web#id=#{page.view_id.id}&amp;view_type=form&amp;model=ir.ui.view" title="Edit code in backend" aria-label="Edit code in backend"></a>
+                              <a class="mr4 fa fa-clone js_clone_page" t-att-data-id="page.id" href="#" title="Clone this page" aria-label="Clone this page"></a>
+                              <a class="fa fa-trash js_delete_page" t-att-data-id="page.id" href="#" title="Delete this page" aria-label="Delete this page"></a>
                           </td>
                       </tr>
                   </t>
diff --git a/addons/website/views/website_views.xml b/addons/website/views/website_views.xml
index 6932eb9c053c..088ded08317a 100644
--- a/addons/website/views/website_views.xml
+++ b/addons/website/views/website_views.xml
@@ -145,7 +145,7 @@
                             </group>
                         </group>
                         <field groups="base.group_no_one" name="website_ids"/>
-                        <label string="Related Menu Items"/>
+                        <label for="menu_ids" string="Related Menu Items"/>
                         <field name="menu_ids"/>
                     </sheet>
                 </form>
@@ -199,7 +199,7 @@
                                 <field name="parent_id"/>
                             </group>
                         </group>
-                        <label string="Child Menus"/>
+                        <label for="child_id" string="Child Menus"/>
                         <field name="child_id">
                             <tree>
                                 <field name="sequence" widget="handle"/>
diff --git a/addons/website_blog/data/website_blog_demo.xml b/addons/website_blog/data/website_blog_demo.xml
index d76b9a8f0ba8..721a23bcedd8 100644
--- a/addons/website_blog/data/website_blog_demo.xml
+++ b/addons/website_blog/data/website_blog_demo.xml
@@ -71,7 +71,7 @@
                         read) the inbox and easily mark messages for future
                         actions. Every inbox should be empty after having
                         been processed; no more overload of information.
-                        <img class="img-responsive" src="/website_blog/static/src/img/mail-sc-00.png"/>
+                        <img class="img-responsive" src="/website_blog/static/src/img/mail-sc-00.png" alt=""/>
                     </li><li>
                         Keep control of what you want to receive or don't want
                         to receive. People should never receive spam. You
@@ -82,7 +82,7 @@
                         interface does not require you to click on every mail
                         to read a thread. Reading a full thread, replying,
                         attaching documents is super fast.
-                        <img class="img-responsive" src="/website_blog/static/src/img/mail-sc-03.png"/>
+                        <img class="img-responsive" src="/website_blog/static/src/img/mail-sc-03.png" alt=""/>
                     </li><li>
                         A mix of push & pull: Today, people
                         are victims of what others decide to push to them.
@@ -139,7 +139,7 @@
     <div class="container">
         <div class="row">
             <div class="col-md-6 mt16">
-                <img class="img img-responsive mb16" src="/website_blog/static/src/img/CMS_WMS_screens.jpg"/>
+                <img class="img img-responsive mb16" src="/website_blog/static/src/img/CMS_WMS_screens.jpg" alt=""/>
             </div>
             <div class="col-md-6 mt16">
                 <h3>New Features Launched</h3>
diff --git a/addons/website_blog/static/src/js/website.tour.blog.js b/addons/website_blog/static/src/js/website.tour.blog.js
index eddce1f10a39..3c464987559a 100644
--- a/addons/website_blog/static/src/js/website.tour.blog.js
+++ b/addons/website_blog/static/src/js/website.tour.blog.js
@@ -30,12 +30,12 @@ odoo.define("website_blog.tour", function (require) {
         content: _t("Click here to change your post cover."),
         position: "right",
     }, {
-        trigger: ".o_select_media_dialog .o_existing_attachment_cell:nth(1) img",
-        extra_trigger: ".modal:has(.o_existing_attachment_cell:nth(1))",
+        trigger: ".o_existing_attachment_cell:nth(1) img",
+        extra_trigger: '.modal-dialog:has(.o_existing_attachment_cell:nth(1))',
         content: _t("Choose an image from the library."),
         position: "top",
     }, {
-        trigger: ".o_select_media_dialog .modal-footer > .btn-primary",
+        trigger: "footer.modal-footer .btn-primary",
         extra_trigger: ".o_existing_attachment_cell.o_selected",
         content: _t("Click on <b>Save</b> to set the picture as cover."),
         position: "top",
@@ -59,7 +59,7 @@ odoo.define("website_blog.tour", function (require) {
         position: "bottom",
     }, {
         trigger: "button[data-dismiss=modal]",
-        extra_trigger: ".modal:has(#mobile-viewport)",
+        extra_trigger: '[role="dialog"]:has(#mobile-viewport)',
         content: _t("Once you have reviewed the content on mobile, close the preview."),
         position: "right",
     }, {
diff --git a/addons/website_blog/views/snippets.xml b/addons/website_blog/views/snippets.xml
index d1e4866efae9..eee8bccc9b25 100644
--- a/addons/website_blog/views/snippets.xml
+++ b/addons/website_blog/views/snippets.xml
@@ -7,31 +7,31 @@
             <li data-clear="true" data-no-preview="true"><a href="#" >No Cover</a></li>
             <li class="dropdown-submenu">
                 <a href="#">Size</a>
-                <ul class="dropdown-menu">
-                    <li data-select-class="cover container-fluid cover_full"><a href="#">Full Screen</a></li>
-                    <li data-select-class="cover container-fluid cover_narrow"><a href="#">Mid screen</a></li>
-                    <li data-select-class="cover container cover_narrow"><a href="#">Narrow</a></li>
+                <ul class="dropdown-menu" role="menu">
+                    <li data-select-class="cover container-fluid cover_full"><a role="menuitem" href="#">Full Screen</a></li>
+                    <li data-select-class="cover container-fluid cover_narrow"><a role="menuitem" href="#">Mid screen</a></li>
+                    <li data-select-class="cover container cover_narrow"><a role="menuitem" href="#">Narrow</a></li>
                 </ul>
             </li>
             <li class="dropdown-submenu">
                 <a href="#">Filter Intensity</a>
-                <ul class="dropdown-menu">
-                    <li data-filter_value="0.0"><a href="#">None</a></li>
-                    <li data-filter_value="0.2"><a href="#">Low</a></li>
-                    <li data-filter_value="0.4"><a href="#">Medium</a></li>
-                    <li data-filter_value="0.6"><a href="#">High</a></li>
+                <ul class="dropdown-menu" role="menu">
+                    <li data-filter_value="0.0"><a role="menuitem" href="#">None</a></li>
+                    <li data-filter_value="0.2"><a role="menuitem" href="#">Low</a></li>
+                    <li data-filter_value="0.4"><a role="menuitem" href="#">Medium</a></li>
+                    <li data-filter_value="0.6"><a role="menuitem" href="#">High</a></li>
                 </ul>
             </li>
             <li class="dropdown-submenu">
                 <a href="#">Filter Color</a>
-                <ul class="dropdown-menu">
-                    <li data-filter_color="oe_black"><a href="#">Black</a></li>
-                    <li data-filter_color="oe_none"><a href="#">White</a></li>
-                    <li data-filter_color="oe_blue"><a href="#">Blue</a></li>
-                    <li data-filter_color="oe_yellow"><a href="#">Yellow</a></li>
-                    <li data-filter_color="oe_red"><a href="#">Red</a></li>
-                    <li data-filter_color="oe_purple"><a href="#">Purple</a></li>
-                    <li data-filter_color="oe_green"><a href="#">Green</a></li>
+                <ul class="dropdown-menu" role="menu">
+                    <li data-filter_color="oe_black"><a role="menuitem" href="#">Black</a></li>
+                    <li data-filter_color="oe_none"><a role="menuitem" href="#">White</a></li>
+                    <li data-filter_color="oe_blue"><a role="menuitem" href="#">Blue</a></li>
+                    <li data-filter_color="oe_yellow"><a role="menuitem" href="#">Yellow</a></li>
+                    <li data-filter_color="oe_red"><a role="menuitem" href="#">Red</a></li>
+                    <li data-filter_color="oe_purple"><a role="menuitem" href="#">Purple</a></li>
+                    <li data-filter_color="oe_green"><a role="menuitem" href="#">Green</a></li>
                 </ul>
             </li>
         </div>
diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml
index 02dfbc27fe22..8e82e31c20fe 100644
--- a/addons/website_blog/views/website_blog_templates.xml
+++ b/addons/website_blog/views/website_blog_templates.xml
@@ -23,8 +23,8 @@
         <div id="wrap">
             <div class="oe_structure"/>
             <section class="container">
-                <div class="alert alert-warning alert-dismissable mt16" groups="website.group_website_publisher">
-                   <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                <div class="alert alert-warning alert-dismissable mt16" groups="website.group_website_publisher" role="status">
+                   <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                    <p>
                    This page is great to improve your <strong>Search Engine Optimization</strong>;
                    You can review titles, keywords and descriptions of all blogs at once.
@@ -52,11 +52,11 @@
                         <h4>
                             <a t-attf-href="#{blog_url('', ['blog', 'post'], blog=post.blog_id, post=post)}" t-field="post.name"></a>
                             <span t-if="not post.website_published" class="text-warning">
-                                <span class="fa fa-exclamation-triangle ml8" title="Unpublished"/>
+                                <span class="fa fa-exclamation-triangle ml8" title="Unpublished" role="img" aria-label="Unpublished"/>
                             </span>
                         </h4>
                         <div class="text-muted">
-                            <span class="fa fa-calendar mr8"> <span t-field="post.post_date"/></span>
+                            <span class="fa fa-calendar mr8" role="img" aria-label="Post date" title="Post date"> <span t-field="post.post_date"/></span>
                             <span class="fa fa-folder-open"> In
                                 <a class="mr8" t-attf-href="#{blog_url(blog=post.blog_id)}">
                                 <span t-field="post.blog_id"/>
@@ -150,17 +150,17 @@
                                 <t t-if="blog_post.visits &gt; 1">views</t>
                             </span>
                             <span t-if="not blog_post.website_published" class="label label-danger">unpublished</span>
-                            <span class="fa fa-tags"/>
+                            <span class="fa fa-tags" role="img" aria-label="Tags" title="Tags"/>
 
                             <!-- To display tags //no options -->
                             <t t-foreach="blog_post.tag_ids" t-as="one_tag">
                                 <a class="mr8" t-attf-href="#{blog_url(tag=one_tag.id, date_begin=False, date_end=False)}" t-esc="one_tag.name"/>
                             </t>
                             <div class="o_sharing_links">
-                                <a class="fa fa-twitter-square o_twitter"></a>
-                                <a class="fa fa-facebook-square o_facebook"></a>
-                                <a class="fa fa-linkedin-square o_linkedin"></a>
-                                <a class="fa fa-google-plus-square o_google"></a>
+                                <a class="fa fa-twitter-square o_twitter" aria-label="Twitter" title="Twitter"></a>
+                                <a class="fa fa-facebook-square o_facebook" aria-label="Facebook" title="Facebook"></a>
+                                <a class="fa fa-linkedin-square o_linkedin" aria-label="LinkedIn" title="LinkedIn"></a>
+                                <a class="fa fa-google-plus-square o_google" aria-label="Google Plus" title="Google Plus"></a>
                             </div>
                             <hr/>
                         </div>
@@ -234,13 +234,13 @@
                     <h2 t-field="blog_post.subtitle" placeholder="Subtitle"/>
                     <p class="post-meta text-muted text-center" name="blog_post_data"/>
                     <p class="post-meta text-muted text-center" t-if="len(blog_post.tag_ids)">
-                        <span class="fa fa-tags"/>
+                        <span class="fa fa-tags" role="img" aria-label="Tags" title="Tags"/>
                         <t t-foreach="blog_post.tag_ids" t-as="one_tag">
                             <a class="label label-primary mr8" t-attf-href="#{blog_url(tag=one_tag.id)}" t-esc="one_tag.name"/>
                         </t>
                     </p>
                     <div t-if="'cover_full' in blog_post_cover_properties.get('resize_class', '')" id="blog_angle_down">
-                        <strong><a href="#blog_content" class="fa fa-angle-down fa-3x fa-inverse mt4"/></strong>
+                        <strong><a href="#blog_content" class="fa fa-angle-down fa-3x fa-inverse mt4" aria-label="To blog content" title="To blog content"/></strong>
                     </div>
                 </div>
             </t>
@@ -249,10 +249,10 @@
         <div id="blog_content" t-field="blog_post.content" class="blog_content mt32"/>
 
         <div class="o_blog_post_complete o_sharing_links">
-            <a class="fa fa-twitter-square o_twitter_complete" id="o_twitter_complete"></a>
-            <a class="fa fa-facebook-square o_facebook_complete" id="o_facebook_complete"></a>
-            <a class="fa fa-linkedin-square o_linkedin_complete" id="o_linkedin_complete"></a>
-            <a class="fa fa-google-plus-square o_google_complete" id="o_google_complete"></a>
+            <a class="fa fa-twitter-square o_twitter_complete" id="o_twitter_complete" aria-label="Twitter" title="Twitter"></a>
+            <a class="fa fa-facebook-square o_facebook_complete" id="o_facebook_complete" aria-label="Facebook" title="Facebook"></a>
+            <a class="fa fa-linkedin-square o_linkedin_complete" id="o_linkedin_complete" aria-label="LinkedIn" title="LinkedIn"></a>
+            <a class="fa fa-google-plus-square o_google_complete" id="o_google_complete" aria-label="Google Plus" title="Google Plus"></a>
         </div>
         <t t-set='head'>
             <t t-raw='head or ""'/>
@@ -324,7 +324,7 @@
                             "fields": ["name"]
                         }'/>
                     </div>
-                    <p class="mt32">Read Next <span class="fa fa-long-arrow-right"/></p>
+                    <p class="mt32 fa fa-suffix-long-arrow-right">Read Next </p>
                 </div>
             </t>
         </t>
@@ -390,7 +390,7 @@
 <template id="tag_category" name="Tags List">
     <ul class="nav nav-pills ml16">
         <t t-if="tags">
-            <div t-if='not hide_title' class='text-muted mt8'><i class='fa fa-tag'/> <t t-esc='categ_title' /></div>
+            <div t-if='not hide_title' class='text-muted mt8'><i class='fa fa-tag' role="img" aria-label="Tag category" title="Tag category"/> <t t-esc='categ_title' /></div>
             <t t-foreach="tags" t-as="tag">
                 <t t-if="tag.post_ids">
                     <li t-att-class="tag.id in active_tag_ids and 'active' or None">
@@ -439,15 +439,15 @@
         <ul class="nav nav-pills nav-stacked">
             <t t-foreach="nav_list" t-as="year">
                 <li data-toggle="collapse" t-att-data-target="'#' + year" aria-expanded="false" class="blog_post_year_collapse mt8">
-                    <i t-attf-class="fa #{'fa-chevron-down' if not date and year_index == 0 else 'fa-chevron-right'} mr4"/><span t-esc="year"/>
+                    <i t-attf-class="fa #{'fa-chevron-down' if not date and year_index == 0 else 'fa-chevron-right'} mr4" role="img" aria-label="Next year" title="Next year"/><span t-esc="year"/>
                 </li>
                 <ul t-attf-class="blog_post_year collapse nav nav-pills nav-stacked #{not date and year_index == 0 and 'in'}" t-att-id="year" role="menu">
                     <t t-foreach="nav_list[year]" t-as="months">
                         <li t-if="months['date_begin'] == date" class="active">
-                            <a t-ignore="True" t-attf-href="#{blog_url(date_begin=False, date_end=False)}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['post_date_count']"/></a>
+                            <a role="menuitem" t-ignore="True" t-attf-href="#{blog_url(date_begin=False, date_end=False)}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['post_date_count']"/></a>
                         </li>
                         <li t-else="1">
-                            <a t-ignore="True" t-attf-href="#{blog_url(date_begin=months['date_begin'], date_end=months['date_end'])}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['post_date_count']"/></a>
+                            <a role="menuitem" t-ignore="True" t-attf-href="#{blog_url(date_begin=months['date_begin'], date_end=months['date_end'])}"><t t-esc="months['month']"/><span class="pull-right badge" t-esc="months['post_date_count']"/></a>
                         </li>
                     </t>
                 </ul>
@@ -493,13 +493,13 @@
                 Participate on our social stream.
             </p>
             <h2 class="mt4">
-                <a t-att-href="website.social_facebook" t-if="website.social_facebook"><i class="fa fa-facebook-square"/></a>
-                <a t-att-href="website.social_twitter" t-if="website.social_twitter"><i class="fa fa-twitter"/></a>
-                <a t-att-href="website.social_linkedin" t-if="website.social_linkedin"><i class="fa fa-linkedin"/></a>
-                <a t-att-href="website.social_youtube" t-if="website.social_youtube"><i class="fa fa-youtube-play"/></a>
-                <a t-att-href="website.social_googleplus" t-if="website.social_googleplus"><i class="fa fa-google-plus-square"/></a>
-                <a t-att-href="website.social_github" t-if="website.social_github"><i class="fa fa-github"/></a>
-                <a t-att-href="'/blog/%s/feed' % (blog.id)"><i class="fa fa-rss-square"/></a>
+                <a t-att-href="website.social_facebook" t-if="website.social_facebook" aria-label="Facebook" title="Facebook"><i class="fa fa-facebook-square"/></a>
+                <a t-att-href="website.social_twitter" t-if="website.social_twitter" aria-label="Twitter" title="Twitter"><i class="fa fa-twitter"/></a>
+                <a t-att-href="website.social_linkedin" t-if="website.social_linkedin" aria-label="LinkedIn" title="LinkedIn"><i class="fa fa-linkedin"/></a>
+                <a t-att-href="website.social_youtube" t-if="website.social_youtube" aria-label="Youtube" title="Youtube"><i class="fa fa-youtube-play"/></a>
+                <a t-att-href="website.social_googleplus" t-if="website.social_googleplus" aria-label="Google Plus" title="Google Plus"><i class="fa fa-google-plus-square"/></a>
+                <a t-att-href="website.social_github" t-if="website.social_github" aria-label="Github" title="Github"><i class="fa fa-github"/></a>
+                <a t-att-href="'/blog/%s/feed' % (blog.id)" aria-label="RSS" title="RSS"><i class="fa fa-rss-square"/></a>
             </h2>
         </section>
     </xpath>
@@ -552,7 +552,7 @@
 <!-- User Navbar -->
 <template id="content_new_blogpost" inherit_id="website.user_navbar">
     <xpath expr="//div[@id='o_new_content_menu_choices']//ul" position="inside">
-        <li groups="website.group_website_designer"><a href="#" data-action="new_blog_post"><i class="fa fa-rss"/><p>New Blog Post</p></a></li>
+        <li groups="website.group_website_designer"><a href="#" data-action="new_blog_post"><p class="fa fa-rss">New Blog Post</p></a></li>
     </xpath>
 </template>
 
diff --git a/addons/website_blog/views/website_blog_views.xml b/addons/website_blog/views/website_blog_views.xml
index bb0b3833cab1..c2f18ddfbe63 100644
--- a/addons/website_blog/views/website_blog_views.xml
+++ b/addons/website_blog/views/website_blog_views.xml
@@ -136,10 +136,10 @@
                                         <span t-esc="record.blog_id.value"/>
                                     </strong>
                                     <div class="col-xs-8">
-                                        <i class="fa fa-clock-o"/><span t-esc="record.post_date.value"/>
+                                        <i class="fa fa-clock-o" role="img" aria-label="Post date" title="Post date"/><span t-esc="record.post_date.value"/>
                                     </div>
                                     <div class="col-xs-4 text-right">
-                                        <img t-att-src="kanban_image('res.partner', 'image_small', record.author_id.raw_value)" t-att-title="record.author_id.value" width="24" height="24" class="oe_kanban_avatar"/>
+                                        <img t-att-src="kanban_image('res.partner', 'image_small', record.author_id.raw_value)" t-att-title="record.author_id.value" t-att-alt="record.author_id.value" width="24" height="24" class="oe_kanban_avatar"/>
                                     </div>
                                 </div>
                             </div>
diff --git a/addons/website_crm/views/website_crm_templates.xml b/addons/website_crm/views/website_crm_templates.xml
index 6cafa2e4442a..d5fa52268de5 100644
--- a/addons/website_crm/views/website_crm_templates.xml
+++ b/addons/website_crm/views/website_crm_templates.xml
@@ -42,7 +42,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-md-offset-3 col-sm-offset-4 col-sm-8 col-md-7">
-                                <span class="btn btn-primary btn-lg o_website_form_send">Send</span>
+                                <a href="#" role="button" class="btn btn-primary btn-lg o_website_form_send">Send</a>
                                 <span id="o_website_form_result"></span>
                             </div>
                         </div>
@@ -65,7 +65,7 @@
                         <h1>Thanks!</h1>
                         <div class="row">
                             <div class="col-md-8">
-                                <div class="alert alert-success">
+                                <div class="alert alert-success" role="status">
                                     Your message has been sent successfully.
                                     <button type="button" class="close" data-dismiss="alert">&amp;times;</button>
                                 </div>
@@ -75,8 +75,8 @@
                                     If you have an emergency, do not hesitate to contact us by phone:
                                 </p>
                                 <ul class="list-unstyled">
-                                    <li><i class="fa fa-phone"></i> : <span t-field="res_company.phone"/></li>
-                                    <li><i class="fa fa-envelope"></i> : <span t-field="res_company.email"/></li>
+                                    <li><i class="fa fa-phone" role="img" aria-label="Phone" title="Phone"></i> : <span t-field="res_company.phone"/></li>
+                                    <li><i class="fa fa-envelope" role="img" aria-label="Email" title="Email"></i> : <span t-field="res_company.email"/></li>
                                 </ul>
                             </div>
                             <div class="col-md-4">
diff --git a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
index ed4549f73914..e90186a5aa25 100644
--- a/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
+++ b/addons/website_crm_partner_assign/views/website_crm_partner_assign_templates.xml
@@ -113,20 +113,20 @@
     <xpath expr="//ul[@id='reseller_countries']" position="after">
         <t t-if="google_maps_api_key">
             <!-- modal for large map -->
-            <div class="modal fade partner_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
+            <div role="dialog" class="modal fade partner_map_modal" tabindex="-1">
               <div class="modal-dialog modal-lg">
                 <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <header class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                         <h4 class="modal-title">World Map</h4>
-                    </div>
+                    </header>
                     <iframe t-attf-src="/google_map/?width=898&amp;height=485&amp;partner_ids=#{ google_map_partner_ids }&amp;partner_url=/partners/"
                     style="width:898px; height:485px; border:0; padding:0; margin:0;"></iframe>
                 </div>
               </div>
             </div>
             <!-- modal end -->
-            <h3>World Map<button class="btn btn-link" data-toggle="modal" data-target=".partner_map_modal"><span class="fa fa-external-link" /></button></h3>
+            <h3>World Map<button class="btn btn-link" data-toggle="modal" data-target=".partner_map_modal"><span class="fa fa-external-link" role="img" aria-label="External link" title="External link"/></button></h3>
             <ul class="nav">
                 <iframe t-attf-src="/google_map?width=260&amp;height=240&amp;partner_ids=#{ google_map_partner_ids }&amp;partner_url=/partners/"
                     style="width:260px; height:240px; border:0; padding:0; margin:0;" scrolling="no"></iframe>
@@ -263,17 +263,17 @@
         <t t-call="portal.portal_layout">
             <t t-call="portal.portal_searchbar">
                 <t t-set="title">My Opportunities</t>
-                <li class="pull-left"><button t-if="request.env.user.partner_id.grade_id or request.env.user.commercial_partner_id.grade_id" name='new_opp' data-toggle="modal" data-target=".modal_new_opp" class="btn btn-default navbar-btn ml16"><i class="fa fa-plus"/></button></li>
+                <li class="pull-left"><button t-if="request.env.user.partner_id.grade_id or request.env.user.commercial_partner_id.grade_id" name='new_opp' data-toggle="modal" data-target=".modal_new_opp" class="btn btn-default navbar-btn ml16" title="Add an opportunity" aria-label="Add an opportunity"><i class="fa fa-plus"/></button></li>
             </t>
             <div class="modal fade modal_new_opp" role="form" aria-hidden="true">
                 <div class="modal-dialog">
                     <form method="POST" class="modal-content js_website_submit_form new_opp_form">
                         <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
-                        <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                        <header class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                             <h4 class="modal-title">New Opportunity</h4>
-                        </div>
-                        <div class="modal-body" id="new-opp-dialog">
+                        </header>
+                        <main class="modal-body" id="new-opp-dialog">
                             <div class="form-group">
                                 <label class="control-label hdd4" for="contact_name">Contact name</label>
                                 <input type='text' name="contact_name" class="form-control contact_name"/>
@@ -286,11 +286,11 @@
                                 <label class="control-label hdd4" for="description">Description</label>
                                 <textarea row="3" name="description" class="form-control description"></textarea>
                             </div>
-                        </div>
-                        <div class="modal-footer">
+                        </main>
+                        <footer class="modal-footer">
                             <button t-attf-class="btn btn-primary new_opp_confirm">Confirm</button> or
                             <button type="button" class="btn btn-link" data-dismiss="modal" style="padding: 0">Cancel</button>
-                        </div>
+                        </footer>
                     </form>
                 </div>
             </div>
@@ -339,7 +339,7 @@
                 <div class="panel-heading">
                     <div class="row">
                         <div class="col-md-12">
-                            <span class="pull-right" title="Rating">
+                            <span class="pull-right" title="Rating" role="img" t-attf-aria-label="Rating: #{lead.priority} on 3">
                                 <t t-foreach="range(1, 4)" t-as="i">
                                     <span t-attf-class="fa fa-lg fa-star#{'' if i &lt;= int(lead.priority) else '-o'}"/>
                                 </t>
@@ -360,13 +360,13 @@
                                     <span t-if="not lead.partner_name" itemprop="name" t-field="lead.contact_name"/>
                                 </div>
                                 <div t-if="lead.phone">
-                                    <span class="fa fa-phone" /> <span itemprop="telephone" t-field="lead.phone" />
+                                    <span class="fa fa-phone" role="img" aria-label="Phone" title="Phone"/> <span itemprop="telephone" t-field="lead.phone" />
                                 </div>
                                 <div t-if="lead.mobile">
-                                    <span class="fa fa-mobile" /> <span itemprop="telephone" t-field="lead.mobile" />
+                                    <span class="fa fa-mobile" role="img" aria-label="Mobile" title="Mobile"/> <span itemprop="telephone" t-field="lead.mobile" />
                                 </div>
                                 <div t-if="lead.email_from">
-                                    <span class="fa fa-envelope"/> <span itemprop="email" t-field="lead.email_from" />
+                                    <span class="fa fa-envelope" role="img" aria-label="Email" title="Email"/> <span itemprop="email" t-field="lead.email_from" />
                                 </div>
                             </address>
                         </div>
@@ -421,18 +421,18 @@
                 </div>
             </div>
             <div>
-                <a class="btn btn-primary btn" data-toggle="modal" data-target=".modal_partner_assign_interested"><i class="fa fa-file-text-o"/> I'm interested</a>
-                <a class="btn btn-primary btn" data-toggle="modal" data-target=".modal_partner_assign_desinterested"><i class="fa fa-fw fa-times"/> I'm not interested</a>
-                <div class="modal fade modal_partner_assign_interested" role="form" aria-hidden="true">
+              <a role="button" class="btn btn-primary btn" data-toggle="modal" data-target=".modal_partner_assign_interested"><span class="fa fa-file-text-o"> I'm interested</span></a>
+                  <a role="button" class="btn btn-primary btn" data-toggle="modal" data-target=".modal_partner_assign_desinterested"><span class="fa fa-fw fa-times"> I'm not interested</span></a>
+                <div role="dialog" class="modal fade modal_partner_assign_interested" aria-hidden="true">
                     <div class="modal-dialog">
                         <form method="POST" class="js_accept_json modal-content js_website_submit_form interested_partner_assign_form">
                             <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
                             <input type="hidden" name="lead_id" class="assign_lead_id" t-att-value="lead.id"/>
-                            <div class="modal-header">
-                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                            <header class="modal-header">
+                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                                 <h4 class="modal-title">Lead Feedback</h4>
-                            </div>
-                            <div class="modal-body" id="sign-dialog">
+                            </header>
+                            <main class="modal-body" id="sign-dialog">
                                 <div class="form-group">
                                     <label class="control-label" for="comment">What is the next action? When? What is the expected revenue?</label>
                                     <input type="text" name="comment" id="comment" class="form-control comment_interested"/>
@@ -444,24 +444,24 @@
                                 <div>
                                     <span class="text-danger error_partner_assign_interested" style="display:none;">You need to fill up the next action and contact the customer before accepting the lead</span>
                                 </div>
-                            </div>
-                            <div class="modal-footer">
+                            </main>
+                            <footer class="modal-footer">
                                 <button t-attf-class="btn btn-primary interested_partner_assign_confirm">Confirm</button>
                                 <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
-                            </div>
+                            </footer>
                         </form>
                     </div>
                 </div>
-                <div class="modal fade modal_partner_assign_desinterested" role="form" aria-hidden="true">
+                <div role="dialog" class="modal fade modal_partner_assign_desinterested" aria-hidden="true">
                     <div class="modal-dialog">
                         <form method="POST" class="js_accept_json modal-content js_website_submit_form desinterested_partner_assign_form">
                             <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
                             <input type="hidden" name="lead_id" class="assign_lead_id" t-att-value="lead.id"/>
-                            <div class="modal-header">
-                                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                            <header class="modal-header">
+                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                                 <h4 class="modal-title">Lead Feedback</h4>
-                            </div>
-                            <div class="modal-body" id="sign-dialog">
+                            </header>
+                            <main class="modal-body" id="sign-dialog">
                                 <div class="form-group">
                                     <label class="control-label" for="comment">Why aren't you interested by this lead?</label>
                                     <input type="text" name="comment" id="comment" class="form-control comment_desinterested"/>
@@ -477,11 +477,11 @@
                                 <div>
                                     <span class="text-danger error_partner_assign_desinterested" style="display:none;">You need to fill up the next action and contact the customer before accepting the lead</span>
                                 </div>
-                            </div>
-                            <div class="modal-footer">
+                            </main>
+                            <footer class="modal-footer">
                                 <button t-attf-class="btn btn-primary desinterested_partner_assign_confirm">Confirm</button>
                                 <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
-                            </div>
+                            </footer>
                         </form>
                     </div>
                 </div>
@@ -525,9 +525,9 @@
                                 <strong>Expected Closing: <span t-field="opportunity.date_deadline" /></strong>
                         </div>
                         <div class="col-md-4">
-                            <span class="pull-right" title="Rating">
+                            <span class="pull-right" title="Rating" role="img" t-attf-aria-label="Rating: #{opportunity.priority} on 4">
                                 <t t-foreach="range(1, 4)" t-as="i">
-                                    <span t-attf-class="fa fa-lg fa-star#{'' if i &lt;= int(opportunity.priority) else '-o'}"/>
+                                    <span t-attf-class="fa fa-lg fa-star#{'' if i &lt;= int(opportunity.priority) else '-o'}" role="img" t-att-aria-label="'Star %d of 3' % i"/>
                                 </t>
                             </span>
                         </div>
@@ -537,16 +537,16 @@
                     <div class="col-md-6">
                         <div>
                             <button type="button" data-toggle="modal" data-target=".modal_edit_contact" class="btn btn-sm btn-primary" style="margin-bottom: 10px;">Edit Contact</button>
-                            <div class="modal fade modal_edit_contact" role="form" aria-hidden="true">
+                            <div role="dialog" class="modal fade modal_edit_contact" aria-hidden="true">
                                 <div class="modal-dialog">
                                     <form method="POST" class="js_accept_json modal-content js_website_submit_form edit_contact_form">
                                         <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
                                         <input type="hidden" name="opportunity_id" class="opportunity_id" t-att-value="opportunity.id"/>
-                                        <div class="modal-header">
-                                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                                        <header class="modal-header">
+                                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                                             <h4 class="modal-title">Edit Contact</h4>
-                                        </div>
-                                        <div class="modal-body" id="sign-dialog">
+                                        </header>
+                                        <main class="modal-body" id="sign-dialog">
                                             <t t-if="opportunity.partner_name">
                                                 <div class="form-group">
                                                     <label class="control-label" for="partner_name">Customer Name</label>
@@ -608,11 +608,11 @@
                                                     </t>
                                                 </select>
                                             </div>
-                                        </div>
-                                        <div class="modal-footer">
+                                        </main>
+                                        <footer class="modal-footer">
                                             <button t-attf-class="btn btn-primary edit_contact_confirm">Confirm</button>
                                             <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
-                                        </div>
+                                        </footer>
                                     </form>
                                 </div>
                             </div>
@@ -625,13 +625,13 @@
                                     <span t-if="not opportunity.partner_name" itemprop="name" t-field="opportunity.contact_name" />
                                 </div>
                                 <div t-if="opportunity.phone">
-                                    <span class="fa fa-phone" /> <span itemprop="telephone" t-field="opportunity.phone" />
+                                    <span class="fa fa-phone" role="img" aria-label="Phone" title="Phone"/> <span itemprop="telephone" t-field="opportunity.phone" />
                                 </div>
                                 <div t-if="opportunity.mobile">
-                                    <span class="fa fa-mobile" /> <span itemprop="mobile" t-field="opportunity.mobile" />
+                                    <span class="fa fa-mobile" role="img" aria-label="Mobile" title="Mobile"/> <span itemprop="mobile" t-field="opportunity.mobile" />
                                 </div>
                                 <div t-if="opportunity.email_from">
-                                    <span class="fa fa-envelope"/> <span itemprop="email" t-field="opportunity.email_from" />
+                                    <span class="fa fa-envelope" role="img" aria-label="Email" title="Email"/> <span itemprop="email" t-field="opportunity.email_from" />
                                 </div>
                             </address>
                         </div>
@@ -652,16 +652,16 @@
                     <div class="col-md-6">
                         <div>
                             <button type="button" data-toggle="modal" data-target=".modal_edit_opp" class="btn btn-sm btn-primary" style="margin-bottom: 10px;">Edit Opportunity</button>
-                            <div class="modal fade modal_edit_opp" role="form" aria-hidden="true">
+                            <div role="dialog" class="modal fade modal_edit_opp" aria-hidden="true">
                                 <div class="modal-dialog">
                                     <form method="POST" class="js_accept_json modal-content js_website_submit_form edit_opp_form">
                                         <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
                                         <input type="hidden" name="opportunity_id" class="opportunity_id" t-att-value="opportunity.id"/>
-                                        <div class="modal-header">
-                                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                                        <header class="modal-header">
+                                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                                             <h4 class="modal-title">Edit Opportunity</h4>
-                                        </div>
-                                        <div class="modal-body" id="sign-dialog">
+                                        </header>
+                                        <main class="modal-body" id="sign-dialog">
                                             <div class="form-group">
                                                 <div class="row">
                                                     <div class="col-sm-6">
@@ -687,16 +687,16 @@
                                                       <label>Priority: </label>
                                                       <div class="input-group">
                                                         <label class="radio-inline">
-                                                          <input type="radio" name="PriorityRadioOptions" value="0" t-att-checked="opportunity.priority not in ['1','2','3']"/><i class="fa fa-star-o"></i>
+                                                          <input type="radio" name="PriorityRadioOptions" value="0" t-att-checked="opportunity.priority not in ['1','2','3']" aria-label="Rating: 0 on 3" title="Rating: 0 on 3"/><i class="fa fa-star-o"></i>
                                                         </label>
                                                         <label class="radio-inline">
-                                                          <input type="radio" name="PriorityRadioOptions" value="1" t-att-checked="opportunity.priority == '1'"/><i class="fa fa-star"></i>
+                                                          <input type="radio" name="PriorityRadioOptions" value="1" t-att-checked="opportunity.priority == '1'" aria-label="Rating: 1 on 3" title="Rating: 1 on 3"/><i class="fa fa-star"></i>
                                                         </label>
                                                         <label class="radio-inline">
-                                                          <input type="radio" name="PriorityRadioOptions" value="2" t-att-checked="opportunity.priority == '2'"/><i class="fa fa-star"></i><i class="fa fa-star"></i>
+                                                          <input type="radio" name="PriorityRadioOptions" value="2" t-att-checked="opportunity.priority == '2'" aria-label="Rating: 2 on 3" title="Rating: 2 on 3"/><i class="fa fa-star"></i><i class="fa fa-star"></i>
                                                         </label>
                                                         <label class="radio-inline">
-                                                          <input type="radio" name="PriorityRadioOptions" value="3" t-att-checked="opportunity.priority == '3'"/><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i>
+                                                          <input type="radio" name="PriorityRadioOptions" value="3" t-att-checked="opportunity.priority == '3'" aria-label="Rating: 3 on 3" title="Rating: 3 on 3"/><i class="fa fa-star"></i><i class="fa fa-star"></i><i class="fa fa-star"></i>
                                                         </label>
                                                       </div>
                                                     </div>
@@ -704,7 +704,7 @@
                                                         <label>Deadline: </label>
                                                         <div class='input-group date'>
                                                             <input type="text" name="date_deadline" t-att-value="opportunity.date_deadline" class="form-control date_deadline" data-date-format="YYYY-MM-DD" t-att-name="prefix" placeholder="YYYY-MM-DD" />
-                                                            <span class="input-group-addon"><span class="fa fa-calendar"></span></span>
+                                                            <span class="input-group-addon"><span class="fa fa-calendar" role="img" aria-label="Calendar"></span></span>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -725,14 +725,14 @@
                                                 <label class="control-label" for="activity_date_deadline">Next Activity Date</label>
                                                 <div class='input-group date'>
                                                     <input type="text" name="activity_date_deadline" t-att-value="user_activity.date_deadline" class="form-control activity_date_deadline" data-date-format="YYYY-MM-DD" t-att-name="prefix" placeholder="YYYY-MM-DD" />
-                                                    <span class="input-group-addon"><span class="fa fa-calendar"></span></span>
+                                                    <span class="input-group-addon"><span class="fa fa-calendar" role="img" aria-label="Calendar" title="Calendar"></span></span>
                                                 </div>
                                             </div>
-                                        </div>
-                                        <div class="modal-footer">
+                                        </main>
+                                        <footer class="modal-footer">
                                             <button t-attf-class="btn btn-primary edit_opp_confirm">Confirm</button>
                                             <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
-                                        </div>
+                                        </footer>
                                     </form>
                                 </div>
                             </div>
diff --git a/addons/website_customer/views/website_customer_templates.xml b/addons/website_customer/views/website_customer_templates.xml
index 2f2f8463cff4..d032843671f7 100644
--- a/addons/website_customer/views/website_customer_templates.xml
+++ b/addons/website_customer/views/website_customer_templates.xml
@@ -65,20 +65,20 @@
     <xpath expr="//div[@id='ref_left_column']" position="inside">
         <t t-if="google_maps_api_key">
             <!-- modal for large map -->
-            <div class="modal fade customer_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
+            <div role="dialog" class="modal fade customer_map_modal" tabindex="-1">
               <div class="modal-dialog modal-lg">
                 <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <header class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                         <h4 class="modal-title">World Map</h4>
-                    </div>
+                    </header>
                     <iframe t-attf-src="/google_map/?width=898&amp;height=485&amp;partner_ids=#{ google_map_partner_ids }&amp;partner_url=/customers/"
                     style="width:898px; height:485px; border:0; padding:0; margin:0;"></iframe>
                 </div>
               </div>
             </div>
             <!-- modal end -->
-            <h3>World Map<button class="btn btn-link" data-toggle="modal" data-target=".customer_map_modal"><span class="fa fa-external-link" /></button></h3>
+            <h3>World Map<button class="btn btn-link" data-toggle="modal" data-target=".customer_map_modal"><span class="fa fa-external-link" role="img" aria-label="External link" title="External link"/></button></h3>
             <ul class="nav">
                 <iframe t-attf-src="/google_map?width=260&amp;height=240&amp;partner_ids=#{ google_map_partner_ids }&amp;partner_url=/customers/"
                     style="width:260px; height:240px; border:0; padding:0; margin:0;" scrolling="no"></iframe>
@@ -130,7 +130,7 @@
         <h3 t-if="len(tags)">References by Tag</h3>
         <ul class="nav nav-pills nav-stacked mt16 mb32" t-if="len(tags)">
             <a class="mr8" t-attf-href="/customers/#{ current_industry_id and 'industry/%s/' % slug(current_industry) or '' }#{ current_country_id and 'country/%s' % slug(current_country) or '' }">
-                <span class="fa fa-1x fa-tags"/> All </a>
+                <span class="fa fa-1x fa-tags"> All </span></a>
             <t t-foreach="tags" t-as="o_tag">
                 <a t-attf-class="label label-#{o_tag.classname}" t-esc="o_tag.name" t-att-style="tag and tag.id==o_tag.id and 'text-decoration: underline'"
                     t-attf-href="/customers/#{ current_industry_id and 'industry/%s/' % slug(current_industry) or '' }#{ current_country_id and 'country/%s' % slug(current_country) or '' }?tag_id=#{slug(o_tag)}"/>
diff --git a/addons/website_event/static/src/js/website.tour.event.js b/addons/website_event/static/src/js/website.tour.event.js
index b08af0705e38..b5cd2738a7da 100644
--- a/addons/website_event/static/src/js/website.tour.event.js
+++ b/addons/website_event/static/src/js/website.tour.event.js
@@ -15,12 +15,12 @@ odoo.define("website_event.tour", function (require) {
         content: _t("Click here to create a new event."),
         position: "bottom",
     }, {
-        trigger: ".modal-dialog #editor_new_event input[type=text]",
+        trigger: '.modal-dialog #editor_new_event input[type=text]',
         content: _t("Create a name for your new event and click <em>\"Continue\"</em>. e.g: Technical Training"),
         position: "right",
     }, {
-        trigger: ".modal-dialog button.btn-primary.btn-continue",
-        extra_trigger: ".modal-dialog #editor_new_event input[type=text][value!=\"\"]",
+        trigger: 'footer.modal-footer button.btn-primary.btn-continue',
+        extra_trigger: '#editor_new_event input[type=text][value!=""]',
         content: _t("Click <em>Continue</em> to create the event."),
         position: "right",
     }, {
diff --git a/addons/website_event/static/src/js/website_event.js b/addons/website_event/static/src/js/website_event.js
index 53a304c707e3..348d3d0f16ee 100644
--- a/addons/website_event/static/src/js/website_event.js
+++ b/addons/website_event/static/src/js/website_event.js
@@ -60,7 +60,7 @@ var EventRegistrationForm = Widget.extend({
             return ajax.jsonRpc($form.attr('action'), 'call', post).then(function (modal) {
                 var $modal = $(modal);
                 $modal.modal({backdrop: 'static', keyboard: false});
-                $modal.find('.modal-body > div').removeClass('container'); // retrocompatibility - REMOVE ME in master / saas-19
+                $modal.find('main.modal-body > div').removeClass('container'); // retrocompatibility - REMOVE ME in master / saas-19
                 $modal.insertAfter($form).modal();
                 $modal.on('click', '.js_goto_event', function () {
                     $modal.modal('hide');
diff --git a/addons/website_event/views/event_templates.xml b/addons/website_event/views/event_templates.xml
index 91ebbd69b8c0..902fc4107867 100644
--- a/addons/website_event/views/event_templates.xml
+++ b/addons/website_event/views/event_templates.xml
@@ -59,7 +59,7 @@
                                     </t>
                                 </div>
                                 <div>
-                                    <i class="fa fa-clock-o"></i> <span itemprop="startDate" t-field="event.with_context(tz=event.date_tz).date_begin" t-options='{"hide_seconds":"True"}'> </span> <i>to</i> <span itemprop="endDate" t-field="event.with_context(tz=event.date_tz).date_end" t-options='{"hide_seconds":"True"}'> </span>
+                                    <i class="fa fa-clock-o" role="img" aria-label="Start date" title="Start date"></i> <span itemprop="startDate" t-field="event.with_context(tz=event.date_tz).date_begin" t-options='{"hide_seconds":"True"}'> </span> <i>to</i> <span itemprop="endDate" t-field="event.with_context(tz=event.date_tz).date_end" t-options='{"hide_seconds":"True"}'> </span>
                                 </div>
                                 <t t-if="not event.is_online">
                                     <div itemprop="location" t-field="event.address_id" t-options='{
@@ -68,7 +68,7 @@
                                         }'/>
                                 </t>
                                 <div class="text-muted" t-if="event.event_type_id">
-                                    <i class="fa fa-tag"></i> <span t-field="event.event_type_id"/>
+                                    <i class="fa fa-tag" role="img" aria-label="Event type" title="Event type"></i> <span t-field="event.event_type_id"/>
                                 </div>
                             </div>
                         </li>
@@ -93,13 +93,13 @@
         <div class="row">
             <div class="col-md-12 mb16">
                 <div class="oe_demo">
-                    <img src="/website_event/static/src/img/openerp_enterprise_of_the_year.png" class="img-rounded"/>
+                    <img src="/website_event/static/src/img/openerp_enterprise_of_the_year.png" class="img-rounded" alt=""/>
                     <div class="text-center"><a href="/event">Photos of Past Events</a></div>
                 </div>
             </div>
             <div class="col-md-12 mb16">
                 <div class="oe_demo">
-                    <img src="/website_event/static/src/img/training.jpg" class="img-rounded"/>
+                    <img src="/website_event/static/src/img/training.jpg" class="img-rounded" alt=""/>
                     <div class="text-center"><a href="/event">Our Trainings</a></div>
                 </div>
             </div>
@@ -130,10 +130,7 @@
             <div class="col-md-12 mb16 mt16 country_events">
                 <div class="country_events_list">
                     <div class="text-muted text-center">
-                        <h1>
-                            <i class="fa fa-flag fa-5x"></i>
-                        </h1>
-                        <h1>Events from Your Country</h1>
+                        <h1 class="fa fa-flag fa-5x">Events from Your Country</h1>
                     </div>
                 </div>
             </div>
@@ -271,7 +268,7 @@
                 <small t-if="event.is_participating" class="label label-info">Participating</small>
             </div>
             <h4 class="text-center text-muted">
-                <i class="fa fa-clock-o"></i> <span itemprop="startDate" t-field="event.with_context(tz=event.date_tz).date_begin" t-options='{"hide_seconds":"True"}'/> to
+                <i class="fa fa-clock-o" role="img" aria-label="Start date" title="Start date"></i> <span itemprop="startDate" t-field="event.with_context(tz=event.date_tz).date_begin" t-options='{"hide_seconds":"True"}'/> to
                 <span itemprop="endDate" t-field="event.with_context(tz=event.date_tz).date_end" t-options='{"hide_seconds":"True"}'/>
                 <t t-if="event.date_tz">(<span t-field="event.date_tz"/>)</t>
             </h4>
@@ -304,7 +301,7 @@
 <template id="event_description_full">
     <t t-call="website_event.event_details">
         <div class="col-md-8">
-            <div t-if="event.state == 'done' or not registrable" class="alert alert-info">Registration for this event is now closed</div>
+            <div t-if="event.state == 'done' or not registrable" class="alert alert-info" role="status">Registration for this event is now closed</div>
             <t t-if="event.state != 'done' and registrable" t-call="website_event.registration_template"/>
             <div class="clearfix"/>
             <hr/>
@@ -337,7 +334,7 @@
                     <div class="panel-body">
                         <t t-if="event.google_map_img()">
                             <a t-att-href="event.google_map_link()" target="_BLANK">
-                               <img t-att-src="event.google_map_img()" width="100%%"/>
+                               <img t-att-src="event.google_map_img()" width="100%%" alt="Google Maps"/>
                             </a>
                         </t>
                         <t t-else="1">
@@ -356,8 +353,8 @@
                     <h4>When</h4>
                 </div>
                 <div class="panel-body">
-                    <i class="fa fa-clock-o"></i> From <span t-field="event.with_context(tz=event.date_tz).date_begin" t-options='{"hide_seconds":"True"}'> </span><br/>
-                    <i class="fa fa-clock-o"></i> To <span t-field="event.with_context(tz=event.date_tz).date_end" t-options='{"hide_seconds":"True"}'> </span>
+                    <span class="fa fa-clock-o"> From</span> <span t-field="event.with_context(tz=event.date_tz).date_begin" t-options='{"hide_seconds":"True"}'> </span><br/>
+                        <span class="fa fa-clock-o"> To</span> <span t-field="event.with_context(tz=event.date_tz).date_end" t-options='{"hide_seconds":"True"}'> </span>
                 </div>
             </div>
 
@@ -466,7 +463,7 @@
                 </div>
             </div>
         </form>
-        <div t-if="not buy" class="alert alert-info">
+        <div t-if="not buy" class="alert alert-info" role="status">
             <t t-if="event.state == 'draft'" itemprop="availability" content="http://schema.org/OutOfStock">
                 Event registration not yet started.
             </t>
@@ -475,8 +472,8 @@
             </t>
             <t t-if="uid">
                 <a t-attf-href="/web#id=#{event.id}&amp;view_type=form&amp;model=event.event">
-                    <i class="fa fa-plus-circle"></i>
-                    <em>Configure and Launch Event Registration</em>
+                    <span class="fa fa-plus-circle">
+                        <em>Configure and Launch Event Registration</em></span>
                 </a>
             </t>
         </div>
@@ -525,16 +522,16 @@
 </template>
 
 <template id="registration_attendee_details" name="Registration Attendee Details">
-    <div id="modal_attendees_registration" class="modal fade" tabindex="-1" role="dialog">
+    <div role="dialog" id="modal_attendees_registration" class="modal fade" tabindex="-1">
         <div class="modal-dialog modal-lg">
             <form id="attendee_registration" t-attf-action="/event/#{slug(event)}/registration/confirm" method="post" class="js_website_submit_form">
                 <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
                 <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+                    <header class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">x</button>
                         <h4 class="modal-title" id="myModalLabel"><strong>Attendees</strong></h4>
-                    </div>
-                    <div class="modal-body">
+                    </header>
+                    <main class="modal-body">
                         <div class="container">
                             <t t-set="counter_type" t-value="1"/>
                             <t t-set="counter" t-value="0"/>
@@ -563,13 +560,13 @@
                                 <t t-set="counter_type" t-value="counter_type + 1"/>
                             </t>
                         </div>
-                    </div>
-                    <div class="modal-footer">
+                    </main>
+                    <footer class="modal-footer">
                         <div class="pull-left">
                             <button type="submit" class="btn btn-primary">Continue</button>
                             <button type="button" class="btn btn-default js_goto_event" data-dismiss="modal">Cancel Registration</button>
                         </div>
-                    </div>
+                    </footer>
                 </div>
             </form>
         </div>
@@ -586,13 +583,13 @@
                 </div>
                 <div class="col-md-9 mt16">
                     <h4><a t-attf-href="/event/#{slug(event)}"><t t-esc="event.name"/></a></h4>
-                    <i class="fa fa-clock-o"></i> <span itemprop="startDate" t-esc="event.date_begin_located"> </span> <i>to</i> <span itemprop="endDate" t-esc="event.date_end_located"> </span>
+                    <i class="fa fa-clock-o" role="img" aria-label="Start date" title="Start date"></i> <span itemprop="startDate" t-esc="event.date_begin_located"> </span> <i>to</i> <span itemprop="endDate" t-esc="event.date_end_located"> </span>
                     <div id="add_to_calendar" class="mt4">
-                        <a class="btn btn-primary mr8" t-att-href="iCal_url">
-                            <i class="fa fa-fw fa-arrow-right"/>Add to iCal/Outlook
+                        <a role="button" class="btn btn-primary mr8" t-att-href="iCal_url">
+                            <span class="fa fa-fw fa-arrow-right">Add to iCal/Outlook</span>
                         </a>
-                        <a class="btn btn-primary" t-att-href="google_url" target='_blank'>
-                            <i class="fa fa-fw fa-arrow-right"/>Add to Google Calendar
+                        <a role="button" class="btn btn-primary" t-att-href="google_url" target='_blank'>
+                            <span class="fa fa-fw fa-arrow-right">Add to Google Calendar</span>
                         </a>
                     </div>
                     <div itemprop="location" class="mt16 mb8" t-field="event.address_id" t-options='{
@@ -617,9 +614,9 @@
                             <t t-foreach="attendees" t-as="attendee">
                                 <tr>
                                     <td><t t-esc="attendee.id"/></td>
-                                    <td><i class="fa fa-user"></i> <t t-if='attendee.name'><t t-esc="attendee.name"/></t><t t-if='not attendee.name'>N/A</t></td>
-                                    <td><i class="fa fa-envelope"></i> <t t-if='attendee.email'><t t-esc="attendee.email"/></t><t t-if='not attendee.email'>N/A</t></td>
-                                    <td><i class="fa fa-phone"></i> <t t-if='attendee.phone'><t t-esc="attendee.phone"/></t><t t-if='not attendee.phone'>N/A</t></td>
+                                    <td><i class="fa fa-user" role="img" aria-label="Name" title="Name"></i> <t t-if='attendee.name'><t t-esc="attendee.name"/></t><t t-if='not attendee.name'>N/A</t></td>
+                                    <td><i class="fa fa-envelope" role="img" aria-label="Email" title="Email"></i> <t t-if='attendee.email'><t t-esc="attendee.email"/></t><t t-if='not attendee.email'>N/A</t></td>
+                                    <td><i class="fa fa-phone" role="img" aria-label="Phone" title="Phone"></i> <t t-if='attendee.phone'><t t-esc="attendee.phone"/></t><t t-if='not attendee.phone'>N/A</t></td>
                                 </tr>
                             </t>
                         </tbody>
@@ -640,7 +637,7 @@
         <div>
             <div class="oe_snippet_thumbnail">
                 <div style="background: white;box-shadow:none;-webkit-box-shadow:none;" class="oe_snippet_thumbnail_img" >
-                    <i class="fa fa-flag fa-5x text-muted"></i>
+                    <i class="fa fa-flag fa-5x text-muted" title="Local Events" role="img" aria-label="Local Events"></i>
                 </div>
                 <span class="oe_snippet_thumbnail_title">Local Events</span>
             </div>
@@ -648,7 +645,7 @@
                 <div class="country_events_list">
                     <div class="text-muted text-left">
                         <div>
-                            <img class="img-rounded img-responsive" src="/website_event/static/src/img/world_map.jpg"></img>
+                            <img class="img-rounded img-responsive" src="/website_event/static/src/img/world_map.jpg" alt=""></img>
                         </div>
                         <div>Events in visitor's country</div>
                     </div>
@@ -673,22 +670,22 @@
             <div class="country_events_list">
                 <div>
                     <t t-if="country">
-                        <img class="img-rounded img-responsive" t-att-src="website.image_url(country, 'image')"></img>
+                        <img class="img-rounded img-responsive" t-att-src="website.image_url(country, 'image')" alt=""></img>
                         <h4><b>Events: <span t-esc="country.name"></span></b></h4>
                     </t>
                     <t t-if="not country">
-                        <img class="img-rounded img-responsive" src="/website_event/static/src/img/world_map.jpg"></img>
+                        <img class="img-rounded img-responsive" src="/website_event/static/src/img/world_map.jpg" alt=""></img>
                         <h4><b>Upcoming Events</b></h4>
                     </t>
                     <div t-foreach="events[:5]" t-as="event_dict" class="oe_website_overflow_ellipsis mb8">
                         <t t-if="not event_dict['event'].website_published">
-                            <span class="label label-danger"><i class="fa fa-ban"></i></span>
+                            <span class="label label-danger" role="img" aria-label="Attention: not published" title="Not published"><i class="fa fa-ban"></i></span>
                         </t>
                         <t t-if="event_dict['event'].address_id">
-                            <i class="fa fa-map-marker" title="It is a physical event"></i>
+                            <i class="fa fa-map-marker" title="It is a physical event" role="img" aria-label="It is a physical event"></i>
                         </t>
                         <t t-if="not event_dict['event'].address_id">
-                            <i class="fa fa-cloud" title="It is an online event"></i>
+                            <i class="fa fa-cloud" title="It is an online event" role="img" aria-label="It is an online event"></i>
                         </t>
                         <b><span t-esc="event_dict['date']"/>: <span><a t-att-href="event_dict['url']"><t t-esc="event_dict['event'].name"/></a></span></b>
                     </div>
@@ -719,7 +716,7 @@
 <!-- User Navbar -->
 <template id="content_new_event" inherit_id="website.user_navbar">
     <xpath expr="//div[@id='o_new_content_menu_choices']//ul" position="inside">
-        <li groups="event.group_event_manager"><a href="#" data-action="new_event"><i class="fa fa-glass"/><p>New Event</p></a></li>
+        <li groups="event.group_event_manager"><a href="#" data-action="new_event"><p class="fa fa-glass">New Event</p></a></li>
     </xpath>
 </template>
 </odoo>
diff --git a/addons/website_event_questions/views/event_templates.xml b/addons/website_event_questions/views/event_templates.xml
index 67d29fa44acd..c98e5b465b59 100644
--- a/addons/website_event_questions/views/event_templates.xml
+++ b/addons/website_event_questions/views/event_templates.xml
@@ -30,7 +30,7 @@
         </xpath>
 
         <!-- Generic questions -->
-        <xpath expr="//div[hasclass('modal-body')]/div/t[last()]" position="after">
+        <xpath expr='//div[@role="dialog"]//main/div/t[last()]' position="after">
             <t t-if="event.general_question_ids">
                 <h4 class="page-header mt8"><strong>Questions</strong></h4>
                 <div>
diff --git a/addons/website_event_track/views/event_track_templates.xml b/addons/website_event_track/views/event_track_templates.xml
index dbfceeb8ca67..40b693f3ff31 100644
--- a/addons/website_event_track/views/event_track_templates.xml
+++ b/addons/website_event_track/views/event_track_templates.xml
@@ -119,7 +119,7 @@
         <div id="left_column">
         </div>
         <div class="col-md-9">
-            <div class="alert alert-warning" t-if="not len(tracks)">
+            <div class="alert alert-warning" t-if="not len(tracks)" role="alert">
                 No tracks found!
             </div>
             <div class="row mb32" t-foreach="tracks" t-as="track">
diff --git a/addons/website_event_track/views/event_track_views.xml b/addons/website_event_track/views/event_track_views.xml
index 00a544c77556..efdeb374d04e 100644
--- a/addons/website_event_track/views/event_track_views.xml
+++ b/addons/website_event_track/views/event_track_views.xml
@@ -18,14 +18,14 @@
                             <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
                                 <div class="o_dropdown_kanban dropdown" groups="base.group_user">
 
-                                    <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                    <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                         <span class="fa fa-ellipsis-v"/>
                                     </a>
-                                    <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                        <li><a t-att-href="record.website_url.value">View Track</a></li>
-                                        <t t-if="widget.editable"><li><a type="edit">Edit Track</a></li></t>
-                                        <t t-if="widget.deletable"><li><a type="delete">Delete</a></li></t>
-                                        <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                    <ul class="dropdown-menu" role="menu">
+                                        <li><a role="menuitem" t-att-href="record.website_url.value">View Track</a></li>
+                                        <t t-if="widget.editable"><li><a role="menuitem" type="edit">Edit Track</a></li></t>
+                                        <t t-if="widget.deletable"><li><a role="menuitem" type="delete">Delete</a></li></t>
+                                        <li role="menuitem" aria-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                                     </ul>
                                 </div>
                                 <div class="oe_kanban_content">
@@ -44,7 +44,7 @@
                                         <div class="oe_kanban_bottom_right">
                                             <field name="kanban_state" widget="state_selection" groups="base.group_user"/>
                                             <img t-att-src="kanban_image('res.partner', 'image_small', record.partner_id.raw_value)"
-                                                t-att-title="record.partner_id.value" width="24" height="24"
+                                                t-att-title="record.partner_id.value" t-att-alt="record.partner_id.value" width="24" height="24"
                                                 class="oe_kanban_avatar"/>
                                         </div>
                                     </div>
diff --git a/addons/website_form/static/src/xml/website_form.xml b/addons/website_form/static/src/xml/website_form.xml
index 3a1102bb5e1f..23daf2feb696 100644
--- a/addons/website_form/static/src/xml/website_form.xml
+++ b/addons/website_form/static/src/xml/website_form.xml
@@ -4,21 +4,21 @@
     <!-- Success status -->
     <t t-name="website_form.status_success">
         <span id="o_website_form_result" class="text-success ml8">
-            <i class="fa fa-check mr4"/>The form has been sent successfully.
+            <i class="fa fa-check mr4" role="img" aria-label="Success" title="Success"/>The form has been sent successfully.
         </span>
     </t>
 
     <!-- Missing field status -->
     <t t-name="website_form.status_invalid">
         <span id="o_website_form_result" class="text-danger ml8">
-            <i class="fa fa-close mr4"/>Please fill in the form correctly.
+            <i class="fa fa-close mr4" role="img" aria-label="Error" title="Error"/>Please fill in the form correctly.
         </span>
     </t>
 
     <!-- Error status -->
     <t t-name="website_form.status_error">
         <span id="o_website_form_result" class="text-danger ml8">
-            <i class="fa fa-close mr4"/>An error has occured, the form has not been sent.
+            <i class="fa fa-close mr4" role="img" aria-label="Error" title="Error"/>An error has occured, the form has not been sent.
         </span>
     </t>
 
diff --git a/addons/website_forum/static/src/js/website_tour_forum.js b/addons/website_forum/static/src/js/website_tour_forum.js
index ba1c9906bc4c..c6b39cd543e2 100644
--- a/addons/website_forum/static/src/js/website_tour_forum.js
+++ b/addons/website_forum/static/src/js/website_tour_forum.js
@@ -20,7 +20,7 @@ odoo.define("website_forum.tour_forum", function (require) {
         position: "right",
     }, {
         trigger: "button.btn-primary",
-        extra_trigger: ".modal #editor_new_forum input[type=text]:not(:propValue(\"\"))",
+        extra_trigger: '#editor_new_forum input[type=text]:not(:propValue(""))',
         content: _t("Click <em>Continue</em> to create the forum."),
         position: "right",
     }, {
@@ -51,7 +51,7 @@ odoo.define("website_forum.tour_forum", function (require) {
         content: _t("Click to post your question."),
         position: "bottom",
     }, {
-        trigger: ".modal-header button.close",
+        trigger: "header.modal-header button.close",
         auto: true,
     }, {
         trigger: ".note-editable p",
@@ -64,7 +64,7 @@ odoo.define("website_forum.tour_forum", function (require) {
         content: _t("Click to post your answer."),
         position: "bottom",
     }, {
-        trigger: ".modal-header button.close",
+        trigger: "header.modal-header button.close",
         auto: true,
     }, {
         trigger: "a[data-karma=\"20\"]:first",
diff --git a/addons/website_forum/static/src/xml/website_forum_share_templates.xml b/addons/website_forum/static/src/xml/website_forum_share_templates.xml
index 670e143ced8e..29d88594b4b4 100644
--- a/addons/website_forum/static/src/xml/website_forum_share_templates.xml
+++ b/addons/website_forum/static/src/xml/website_forum_share_templates.xml
@@ -1,26 +1,26 @@
 <templates id="template" xml:space="preserve">
     <t t-name="website.social_modal">
-        <div class="modal fade" id="oe_social_share_modal">
+        <div role="dialog" class="modal fade" id="oe_social_share_modal">
             <div class="modal-dialog modal-content">
-                <div class="modal-header alert alert-info mb0">
+                <header class="modal-header alert alert-info mb0" role="status">
                     <button type="button" class="close" data-dismiss="modal">
-                        <span aria-hidden="true">x</span>
+                        <span role="img" aria-label="Close">x</span>
                     </button>
                     <h4 class="modal-title">Thanks for posting!</h4>
-                </div>
-                <div class="modal-body">
+                </header>
+                <main class="modal-body">
                     <t t-if="target_type == 'question'" t-call="website_forum.social_message_question"/>
                     <t t-if="target_type == 'answer'" t-call="website_forum.social_message_answer"/>
                     <t t-if="target_type == 'default'" t-call="website_forum.social_message_default"/>
                     <div class="share-icons text-center">
                         <t t-foreach="medias" t-as="media">
-                            <a style="cursor: pointer" t-attf-class="fa-stack fa-lg share #{media}">
+                            <a style="cursor: pointer" t-attf-class="fa-stack fa-lg share #{media}" t-attf-aria-label="Share on #{media}" t-attf-title="Share on #{media}">
                                 <span class="fa fa-square fa-stack-2x"></span>
                                 <span t-attf-class="oe_social_#{media} fa fa-#{media} fa-stack-1x fa-inverse"></span>
                             </a>
                         </t>
                     </div>
-                </div>
+                </main>
             </div>
         </div>
     </t>
@@ -40,15 +40,14 @@
     </t>
 
     <t t-name="website.social_alert">
-        <div class="alert alert-info alert-dismissable" role="alert">
+        <div class="alert alert-info alert-dismissable" role="status">
             <button type="button" class="close" data-dismiss="alert">
-                <span aria-hidden="true">&#215;</span>
-                <span class="sr-only">Close</span>
+                <span role="img" aria-label="Close">&#215;</span>
             </button>
             <p>Move this question to the top of the list by sharing it on social networks.</p><br/>
             <div>
                 <t t-foreach="medias" t-as="media">
-                    <a style="cursor: pointer" t-attf-class="fa-stack fa-lg share oe_share_bump #{media}">
+                    <a style="cursor: pointer" t-attf-class="fa-stack fa-lg share oe_share_bump #{media}" t-attf-aria-label="Share on #{media}" t-attf-title="Share on #{media}">
                         <span class="fa fa-square fa-stack-2x"></span>
                         <span t-attf-class="oe_social_#{media} fa fa-#{media} fa-stack-1x fa-inverse"></span>
                     </a>
diff --git a/addons/website_forum/views/ir_qweb.xml b/addons/website_forum/views/ir_qweb.xml
index f823262d91bc..17fd9b795365 100644
--- a/addons/website_forum/views/ir_qweb.xml
+++ b/addons/website_forum/views/ir_qweb.xml
@@ -14,11 +14,11 @@
                 <div t-if="options.get('badges')" style="display: inline-block">
                     <t t-raw="separator"/>
                     <b>|</b>
-                    <span class="fa fa-circle badge-gold"/>
+                    <span class="fa fa-circle badge-gold" role="img" aria-label="Gold badge" title="Gold badge"/>
                     <t t-esc="object.gold_badge"/>
-                    <span class="fa fa-circle badge-silver"/>
+                    <span class="fa fa-circle badge-silver" role="img" aria-label="Silver badge" title="Silver badge"/>
                     <t t-esc="object.silver_badge"/>
-                    <span class="fa fa-circle badge-bronze"/>
+                    <span class="fa fa-circle badge-bronze" role="img" aria-label="Bronze badge" title="Bronze badge"/>
                     <t t-esc="object.bronze_badge"/>
                 </div>
                 <t t-raw="0"/>
diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml
index 6294cb9b4699..9ed626a1eae7 100644
--- a/addons/website_forum/views/website_forum.xml
+++ b/addons/website_forum/views/website_forum.xml
@@ -88,11 +88,11 @@
                                 <t t-call="website.website_search_box"/>
                                 <span class="dropdown" groups="base.group_erp_manager">
                                     <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
-                                        <i class="fa fa-cog"/>
+                                        <i class="fa fa-cog" role="img" aria-label="Dropdown menu" title="Dropdown menu"/>
                                     </button>
                                     <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
-                                        <li role="presentation"><a role="menuitem" tabindex="-1" t-attf-href="/forum/#{slug(forum)}/edit_welcome_message?enable_editor=1">Design Welcome Message</a></li>
-                                        <li role="presentation"><a role="menuitem" tabindex="-1" t-attf-href="/web#id=#{forum.id}&amp;view_type=form&amp;model=forum.forum">Forum Settings</a></li>
+                                        <li><a role="menuitem" tabindex="-1" t-attf-href="/forum/#{slug(forum)}/edit_welcome_message?enable_editor=1">Design Welcome Message</a></li>
+                                        <li><a role="menuitem" tabindex="-1" t-attf-href="/web#id=#{forum.id}&amp;view_type=form&amp;model=forum.forum">Forum Settings</a></li>
                                     </ul>
                                 </span>
                             </form>
@@ -105,13 +105,13 @@
         <div id="wrap" class="container">
             <div class="row mb16">
                 <div class="col-sm-9">
-                    <div t-foreach="notifications or []" t-as="notification" class="alert alert-success alert-dismissable">
-                        <button type="button" class="close notification_close" t-att-id="notification.id" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                    <div t-foreach="notifications or []" t-as="notification" class="alert alert-success alert-dismissable" role="status">
+                        <button type="button" class="close notification_close" t-att-id="notification.id" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                         <div t-field="notification.body"/>
                         <a t-attf-href="/forum/#{ slug(forum) }/user/#{ user.id }#badges" class="fa fa-arrow-right">View Your Badges</a>
                     </div>
-                    <div t-if="not validation_email_sent and not is_public_user and user.karma == 0" class="alert alert-danger alert-dismissable">
-                        <button type="button" class="close validation_email_close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                    <div t-if="not validation_email_sent and not is_public_user and user.karma == 0" class="alert alert-danger alert-dismissable" role="alert">
+                        <button type="button" class="close validation_email_close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                         <div>
                             <p>
                                 It appears your email has not been verified.
@@ -119,8 +119,8 @@
                             </p>
                         </div>
                     </div>
-                    <div t-if="validation_email_done" class="alert alert-success alert-dismissable">
-                        <button type="button" class="close validated_email_close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                    <div t-if="validation_email_done" class="alert alert-success alert-dismissable" role="status">
+                        <button type="button" class="close validated_email_close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                         <div>
                             <p>Congratulations! Your email has just been validated. You may now participate to our forums.</p>
                         </div>
@@ -130,7 +130,7 @@
                 <div class="col-sm-3" id="right-column">
                     <div t-if="not header.get('ask_hide')" t-attf-class="btn-group btn-block mb16 #{(user.karma &lt; forum.karma_ask) and not is_public_user and 'karma_required' or ''}" t-attf-data-karma="#{forum.karma_ask}">
                         <t t-set="multi_type" t-value="(forum.allow_link and forum.allow_question) or (forum.allow_link and forum.allow_discussion) or (forum.allow_question and forum.allow_discussion)"/>
-                        <a type="button"  t-attf-class="btn btn-primary btn-lg #{'col-sm-10' if multi_type else 'col-sm-12'}" t-attf-href="/forum/#{slug(forum)}/ask?post_type=#{forum.default_post_type}">
+                        <a role="button" type="button"  t-attf-class="btn btn-primary btn-lg #{'col-sm-10' if multi_type else 'col-sm-12'}" t-attf-href="/forum/#{slug(forum)}/ask?post_type=#{forum.default_post_type}">
                             <t t-if="forum.default_post_type == 'question'">Ask a Question</t>
                             <t t-if="forum.default_post_type == 'link'">Submit a Link</t>
                             <t t-if="forum.default_post_type == 'discussion'">New Discussion</t>
@@ -141,9 +141,9 @@
                                 <span class="sr-only">Select Post</span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li t-if="forum.allow_question"><a t-attf-href="/forum/#{slug(forum)}/ask?post_type=question">Ask a Question</a></li>
-                                <li t-if="forum.allow_link"><a t-attf-href="/forum/#{slug(forum)}/ask?post_type=link">Submit a Link</a></li>
-                                <li t-if="forum.allow_discussion"><a t-attf-href="/forum/#{slug(forum)}/ask?post_type=discussion">New Discussion</a></li>
+                                <li t-if="forum.allow_question"><a role="menuitem" t-attf-href="/forum/#{slug(forum)}/ask?post_type=question">Ask a Question</a></li>
+                                <li t-if="forum.allow_link"><a role="menuitem" t-attf-href="/forum/#{slug(forum)}/ask?post_type=link">Submit a Link</a></li>
+                                <li t-if="forum.allow_discussion"><a role="menuitem" t-attf-href="/forum/#{slug(forum)}/ask?post_type=discussion">New Discussion</a></li>
                             </ul>
                         </t>
                     </div>
@@ -238,9 +238,9 @@
             <span t-if="not question.active and question.state=='offensive' and question.closed_reason_id"><b> [<t t-esc="question.closed_reason_id.name[0].upper() + question.closed_reason_id.name[1:]"/>]</b></span>
             <span t-if="question.state == 'close'"><b> [Closed]</b></span>
             <t t-if="question.post_type == 'link'" >
-                <a title="Redirect to external link" t-att-href="question.content_link" class="text-muted"><i class="fa fa-external-link forum_link"/></a>
+                <a title="Redirect to external link" aria-label="External link" t-att-href="question.content_link" class="text-muted"><i class="fa fa-external-link forum_link"/></a>
             </t>
-            <span t-if="question.has_validated_answer" title="Question has accepted answer"><i class="fa fa-check-circle oe_answer_true"/></span>
+            <span t-if="question.has_validated_answer" title="Question has accepted answer" role="img" aria-label="Question has accepted answer"><i class="fa fa-check-circle oe_answer_true"/></span>
         </div>
         <div><t t-raw="post_content"/></div>
         <t t-foreach="question.tag_ids" t-as="question_tag">
@@ -250,9 +250,9 @@
             </a>
         </t>
         <small class="text-muted">
-            <i t-if="question.post_type == 'question'" t-attf-class="fa fa-question-circle" t-att-title="question.post_type.capitalize()" />
-            <i t-if="question.post_type == 'discussion'" t-attf-class="fa fa-comments-o" t-att-title="question.post_type.capitalize()" />
-            <i t-if="question.post_type == 'link'" t-attf-class="fa fa-link" t-att-title="question.post_type.capitalize()" />
+            <i t-if="question.post_type == 'question'" t-attf-class="fa fa-question-circle" role="img" aria-label="Question" t-att-title="question.post_type.capitalize()" />
+            <i t-if="question.post_type == 'discussion'" t-attf-class="fa fa-comments-o" role="img" aria-label="Discussion" t-att-title="question.post_type.capitalize()" />
+            <i t-if="question.post_type == 'link'" t-attf-class="fa fa-link" role="img" aria-label="Link" t-att-title="question.post_type.capitalize()" />
             <span>By </span><span t-field="question.create_uid" t-options='{"widget": "contact", "country_image": True, "fields": ["name", "country_id"]}' style="display: inline-block;"/>
             <span> • </span><span t-field="question.write_date" t-options='{"format":"short"}'/>
             <span> • </span><span t-field="question.views" /> <t t-if="question.views&lt;=1">View</t><t t-else="">Views</t>
@@ -389,7 +389,7 @@
                 <div t-if="not forums" class="well">No forum post yet.</div>
                 <div t-foreach="forums" t-as="forum" class="col-sm-3 text-center mb32">
                     <a t-attf-href="/forum/#{ slug(forum) }">
-                        <div class="fa fa-5x fa-comment mb16"/>
+                        <div class="fa fa-5x fa-comment mb16" role="img" aria-label="Forum" title="Forum"/>
                         <div t-field="forum.name"/>
                     </a>
                 </div>
@@ -420,36 +420,36 @@
                   <t t-if="sorting == 'vote_count desc'"> by most voted</t>
                   <b class="caret"/>
               </a>
-              <ul class="dropdown-menu">
-                  <li class="dropdown-header">Filter on</li>
+              <ul class="dropdown-menu" role="menu">
+                  <li role="separator" class="dropdown-header">Filter on</li>
                   <li t-att-class="filters == 'all' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'sorting', filters='all')">All</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'sorting', filters='all')">All</a>
                   </li>
                   <li t-att-class="filters == 'unanswered' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'sorting', filters='unanswered')">Unanswered</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'sorting', filters='unanswered')">Unanswered</a>
                   </li>
                   <li t-if="uid" t-att-class="filters == 'followed' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'sorting', filters='followed')">Followed</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'sorting', filters='followed')">Followed</a>
                   </li>
-                  <li t-if="tag" class="dropdown-header">Tags</li>
+                  <li role="separator" t-if="tag" class="dropdown-header">Tags</li>
                   <li t-if="tag" t-att-class="tag and 'active' or None ">
-                      <a href=""><t t-esc="tag.name"/></a>
+                      <a role="menuitem" href=""><t t-esc="tag.name"/></a>
                   </li>
-                  <li class="dropdown-header">Sort by</li>
+                  <li role="separator" class="dropdown-header">Sort by</li>
                   <li t-att-class="sorting == 'relevancy desc' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='relevancy desc')">Relevance</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='relevancy desc')">Relevance</a>
                   </li>
                   <li t-att-class="sorting == 'write_date desc' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='write_date desc')">Last activity date</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='write_date desc')">Last activity date</a>
                   </li>
                   <li t-att-class="sorting == 'create_date desc' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='create_date desc')">Newest</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='create_date desc')">Newest</a>
                   </li>
                   <li t-att-class="sorting == 'child_count desc' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='child_count desc')">Most answered</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='child_count desc')">Most answered</a>
                   </li>
                   <li t-att-class="sorting == 'vote_count desc' and 'active' or None ">
-                      <a t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='vote_count desc')">Most voted</a>
+                      <a role="menuitem" t-att-href="url_for('') + '?' + keep_query( 'search', 'filters', sorting='vote_count desc')">Most voted</a>
                   </li>
               </ul>
             </small>
@@ -680,7 +680,7 @@
                         <t t-if="not offensive">Close post</t>
                     </button>
                     <span class="text-muted">or</span>
-                    <a class="btn btn-link" t-attf-href="/forum/#{ slug(forum) }/question/#{ slug(question) }">back to post</a>
+                    <a role="button" class="btn btn-link" t-attf-href="/forum/#{ slug(forum) }/question/#{ slug(question) }">back to post</a>
                 </div>
             </div>
         </form>
@@ -742,10 +742,12 @@
     <div class="vote text-center">
         <a t-attf-class="vote_up fa fa-caret-up no-decoration #{own_vote == 1 and 'text-success' or ''} #{((own_vote == 1 and not can_downvote) or not can_upvote) and 'karma_required' or ''}"
             t-attf-data-karma="#{own_vote == 1 and karma_down or karma_up}"
+            aria-label="Positive vote" title="Positive vote"
             t-attf-data-href="/forum/#{slug(forum)}/post/#{slug(post)}/upvote"/>
         <div class="vote_count text-muted" t-esc="post.vote_count"/>
         <a t-attf-class="vote_down fa fa-caret-down no-decoration #{own_vote == -1 and 'text-warning' or ''} #{((own_vote == -1 and not can_upvote) or not can_downvote) and 'karma_required' or ''}"
             t-attf-data-karma="#{own_vote == -1 and karma_up or karma_down}"
+            aria-label="Negative vote" title="Negative vote"
             t-attf-data-href="/forum/#{slug(forum)}/post/#{slug(post)}/downvote"/>
         <t t-raw="0"/>
     </div>
@@ -761,12 +763,12 @@
         <meta name="twitter:image" t-attf-content="#{request.httprequest.url_root}forum/user/#{question.create_uid.id}/avatar"/>
     </t>
     <t t-call="website_forum.header">
-        <div class="alert alert-info text-center" role="alert" t-if="forum and question.state == 'pending' and user.karma>=forum.karma_moderate and question.active">
+        <div class="alert alert-info text-center" role="status" t-if="forum and question.state == 'pending' and user.karma>=forum.karma_moderate and question.active">
             <p class='text-muted mb16'>This post is currently awaiting moderation and not yet published... Do you want <i>Accept</i> or <i>Reject</i> this post ?</p>
-            <a t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/validate" type="button" class="btn btn-success">Accept <i class="fa fa-check"/></a>
-            <a t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/refuse" type="button" class="btn btn-danger">Reject <i class="fa fa-times"/></a>
+            <a role="button" t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/validate" type="button" class="btn btn-success"><span class="fa fa-suffix-check">Accept </span></a>
+            <a role="button" t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/refuse" type="button" class="btn btn-danger"><span class="fa fa-suffix-times">Reject </span></a>
         </div>
-        <div class="alert alert-info text-center" role="alert" t-if="question.state == 'pending' and user.karma &lt; forum.karma_moderate">
+        <div class="alert alert-info text-center" role="status" t-if="question.state == 'pending' and user.karma &lt; forum.karma_moderate">
             Waiting for validation
         </div>
         <div t-attf-class="question #{can_bump and 'oe_js_bump' or ''}" t-att-data-type="question.post_type" t-att-data-last-update="question.write_date" t-att-data-id="question.id">
@@ -774,12 +776,12 @@
                 <t t-call="website_forum.vote">
                     <t t-set="post" t-value="question"/>
                     <div class="mt4">
-                        <a t-attf-data-href="/forum/#{slug(question.forum_id)}/question/#{slug(question)}/toggle_favourite"
+                        <a t-attf-data-href="/forum/#{slug(question.forum_id)}/question/#{slug(question)}/toggle_favourite" aria-label="Toggle favorite status" title="Toggle favorite status"
                             t-attf-class="favourite_question no-decoration fa fa-2x fa-star #{question.user_favourite and 'forum_favourite_question' or ''}"/>
                     </div>
                 </t>
             </div>
-            <div t-attf-class="question-block #{not question.active and 'alert alert-danger' or ''}">
+            <div t-attf-class="question-block #{not question.active and 'alert alert-danger' or ''}" role="alert">
                 <h1 class="mt0 mb0">
                     <t t-if="question.post_type == 'link'">
                         <a t-att-href="question.content_link">
@@ -804,9 +806,9 @@
                 </div>
                 <div class="text-muted mb16">
                     <t t-set="type_labels" t-value="dict(question._fields['post_type']._description_selection(question.env))"/>
-                    <i t-if="question.post_type == 'question'" t-attf-class="fa fa-question-circle" t-att-title="type_labels[question.post_type]" />
-                    <i t-if="question.post_type == 'discussion'" t-attf-class="fa fa-comments-o" t-att-title="type_labels[question.post_type]" />
-                    <i t-if="question.post_type == 'link'" t-attf-class="fa fa-link" t-att-title="type_labels[question.post_type]" />
+                    <i t-if="question.post_type == 'question'" t-attf-class="fa fa-question-circle" role="img" aria-label="Question" t-att-title="type_labels[question.post_type]" />
+                    <i t-if="question.post_type == 'discussion'" t-attf-class="fa fa-comments-o" role="img" aria-label="Discussion" t-att-title="type_labels[question.post_type]" />
+                    <i t-if="question.post_type == 'link'" t-attf-class="fa fa-link" role="img" aria-label="Link" t-att-title="type_labels[question.post_type]" />
                     <span>By </span>
                     <a t-att-href="(question.create_uid.id == request.session.uid or question.create_uid.sudo().website_published) and '/forum/%s/user/%s' % (slug(forum), question.create_uid.id) or None"
                         t-field="question.create_uid"
@@ -816,7 +818,7 @@
                     <span> • </span><span t-field="question.views"/> views
                 </div>
 
-                <div class="alert alert-info text-center" t-if="question.state == 'close'">
+                <div class="alert alert-info text-center" t-if="question.state == 'close'" role="status">
                     <p class="mt16">
                         <b>The <i t-field="question.post_type"/> has been closed<t t-if="question.closed_reason_id"> for reason: <i t-esc="question.closed_reason_id.name"/></t></b>
                     </p>
@@ -945,7 +947,7 @@
             <t t-call="website_forum.post_answer"/>
         </div>
         <div t-if="question.post_type == 'question' and question.uid_has_answered" class="mb16">
-            <a class="btn btn-primary" t-attf-href="/forum/#{slug(forum)}/question/#{slug(question)}/edit_answer">Edit Your Previous Answer</a>
+            <a role="button" class="btn btn-primary" t-attf-href="/forum/#{slug(forum)}/question/#{slug(question)}/edit_answer">Edit Your Previous Answer</a>
             <span class="text-muted">(only one answer per question is allowed)</span>
         </div>
     </t>
@@ -960,6 +962,7 @@
                 <div t-if="question.post_type == 'question'" class="mt4">
                     <a t-attf-class="accept_answer fa fa-2x fa-check-circle no-decoration #{answer.is_correct and 'oe_answer_true' or 'oe_answer_false'} #{not answer.can_accept and 'karma_required' or ''}"
                         t-attf-data-karma="#{answer.karma_accept}"
+                        aria-label="Send answer" title="Send answer"
                         t-attf-data-href="/forum/#{slug(question.forum_id)}/post/#{slug(answer)}/toggle_correct"/>
                 </div>
             </t>
@@ -974,7 +977,7 @@
                     <t t-call="website_forum.forum_user_tooltip"/>
                 </div>
                 <a t-att-href="user_profile_url" class="o_forum_user_info">
-                    <img class="pull-left img img-rounded o_forum_avatar" t-attf-src="/forum/user/#{answer.create_uid.id}/avatar"/>
+                    <img class="pull-left img img-rounded o_forum_avatar" t-attf-src="/forum/user/#{answer.create_uid.id}/avatar" alt="Avatar"/>
                 </a>
                 <a t-att-href="user_profile_url"
                     t-field="answer.create_uid"
@@ -1074,7 +1077,7 @@
 <template id="forum_user_tooltip">
     <div class="o_forum_user_bio text-left panel panel-body">
         <a t-att-href="user_profile_url">
-            <img class="pull-left img img-rounded o_forum_avatar_big" t-attf-src="/forum/user/#{answer.create_uid.id}/avatar"/>
+            <img class="pull-left img img-rounded o_forum_avatar_big" t-attf-src="/forum/user/#{answer.create_uid.id}/avatar" alt="Avatar"/>
         </a>
         <div class="o_forum_tooltip_header">
             <h4 class="o_forum_tooltip_heading"><a t-att-href="user_profile_url"
@@ -1098,6 +1101,8 @@
                     <t t-call="website_forum.link_button">
                         <t t-set="url" t-value="'/forum/' + slug(forum) + '/post/' + slug(object) + '/comment/' + slug(message) + '/delete'"/>
                         <t t-set="label"> </t>
+                        <t t-set="aria-label">Delete</t>
+                        <t t-set="title">Delete</t>
                         <t t-set="karma" t-value="user.karma&lt;required_karma and required_karma or 0"/>
                         <t t-set="classes" t-value="'close comment_delete fa-times'"/>
                         <t t-set="form_classes" t-value="'pull-right'"/>
@@ -1147,7 +1152,7 @@
         </p>
         <nav t-if="pager_tag_chars">
             <ul class="pagination mt0 mb0">
-                <li class="disabled"><a><i class="fa fa-filter"></i></a></li>
+                <li class="disabled"><a aria-label="Filter" title="Filter"><i class="fa fa-filter"></i></a></li>
                 <t t-foreach="pager_tag_chars" t-as="tuple_char">
                     <li t-attf-class="#{'active' if active_char_tag == tuple_char[1] else ''}"><a t-attf-href="/forum/#{slug(forum)}/tag/#{quote_plus(tuple_char[1])}"><t t-esc="tuple_char[0]"/></a></li>
                 </t>
@@ -1155,7 +1160,7 @@
         </nav>
         <div class="row">
             <div class="col-sm-3 mt16 o_js_forum_tag_follow" t-foreach="tags" t-as="tag">
-                <span><t t-esc="tag.posts_count"/>&amp;nbsp;&amp;nbsp;<i class='fa fa-times'/>&amp;nbsp;&amp;nbsp;</span>
+                <span><t t-esc="tag.posts_count"/>&amp;nbsp;&amp;nbsp;<i class='fa fa-times' title="Close" role="img" aria-label="Close"/>&amp;nbsp;&amp;nbsp;</span>
                 <a t-attf-href="/forum/#{ slug(forum) }/tag/#{ slug(tag) }/questions?{{ keep_query( filters='tag') }}"
                         t-attf-class="label #{'label-primary' if tag.message_is_follower else 'label-default'}">
                     <span t-field="tag.name"/>
@@ -1189,9 +1194,9 @@
             <tr t-foreach="badges" t-as="badge">
                 <td>
                     <span class="badge pull-left">
-                        <span t-if="badge.level == 'gold'" class="fa fa-circle badge-gold"/>
-                        <span t-if="badge.level == 'silver'" class="fa fa-circle badge-silver"/>
-                        <span t-if="badge.level == 'bronze'" class="fa fa-circle badge-bronze"/>
+                        <span t-if="badge.level == 'gold'" class="fa fa-circle badge-gold" title="Gold badge" role="img" aria-label="Gold badge"/>
+                        <span t-if="badge.level == 'silver'" class="fa fa-circle badge-silver" title="Silver badge" role="img" aria-label="Silver badge"/>
+                        <span t-if="badge.level == 'bronze'" class="fa fa-circle badge-bronze" title="Bronze badge" role="img" aria-label="Bronwe badge"/>
                         <span> </span><span t-field="badge.name"/>
                     </span>
                 </td><td>
@@ -1217,15 +1222,15 @@
                     <t t-if="queue_type == 'offensive'"> Offensive</t>
                     <b class="caret"/>
                 </a>
-                <ul class="dropdown-menu">
+                <ul class="dropdown-menu" role="menu">
                     <li t-att-class="queue_type == 'validation' and 'active' or None ">
-                        <a data-type='validation' t-attf-href="/forum/#{slug(forum)}/validation_queue">Pending</a>
+                        <a role="menuitem" data-type='validation' t-attf-href="/forum/#{slug(forum)}/validation_queue">Pending</a>
                     </li>
                     <li t-att-class="queue_type == 'flagged' and 'active' or None ">
-                        <a data-type='flagged' t-attf-href="/forum/#{slug(forum)}/flagged_queue">Flagged</a>
+                        <a role="menuitem" data-type='flagged' t-attf-href="/forum/#{slug(forum)}/flagged_queue">Flagged</a>
                     </li>
                     <li t-if="uid" t-att-class="queue_type == 'offensive' and 'active' or None ">
-                        <a data-type='offensive' t-attf-href="/forum/#{slug(forum)}/offensive_posts">Offensive</a>
+                        <a role="menuitem" data-type='offensive' t-attf-href="/forum/#{slug(forum)}/offensive_posts">Offensive</a>
                     </li>
                 </ul>
             </span>
@@ -1238,10 +1243,10 @@
         <div t-foreach="posts_ids" t-as="question" class="mb16 row post_to_validate" style="padding-bottom:16px;border-bottom:1px solid #e7e7e7;">
             <div class="col-sm-2 o_js_validation_queue">
                 <div class="panel panel-default text-center" style="background-color:#eee;margin:0;padding:5px 12px 5px 12px;">
-                    <a t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/validate" style="padding-right:8px;"><i class="fa fa-check fa-2x"/></a>
-                    <a t-if="queue_type == 'validation'" t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/refuse"><i class="fa fa-times fa-2x"/></a>
-                    <a t-if="queue_type == 'flagged'" t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/ask_for_mark_as_offensive"><i class="fa fa-times fa-2x"/></a>
-                    <a href="#" t-if="queue_type == 'offensive'" disabled="True"><i class="fa fa-times fa-2x" style="color:rgb(179, 179, 179);"/></a>
+                    <a t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/validate" style="padding-right:8px;" title="Validate" aria-label="Validate"><i class="fa fa-check fa-2x"/></a>
+                    <a t-if="queue_type == 'validation'" t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/refuse" title="Refuse" aria-label="Refuse"><i class="fa fa-times fa-2x"/></a>
+                    <a t-if="queue_type == 'flagged'" t-attf-href="/forum/#{slug(forum)}/post/#{slug(question)}/ask_for_mark_as_offensive" aria-label="Mark as offensive" title="Mark as offensive"><i class="fa fa-times fa-2x"/></a>
+                    <a href="#" t-if="queue_type == 'offensive'" disabled="True" aria-label="Offensive" title="Offensive"><i class="fa fa-times fa-2x" style="color:rgb(179, 179, 179);"/></a>
                 </div>
             </div>
             <div class="col-sm-10">
@@ -1262,7 +1267,7 @@
     <t t-call="website_forum.header">
         <div t-foreach="users" t-as="row_users" class="row mt16">
             <div t-foreach="row_users" t-as="user" class="col-sm-4">
-                <img class="pull-left img img-circle o_forum_avatar" t-attf-src="/forum/user/#{user.id}/avatar"/>
+                <img class="pull-left img img-circle o_forum_avatar" t-attf-src="/forum/user/#{user.id}/avatar" alt="Avatar"/>
                 <div>
                     <a t-attf-href="/forum/#{slug(forum)}/user/#{user.id}" t-field="user.name"/>
                     <t t-if="user.country_id">
@@ -1273,11 +1278,11 @@
                     <div>
                         <b> badges:</b>
                         <span>
-                            <span class="fa fa-circle badge-gold"/>
+                            <span class="fa fa-circle badge-gold" role="img" aria-label="Gold badge" title="Gold badge"/>
                             <span t-esc="user.gold_badge" class="ml4"/>
-                            <span class="fa fa-circle badge-silver ml8" />
+                            <span class="fa fa-circle badge-silver ml8" role="img" aria-label="Silver badge" title="Silver badge"/>
                             <span t-esc="user.silver_badge" class="ml4" />
-                            <span class="fa fa-circle badge-bronze ml8" />
+                            <span class="fa fa-circle badge-bronze ml8" role="img" aria-label="Bronze badge" title="Bronze badge"/>
                             <span t-esc="user.bronze_badge" class="ml4" />
                         </span>
                     </div>
@@ -1313,13 +1318,13 @@
                 <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
                 <input type="file" class="hidden o_forum_file_upload" name="ufile" accept="image/*"/>
                 <div class="col-md-2">
-                    <a href="#" class="o_forum_profile_pic_edit">
+                    <a href="#" class="o_forum_profile_pic_edit" aria-label="Edit">
                         <i class="fa fa-pencil fa-1g pull-left" title="Edit"></i>
                     </a>
-                    <a href="#">
-                        <i class="fa fa-trash-o fa-1g pull-right o_forum_profile_pic_clear" title="Clear"></i>
+                    <a href="#" title="Clear" aria-label="Clear">
+                        <i class="fa fa-trash-o fa-1g pull-right o_forum_profile_pic_clear"></i>
                     </a>
-                    <img class="img img-responsive img-circle o_forum_avatar_img" t-attf-src="/forum/user/#{user.id}/avatar"/>
+                    <img class="img img-responsive img-circle o_forum_avatar_img" t-attf-src="/forum/user/#{user.id}/avatar" alt="Avatar"/>
                 </div>
                 <div class="col-md-10">
                     <input name="user_id" t-att-value="user.id" type="hidden"/>
@@ -1343,7 +1348,7 @@
                         </div>
                     </div>
                     <div class="form-group">
-                        <div t-if="email_required" class="alert alert-danger alert-dismissable oe_forum_email_required">
+                        <div t-if="email_required" class="alert alert-danger alert-dismissable oe_forum_email_required" role="alert">
                             <button type="button" class="close" data-dismiss="alert">x</button>
                             <p>Please enter a valid email address in order to receive notifications from answers or comments.</p>
                         </div>
@@ -1394,7 +1399,7 @@
         </h1>
         <div class="row">
             <div class="col-sm-2">
-                <img class="img img-responsive img-circle" t-attf-src="/forum/user/#{user.id}/avatar"/>
+                <img class="img img-responsive img-circle" t-attf-src="/forum/user/#{user.id}/avatar" alt="Avatar"/>
             </div>
             <div class="col-sm-10">
                 <table class="table table-condensed">
@@ -1405,9 +1410,9 @@
                 </tr><tr>
                     <td>votes</td>
                     <td>
-                        <span class="fa fa-thumbs-up"/>
+                        <span class="fa fa-thumbs-up" role="img" aria-label="Positive votes" title="Positive votes"/>
                         <span t-esc="up_votes"/>
-                        <span class="fa fa-thumbs-down"/>
+                        <span class="fa fa-thumbs-down" role="img" aria-label="Negative votes" title="Negative votes"/>
                         <span t-esc="down_votes"/>
                     </td>
                 </tr>
@@ -1448,59 +1453,59 @@
             </div>
         </div>
 
-        <ul class="nav nav-tabs">
+        <ul class="nav nav-tabs" role="tablist">
             <li class="active">
-                <a href="#questions" data-toggle="tab"><t t-esc="count_questions"/> Questions</a>
+                <a role="tab" aria-controls="questions" href="#questions" data-toggle="tab"><t t-esc="count_questions"/> Questions</a>
             </li>
             <li>
-                <a href="#answers" data-toggle="tab"><t t-esc="count_answers"/> Answers</a>
+                <a role="tab" aria-controls="answers" href="#answers" data-toggle="tab"><t t-esc="count_answers"/> Answers</a>
             </li>
             <li t-if="uid == user.id">
-                <a href="#favourite_question" data-toggle="tab"><t t-esc="len(favourite)"/> Favourite Questions</a>
+                <a role="tab" aria-controls="favourite_question" href="#favourite_question" data-toggle="tab"><t t-esc="len(favourite)"/> Favourite Questions</a>
             </li>
             <li t-if="uid == user.id">
-                <a href="#followed_question" data-toggle="tab"><t t-esc="len(followed)"/> Followed Questions</a>
+                <a role="tab" aria-controls="followed_question" href="#followed_question" data-toggle="tab"><t t-esc="len(followed)"/> Followed Questions</a>
             </li>
             <li t-if="uid == user.id">
-                <a href="#activity" data-toggle="tab">Activity</a>
+                <a role="tab" aria-controls="activity" href="#activity" data-toggle="tab">Activity</a>
             </li>
             <li>
-                <a href="#badges" data-toggle="tab">Badges</a>
+                <a role="tab" aria-controls="badges" href="#badges" data-toggle="tab">Badges</a>
             </li>
             <li t-if="uid == user.id">
-                <a href="#votes" data-toggle="tab">Votes</a>
+                <a role="tab" aria-controls="votes" href="#votes" data-toggle="tab">Votes</a>
             </li>
         </ul>
         <div class="tab-content mt16">
-            <div class="tab-pane active" id="questions">
+            <div role="tabpanel" class="tab-pane active" id="questions">
                 <div class="mb16" t-foreach="questions" t-as="question">
                     <t t-call="website_forum.display_post"/>
                 </div>
-            </div><div class="tab-pane" id="answers">
+            </div><div role="tabpanel" class="tab-pane" id="answers">
                 <div t-foreach="answers" t-as="answer">
                     <t t-call="website_forum.display_post_answer"/>
                 </div>
             </div>
-            <div class="tab-pane" id="karma">
+            <div role="tabpanel" class="tab-pane" id="karma">
                 <h1>Karma</h1>
             </div>
-            <div class="tab-pane" id="badges">
+            <div role="tabpanel" class="tab-pane" id="badges">
                 <t t-call="website_forum.user_badges"/>
             </div>
-            <div class="tab-pane" id="favourite_question" t-if="uid == user.id">
+            <div role="tabpanel" class="tab-pane" id="favourite_question" t-if="uid == user.id">
                 <div t-foreach="favourite" t-as="question">
                     <t t-call="website_forum.display_post"/>
                 </div>
             </div>
-            <div class="tab-pane" id="followed_question" t-if="uid == user.id">
+            <div role="tabpanel" class="tab-pane" id="followed_question" t-if="uid == user.id">
                 <div t-foreach="followed" t-as="question" class="mb16">
                     <t t-call="website_forum.display_post"/>
                 </div>
             </div>
-            <div class="tab-pane" id="votes" t-if="uid == user.id">
+            <div role="tabpanel" class="tab-pane" id="votes" t-if="uid == user.id">
                 <t t-call="website_forum.user_votes"/>
             </div>
-            <div class="tab-pane" id="activity" t-if="uid == user.id">
+            <div role="tabpanel" class="tab-pane" id="activity" t-if="uid == user.id">
                 <ul class="list-unstyled">
                     <li t-foreach="activities" t-as="activity">
                         <span t-field="activity.date" t-options='{"format": "short"}'/>
@@ -1528,9 +1533,9 @@
         <tr t-foreach="user.badge_ids" t-as="badge">
             <td>
                 <span class="badge pull-left">
-                    <span t-if="badge.badge_id.level == 'gold'" class="fa fa-circle badge-gold"/>
-                    <span t-if="badge.badge_id.level == 'silver'" class="fa fa-circle badge-silver"/>
-                    <span t-if="badge.badge_id.level == 'bronze'" class="fa fa-circle badge-bronze"/>
+                    <span t-if="badge.badge_id.level == 'gold'" class="fa fa-circle badge-gold" role="img" aria-label="Gold badge" title="Gold badge"/>
+                    <span t-if="badge.badge_id.level == 'silver'" class="fa fa-circle badge-silver" role="img" aria-label="Silver badge" title="Silver badge"/>
+                    <span t-if="badge.badge_id.level == 'bronze'" class="fa fa-circle badge-bronze" role="img" aria-label="Bronze badge" title="Bronze badge"/>
                     <span t-field="badge.badge_id.name"/>
                 </span>
             </td><td>
@@ -1550,8 +1555,8 @@
 <template id="user_votes">
     <div t-foreach="vote_post" t-as="vote">
         <t t-esc="vote.post_id.create_date"/>
-        <span t-if="vote.vote == '1'" class="fa fa-thumbs-up text-success" style="margin-left:30px"/>
-        <span t-if="vote.vote == '-1'" class="fa fa-thumbs-down text-warning" style="margin-left:30px"/>
+        <span t-if="vote.vote == '1'" class="fa fa-thumbs-up text-success" style="margin-left:30px" role="img" aria-label="Positive vote" title="Positive vote"/>
+        <span t-if="vote.vote == '-1'" class="fa fa-thumbs-down text-warning" style="margin-left:30px" role="img" aria-label="Negative vote" title="Negative vote"/>
         <t t-if="vote.post_id.parent_id">
             <a t-attf-href="/forum/#{ slug(forum) }/question/#{ vote.post_id.parent_id.id }/#answer-#{ vote.post_id.id }" t-esc="vote.post_id.parent_id.name" style="margin-left:10px"/>
         </t>
@@ -1567,7 +1572,7 @@
 <!-- User Navbar -->
 <template id="content_new_forum" inherit_id="website.user_navbar">
     <xpath expr="//div[@id='o_new_content_menu_choices']//ul" position="inside">
-        <li groups="website.group_website_designer"><a href="#" data-action="new_forum"><i class="fa fa-comment"/><p>New Forum</p></a></li>
+        <li groups="website.group_website_designer"><a href="#" data-action="new_forum"><p class="fa fa-comment">New Forum</p></a></li>
     </xpath>
 </template>
 
diff --git a/addons/website_forum_doc/views/doc.xml b/addons/website_forum_doc/views/doc.xml
index 099de859f134..eca1b5811ae3 100644
--- a/addons/website_forum_doc/views/doc.xml
+++ b/addons/website_forum_doc/views/doc.xml
@@ -37,13 +37,13 @@
                     <t t-name="kanban-box">
                         <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
                             <div class="o_dropdown_kanban dropdown" groups="base.group_user">
-                                <a class="dropdown-toggle btn" data-toggle="dropdown" href="#" >
+                                <a role="button" class="dropdown-toggle btn" data-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
                                     <span class="fa fa-ellipsis-v"/>
                                 </a>
-                                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
-                                    <li t-if="widget.editable"><a type="edit">Edit Post</a></li>
-                                    <li t-if="widget.deletable"><a type="delete">Delete</a></li>
-                                    <li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
+                                <ul class="dropdown-menu" role="menu">
+                                    <li t-if="widget.editable"><a type="edit" role="menuitem">Edit Post</a></li>
+                                    <li t-if="widget.deletable"><a type="delete" role="menuitem">Delete</a></li>
+                                    <li role="menuitem" aria-haspopup="true"><ul role="menu" class="oe_kanban_colorpicker" data-field="color"/></li>
                                 </ul>
                             </div>
                             <div class="o_kanban_record_top">
@@ -52,7 +52,7 @@
                             <div class="o_kanban_record_bottom">
                                 <div class="oe_kanban_bottom_left"/>
                                 <div class="oe_kanban_bottom_right">
-                                    <img t-att-src="kanban_image('res.users', 'image_small', record.create_uid.raw_value)" t-att-title="record.create_uid.value" width="24" height="24" class="oe_kanban_avatar"/>
+                                    <img t-att-src="kanban_image('res.users', 'image_small', record.create_uid.raw_value)" t-att-title="record.create_uid.value" t-att-alt="record.create_uid.value" width="24" height="24" class="oe_kanban_avatar"/>
                                 </div>
                             </div>
                         </div>
diff --git a/addons/website_forum_doc/views/website_doc.xml b/addons/website_forum_doc/views/website_doc.xml
index 07b2be462a65..6c01faf22950 100644
--- a/addons/website_forum_doc/views/website_doc.xml
+++ b/addons/website_forum_doc/views/website_doc.xml
@@ -163,8 +163,8 @@
                 </li>
             </xpath>
             <xpath expr="//hr" position="before">
-                <div class="alert alert-success alert-dismissable mt16" t-if="question.documentation_toc_id">
-                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                <div class="alert alert-success alert-dismissable mt16" t-if="question.documentation_toc_id" role="status">
+                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                     This question has been included in the <a href="/forum/how-to">official documentation</a>.
                 </div>
             </xpath>
@@ -214,7 +214,7 @@
                                 <div class="col-md-offset-3 col-md-8">
                                     <button class="btn btn-primary">Push to documentation</button>
                                     <span class="text-muted">or</span>
-                                    <a class="btn btn-link" t-attf-href="/forum/#{ slug(forum) }/question/#{ slug(post) }">cancel</a>
+                                    <a role="button" class="btn btn-link" t-attf-href="/forum/#{ slug(forum) }/question/#{ slug(post) }">cancel</a>
                                 </div>
                             </div>
                         </form>
diff --git a/addons/website_gengo/static/src/xml/website.gengo.xml b/addons/website_gengo/static/src/xml/website.gengo.xml
index fba29670eec7..85cf604dd941 100644
--- a/addons/website_gengo/static/src/xml/website.gengo.xml
+++ b/addons/website_gengo/static/src/xml/website.gengo.xml
@@ -1,20 +1,20 @@
 <?xml version="1.0" encoding="utf-8"?>
 <templates id="template" xml:space="preserve">
 <t t-name="website.ButtonGengoTranslator">
-    <a class="btn btn-danger gengo_post" data-action="translation_gengo_post" href="#">Auto Translate</a>
-    <a class="btn btn-danger hidden gengo_wait disabled"  href="#"><i class="fa fa-spinner fa-spin"></i> Wait</a>
-    <a class="btn btn-danger hidden gengo_inprogress disabled"  href="#"> <i class="fa fa-clock-o"></i> Translation in Progress</a>
-    <a class="btn btn-link gengo_info" data-action="translation_gengo_info">Count Words</a>
+    <a role="button" class="btn btn-danger gengo_post" data-action="translation_gengo_post" href="#">Auto Translate</a>
+    <a role="button" class="btn btn-danger hidden gengo_wait disabled"  href="#"><span class="fa fa-spinner fa-spin"> Wait</span></a>
+    <a role="button" class="btn btn-danger hidden gengo_inprogress disabled"  href="#"> <span class="fa fa-clock-o"> Translation in Progress</span></a>
+    <a role="button" class="btn btn-link gengo_info" data-action="translation_gengo_info">Count Words</a>
 </t>
 <t t-name="web_editor.TranslatorInfoDialog">
-    <div class="modal fade" tabindex="-1" role="dialog">
+    <div role="dialog" class="modal fade" tabindex="-1">
         <div class="modal-dialog">
             <div class="modal-content">
-                <div class="modal-header">
-                    <button title="Close" type="button" class="close" data-dismiss="modal">×</button>
+                <header class="modal-header">
+                    <button title="Close" aria-label="Close" type="button" class="close" data-dismiss="modal">×</button>
                     <h2 class="modal-title">Translate this page</h2>
-                </div>
-                <div class="modal-body">
+                </header>
+                <main class="modal-body">
                     <section>
                         <p>You are about to enter the translation mode.</p>
                         <p>
@@ -37,8 +37,8 @@
                             master page.
                         </p>
                     </section>
-                </div>
-                <div class="modal-footer">
+                </main>
+                <footer class="modal-footer">
                     <div>
                         <input type="checkbox" name="do_not_show"/>
                         Do not show this dialog later.
@@ -47,21 +47,21 @@
                         <button type="button" data-action="activate" class="btn btn-primary">Ok</button>
                         <button type="button" class="btn btn-default" data-action="discard" data-dismiss="modal">Cancel</button>
                     </div>
-                </div>
+                </footer>
             </div>
         </div>
     </div>
 </t>
 
 <t t-name="website.GengoTranslatorPostDialog">
-    <div class="modal fade" tabindex="-1" role="dialog">
+    <div role="dialog" class="modal fade" tabindex="-1">
         <div class="modal-dialog">
             <div class="modal-content">
-                <div class="modal-header">
-                    <button title="Close" type="button" class="close" data-dismiss="modal">×</button>
+                <header class="modal-header">
+                    <button title="Close" aria-label="Close" type="button" class="close" data-dismiss="modal">×</button>
                     <h2 class="modal-title">Select Gengo Translation Service Level</h2>
-                </div>
-                <div class="modal-body">
+                </header>
+                <main class="modal-body">
                     <section>
                     <select class="form-control" required="required" autofocus="autofocus">
                         <option value="machine">By Machine (Free)</option>
@@ -70,50 +70,50 @@
                         <option value="ultra">Ultra - $ <t t-esc="(widget.new_words * 0.15).toFixed(2)"></t></option>
                     </select>
                     </section>
-                </div>
-                <div class="modal-footer">
+                </main>
+                <footer class="modal-footer">
                     <button type="button" data-action="service_level" class="btn btn-primary">Post</button>
                     <button type="button" class="btn btn-default" data-action="discard" data-dismiss="modal">Cancel</button>
-                </div>
+                </footer>
             </div>
         </div>
     </div>
 </t>
 
 <t t-name="website.GengoTranslatorStatisticDialog">
-    <div class="modal fade" tabindex="-1" role="dialog">
+    <div role="dialog" class="modal fade" tabindex="-1">
         <div class="modal-dialog">
             <div class="modal-content">
-                <div class="modal-header">
-                    <button title="Close" type="button" class="close" data-dismiss="modal">×</button>
+                <header class="modal-header">
+                    <button title="Close" aria-label="Close" type="button" class="close" data-dismiss="modal">×</button>
                     <h2 class="modal-title">Translator statistics for this page</h2>
-                </div>
-                <div class="modal-body">
+                </header>
+                <main class="modal-body">
                     <b>
-                        <div class="text-muted mb16"> <i class="fa fa-search-plus"></i> <t t-esc="widget.new_words"></t> new words found on this page.</div>
-                        <h4><i class="fa fa-tachometer"></i> Gengo Statistics <a href="https://gengo.com/c/dashboard" class="pull-right" target="new">Gengo Dashboard</a></h4>
+                        <div class="text-muted mb16"> <span class="fa fa-search-plus"> <t t-esc="widget.new_words"></t> new words found on this page.</span></div>
+                        <h4><span class="fa fa-tachometer"> Gengo Statistics</span> <a href="https://gengo.com/c/dashboard" class="pull-right" target="new">Gengo Dashboard</a></h4>
                         <hr class="mt8"/>
-                        <div class="text-info mb8"> <i class="fa fa-align-left"></i> Words posted for translate <t t-esc="widget.total"></t></div>
-                        <div class="text-warning mb8"> <i class="fa fa-cogs"></i> Words in progress <t t-esc="widget.inprogess"></t></div>
-                        <div class="text-success mb8"> <i class="fa fa-check"></i> Translated words <t t-esc="widget.done"></t></div>
+                        <div class="text-info mb8"> <span class="fa fa-align-left"> Words posted for translate <t t-esc="widget.total"></t></span></div>
+                        <div class="text-warning mb8"> <span class="fa fa-cogs"> Words in progress <t t-esc="widget.inprogess"></t></span></div>
+                        <div class="text-success mb8"> <span class="fa fa-check"> Translated words <t t-esc="widget.done"></t></span></div>
                     </b>
-                </div>
-                <div class="modal-footer">
+                </main>
+                <footer class="modal-footer">
                     <a data-action="discard" data-dismiss="modal" href="#">Close</a>
-                </div>
+                </footer>
             </div>
         </div>
     </div>
 </t>
 <t t-name="website.GengoApiConfigDialog">
-    <div class="modal fade" tabindex="-1" role="dialog">
+    <div role="dialog" class="modal fade" tabindex="-1">
         <div class="modal-dialog">
             <div class="modal-content">
-                <div class="modal-header">
-                    <button title="Close" type="button" class="close" data-dismiss="modal">×</button>
+                <header class="modal-header">
+                    <button title="Close" aria-label="Close" type="button" class="close" data-dismiss="modal">×</button>
                     <h2 class="modal-title">Gengo API is not configured</h2>
-                </div>
-                <div class="modal-body">
+                </header>
+                <main class="modal-body">
                     <b> <h3>Steps for configure Gengo </h3>
                         <div class="mb16"> 1. Go To your <b><a target="new" href="https://gengo.com/account/api_settings/">Gengo account</a></b> and generate API Keys.</div>
                         <div class="mb16"> 2. Then paste generated keys in given form</div>
@@ -147,11 +147,11 @@
                             </li>
                         </ul>
                     </b>
-                </div>
-                <div class="modal-footer">
+                </main>
+                <footer class="modal-footer">
                     <button type="button" data-action="set_config" class="btn btn-primary">Submit</button>
                     <button type="button" class="btn btn-default" data-action="discard" data-dismiss="modal">Close</button>
-                </div>
+                </footer>
             </div>
         </div>
     </div>
diff --git a/addons/website_hr/views/website_hr_templates.xml b/addons/website_hr/views/website_hr_templates.xml
index 3eb8c9d3444d..03ba21310822 100644
--- a/addons/website_hr/views/website_hr_templates.xml
+++ b/addons/website_hr/views/website_hr_templates.xml
@@ -22,7 +22,7 @@
                     <t t-set="publish_edit" t-value="True"/>
                 </t>
                 <div class="clearfix"/>
-                <img t-att-src="website.image_url(employee, 'image_medium')" class="img shadow img-rounded"/>
+                <img t-att-src="website.image_url(employee, 'image_medium')" class="img shadow img-rounded" alt="Employee"/>
                 <div class="mt8">
                     <strong t-field="employee.name"></strong>
                 </div>
diff --git a/addons/website_hr_recruitment/data/hr_job_demo.xml b/addons/website_hr_recruitment/data/hr_job_demo.xml
index 82ff9260da96..1b5434c6b884 100644
--- a/addons/website_hr_recruitment/data/hr_job_demo.xml
+++ b/addons/website_hr_recruitment/data/hr_job_demo.xml
@@ -115,16 +115,16 @@
             </div>
             <div class="col-md-12 text-center">
                 <div class="col-md-5 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
                 </div>
             </div>
         </div>
@@ -248,16 +248,16 @@
             </div>
             <div class="col-md-12 text-center">
                 <div class="col-md-5 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
                 </div>
             </div>
         </div>
@@ -382,16 +382,16 @@
             </div>
             <div class="col-md-12 text-center">
                 <div class="col-md-5 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
                 </div>
             </div>
     </div>
@@ -511,16 +511,16 @@
             </div>
             <div class="col-md-12 text-center">
                 <div class="col-md-5 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
                 </div>
             </div>
         </div>
@@ -639,16 +639,16 @@
             </div>
             <div class="col-md-12 text-center">
                 <div class="col-md-5 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
                 </div>
             </div>
         </div>
@@ -767,16 +767,16 @@
             </div>
             <div class="col-md-12 text-center">
                 <div class="col-md-5 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
                 </div>
             </div>
         </div>
@@ -896,16 +896,16 @@
             </div>
             <div class="col-md-12 text-center">
                 <div class="col-md-5 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/882207_10151545507603963_1381082528_o.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
+                    <img alt="" class="img img-responsive" style="height:355px;" src="/website_hr_recruitment/static/src/img/1010054_10151543538268963_186969588_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1017407_10151536656083963_857938319_n.jpg"/>
                 </div>
                 <div class="col-md-3 mt16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/1044326_10151536655788963_587131144_n.jpg"/>
                 </div>
             </div>
         </div>
diff --git a/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml b/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml
index 8d7eee806e4a..a2b3621080b1 100644
--- a/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml
+++ b/addons/website_hr_recruitment/views/website_hr_recruitment_templates.xml
@@ -57,7 +57,7 @@
                                         }'/>
                                     <span t-if="not job.website_published" class="label label-danger">unpublished</span>
                                     <div class="text-muted">
-                                        <i class="fa fa-clock-o"/> <span t-field="job.write_date"/>
+                                        <i class="fa fa-clock-o" title="Publication date" role="img" aria-label="Publication date"/> <span t-field="job.write_date"/>
                                     </div>
                                 </div>
                             </li>
@@ -79,7 +79,7 @@
             <section class="mb16 bg-white">
                 <div class="container">
                     <div class="pull-right">
-                        <a t-attf-href="/jobs/apply/#{job.id}" class="btn btn-primary btn-lg pull-right mt32 mb4">Apply Now!</a>
+                        <a role="button" t-attf-href="/jobs/apply/#{job.id}" class="btn btn-primary btn-lg pull-right mt32 mb4">Apply Now!</a>
                     </div>
                     <label class="mb0 mt16"><a href="/jobs">Jobs</a></label> /
                     <h1 class="mb0 mt0" t-field="job.name"/>
@@ -96,7 +96,7 @@
             <div class="oe_structure">
                 <section class="o_job_bottom_bar mt32 mb32">
                     <div class="text-center">
-                        <a t-attf-href="/jobs/apply/#{job.id}" class="btn btn-primary btn-lg">Apply Now!</a>
+                        <a role="button" t-attf-href="/jobs/apply/#{job.id}" class="btn btn-primary btn-lg">Apply Now!</a>
                     </div>
                 </section>
             </div>
@@ -161,7 +161,7 @@
                         </div>
                         <div class="form-group">
                             <div class="col-md-offset-3 col-sm-offset-4 col-sm-8 col-md-7">
-                                <span class="btn btn-primary btn-lg o_website_form_send">Submit</span>
+                                <a href="#" role="button" class="btn btn-primary btn-lg o_website_form_send">Submit</a>
                                 <span id="o_website_form_result"></span>
                             </div>
                         </div>
@@ -306,44 +306,36 @@
         <div class="container">
             <div class="row">
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-heart"/>
-                    <h4 class="mb0 mt8">Benefits</h4>
+                    <h4 class="mb0 mt8 fa fa-2x fa-heart">Benefits</h4>
                     <p>Healthcare, dental, vision, life insurance, Flexible Spending Account (FSA), Health Savings Account (HSA)</p>
                 </div>
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-sun-o"/>
-                    <h4 class="mt8 mb0">PTOs</h4>
+                    <h4 class="mt8 mb0 fa fa-2x fa-sun-o">PTOs</h4>
                     <p>Vacation, Sick, and paid leaves</p>
                 </div>
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-car"/>
-                    <h4 class="mt8 mb0">Save on commute</h4>
+                    <h4 class="mt8 mb0 fa fa-2x fa-car">Save on commute</h4>
                     <p>Pre-tax commuter benefitsbr <br/>(parking and transit) </p>
                     </div>
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-check-circle"/>
-                    <h4 class="mb0 mt8">Discount Programs</h4>
+                    <h4 class="mb0 mt8 fa fa-2x fa-check-circle">Discount Programs</h4>
                     <p>Brand-name product and services in categories like travel, electronics, health, fitness, cellular, and more</p>
                 </div>
             </div><div class="row">
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-map-marker"/>
-                    <h4 class="mb0 mt8">Prime location</h4>
+                    <h4 class="mb0 mt8 fa fa-2x fa-map-marker">Prime location</h4>
                     <p>Only a couple blocs from BART, Caltrain, Highway 101, carpool pickup, and Bay Bridge.</p>
                 </div>
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-calendar"/>
-                    <h4 class="mt8 mb0">Sponsored Events</h4>
+                    <h4 class="mt8 mb0 fa fa-2x fa-calendar">Sponsored Events</h4>
                     <p>Tuesday Dinners, Monthly Lunch Mixers, Monthly Happy Hour, Annual day event</p>
                 </div>
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-futbol-o"/>
-                    <h4 class="mt8 mb0">Sport Activity</h4>
+                    <h4 class="mt8 mb0 fa fa-2x fa-futbol-o">Sport Activity</h4>
                     <p>Play any sport with colleagues and the bill is covered</p>
                     </div>
                 <div class="text-center col-md-3 mt16 mb16">
-                    <span class="fa fa-2x fa-coffee"/>
-                    <h4 class="mb0 mt8">Eat &amp; Drink</h4>
+                    <h4 class="mb0 mt8 fa fa-2x fa-coffee">Eat &amp; Drink</h4>
                     <p>Peet's and Philz coffee provided all day to order and pantry snacks</p>
                 </div>
             </div>
@@ -355,24 +347,24 @@
         <div class="container">
             <div class="row">
                 <div class="col-sm-12 col-md-6 mt16 mb16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_3.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_3.jpg"/>
                 </div>
                 <div class="col-sm-6 col-md-3 mt16 mb16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_2.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_2.jpg"/>
                 </div>
                 <div class="col-sm-6 col-md-3 mt16 mb16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_4.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_4.jpg"/>
                 </div>
             </div>
             <div class="row">
                 <div class="col-sm-6 col-md-3 mt16 mb16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_6.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_6.jpg"/>
                 </div>
                 <div class="col-sm-6 col-md-3 mt16 mb16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_5.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_5.jpg"/>
                 </div>
                 <div class="col-sm-12 col-md-6 mt16 mb16">
-                    <img class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_1.jpg"/>
+                    <img alt="" class="img img-responsive" src="/website_hr_recruitment/static/src/img/job_image_1.jpg"/>
                 </div>
             </div>
         </div>
@@ -413,10 +405,10 @@
                                         <h4 class="mt0" t-field="responsible.name"/>
                                         <p t-field="responsible.function"/>
                                         <t t-if='responsible.email'>
-                                            <i class="fa fa-envelope"></i> <a t-attf-href="mailto:#{responsible.email}" t-esc="responsible.email"/>
+                                            <i class="fa fa-envelope" role="img" aria-label="Email" title="Email"></i> <a t-attf-href="mailto:#{responsible.email}" t-esc="responsible.email"/>
                                         </t>
                                         <t t-if='responsible.phone'>
-                                            <br/><i class="fa fa-phone"></i> <span t-field="responsible.phone"/>
+                                            <br/><i class="fa fa-phone" role="img" aria-label="Phone" title="Phone"></i> <span t-field="responsible.phone"/>
                                         </t>
                                     </div>
                                     <div class="col-md-12 mt32 text-center">
@@ -431,7 +423,7 @@
                                 <div class="col-md-12 text-center mt32 mb32">
                                     In the meantime,
                                     <h3 class="mt8 mb32">Look around on our website:</h3>
-                                    <a href="/" class="btn btn-primary btn-lg">Continue To Our Website</a>
+                                    <a role="button" href="/" class="btn btn-primary btn-lg">Continue To Our Website</a>
                                 </div>
                             </div>
                         </div>
@@ -506,7 +498,7 @@
 <!-- User Navbar -->
 <template id="content_new_job_offer" inherit_id="website.user_navbar">
     <xpath expr="//div[@id='o_new_content_menu_choices']//ul" position="inside">
-        <li groups="hr_recruitment.group_hr_recruitment_manager"><a href="/jobs/add" class="js_link2post"><i class="fa fa-briefcase"/><p>New Job Offer</p></a></li>
+        <li groups="hr_recruitment.group_hr_recruitment_manager"><a href="/jobs/add" class="js_link2post"><p class="fa fa-briefcase">New Job Offer</p></a></li>
     </xpath>
 </template>
 
diff --git a/addons/website_hr_recruitment/views/website_hr_recuitment_snippets.xml b/addons/website_hr_recruitment/views/website_hr_recuitment_snippets.xml
index 27464af659e8..b06518b8f1bf 100644
--- a/addons/website_hr_recruitment/views/website_hr_recuitment_snippets.xml
+++ b/addons/website_hr_recruitment/views/website_hr_recuitment_snippets.xml
@@ -34,24 +34,24 @@
     <div data-js='s_hr_rating_option_type' data-selector=".s_hr_rating" data-drop-in="[class^='col-']">
         <li class="dropdown-submenu">
             <a tabindex="-1" href="#">Rating type</a>
-            <ul class="dropdown-menu">
-                <li data-select_class="s_hr_rating_stars"><a href="#"><i class="fa fa-star"/> Stars</a></li>
-                <li data-select_class="s_hr_rating_bolts"><a href="#"><i class="fa fa-bolt"/> Bolts</a></li>
-                <li data-select_class="s_hr_rating_hearts"><a href="#"><i class="fa fa-heart"/> Hearts</a></li>
-                <li data-select_class="s_hr_rating_bar"><a href="#"><i class="fa fa-tasks"/> Bar</a></li>
+            <ul class="dropdown-menu" role="menu">
+                <li data-select_class="s_hr_rating_stars"><a role="menuitem" href="#" class="fa fa-star"> Stars</a></li>
+                <li data-select_class="s_hr_rating_bolts"><a role="menuitem" href="#" class="fa fa-bolt"> Bolts</a></li>
+                <li data-select_class="s_hr_rating_hearts"><a role="menuitem" href="#" class="fa fa-heart"> Hearts</a></li>
+                <li data-select_class="s_hr_rating_bar"><a role="menuitem" href="#" class="fa fa-tasks"> Bar</a></li>
             </ul>
         </li>
     </div>
     <div data-js='s_hr_rating_option_value' data-selector=".s_hr_rating">
         <li class="dropdown-submenu">
             <a tabindex="-1" href="#">Rating value</a>
-            <ul class="dropdown-menu">
-                <li data-select_class=""><a href="#">0</a></li>
-                <li data-select_class="s_hr_rating_1"><a href="#">1/5</a></li>
-                <li data-select_class="s_hr_rating_2"><a href="#">2/5</a></li>
-                <li data-select_class="s_hr_rating_3"><a href="#">3/5</a></li>
-                <li data-select_class="s_hr_rating_4"><a href="#">4/5</a></li>
-                <li data-select_class="s_hr_rating_5"><a href="#">5/5</a></li>
+            <ul class="dropdown-menu" role="menu">
+                <li data-select_class=""><a role="menuitem" href="#">0</a></li>
+                <li data-select_class="s_hr_rating_1"><a role="menuitem" href="#">1/5</a></li>
+                <li data-select_class="s_hr_rating_2"><a role="menuitem" href="#">2/5</a></li>
+                <li data-select_class="s_hr_rating_3"><a role="menuitem" href="#">3/5</a></li>
+                <li data-select_class="s_hr_rating_4"><a role="menuitem" href="#">4/5</a></li>
+                <li data-select_class="s_hr_rating_5"><a role="menuitem" href="#">5/5</a></li>
             </ul>
         </li>
     </div>
diff --git a/addons/website_links/static/src/xml/recent_link.xml b/addons/website_links/static/src/xml/recent_link.xml
index ca8f2df17e4f..6fd5fffb1dde 100644
--- a/addons/website_links/static/src/xml/recent_link.xml
+++ b/addons/website_links/static/src/xml/recent_link.xml
@@ -10,7 +10,7 @@
             <div class="col-sm-7 col-xs-7">
                 
                 <h4 class="truncate_text">
-                    <img t-att-src="widget.link_obj.icon_src"/> 
+                    <img t-att-src="widget.link_obj.icon_src" alt="Icon"/> 
                     <a class="no-link-style" t-att-href="widget.link_obj.url"><t t-esc="widget.link_obj.title"/></a>
                 </h4>
                 <p class="text-muted mb0" style="margin-top: -5px;">
@@ -19,11 +19,11 @@
                     </span>
 
                     <span class="o_website_links_edit_tools" style="display:none;">
-                        <a class="o_website_links_ok_edit btn btn-xs btn-primary" href="#">ok</a> or 
+                        <a role="button" class="o_website_links_ok_edit btn btn-xs btn-primary" href="#">ok</a> or 
                         <a class="o_website_links_cancel_edit" href="#">cancel</a>
                     </span>
 
-                    <a class="o_website_links_edit_code"><span class="fa fa-pencil gray"></span></a>
+                    <a class="o_website_links_edit_code" aria-label="Edit code" title="Edit code"><span class="fa fa-pencil gray"></span></a>
                         
                     <br/>
                     <span class="label label-success"><t t-esc="widget.link_obj.campaign_id[1]"/></span> 
@@ -35,8 +35,8 @@
 
             <div class="col-sm-4 col-xs-2">
                 <button class="btn btn-info btn_shorten_url_clipboard mt8" t-att-data-clipboard-text="widget.link_obj.short_url">Copy</button>
-                <a t-attf-href="{{widget.link_obj.short_url}}+" class="btn btn-warning mt8">Stats</a>
+                <a role="button" t-attf-href="{{widget.link_obj.short_url}}+" class="btn btn-warning mt8">Stats</a>
             </div>
         </div>
     </t>
-</templates>
\ No newline at end of file
+</templates>
diff --git a/addons/website_links/views/website_links_graphs.xml b/addons/website_links/views/website_links_graphs.xml
index bb8463020521..f4a892064f3c 100644
--- a/addons/website_links/views/website_links_graphs.xml
+++ b/addons/website_links/views/website_links_graphs.xml
@@ -48,10 +48,10 @@
                                         <p>
                                             <span class="o_website_links_short_url" id="short_url"><span id="short-url-host"><t t-esc="short_url_host"/></span><span id="o_website_links_code"><t t-esc="code"/></span></span>
                                             <span class="o_website_links_edit_tools" style="display:none;">
-                                                <a class="o_website_links_ok_edit btn btn-xs btn-primary" href="#">ok</a> or 
+                                                <a role="button" class="o_website_links_ok_edit btn btn-xs btn-primary" href="#">ok</a> or 
                                                 <a class="o_website_links_cancel_edit" href="#">cancel</a>
                                             </span>
-                                            <a class="o_website_links_edit_code"><span class="fa fa-pencil gray"></span></a>
+                                            <a class="o_website_links_edit_code" aria-label="Edit code" title="Edit code"><span class="fa fa-pencil gray"></span></a>
                                             <a class="copy-to-clipboard" t-att-data-clipboard-text="short_url">copy</a>
                                             
                                         </p>
@@ -107,9 +107,9 @@
                         <h1 class="page-header">Statistics
                             <small class="pull-right hidden-xs mt16" id="filters">
                                 <ul class="nav nav-tabs nav-tabs-inline graph-tabs" role="tablist">
-                                    <li class="active"><a href="#all_time_charts" role="tab" data-toggle="tab">All Time</a></li>
-                                    <li><a href="#last_month_charts" role="tab" data-toggle="tab">Last Month</a></li>
-                                    <li><a href="#last_week_charts" role="tab" data-toggle="tab">Last Week</a></li>
+                                    <li class="active"><a aria-controls="all_time_charts" href="#all_time_charts" role="tab" data-toggle="tab">All Time</a></li>
+                                    <li><a aria-controls="last_month_charts" href="#last_month_charts" role="tab" data-toggle="tab">Last Month</a></li>
+                                    <li><a aria-controls="last_week_charts" href="#last_week_charts" role="tab" data-toggle="tab">Last Week</a></li>
                                 </ul>
                             </small>
                         </h1>
@@ -119,7 +119,7 @@
                                 <div class="tab-content">
 
                                     <!-- All Time Charts -->
-                                    <div class="tab-pane active" id="all_time_charts">
+                                    <div role="tabpanel" class="tab-pane active" id="all_time_charts">
                                         <div class="row">
                                             <div class="col-sm-7 website_links_click_chart" id="all_time_clicks_chart">
                                                 <h3 class="title"></h3>
@@ -133,7 +133,7 @@
                                     </div>
 
                                     <!-- Last Month Charts -->
-                                    <div class="tab-pane" id="last_month_charts">
+                                    <div role="tabpanel" class="tab-pane" id="last_month_charts">
                                         <div class="row">
                                             <div class="col-sm-7 website_links_click_chart" id="last_month_clicks_chart">
                                                 <h3 class="title"></h3>
@@ -147,7 +147,7 @@
                                     </div>
 
                                     <!-- Last Week Charts -->
-                                    <div class="tab-pane" id="last_week_charts">
+                                    <div role="tabpanel" class="tab-pane" id="last_week_charts">
                                         <div class="row">
                                             <div class="col-sm-7 website_links_click_chart" id="last_week_clicks_chart">
                                                 <h3 class="title"></h3>
diff --git a/addons/website_links/views/website_links_template.xml b/addons/website_links/views/website_links_template.xml
index 7e863ba79d4a..c8986c12a9ad 100644
--- a/addons/website_links/views/website_links_template.xml
+++ b/addons/website_links/views/website_links_template.xml
@@ -47,7 +47,7 @@
 
                                 <div class="o_website_links_utm_forms">
                                     <div class="form-group">
-                                        <label class="col-sm-3 control-label">Campaign <i class="fa fa-info-circle" data-toggle="tooltip" data-placement="top" title="Defines the context of your link. It might be an event you want to promote or a special promotion."></i></label>
+                                        <label class="col-sm-3 control-label">Campaign <i class="fa fa-info-circle" data-toggle="tooltip" data-placement="top" role="img" aria-label="Tooltip info" title="Defines the context of your link. It might be an event you want to promote or a special promotion."></i></label>
 
                                         <div class="col-sm-9">
                                             <input type="hidden" class="form-control" id="campaign-select"/>
@@ -55,7 +55,7 @@
                                     </div>
 
                                     <div class="form-group">
-                                        <label class="col-sm-3 control-label">Medium <i class="fa fa-info-circle" data-toggle="tooltip" data-placement="top" title="Defines the medium used to share your link. It might be an email, or a Facebook Ads for instance."></i></label>
+                                        <label class="col-sm-3 control-label">Medium <i class="fa fa-info-circle" data-toggle="tooltip" data-placement="top" role="img" aria-label="Tooltip info" title="Defines the medium used to share your link. It might be an email, or a Facebook Ads for instance."></i></label>
 
                                         <div class="col-sm-9">
                                             <input type="hidden" class="form-control" id="channel-select" />
@@ -63,7 +63,7 @@
                                     </div>
 
                                     <div class="form-group">
-                                        <label class="col-sm-3 control-label">Source <i class="fa fa-info-circle" data-toggle="tooltip" data-placement="top" title="Defines the source from which your traffic will come from, Facebook or Twitter for instance."></i></label>
+                                        <label class="col-sm-3 control-label">Source <i class="fa fa-info-circle" data-toggle="tooltip" data-placement="top" role="img" aria-label="Tooltip info" title="Defines the source from which your traffic will come from, Facebook or Twitter for instance."></i></label>
 
                                         <div class="col-sm-9">
                                             <input type="hidden" class="form-control" id="source-select" />
@@ -90,9 +90,9 @@
                     <h2 class="page-header">Your tracked links 
                         <small class="pull-right hidden-xs mt16" id="filters">
                             <ul class="nav nav-tabs nav-tabs-inline graph-tabs" role="tablist">
-                                <li class="active"><a href="#" id="filter-newest-links" role="tab" data-toggle="tab">Newest</a></li>
-                                <li><a href="#" id="filter-most-clicked-links" role="tab" data-toggle="tab">Most Clicked</a></li>
-                                <li><a href="#" id="filter-recently-used-links" role="tab" data-toggle="tab">Recently Used</a></li>
+                                <li class="active"><a aria-controls="filter-newest-links" href="#" id="filter-newest-links" role="tab" data-toggle="tab">Newest</a></li>
+                                <li><a aria-controls="filter-most-clicked-links" href="#" id="filter-most-clicked-links" role="tab" data-toggle="tab">Most Clicked</a></li>
+                                <li><a aria-controls="filter-recently-used-links" href="#" id="filter-recently-used-links" role="tab" data-toggle="tab">Recently Used</a></li>
                             </ul>
                         </small>
                     </h2>
diff --git a/addons/website_livechat/views/res_config_settings_views.xml b/addons/website_livechat/views/res_config_settings_views.xml
index 1921a8d4d8de..6608a3f5c2d1 100644
--- a/addons/website_livechat/views/res_config_settings_views.xml
+++ b/addons/website_livechat/views/res_config_settings_views.xml
@@ -9,7 +9,7 @@
             <div id="languages_setting" position="after">
                 <div class="col-xs-12 col-md-6 o_setting_box" id="live_chat_install_setting">
                     <div class="o_setting_right_pane">
-                        <label string="Live Chat"/>
+                        <span class="o_form_label">Live Chat</span>
                         <div class="text-muted">
                             Live chat channel of your website
                         </div>
diff --git a/addons/website_livechat/views/website_livechat.xml b/addons/website_livechat/views/website_livechat.xml
index 14b077078f55..00633b10f50d 100644
--- a/addons/website_livechat/views/website_livechat.xml
+++ b/addons/website_livechat/views/website_livechat.xml
@@ -52,7 +52,7 @@
                                         <div class="col-md-3">
                                             <div class="panel panel-warming">
                                                 <div class="panel-body text-center bg-warning">
-                                                    <img src="/rating/static/src/img/rating_5.png" style="height:50px"/>
+                                                    <img src="/rating/static/src/img/rating_5.png" style="height:50px" alt="Neutral face"/>
                                                 </div>
                                                 <div class="panel-body text-center bg-warning">
                                                     <h2 style="margin: 0">
@@ -67,7 +67,7 @@
                                         <div class="col-md-4">
                                             <div class="panel panel-success">
                                                 <div class="panel-body text-center bg-success">
-                                                    <img src="/rating/static/src/img/rating_10.png" style="height:60px"/>
+                                                    <img src="/rating/static/src/img/rating_10.png" style="height:60px" alt="Happy face"/>
                                                 </div>
                                                 <div class="panel-body text-center bg-success">
                                                     <h2 style="margin: 0">
@@ -82,7 +82,7 @@
                                         <div class="col-md-3">
                                             <div class="panel panel-danger">
                                                 <div class="panel-body text-center bg-danger">
-                                                    <img src="/rating/static/src/img/rating_1.png" style="height:40px"/>
+                                                    <img src="/rating/static/src/img/rating_1.png" style="height:40px" alt="Sad face"/>
                                                 </div>
                                                 <div class="panel-body text-center bg-danger">
                                                     <h2 style="margin: 0">
diff --git a/addons/website_mail/data/mail_channel_data.xml b/addons/website_mail/data/mail_channel_data.xml
index a282b01f6039..f83da7f29de3 100644
--- a/addons/website_mail/data/mail_channel_data.xml
+++ b/addons/website_mail/data/mail_channel_data.xml
@@ -24,7 +24,7 @@
                 <tbody>
                     <tr>
                         <td style="padding:2px;width:30%;">
-                            <img src="web/static/src/img/logo.png"/>
+                            <img src="web/static/src/img/logo.png" alt="Logo"/>
                         </td>
                         <td style="vertical-align: top; padding: 8px 10px;text-align: left;font-size: 14px;">
                             <a href="web/login" style="float:right ;margin:15px auto;background: #875A7B;border-radius: 5px;color: #ffffff;font-size: 16px;padding: 10px 20px 10px 20px;text-decoration: none;">Auto Login</a>
diff --git a/addons/website_mail_channel/views/snippets.xml b/addons/website_mail_channel/views/snippets.xml
index 30974eb87c5e..770b17b3fac0 100644
--- a/addons/website_mail_channel/views/snippets.xml
+++ b/addons/website_mail_channel/views/snippets.xml
@@ -9,7 +9,7 @@
     <xpath expr="//div[@id='snippet_content']//t[@t-snippet][last()]" position="after">
         <div>
             <div class="oe_snippet_thumbnail">
-                <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/button_channel_subscribe.png"/>
+                <img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/button_channel_subscribe.png" alt="Subscribe"/>
                 <span class="oe_snippet_thumbnail_title">Discussion Group</span>
             </div>
 
@@ -28,9 +28,9 @@
                     </span>
                 </div>
                 <p class="js_mg_details hidden well well-sm">
-                    <span class="js_mg_email hidden"><i class="fa fa-envelope-o"/><a href="#" class="js_mg_email"> send mail</a> - </span>
-                    <i class="fa fa-file-o"/><a href="#" class="js_mg_link"> archives</a> -
-                    <i class="fa fa-times"/><a href="#" class="js_unfollow_btn"> unsubscribe</a>
+                    <span class="js_mg_email hidden"><a href="#" class="js_mg_email fa fa-envelope-o"> send mail</a> - </span>
+                    <a href="#" class="js_mg_link fa fa-file-o"> archives</a> -
+                    <a role="button" href="#" class="js_unfollow_btn fa fa-times"> unsubscribe</a>
                 </p>
                 <p class="js_mg_confirmation hidden well well-sm">
                     a confirmation email has been sent.
diff --git a/addons/website_mail_channel/views/website_mail_channel_templates.xml b/addons/website_mail_channel/views/website_mail_channel_templates.xml
index 4f47793876df..cbf2536eaf78 100644
--- a/addons/website_mail_channel/views/website_mail_channel_templates.xml
+++ b/addons/website_mail_channel/views/website_mail_channel_templates.xml
@@ -28,15 +28,15 @@
             </section>
         </div>
         <div class="container mt32">
-            <div t-if="'unsubscribe' in request.params" class="col-md-offset-9 col-md-3 alert alert-info">
-               <h3>Need to unsubscribe? It's right here! <span class="fa fa-2x fa-arrow-down pull-right"></span></h3>
+            <div t-if="'unsubscribe' in request.params" class="col-md-offset-9 col-md-3 alert alert-info" role="status">
+               <h3>Need to unsubscribe? It's right here! <span class="fa fa-2x fa-arrow-down pull-right" role="img" aria-label="" title="Read this !"></span></h3>
             </div>
             <div class="row mt8" t-foreach="groups" t-as="group">
                 <div class="col-md-3">
-                    <img t-att-src="website.image_url(group, 'image_small')" class="pull-left"/>
+                    <img t-att-src="website.image_url(group, 'image_small')" class="pull-left" alt="Group"/>
                     <strong><a t-attf-href="/groups/#{ slug(group) }" t-esc="group.name"/></strong><br />
                     <t t-if="group.alias_id and group.alias_id.alias_name and group.alias_id.alias_domain">
-                        <i class='fa fa-envelope-o'/>
+                        <i class='fa fa-envelope-o' role="img" aria-label="Alias" title="Alias"/>
                         <a t-attf-href="mailto:#{group.alias_id.alias_name}@#{group.alias_id.alias_domain}"><span t-field="group.alias_id"/></a>
                     </t>
                 </div>
@@ -44,8 +44,8 @@
                     <div t-esc="group.description" class="text-muted"/>
                 </div>
                 <div class="col-md-2">
-                    <i class='fa fa-fw fa-user'/> <t t-esc="group_data[group.id]['members_count']"/> members<br />
-                    <i class='fa fa-fw fa-envelope-o'/> <t t-raw="group_data[group.id]['monthly_message_nbr']"/> messages / month
+                    <t class='fa fa-fw fa-user' t-esc="group_data[group.id]['members_count']"/> members<br />
+                    <t class='fa fa-fw fa-envelope-o' t-raw="group_data[group.id]['monthly_message_nbr']"/> messages / month
                 </div>
                 <div class="col-md-3">
                     <!--<t t-call="website_mail.follow"><t t-set="object" t-value="group"/></t>-->
@@ -68,9 +68,9 @@
                             </span>
                         </div>
                         <p class="js_mg_details hidden well well-sm">
-                            <span class="js_mg_email hidden"><i class="fa fa-envelope-o"/><a href="#" class="js_mg_email"> send mail</a> - </span>
-                            <i class="fa fa-file-o"/><a href="#" class="js_mg_link"> archives</a> -
-                            <i class="fa fa-times"/><a href="#" class="js_unfollow_btn"> unsubscribe</a>
+                            <span class="js_mg_email hidden"><a href="#" class="js_mg_email fa fa-envelope-o"> send mail</a> - </span>
+                            <a href="#" class="js_mg_link fa fa-file-o"> archives</a> -
+                            <a role="button" href="#" class="js_unfollow_btn fa fa-times"> unsubscribe</a>
                         </p>
                     </div>
 
@@ -97,7 +97,7 @@
                     <h1 class="text-center">
                         <t t-esc="group.name"/> mailing list archives
                     </h1><h4 class="text-center text-muted" t-if="group.alias_id and group.alias_id.alias_name and group.alias_id.alias_domain">
-                        <i class='fa fa-envelope-o'/>
+                        <i class='fa fa-envelope-o' role="img" aria-label="Alias" title="Alias"/>
                         <a t-attf-href="mailto:#{group.alias_id.alias_name}@#{group.alias_id.alias_domain}"><span t-field="group.alias_id"/></a>
                     </h4>
                 </div>
@@ -157,7 +157,7 @@
                 <h1 class="text-center">
                     <t t-esc="group.name"/> mailing list archives
                 </h1><h4 class="text-center text-muted" t-if="group.alias_id and group.alias_id.alias_name and group.alias_id.alias_domain">
-                    <i class='fa fa-envelope-o'/>
+                    <i class='fa fa-envelope-o' role="img" aria-label="Alias" title="Alias"/>
                     <a t-attf-href="mailto:#{group.alias_id.alias_name}@#{group.alias_id.alias_domain}"><span t-field="group.alias_id"/></a>
                 </h4>
             </div>
@@ -187,17 +187,17 @@
                     <div class="row">
                         <h4 class="col-md-6">
                             <t t-if="prev_message"><a t-attf-href='/groups/#{slug(group)}/#{slug(prev_message)}?#{mode and "mode=%s" % mode or ""}'>
-                                <i class="fa fa-arrow-left"/> <t t-esc="prev_message.description"/>
+                                <i class="fa fa-arrow-left" role="img" aria-label="Previous message" title="Previous message"/> <t t-esc="prev_message.description"/>
                             </a></t>
                         </h4>
                         <h4 class="col-md-6">
                             <t t-if="next_message"><a class="pull-right" t-attf-href='/groups/#{slug(group)}/#{slug(next_message)}?#{mode and "mode=%s" % mode or ""}'>
-                                <t t-esc="next_message.description"/> <i class="fa fa-arrow-right"/>
+                                <t t-esc="next_message.description"/> <i class="fa fa-arrow-right" role="img" aria-label="Next message" title="Next message"/>
                             </a></t>
                         </h4>
                     </div>
                     <div class="media">
-                        <img class="img-rounded pull-left mt0 media-object o_mg_avatar"
+                        <img class="img-rounded pull-left mt0 media-object o_mg_avatar" alt="Avatar"
                             t-att-src="website.image_url(message, 'author_avatar')"/>
                         <div class="media-body">
                             <h4 class="media-heading" t-esc="message.description"/>
@@ -210,17 +210,17 @@
                                     }'/>
                                 </t>
                                 <t t-if="not message.author_id"><t t-esc="message.email_from"/></t>
-                                - <i class="fa fa-calendar"/> <span t-field="message.date"/>
+                                - <i class="fa fa-calendar" role="img" aria-label="Date" title="Date"/> <span t-field="message.date"/>
                             </small>
                             <div t-raw="message.body"/>
 
                             <div>
                                 <p t-if="message.attachment_ids" class="mt8">
                                     <a href="#" class="o_mg_link_hide">
-                                        <i class="fa fa-chevron-right"/> <t t-raw="len(message.attachment_ids)"/> attachments
+                                        <i class="fa fa-chevron-right" role="img" aria-label="Hide attachments" title="Hide attachments"/> <t t-raw="len(message.attachment_ids)"/> attachments
                                     </a>
                                     <a href="#" class="o_mg_link_show">
-                                        <i class="fa fa-chevron-down"/> <t t-raw="len(message.attachment_ids)"/> attachments
+                                        <i class="fa fa-chevron-down" role="img" aria-label="Show attachments" title="Show attachments"/> <t t-raw="len(message.attachment_ids)"/> attachments
                                     </a>
                                 </p>
                                 <div class="o_mg_link_content">
@@ -258,7 +258,7 @@
     <div>
         <ul class="media-list">
             <li t-foreach="messages" t-as="thread" class="media">
-                <img class="img-rounded pull-left mt0 media-object o_mg_avatar"
+                <img class="img-rounded pull-left mt0 media-object o_mg_avatar" alt="Avatar"
                     t-att-src="website.image_url(thread, 'author_avatar')"/>
                 <div class="media-body">
                     <h4 class="media-heading">
@@ -273,15 +273,15 @@
                             }'/>
                         </t>
                         <t t-if="not thread.author_id"><t t-esc="thread.email_from"/></t>
-                        - <i class="fa fa-calendar"/> <span t-field="thread.date"/>
-                        - <i class="fa fa-paperclip"/> <t t-esc="len(thread.attachment_ids)"/>
+                        - <i class="fa fa-calendar" role="img" aria-label="Date" title="Date"/> <span t-field="thread.date"/>
+                        - <i class="fa fa-paperclip" role="img" aria-label="Attachments" title="Attachments"/> <t t-esc="len(thread.attachment_ids)"/>
                     </small>
                     <p t-if="thread.child_ids" class="mt8">
                         <a href="#" class="o_mg_link_hide">
-                            <i class="fa fa-chevron-right"/> <t t-raw="len(thread.child_ids)"/> replies
+                            <i class="fa fa-chevron-right" role="img" aria-label="Hide replies" title="Hide replies"/> <t t-raw="len(thread.child_ids)"/> replies
                         </a>
                         <a href="#" class="o_mg_link_show">
-                            <i class="fa fa-chevron-down"/> <t t-raw="len(thread.child_ids)"/> replies
+                            <i class="fa fa-chevron-down" role="img" aria-label="Show replies" title="Show replies"/> <t t-raw="len(thread.child_ids)"/> replies
                         </a>
                     </p>
                     <div class="o_mg_link_content o_mg_replies">
diff --git a/addons/website_mass_mailing/views/snippets_templates.xml b/addons/website_mass_mailing/views/snippets_templates.xml
index 34ec54e4b197..a03b9c2f8f17 100644
--- a/addons/website_mass_mailing/views/snippets_templates.xml
+++ b/addons/website_mass_mailing/views/snippets_templates.xml
@@ -20,28 +20,28 @@
     <div class="oe_snippet_body input-group js_subscribe" data-list-id="0">
         <input type="email" name="email" class="js_subscribe_email form-control" placeholder="your email..."/>
         <span class="input-group-btn">
-            <a href="#" class="btn btn-primary js_subscribe_btn">Subscribe</a>
-            <a href="#" class="btn btn-success js_subscribed_btn hidden" disabled="disabled">Thanks</a>
+            <a role="button" href="#" class="btn btn-primary js_subscribe_btn">Subscribe</a>
+            <a role="button" href="#" class="btn btn-success js_subscribed_btn hidden" disabled="disabled">Thanks</a>
         </span>
-        <div class="alert alert-success hidden">Thanks for your subscription!</div>
+        <div class="alert alert-success hidden" role="status">Thanks for your subscription!</div>
     </div>
 </template>
 
 <template id="s_newsletter_subscribe_popup" name="Newsletter Popup">
     <div class="o_newsletter_popup" data-list-id="0">
-        <div class="alert alert-warning alert-dismissible fade in css_non_editable_mode_hidden o_not_editable" role="alert">
+        <div class="alert alert-warning alert-dismissible fade in css_non_editable_mode_hidden o_not_editable" role="status">
             <strong>Newsletter Popup!</strong> The newsletter popup snippet effect is active on this page. Click <a id="edit_dialog" href="#">Here To Edit Dialog Content</a>
         </div>
-        <div class="modal modal-dialog modal-md fade fade-custom" id="o_newsletter_popup" tabindex="-1" role="dialog">
+        <div role="dialog" class="modal modal-dialog modal-md fade fade-custom" id="o_newsletter_popup" tabindex="-1" aria-hidden="true">
             <div class="modal-content o_popup_modal_content">
-                <a href="#" class="o_popup_btn_close o_not_editable" data-dismiss="modal">&amp;times;</a>
+                <a role="button" href="#" class="o_popup_btn_close o_not_editable" data-dismiss="modal">&amp;times;</a>
 
                 <div class="o_popup_modal_body text-center">
                     <div class="o_popup_content_dev" data-oe-placeholder="Type Here ..."/>
                     <div class="input-group o_not_editable o_popup_animated o_popup_bounce_del500ms o_popup_bounce_small" >
                         <input type="email" name="email" class="popup_subscribe_email form-control" placeholder="your email..." autofocus="autofocus"/>
                         <span class="input-group-btn">
-                            <a href="#" class="btn btn-success popup_subscribe_btn">Subscribe</a>
+                            <a role="button" href="#" class="btn btn-success popup_subscribe_btn">Subscribe</a>
                         </span>
                     </div>
                 </div>
@@ -69,22 +69,22 @@
 <!-- Extend default mass_mailing snippets with website feature -->
 <template id="social_links">
     <t t-if="website.social_facebook">
-        <a t-att-href="website.social_facebook">
+        <a t-att-href="website.social_facebook" aria-label="Facebook" title="Facebook">
           <span class="fa fa-facebook"></span>
         </a>
     </t>
     <t t-if="website.social_googleplus">
-        <a t-att-href="website.social_googleplus" style="margin-left:10px">
+        <a t-att-href="website.social_googleplus" style="margin-left:10px" aria-label="Google Plus" title="Google Plus">
             <span class="fa fa-google-plus"></span>
         </a>
     </t>
     <t t-if="website.social_linkedin">
-        <a t-att-href="website.social_linkedin" style="margin-left:10px">
+        <a t-att-href="website.social_linkedin" style="margin-left:10px" aria-label="LinkedIn" title="LinkedIn">
             <span class="fa fa-linkedin"></span>
         </a>
     </t>
     <t t-if="website.social_twitter">
-        <a t-att-href="website.social_twitter" style="margin-left:10px">
+        <a t-att-href="website.social_twitter" style="margin-left:10px" aria-label="Twitter" title="Twitter">
             <span class="fa fa-twitter"></span>
         </a>
     </t>
@@ -112,7 +112,7 @@
 
 <template id="s_mail_block_footer_social" inherit_id="mass_mailing.s_mail_block_footer_social">
     <xpath expr="//td[hasclass('o_mail_footer_links')]" position="inside">
-        <t> | <a href="/contactus" class="btn btn-link">Contact</a></t>
+        <t> | <a role="button" href="/contactus" class="btn btn-link">Contact</a></t>
     </xpath>
     <xpath expr="//tr" position="before">
         <tr>
@@ -125,7 +125,7 @@
 
 <template id="s_mail_block_footer_social_left" inherit_id="mass_mailing.s_mail_block_footer_social_left">
     <xpath expr="//div[hasclass('o_mail_footer_links')]" position="inside">
-        <t> | <a href="/contactus" class="btn btn-link">Contact</a></t>
+        <t> | <a role="button" href="/contactus" class="btn btn-link">Contact</a></t>
     </xpath>
     <xpath expr="//td" position="after">
         <td class="o_mail_footer_social">
diff --git a/addons/website_mass_mailing/views/unsubscribe_templates.xml b/addons/website_mass_mailing/views/unsubscribe_templates.xml
index ae0a10a9674e..f523b5b7ab47 100644
--- a/addons/website_mass_mailing/views/unsubscribe_templates.xml
+++ b/addons/website_mass_mailing/views/unsubscribe_templates.xml
@@ -13,7 +13,7 @@
                         <h1 class="page-header">Mailing Subscriptions</h1>
 
                         <t t-if="contacts">
-                            <div class="alert alert-info text-center">
+                            <div class="alert alert-info text-center" role="status">
                                 <p>Choose your mailing subscriptions.</p>
                             </div>
 
@@ -35,7 +35,7 @@
                         </t>
 
                         <t t-if="contacts == False">
-                            <div class="alert alert-info text-center">
+                            <div class="alert alert-info text-center" role="status">
                                 <p>You are not subscribed to any of our mailing list.</p>
                             </div>
                         </t>
@@ -51,7 +51,7 @@
                 <div class="col-md-6 col-md-offset-3">
                     <h1 class="page-header">Mailing Subscriptions</h1>
 
-                    <div class="alert alert-success text-center">
+                    <div class="alert alert-success text-center" role="status">
                         <p>You have been successfully <strong>unsubscribed</strong>!</p>
                     </div>
                 </div>
diff --git a/addons/website_membership/views/website_membership_templates.xml b/addons/website_membership/views/website_membership_templates.xml
index 1a0f868f25fa..bf6a54916ecb 100644
--- a/addons/website_membership/views/website_membership_templates.xml
+++ b/addons/website_membership/views/website_membership_templates.xml
@@ -98,20 +98,20 @@
     <xpath expr="//div[@id='left_column']/ul[last()]" position="after">
         <t t-if="google_maps_api_key">
             <!-- modal for large map -->
-            <div class="modal fade partner_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
+            <div role="dialog" class="modal fade partner_map_modal" tabindex="-1" aria-hidden="true">
               <div class="modal-dialog modal-lg">
                 <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <header class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                         <h4 class="modal-title">World Map</h4>
-                    </div>
+                    </header>
                     <iframe t-attf-src="/google_map/?width=898&amp;height=485&amp;partner_ids=#{ google_map_partner_ids }&amp;partner_url=/members/"
                     style="width:898px; height:485px; border:0; padding:0; margin:0;"></iframe>
                 </div>
               </div>
             </div>
             <!-- modal end -->
-            <h3>World Map<button class="btn btn-link" data-toggle="modal" data-target=".partner_map_modal"><span class="fa fa-external-link" /></button></h3>
+            <h3>World Map<button class="btn btn-link" data-toggle="modal" data-target=".partner_map_modal"><span class="fa fa-external-link" role="img" aria-label="External link" title="External link"/></button></h3>
             <ul class="nav">
                 <iframe t-attf-src="/google_map/?width=260&amp;height=240&amp;partner_ids=#{ google_map_partner_ids }&amp;partner_url=/members/"
                     style="width:260px; height:240px; border:0; padding:0; margin:0;"></iframe>
diff --git a/addons/website_quote/data/website_quote_demo.xml b/addons/website_quote/data/website_quote_demo.xml
index b4cf1cd50422..ca79a4af27f9 100644
--- a/addons/website_quote/data/website_quote_demo.xml
+++ b/addons/website_quote/data/website_quote_demo.xml
@@ -68,28 +68,28 @@
                     <div class="container text-center" style="background-color:#eeeeee">
                         <div class="row mt16 mb16">
                             <div class="col-md-4">
-                                <span class="fa fa-mortar-board fa-5x"></span>
-                                <p class="text-muted">Is fully trained on Odoo</p>
+                                <p class="fa fa-mortar-board fa-5x">
+                                <span class="text-muted">Is fully trained on Odoo</span></p>
                             </div>
                             <div class="col-md-4">
-                                <span class="fa fa-github fa-5x"></span>
-                                <p class="text-muted">Has access to Odoo Enterprise source code on Github and latest bug fixes</p>
+                                <p class="fa fa-github fa-5x">
+                                <span class="text-muted">Has access to Odoo Enterprise source code on Github and latest bug fixes</span></p>
                             </div>
                             <div class="col-md-4">
-                                <span class="fa fa-bug fa-5x"></span>
-                                <p class="text-muted">Has a direct relationship with Odoo SA to escalate issues</p>
+                                <p class="fa fa-bug fa-5x">
+                                <span class="text-muted">Has a direct relationship with Odoo SA to escalate issues</span></p>
                             </div>
                             <div class="col-md-4">
-                                <span class="fa fa-file-text-o fa-5x"></span>
-                                <p class="text-muted">Publishes references directly on Odoo.com</p>
+                                <p class="fa fa-file-text-o fa-5x">
+                                <span class="text-muted">Publishes references directly on Odoo.com</span></p>
                             </div>
                             <div class="col-md-4">
-                                <span class="fa fa-certificate fa-5x"></span>
-                                <p class="text-muted">Follows a transparent ranking system. Ready - Silver - Gold</p>
+                                <p class="fa fa-certificate fa-5x">
+                                <span class="text-muted">Follows a transparent ranking system. Ready - Silver - Gold</span></p>
                             </div>
                             <div class="col-md-4">
-                                <span class="fa fa-refresh fa-5x"></span>
-                                <p class="text-muted">Gets access to training sessions (updated weekly)</p>
+                                <p class="fa fa-refresh fa-5x">
+                                <span class="text-muted">Gets access to training sessions (updated weekly)</span></p>
                             </div>
                         </div>
                     </div>
@@ -165,7 +165,7 @@
                             <h2>Structure of the Training</h2>
                         </div>
                         <div class="col-md-5 col-md-offset-1 mt16 mb16">
-                            <img class="img img-responsive" src="/website_quote/static/src/img/online_training.png"/>
+                            <img class="img img-responsive" src="/website_quote/static/src/img/online_training.png" alt="Online training"/>
                         </div>
                         <div class="col-md-6 mt32">
                             <h4><strong>There are three components to the training</strong></h4>
diff --git a/addons/website_quote/views/website_quote_templates.xml b/addons/website_quote/views/website_quote_templates.xml
index 52f63e3faaaf..5c72a01185d5 100644
--- a/addons/website_quote/views/website_quote_templates.xml
+++ b/addons/website_quote/views/website_quote_templates.xml
@@ -82,7 +82,7 @@
                                         t-options='{"widget": "monetary", "display_currency": quotation.pricelist_id.currency_id}'/>
                               </td>
                               <td class="text-center">
-                                  <a t-attf-href="./update_line/#{ line.id }/?order_id=#{ quotation.id }&amp;unlink=True&amp;token=#{ quotation.access_token }" class="mb8 js_update_line_json hidden-print" t-if="line.option_line_id">
+                                  <a t-attf-href="./update_line/#{ line.id }/?order_id=#{ quotation.id }&amp;unlink=True&amp;token=#{ quotation.access_token }" class="mb8 js_update_line_json hidden-print" t-if="line.option_line_id" aria-label="Remove" title="Remove">
                                       <span class="fa fa-trash-o"></span>
                                   </a>
                               </td>
@@ -149,13 +149,13 @@
       <xpath expr="//div[@id='quote_qty']" position="replace">
           <div class="input-group oe_website_spinner">
               <span class="input-group-addon hidden-print">
-                  <a t-attf-href="./update_line/#{ line.id }/?order_id=#{ quotation.id }&amp;remove=True&amp;token=#{ quotation.access_token }" class="mb8 js_update_line_json">
+                  <a t-attf-href="./update_line/#{ line.id }/?order_id=#{ quotation.id }&amp;remove=True&amp;token=#{ quotation.access_token }" class="mb8 js_update_line_json" aria-label="Remove one" title="Remove one">
                       <span class="fa fa-minus"/>
                   </a>
               </span>
               <input type="text" class="js_quantity form-control" t-att-data-id="line.id" t-att-value="line.product_uom_qty"/>
               <span class="input-group-addon hidden-print">
-                  <a t-attf-href="./update_line/#{ line.id }/?order_id=#{ quotation.id }&amp;token=#{ quotation.access_token }" class="mb8 js_update_line_json">
+                  <a t-attf-href="./update_line/#{ line.id }/?order_id=#{ quotation.id }&amp;token=#{ quotation.access_token }" class="mb8 js_update_line_json" aria-label="Add one" title="Add one">
                       <span class="fa fa-plus"/>
                   </a>
               </span>
@@ -166,26 +166,26 @@
     <!-- duplicata of the template payment.payment_confirmation_status. 
         The duplication avoid to break an existing installation in stable version-->
     <template id="payment_confirmation_status">
-        <div t-if="payment_tx_id and payment_tx_id.state == 'done'" class="alert alert-success alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+        <div t-if="payment_tx_id and payment_tx_id.state == 'done'" class="alert alert-success alert-dismissable" role="status">
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
             <span t-if='payment_tx_id.acquirer_id.done_msg' t-raw="payment_tx_id.acquirer_id.done_msg"/>
             <span t-if='payment_tx_id.acquirer_id.post_msg' t-raw="payment_tx_id.acquirer_id.post_msg"/>
         </div>
-        <div t-if="payment_tx_id and payment_tx_id.state == 'pending'" class="alert alert-warning alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+        <div t-if="payment_tx_id and payment_tx_id.state == 'pending'" class="alert alert-warning alert-dismissable" role="alert">
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
             <span t-if='payment_tx_id.acquirer_id.pending_msg' t-raw="payment_tx_id.acquirer_id.pending_msg"/>
             <span t-if='payment_tx_id.acquirer_id.post_msg' t-raw="payment_tx_id.acquirer_id.post_msg"/>
         </div>
-        <div t-if="payment_tx_id and payment_tx_id.state == 'cancel'" class="alert alert-danger alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+        <div t-if="payment_tx_id and payment_tx_id.state == 'cancel'" class="alert alert-danger alert-dismissable" role="alert">
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
             <span t-if='payment_tx_id.acquirer_id.cancel_msg' t-raw="payment_tx_id.acquirer_id.cancel_msg"/>
         </div>
-        <div t-if="payment_tx_id and payment_tx_id.state == 'error'" class="alert alert-danger alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+        <div t-if="payment_tx_id and payment_tx_id.state == 'error'" class="alert alert-danger alert-dismissable" role="alert">
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
             <span t-if='payment_tx_id.acquirer_id.error_msg' t-raw="payment_tx_id.acquirer_id.error_msg"/>
         </div>
-        <div t-if="payment_tx_id and payment_tx_id.state == 'authorized'" class="alert alert-success alert-dismissable">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+        <div t-if="payment_tx_id and payment_tx_id.state == 'authorized'" class="alert alert-success alert-dismissable" role="status">
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
             Your payment has been authorized.
             <span t-if='payment_tx_id.acquirer_id.post_msg' t-raw="payment_tx_id.acquirer_id.post_msg"/>
         </div>
@@ -202,13 +202,13 @@
                   <div class="col-md-3 hidden-print">
                       <div class="bs-sidebar">
                           <div class="text-center" t-if="quotation.state in ('draft', 'sent', 'waiting_date')" style="padding: 10px">
-                              <a t-if="order_valid and not quotation.require_payment" class="btn btn-primary btn-block" data-toggle="modal" data-target="#modalaccept">
-                                  <i class="fa fa-check"></i> Accept Order
+                              <a role="button" t-if="order_valid and not quotation.require_payment" class="btn btn-primary btn-block" data-toggle="modal" data-target="#modalaccept">
+                                  <span class="fa fa-check"> Accept Order</span>
                               </a>
-                              <a t-if="order_valid and quotation.require_payment" class="btn btn-primary btn-block" data-toggle="modal" data-target="#modalaccept">
-                                  <i class="fa fa-check"></i> Accept &amp; Pay
+                              <a role="button" t-if="order_valid and quotation.require_payment" class="btn btn-primary btn-block" data-toggle="modal" data-target="#modalaccept">
+                                  <span class="fa fa-check"> Accept &amp; Pay</span>
                               </a>
-                              <a t-if="not order_valid" href="#discussion" class="btn btn-info btn-block o_normalwhitespace">
+                              <a role="button" t-if="not order_valid" href="#discussion" class="btn btn-info btn-block o_normalwhitespace">
                                   <strong>This offer expired!</strong><br/>
                                   Contact us for new quote.
                               </a>
@@ -219,8 +219,8 @@
                               </div>
                           </div>
                           <div class="text-center" t-if="need_payment or (quotation.state in ('sale') and quotation.require_payment and tx_state != 'done')" style="padding: 10px">
-                              <a class="btn btn-primary btn-block" data-toggle="modal" data-target="#modalaccept">
-                                  <i class="fa fa-check"></i> Pay Now
+                              <a role="button" class="btn btn-primary btn-block" data-toggle="modal" data-target="#modalaccept">
+                                  <span class="fa fa-check"> Pay Now</span>
                               </a>
                           </div>
                           <hr class="mt0 mb0"/>
@@ -231,7 +231,7 @@
                               <div class="mt8" t-if="days_valid &gt; 0">
                                   <strong>This offer expires in</strong>
                                   <div class="day_counter mt8 mb16">
-                                      <i class="fa fa-clock-o"></i>
+                                      <i class="fa fa-clock-o" aria-title="Dates" title="Dates"></i>
                                       <t t-esc="days_valid"/>
                                       <t t-if="days_valid &gt; 1">
                                           days
@@ -271,16 +271,16 @@
                   <!-- Page content -->
                   <div id="quote_content" class="col-md-9">
 
-                      <div class="alert alert-success alert-dismissable" t-if="message==1">
-                          <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                      <div class="alert alert-success alert-dismissable" t-if="message==1" role="status">
+                          <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                           Your message has been successfully sent!
                       </div>
-                      <div class="alert alert-warning alert-dismissable" t-if="message==2">
-                          <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                      <div class="alert alert-warning alert-dismissable" t-if="message==2" role="alert">
+                          <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                           This quotation has been rejected. <a href="#discussion">Contact us</a> if you want a new one.
                       </div>
-                      <div class="alert alert-warning alert-dismissable" t-if="message==3">
-                          <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                      <div class="alert alert-warning alert-dismissable" t-if="message==3" role="status">
+                          <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                           This order has been validated. Thanks for your trust
                           and do not hesitate to <a href="#discussion">contact us</a> for
                           any question.
@@ -289,8 +289,8 @@
                           <t t-set="payment_tx_id" t-value="payment_tx"/>
                           <t t-call="website_quote.payment_confirmation_status"/>
                       </t>
-                      <div class="alert alert-warning alert-dismissable" t-if="message==4 and quotation.state != 'sent'">
-                          <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                      <div class="alert alert-warning alert-dismissable" t-if="message==4 and quotation.state != 'sent'" role="alert">
+                          <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                           This order
                             <t t-if="quotation.state=='draft'">has not yet been sent!</t>
                             <t t-if="quotation.state=='cancel'">has already been cancelled!</t>
@@ -300,15 +300,15 @@
                       </div>
 
                       <!-- modal relative to the actions Accept/Reject/Cancel -->
-                      <div class="modal fade" id="modalaccept" role="dialog" aria-hidden="true">
+                      <div role="dialog" class="modal fade" id="modalaccept" aria-hidden="true">
                         <div class="modal-dialog" t-if="not quotation.require_payment and not need_payment">
                            <form id="accept" method="POST" t-att-data-order-id="quotation.id" t-att-data-token="quotation.access_token" class="js_accept_json modal-content js_website_submit_form">
                             <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
-                            <div class="modal-header">
-                              <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                            <header class="modal-header">
+                              <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                               <h4 class="modal-title">Validate Order</h4>
-                            </div>
-                            <div class="modal-body" id="sign-dialog">
+                            </header>
+                            <main class="modal-body" id="sign-dialog">
                                 <p>
                                     <span>I agree that by signing this proposal, I
                                     accept it on the behalf of </span><b t-field="quotation.partner_id.commercial_partner_id"/><span>, for an amount of </span>
@@ -322,16 +322,16 @@
                                     <t t-set="callUrl" t-value="'/my/quotes/accept'"/>
                                     <t t-set="accessToken" t-value="quotation.access_token"/>
                                 </t>
-                            </div>
+                            </main>
                           </form>
                         </div>
 
                         <div class="modal-dialog modal-content" t-if="quotation.require_payment or need_payment">
-                          <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                          <header class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                             <h4 class="modal-title">Validate Order</h4>
-                          </div>
-                          <div class="modal-body" id="sign-dialog">
+                          </header>
+                          <main class="modal-body" id="sign-dialog">
                             <p>
                                 <span>I agree that by paying this proposal, I
                                 accept it on the behalf of </span><b t-field="quotation.partner_id.commercial_partner_id"/><span>, for an amount of </span>
@@ -339,8 +339,8 @@
                                   t-options='{"widget": "monetary", "display_currency": quotation.pricelist_id.currency_id}'/>
                                 <span>with payment terms: </span><b t-field="quotation.payment_term_id"/>.
                             </p>
-                        </div>
-                        <div class="modal-footer">
+                        </main>
+                        <footer class="modal-footer">
                             <div t-if="pms or s2s_acquirers or form_acquirers" id="payment_method" class="text-left col-md-13">
                                 <h3 class="mb24">Pay with</h3>
                                 <t t-call="payment.payment_tokens_list">
@@ -352,53 +352,53 @@
                                     <t t-set="access_token" t-value="quotation.access_token"/>
                                 </t>
                             </div>
-                          </div>
+                          </footer>
                         </div>
                       </div>
 
-                      <div class="modal fade" id="modaldecline" role="dialog" aria-hidden="true">
+                      <div role="dialog" class="modal fade" id="modaldecline" aria-hidden="true">
                         <div class="modal-dialog">
                           <form id="decline" method="POST" t-attf-action="/quote/#{quotation.id}/#{quotation.access_token}/decline" class="modal-content">
                             <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
-                            <div class="modal-header">
-                              <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
+                            <header class="modal-header">
+                              <button type="button" class="close" data-dismiss="modal" aria-label="Close">&amp;times;</button>
                               <h4 class="modal-title">Reject This Quote</h4>
-                            </div>
-                            <div class="modal-body">
+                            </header>
+                            <main class="modal-body">
                               <p>
                                   Tell us why you are refusing this quotation, this will help us improve our services.
                               </p>
                               <textarea rows="4" name="decline_message" placeholder="Your feedback....." class="form-control"/>
-                            </div>
-                            <div class="modal-footer">
+                            </main>
+                            <footer class="modal-footer">
                                 <button type="submit" t-att-id="quotation.id" class="btn btn-primary">Reject</button>
                                 <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
-                            </div>
+                            </footer>
                           </form>
                         </div>
                       </div>
 
-                      <div class="alert alert-warning alert-dismissable hidden-print" t-if="quotation.state == 'cancel'">
-                          <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                      <div class="alert alert-warning alert-dismissable hidden-print" t-if="quotation.state == 'cancel'" role="alert">
+                          <button type="button" class="close" data-dismiss="alert" aria-label="close">&amp;times;</button>
                           <strong>This quotation has been canceled.</strong> Contact us to get a new quote.
                       </div>
 
                       <t t-call="website_quote.so_quotation_content"/>
 
                       <div class="text-center hidden-print mt16 mb16" id="quotation_toolbar" t-if="quotation.state in ('draft', 'sent', 'waiting_date')">
-                          <a class="btn btn-success" data-toggle="modal" data-target="#modalaccept" t-if="order_valid and not quotation.require_payment">
-                              <i class="fa fa-check"></i> Accept
+                          <a role="button" class="btn btn-success" data-toggle="modal" data-target="#modalaccept" t-if="order_valid and not quotation.require_payment">
+                              <span class="fa fa-check"> Accept</span>
                           </a>
-                          <a class="btn btn-success" data-toggle="modal" data-target="#modalaccept" t-if="order_valid and quotation.require_payment">
-                              <i class="fa fa-check"></i> Accept &amp; Pay
+                          <a role="button" class="btn btn-success" data-toggle="modal" data-target="#modalaccept" t-if="order_valid and quotation.require_payment">
+                              <span class="fa fa-check"> Accept &amp; Pay</span>
                           </a>
-                          <a class="btn btn-danger" data-toggle="modal" data-target="#modaldecline">
-                              <i class="fa fa-times"></i> Reject
+                          <a role="button" class="btn btn-danger" data-toggle="modal" data-target="#modaldecline">
+                              <span class="fa fa-times"> Reject</span>
                           </a>
                       </div>
                       <div class="text-center" t-if="need_payment or (quotation.state in ('sale') and quotation.require_payment and tx_state != 'done')" style="padding: 10px">
-                          <a class="btn btn-primary" data-toggle="modal" data-target="#modalaccept">
-                              <i class="fa fa-check"></i> Pay Now
+                          <a role="button" class="btn btn-primary" data-toggle="modal" data-target="#modalaccept">
+                              <span class="fa fa-check"> Pay Now</span>
                           </a>
                       </div>
 
@@ -423,8 +423,8 @@
           </a>
       </xpath>
       <xpath expr="//div[@id='quotation_toolbar']/a[@data-target='#modaldecline']" position="before">
-          <a class="btn btn-info" type="submit" href="#discussion">
-              <i class="fa fa-comment"></i> Feedback
+          <a role="button" class="btn btn-info" type="submit" href="#discussion">
+              <span class="fa fa-comment"> Feedback</span>
           </a>
       </xpath>
   </template>
@@ -445,11 +445,11 @@
             <div t-ignore="true" class="pull-right css_editable_mode_hidden hidden-print">
                <ul class="list-inline">
                   <li groups="sales_team.group_sale_salesman">
-                    <a t-if="quotation.state not in ('manual')" class="btn btn-info" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (quotation._name, quotation.id, action)">Edit Quote</a>
-                    <a t-if="quotation.state in ('manual')" class=" btn btn-info" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (quotation._name, quotation.id, action)">Back to Sales Order</a>
+                    <a role="button" t-if="quotation.state not in ('manual')" class="btn btn-info" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (quotation._name, quotation.id, action)">Edit Quote</a>
+                    <a role="button" t-if="quotation.state in ('manual')" class=" btn btn-info" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (quotation._name, quotation.id, action)">Back to Sales Order</a>
                   </li>
                   <li>
-                     <a class="btn btn-info" target="_blank" t-att-href="'/quote/%s/%s' % (quotation.id,quotation.access_token)+'?pdf=True'">Print</a>
+                     <a role="button" class="btn btn-info" target="_blank" t-att-href="'/quote/%s/%s' % (quotation.id,quotation.access_token)+'?pdf=True'">Print</a>
                   </li>
                </ul>
             </div>
@@ -586,7 +586,7 @@
                                 </strong>
                             </td>
                             <td class="text-center" t-if="quotation.state in ['draft', 'sent']">
-                                <a t-attf-href="/quote/add_line/#{ option.id }/#{ quotation.id }/#{ quotation.access_token }" class="mb8 hidden-print">
+                                <a t-attf-href="/quote/add_line/#{ option.id }/#{ quotation.id }/#{ quotation.access_token }" class="mb8 hidden-print" aria-label="Add to cart" title="Add to cart">
                                     <span class="fa fa-shopping-cart"/>
                                 </a>
                             </td>
@@ -614,11 +614,11 @@
                     <div class="col-md-9">
                         <div class="row mb8">
                             <div t-ignore="true" class="css_editable_mode_hidden col-md-offset-11">
-                              <a class="btn btn-info hidden-print" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (template._name, template.id, request.env.ref('website_quote.action_sale_quotation_template').id)">Back</a>
+                              <a role="button" class="btn btn-info hidden-print" t-att-href="'/web#return_label=Website&amp;model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % (template._name, template.id, request.env.ref('website_quote.action_sale_quotation_template').id)">Back</a>
                             </div>
                         </div>
-                        <div class="alert alert-info alert-dismissable" t-ignore="True">
-                            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                        <div class="alert alert-info alert-dismissable" t-ignore="True" role="status">
+                            <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                             <p>
                                 <strong>Template Header:</strong> this content
                                 will appear on all quotations using this
@@ -635,8 +635,8 @@
                         <t t-foreach="template.quote_line" t-as="line">
                             <t t-if="line.product_id.product_tmpl_id.id not in product_tmpl_ids">
                                 <t t-set="product_tmpl_ids" t-value="product_tmpl_ids + [line.product_id.product_tmpl_id.id]"/>
-                                <div class="alert alert-info alert-dismissable mt16" t-ignore="True">
-                                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                                <div class="alert alert-info alert-dismissable mt16" t-ignore="True" role="status">
+                                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                                     Product: <strong t-esc="line.product_id.name"/>:
                                     this content will appear on the quotation only if this
                                     product is put on the quote.
@@ -648,8 +648,8 @@
                         <t t-foreach="template.options" t-as="option_line">
                             <t t-if="option_line.product_id.product_tmpl_id.id not in product_tmpl_ids">
                                 <t t-set="product_tmpl_ids" t-value="product_tmpl_ids + [option_line.product_id.product_tmpl_id.id]"/>
-                                <div class="alert alert-info alert-dismissable mt16" t-ignore="True">
-                                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
+                                <div class="alert alert-info alert-dismissable mt16" t-ignore="True" role="status">
+                                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">&amp;times;</button>
                                     Optional Product: <strong t-esc="option_line.product_id.name"/>:
                                     this content will appear on the quotation only if this
                                     product is used in the quote.
diff --git a/addons/website_rating/static/src/xml/website_mail.xml b/addons/website_rating/static/src/xml/website_mail.xml
index 2f3dd132a8b1..de521b32b020 100644
--- a/addons/website_rating/static/src/xml/website_mail.xml
+++ b/addons/website_rating/static/src/xml/website_mail.xml
@@ -7,12 +7,12 @@
         <t t-set="empty_star" t-value="5 - (val_integer+Math.ceil(val_decimal))"/>
         <div class="o_website_rating_static">
             <t t-foreach="_.range(0, val_integer)" t-as="num">
-                <i class="fa fa-star"></i>
+                <i class="fa fa-star" role="img" aria-label="One star" title="One star"></i>
             </t>
             <t t-if="val_decimal">
-                <i class="fa fa-star-half-o"></i>
+                <i class="fa fa-star-half-o" role="img" aria-label="Half a star" title="Half a star"></i>
             </t>
-            <t t-foreach="_.range(0, empty_star)" t-as="num">
+            <t t-foreach="_.range(0, empty_star)" t-as="num" role="img" t-attf-aria-label="#{empty_star} on 5" t-attf-title="#{empty_star} on 5">
                 <i class="fa fa-star-o"></i>
             </t>
         </div>
@@ -49,7 +49,7 @@
                                     <strong><t t-esc="percent['percent']"/>%</strong>
                                 </td>
                                 <td class="o_website_rating_table_reset">
-                                    <span class="btn btn-link o_website_rating_select_text" t-att-data-star="percent['num']">Remove selection</span>
+                                    <a href="#" role="button" class="btn btn-link o_website_rating_select_text" t-att-data-star="percent['num']">Remove selection</a>
                                 </td>
                             </tr>
                         </t>
@@ -62,11 +62,11 @@
     <t t-name="website_rating.rating_star_input">
         <div class="o_rating_star_card" t-if="widget.options['display_rating']">
             <div class="stars enabled">
-                <i class="fa fa-star-o"></i>
-                <i class="fa fa-star-o"></i>
-                <i class="fa fa-star-o"></i>
-                <i class="fa fa-star-o"></i>
-                <i class="fa fa-star-o"></i>
+                <i class="fa fa-star-o" role="img" aria-label="One star on five" title="One star on five"></i>
+                <i class="fa fa-star-o" role="img" aria-label="Two stars on five" title="Two stars on five"></i>
+                <i class="fa fa-star-o" role="img" aria-label="Three stars on five" title="Three stars on five"></i>
+                <i class="fa fa-star-o" role="img" aria-label="Four stars on five" title="Four stars on five"></i>
+                <i class="fa fa-star-o" role="img" aria-label="Five stars on five" title="Five stars on five"></i>
             </div>
             <div class="rate_text">
                 <span class="label label-info"></span>
diff --git a/addons/website_sale/data/demo.xml b/addons/website_sale/data/demo.xml
index 8e78e3675f6b..6c17b2d94dba 100644
--- a/addons/website_sale/data/demo.xml
+++ b/addons/website_sale/data/demo.xml
@@ -28,7 +28,7 @@
                                 </p>
                             </div>
                             <div class="col-md-5 mt16 mb16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/ipad_why.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/ipad_why.png"/>
                             </div>
                         </div>
                     </div>
@@ -37,7 +37,7 @@
                     <div class="container">
                         <div class="row">
                             <div class="col-md-5 col-md-offset-1">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/ipad_experience.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/ipad_experience.png"/>
                             </div>
                             <div class="col-md-6 mt64">
                                 <h3>The full iPad experience.</h3>
@@ -92,7 +92,7 @@
 
                             </div>
                             <div class="col-md-4 mt16 mb16 col-md-offset1">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/play_where_you_play.jpg"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/play_where_you_play.jpg"/>
                             </div>
                         </div>
                     </div>
@@ -116,7 +116,7 @@
                                 </p>
                             </div>
                             <div class="col-md-5 col-md-offset-1 mt32">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/more_features.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/more_features.png"/>
                             </div>
                             <div class="col-md-5 col-md-offset-4 text-center mb16 mt16">
                                 <h3>Bluetooth connectivity</h3>
@@ -135,7 +135,7 @@
                     <div class="container">
                         <div class="row">
                             <div class="col-md-5 col-md-offset-1 mt32 mb16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/bluetooth.jpg"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/bluetooth.jpg"/>
                             </div>
                             <div class="col-md-5 mt16">
                                 <h2>More features.</h2>
@@ -189,7 +189,7 @@ iOS7
                                 </p>
                             </div>
                             <div class="col-md-5 mt16 mb16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/design.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/design.png"/>
                             </div>
                         </div>
                     </div>
@@ -198,7 +198,7 @@ iOS7
                     <div class="container">
                         <div class="row">
                             <div class="col-md-5 col-md-offset-1">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/mighty.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/mighty.png"/>
                             </div>
                             <div class="col-md-6 mt32">
                                 <h3>Beautiful 7.9‑inch display.</h3>
@@ -227,7 +227,7 @@ iOS7
                                 </p>
                             </div>
                             <div class="col-md-5 mt16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/apps.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/apps.png"/>
                             </div>
                         </div>
                     </div>
@@ -236,7 +236,7 @@ iOS7
                     <div class="container">
                         <div class="row">
                             <div class="col-md-5 col-md-offset-1">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/ipad_why.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/ipad_why.png"/>
                             </div>
                             <div class="col-md-6 mt64">
                                 <h3>Why you'll love an iPad.</h3>
@@ -266,7 +266,7 @@ iOS7
                                 </p>
                             </div>
                             <div class="col-md-5 mt16 mb16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/wireless.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/wireless.png"/>
                             </div>
                         </div>
                     </div>
@@ -302,7 +302,7 @@ Weight: 10.2 grams
                             </div>
                         </div><div class="row mt16">
                             <div class="col-md-2 mt16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/promo_headphones.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/promo_headphones.png"/>
                             </div>
                             <div class="col-md-6">
                                 <h3 class="mt16">Hear, hear.</h3>
@@ -325,7 +325,7 @@ Weight: 10.2 grams
                             </div>
                         </div><div class="row">
                             <div class="col-md-2 col-md-offset-5 mt16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/buds_closeup.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/buds_closeup.png"/>
                             </div>
                         </div>
                     </div>
@@ -353,7 +353,7 @@ Weight: 10.2 grams
                                 </p>
                             </div>
                             <div class="col-md-5 mt32">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/imac1.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/imac1.png"/>
                             </div>
                         </div>
                     </div>
@@ -369,7 +369,7 @@ Weight: 10.2 grams
                                 </p>
                             </div>
                             <div class="col-md-10 col-md-offset-1">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/imac2.png" width="100%"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/imac2.png" width="100%"/>
                             </div>
                         </div>
                     </div>
@@ -418,7 +418,7 @@ Weight: 10.2 grams
                     <div class="container">
                         <div class="row">
                             <div class="col-md-10 col-md-offset-1 mt32 mb32">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/keyboard.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/keyboard.png"/>
                             </div>
                             <div class="col-md-8 col-md-offset-2 mb32 text-center">
                                 <h3>A great Keyboard. Cordless.</h3>
@@ -445,7 +445,7 @@ Weight: 31 grams</field>
                     <div class="container">
                         <div class="row">
                             <div class="col-md-9 col-md-offset-1 mb16">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/overview_hero.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/overview_hero.png"/>
                             </div>
                         </div>
                     </div>
@@ -466,7 +466,7 @@ Weight: 31 grams</field>
                                 </p>
                             </div>
                             <div class="col-md-5">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/overview_design_silver.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/overview_design_silver.png"/>
                             </div>
                         </div>
                     </div>
@@ -478,7 +478,7 @@ Weight: 31 grams</field>
                                 <h2 class="text-center">Music. It's what beats inside.</h2>
                             </div>
                             <div class="col-md-4 mt32 col-md-offset-1">
-                                <img class="img img-responsive" src="/website_sale/static/src/img/purple.png"/>
+                                <img alt="" class="img img-responsive" src="/website_sale/static/src/img/purple.png"/>
                             </div>
                             <div class="col-md-6 mt32">
                                 <h3>How to get your groove on.</h3>
diff --git a/addons/website_sale/data/mail_template_data.xml b/addons/website_sale/data/mail_template_data.xml
index 7618a3051c1a..217a0df6a8e1 100644
--- a/addons/website_sale/data/mail_template_data.xml
+++ b/addons/website_sale/data/mail_template_data.xml
@@ -20,7 +20,7 @@
                     <table width="100%">
                         <tr>
                             <td style="padding: 10px; width:150px;">
-                                <img src="/web/image/product.product/${line.product_id.id}/image" height="100px" width="100px"></img>
+                                <img src="/web/image/product.product/${line.product_id.id}/image" height="100px" width="100px" alt="Product image"></img>
                             </td>
                             <td>
                                 <strong>${line.product_id.display_name}</strong><br/>${line.name}
diff --git a/addons/website_sale/static/src/js/website_sale_tour_shop.js b/addons/website_sale/static/src/js/website_sale_tour_shop.js
index 79395becea48..f0708ea58cd5 100644
--- a/addons/website_sale/static/src/js/website_sale_tour_shop.js
+++ b/addons/website_sale/static/src/js/website_sale_tour_shop.js
@@ -20,11 +20,11 @@ odoo.define("website_sale.tour_shop", function (require) {
         content: _t("Select <b>New Product</b> to create it and manage its properties to boost your sales."),
         position: "bottom",
     }, {
-        trigger: ".modal-dialog #editor_new_product input[type=text]",
+        trigger: "#editor_new_product input[type=text]",
         content: _t("Enter a name for your new product"),
         position: "right",
     }, {
-        trigger: ".modal-dialog button.btn-primary.btn-continue",
+        trigger: "footer.modal-footer button.btn-primary.btn-continue",
         content: _t("Click on <em>Continue</em> to create the product."),
         position: "right",
     }, {
@@ -38,11 +38,11 @@ odoo.define("website_sale.tour_shop", function (require) {
         content: _t("Click here to set an image describing your product."),
         position: "top",
     }, {
-        trigger: ".o_select_media_dialog .o_upload_image_button",
+        trigger: ".o_upload_image_button",
         content: _t("Upload an image from your local library."),
         position: "bottom",
         run: function (actions) {
-            actions.auto(".modal-footer .btn-default");
+            actions.auto("footer.modal-footer .btn-default");
         },
     }, {
         trigger: "#snippet_structure .oe_snippet:eq(8) .oe_snippet_thumbnail",
diff --git a/addons/website_sale/views/product_views.xml b/addons/website_sale/views/product_views.xml
index 545ae0cd200d..6ca1f76d7e94 100644
--- a/addons/website_sale/views/product_views.xml
+++ b/addons/website_sale/views/product_views.xml
@@ -118,7 +118,7 @@
                                             <span t-attf-class="o_website_sale_image_card_size label label-#{size_status}" t-att-title="message">
                                                 <t t-esc="record.image.value"/>
                                             </span>
-                                            <a t-if="!read_only_mode" type="delete" class="btn btn-xs btn-default o_website_sale_image_card_remove"><i class="fa fa-trash"/></a>
+                                            <a role="button" t-if="!read_only_mode" type="delete" class="btn btn-xs btn-default o_website_sale_image_card_remove" aria-label="Remove" title="Remove"><i class="fa fa-trash"/></a>
                                         </div>
                                     </div>
                                 </t>
diff --git a/addons/website_sale/views/res_config_settings_views.xml b/addons/website_sale/views/res_config_settings_views.xml
index cccce5ba5b84..28e73649064e 100644
--- a/addons/website_sale/views/res_config_settings_views.xml
+++ b/addons/website_sale/views/res_config_settings_views.xml
@@ -108,7 +108,7 @@
                 <div class="row mt16 o_settings_container" id="website_taxes_settings">
                     <div class="col-xs-12 col-md-6 o_setting_box" title="This tax is applied to any new product created in the catalog.">
                         <div class="o_setting_right_pane">
-                            <label string='Default Sales Tax'/>
+                            <span class="o_form_label">Default Sales Tax</span>
                             <div class="text-muted">
                                 Default sales tax applied to local transactions
                             </div>
@@ -139,7 +139,7 @@
                     </div>
                     <div class="col-xs-12 col-md-6 o_setting_box" id="website_rounding_method" title="A rounding per line is advised if your prices are tax-included. That way, the sum of line subtotals equals the total with taxes.">
                         <div class="o_setting_right_pane">
-                            <label string="Rounding Method"/>
+                            <span class="o_form_label">Rounding Method</span>
                             <div class="text-muted">
                                 How total tax amount is computed in orders and invoices
                             </div>
@@ -321,7 +321,7 @@
                     <div class="row mt16 o_settings_container" id="sale_invoicing_settings">
                        <div class="col-xs-12 col-md-6 o_setting_box" id="invoicing_policy_setting" title="The mode selected here applies as invoicing policy of any new product created but not of products already existing.">
                             <div class="o_setting_right_pane">
-                                <label string="Invoicing Policy"/>
+                                <span class="o_form_label">Invoicing Policy</span>
                                 <div class="text-muted">
                                     Issue invoices to customers
                                 </div>
@@ -350,7 +350,7 @@
                 <div class="row mt16 o_settings_container" id="sale_checkout_settings">
                     <div class="col-xs-12 col-md-6 o_setting_box" id="checkout_mail_setting">
                         <div class="o_setting_right_pane">
-                            <label string="Confirmation Email"/>
+                            <span class="o_form_label">Confirmation Email</span>
                             <div class="text-muted">
                                 Email sent to the customer after the checkout
                             </div>
@@ -364,7 +364,7 @@
                     <div class="col-xs-12 col-md-6 o_setting_box" id="abandoned_carts_setting" title="Send a recovery email to authenticated shoppers">
                         <div class="o_setting_left_pane"/>
                         <div class="o_setting_right_pane">
-                            <label string="Email for Abandoned carts"/>
+                            <span class="o_form_label">Email for Abandoned carts</span>
                             <div class="text-muted">
                                 Default recovery email to send when a cart is abandoned
                             </div>
@@ -384,7 +384,7 @@
                     </div>
                     <div class="col-xs-12 col-md-6 o_setting_box" id="checkout_assignation_setting" groups="base.group_no_one">
                         <div class="o_setting_right_pane">
-                            <label string="Assignation"/>
+                            <span class="o_form_label">Assignation</span>
                             <div class="text-muted">
                                 Assignation of online orders
                             </div>
diff --git a/addons/website_sale/views/snippets.xml b/addons/website_sale/views/snippets.xml
index f1ab422a68d6..f19ba2f051ae 100644
--- a/addons/website_sale/views/snippets.xml
+++ b/addons/website_sale/views/snippets.xml
@@ -9,8 +9,8 @@
 
           <li class='dropdown-submenu'>
             <a tabindex="-1" href="#">Size</a>
-            <ul class="dropdown-menu" name="size">
-              <li><a href="#">
+            <ul class="dropdown-menu" role="menu" name="size">
+              <li><a role="menuitem" href="#">
                 <table>
                   <tr><td class="selected"></td><td></td><td></td><td></td></tr>
                   <tr><td></td><td></td><td></td><td></td></tr>
@@ -20,18 +20,18 @@
               </a></li>
             </ul>
           </li>
-          <li class='dropdown-submenu'>
+          <li class='dropdown-submenu' role="menuitem" aria-haspopup="true">
             <a tabindex="-1" href="#">Styles</a>
-            <ul class="dropdown-menu" name="style">
+            <ul class="dropdown-menu" role="menu" name="style">
             </ul>
           </li>
-          <li class='dropdown-submenu'>
+          <li class='dropdown-submenu' role="menuitem" aria-haspopup="true">
               <a tabindex="-1" href="#">Promote</a>
-              <ul class="dropdown-menu" data-no-preview="true">
-                  <li data-go_to="top"><a>Push to top</a></li>
-                  <li data-go_to="up"><a>Push up</a></li>
-                  <li data-go_to="down"><a>Push down</a></li>
-                  <li data-go_to="bottom"><a>Push to bottom</a></li>
+              <ul class="dropdown-menu" role="menu" data-no-preview="true">
+                  <li data-go_to="top"><a role="menuitem">Push to top</a></li>
+                  <li data-go_to="up"><a role="menuitem">Push up</a></li>
+                  <li data-go_to="down"><a role="menuitem">Push down</a></li>
+                  <li data-go_to="bottom"><a role="menuitem">Push to bottom</a></li>
               </ul>
           </li>
         </div>
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index e446c0b869f4..de7b62590275 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -43,8 +43,9 @@
             <li class="divider hidden"/> <!-- Make sure the cart and related menus are not folded (see autohideMenu) -->
             <li id="my_cart" t-att-class="'' if website_sale_order and website_sale_order.cart_quantity else 'hidden'">
                 <a href="/shop/cart">
-                    <i class="fa fa-shopping-cart"></i>
-                    My Cart <sup t-attf-class="my_cart_quantity label label-primary" t-esc="website_sale_order and website_sale_order.cart_quantity or ''" />
+                    <span class="fa fa-shopping-cart">
+                        My Cart <sup t-attf-class="my_cart_quantity label label-primary" t-esc="website_sale_order and website_sale_order.cart_quantity or ''" />
+                    </span>
                 </a>
             </li>
         </xpath>
@@ -90,7 +91,7 @@
             <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
             <div itemscope="itemscope" itemtype="http://schema.org/Product">
                 <div class="ribbon-wrapper">
-                    <div class="ribbon btn btn-danger">Sale</div>
+                    <a href="#" role="button" class="ribbon btn btn-danger">Sale</a>
                 </div>
                 <div class="oe_product_image">
                     <a itemprop="url" t-att-href="product_href">
@@ -111,7 +112,7 @@
                         <strong>
                             <a itemprop="name" t-att-href="product_href" t-att-content="product.name" t-field="product.name" />
                         </strong>
-                        <a t-if="not show_publish and not product.website_published" t-att-href="product_href" class="btn btn-default btn-xs btn-danger" title="This product is unpublished.">Unpublished</a>
+                        <a role="button" t-if="not show_publish and not product.website_published" t-att-href="product_href" class="btn btn-default btn-xs btn-danger" title="This product is unpublished.">Unpublished</a>
                     </h5>
                     <div itemprop="offers" itemscope="itemscope" itemtype="http://schema.org/Offer" class="product_price" t-if="product.product_variant_ids">
                         <b>
@@ -141,12 +142,12 @@
         <xpath expr="//div[hasclass('product_price')]" position="inside">
             <input name="product_id" t-att-value="product.product_variant_id.id" type="hidden" />
             <t t-if="len(product.product_variant_ids) == 1">
-                <a class="btn btn-default btn-xs a-submit">
+                <a role="button" class="btn btn-default btn-xs a-submit" aria-label="Shopping cart" title="Shopping cart">
                     <span class="fa fa-shopping-cart" />
                 </a>
             </t>
             <t t-if="len(product.product_variant_ids) &gt; 1">
-                <a class="btn btn-default btn-xs" t-att-href="keep('/shop/product/%s' % slug(product), page=(pager['page']['num'] if pager['page']['num']&gt;1 else None))">
+                <a role="button" class="btn btn-default btn-xs" t-att-href="keep('/shop/product/%s' % slug(product), page=(pager['page']['num'] if pager['page']['num']&gt;1 else None))" aria-label="Shopping cart" title="Shopping cart">
                     <span class="fa fa-shopping-cart" />
                 </a>
             </t>
@@ -157,13 +158,13 @@
         <t t-set="website_sale_pricelists" t-value="website.get_pricelist_available(show_visible=True)" />
         <div t-attf-class="#{website_sale_pricelists and len(website_sale_pricelists)&gt;1 and 'dropdown' or 'hidden'} btn-group">
             <t t-set="curr_pl" t-value="website.get_current_pricelist()" />
-            <a href="#" class="dropdown-toggle btn btn-default" data-toggle="dropdown">
+            <a role="button" href="#" class="dropdown-toggle btn btn-default" data-toggle="dropdown">
                 <t t-esc="curr_pl and curr_pl.name or ' - '" />
                 <span class="caret"></span>
             </a>
             <ul class="dropdown-menu" role="menu">
                 <li t-foreach="website_sale_pricelists" t-as="pl">
-                    <a t-att-href="'/shop/change_pricelist/%s' % pl.id">
+                    <a role="menuitem" t-att-href="'/shop/change_pricelist/%s' % pl.id">
                         <span class="switcher_pricelist" t-att-data-pl_id="pl.id" t-esc="pl.name" />
                     </a>
                 </li>
@@ -247,7 +248,7 @@
             ]"/>
             <t t-set="website_sale_sortable_current" t-value="[sort for sort in website_sale_sortable if sort[1]==request.params.get('order', '')]"/>
             <div class="dropdown btn-group dropdown_sorty_by">
-                <a href="#" class="dropdown-toggle btn btn-default" data-toggle="dropdown">
+                <a role="button" href="#" class="dropdown-toggle btn btn-default" data-toggle="dropdown">
                     <t t-if='len(website_sale_sortable_current)'>
                         <span>Sorting by : <t t-raw='website_sale_sortable_current[0][0]'/></span>
                     </t>
@@ -258,7 +259,7 @@
                 </a>
                 <ul class="dropdown-menu" role="menu">
                     <li t-foreach="website_sale_sortable" t-as="sortby">
-                        <a t-att-href="keep('/shop', order=sortby[1])">
+                        <a role="menuitem" t-att-href="keep('/shop', order=sortby[1])">
                             <span t-raw="sortby[0]"/>
                         </a>
                     </li>
@@ -301,7 +302,9 @@
 
     <template id="option_collapse_categories_recursive" name="Collapse Category Recursive">
         <li t-att-class="'active' if categ.id == int(category or 0) else None">
-            <i t-if="categ.child_id" t-attf-class="text-primary fa #{'fa-chevron-down' if categ.id in parent_category_ids else 'fa-chevron-right'}" />
+            <i t-if="categ.child_id" t-attf-class="text-primary fa #{'fa-chevron-down' if categ.id in parent_category_ids else 'fa-chevron-right'}"
+               t-attf-title="#{'Unfold' if categ.id in parent_category_ids else 'Fold'}"
+               t-attf-aria-label="#{'Unfold' if categ.id in parent_category_ids else 'Fold'}" role="img"/>
             <a t-att-href="keep('/shop/category/' + slug(categ), category=0)" t-field="categ.name"></a>
             <ul t-if="categ.child_id" class="nav nav-pills nav-stacked nav-hierarchy" t-att-style="'display:block;' if categ.id in parent_category_ids else 'display:none;'">
                 <t t-foreach="categ.child_id" t-as="categ">
@@ -436,12 +439,10 @@
 
                                 <t t-if="len(image_ids) or variant_img">
                                     <a class="carousel-control left" href="#o-carousel-product" role="button" data-slide="prev" >
-                                        <span class="fa fa-chevron-left" aria-hidden="true"/>
-                                        <span class="sr-only">Previous</span>
+                                        <span class="fa fa-chevron-left" role="img" aria-label="Previous" title="Previous"/>
                                     </a>
                                     <a class="carousel-control right" href="#o-carousel-product" role="button" data-slide="next">
-                                        <span class="fa fa-chevron-right" aria-hidden="true"/>
-                                        <span class="sr-only">Next</span>
+                                        <span class="fa fa-chevron-right" role="img" aria-label="Next" title="Next"/>
                                     </a>
                                 </t>
                               </div>
@@ -475,7 +476,7 @@
                                     </t>
                                     <t t-call="website_sale.product_price" />
                                     <p t-if="len(product.product_variant_ids) &gt; 1" class="css_not_available_msg bg-danger" style="padding: 15px;">This combination does not exist.</p>
-                                    <a id="add_to_cart" class="btn btn-primary btn-lg mt8 js_check_product a-submit" href="#">Add to Cart</a>
+                                    <a role="button" id="add_to_cart" class="btn btn-primary btn-lg mt8 js_check_product a-submit" href="#">Add to Cart</a>
                                 </div>
                             </form>
                             <hr t-if="product.description_sale" />
@@ -579,11 +580,11 @@
     <template id="product_quantity" inherit_id="website_sale.product" customize_show="True" name="Select Quantity">
       <xpath expr="//a[@id='add_to_cart']" position="before">
         <div class="css_quantity input-group oe_website_spinner" contenteditable="false">
-            <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json">
+            <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json" aria-label="Remove one" title="Remove one">
                 <i class="fa fa-minus"></i>
             </a>
             <input type="text" class="form-control quantity" data-min="1" name="add_qty" value="1"/>
-            <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json">
+            <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json" aria-label="Add one" title="Add one">
                 <i class="fa fa-plus"></i>
             </a>
         </div>
@@ -778,8 +779,8 @@
                                             <div class="col-md-3 col-sm-4">
                                             </div>
                                             <div class="col-md-9 col-sm-8">
-                                                <a href="/shop/checkout" class="btn btn-default mb32 pull-left"><span class="fa fa-chevron-left" /> Previous</a>
-                                                <a class="btn btn-primary pull-right mb32 o_website_form_send" href="/shop/confirm_order">Next <span class="fa fa-chevron-right" /></a>
+                                                <a role="button" href="/shop/checkout" class="btn btn-default mb32 pull-left"><span class="fa fa-chevron-left" > Previous</span></a>
+                                                <a role="button" class="fa fa-chevron-suffix-right btn btn-primary pull-right mb32 o_website_form_send" href="/shop/confirm_order">Next</a>
                                             </div>
                                         </div>
                                     </form>
@@ -844,11 +845,11 @@
                         </td>
                         <td class="text-center td-qty">
                             <div class="css_quantity input-group oe_website_spinner">
-                                <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json hidden-xs">
+                                <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json hidden-xs" aria-label="Remove one" title="Remove one">
                                     <i class="fa fa-minus"></i>
                                 </a>
                                 <input type="text" class="js_quantity form-control quantity" t-att-data-line-id="line.id" t-att-data-product-id="line.product_id.id" t-att-value="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty" />
-                                <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json hidden-xs">
+                                <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json hidden-xs" aria-label="Add one" title="Add one">
                                     <i class="fa fa-plus"></i>
                                 </a>
                             </div>
@@ -861,7 +862,7 @@
                             <span t-field="line.price_reduce_taxinc" style="white-space: nowrap;" t-options="{'widget': 'monetary', 'from_currency': website_sale_order.pricelist_id.currency_id, 'display_currency': website.currency_id}" groups="sale.group_show_price_total" />
                         </td>
                         <td class="td-action">
-                            <a href='#' class='js_delete_product no-decoration'> <small><i class='fa fa-trash-o'></i></small></a>
+                            <a href='#' aria-label="Remove from cart" title="Remove from cart" class='js_delete_product no-decoration'> <small><i class='fa fa-trash-o'></i></small></a>
                         </td>
                     </tr>
                 </t>
@@ -883,7 +884,7 @@
                         <div class="col-lg-8 col-sm-12 col-xs-12 oe_cart">
                             <div class="row">
                                 <div class="col-md-12">
-                                    <div t-if="abandoned_proceed or access_token" class="mt8 mb8 alert alert-info"> <!-- abandoned cart choices -->
+                                    <div t-if="abandoned_proceed or access_token" class="mt8 mb8 alert alert-info" role="alert"> <!-- abandoned cart choices -->
                                         <t t-if="abandoned_proceed">
                                             <p>Your previous cart has already been completed.</p>
                                             <p t-if="website_sale_order">Please proceed your current cart.</p>
@@ -899,13 +900,11 @@
                                     </div>
                                     <t t-call="website_sale.cart_lines" />
                                     <div class="clearfix" />
-                                    <a href="/shop" class="btn btn-default mb32 hidden-xs hidden-sm hidden-md">
-                                        <span class="fa fa-chevron-left" />
-                                        <span class="">Continue Shopping</span>
+                                    <a role="button" href="/shop" class="btn btn-default mb32 hidden-xs hidden-sm hidden-md">
+                                        <span class="fa fa-chevron-left">Continue Shopping</span>
                                     </a>
-                                    <a t-if="website_sale_order and website_sale_order.website_order_line" class="btn btn-primary pull-right mb32 mr8 hidden visible-lg" href="/shop/checkout?express=1">
-                                        <span class="">Process Checkout</span>
-                                        <span class="fa fa-chevron-right" />
+                                    <a role="button" t-if="website_sale_order and website_sale_order.website_order_line" class="btn btn-primary pull-right mb32 mr8 hidden visible-lg" href="/shop/checkout?express=1">
+                                        <span class="fa fa-chevron-suffix-right">Process Checkout</span>
                                     </a>
                                     <div class="oe_structure" />
                                 </div>
@@ -914,13 +913,12 @@
                         <div class="col-lg-4 col-sm-12 col-xs-12">
                             <t t-call='website_sale.short_cart_summary'/>
                             <div class='hidden-lg'>
-                                <a href="/shop" class="btn btn-default mb32">
-                                    <span class="fa fa-chevron-left" />
-                                    Continue<span class="hidden-xs"> Shopping</span>
+                                <a role="button" href="/shop" class="btn btn-default mb32">
+                                    <span class="fa fa-chevron-left">
+                                    Continue<span class="hidden-xs"> Shopping</span></span>
                                 </a>
-                                <a t-if="website_sale_order and website_sale_order.website_order_line" class="btn btn-primary pull-right mb32 mr8" href="/shop/checkout?express=1">
-                                    <span class="">Process Checkout</span>
-                                    <span class="fa fa-chevron-right" />
+                                <a role="button" t-if="website_sale_order and website_sale_order.website_order_line" class="btn btn-primary pull-right mb32 mr8" href="/shop/checkout?express=1">
+                                    <span class="fa fa-suffix-chevron-right">Process Checkout</span>
                                 </a>
                             </div>
                         </div>
@@ -956,7 +954,7 @@
                         <t t-set='hide_coupon'>True</t>
                     </t>
                 </span>
-                <a class="btn btn-primary" href="/shop/cart">
+                <a role="button" class="btn btn-primary" href="/shop/cart">
                        View Cart (<t t-esc="website_sale_order.cart_quantity" /> items)
                      </a>
             </div>
@@ -990,7 +988,7 @@
                         </td>
                         <td class="col-md-2 col-sm-3 col-xs-4 text-center">
                             <input class="js_quantity" name="product_id" t-att-data-product-id="product.id" type="hidden" />
-                            <a class="btn btn-link js_add_suggested_products">
+                            <a role="button" class="btn btn-link js_add_suggested_products">
                                 <strong>Add to Cart</strong>
                             </a>
                         </td>
@@ -1010,7 +1008,7 @@
             <div class="input-group" style='margin-left:auto; margin-right: auto'>
                 <input name="promo" style='min-width:180px' class="form-control" type="text" placeholder="code..." t-att-value="website_sale_order.pricelist_id.code or None" />
                 <div class="input-group-btn">
-                    <a class="btn btn-default a-submit">Apply</a>
+                    <a role="button" class="btn btn-default a-submit">Apply</a>
                 </div>
             </div>
         </form>
@@ -1057,8 +1055,8 @@
                                             <div class="col-sm-12 col-md-12 one_kanban">
                                                 <form action="/shop/address" method="post" class=''>
                                                     <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
-                                                    <a class='a-submit btn btn-default mb16 btn-block'>
-                                                        <i class="fa fa-plus-square" aria-hidden="true"></i> Add an address
+                                                    <a role="button" class='a-submit btn btn-default mb16 btn-block'>
+                                                        <span class="fa fa-plus-square"> Add an address</span>
                                                     </a>
                                                 </form>
                                             </div>
@@ -1079,9 +1077,9 @@
                             </t>
                             <div class="clearfix" />
                             <div>
-                                <a href="/shop/cart" class="btn btn-default mb32">
-                                    <span class="fa fa-chevron-left" /> Return to Cart</a>
-                                <a class="btn btn-primary pull-right mb32 " href="/shop/confirm_order">Confirm <span class="fa fa-chevron-right" /></a>
+                                <a role="button" href="/shop/cart" class="btn btn-default mb32">
+                                    <span class="fa fa-chevron-left" > Return to Cart</span></a>
+                                <a role="button" class="btn btn-primary pull-right mb32 " href="/shop/confirm_order"><span class="fa fa-suffix-chevron-right">Confirm</span></a>
                             </div>
                         </div>
                     </div>
@@ -1099,19 +1097,19 @@
                 </t>
                 <input type='submit'/>
             </form>
-            <a t-if="not actual_partner or (ship.id in actual_partner.ids + actual_partner.child_ids.ids)" class='btn btn-link pull-right js_edit_address no-decoration' title="Edit this address"><i class='fa fa-edit'/></a>
+            <a role="button" t-if="not actual_partner or (ship.id in actual_partner.ids + actual_partner.child_ids.ids)" class='btn btn-link pull-right js_edit_address no-decoration' title="Edit this address" aria-label="Edit this address"><i class='fa fa-edit'/></a>
             <div t-att-class="'panel panel-default %s' % (selected and 'border_primary' or 'js_change_shipping')">
                 <div class='panel-body' style='min-height: 130px;'>
                     <t t-esc="contact" t-options="dict(widget='contact', fields=['name', 'address'], no_marker=True)"/>
                 </div>
                 <div class='panel-footer' t-if='not readonly'>
                     <span class='btn-ship' t-att-style="'' if selected else 'display:none;'">
-                        <a class="btn btn-block btn-primary">
-                            <i class='fa fa-check'></i> Ship to this address
+                        <a role="button" class="btn btn-block btn-primary">
+                            <span class='fa fa-check'> Ship to this address</span>
                         </a>
                     </span>
                     <span class='btn-ship' t-att-style="'' if not selected else 'display:none;'">
-                        <a class="btn btn-block btn-default">
+                        <a role="button" class="btn btn-block btn-default">
                             Select this address
                         </a>
                     </span>
@@ -1140,7 +1138,7 @@
                                 <t t-if="mode == ('new', 'billing')">
                                     <h2 class="page-header mt8 ml16">Your Address
                                         <small> or </small>
-                                        <a href='/web/login?redirect=/shop/checkout' class='btn btn-primary' style="margin-top: -11px">Log In</a>
+                                        <a role="button" href='/web/login?redirect=/shop/checkout' class='btn btn-primary' style="margin-top: -11px">Log In</a>
                                     </h2>
                                 </t>
                                 <t t-if="mode == ('edit', 'billing')">
@@ -1251,11 +1249,11 @@
 
                                     <div class="clearfix"/>
                                     <div style='padding: 0 15px'>
-                                        <a t-att-href="mode == ('new', 'billing') and '/shop/cart' or '/shop/checkout'" class="btn btn-default mb32">
-                                            <span class="fa fa-chevron-left" /> Back
+                                        <a role="button" t-att-href="mode == ('new', 'billing') and '/shop/cart' or '/shop/checkout'" class="btn btn-default mb32">
+                                            <span class="fa fa-chevron-left">Back </span>
                                         </a>
-                                        <a class="btn btn-primary pull-right mb32 a-submit a-submit-disable a-submit-loading">
-                                            <span>Next </span><span class="fa fa-chevron-right" />
+                                        <a role="button" class="btn btn-primary pull-right mb32 a-submit a-submit-disable a-submit-loading">
+                                            <span class="fa fa-suffix-chevron-right">Next </span>
                                         </a>
                                     </div>
                                 </form>
@@ -1283,7 +1281,7 @@
                         </div>
                         <div class="col-xs-12" t-if="errors">
                             <t t-foreach="errors" t-as="error">
-                                <div class="alert alert-danger" t-if="error">
+                                <div class="alert alert-danger" t-if="error" role="alert">
                                     <h4>
                                         <t t-esc="error[0]" />
                                     </h4>
@@ -1300,7 +1298,7 @@
                                 <div class="panel panel-default">
                                   <div class="panel-headisng"></div>
                                   <div class="panel-body">
-                                    <a class='pull-right no-decoration' href='/shop/checkout'><i class='fa fa-edit'/> Edit</a>
+                                      <a class='pull-right no-decoration' href='/shop/checkout'><span class='fa fa-edit'> Edit</span></a>
                                     <t t-set="same_shipping" t-value="bool(order.partner_shipping_id==order.partner_id or only_services)" />
                                     <div><b>Billing<t t-if="same_shipping and not only_services"> &amp; Shipping</t>: </b><span t-esc='order.partner_id' t-options="dict(widget='contact', fields=['address'], no_marker=True, separator=', ')" class="address-inline"/></div>
                                     <div t-if="not same_shipping and not only_services" groups="sale.group_delivery_invoice_address"><b>Shipping: </b><span t-esc='order.partner_shipping_id' t-options="dict(widget='contact', fields=['address'], no_marker=True, separator=', ')"  class="address-inline"/></div>
@@ -1331,19 +1329,19 @@
                             </div>
 
                             <div t-if="not (form_acquirers or s2s_acquirers)">
-                                <a class="btn-link"
+                                <a role="button" class="btn-link"
                                     groups="base.group_system"
                                     t-attf-href="/web#return_label=Website&amp;action=#{payment_action_id}">
-                                        <i class="fa fa-arrow-right" aria-hidden="true"></i> Add payment acquirers
+                                    <span class="fa fa-arrow-right"> Add payment acquirers</span>
                                 </a>
                             </div>
                             <div class="js_payment mb64 row" t-if="not website_sale_order.amount_total" id="payment_method">
                                 <div class="col-sm-12">
                                     <form target="_self" action="/shop/payment/validate" method="post" class="pull-right">
                                         <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
-                                        <a class="btn btn-primary a-submit">
-                                            <span t-if="order.amount_total &gt; 0">Pay Now <span class="fa fa-chevron-right"></span></span>
-                                            <span t-if="order.amount_total == 0">Confirm Order <span class="fa fa-chevron-right"></span></span>
+                                        <a role="button" class="btn btn-primary a-submit">
+                                            <span class="fa fa-suffix-chevron-right" t-if="order.amount_total &gt; 0">Pay Now </span>
+                                            <span class="fa fa-suffix-chevron-right" t-if="order.amount_total == 0">Confirm Order </span>
                                         </a>
                                     </form>
                                 </div>
@@ -1367,7 +1365,7 @@
                     <t t-call="website_sale.total">
                         <t t-set='no_rowspan'>1</t>
                     </t>
-                    <a t-if="website_sale_order and website_sale_order.website_order_line" class="btn btn-default pull-right mr8 hidden visible-lg" href="/shop/checkout?express=1">
+                    <a role="button" t-if="website_sale_order and website_sale_order.website_order_line" class="btn btn-default pull-right mr8 hidden visible-lg" href="/shop/checkout?express=1">
                         <span>Process Checkout</span>
                     </a>
                 </div>
@@ -1380,7 +1378,7 @@
             <div class="panel-body row">
                 <div class='toggle_summary col-md-12 hidden-lg'>
                     <b>Your order: </b> <span t-field="website_sale_order.amount_total" t-options='{"widget": "monetary", "display_currency": website_sale_order.pricelist_id.currency_id}'/>
-                    <span class='fa fa-chevron-down fa-border pull-right'></span>
+                    <span class='fa fa-chevron-down fa-border pull-right' role="img" aria-label="Details" title="Details"></span>
                 </div>
 
                 <div t-if="not website_sale_order or not website_sale_order.website_order_line" class="well well-lg">
@@ -1453,12 +1451,12 @@
                             <div class="oe_cart">
                                 <div class="thanks_msg mb32">
                                     <h2>Thank you for your order.
-                                        <a class="btn btn-primary hidden-xs" href="/shop/print" target="_blank"><i class="fa fa-print"></i> Print</a>
+                                        <a role="button" class="btn btn-primary hidden-xs" href="/shop/print" target="_blank" aria-label="Print" title="Print"><i class="fa fa-print"></i> Print</a>
                                     </h2>
                                 </div>
                                 <t t-if="request.env['ir.config_parameter'].sudo().get_param('auth_signup.invitation_scope', 'b2b') == 'b2c' and request.website.is_public_user()">
-                                    <p class='alert alert-info mt16'>
-                                        <a t-att-href='order.partner_id.signup_prepare() and order.partner_id.signup_url' class='btn btn-sm btn-primary'>Sign Up</a>
+                                    <p class='alert alert-info mt16' role="status">
+                                        <a role="button" t-att-href='order.partner_id.signup_prepare() and order.partner_id.signup_url' class='btn btn-sm btn-primary'>Sign Up</a>
                                          to follow your order.
                                     </p>
                                 </t>
@@ -1566,7 +1564,7 @@
                     (payment_tx_id.state == 'done' and 'panel-success') or
                     (payment_tx_id.state == 'authorized' and 'panel-success') or
                     'panel-danger')">
-                <a groups="base.group_system" class="btn pull-right" target="_blank"
+                <a role="button" groups="base.group_system" class="btn pull-right" target="_blank" aria-label="Edit" title="Edit"
                         t-att-href="'/web#model=%s&amp;id=%s&amp;action=%s&amp;view_type=form' % ('payment.acquirer', payment_tx_id.acquirer_id.id, 'payment.action_payment_acquirer')">
                     <i class="fa fa-pencil"></i>
                 </a>
@@ -1605,8 +1603,8 @@
         <xpath expr="//div[@id='o_new_content_menu_choices']//ul" position="inside">
             <li groups="sales_team.group_sale_manager">
                 <a id="create-new-product" href="#" data-action="new_product">
-                    <i class="fa fa-shopping-cart" />
-                    <p>New Product</p>
+                    <p class="fa fa-shopping-cart">
+                    New Product</p>
                 </a>
             </li>
         </xpath>
diff --git a/addons/website_sale_comparison/static/src/xml/comparison.xml b/addons/website_sale_comparison/static/src/xml/comparison.xml
index 76009b7c6570..9e48ded7cb8f 100644
--- a/addons/website_sale_comparison/static/src/xml/comparison.xml
+++ b/addons/website_sale_comparison/static/src/xml/comparison.xml
@@ -4,24 +4,24 @@
         <div class="o_product_feature_panel hidden-xs css_editable_mode_hidden" style="display:none">
             <span class="o_product_panel" id="comparelist">
                 <span class="o_product_panel_header">
-                    <span class="o_product_icon"><i class="fa fa-exchange"></i></span>
+                    <span class="o_product_icon"><i class="fa fa-exchange" role="img" aria-label="Product" title="Product"></i></span>
                     <span class="o_product_text">Compare</span>
                     <span class="o_product_circle o_animate_blink label label-primary">0</span>
                 </span>
                 <span class="o_product_panel_content">
                     <div class="o_comparelist_products">
                         <div class="o_comparelist_limit_warning" style="display:none">
-                            <div class="o_shortlog alert alert-warning">
-                                <span><i class="fa fa-warning text-danger"></i> You can compare max 4 products.</span>
+                            <div class="o_shortlog alert alert-warning" role="alert">
+                                <span><i class="fa fa-warning text-danger" role="img" aria-label="Warning" title="Warning"></i> You can compare max 4 products.</span>
                             </div>
                         </div>
                     </div>
                     <div class="o_comparelist_button" style='display:none'>
-                        <a class="btn btn-primary btn-block" href="#"><i class="fa fa-exchange mr4"></i>Compare</a>
+                        <a role="button" class="btn btn-primary btn-block" href="#"><span class="fa fa-exchange mr4">Compare</span></a>
                     </div>
                 </span>
             </span>
         </div>
     </t>
 
-</templates>
\ No newline at end of file
+</templates>
diff --git a/addons/website_sale_comparison/views/website_sale_comparison_template.xml b/addons/website_sale_comparison/views/website_sale_comparison_template.xml
index ffc6c2ffe93f..f89b89c36824 100644
--- a/addons/website_sale_comparison/views/website_sale_comparison_template.xml
+++ b/addons/website_sale_comparison/views/website_sale_comparison_template.xml
@@ -10,14 +10,14 @@
 
     <template id="add_to_compare" inherit_id="website_sale.products_item" active="True" customize_show="True" name="Comparison List" priority="22">
         <xpath expr="//div[hasclass('product_price')]" position="inside">
-            <a class="hidden-xs btn btn-default btn-xs o_add_compare" title="Compare" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_comparelist"><span class="fa fa-exchange"></span></a>
+            <a role="button" class="hidden-xs btn btn-default btn-xs o_add_compare" title="Compare" aria-label="Compare" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_comparelist"><span class="fa fa-exchange"></span></a>
         </xpath>
     </template>
 
     <template id="product_add_to_compare" name='Add to comparison in product page' inherit_id="website_sale.product" priority="8">
         <xpath expr="//a[@id='add_to_cart']" position="after">
             <t t-if="product.env.ref('website_sale_comparison.add_to_compare').active">
-                <a class="hidden-xs btn btn-default btn-lg mt8 o_add_compare_dyn" title="Compare" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_comparelist"><span class="fa fa-exchange"></span></a>
+                <a role="button" class="hidden-xs btn btn-default btn-lg mt8 o_add_compare_dyn" title="Compare" aria-label="Compare" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_comparelist"><span class="fa fa-exchange"></span></a>
             </t>
         </xpath>
     </template>
@@ -58,7 +58,7 @@
     <template id='recommended_product' inherit_id="website_sale.recommended_products" name="Alternative Products">
         <xpath expr="//h3" position="replace">
             <t t-set="ids" t-value="str(product.product_variant_id.id) + ','+ ','.join([str(a) for a in product.alternative_product_ids.mapped('product_variant_id.id')])"/>
-            <div><span class='h3'>Suggested alternatives: </span><a class="btn btn-primary" t-attf-href="/shop/compare/?products=#{ids}"><i class="fa fa-exchange"></i> Compare</a></div>
+            <div><span class='h3'>Suggested alternatives: </span><a role="button" class="btn btn-primary fa fa-exchange" t-attf-href="/shop/compare/?products=#{ids}"> Compare</a></div>
         </xpath>
     </template>
 
@@ -78,7 +78,7 @@
                                         <strong class='pull-right'>x</strong>
                                     </a>
                                     <a t-att-href="'/shop/product/%s' % slug(product.product_tmpl_id)">
-                                        <img t-attf-src="/web/image/product.product/#{product.id}/image/200x150" class="img img-responsive" style="margin:auto;"/>
+                                        <img t-attf-src="/web/image/product.product/#{product.id}/image/200x150" class="img img-responsive" style="margin:auto;" alt="Product image"/>
                                     </a>
                                     <div class='product_summary'>
                                         <a class="o_product_comparison_table" t-attf-href="/shop/product/#{ slug(product.product_tmpl_id) }">
@@ -95,7 +95,7 @@
 
                                         <form action="/shop/cart/update" method="post" class="text-center">
                                             <input name="product_id" t-att-value="product.id" type="hidden"/>
-                                            <a class="btn btn-primary btn-block a-submit"><i class="fa fa-shopping-cart"></i>&amp;nbsp;Add to Cart</a>
+                                            <a role="button" class="btn btn-primary btn-block a-submit fa fa-shopping-cart">&amp;nbsp;Add to Cart</a>
                                         </form>
                                     </div>
                                 </td>
@@ -104,7 +104,7 @@
                             <t t-foreach="specs.keys()" t-as="spec">
                                 <t t-if="len(specs.keys())&gt;1">
                                     <tr class="success text-left breadcrumb clickable" data-toggle="collapse" t-att-data-target="'.'+spec.split()[0]">
-                                        <th t-att-colspan="len(products) + 1"><i class="fa fa-chevron-circle-down o_product_comparison_collpase"></i><t t-esc="spec"/></th>
+                                        <th t-att-colspan="len(products) + 1"><i class="fa fa-chevron-circle-down o_product_comparison_collpase" role="img" aria-label="Collapse" title="Collapse"></i><t t-esc="spec"/></th>
                                     </tr>
                                 </t>
                                 <tr t-foreach="specs[spec].keys()" t-as="att" t-att-class="'collapse in ' + spec.split()[0]">
@@ -123,7 +123,7 @@
     <template id="product_product" name="Comparator - Product row in comparator popover">
         <div class="row mt8 o_product_row" t-att-data-category_ids="product.public_categ_ids.ids">
             <div class="col-sm-3 col-xs-3 mb8">
-                <img class="img img-responsive" t-attf-src="/web/image/product.product/#{product.id}/image_small" style="max-height: 50px;" />
+                <img class="img img-responsive" t-attf-src="/web/image/product.product/#{product.id}/image_small" style="max-height: 50px;" alt="Product image"/>
             </div>
             <div class="col-sm-7 col-xs-7 mb8 text-left">
                 <h5>
@@ -140,7 +140,7 @@
             </div>
             <div class="col-sm-1 col-xs-1 mt32">
                 <a href='#' class="o_remove" title="Remove" t-att-data-product_product_id="product.id">
-                    <i class="fa fa-trash" ></i>
+                    <i class="fa fa-trash" role="img" aria-label="Remove"></i>
                 </a>
             </div>
         </div>
diff --git a/addons/website_sale_digital/views/website_sale_digital.xml b/addons/website_sale_digital/views/website_sale_digital.xml
index 448118d6198e..c1e161fc57b1 100644
--- a/addons/website_sale_digital/views/website_sale_digital.xml
+++ b/addons/website_sale_digital/views/website_sale_digital.xml
@@ -10,11 +10,11 @@
                     </button>
                     <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
                         <t t-foreach="attachments" t-as="a">
-                            <li role="presentation"><a role="menuitem" tabindex="-1" t-att-href="'/my/download?attachment_id=%i' % a['id']"><t t-esc="a['name']"/></a></li>
+                            <li><a role="menuitem" tabindex="-1" t-att-href="'/my/download?attachment_id=%i' % a['id']"><t t-esc="a['name']"/></a></li>
                         </t>
                     </ul>
                 </span>
             </t>
         </xpath>
     </template>
-</odoo>
\ No newline at end of file
+</odoo>
diff --git a/addons/website_sale_link_tracker/static/src/xml/website_sale_dashboard_utm_chart.xml b/addons/website_sale_link_tracker/static/src/xml/website_sale_dashboard_utm_chart.xml
index 04a88cd59efb..c56cb4549ce7 100644
--- a/addons/website_sale_link_tracker/static/src/xml/website_sale_dashboard_utm_chart.xml
+++ b/addons/website_sale_link_tracker/static/src/xml/website_sale_dashboard_utm_chart.xml
@@ -20,12 +20,12 @@
 
     <t t-name="website_sale.LinkTrackersDropDown">
         <div class="dropdown">
-            <button class="btn btn-default btn-sm dropdown-toggle utm_dropdown ml4" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"><span class="utm_button_name">Campaigns</span><span class="caret ml4"/>
+            <button class="btn btn-default btn-sm dropdown-toggle utm_dropdown ml4" id="utm_dropdown" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"><span class="utm_button_name">Campaigns</span><span class="caret ml4"/>
             </button>
             <ul class="dropdown-menu" role="menu" aria-labelledby="utm_dropdown">
-                <li><a class="js_utm_selector" name="campaign_id">Campaigns</a></li>
-                <li><a class="js_utm_selector" name="medium_id">Medium</a></li>
-                <li><a class="js_utm_selector" name="source_id">Sources</a></li>
+                <li><a role="menuitem" class="js_utm_selector" name="campaign_id">Campaigns</a></li>
+                <li><a role="menuitem" class="js_utm_selector" name="medium_id">Medium</a></li>
+                <li><a role="menuitem" class="js_utm_selector" name="source_id">Sources</a></li>
             </ul>
         </div>
     </t>
diff --git a/addons/website_sale_options/static/src/js/website_sale.test.js b/addons/website_sale_options/static/src/js/website_sale.test.js
index 38662b52713e..28c457632241 100644
--- a/addons/website_sale_options/static/src/js/website_sale.test.js
+++ b/addons/website_sale_options/static/src/js/website_sale.test.js
@@ -180,7 +180,7 @@ tour.register('shop_customize', {
         {
             content: "click in modal on 'Proceed to checkout' button",
             extra_trigger: 'body:has(.js_product:contains(Warranty) a:contains(Add to Cart):hidden)',
-            trigger: '.modal-dialog a:contains("Proceed to Checkout")',
+            trigger: 'footer.modal-footer a:contains("Proceed to Checkout")',
         },
         {
             content: "check quantity",
diff --git a/addons/website_sale_options/views/website_sale_options_templates.xml b/addons/website_sale_options/views/website_sale_options_templates.xml
index 90c51ec14f2f..6a58166942c6 100644
--- a/addons/website_sale_options/views/website_sale_options_templates.xml
+++ b/addons/website_sale_options/views/website_sale_options_templates.xml
@@ -26,14 +26,14 @@
 </template>
 
 <template id="modal" name="Optional Products">
-<div id="modal_optional_products" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+<div role="dialog" id="modal_optional_products" class="modal fade" tabindex="-1" aria-labelledby="myModalLabel">
   <div class="modal-dialog modal-lg">
     <div class="modal-content">
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+      <header class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-label="Close">x</button>
         <h4 class="modal-title" id="myModalLabel">Add to Cart</h4>
-      </div>
-      <div class="modal-body">
+      </header>
+      <main class="modal-body">
         <table class="table table-striped table-condensed">
           <thead>
               <tr>
@@ -57,11 +57,11 @@
                 </td>
                 <td class="text-center td-qty">
                   <div class="css_quantity input-group oe_website_spinner">
-                      <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json hidden-xs">
+                      <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json hidden-xs" aria-label="Remove one" title="Remove one">
                           <i class="fa fa-minus"></i>
                       </a>
                       <input type="text" class="js_quantity form-control quantity" data-min="1" name="add_qty" value="1"/>
-                      <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json hidden-xs">
+                      <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json hidden-xs" aria-label="Add one" title="Add one">
                           <i class="fa fa-plus"></i>
                       </a>
                   </div>
@@ -121,10 +121,10 @@
 
                   <div class='mt8'>
                     <input type="hidden" class="js_optional_same_quantity" t-attf-name="optional-add-#{product_index}" value="0"/>
-                    <a href="#" class="js_add btn btn-sm btn-info"><strong>Add<span class='hidden-xs'> to Cart</span></strong></a>
+                    <a role="button" href="#" class="js_add btn btn-sm btn-info"><strong>Add<span class='hidden-xs'> to Cart</span></strong></a>
                     <span class="js_remove hidden">
                       <span class="js_item">1 </span><span class="js_items hidden">5 </span> <span t-field="product.uom_id.sudo().name"/><br/>
-                      <a href="#" class="js_remove btn btn-xs btn-info"><small>Remove <span class='hidden-xs'> from Cart</span></small></a>
+                      <a role="button" href="#" class="js_remove btn btn-xs btn-info"><small>Remove <span class='hidden-xs'> from Cart</span></small></a>
                     </span>
                   </div>
                 </td>
@@ -132,11 +132,11 @@
 
             </tbody>
           </table>
-        </div>
-        <div class="modal-footer">
-          <a class="btn btn-default a-submit js_goto_shop"><i class="fa fa-chevron-left"></i> <span class="hidden-xs">Continue Shopping</span><span class="visible-xs-inline">Continue</span></a>
-          <a class="btn btn-primary pull-right a-submit"><i class="fa fa-shopping-cart fa-fw"></i> <span class="hidden-xs">Proceed to Checkout</span><span class="visible-xs-inline">Checkout</span></a>
-        </div>
+        </main>
+        <footer class="modal-footer">
+          <a role="button" class="btn btn-default a-submit js_goto_shop" aria-label="Continue shopping" title="Continue shopping"><i class="fa fa-chevron-left"></i> <span class="hidden-xs">Continue Shopping</span><span class="visible-xs-inline">Continue</span></a>
+          <a role="button" class="btn btn-primary pull-right a-submit" aria-label="Proceed to checkout" title="Proceed to checkout"><i class="fa fa-shopping-cart fa-fw"></i> <span class="hidden-xs">Proceed to Checkout</span><span class="visible-xs-inline">Checkout</span></a>
+        </footer>
       </div>
     </div>
   </div>
diff --git a/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml b/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml
index fc3095e3c939..38712f507f40 100644
--- a/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml
+++ b/addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml
@@ -10,7 +10,7 @@
                 </div>
                 <t t-if="inventory_availability == 'threshold'">
                     <div t-if="virtual_available lte available_threshold" t-attf-class="availability_message_#{product_template} text-warning mt16">
-                        <i class="fa fa-exclamation-triangle" />
+                        <i class="fa fa-exclamation-triangle" title="Warning" role="img" aria-label="Warning"/>
                         <t t-esc="virtual_available" /> <t t-esc="uom_name" /> available
                     </div>
                     <div t-if="virtual_available gt available_threshold" t-attf-class="availability_message_#{product_template} text-success mt16">In stock</div>
@@ -19,7 +19,7 @@
             <div t-if="cart_qty" t-attf-class="availability_message_#{product_template} text-warning mt8">
                 You already added <t t-if="!virtual_available">all</t> <t t-esc="cart_qty" /> <t t-esc="uom_name" /> in your cart.
             </div>
-            <div t-if="!cart_qty and virtual_available lte 0" t-attf-class="availability_message_#{product_template} text-danger mt16"><i class="fa fa-exclamation-triangle" /> Temporarily out of stock</div>
+            <div t-if="!cart_qty and virtual_available lte 0" t-attf-class="availability_message_#{product_template} text-danger mt16"><i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> Temporarily out of stock</div>
         </t>
         <div t-if="product_type == 'product' and inventory_availability == 'custom'" t-attf-class="availability_message_#{product_template} text-success mt16">
             <t t-esc="custom_message" />
diff --git a/addons/website_sale_stock/views/website_sale_stock_templates.xml b/addons/website_sale_stock/views/website_sale_stock_templates.xml
index 87d9dfd2bdda..a615cd47ed3d 100644
--- a/addons/website_sale_stock/views/website_sale_stock_templates.xml
+++ b/addons/website_sale_stock/views/website_sale_stock_templates.xml
@@ -14,7 +14,7 @@
         <xpath expr="//div[hasclass('css_quantity')]//i[hasclass('fa-plus')]/.." position="replace">
           <t t-if="line._get_stock_warning(clear=False)">
             <a t-attf-href="#" class="mb8 input-group-addon">
-              <i class='fa fa-warning text-warning' t-att-title="line._get_stock_warning()" />
+              <i class='fa fa-warning text-warning' t-att-title="line._get_stock_warning()" role="img" aria-label="Warning"/>
             </a>
           </t>
           <t t-else="1">
@@ -26,7 +26,7 @@
         </xpath>
         <xpath expr="//div[hasclass('js_cart_lines')]" position="after">
           <t t-if='website_sale_order'>
-            <div t-if='website_sale_order._get_stock_warning(clear=False)' class="alert alert-warning">
+            <div t-if='website_sale_order._get_stock_warning(clear=False)' class="alert alert-warning" role="alert">
               <strong>Warning!</strong> <t t-esc='website_sale_order._get_stock_warning()'/>
             </div>
           </t>
@@ -42,13 +42,13 @@
   <template id="website_sale_stock_payment" inherit_id="website_sale.cart_summary">
      <xpath expr="//table[@id='cart_products']//td[hasclass('td-qty')]" position="inside">
       <t t-if='line._get_stock_warning(clear=False)'>
-        <i class='fa fa-warning text-warning' t-att-title="line._get_stock_warning()" />
+        <i class='fa fa-warning text-warning' t-att-title="line._get_stock_warning()" role="img" aria-label="Warning"/>
       </t>
     </xpath>
     <xpath expr="//table[@id='cart_products']" position="after">
         <t t-if='website_sale_order'>
           <t t-set='warning' t-value='website_sale_order._get_stock_warning(clear=False)' />
-          <div t-if='warning' class="alert alert-warning">
+          <div t-if='warning' class="alert alert-warning" role="alert">
             <strong>Warning!</strong> <t t-esc='website_sale_order._get_stock_warning()'/>
           </div>
         </t>
diff --git a/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml b/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml
index 6be0378297c0..4a051e7241bf 100644
--- a/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml
+++ b/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml
@@ -12,7 +12,7 @@
     <template id="add_to_wishlist" inherit_id="website_sale.products_item" active="True" customize_show="True" name="Wishlist" priority="20">
         <xpath expr="//div[hasclass('product_price')]" position="inside">
             <t t-set="in_wish" t-value="product.product_variant_ids &amp; request.env['product.wishlist'].current().mapped('product_id')"/>
-            <a class="btn btn-default btn-xs o_add_wishlist" t-att-disabled='in_wish or None' title="Add to Wishlist" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_wishlist"><span class="fa fa-heart"></span></a>
+            <a role="button" class="btn btn-default btn-xs o_add_wishlist" t-att-disabled='in_wish or None' title="Add to Wishlist" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_wishlist"><span class="fa fa-heart" role="img" aria-label="Add to wishlist"></span></a>
         </xpath>
     </template>
 
@@ -20,7 +20,7 @@
         <xpath expr="//a[@id='add_to_cart']" position="after">
             <t t-if="product.env.ref('website_sale_wishlist.add_to_wishlist').active">
                 <t t-set="in_wish" t-value="product.product_variant_ids &amp; request.env['product.wishlist'].current().mapped('product_id')"/>
-                <a class="btn btn-default btn-lg mt8 o_add_wishlist_dyn" t-att-disabled='in_wish or None' title="Add to Wishlist" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_wishlist"><span class="fa fa-heart"></span></a>
+                <a role="button" class="btn btn-default btn-lg mt8 o_add_wishlist_dyn" t-att-disabled='in_wish or None' title="Add to Wishlist" t-att-data-product-product-id="product.product_variant_ids[0].id" data-action="o_wishlist"><span class="fa fa-heart" role="img" aria-label="Add to wishlist"></span></a>
             </t>
         </xpath>
     </template>
@@ -31,8 +31,9 @@
                 <t t-set='wishcount' t-value="len(request.env['product.wishlist'].current())"/>
                 <li id="my_wish" t-att-style="not wishcount and 'display:none;'">
                     <a href="/shop/wishlist">
-                        <i class="fa fa-heart"></i>
-                        Wishlist <sup t-attf-class="my_wish_quantity o_animate_blink label label-primary"><t t-esc='wishcount'/></sup>
+                        <span class="fa fa-heart">
+                            Wishlist <sup t-attf-class="my_wish_quantity o_animate_blink label label-primary"><t t-esc='wishcount'/></sup>
+                        </span>
                     </a>
                 </li>
             </t>
@@ -56,13 +57,13 @@
                                     <tr t-att-data-wish-id='wish.id' t-att-data-product-id='wish.product_id.id'>
                                         <td class='td-img'>
                                             <a t-att-href="'/shop/product/%s' % slug(wish.product_id.product_tmpl_id)">
-                                                <img t-attf-src="/web/image/product.product/#{wish.product_id.id}/image/100x100" class="img img-responsive" style="margin:auto;"/>
+                                                <img t-attf-src="/web/image/product.product/#{wish.product_id.id}/image/100x100" class="img img-responsive" style="margin:auto;" alt="Product image"/>
                                             </a>
                                         </td>
                                         <td class='text-left'>
                                             <strong><a t-att-href="'/shop/product/%s' % slug(wish.product_id.product_tmpl_id)"><t t-esc="wish.product_id.display_name" /></a></strong>
                                             <small class='hidden-xs'><p t-field="wish.product_id.description_sale" class="text-muted"/></small>
-                                            <a class="o_wish_rm no-decoration"><small><i class='fa fa-trash-o'></i> Remove</small></a>
+                                            <a class="o_wish_rm no-decoration"><small><span class='fa fa-trash-o'> Remove</span></small></a>
                                         </td>
                                         <td style='width:80px'>
                                             <t t-if='wish.price_new != wish.price'>
@@ -73,7 +74,7 @@
                                         </td>
                                         <td class='text-center td-wish-btn'>
                                             <input name="product_id" t-att-value="wish.product_id.id" type="hidden"/>
-                                            <a class="btn btn-default btn-block o_wish_add mb4" >Add <span class='hidden-xs'>to Cart</span></a>
+                                            <a role="button" class="btn btn-default btn-block o_wish_add mb4" >Add <span class='hidden-xs'>to Cart</span></a>
                                         </td>
                                     </tr>
                                 </t>
diff --git a/addons/website_slides/static/src/js/slides_upload.js b/addons/website_slides/static/src/js/slides_upload.js
index b3953f125715..29d5e230ec8b 100644
--- a/addons/website_slides/static/src/js/slides_upload.js
+++ b/addons/website_slides/static/src/js/slides_upload.js
@@ -355,12 +355,12 @@ var SlideDialog = Widget.extend({
                 values.website_published = true;
             }
             this.$('.oe_slides_upload_loading').show();
-            this.$('.modal-footer, .modal-body').hide();
+            this.$('footer.modal-footer, main.modal-body').hide();
             ajax.jsonRpc("/slides/add_slide", 'call', values).then(function (data) {
                 if (data.error) {
                     self.display_alert(data.error);
                     self.$('.oe_slides_upload_loading').hide();
-                    self.$('.modal-footer, .modal-body').show();
+                    self.$('footer.modal-footer, main.modal-body').show();
 
                 } else {
                     window.location = data.url;
diff --git a/addons/website_slides/static/src/xml/website_slides.xml b/addons/website_slides/static/src/xml/website_slides.xml
index 1944de0c9d89..de4fe12a26ea 100644
--- a/addons/website_slides/static/src/xml/website_slides.xml
+++ b/addons/website_slides/static/src/xml/website_slides.xml
@@ -1,23 +1,23 @@
 <templates id="template" xml:space="preserve">
 
     <t t-name="website.slide.upload">
-        <div class="modal" tabindex="-1" role="dialog" aria-hidden="true">
+        <div role="dialog" class="modal" tabindex="-1">
             <div class="modal-dialog">
                 <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <header class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
                         <h3 class="modal-title">Upload Presentation</h3>
+                    </header>
+                    <div class="oe_slides_upload_loading text-center" style="display:none" aria-hidden="true" role="status">
+                        <h4><span class='fa fa-spinner fa-spin'> Uploading presentation...  </span></h4>
                     </div>
-                    <div class="oe_slides_upload_loading text-center" style="display:none">
-                        <h4><i class='fa fa-spinner fa-spin'></i> Uploading presentation...  </h4>
-                    </div>
-                    <div class="modal-body">
+                    <main class="modal-body">
                         <form class="clearfix form-horizontal">
                             <div class="form-group">
                                 <div class="col-sm-4">
                                     <div class="img-thumbnail">
                                         <div class="o_slide_preview">
-                                            <img src="/website_slides/static/src/img/document.png" id="slide-image" title="Content Preview" class="img-responsive"/>
+                                            <img src="/website_slides/static/src/img/document.png" id="slide-image" title="Content Preview" alt="Content Preview" class="img-responsive"/>
                                         </div>
                                     </div>
                                 </div>
@@ -64,12 +64,12 @@
                             </div>
                             <canvas id="data_canvas" style="display: none;"></canvas>
                         </form>
-                    </div>
-                    <div class="modal-footer">
+                    </main>
+                    <footer class="modal-footer">
                         <button type="button" data-loading-text="Loading..." class="btn btn-primary save">Save as Draft</button>
                         <button type="button" data-loading-text="Loading..." data-published="true" class="btn btn-primary save">Save and Publish</button>
-                        <button type="button" class="btn btn-default" data-dismiss="modal" aria-hidden="true">Discard</button>
-                    </div>
+                        <button type="button" class="btn btn-default" data-dismiss="modal">Discard</button>
+                    </footer>
                 </div>
             </div>
         </div>
diff --git a/addons/website_slides/views/res_config_settings_views.xml b/addons/website_slides/views/res_config_settings_views.xml
index 597795e23545..289843065936 100644
--- a/addons/website_slides/views/res_config_settings_views.xml
+++ b/addons/website_slides/views/res_config_settings_views.xml
@@ -8,18 +8,17 @@
             <div id="languages_setting" position="after">
                 <div class="col-xs-12 col-md-6 o_setting_box" id="slides_install_setting">
                     <div class="o_setting_right_pane">
-                        <label string="Slides"/>
+                        <span class="o_form_label">Slides</span>
                         <div class="text-muted">
                             Google Drive API Key
                         </div>
                         <div class="content-group">
                             <div class="row mt16">
-                                <label class="col-md-3 o_light_label" string="API Key"/>
+                                <label for="website_slide_google_app_key" class="col-md-3 o_light_label" string="API Key"/>
                                 <field name="website_slide_google_app_key" class="oe_inline"/>
                             </div>
                             <div class="oe_link">
-                                <span class="fa fa-arrow-right"/>
-                                <a href="https://console.developers.google.com/flows/enableapi?apiid=drive,youtube">
+                                <a class="fa fa-arrow-right" href="https://console.developers.google.com/flows/enableapi?apiid=drive,youtube">
                                     Create a Google Project and Get a Key
                                 </a>
                             </div>
diff --git a/addons/website_slides/views/website_slides.xml b/addons/website_slides/views/website_slides.xml
index c4655a2b3d92..f864795e6955 100644
--- a/addons/website_slides/views/website_slides.xml
+++ b/addons/website_slides/views/website_slides.xml
@@ -15,10 +15,10 @@
 <!-- Tools template: share on social networkds -->
 <template id='slides_share' name="Slides Media Share">
     <div class="form-group">
-        <a t-attf-href="https://www.facebook.com/sharer/sharer.php?u=#{slide.website_url}" class="o_slides_social_share" social-key="facebook"><i class="fa fa-facebook-square fa-2x"/></a>
-        <a t-attf-href="https://twitter.com/intent/tweet?text=#{slide.name}&amp;url=#{slide.website_url}" class="o_slides_social_share"  social-key="twitter"><i class="fa fa-twitter fa-2x"/></a>
-        <a t-attf-href="http://www.linkedin.com/shareArticle?mini=true&amp;url=#{slide.website_url}&amp;title=#{slide.name}&amp;" social-key="linkedin" class="o_slides_social_share"><i class="fa fa-linkedin fa-2x"/></a>
-        <a t-attf-href="https://plus.google.com/share?url=#{slide.website_url}" class="o_slides_social_share" social-key="gplus"><i class="fa fa-google-plus-square fa-2x"/></a>
+        <a t-attf-href="https://www.facebook.com/sharer/sharer.php?u=#{slide.website_url}" class="o_slides_social_share" social-key="facebook" aria-label="Share on Facebook" title="Share on Facebook"><i class="fa fa-facebook-square fa-2x"/></a>
+        <a t-attf-href="https://twitter.com/intent/tweet?text=#{slide.name}&amp;url=#{slide.website_url}" class="o_slides_social_share"  social-key="twitter" aria-label="Share on Twitter" title="Share on Twitter"><i class="fa fa-twitter fa-2x"/></a>
+        <a t-attf-href="http://www.linkedin.com/shareArticle?mini=true&amp;url=#{slide.website_url}&amp;title=#{slide.name}&amp;" social-key="linkedin" class="o_slides_social_share" aria-label="Share on LinkedIn" title="Share on LinkedIn"><i class="fa fa-linkedin fa-2x"/></a>
+        <a t-attf-href="https://plus.google.com/share?url=#{slide.website_url}" class="o_slides_social_share" social-key="gplus" aria-label="Share on Google Plus" title="Share on Google Plus"><i class="fa fa-google-plus-square fa-2x"/></a>
     </div>
 </template>
 
@@ -34,8 +34,8 @@
                         <div class="well well-sm">
                             <div>
                                 <a t-attf-href="/slides/#{slug(channel)}">
-                                    <img t-if="channel.promoted_slide_id" t-attf-src="/web/image/slide.slide/#{channel.promoted_slide_id.id}/image_medium" class="img-responsive oe_slides_channel_thumbnail"/>
-                                    <img t-if="not channel.promoted_slide_id" src="/website_slides/static/src/img/channel-default.jpg" class="img-responsive oe_slides_opacity"/>
+                                    <img t-if="channel.promoted_slide_id" t-attf-src="/web/image/slide.slide/#{channel.promoted_slide_id.id}/image_medium" class="img-responsive oe_slides_channel_thumbnail" alt="Promoted slide"/>
+                                    <img t-if="not channel.promoted_slide_id" src="/website_slides/static/src/img/channel-default.jpg" class="img-responsive oe_slides_opacity" alt="Channel without promoted slide"/>
                                 </a>
                             </div>
                             <div>
@@ -99,7 +99,7 @@
                         </t>
                         <!-- Public user has not right to create/write on slide -->
                         <t t-if="channel.can_upload and not is_public_user">
-                            <a class="btn btn-primary oe_slide_js_upload" title="Upload Presentation" t-attf-channel_id="#{channel.id}">
+                            <a role="button" class="btn btn-primary oe_slide_js_upload" title="Upload Presentation" t-attf-channel_id="#{channel.id}" aria-label="Upload Presentation">
                                 <i class="fa fa-cloud-upload"></i> Upload
                             </a>
                         </t>
@@ -111,7 +111,7 @@
                         <div class="input-group">
                             <input type="text" class="form-control" name="search" t-attf-placeholder="Search in #{channel.name}" t-att-value="search"/>
                             <span class="input-group-btn">
-                                <button class="btn btn-primary" type="submit">
+                                <button class="btn btn-primary" type="submit" aria-label="Search" title="Search">
                                     <i class="fa fa-search"></i>
                                 </button>
                             </span>
@@ -122,9 +122,9 @@
             <div class="row" t-if="not search">
                 <!-- Navigation -->
                 <div class="col-md-8 col-sm-12 col-xs-12">
-                    <ul class="nav nav-tabs nav-tabs-border">
+                    <ul class="nav nav-tabs nav-tabs-border" role="tablist">
                         <li t-attf-class="#{not slide_type and 'active' ''}">
-                            <a  t-attf-href="/slides/#{slug(channel)}#{category and '/category/' + slug(category) or ''}"> <i class="fa fa-home"></i> Home</a>
+                            <a  t-attf-href="/slides/#{slug(channel)}#{category and '/category/' + slug(category) or ''}"> <span class="fa fa-home"> Home</span></a>
                         </li>
                         <li t-if="header_object.nbr_presentations" t-attf-class="#{slide_type == 'presentation' and 'active' ''}">
                             <a t-attf-href="/slides/#{slug(channel)}#{category and '/category/' + slug(category) or ''}/presentation">
@@ -189,7 +189,7 @@
             </t>
             <section t-if="not channel.promoted_slide_id and not tag and not slide_type and not search and not is_public_user and not category and display_channel_settings" class="wrap mt16 mb0" groups="website.group_website_designer">
                 <div class="container">
-                    <div class="alert alert-danger alert-dismissable mb0">
+                    <div class="alert alert-danger alert-dismissable mb0" role="alert">
                         <button type="button" class="close o_slides_hide_channel_settings" t-att-data-channel-id="channel.id" data-dismiss="alert">x</button>
                         <p>
                             Review your channel settings to promote your most viewed or recent published presentation
@@ -205,7 +205,7 @@
                     <div class="row">
                         <div class="col-md-5 mt16 mb16">
                             <a t-attf-href="/slides/slide/#{slug(channel.promoted_slide_id)}">
-                                <img t-attf-src="/web/image/slide.slide/#{channel.promoted_slide_id.id}/image_medium" class="img-responsive shadow oe_slides_promote_image"/>
+                                <img t-attf-src="/web/image/slide.slide/#{channel.promoted_slide_id.id}/image_medium" class="img-responsive shadow oe_slides_promote_image" alt="Promoted slide"/>
                             </a>
                         </div>
                         <div class="col-md-7 mt16 mb16">
@@ -244,7 +244,7 @@
                                 </p>
                                 <p>
                                     <!-- Public user has not right to create/write on slide-->
-                                    <a t-if="can_upload and not is_public_user" class="btn btn-primary oe_slide_js_upload" t-attf-channel_id="#{channel.id}">
+                                    <a role="button" t-if="can_upload and not is_public_user" class="btn btn-primary oe_slide_js_upload" t-attf-channel_id="#{channel.id}" aria-label="Upload Presentation" title="Upload Presentation">
                                         <i class="fa fa-cloud-upload"></i> Upload
                                     </a>
                                 </p>
@@ -252,7 +252,7 @@
                         </div>
 
                         <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12" t-if="slide_type or category or tag">
-                            <div class="alert alert-success mb0" role="alert" t-if="tag">
+                            <div class="alert alert-success mb0" role="status" t-if="tag">
                                 Results for <strong t-esc="tag.name"/>
                             </div>
                             <t t-call="website_slides.slides_grid_view"/>
@@ -272,7 +272,7 @@
                                             <t t-esc="category['name']"/>
                                         </span>
                                         <a t-attf-href="/slides/#{slug(channel)}/category/#{category['id']}" class="pull-right" t-if="category['total'] - 4 > 0 and category['id']">
-                                            <i class="fa fa-arrow-right"></i> See all
+                                            <span class="fa fa-arrow-right"> See all</span>
                                         </a>
                                     </div>
                                 </div>
@@ -301,7 +301,7 @@
                     </div>
                 </div>
                 <div class="container mt16" t-if="slides">
-                    <div class="alert alert-success mb0" role="alert">
+                    <div class="alert alert-success mb0" role="status">
                         <b t-esc="len(slides)"/> results found for the given criteria <b><t t-esc="search"/></b>
                     </div>
                     <div class="row mt0">
@@ -321,14 +321,15 @@
     <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12 mt16 mb16" t-foreach="slides" t-as="slide">
         <div class="well well-sm oe_slides_thumbnail_container">
             <a t-attf-href="/slides/slide/#{slug(slide)}">
-                <img t-attf-src="/web/image/slide.slide/#{slide.id}/image_thumb" class="img-responsive img-thumbnail oe_slides_grid_thumbnail"/>
+                <img t-attf-src="/web/image/slide.slide/#{slide.id}/image_thumb" class="img-responsive img-thumbnail oe_slides_grid_thumbnail" alt="slide.name"/>
             </a>
             <span t-if="not slide.website_published" class="label label-danger" style="position: absolute;right: 20px;top: 7px;">Unpublished</span>
             <a t-if="not is_public_user and slide.website_published and slide.channel_id.promote_strategy == 'custom' and slide.channel_id.promoted_slide_id.id != slide.id"
                 groups="base.group_user"
                 t-attf-href="/slides/slide/#{slide.id}/promote"
                 style="position: absolute;right: 20px;top: 7px;"
-                t-attf-title="Promote this #{slide.slide_type}">
+                t-attf-title="Promote this #{slide.slide_type}"
+                t-attf-aria-label="Promote this #{slide.slide_type}">
                 <span class="fa-stack fa-lg">
                   <i class="fa fa-square fa-stack-2x oe_slides_opacity"></i>
                   <i class="fa fa-bullhorn fa-stack-1x fa-inverse"></i>
@@ -375,8 +376,8 @@
             <div class="row">
                 <div class="col-lg-8 col-md-8 col-sm-12 col-xs-12">
                     <div t-if="private" class="mb16">
-                        <h3 class="alert alert-danger">
-                            <i class="fa fa-exclamation-triangle"></i> This <t t-esc="slide.slide_type"/> is private
+                        <h3 class="alert alert-danger" role="alert">
+                            <i class="fa fa-exclamation-triangle" role="img" aria-label="Attention" title="Attention"></i> This <t t-esc="slide.slide_type"/> is private
                         </h3>
                         <t t-if="slide.channel_id.access_error_msg">
                             <div t-field="slide.channel_id.access_error_msg" class="well oe_no_empty"/>
@@ -385,7 +386,7 @@
 
                     <div t-if="not private">
                             <t t-if="slide.datas and slide.slide_type == 'infographic'">
-                                <img t-attf-src="/web/image/slide.slide/#{slide.id}/datas" class="img-responsive" style="width:100%"/>
+                                <img t-attf-src="/web/image/slide.slide/#{slide.id}/datas" class="img-responsive" style="width:100%" alt="Slide image"/>
                             </t>
                         <div t-if="slide.slide_type in ('presentation', 'document')" class="embed-responsive embed-responsive-4by3 embed-responsive-item mb8">
                             <t t-raw="slide.embed_code"/>
@@ -408,7 +409,7 @@
                         <div class="row">
                             <div class="col-sm-8 col-xs-12">
                                 <div class="pull-left">
-                                    <a t-attf-href="/slides/#{slug(slide.channel_id)}">
+                                    <a t-attf-href="/slides/#{slug(slide.channel_id)}" t-attf-title="Channel #{slide.channel_id.name}" t-attf-aria-label="Channel #{slide.channel_id.name}">
                                         <i class="fa fa-circle-o fa-5x" style="color: #875A7B;font-weight: bold;"></i>
                                     </a>
                                 </div>
@@ -456,9 +457,8 @@
                                             t-att-data-slide-id="slide.id"
                                             tabindex="0"
                                             data-toggle="popover">
-                                            <i class="fa fa-thumbs-up fa-1x">
-                                                <t t-esc="slide.likes"/>
-                                            </i>
+                                            <i class="fa fa-thumbs-up fa-1x" role="img" aria-label="Likes" title="Likes"/>
+                                            <t t-esc="slide.likes"/>
                                         </span>
                                         <span
                                             class="oe_slide_js_unlike"
@@ -468,9 +468,8 @@
                                             t-att-data-slide-id="slide.id"
                                             tabindex="0"
                                             data-toggle="popover">
-                                            <i class="fa fa-thumbs-down fa-1x">
-                                                <t t-esc="slide.dislikes"/>
-                                            </i>
+                                            <i class="fa fa-thumbs-down fa-1x" role="img" aria-label="Dislikes" title="Dislikes"/>
+                                            <t t-esc="slide.dislikes"/>
                                         </span>
                                     </div>
                                 </div>
@@ -479,36 +478,36 @@
                         <div class="mt8 mb32">
                             <ul class="nav nav-tabs" role="tablist">
                                 <li t-att-class="not comments and 'active' or None">
-                                    <a href="#about" role="tab" data-toggle="tab">
-                                        <i class="fa fa-home"></i> About
+                                    <a aria-controls="about" href="#about" role="tab" data-toggle="tab">
+                                        <span class="fa fa-home"> About</span>
                                     </a>
                                 </li>
                                 <li>
-                                    <a href="#share" role="tab" data-toggle="tab">
-                                        <i class="fa fa-share-alt"></i> Share
+                                    <a aria-controls="share" href="#share" role="tab" data-toggle="tab">
+                                        <span class="fa fa-share-alt"> Share</span>
                                     </a>
                                 </li>
                                 <li t-att-class="comments and 'active' or None">
-                                    <a href="#discuss" role="tab" data-toggle="tab">
-                                        <i class="fa fa-comments-o"></i> Comments
+                                    <a aria-controls="discuss" href="#discuss" role="tab" data-toggle="tab">
+                                        <span class="fa fa-comments-o"> Comments</span>
                                     </a>
                                 </li>
                                 <li>
-                                    <a href="#transcript" role="tab" data-toggle="tab">
-                                        <i class="fa fa-align-justify"></i> Transcript
+                                    <a aria-controls="transcript" href="#transcript" role="tab" data-toggle="tab">
+                                        <span class="fa fa-align-justify"> Transcript</span>
                                     </a>
                                 </li>
                                 <li>
-                                    <a href="#statistic" role="tab" data-toggle="tab">
-                                        <i class="fa fa-bar-chart"></i> Statistics
+                                    <a aria-controls="statistic" href="#statistic" role="tab" data-toggle="tab">
+                                        <span class="fa fa-bar-chart"> Statistics</span>
                                     </a>
                                 </li>
                             </ul>
                             <div class="tab-content" style="padding: 20px 5px 5px 5px; word-wrap: break-word;">
-                                <div t-att-class="not comments and 'tab-pane fade active in' or 'tab-pane fade'" id="about">
+                                <div role="tabpanel" t-att-class="not comments and 'tab-pane fade active in' or 'tab-pane fade'" id="about">
                                     <div t-field="slide.description"/>
                                 </div>
-                                <div class="tab-pane fade" t-if="slide.website_published" id="share">
+                                <div role="tabpanel" class="tab-pane fade" t-if="slide.website_published" id="share">
                                     <t t-call="website_slides.slide_social_media">
                                         <t t-set="slide" t-value="slide"/>
                                     </t>
@@ -521,39 +520,39 @@
                                         </t>
                                     </t>
                                 </div>
-                                <div class="tab-pane fade" t-if="not slide.website_published" id="share">
-                                    <h4><i class="fa fa-info-circle"></i>
+                                <div role="tabpanel" class="tab-pane fade" t-if="not slide.website_published" id="share">
+                                    <h4 class="fa fa-info-circle">
                                         The social sharing module will be unlocked when a moderator will allow your publication.
                                     </h4>
                                 </div>
-                                <div t-att-class="comments and 'tab-pane fade active in' or 'tab-pane fade'" id="discuss">
+                                <div role="tabpanel" t-att-class="comments and 'tab-pane fade active in' or 'tab-pane fade'" id="discuss">
                                     <t t-call="portal.message_thread">
                                         <t t-set="object" t-value="slide"/>
                                     </t>
                                 </div>
-                                <div class="tab-pane fade oe_slides_transcript" id="transcript">
+                                <div role="tabpanel" class="tab-pane fade oe_slides_transcript" id="transcript">
                                     <t t-if="slide.index_content">
                                         <t t-foreach="slide.index_content.split('\n')" t-as="line">
                                             <p t-esc="line"></p>
                                         </t>
                                     </t>
                                 </div>
-                                <div class="tab-pane fade" id="statistic" t-att-slide-url="slide.website_url">
+                                <div role="tabpanel" class="tab-pane fade" id="statistic" t-att-slide-url="slide.website_url">
                                     <div class="row">
                                         <div class="col-md-4">
                                             <h4 class="mt0 oe_slides_statistics_title">Views</h4>
                                             <ul class="list-group">
                                                 <li class="list-group-item">
                                                     <span class="badge"><t t-esc="slide.total_views"/></span>
-                                                    <i class="fa fa-play"></i> Total Views
+                                                    <span class="fa fa-play"> Total Views</span>
                                                 </li>
                                                 <li class="list-group-item">
                                                     <span class="badge"><t t-esc="slide.slide_views"/></span>
-                                                    <i class="fa fa-circle-o"></i> Website Views
+                                                    <span class="fa fa-circle-o"> Website Views</span>
                                                 </li>
                                                 <li class="list-group-item" t-if="not slide.document_id">
                                                     <span class="badge"><t t-esc="slide.embed_views"/></span>
-                                                    <i class="fa fa-code"></i> Embedded Views
+                                                    <span class="fa fa-code"> Embedded Views</span>
                                                 </li>
                                             </ul>
                                         </div>
@@ -563,19 +562,19 @@
                                             <ul class="list-group">
                                                 <li class="list-group-item">
                                                     <span class="badge" id="total-share">0</span>
-                                                    <i class="fa fa-share-alt"></i> Social Shares
+                                                    <span class="fa fa-share-alt"> Social Shares</span>
                                                 </li>
                                                 <li class="list-group-item">
                                                     <span class="badge"><t t-esc="slide.likes"/></span>
-                                                    <i class="fa fa-thumbs-up"></i> Likes
+                                                    <span class="fa fa-thumbs-up"> Likes</span>
                                                 </li>
                                                 <li class="list-group-item">
                                                     <span class="badge"><t t-esc="slide.dislikes"/></span>
-                                                    <i class="fa fa-thumbs-down"></i> Dislikes
+                                                    <span class="fa fa-thumbs-down"> Dislikes</span>
                                                 </li>
                                                 <li class="list-group-item">
                                                     <span class="badge"><t t-esc="len(slide.website_message_ids)"/></span>
-                                                    <i class="fa fa-comments-o"></i> Comments
+                                                    <span class="fa fa-comments-o"> Comments</span>
                                                 </li>
                                             </ul>
                                         </div>
@@ -585,19 +584,19 @@
                                             <ul class="list-group">
                                                 <li class="list-group-item">
                                                     <span class="badge" id="facebook-badge">0</span>
-                                                    <i class="fa fa-facebook-square"></i> Facebook
+                                                    <span class="fa fa-facebook-square"> Facebook</span>
                                                 </li>
                                                 <li class="list-group-item">
                                                     <span class="badge" id="twitter-badge">0</span>
-                                                    <i class="fa fa-twitter-square"></i> Twitter
+                                                    <span class="fa fa-twitter-square"> Twitter</span>
                                                 </li>
                                                 <li class="list-group-item">
                                                     <span class="badge" id="linkedin-badge">0</span>
-                                                    <i class="fa fa-linkedin-square"></i> LinkedIn
+                                                    <span class="fa fa-linkedin-square"> LinkedIn</span>
                                                 </li>
                                                 <li class="list-group-item">
                                                     <span class="badge" id="google-badge">0</span>
-                                                    <i class="fa fa-google-plus-square"></i> Google+
+                                                    <span class="fa fa-google-plus-square"> Google+</span>
                                                 </li>
                                             </ul>
                                         </div>
@@ -624,11 +623,11 @@
                 </div>
                 <div class="col-lg-4 col-md-4 col-sm-12 col-xs-12">
                     <ul class="nav nav-tabs" role="tablist">
-                        <li class="active"><a href="#related" data-toggle="tab">Related</a></li>
-                        <li><a href="#most_viewed" data-toggle="tab">Most Viewed</a></li>
+                        <li class="active"><a aria-controls="related" href="#related" data-toggle="tab" role="tab">Related</a></li>
+                        <li><a aria-controls="most_viewed" href="#most_viewed" data-toggle="tab" role="tab">Most Viewed</a></li>
                     </ul>
                     <div class="tab-content">
-                        <div id="related" class="tab-pane active mt4">
+                        <div role="tabpanel" id="related" class="tab-pane active mt4">
                             <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 panel panel-default">
                                 <ul class="media-list panel-body">
                                     <t t-set="related_slides_list" t-value="list(related_slides)"/>
@@ -641,7 +640,7 @@
                                 </ul>
                             </div>
                         </div>
-                        <div id="most_viewed" class="tab-pane  mt4">
+                        <div role="tabpanel" id="most_viewed" class="tab-pane  mt4">
                             <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 panel panel-default">
                                 <ul class="media-list panel-body">
                                     <t t-set="most_viewed_slides_list" t-value="list(most_viewed_slides)"/>
@@ -665,7 +664,7 @@
 <template id="related_slides" name="Related Slide">
     <li class="media">
         <a class="media-left pull-left" t-attf-href="/slides/slide/#{slug(slide)}">
-                <img class="media-object oe_slides_apart_small" t-attf-src="/web/image/slide.slide/#{slide.id}/image_thumb"/>
+                <img class="media-object oe_slides_apart_small" t-attf-src="/web/image/slide.slide/#{slide.id}/image_thumb" alt="slide.name"/>
         </a>
         <div class="media-body">
             <a t-attf-href="/slides/slide/#{slug(slide)}"><h5 class="media-heading" t-esc="slide.name"/></a>
@@ -699,8 +698,7 @@
                         data-loading-text="Sending..."
                         t-attf-data-slide-id="#{slide.id}"
                         style="border-top-right-radius: 4px;border-bottom-right-radius: 4px;">
-                        <i class="fa fa-envelope-o"></i>
-                        Send Email
+                        <span class="fa fa-envelope-o">Send Email</span>
                     </button>
                 </span>
             </div>
diff --git a/addons/website_slides/views/website_slides_backend.xml b/addons/website_slides/views/website_slides_backend.xml
index 144570052448..db5672c095e7 100644
--- a/addons/website_slides/views/website_slides_backend.xml
+++ b/addons/website_slides/views/website_slides_backend.xml
@@ -256,7 +256,7 @@
                                     <field name="group_ids" widget="many2many_tags" attrs="{'invisible':[('visibility', '=', 'public')], 'required':[('visibility', 'in',('private', 'partial'))]}"/>
                                 </group>
                                 <group attrs="{'invisible':[('visibility','in',('public'))]}" colspan="4">
-                                        <label string="Error Message"/>
+                                        <label for="access_error_msg" string="Error Message"/>
                                         <field name="access_error_msg" colspan="4" nolabel="1"/>
                                 </group>
                             </page>
diff --git a/addons/website_slides/views/website_slides_embed.xml b/addons/website_slides/views/website_slides_embed.xml
index bcffd50db43f..89f64d63f93b 100644
--- a/addons/website_slides/views/website_slides_embed.xml
+++ b/addons/website_slides/views/website_slides_embed.xml
@@ -27,7 +27,7 @@
                 <body t-if="private" style="position: inherit;">
                     <title><t t-esc="slide.name"/></title>
                     <div class="slide-private-view">
-                        <h3 style="border-bottom: 1px solid !important;padding-bottom: 10px;"><i class="fa fa-exclamation-triangle"></i> This <t t-esc="slide.slide_type"/> is private.</h3>
+                        <h3 style="border-bottom: 1px solid !important;padding-bottom: 10px;"><i class="fa fa-exclamation-triangle" role="img" aria-label="Attention" title="Attention"></i> This <t t-esc="slide.slide_type"/> is private.</h3>
                         <div t-field="slide.channel_id.access_error_msg" />
                     </div>
                 </body>
@@ -45,13 +45,13 @@
                                     </div>
                                 </div>
                                 <div class="col-lg-1 col-md-1 col-sm-2 col-xs-2 text-right">
-                                    <b class="oe_slide_js_embed_option_link" data-slide-option-id="#slide_share"><i class="fa fa-share-alt"></i> Share</b>
+                                    <b class="oe_slide_js_embed_option_link" data-slide-option-id="#slide_share"><span class="fa fa-share-alt"> Share</span></b>
                                 </div>
                                 <div class="col-lg-1 col-md-1 col-sm-2 col-xs-2 text-right">
-                                    <b class="oe_slide_js_embed_option_link" data-slide-option-id="#slide_email"><i class="fa fa-envelope"></i> Email</b>
+                                    <b class="oe_slide_js_embed_option_link" data-slide-option-id="#slide_email"><span class="fa fa-envelope"> Email</span></b>
                                 </div>
                                 <div class="col-lg-1 col-md-1 col-sm-2 col-xs-2 text-right">
-                                    <b class="oe_slide_js_embed_option_link" data-slide-option-id="#slide_embed"><i class="fa fa-code"></i> Embed</b>
+                                    <b class="oe_slide_js_embed_option_link" data-slide-option-id="#slide_embed"><span class="fa fa-code"> Embed</span></b>
                                 </div>
                             </div>
                         </div>
@@ -90,15 +90,15 @@
                         </div>
                         <t t-if="slide.slide_type in ('presentation', 'document')">
                             <div id="PDFViewerLoader" class="oe_slides_loader">
-                                <img class="img-responsive" t-attf-src="/web/image/slide.slide/#{slide.id}/image_medium" style="margin:auto;height:100%"/>
+                                <img class="img-responsive" t-attf-src="/web/image/slide.slide/#{slide.id}/image_medium" style="margin:auto;height:100%" alt="suggest_slide.name"/>
                                 <h4 class="text-center">
-                                    <i class="fa fa-spinner fa-spin"></i> Loading ...
+                                    <span class="fa fa-spinner fa-spin"> Loading ...</span>
                                 </h4>
                             </div>
                             <canvas id="PDFViewerCanvas" class="img-responsive" style="margin:auto;height:100%;display:none;"></canvas>
                         </t>
                         <t t-if="slide.slide_type in ('infographic')">
-                            <img t-attf-src="/web/image/slide.slide/#{slide.id}/datas" class="img-responsive" style="width:100%"/>
+                            <img t-attf-src="/web/image/slide.slide/#{slide.id}/datas" class="img-responsive" style="width:100%" alt="Slide image"/>
                         </t>
                     </div>
                     <!-- Fixed bottom navbar -->
@@ -111,32 +111,32 @@
                                 <div class="col-lg-8 col-md-8 col-sm-8 col-xs-8 hide o_slide_navigation_buttons">
                                     <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4 text-center"></div>
                                     <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 text-center">
-                                        <span id="first" title="First slide">
+                                        <span id="first" title="First slide" role="img" aria-label="First slide">
                                             <i class="fa fa-step-backward fa-2x"></i>
                                         </span>
                                     </div>
                                     <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 text-center">
-                                        <span id="previous" title="Previous slide" role="button">
+                                        <a id="previous" title="Previous slide" aria-label="Previous slide"  role="button">
                                             <i class="fa fa-arrow-circle-left fa-2x"></i>
-                                        </span>
+                                        </a>
                                     </div>
                                     <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 text-center">
-                                        <span id="next" title="Next slide" role="button">
+                                        <a id="next" title="Next slide" aria-label="Next slide" role="button">
                                             <i class="fa fa-arrow-circle-right fa-2x"></i>
-                                        </span>
+                                        </a>
                                     </div>
                                     <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 text-center">
-                                        <span id="last" title="Last slide" role="button">
+                                        <a id="last" title="Last slide" aria-label="Last slide" role="button">
                                             <i class="fa fa-step-forward fa-2x"></i>
-                                        </span>
+                                        </a>
                                     </div>
                                     <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4 text-center"></div>
                                 </div>
                                 <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2 pull-right text-right">
                                     <a t-if="slide.download_security and not is_embedded" target="_top" t-attf-href="/slides/slide/#{slug(slide)}/download" title="Download" id="download">
-                                        <i class="fa fa-download fa-2x"></i>
+                                        <i class="fa fa-download fa-2x" role="img" aria-label="Download"></i>
                                     </a>
-                                    <span id="fullscreen" title="View fullscreen">
+                                    <span id="fullscreen" title="View fullscreen" role="img" aria-label="Fullscreen">
                                         <i class="fa fa-arrows-alt fa-2x"></i>
                                     </span>
                                 </div>
@@ -161,7 +161,7 @@
                 <body>
                     <title><t t-esc="slide.name"/></title>
                     <div class="slide-private-view">
-                        <h3 style="border-bottom: 1px solid !important;padding-bottom: 10px;"><i class="fa fa-exclamation-triangle"></i> This <t t-esc="slide.slide_type"/> is private.</h3>
+                        <h3 style="border-bottom: 1px solid !important;padding-bottom: 10px;"><i class="fa fa-exclamation-triangle" role="img" aria-label="Attention" title="Attention"></i> This <t t-esc="slide.slide_type"/> is private.</h3>
                         <div t-field="slide.channel_id.access_error_msg" />
                     </div>
                 </body>
diff --git a/addons/website_theme_install/views/views.xml b/addons/website_theme_install/views/views.xml
index f080ee960055..243e00f01a4a 100644
--- a/addons/website_theme_install/views/views.xml
+++ b/addons/website_theme_install/views/views.xml
@@ -21,17 +21,17 @@
 
                         <div class="o_theme_preview_top bg-white mb4">
                             <div class="o_browser_bar"/>
-                            <i states="installed" class="text-center bg-white text-success img-circle fa fa-check-circle"/>
+                            <i states="installed" class="text-center bg-white text-success img-circle fa fa-check-circle" role="img" aria-label="Installed" title="Installed"/>
                             <div t-attf-class="bg-gray-lighter #{has_screenshot? 'o_theme_screenshot' : (has_image ? 'o_theme_cover' : 'o_theme_logo')}" t-attf-style="background-image: url(#{image_url});"/>
                             <div states="uninstalled" class="o_button_area">
                                 <button type="object" name="button_choose_theme" class="btn btn-primary">Use this theme</button>
                                 <hr t-if="record.url.value"/>
-                                <a t-if="record.url.value" class="btn btn-default" t-att-href="record.url.value" target="_blank">Live Preview</a>
+                                <a role="button" t-if="record.url.value" class="btn btn-default" t-att-href="record.url.value" target="_blank">Live Preview</a>
                             </div>
                         </div>
                         <div class="o_theme_preview_bottom clearfix">
                             <h5 t-if="record.display_name.value" class="text-uppercase pull-left">
-                                <img class="pull-left mr4"  t-att-src="record.icon.value" height="16" width="16"/>
+                                <img class="pull-left mr4"  t-att-src="record.icon.value" height="16" width="16" alt="Theme preview"/>
                                 <b><t t-esc="record.display_name.value.replace(('Theme'), '').replace(('theme'), '')"/></b>
                             </h5>
                             <h6 t-if="record.category_id.value" class="text-muted pull-right">
@@ -91,7 +91,7 @@ action = {
 
     <!-- Add link to theme install in default customize modal -->
     <template id="customize_modal" inherit_id="website.theme_customize" priority="1">
-        <xpath expr="//div[hasclass('modal-header')]" position="inside">
+        <xpath expr='//*[@role="dialog"]//header' position="inside">
             <a href="/web#action=website_theme_install.theme_install_kanban_action">See themes here</a>
         </xpath>
     </template>
diff --git a/addons/website_twitter/static/src/xml/website.twitter.xml b/addons/website_twitter/static/src/xml/website.twitter.xml
index 1a18831e298c..8b8ace63595c 100644
--- a/addons/website_twitter/static/src/xml/website.twitter.xml
+++ b/addons/website_twitter/static/src/xml/website.twitter.xml
@@ -3,7 +3,7 @@
     <t t-name="website.Twitter.Tweet">
         <div class="tweet" t-attf-data-url="http://twitter.com/#{tweet.user.screen_name}/status/#{tweet.id_str}" t-attf-data-tweet-id="#{tweet.id_str}">
             <div class="left">
-                <img t-att-src="tweet.user.profile_image_url_https"/>
+                <img t-att-src="tweet.user.profile_image_url_https" alt="Twitter's user"/>
             </div>
             <div class="right">
                 <div class="top">
@@ -34,10 +34,10 @@
     </t>
     <t t-name="website.Twitter.Error">
         <div class="container" contenteditable="false">
-            <div class="alert alert-warning">
+            <div class="alert alert-warning" role="alert">
                 <t t-esc="data.error"/>
                 <t t-if='!data.nodata'>
-                    <a class="lnk_configure" href="/web#action=website.action_website_configuration"><i class="fa fa-plus-circle"/> Twitter Configuration</a>
+                    <a class="lnk_configure fa fa-plus-circle" href="/web#action=website.action_website_configuration"> Twitter Configuration</a>
                 </t>
             </div>
         </div>
diff --git a/addons/website_twitter/views/res_config_settings_views.xml b/addons/website_twitter/views/res_config_settings_views.xml
index e33043ab3652..3ea04ac6e5f6 100644
--- a/addons/website_twitter/views/res_config_settings_views.xml
+++ b/addons/website_twitter/views/res_config_settings_views.xml
@@ -8,7 +8,7 @@
             <div id="languages_setting" position="after">
                 <div class="col-xs-12 col-md-6 o_setting_box" id="twitter_roller_install_setting">
                     <div class="o_setting_right_pane">
-                        <label string="Twitter Roller"/>
+                        <span class="o_form_label">Twitter Roller</span>
                         <div class="text-muted">
                             Twitter API Credentials
                         </div>
@@ -26,7 +26,7 @@
                                 <field name="twitter_screen_name" class="oe_inline"/>
                             </div>
                             <div>
-                                <a data-toggle="modal" class="fa fa-arrow-right" href="#" data-target="#twitter_tutorial">
+                                <a data-toggle="modal" class="fa fa-arrow-right" href="#" data-target="#twitter_tutorial" aria-label="Twitter tutorial">
                                     Tutorial
                                 </a>
                             </div>
diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py
index 02f48a00c861..d813af46efa7 100644
--- a/odoo/addons/base/models/ir_ui_view.py
+++ b/odoo/addons/base/models/ir_ui_view.py
@@ -338,8 +338,11 @@ actual arch.
                     # A <data> element is a wrapper for multiple root nodes
                     view_docs = view_docs[0]
                 for view_arch in view_docs:
-                    if not valid_view(view_arch):
-                        raise ValidationError(_('Invalid view definition'))
+                    check = valid_view(view_arch)
+                    if not check:
+                        raise ValidationError(_('Invalid view %s definition in %s') % (view.name, view.arch_fs))
+                    if check == "Warning":
+                        _logger.warning(_('Invalid view %s definition in %s \n%s'), view.name, view.arch_fs, view.arch)
         return True
 
     @api.constrains('type', 'groups_id')
diff --git a/odoo/addons/base/rng/common.rng b/odoo/addons/base/rng/common.rng
index 78002b08999b..cd6bb78a073c 100644
--- a/odoo/addons/base/rng/common.rng
+++ b/odoo/addons/base/rng/common.rng
@@ -335,6 +335,9 @@
             <rng:optional><rng:attribute name="help"/></rng:optional>
             <rng:optional><rng:attribute name="class"/></rng:optional>
             <rng:optional><rng:attribute name="default_focus"/></rng:optional>
+            <rng:optional><rng:attribute name="title"/></rng:optional>
+            <rng:optional><rng:attribute name="aria-label"/></rng:optional>
+            <rng:optional><rng:attribute name="aria-pressed"/></rng:optional>
             <rng:zeroOrMore>
                 <rng:choice>
                     <rng:ref name="field" />
diff --git a/odoo/addons/base/tests/test_view_validation.py b/odoo/addons/base/tests/test_view_validation.py
index 524a53609e40..c3ac8020c271 100644
--- a/odoo/addons/base/tests/test_view_validation.py
+++ b/odoo/addons/base/tests/test_view_validation.py
@@ -9,29 +9,45 @@ from odoo.tests.common import tagged
 from odoo.tools.view_validation import (
     valid_page_in_book, valid_att_in_form, valid_type_in_colspan,
     valid_type_in_col, valid_att_in_field, valid_att_in_label,
-    valid_field_in_graph, valid_field_in_tree,
+    valid_field_in_graph, valid_field_in_tree, valid_alternative_image_text,
+    valid_alternative_icon_text, valid_title_icon, valid_simili_button,
+    valid_simili_progressbar, valid_dialog, valid_simili_dropdown,
+    valid_focusable_button, valid_prohibited_none_role, valid_simili_tabpanel,
+    valid_simili_tab, valid_simili_tablist, valid_alerts
 )
 
 invalid_form = etree.parse(io.BytesIO(b'''\
 <form>
     <label></label>
+    <ul class="dropdown-menu"><li/><li/></ul>
+    <div role="presentation"/>
     <group>
         <div>
             <page></page>
-            <label colspan="True"></label>
+            <label colspan="True" string=""></label>
             <field></field>
         </div>
     </group>
     <notebook>
         <page>
             <group col="Two">
-            <div>
-                <label></label>
-                <field colspan="Five"> </field>
+                <div>
+                    <div class="o_progressbar">100%</div>
+                    <label string=""></label>
+                    <img/>
+                    <span class="fa fa-warning"/>
+                    <field colspan="Five"> </field>
                 </div>
             </group>
+            <a class="btn"/>
+            <div class="btn"/>
+            <div class="tab-pane"/>
         </page>
     </notebook>
+    <div class="modal"/>
+    <a data-toggle="tab"/>
+    <div class="nav-tabs"/>
+    <div class="alert alert-success"/>
 </form>
 ''')).getroot()
 
@@ -39,19 +55,36 @@ valid_form = etree.parse(io.BytesIO(b'''\
 <form string="">
     <field name=""></field>
     <field name=""></field>
+    <ul class="dropdown-menu" role="menu"></ul>
     <notebook>
         <page>
             <field name=""></field>
-            <label string=""></label>
+            <label for="" string=""></label>
             <field name=""></field>
         </page>
         <page>
             <group colspan="5" col="2">
+                <div class="o_progressbar" role="progressbar" aria-valuenow="14" aria-valuemin="0" aria-valuemax="100">14%</div>
                 <label for=""></label>
-                <label string="" colspan="5"></label>
+                <label for="" string="" colspan="5"></label>
+                <img alt="Test image"/>
+                <span class="fa fa-success" aria-label="Test span" title="Test span"/>
+                <a class="fa fa-success"><span aria-label="test" title="test"/></a>
+                <a class="btn" role="button"/>
             </group>
         </page>
     </notebook>
+    <div role="dialog" class="modal">
+        <header class="modal-header"/>
+        <main class="modal-body"/>
+        <footer class="modal-footer"/>
+    </div>
+    <div class="tab-pane" role="tabpanel"/>
+    <a data-toggle="tab" role="tab" aria-selected="true" aria-controls="test"/>
+    <div class="nav-tabs" role="tablist"/>
+    <div class="alert alert-success" role="alert"/>
+    <div class="alert alert-success" role="alertdialog"/>
+    <div class="alert alert-success" role="status"/>
 </form>
 ''')).getroot()
 
@@ -129,3 +162,31 @@ class TestViewValidation(unittest.TestCase):
     def test_col_datatype_validation(self):
         assert not valid_type_in_col(invalid_form)
         assert valid_type_in_col(valid_form)
+
+    def test_a11y_validation(self):
+        assert valid_alternative_image_text(invalid_form) == "Warning"
+        assert valid_alternative_image_text(valid_form) is True
+        assert valid_alternative_icon_text(invalid_form) == "Warning"
+        assert valid_alternative_icon_text(valid_form) is True
+        assert valid_title_icon(invalid_form) == "Warning"
+        assert valid_title_icon(valid_form) is True
+        assert valid_simili_button(invalid_form) == "Warning"
+        assert valid_simili_button(valid_form) is True
+        assert valid_dialog(invalid_form) == "Warning"
+        assert valid_dialog(valid_form) is True
+        assert valid_simili_dropdown(invalid_form) == "Warning"
+        assert valid_simili_dropdown(valid_form) is True
+        assert valid_simili_progressbar(invalid_form) == "Warning"
+        assert valid_simili_progressbar(valid_form) is True
+        assert valid_simili_tabpanel(invalid_form) == "Warning"
+        assert valid_simili_tabpanel(valid_form) is True
+        assert valid_simili_tablist(invalid_form) == "Warning"
+        assert valid_simili_tablist(valid_form) is True
+        assert valid_simili_tab(invalid_form) == "Warning"
+        assert valid_simili_tab(valid_form) is True
+        assert valid_focusable_button(invalid_form) == "Warning"
+        assert valid_focusable_button(valid_form) is True
+        assert valid_prohibited_none_role(invalid_form) == "Warning"
+        assert valid_prohibited_none_role(valid_form) is True
+        assert valid_alerts(invalid_form) == "Warning"
+        assert valid_alerts(valid_form) is True
diff --git a/odoo/addons/base/views/ir_module_views.xml b/odoo/addons/base/views/ir_module_views.xml
index 53768df481bb..9ca6a61f441b 100644
--- a/odoo/addons/base/views/ir_module_views.xml
+++ b/odoo/addons/base/views/ir_module_views.xml
@@ -157,7 +157,7 @@
                     <t t-name="kanban-box">
                       <div class="oe_module_vignette oe_kanban_global_click">
                         <t t-set="installed" t-value="record.state.raw_value == 'installed'"/>
-                        <img t-attf-src="#{record.icon.value}" class="oe_module_icon"/>
+                        <img t-attf-src="#{record.icon.value}" class="oe_module_icon" alt="Icon"/>
                         <div class="oe_module_desc" t-att-title="record.shortdesc.value">
                           <h4 class="o_kanban_record_title"><field name="shortdesc"/></h4>
                           <p class="oe_module_name">
diff --git a/odoo/addons/base/views/ir_qweb_widget_templates.xml b/odoo/addons/base/views/ir_qweb_widget_templates.xml
index 1fc0e5d921a8..afb3c08ec41e 100644
--- a/odoo/addons/base/views/ir_qweb_widget_templates.xml
+++ b/odoo/addons/base/views/ir_qweb_widget_templates.xml
@@ -22,21 +22,21 @@
         </t>
         <div itemprop="address" itemscope="itemscope" itemtype="http://schema.org/PostalAddress">
             <div t-if="address and 'address' in fields">
-                <i t-if="not options.get('no_marker')" class='fa fa-map-marker fa-fw'/> <span itemprop="streetAddress" t-raw="address.replace('\n', options.get('no_tag_br') and ', ' or ('&lt;br/&gt;%s' % ('' if options.get('no_marker') else '&amp;nbsp; &amp;nbsp; ')))"/>
+                <i t-if="not options.get('no_marker')" class='fa fa-map-marker fa-fw' role="img" aria-label="Address" title="Address"/> <span itemprop="streetAddress" t-raw="address.replace('\n', options.get('no_tag_br') and ', ' or ('&lt;br/&gt;%s' % ('' if options.get('no_marker') else '&amp;nbsp; &amp;nbsp; ')))"/>
             </div>
             <div t-if="city and 'city' in fields">
-                <i t-if="not options.get('no_marker')" class='fa fa-map-marker fa-fw'/>
+                <i t-if="not options.get('no_marker')" class='fa fa-map-marker fa-fw' role="img" aria-label="Address" title="Address"/>
                 <span itemprop="addressLocality" t-raw="city"/>,
                 <span itemprop="addressCountry" t-raw="country_id"/>
             </div>
-            <div t-if="phone and 'phone' in fields"><i t-if="not options.get('no_marker') or options.get('phone_icons')" class='fa fa-phone fa-fw'/> <span itemprop="telephone" t-esc="phone"/></div>
-            <div t-if="mobile and 'mobile' in fields"><i t-if="not options.get('no_marker') or options.get('phone_icons')" class='fa fa-mobile fa-fw'/> <span itemprop="telephone" t-esc="mobile"/></div>
-            <div t-if="fax and 'fax' in fields"><i t-if="not options.get('no_marker') or options.get('phone_icons')" class='fa fa-fax fa-fw'/> <span itemprop="faxNumber" t-esc="fax"/></div>
+            <div t-if="phone and 'phone' in fields"><i t-if="not options.get('no_marker') or options.get('phone_icons')" class='fa fa-phone fa-fw' role="img" aria-label="Phone" title="Phone"/> <span itemprop="telephone" t-esc="phone"/></div>
+            <div t-if="mobile and 'mobile' in fields"><i t-if="not options.get('no_marker') or options.get('phone_icons')" class='fa fa-mobile fa-fw' role="img" aria-label="Mobile" title="Mobile"/> <span itemprop="telephone" t-esc="mobile"/></div>
+            <div t-if="fax and 'fax' in fields"><i t-if="not options.get('no_marker') or options.get('phone_icons')" class='fa fa-fax fa-fw' role="img" aria-label="Fax" title="Fax"/> <span itemprop="faxNumber" t-esc="fax"/></div>
             <div t-if="website and 'website' in fields">
-                <i t-if="not options.get('no_marker')" class='fa fa-globe'/>
+                <i t-if="not options.get('no_marker')" class='fa fa-globe' role="img" aria-label="Website" title="Website"/>
                 <a t-att-href="website and '%s%s' % ('http://' if '://' not in website else '',website)"><span itemprop="website" t-esc="website"/></a>
             </div>
-            <div t-if="email and 'email' in fields"><i t-if="not options.get('no_marker')" class='fa fa-envelope fa-fw'/> <span itemprop="email" t-esc="email"/></div>
+            <div t-if="email and 'email' in fields"><i t-if="not options.get('no_marker')" class='fa fa-envelope fa-fw' role="img" aria-label="Email" title="Email"/> <span itemprop="email" t-esc="email"/></div>
         </div>
         <t t-if="object.country_id and object.country_id.name_position == 'after'">
             <t t-call="base.contact_name"/>
diff --git a/odoo/addons/base/views/ir_rule_views.xml b/odoo/addons/base/views/ir_rule_views.xml
index be8bd917785d..54f919329751 100644
--- a/odoo/addons/base/views/ir_rule_views.xml
+++ b/odoo/addons/base/views/ir_rule_views.xml
@@ -29,7 +29,7 @@
                         <field name="global"/>
                         <field name="groups" nolabel="1" colspan="4"/>
                     </group>
-                    <i class="fa fa-info fa-3x text-info pull-left"/>
+                    <i class="fa fa-info fa-3x text-info pull-left" role="img" aria-label="Info" title="Info"/>
                     <h3>Interaction between rules</h3>
                     <div>
                       <p>
diff --git a/odoo/addons/base/views/ir_sequence_views.xml b/odoo/addons/base/views/ir_sequence_views.xml
index d53570cc79a3..d55e8d7d1d9f 100644
--- a/odoo/addons/base/views/ir_sequence_views.xml
+++ b/odoo/addons/base/views/ir_sequence_views.xml
@@ -40,21 +40,21 @@
                         </field>
                         <group col="3" string="Legend (for prefix, suffix)">
                             <group>
-                                <label colspan="2" string="Current Year with Century: %%(year)s"/>
-                                <label colspan="2" string="Current Year without Century: %%(y)s"/>
-                                <label colspan="2" string="Month: %%(month)s"/>
-                                <label colspan="2" string="Day: %%(day)s"/>
+                                <span colspan="2">Current Year with Century: %%(year)s</span>
+                                <span colspan="2">Current Year without Century: %%(y)s</span>
+                                <span colspan="2">Month: %%(month)s</span>
+                                <span colspan="2">Day: %%(day)s</span>
                             </group>
                             <group>
-                                <label colspan="2" string="Day of the Year: %%(doy)s"/>
-                                <label colspan="2" string="Week of the Year: %%(woy)s"/>
-                                <label colspan="2" string="Day of the Week (0:Monday): %%(weekday)s"/>
+                                <span colspan="2">Day of the Year: %%(doy)s</span>
+                                <span colspan="2">Week of the Year: %%(woy)s</span>
+                                <span colspan="2">Day of the Week (0:Monday): %%(weekday)s</span>
                             </group>
                             <group>
-                                <label colspan="2" string="Hour 00->24: %%(h24)s"/>
-                                <label colspan="2" string="Hour 00->12: %%(h12)s"/>
-                                <label colspan="2" string="Minute: %%(min)s"/>
-                                <label colspan="2" string="Second: %%(sec)s"/>
+                                <span colspan="2">Hour 00->24: %%(h24)s</span>
+                                <span colspan="2">Hour 00->12: %%(h12)s</span>
+                                <span colspan="2">Minute: %%(min)s</span>
+                                <span colspan="2">Second: %%(sec)s</span>
                             </group>
                         </group>
                         <group attrs="{'invisible': [('use_date_range', '=', False)]}">
diff --git a/odoo/addons/base/views/res_company_views.xml b/odoo/addons/base/views/res_company_views.xml
index 57b08a2eaef1..90e4a0b2d97b 100644
--- a/odoo/addons/base/views/res_company_views.xml
+++ b/odoo/addons/base/views/res_company_views.xml
@@ -73,7 +73,7 @@
                         <t t-name="kanban-box">
                             <div t-attf-class="oe_kanban_global_click">
                                 <div class="text-center">
-                                    <i class="fa fa-building" aria-hidden="true"></i> <strong><field name="name"/></strong>
+                                    <i class="fa fa-building" role="img" aria-label="Enterprise" title="Enterprise"></i> <strong><field name="name"/></strong>
                                 </div>
                                 <hr class="mt4 mb4"/>
                                 <div class="row">
@@ -129,7 +129,7 @@
             <field name="arch" type="xml">
                 <field name="logo" position="before">
                     <div class="row">
-                        <div class="alert alert-warning ml8 mr8" role="alert" attrs="{'invisible': [('logo','!=',False)]}">
+                        <div class="alert alert-warning ml8 mr8" role="status" attrs="{'invisible': [('logo','!=',False)]}">
                             Update your company details and upload your logo to get a beautiful document.
                         </div>
                     </div>
diff --git a/odoo/addons/base/views/res_config_settings_views.xml b/odoo/addons/base/views/res_config_settings_views.xml
index 74ce361e96b7..2d119ee5af66 100644
--- a/odoo/addons/base/views/res_config_settings_views.xml
+++ b/odoo/addons/base/views/res_config_settings_views.xml
@@ -11,7 +11,7 @@
                             <div class="title h2 mb0 mt4 text-muted hidden-xs">Settings</div>
                             <div class="o_setting_search">
                                 <input type="text" class="searchInput" placeholder="Search..."/>
-                                <span class="searchIcon"><i class="fa fa-search"/></span>
+                                <span class="searchIcon"><i class="fa fa-search" role="img" aria-label="Search" title="Search"/></span>
                             </div>
                         </div>
                         <header>
diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml
index 5ded79d3e67b..f7657ccb4750 100644
--- a/odoo/addons/base/views/res_partner_views.xml
+++ b/odoo/addons/base/views/res_partner_views.xml
@@ -292,15 +292,15 @@
                                         <t t-name="kanban-box">
                                             <t t-set="color" t-value="kanban_color(record.color.raw_value)"/>
                                             <div t-att-class="color + (record.title.raw_value == 1 ? ' oe_kanban_color_alert' : '') + ' oe_kanban_global_click'">
-                                                <a t-if="!read_only_mode" type="delete" class="fa fa-times pull-right"/>
+                                                <a t-if="!read_only_mode" type="delete" class="fa fa-times pull-right" title="Delete" aria-label="Delete"/>
                                                 <div class="o_kanban_image">
-                                                    <img t-if="record.image_small.raw_value" t-att-src="'data:image/png;base64,'+record.image_small.raw_value"/>
+                                                    <img alt="" t-if="record.image_small.raw_value" t-att-src="'data:image/png;base64,'+record.image_small.raw_value"/>
                                                     <t t-if="!record.image_small.raw_value">
-                                                        <img t-if="record.type.raw_value === 'delivery'" t-att-src='_s + "/base/static/img/truck.png"'/>
-                                                        <img t-if="record.type.raw_value === 'invoice'" t-att-src='_s + "/base/static/img/money.png"'/>
+                                                        <img alt="Delivery" t-if="record.type.raw_value === 'delivery'" t-att-src='_s + "/base/static/img/truck.png"'/>
+                                                        <img alt="Invoice" t-if="record.type.raw_value === 'invoice'" t-att-src='_s + "/base/static/img/money.png"'/>
                                                         <t t-if="record.type.raw_value !== 'invoice' &amp;&amp; record.type.raw_value !== 'delivery'">
-                                                            <img t-if="record.is_company.raw_value === true" t-att-src='_s + "/base/static/img/company_image.png"'/>
-                                                            <img t-if="record.is_company.raw_value === false" t-att-src='_s + "/base/static/img/avatar.png"'/>
+                                                            <img alt="Logo" t-if="record.is_company.raw_value === true" t-att-src='_s + "/base/static/img/company_image.png"'/>
+                                                            <img alt="Avatar" t-if="record.is_company.raw_value === false" t-att-src='_s + "/base/static/img/avatar.png"'/>
                                                         </t>
                                                     </t>
                                                 </div>
@@ -495,21 +495,21 @@
                             <div class="oe_kanban_global_click o_res_partner_kanban">
                                 <div class="o_kanban_image">
                                     <t t-if="record.image_small.raw_value">
-                                        <img t-att-src="kanban_image('res.partner', 'image_small', record.id.raw_value)"/>
+                                        <img alt="Partner" t-att-src="kanban_image('res.partner', 'image_small', record.id.raw_value)"/>
                                     </t>
                                     <t t-if="!record.image_small.raw_value">
                                         <t t-if="record.type.raw_value === 'delivery'">
-                                            <img t-att-src='_s + "/base/static/img/truck.png"' class="o_kanban_image oe_kanban_avatar_smallbox"/>
+                                            <img alt="Delivery" t-att-src='_s + "/base/static/img/truck.png"' class="o_kanban_image oe_kanban_avatar_smallbox"/>
                                         </t>
                                         <t t-if="record.type.raw_value === 'invoice'">
-                                            <img t-att-src='_s + "/base/static/img/money.png"' class="o_kanban_image oe_kanban_avatar_smallbox"/>
+                                            <img alt="Invoice" t-att-src='_s + "/base/static/img/money.png"' class="o_kanban_image oe_kanban_avatar_smallbox"/>
                                          </t>
                                         <t t-if="record.type.raw_value != 'invoice' &amp;&amp; record.type.raw_value != 'delivery'">
                                             <t t-if="record.is_company.raw_value === true">
-                                                <img t-att-src='_s + "/base/static/img/company_image.png"'/>
+                                                <img alt="Logo" t-att-src='_s + "/base/static/img/company_image.png"'/>
                                             </t>
                                             <t t-if="record.is_company.raw_value === false">
-                                                <img t-att-src='_s + "/base/static/img/avatar.png"'/>
+                                                <img alt="Avatar" t-att-src='_s + "/base/static/img/avatar.png"'/>
                                             </t>
                                         </t>
                                     </t>
diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml
index ebf1f72479f3..ddeb9ba91eed 100644
--- a/odoo/addons/base/views/res_users_views.xml
+++ b/odoo/addons/base/views/res_users_views.xml
@@ -64,7 +64,7 @@
                             <field name="users" context="{'search_default_no_share':1}"/>
                         </page>
                         <page string="Inherited">
-                            <label string="Users added to this group are automatically added in the following groups."/>
+                            <label for="implied_ids" string="Users added to this group are automatically added in the following groups."/>
                             <field name="implied_ids"/>
                         </page>
                         <page string="Menus">
@@ -162,7 +162,7 @@
                                 <field name="active" widget="boolean_button" options='{"terminology": "active"}'/>
                             </button>
                         </div>
-                        <div class="alert alert-info text-center o_form_header" attrs="{'invisible': [('active', '=', True)]}">
+                        <div class="alert alert-info text-center o_form_header" attrs="{'invisible': [('active', '=', True)]}" role="alert">
                           <a class="close" data-dismiss="alert" href="#" aria-hidden="true">x</a>
                           <div>
                             <strong>The contact linked to this user is still active</strong>
@@ -283,17 +283,17 @@
                         <t t-name="kanban-box">
                             <div t-attf-class="oe_kanban_global_click">
                                 <div class="o_kanban_image">
-                                    <img t-att-src="kanban_image('res.users', 'image_medium', record.id.raw_value)"/>
+                                    <img alt="Avatar" t-att-src="kanban_image('res.users', 'image_medium', record.id.raw_value)"/>
                                 </div>
                                 <div class="oe_kanban_details">
                                     <ul>
-                                        <li class="text-success pull-right mb4" t-if="record.active.raw_value"><i class="fa fa-circle" aria-hidden="true"></i></li>
-                                        <li class="text-danger pull-right mb4" t-if="!record.active.raw_value"><i class="fa fa-circle"></i></li>
+                                        <li class="text-success pull-right mb4" t-if="record.active.raw_value"><i class="fa fa-circle" role="img" aria-label="Ok" title="Ok"></i></li>
+                                        <li class="text-danger pull-right mb4" t-if="!record.active.raw_value"><i class="fa fa-circle" role="img" aria-label="Invalid" title="Invalid"></i></li>
                                         <li class="mb4">
                                             <strong><field name="name"/></strong>
                                         </li>
                                         <li class="badge pull-right mb4" t-if="record.lang.raw_value"><field name="lang"/></li>
-                                        <li class="mb4" t-if="record.login.raw_value"><i class="fa fa-envelope"/> <field name="login"/></li>
+                                        <li class="mb4" t-if="record.login.raw_value" title="Login"><i class="fa fa-envelope" role="img" aria-label="Login"/> <field name="login"/></li>
                                     </ul>
                                 </div>
                             </div>
diff --git a/odoo/addons/base/wizard/base_language_install_views.xml b/odoo/addons/base/wizard/base_language_install_views.xml
index 5a82cb5d7ec9..936197d810e3 100644
--- a/odoo/addons/base/wizard/base_language_install_views.xml
+++ b/odoo/addons/base/wizard/base_language_install_views.xml
@@ -13,8 +13,8 @@
                         <field name="overwrite"/>
                     </group>
                     <group states="done" colspan="4">
-                        <label string="The selected language has been successfully installed.
-You must change the preferences of the user to view the changes."/>
+                        <span class="o_form_label">The selected language has been successfully installed.
+You must change the preferences of the user to view the changes.</span>
                     </group>
                     <footer states="init">
                         <button name="lang_install" string="Load" type="object" class="btn-primary"/>
diff --git a/odoo/addons/base/wizard/base_module_uninstall_views.xml b/odoo/addons/base/wizard/base_module_uninstall_views.xml
index aa945029b001..4f10bebc2763 100644
--- a/odoo/addons/base/wizard/base_module_uninstall_views.xml
+++ b/odoo/addons/base/wizard/base_module_uninstall_views.xml
@@ -19,7 +19,7 @@
                             <templates>
                                 <t t-name="kanban-box">
                                     <div class="oe_module_vignette">
-                                        <img t-attf-src="#{record.icon.value}"
+                                        <img t-attf-src="#{record.icon.value}" alt="Icon"
                                              class="oe_module_icon" style="width: 60px; height: 60px"/>
                                         <div class="oe_module_desc" style="padding-left: 70px">
                                             <h4><field name="shortdesc"/></h4>
diff --git a/odoo/addons/base/wizard/base_module_update_views.xml b/odoo/addons/base/wizard/base_module_update_views.xml
index c50d1a261aee..e465479e6ffc 100644
--- a/odoo/addons/base/wizard/base_module_update_views.xml
+++ b/odoo/addons/base/wizard/base_module_update_views.xml
@@ -10,7 +10,7 @@
                     <field name="state" invisible="1"/>
                     <separator string="Module Update Result"/>
                     <group states="init">
-                        <label string="Click on Update below to start the process..." />
+                        <span class="o_form_label">Click on Update below to start the process...</span>
                     </group>
                     <group states="done" >
                         <field name="updated"/>
diff --git a/odoo/addons/base/wizard/base_module_upgrade_views.xml b/odoo/addons/base/wizard/base_module_upgrade_views.xml
index 63c85fbe7aa9..53bf47d409f5 100644
--- a/odoo/addons/base/wizard/base_module_upgrade_views.xml
+++ b/odoo/addons/base/wizard/base_module_upgrade_views.xml
@@ -43,8 +43,8 @@
             <field name="priority" eval="20"/>
             <field name="arch" type="xml">
                 <form string="Apply Schedule Upgrade">
-                    <div><label string="The selected modules have been updated / installed !"/></div>
-                    <div><label string="We suggest to reload the menu tab to see the new menus (Ctrl+T then Ctrl+R)."/></div>
+                    <div><span class="o_form_label">The selected modules have been updated / installed !</span></div>
+                    <div><span class="o_form_label">We suggest to reload the menu tab to see the new menus (Ctrl+T then Ctrl+R)."</span></div>
                     <footer>
                         <button name="config" string="Start configuration" type="object" class="btn-primary"/>
                         <button string="Cancel" class="btn-default" special="cancel"/>
diff --git a/odoo/addons/test_exceptions/view.xml b/odoo/addons/test_exceptions/view.xml
index dd0aa97b7f12..7979425befd0 100644
--- a/odoo/addons/test_exceptions/view.xml
+++ b/odoo/addons/test_exceptions/view.xml
@@ -7,97 +7,97 @@
             <field name="model">test.exceptions.model</field>
             <field name="arch" type="xml">
                 <form string="Test exceptions">
-                    <label string="Each button generates a specific exception on the server. The text on the right is the expected representation of the exception when displayed on the client. Button marked with a '*' use safe_eval()."/>
+                    <p>Each button generates a specific exception on the server. The text on the right is the expected representation of the exception when displayed on the client. Button marked with a '*' use safe_eval().</p>
                     <separator/>
                     <group>
                         <div>
                             <button name="generate_except_osv" string="except_osv" type="object" icon="fa-refresh text-primary" />
-                            <label string="Warning-description"/>
+                            <label for="generate_except_osv" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_except_orm" string="except_orm" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description"/>
+                            <label for="generate_except_orm" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_warning" string="Warning" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description"/>
+                            <label for="generate_warning" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_redirect_warning" string="RedirectWarning" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description-redirection button"/>
+                            <label for="generate_redirect_warning" string="Warning-description-redirection button"/>
                         </div>
                         <div>
                             <button name="generate_access_denied" string="AccessDenied" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Access denied-traceback"/>
+                            <label for="generate_access_denied" string="Access denied-traceback"/>
                         </div>
                         <div>
                             <button name="generate_access_error" string="AccessError" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Access rights error-description" class="oe_inline"/>
+                            <label for="generate_access_error" string="Access rights error-description" class="oe_inline"/>
                         </div>
                         <div>
                             <button name="generate_exc_access_denied" string="Exc AccessDenied" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Access denied-traceback"/>
+                            <label for="generate_exc_access_denied" string="Access denied-traceback"/>
                         </div>
                         <div>
                             <button name="generate_undefined" string="Undefined" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Server error-traceback"/>
+                            <label for="generate_undefined" string="Server error-traceback"/>
                         </div>
                         <div>
                             <button name="generate_user_error" string="UserError" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description"/>
+                            <label for="generate_user_error" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_missing_error" string="MissingError" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Missing Error-description"/>
+                            <label for="generate_missing_error" string="Missing Error-description"/>
                         </div>
                         <div>
                             <button name="generate_validation_error" string="ValidationError" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Validation Error-description"/>
+                            <label for="generate_validation_error" string="Validation Error-description"/>
                         </div>
 
                         <div>
                             <button name="generate_except_osv_safe_eval" string="except_osv*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description"/>
+                            <label for="generate_except_osv_safe_eval" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_except_orm_safe_eval" string="except_orm*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description"/>
+                            <label for="generate_except_orm_safe_eval" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_warning_safe_eval" string="Warning*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description"/>
+                            <label for="generate_warning_safe_eval" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_redirect_warning_safe_eval" string="RedirectWarning*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description-redirection button" class="oe_inline"/>
+                            <label for="generate_redirect_warning_safe_eval" string="Warning-description-redirection button" class="oe_inline"/>
                         </div>
                         <div>
                             <button name="generate_access_denied_safe_eval" string="AccessDenied*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Access denied-traceback"/>
+                            <label for="generate_access_denied_safe_eval" string="Access denied-traceback"/>
                         </div>
                         <div>
                             <button name="generate_access_error_safe_eval" string="AccessError*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Access rights error-description"/>
+                            <label for="generate_access_error_safe_eval" string="Access rights error-description"/>
                         </div>
                         <div>
                             <button name="generate_exc_access_denied_safe_eval" string="Exc AccessDenied*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Access denied-traceback"/>
+                            <label for="generate_exc_access_denied_safe_eval" string="Access denied-traceback"/>
                         </div>
                         <div>
                             <button name="generate_undefined_safe_eval" string="Undefined*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Server error-traceback"/>
+                            <label for="generate_undefined_safe_eval" string="Server error-traceback"/>
                         </div>
                         <div>
                             <button name="generate_user_error_safe_eval" string="UserError*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Warning-description"/>
+                            <label for="generate_user_error_safe_eval" string="Warning-description"/>
                         </div>
                         <div>
                             <button name="generate_missing_error_safe_eval" string="MissingError*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Missing Error-description"/>
+                            <label for="generate_missing_error_safe_eval" string="Missing Error-description"/>
                         </div>
                         <div>
                             <button name="generate_validation_error_safe_eval" string="ValidationError*" type="object" icon="fa-refresh text-primary"/>
-                            <label string="Validation Error-description"/>
+                            <label for="generate_validation_error_safe_eval" string="Validation Error-description"/>
                         </div>
                     </group>
                 </form>
diff --git a/odoo/addons/test_main_flows/static/src/js/tour.js b/odoo/addons/test_main_flows/static/src/js/tour.js
index 925e86c9bef0..c74d473fcbc3 100644
--- a/odoo/addons/test_main_flows/static/src/js/tour.js
+++ b/odoo/addons/test_main_flows/static/src/js/tour.js
@@ -122,7 +122,7 @@ tour.register('main_flow_tour', {
     position: 'right',
 }, {
     trigger:  ".o_field_widget[name=name] input",
-    extra_trigger: ".modal-dialog",
+    extra_trigger: "[role=\"dialog\"]",
     content: _t('Select a seller'),
     position: 'top',
     run: "text the_flow.vendor",
@@ -135,12 +135,12 @@ tour.register('main_flow_tour', {
     position: 'right',
     run: "text 1",
 }, {
-    trigger:  ".modal-footer .btn-primary:first",
+    trigger:  "footer.modal-footer .btn-primary:first",
     extra_trigger: ".o_field_widget[name=name] > .o_external_button", // Wait name_create
     content: _t('Save & Close'),
     position: 'bottom',
 }, {
-    trigger: ".modal-footer .btn-primary",
+    trigger: "footer.modal-footer .btn-primary",
     content: _t('Save'),
     position: 'bottom',
 },
@@ -176,7 +176,7 @@ tour.register('main_flow_tour', {
     position: 'right',
 }, {
     trigger:  ".o_field_widget[name=name] input",
-    extra_trigger: ".modal-dialog",
+    extra_trigger: "[role=\"dialog\"]",
     content: _t('Select a seller'),
     position: 'top',
     run: "text the_flow.vendor",
@@ -190,11 +190,11 @@ tour.register('main_flow_tour', {
     position: 'right',
     run: "text 1",
 }, {
-    trigger:  ".modal-footer .btn-primary:first",
+    trigger:  "footer.modal-footer .btn-primary:first",
     content: _t('Save & Close'),
     position: 'bottom',
 }, {
-    trigger: ".modal-footer .btn-primary",
+    trigger: "footer.modal-footer .btn-primary",
     // Wait Save & Close and check value
     extra_trigger: ".o_field_widget[name=seller_ids] .o_data_row td:nth-child(2):contains('the_flow.vendor')",
     content: _t('Save'),
@@ -326,8 +326,8 @@ tour.register('main_flow_tour', {
     run: function (actions) {
         actions.auto();
         // if the one2many isn't editable, we have to close the dialog
-        if ($(".modal-footer .btn-primary").length) {
-            actions.auto(".modal-footer .btn-primary");
+        if ($("footer.modal-footer .btn-primary").length) {
+            actions.auto("footer.modal-footer .btn-primary");
         }
     },
 }, {
@@ -338,7 +338,7 @@ tour.register('main_flow_tour', {
     trigger: ".o_field_widget[name=product_id] input",
     // the one2many may be editable or not according to the modules installed, so
     // we have to handle both cases
-    extra_trigger: '.o_field_widget[name=order_line] .o_data_row:nth(1).o_selected_row, .modal-dialog',
+    extra_trigger: '.o_field_widget[name=order_line] .o_data_row:nth(1).o_selected_row, [role="dialog"]',
     content: _t("Select a product"),
     position: "right",
     run: "text the_flow.service",
@@ -349,8 +349,8 @@ tour.register('main_flow_tour', {
     run: function (actions) {
         actions.auto();
         // if the one2many isn't editable, we have to close the dialog
-        if ($(".modal-footer .btn-primary").length) {
-            actions.auto(".modal-footer .btn-primary");
+        if ($("footer.modal-footer .btn-primary").length) {
+            actions.auto("footer.modal-footer .btn-primary");
         }
     },
 }, {
@@ -368,11 +368,11 @@ tour.register('main_flow_tour', {
     position: "right",
     run: "text test@the_flow.com",
 },{
-    trigger: ".modal-footer .btn-primary",
+    trigger: "footer.modal-footer .btn-primary",
     content: _t("Save your changes"),
     position: "bottom",
 },  {
-    trigger: ".modal-footer .btn-primary span:contains('Send')",
+    trigger: "footer.modal-footer .btn-primary span:contains('Send')",
     content: _t("Try to send it to email"),
     position: "bottom",
 }, {
@@ -440,8 +440,8 @@ tour.register('main_flow_tour', {
     content: _t("Click on schedulers"),
     position: "bottom"
 }, {
-    trigger: ".modal-footer .btn-primary",
-    extra_trigger: ".modal-dialog",
+    trigger: "footer.modal-footer .btn-primary",
+    extra_trigger: "[role=\"dialog\"]",
     content: _t("Run Schedulers"),
     position: "bottom",
 }, {
@@ -471,8 +471,8 @@ tour.register('main_flow_tour', {
     content: _t("Validate"),
     position: "bottom",
 }, {
-    trigger: ".modal-footer .btn-primary",
-    extra_trigger: ".modal-dialog",
+    trigger: "footer.modal-footer .btn-primary",
+    extra_trigger: "[role=\"dialog\"]",
     content: _t("Apply"),
     position: "bottom",
 }, {
@@ -497,12 +497,12 @@ tour.register('main_flow_tour', {
     position: "bottom",
 }, {
     trigger: "select.o_field_widget[name=journal_id]",
-    extra_trigger: ".modal-dialog",
+    extra_trigger: "[role=\"dialog\"]",
     content: _t("Select Journal"),
     position: "bottom",
     run: 'text(Bank (USD))',
 }, {
-    trigger: ".modal-footer .btn-primary",
+    trigger: "footer.modal-footer .btn-primary",
     extra_trigger: ".o_field_widget[name=payment_method_id]", // FIXME: Wait onchange
     content: _t("Validate"),
     position: "bottom",
@@ -528,7 +528,7 @@ tour.register('main_flow_tour', {
     content: _t("Produce"),
     position: "bottom",
 }, {
-    trigger:  ".modal-footer .btn-primary:first",
+    trigger:  "footer.modal-footer .btn-primary:first",
     content: _t('Record Production'),
     position: 'bottom',
 }, {
@@ -607,7 +607,7 @@ tour.register('main_flow_tour', {
     content: _t("Validate"),
     position: "bottom",
 }, {
-    trigger: ".modal-footer .btn-primary",
+    trigger: "footer.modal-footer .btn-primary",
     content: _t("Create and View Invoices"),
     position: "bottom",
 }, {
@@ -620,12 +620,12 @@ tour.register('main_flow_tour', {
     position: "bottom",
 }, {
     trigger: "select.o_field_widget[name=journal_id]",
-    extra_trigger: ".modal-dialog",
+    extra_trigger: "[role=\"dialog\"]",
     content: _t("Select Journal"),
     position: "bottom",
     run: 'text(Bank (USD))',
 }, {
-    trigger: ".modal-footer .btn-primary",
+    trigger: "footer.modal-footer .btn-primary",
     content: _t("Validate"),
     position: "bottom",
 }, {
diff --git a/odoo/addons/test_new_api/static/tests/x2many.js b/odoo/addons/test_new_api/static/tests/x2many.js
index d256d0263253..4a088576050e 100644
--- a/odoo/addons/test_new_api/static/tests/x2many.js
+++ b/odoo/addons/test_new_api/static/tests/x2many.js
@@ -31,7 +31,7 @@ odoo.define('web.test.x2many', function (require) {
     }, {
         content: "insert a name into the modal form",
         trigger: 'input.o_field_widget.o_required_modifier:first',
-        extra_trigger: '.modal:visible',
+        extra_trigger: '[role="dialog"]:visible',
         run: function (action_helper) {
             action_helper.text('user_test_' + (inc = new Date().getTime()));
         }
@@ -44,7 +44,7 @@ odoo.define('web.test.x2many', function (require) {
         }
     }, {
         content: "save the modal content and create the new moderator",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'input.o_field_widget.o_required_modifier:propValueContains(@test)',
     }, {
         content: "check if the modal is saved",
@@ -82,12 +82,12 @@ odoo.define('web.test.x2many', function (require) {
         trigger: '.tab-pane:eq(0) .o_field_x2many_list_row_add a'
     }, {
         content: "insert body a",
-        trigger: '.modal-body textarea:first',
+        trigger: 'main.modal-body textarea:first',
         run: 'text a',
     }, {
         content: "save new message a",
-        trigger: '.modal-footer button:contains(Save):first',
-        extra_trigger: '.modal-body textarea:first:propValue(a)',
+        trigger: 'footer.modal-footer button:contains(Save):first',
+        extra_trigger: 'main.modal-body textarea:first:propValue(a)',
     }, { // add message b
         content: "create new message b",
         trigger: '.tab-pane:eq(0) .o_field_x2many_list_row_add a',
@@ -98,7 +98,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'text b',
     }, {
         content: "save new message b",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'textarea[name="body"]:first:propValue(b)',
     }, { // change content to trigger on change
         content: "insert content",
@@ -123,7 +123,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'text bbb',
     }, {
         content: "save changes",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'textarea[name="body"]:first:propValue(bbb)',
     }, { // add message c
         content: "create new message c",
@@ -135,7 +135,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'text c',
     }, {
         content: "save new message c",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'textarea[name="body"]:first:propValue(c)',
     }, { // add participants
         content: "change tab to Participants",
@@ -186,7 +186,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'text d',
     }, {
         content: "save new message d",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'textarea[name="body"]:first:propValue(d)',
     }, { // add message e
         content: "create new message e",
@@ -198,7 +198,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'text e',
     }, {
         content: "save new message e",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'textarea[name="body"]:first:propValue(e)',
     }, { // change message a
         content: "edit message a",
@@ -210,7 +210,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'text aaa',
     }, {
         content: "save changes",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'textarea[name="body"]:first:propValue(aaa)',
     }, { // change message e
         content: "edit message e",
@@ -235,7 +235,7 @@ odoo.define('web.test.x2many', function (require) {
         run: function () {}, // don't change texarea content
     }, {
         content: "save changes",
-        trigger: '.modal-footer button:contains(Save):contains(Close)'
+        trigger: 'footer.modal-footer button:contains(Save):contains(Close)'
     }, {
         content: "test one2many triggered the onchange on save for the line",
         trigger: '.o_content:has(.tab-pane:eq(0) .o_field_widget tbody tr td.o_readonly_modifier:contains([test_trigger] Demo User))',
@@ -283,7 +283,7 @@ odoo.define('web.test.x2many', function (require) {
     }, {
         content: "select another user",
         trigger: '.o_field_many2one .o_input_dropdown > input',
-        extra_trigger: 'body:has(.modal) .tab-pane:eq(0) .o_field_widget tbody tr:has(td:containsExact(d))',
+        extra_trigger: 'body:has([role="dialog"]) .tab-pane:eq(0) .o_field_widget tbody tr:has(td:containsExact(d))',
         run: 'text Demo',
     }, {
         content: "select demo user",
@@ -299,7 +299,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'text ddd',
     }, {
         content: "save new message ddd",
-        trigger: '.modal-footer button:contains(Save):first',
+        trigger: 'footer.modal-footer button:contains(Save):first',
         extra_trigger: 'textarea[name="body"]:first:propValue(ddd)',
     }, { // trigger onchange
         content: "blur the one2many",
@@ -321,7 +321,7 @@ odoo.define('web.test.x2many', function (require) {
         run: 'click',
     }, {
         content: "confirm cancel change",
-        trigger: '.modal-footer button:contains(Ok)',
+        trigger: 'footer.modal-footer button:contains(Ok)',
     },
 
     /////////////////////////////////////////////////////////////////////////////////////////////
@@ -516,6 +516,6 @@ odoo.define('web.test.x2many', function (require) {
         run: 'click',
     }, {
         content: "confirm cancel change",
-        trigger: '.modal-footer button:contains(Ok)',
+        trigger: 'footer.modal-footer button:contains(Ok)',
     }]);
 });
diff --git a/odoo/api.py b/odoo/api.py
index d1b1872e7f5d..2d2bae74e1a6 100644
--- a/odoo/api.py
+++ b/odoo/api.py
@@ -56,6 +56,7 @@ from decorator import decorator
 from werkzeug.local import Local, release_local
 
 from odoo.tools import frozendict, classproperty, StackMap
+from odoo.exceptions import CacheMiss
 
 _logger = logging.getLogger(__name__)
 
@@ -958,7 +959,11 @@ class Cache(object):
     def get(self, record, field):
         """ Return the value of ``field`` for ``record``. """
         key = field.cache_key(record)
-        value = self._data[field][record.id][key]
+        try:
+            value = self._data[field][record.id][key]
+        except KeyError:
+            raise CacheMiss(record, field)
+
         return value.get() if isinstance(value, SpecialValue) else value
 
     def set(self, record, field, value):
diff --git a/odoo/exceptions.py b/odoo/exceptions.py
index c318f9ecdac1..e1689ffd27f8 100644
--- a/odoo/exceptions.py
+++ b/odoo/exceptions.py
@@ -63,6 +63,13 @@ class AccessError(except_orm):
         super(AccessError, self).__init__(msg)
 
 
+class CacheMiss(except_orm, KeyError):
+    """ Missing value(s) in cache.
+    Example: When you try to read a value in a flushed cache."""
+    def __init__(self, record, field):
+        super(CacheMiss, self).__init__("%s.%s" % (str(record), field.name))
+
+
 class MissingError(except_orm):
     """ Missing record(s).
     Example: When you try to write on a deleted record."""
diff --git a/odoo/tools/translate.py b/odoo/tools/translate.py
index f69d37214bdc..6b785c0d47a5 100644
--- a/odoo/tools/translate.py
+++ b/odoo/tools/translate.py
@@ -143,9 +143,12 @@ TRANSLATED_ELEMENTS = {
 
 # which attributes must be translated
 TRANSLATED_ATTRS = {
-    'string', 'help', 'sum', 'avg', 'confirm', 'placeholder', 'alt', 'title',
+    'string', 'help', 'sum', 'avg', 'confirm', 'placeholder', 'alt', 'title', 'aria-label',
+    'aria-keyshortcuts', 'aria-placeholder', 'aria-roledescription', 'aria-valuetext',
 }
 
+TRANSLATED_ATTRS = TRANSLATED_ATTRS | {'t-attf-' + attr for attr in TRANSLATED_ATTRS}
+
 avoid_pattern = re.compile(r"\s*<!DOCTYPE", re.IGNORECASE | re.MULTILINE | re.UNICODE)
 node_pattern = re.compile(r"<[^>]*>(.*)</[^<]*>", re.DOTALL | re.MULTILINE | re.UNICODE)
 
diff --git a/odoo/tools/view_validation.py b/odoo/tools/view_validation.py
index 1ffdd43e58b3..7c69906220d8 100644
--- a/odoo/tools/view_validation.py
+++ b/odoo/tools/view_validation.py
@@ -15,9 +15,13 @@ _relaxng_cache = {}
 
 def valid_view(arch):
     for pred in _validators[arch.tag]:
-        if not pred(arch):
+        check = pred(arch)
+        if not check:
             _logger.error("Invalid XML: %s", pred.__doc__)
             return False
+        if check == "Warning":
+            _logger.warning("Invalid XML: %s", pred.__doc__)
+            return "Warning"
     return True
 
 
@@ -88,8 +92,8 @@ def valid_att_in_field(arch):
 
 @validate('form')
 def valid_att_in_label(arch):
-    """ ``label`` nodes must have a ``@for`` or a ``@string`` """
-    return not arch.xpath('//label[not(@for or @string)]')
+    """ ``label`` nodes must have a ``@for`` """
+    return not arch.xpath('//label[not(@for) and not(descendant::input)]')
 
 
 @validate('form')
@@ -113,3 +117,235 @@ def valid_type_in_col(arch):
         attrib.isdigit()
         for attrib in arch.xpath('//@col')
     )
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_alternative_image_text(arch):
+    """An `img` tag must have an alt value."""
+    if arch.xpath('//img[not(@alt or @t-att-alt or @t-attf-alt)]'):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_alternative_icon_text(arch):
+    """An icon with fa- class or in a button must have aria-label in its tag, parents, descendants or have text."""
+    valid_aria_attrs = {
+        'aria-label', 'aria-labelledby', 't-att-aria-label', 't-attf-aria-label',
+        't-att-aria-labelledby', 't-attf-aria-labelledby'}
+    valid_t_attrs = {'t-value', 't-raw', 't-field', 't-esc'}
+    valid_attrs = valid_aria_attrs | valid_t_attrs
+    valid_aria_attrs_xpath = ' or '.join('@' + attr for attr in valid_aria_attrs)
+    valid_attrs_xpath = ' or '.join('@' + attr for attr in valid_attrs)
+
+    # Select elements with class begining by 'fa-'
+    xpath = '(//*[contains(concat(" ", @class), " fa-")'
+    xpath += ' or contains(concat(" ", @t-att-class), " fa-")'
+    xpath += ' or contains(concat(" ", @t-attf-class), " fa-")]'
+    xpath += ' | //button[@icon])'
+    # Elements with accessibility or string attrs are good
+    xpath += '[not(' + valid_attrs_xpath + ')]'
+    # And we ignore all elements with describing in children
+    xpath += '[not(//*[' + valid_attrs_xpath + '])]'
+    # Aria label can be on ancestors
+    xpath += '[not(ancestor[' + valid_aria_attrs_xpath + '])]'
+    # Labels provide text by definition
+    xpath += '[not(descendant-or-self::label)]'
+    # Buttons can have a string attribute
+    xpath += '[not(descendant-or-self::button[@string])]'
+    # Fields have labels
+    xpath += '[not(descendant-or-self::field)]'
+    # And finally, if there is some text, it's good too
+    xpath += '[not(descendant-or-self::*[text()])]'
+
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_title_icon(arch):
+    """An icon with fa- class or in a button must have title in its tag, parents, descendants or have text."""
+    valid_title_attrs = {'title', 't-att-title', 't-attf-title'}
+    valid_t_attrs = {'t-value', 't-raw', 't-field', 't-esc'}
+    valid_attrs = valid_title_attrs | valid_t_attrs
+    valid_title_attrs_xpath = ' or '.join('@' + attr for attr in valid_title_attrs)
+    valid_attrs_xpath = ' or '.join('@' + attr for attr in valid_attrs)
+
+    # Select elements with class begining by 'fa-'
+    xpath = '(//*[contains(concat(" ", @class), " fa-")'
+    xpath += ' or contains(concat(" ", @t-att-class), " fa-")'
+    xpath += ' or contains(concat(" ", @t-attf-class), " fa-")]'
+    xpath += ' | //button[@icon])'
+    # Elements with accessibility or string attrs are good
+    xpath += '[not(' + valid_attrs_xpath + ')]'
+    # And we ignore all elements with describing in children
+    xpath += '[not(//*[' + valid_attrs_xpath + '])]'
+    # Aria label can be on ancestors
+    xpath += '[not(ancestor[' + valid_title_attrs_xpath + '])]'
+    # Labels provide text by definition
+    xpath += '[not(descendant-or-self::label)]'
+    # Buttons can have a string attribute
+    xpath += '[not(descendant-or-self::button[@string])]'
+    # Fields have labels
+    xpath += '[not(descendant-or-self::field)]'
+    # And finally, if there is some text, it's good too
+    xpath += '[not(descendant-or-self::*[text()])]'
+
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_simili_button(arch):
+    """A simili button must be tagged with "role='button'"."""
+    # Select elements with class 'btn'
+    xpath = '//a[contains(concat(" ", @class), " btn")'
+    xpath += ' or contains(concat(" ", @t-att-class), " btn")'
+    xpath += ' or contains(concat(" ", @t-attf-class), " btn")]'
+    xpath += '[not(@role="button")]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_simili_dropdown(arch):
+    """A simili dropdown must be tagged with "role='menu'"."""
+    xpath = '//*[contains(concat(" ", @class, " "), " dropdown-menu ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " dropdown-menu ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " dropdown-menu ")]'
+    xpath += '[not(@role="menu")]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_simili_progressbar(arch):
+    """A simili progressbar must be tagged with "role='progressbar'" and have
+    aria-valuenow, aria-valuemin and aria-valuemax attributes."""
+    # Select elements with class 'btn'
+    xpath = '//*[contains(concat(" ", @class, " "), " o_progressbar ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " o_progressbar ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " o_progressbar ")]'
+    xpath += '[not(self::progress)]'
+    xpath += '[not(@role="progressbar")]'
+    xpath += '[not(@aria-valuenow or @t-att-aria-valuenow or @t-attf-aria-valuenow)]'
+    xpath += '[not(@aria-valuemin or @t-att-aria-valuemin or @t-attf-aria-valuemin)]'
+    xpath += '[not(@aria-valuemax or @t-att-aria-valuemax or @t-attf-aria-valuemax)]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_dialog(arch):
+    """A dialog must use role="dialog" and its header, body and footer contents must use <header/>, <main/> and <footer/>."""
+    # Select elements with class 'btn'
+    xpath = '//*[contains(concat(" ", @class, " "), " modal ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " modal ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " modal ")]'
+    xpath += '[not(@role="dialog")]'
+    if arch.xpath(xpath):
+        return "Warning"
+
+    xpath = '//*[contains(concat(" ", @class, " "), " modal-header ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " modal-header ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " modal-header ")]'
+    xpath += '[not(self::header)]'
+    if arch.xpath(xpath):
+        return "Warning"
+
+    xpath = '//*[contains(concat(" ", @class, " "), " modal-body ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " modal-body ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " modal-body ")]'
+    xpath += '[not(self::main)]'
+    if arch.xpath(xpath):
+        return "Warning"
+
+    xpath = '//*[contains(concat(" ", @class, " "), " modal-footer ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " modal-footer ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " modal-footer ")]'
+    xpath += '[not(self::footer)]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_simili_tabpanel(arch):
+    """A tab panel with tab-pane class must have role="tabpanel"."""
+    # Select elements with class 'btn'
+    xpath = '//*[contains(concat(" ", @class, " "), " tab-pane ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " tab-pane ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " tab-pane ")]'
+    xpath += '[not(@role="tabpanel")]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_simili_tab(arch):
+    """A tab link must have role="tab", a link to an id (without #) by aria-controls."""
+    # Select elements with class 'btn'
+    xpath = '//*[@data-toggle="tab"]'
+    xpath += '[not(@role="tab")'
+    xpath += 'or not(@aria-controls or @t-att-aria-controls or @t-attf-aria-controls)'
+    xpath += 'or contains(@aria-controls, "#") or contains(@t-att-aria-controls, "#")]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_simili_tablist(arch):
+    """A tab list with class nav-tabs must have role="tablist"."""
+    # Select elements with class 'btn'
+    xpath = '//*[contains(concat(" ", @class, " "), " nav-tabs ")'
+    xpath += ' or contains(concat(" ", @t-att-class, " "), " nav-tabs ")'
+    xpath += ' or contains(concat(" ", @t-attf-class, " "), " nav-tabs ")]'
+    xpath += '[not(@role="tablist")]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_focusable_button(arch):
+    """A simili button must be with a `button`, an `input` (with type `button`, `submit` or `reset`) or a `a` tag."""
+    xpath = '//*[contains(concat(" ", @class), " btn")'
+    xpath += ' or contains(concat(" ", @t-att-class), " btn")'
+    xpath += ' or contains(concat(" ", @t-attf-class), " btn")]'
+    xpath += '[not(self::a)]'
+    xpath += '[not(self::button)]'
+    xpath += '[not(self::select)]'
+    xpath += '[not(self::input[@type="button"])]'
+    xpath += '[not(self::input[@type="submit"])]'
+    xpath += '[not(self::input[@type="reset"])]'
+    xpath += '[not(contains(@class, "btn-group"))]'
+    xpath += '[not(contains(@t-att-class, "btn-group"))]'
+    xpath += '[not(contains(@t-attf-class, "btn-group"))]'
+    xpath += '[not(contains(@class, "btn-toolbar"))]'
+    xpath += '[not(contains(@t-att-class, "btn-toolbar"))]'
+    xpath += '[not(contains(@t-attf-class, "btn-toolbar"))]'
+    xpath += '[not(contains(@class, "btn-ship"))]'
+    xpath += '[not(contains(@t-att-class, "btn-ship"))]'
+    xpath += '[not(contains(@t-attf-class, "btn-ship"))]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_prohibited_none_role(arch):
+    """A role can't be `none` or `presentation`. All your elements must be accessible with screen readers, describe it."""
+    xpath = '//*[@role="none" or @role="presentation"]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
+
+@validate('calendar', 'diagram', 'form', 'graph', 'kanban', 'pivot', 'search', 'tree')
+def valid_alerts(arch):
+    """An alert (class alert-*) must have an alert, alertdialog or status role. Please use alert and alertdialog only for what expects to stop any activity to be read immediatly."""
+    xpath = '//*[contains(concat(" ", @class), " alert-")'
+    xpath += ' or contains(concat(" ", @t-att-class), " alert-")'
+    xpath += ' or contains(concat(" ", @t-attf-class), " alert-")]'
+    xpath += '[not(contains(@class, "alert-link") or contains(@t-att-class, "alert-link")'
+    xpath += ' or contains(@t-attf-class, "alert-link"))]'
+    xpath += '[not(@role="alert")]'
+    xpath += '[not(@role="alertdialog")]'
+    xpath += '[not(@role="status")]'
+    if arch.xpath(xpath):
+        return "Warning"
+    return True
-- 
GitLab