diff --git a/web_duplicate_visibility/README.rst b/web_duplicate_visibility/README.rst
new file mode 100644
index 00000000..5fc4ce93
--- /dev/null
+++ b/web_duplicate_visibility/README.rst
@@ -0,0 +1,83 @@
+.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+========================
+Web duplicate visibility
+========================
+
+This module allows to manage the visibility of duplicate button from the form
+view declaration.
+
+Usage
+=====
+
+While the default behavior of odoo is to display the duplicate button when user
+is allowed to create a new object. You are now able to remove duplicate button
+explicitly even if you are able to create new object::
+
+
+ view name
+ my.model
+
+
+
+
+
+
+or by extending an existing view::
+
+
+
+ 0
+
+
+
+
+.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
+ :alt: Try me on Runbot
+ :target: https://runbot.odoo-community.org/runbot/repo/github-com-oca-web-162
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues
+`_. In case of trouble, please
+check there if your issue has already been reported. If you spotted it first,
+help us smashing it by providing a detailed and welcomed `feedback
+`_.
+
+Credits
+=======
+
+Images
+------
+
+* Odoo Community Association: `Icon `_.
+
+Contributors
+------------
+
+* Pierre Verkest
+* Christophe Combelles
+* Simon André
+
+Maintainer
+----------
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+This module is maintained by the OCA.
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+To contribute to this module, please visit https://odoo-community.org.
diff --git a/web_duplicate_visibility/__init__.py b/web_duplicate_visibility/__init__.py
new file mode 100644
index 00000000..40a96afc
--- /dev/null
+++ b/web_duplicate_visibility/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
diff --git a/web_duplicate_visibility/__openerp__.py b/web_duplicate_visibility/__openerp__.py
new file mode 100644
index 00000000..7399f90c
--- /dev/null
+++ b/web_duplicate_visibility/__openerp__.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# © 2016 Pierre Verkest
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+{
+ "name": "web duplicate visibility",
+ "summary": "Manage the duplicate button visibiliy",
+ "version": "9.0.1.0.0",
+ "category": "web",
+ "website": "https://odoo-community.org/",
+ "author": "Pierre Verkest ,"
+ " Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "application": False,
+ "installable": True,
+ "depends": [
+ "base",
+ "web",
+ ],
+ "data": [
+ "views/assets.xml",
+ ],
+ "demo": [
+ "demo/res_users_view.xml",
+ ],
+}
diff --git a/web_duplicate_visibility/demo/res_users_view.xml b/web_duplicate_visibility/demo/res_users_view.xml
new file mode 100644
index 00000000..efa3d2fc
--- /dev/null
+++ b/web_duplicate_visibility/demo/res_users_view.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ res.users
+
+
+ 0
+
+
+
+
\ No newline at end of file
diff --git a/web_duplicate_visibility/static/src/js/duplicate_visibility.js b/web_duplicate_visibility/static/src/js/duplicate_visibility.js
new file mode 100644
index 00000000..dce68485
--- /dev/null
+++ b/web_duplicate_visibility/static/src/js/duplicate_visibility.js
@@ -0,0 +1,35 @@
+odoo.define('web.DuplicateVisibility',function (require) {
+ "use strict";
+
+ var core = require('web.core');
+ var Sidebar = require('web.Sidebar');
+ var FormView = require('web.FormView');
+
+ var _t = core._t;
+
+ var DuplicateVisibility = FormView.include({
+ /**
+ * Instantiate and render the sidebar if a sidebar is requested
+ * Sets this.sidebar
+ * @param {jQuery} [$node] a jQuery node where the sidebar should be inserted
+ * $node may be undefined, in which case the FormView inserts the sidebar in a
+ * div of its template
+ **/
+ render_sidebar: function($node) {
+ var res = this._super.apply(this, arguments);
+ if (this.sidebar) {
+ if(!this.is_action_enabled('duplicate') &&
+ this.sidebar.items.hasOwnProperty('other')){
+ this.sidebar.items.other = this.sidebar.items.other.filter(
+ function(item){
+ return item.label !== _t("Duplicate");
+ }
+ );
+ this.sidebar.redraw();
+ }
+ }
+ return res;
+ },
+ });
+
+});
diff --git a/web_duplicate_visibility/static/test/duplicate_visibility.js b/web_duplicate_visibility/static/test/duplicate_visibility.js
new file mode 100644
index 00000000..7addfc45
--- /dev/null
+++ b/web_duplicate_visibility/static/test/duplicate_visibility.js
@@ -0,0 +1,82 @@
+"use strict";
+odoo.define_section('web_duplicate_visibility',
+ ['web.data', 'web.FormView'],
+ function(test, mock){
+
+ function assertDuplicate(data, FormView, form_tag, visible){
+ mock.add('test.model:read', function () {
+ return [{ id: 1, a: 'foo', b: 'bar', c: 'baz' }];
+ });
+
+ mock.add('test.model:fields_view_get', function () {
+ return {
+ type: 'form',
+ fields: {
+ a: {type: 'char', string: "A"},
+ b: {type: 'char', string: "B"},
+ c: {type: 'char', string: "C"}
+ },
+ arch: form_tag +
+ ' ' +
+ ' ' +
+ ' ' +
+ '',
+ };
+ });
+
+ var ds = new data.DataSetStatic(null, 'test.model', null, [1]);
+ ds.index = 0;
+ var $fix = $( "#qunit-fixture");
+ var form = new FormView(
+ {},
+ ds,
+ false,
+ {
+ sidebar: true,
+ }
+ );
+ form.appendTo($fix);
+ form.do_show();
+ form.render_sidebar();
+
+ var $fix = $( "#qunit-fixture");
+ var actions = $fix.find('.oe_sidebar a[data-section="other"]').filter(
+ function(i, obj){
+ return obj.text.trim() == "Duplicate";
+ }
+ );
+ strictEqual(
+ actions.length, visible, "duplicate state is not as expected"
+ );
+ };
+
+ test('Duplicate button visible when nothing set',
+ function(assert, data, FormView){
+ assertDuplicate(data, FormView, '