diff --git a/components-chromium/polymer/lib/elements/custom-style.js b/components-chromium/polymer/lib/elements/custom-style.js
index e0d2021372554..c667b6ee83a03 100644
--- a/components-chromium/polymer/lib/elements/custom-style.js
+++ b/components-chromium/polymer/lib/elements/custom-style.js
@@ -7,14 +7,11 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
 Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 */
-import '../../../shadycss/entrypoints/custom-style-interface.js';
 
 import { cssFromModules } from '../utils/style-gather.js';
 
 const attr = 'include';
 
-const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
-
 /**
  * Custom element for defining styles in the main document that can take
  * advantage of [shady DOM](https://github.com/webcomponents/shadycss) shims
@@ -65,7 +62,6 @@ export class CustomStyle extends HTMLElement {
   constructor() {
     super();
     this._style = null;
-    CustomStyleInterface.addCustomStyle(this);
   }
   /**
    * Returns the light-DOM `<style>` child this element wraps.  Upon first
diff --git a/components-chromium/polymer/lib/legacy/legacy-element-mixin.js b/components-chromium/polymer/lib/legacy/legacy-element-mixin.js
index de150da342ee9..8815c83a70cca 100644
--- a/components-chromium/polymer/lib/legacy/legacy-element-mixin.js
+++ b/components-chromium/polymer/lib/legacy/legacy-element-mixin.js
@@ -7,10 +7,8 @@ The complete set of contributors may be found at http://polymer.github.io/CONTRI
 Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 */
-import '../../../shadycss/entrypoints/apply-shim.js';
 import { ElementMixin, builtCSS } from '../mixins/element-mixin.js';
 import { GestureEventListeners } from '../mixins/gesture-event-listeners.js';
-import { DirMixin } from '../mixins/dir-mixin.js';
 import { dedupingMixin } from '../utils/mixin.js';
 import '../utils/render-status.js';
 import '../utils/unresolved.js';
@@ -39,7 +37,6 @@ let styleInterface = window.ShadyCSS;
  * @polymer
  * @appliesMixin ElementMixin
  * @appliesMixin GestureEventListeners
- * @appliesMixin DirMixin
  * @property isAttached {boolean} Set to `true` in this element's
  *   `connectedCallback` and `false` in `disconnectedCallback`
  * @summary Element class mixin that provides Polymer's "legacy" API
