diff --git a/packages/polymer-legacy-adapter/src/template-renderer-templatizer.js b/packages/polymer-legacy-adapter/src/template-renderer-templatizer.js
index 1a07adca00..0ab77a6946 100644
--- a/packages/polymer-legacy-adapter/src/template-renderer-templatizer.js
+++ b/packages/polymer-legacy-adapter/src/template-renderer-templatizer.js
@@ -101,6 +101,10 @@ export class Templatizer extends PolymerElement {
}, {});
this.__TemplateClass = templatize(this.__template, this, {
+ // Events handled by declarative event listeners
+ // (`on-event="handler"`) will be decorated with a `model` property pointing
+ // to the template instance that stamped it.
+ parentModel: true,
// This property prevents the template instance properties
// from passing into the `forwardHostProp` callback
instanceProps,
diff --git a/packages/polymer-legacy-adapter/test/vaadin-template-renderer.test.js b/packages/polymer-legacy-adapter/test/vaadin-template-renderer.test.js
index 7c8acb920f..39e0b51019 100644
--- a/packages/polymer-legacy-adapter/test/vaadin-template-renderer.test.js
+++ b/packages/polymer-legacy-adapter/test/vaadin-template-renderer.test.js
@@ -119,6 +119,17 @@ describe('vaadin-template-renderer', () => {
expect(spy.calledOnce).to.be.true;
});
+ it('should include model in the event', () => {
+ const host = fixtureSync(``);
+ const component = host.$.component;
+ const button = component.$.content.querySelector('button');
+ const spy = sinon.spy(host, 'onClick');
+
+ click(button);
+
+ expect(spy.getCall(0).args[0].model).to.equal(component.$.content.__templateInstance);
+ });
+
it('should re-render the template instance when changing a parent property', async () => {
const host = fixtureSync(``);
const component = host.$.component;