@@ -52,7 +49,6 @@ export const LegacyElementMixin = dedupingMixin((base) => {
    * @constructor
    * @implements {Polymer_ElementMixin}
    * @implements {Polymer_GestureEventListeners}
-   * @implements {Polymer_DirMixin}
    * @extends {HTMLElement}
    * @private
    */
@@ -66,8 +62,7 @@ export const LegacyElementMixin = dedupingMixin((base) => {
    * @extends {GesturesElement}
    * @private
    */
-  const legacyElementBase = builtCSS ? GesturesElement :
-    DirMixin(GesturesElement);
+  const legacyElementBase = GesturesElement;
 
   const observedAttributesGetter = findObservedAttributesGetter(legacyElementBase);
 
diff --git a/components-chromium/polymer/lib/mixins/element-mixin.js b/components-chromium/polymer/lib/mixins/element-mixin.js
index cba8953ab51bb..76b86681be72a 100644
--- a/components-chromium/polymer/lib/mixins/element-mixin.js
+++ b/components-chromium/polymer/lib/mixins/element-mixin.js
@@ -739,13 +739,13 @@ export const ElementMixin = dedupingMixin(base => {
         if (dom) {
           if (!n.shadowRoot) {
             n.attachShadow({mode: 'open', shadyUpgradeFragment: dom});
-            n.shadowRoot.appendChild(dom);
             // When `adoptedStyleSheets` is supported a stylesheet is made
             // available on the element constructor.
             if (this.constructor._styleSheet) {
               n.shadowRoot.adoptedStyleSheets = [this.constructor._styleSheet];
             }
           }
+          n.shadowRoot.appendChild(dom);
           if (syncInitialRender && window.ShadyDOM) {
             window.ShadyDOM.flushInitial(n.shadowRoot);
           }
@@ -783,8 +783,9 @@ export const ElementMixin = dedupingMixin(base => {
      * @suppress {invalidCasts}
      */
     updateStyles(properties) {
-      if (window.ShadyCSS) {
-        window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(this), properties);
+      // Chromium modification to use native API instead of relying on ShadyCSS.
+      for (const [name, value] of Object.entries(properties)) {
+        this.style.setProperty(name, value);
       }
     }
 
diff --git a/components-chromium/polymer/lib/mixins/template-stamp.js b/components-chromium/polymer/lib/mixins/template-stamp.js
index 19938efe0b622..0537e0b3b9884 100644
--- a/components-chromium/polymer/lib/mixins/template-stamp.js
+++ b/components-chromium/polymer/lib/mixins/template-stamp.js
@@ -299,9 +299,7 @@ export const TemplateStamp = dedupingMixin(
         let /** ? */ templateInfo = template._templateInfo = {};
         templateInfo.nodeInfoList = [];
         templateInfo.nestedTemplate = Boolean(outerTemplateInfo);
-        templateInfo.stripWhiteSpace =
-          (outerTemplateInfo && outerTemplateInfo.stripWhiteSpace) ||
-          (template.hasAttribute && template.hasAttribute('strip-whitespace'));
+        templateInfo.stripWhiteSpace = true
          // TODO(rictic): fix typing
          this._parseTemplateContent(
              template, templateInfo, /** @type {?} */ ({parent: null}));
diff --git a/components-chromium/polymer/lib/utils/settings.js b/components-chromium/polymer/lib/utils/settings.js
index ee70d3c14b0c2..265940bf4c6c8 100644
--- a/components-chromium/polymer/lib/utils/settings.js
+++ b/components-chromium/polymer/lib/utils/settings.js
@@ -173,8 +173,8 @@ export const setLegacyOptimizations = function(useLegacyOptimizations) {
 /**
  * Setting to add warnings useful when migrating from Polymer 1.x to 2.x.
  */
-export let legacyWarnings =
-  window.Polymer && window.Polymer.legacyWarnings || false;
+// Turn off option for Chromium.
+export const legacyWarnings = false;
 
 /**
  * Sets `legacyWarnings` globally for all elements to migration warnings.
@@ -190,8 +190,8 @@ export const setLegacyWarnings = function(useLegacyWarnings) {
  * Setting to perform initial rendering synchronously when running under ShadyDOM.
  * This matches the behavior of Polymer 1.
  */
-export let syncInitialRender =
-  window.Polymer && window.Polymer.syncInitialRender || false;
+// Turn off option for Chromium.
+export const syncInitialRender = false;
 
 /**
  * Sets `syncInitialRender` globally for all elements to enable synchronous
@@ -210,8 +210,8 @@ export const setSyncInitialRender = function(useSyncInitialRender) {
  * observers around undefined values. Observers and computed property methods
  * are not called until no argument is undefined.
  */
-export let legacyUndefined =
-  window.Polymer && window.Polymer.legacyUndefined || false;
+// Turn off option for Chromium.
+export const legacyUndefined = false;
 
 /**
  * Sets `legacyUndefined` globally for all elements to enable legacy
@@ -267,8 +267,8 @@ export const setCancelSyntheticClickEvents = function(useCancelSyntheticClickEve
  * eliminates most of the tax of needing two elements due to the loss of
  * type-extended templates as a result of the V1 specification changes.
  */
-export let removeNestedTemplates =
-  window.Polymer && window.Polymer.removeNestedTemplates || false;
+// Turn off option for Chromium.
+export const removeNestedTemplates = false;
 
 /**
  * Sets `removeNestedTemplates` globally, to eliminate nested templates
@@ -290,7 +290,8 @@ export const setRemoveNestedTemplates = function(useRemoveNestedTemplates) {
  * such as `modelForElement` will not be available for nodes stamped by
  * `dom-if`.
  */
-export let fastDomIf = window.Polymer && window.Polymer.fastDomIf || false;
+// Turn off option for Chromium.
+export const fastDomIf = false;
 
 /**
  * Sets `fastDomIf` globally, to put `dom-if` in a performance-optimized mode.
@@ -308,8 +309,8 @@ export const setFastDomIf = function(useFastDomIf) {
  * setting the `notify-dom-change` attribute (`notifyDomChange: true` property)
  * to `dom-if`/`don-repeat` instances.
  */
-export let suppressTemplateNotifications =
-  window.Polymer && window.Polymer.suppressTemplateNotifications || false;
+// Turn off option for Chromium.
+export const suppressTemplateNotifications = false;
 
 /**
  * Sets `suppressTemplateNotifications` globally, to disable `dom-change` and
@@ -327,8 +328,8 @@ export const setSuppressTemplateNotifications = function(suppress) {
  * to avoid setting `observedAttributes`. Instead attributes are read
  * once at create time and set/removeAttribute are patched.
  */
-export let legacyNoObservedAttributes =
-  window.Polymer && window.Polymer.legacyNoObservedAttributes || false;
+// Turn off option for Chromium.
+export const legacyNoObservedAttributes = false;
 
 /**
  * Sets `legacyNoObservedAttributes` globally, to disable `observedAttributes`.
@@ -345,8 +346,8 @@ export const setLegacyNoObservedAttributes = function(noObservedAttributes) {
  * between component instances' shadow roots, if the app uses built Shady CSS
  * styles.
  */
-export let useAdoptedStyleSheetsWithBuiltCSS =
-  window.Polymer && window.Polymer.useAdoptedStyleSheetsWithBuiltCSS || false;
+// Turn off option for Chromium.
+export const useAdoptedStyleSheetsWithBuiltCSS = false;
 
 /**
  * Sets `useAdoptedStyleSheetsWithBuiltCSS` globally.

diff --git a/components-chromium/polymer/lib/elements/dom-if.js b/components-chromium/polymer/lib/elements/dom-if.js
index 729833a32cc42..87b863a5cf342 100644
--- a/components-chromium/polymer/lib/elements/dom-if.js
+++ b/components-chromium/polymer/lib/elements/dom-if.js
@@ -53,6 +53,14 @@ class DomIfBase extends PolymerElement {
         observer: '__debounceRender'
       },
 
+      /**
+       * When true, elements are updated when they are hidden due to the "if"
+       * condition being false.
+       */
+      updateWhenFalse: {
+        type: Boolean
+      },
+
       /**
        * When true, elements will be removed from DOM and discarded when `if`
        * becomes false and re-created and added back to the DOM when `if`
@@ -551,7 +559,7 @@ class DomIfLegacy extends DomIfBase {
              */
             forwardHostProp: function(prop, value) {
               if (this.__instance) {
-                if (this.if) {
+                if (this.if || this.updateWhenFalse) {
                   this.__instance.forwardHostProp(prop, value);
                 } else {
                   // If we have an instance but are squelching host property
