Merge branch 'release-candidate' into stable
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b5013b..614677b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,220 @@
+# 57.0.0
+
+In this release we have added the List component, made accessibility improvements to Bottom Sheet, added Shapes support for Chips and Bottom Sheet, made Catalog visual improvements, and other bug fixes.
+
+## Breaking changes
+
+### TextFields
+
+We have removed property `backgroundColor` from `MDCTextInputControllerBase` and properties `backgroundColor` and `backgroundColorDefault` from `MDCTextInputController`. The reason for removal was due to these properties not being used by the controller in any meaningful way, and therefore this should not produce any changes.
+
+## New features
+
+### BottomSheet
+
+VoiceOver and switch device users currently have to use the accessibility escape gesture to dismiss a Bottom Sheet. Optionally, the BottomSheet can use
+the dimmed "scrim" area (which can be tappable) to dismiss the bottom sheet using accessibility technologies.
+
+As an example of how this could be used by clients, here's how our AppDelegate would change to support a VoiceOver button for dismissal:
+```swift
+let menuViewController = MDCMenuViewController(style: .plain)
+let bottomSheet = MDCBottomSheetController(contentViewController: menuViewController)
+bottomSheet.dismissOnBackgroundTap = true
+bottomSheet.isScrimAccessibilityElement = true
+bottomSheet.scrimAccessibilityLabel = "Close"
+self.present(bottomSheet, animated: true, completion: nil)
+```
+
+### Cards
+
+You can now set the car to be interactable or not. Our specification for cards explicitly define a card as being an interactable component.
+Therefore, the interactable property should be set to NO *only if* there are other interactable items within the card's content, such as buttons or other tappable controls.
+To set the interactability to no in your cards:
+```swift
+let card = MDCCard()
+card.isInteractable = false
+
+let cardCell = MDCCardCollectionCell()
+cardCell.isInteractable = false
+```
+
+### List
+
+We now have a new component, List! See more information about the component here: https://github.com/material-components/material-components-ios/tree/develop/components/List
+
+## API changes
+
+### BottomSheet
+
+#### MDCBottomSheetTransitionController(ScrimAccessibility)
+
+*new* category: `MDCBottomSheetTransitionController(ScrimAccessibility)`
+
+*new* property: `isScrimAccessibilityElement` in `MDCBottomSheetTransitionController(ScrimAccessibility)`
+
+*new* property: `scrimAccessibilityLabel` in `MDCBottomSheetTransitionController(ScrimAccessibility)`
+
+*new* property: `scrimAccessibilityHint` in `MDCBottomSheetTransitionController(ScrimAccessibility)`
+
+*new* property: `scrimAccessibilityTraits` in `MDCBottomSheetTransitionController(ScrimAccessibility)`
+
+#### MDCBottomSheetController
+
+*new* property: `scrimAccessibilityHint` in `MDCBottomSheetController`
+
+*new* property: `isScrimAccessibilityElement` in `MDCBottomSheetController`
+
+*new* property: `state` in `MDCBottomSheetController`
+
+*new* method: `-shapeGeneratorForState:` in `MDCBottomSheetController`
+
+*new* property: `scrimAccessibilityLabel` in `MDCBottomSheetController`
+
+*new* method: `-setShapeGenerator:forState:` in `MDCBottomSheetController`
+
+*new* property: `scrimAccessibilityTraits` in `MDCBottomSheetController`
+
+#### MDCSheetState
+
+*new* enum: `MDCSheetState` with values `MDCSheetStateExtended`, `MDCSheetStatePreferred`, and `MDCSheetStateClosed`
+
+#### MDCBottomSheetPresentationControllerDelegate
+
+*new* method: `-bottomSheetWillChangeState:sheetState:` in `MDCBottomSheetPresentationControllerDelegate`
+
+#### MDCBottomSheetPresentationController
+
+*new* property: `scrimAccessibilityLabel` in `MDCBottomSheetPresentationController`
+
+*new* property: `isScrimAccessibilityElement` in `MDCBottomSheetPresentationController`
+
+*new* property: `scrimAccessibilityTraits` in `MDCBottomSheetPresentationController`
+
+*new* property: `scrimAccessibilityHint` in `MDCBottomSheetPresentationController`
+
+### Cards
+
+#### MDCCardCollectionCell
+
+*new* property: `interactable` in `MDCCardCollectionCell`
+
+#### MDCCard
+
+*new* property: `interactable` in `MDCCard`
+
+### List
+
+**New component.**
+
+### TextFields
+
+#### MDCTextInputControllerFullWidth
+
+*new* property: `backgroundColor` in `MDCTextInputControllerFullWidth`
+
+*new* property: `backgroundColorDefault` in `MDCTextInputControllerFullWidth`
+
+#### MDCTextInputControllerBase
+
+*removed* property: `backgroundColor` in `MDCTextInputControllerBase`
+
+#### MDCTextInputController
+
+*new* property: `textInputClearButtonTintColorDefault` in `MDCTextInputController`
+
+*new* property: `textInputClearButtonTintColor` in `MDCTextInputController`
+
+*removed* property: `backgroundColorDefault` in `MDCTextInputController`
+
+*removed* property: `backgroundColor` in `MDCTextInputController`
+
+### Typography
+
+#### UIFont(MaterialSimpleEquality)
+
+*new* method: `-mdc_isSimplyEqual:` in `UIFont(MaterialSimpleEquality)`
+
+*new* category: `UIFont(MaterialSimpleEquality)`
+
+## Component changes
+
+### Tabs
+
+#### Changes
+
+* [ Fix alerts in examples (#4480)](https://github.com/material-components/material-components-ios/commit/cb08164a8d29642619c4578e9552856ae82a3cc4) (Robert Moore)
+
+### FeatureHighlight
+
+#### Changes
+
+* [Add swift example (#4439)](https://github.com/material-components/material-components-ios/commit/7e71bb0079ae77046eae5fdb6460c8dd6792f7ec) (Cody Weaver)
+
+### Buttons
+
+#### Changes
+
+* [[Catalog] Fix VoiceOver ordering in Buttons demo (#4482)](https://github.com/material-components/material-components-ios/commit/7a1c3ced310c214fce431a78632d4b0ecadc8540) (Robert Moore)
+
+### TextFields
+
+#### Changes
+
+* [Fix clearIcon drawing (#4450)](https://github.com/material-components/material-components-ios/commit/2abcf53b9dc18a0f469fa7a0b35d9e24b38a6b74) (Robert Moore)
+* [Make MDCTextField accessibilityValue include only placeholder or [super accessibilityValue], not both (#4460)](https://github.com/material-components/material-components-ios/commit/c0124aa9fe7b20aec23e54530d29ab645036cdc4) (Andrew Overton)
+* [Migrate textInputClearButtonTintColor to MDCTextInputController, tests (#4465)](https://github.com/material-components/material-components-ios/commit/528f46323fb7f7ab5a16ac306da0ee71c2f548c7) (Michelle Dudley)
+* [Support clear button tint color (#4449)](https://github.com/material-components/material-components-ios/commit/8835a412a271026b8e4a9d0ed155b266b1840f83) (Robert Moore)
+* [[Typography] 3rd PR on font equality (#4435)](https://github.com/material-components/material-components-ios/commit/53876c3dca2e5bcb07d6e8f1ef91fc5bb202835c) (Will Larche)
+* [{BreakingChange} Remove unused `backgroundColor` property (#4452)](https://github.com/material-components/material-components-ios/commit/55eead6f1668095b73833d7652839757682a4fa2) (Robert Moore)
+
+### Chips
+
+#### Changes
+
+* [Fix Choice demo (#4473)](https://github.com/material-components/material-components-ios/commit/63970a2b1fd6a759b5d38b96e57e21361350ebe9) (Robert Moore)
+* [chips shape support fix + example (#4474)](https://github.com/material-components/material-components-ios/commit/84e9f2334505b45be96ade7559400bbc50641218) (Yarden Eitan)
+
+### Cards
+
+#### Changes
+
+* [Added interactability toggle to Cards (#4404)](https://github.com/material-components/material-components-ios/commit/27a6c46fc3bd41f121d9c23b832f3297dafe2418) (Yarden Eitan)
+
+### List
+
+#### Changes
+
+* [[ListItems] Add Base Cell With Example (#4461)](https://github.com/material-components/material-components-ios/commit/4b6eb9430ce5d4bb061b633946df14152f79db51) (Andrew Overton)
+
+### BottomSheet
+
+#### Changes
+
+* [Dismiss BottomSheet with UIAccessibility (#4475)](https://github.com/material-components/material-components-ios/commit/031d797ecf188c9994701ab90aad3b31603b6a55) (Robert Moore)
+* [[Shapes] Added Shapes support for BottomSheet (#4486)](https://github.com/material-components/material-components-ios/commit/61e65488afd298bd78db2acb5f6bcda92b1f1b4d) (Yarden Eitan)
+
+### Typography
+
+#### Changes
+
+* [3rd PR on font equality (#4435)](https://github.com/material-components/material-components-ios/commit/53876c3dca2e5bcb07d6e8f1ef91fc5bb202835c) (Will Larche)
+
+### BottomNavigation
+
+#### Changes
+
+* [AccessibilityValue and Selected icon support (#4444)](https://github.com/material-components/material-components-ios/commit/684f96c9f38337f0c3fad531a58e53635d3839d1) (Cody Weaver)
+* [Test cases when we reset the bottom navigation items array (#4431)](https://github.com/material-components/material-components-ios/commit/c9fb2d91a4278d22da9151a8b49b546d6217e628) (Cody Weaver)
+* [[BottomNavigation, Math] Fix `BOOL` types (#4436)](https://github.com/material-components/material-components-ios/commit/f1bb92ee921050fddb0eaf80f07b0d09a28ef09e) (Robert Moore)
+
+### FlexibleHeader
+
+#### Changes
+
+* [Fix odd scrolling bugs in voiceover (#4485)](https://github.com/material-components/material-components-ios/commit/5dc67c88c06f11761769de1d0bae34ff2c657046) (John Detloff)
+
+---
+
 # 56.0.0
 
 In this release we updated the icon layout of `MDCTextField`s add accessibilty docs for `MDCButton`
diff --git a/CODEOWNERS b/CODEOWNERS
index 7a55d49..581c87b 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -24,7 +24,7 @@
 /components/CollectionLayoutAttributes/ @ianegordon
 /components/Collections/          @ianegordon
 /components/Dialogs/              @ianegordon
-# /components/FeatureHighlight/     No owner
+/components/FeatureHighlight/     @codeman7
 /components/FlexibleHeader/       @jverkoey
 /components/HeaderStackView/      @jverkoey
 /components/Ink/                  @yarneo
@@ -40,6 +40,6 @@
 /components/Slider/               @romoore
 /components/Snackbar/             @yarneo
 /components/Tabs/                 @brianjmoore
-# /components/TextFields/           No owner
+/components/TextFields/           @andrewoverton
 /components/Themes/               @featherless
 /components/Typography/           @ianegordon
diff --git a/MaterialComponents.podspec b/MaterialComponents.podspec
index 5f02949..4e3fb44 100644
--- a/MaterialComponents.podspec
+++ b/MaterialComponents.podspec
@@ -2,7 +2,7 @@
 
 Pod::Spec.new do |mdc|
   mdc.name         = "MaterialComponents"
-  mdc.version      = "56.0.0"
+  mdc.version      = "57.0.0"
   mdc.authors      = "The Material Components authors."
   mdc.summary      = "A collection of stand-alone production-ready UI libraries focused on design details."
   mdc.homepage     = "https://github.com/material-components/material-components-ios"
@@ -171,6 +171,8 @@
 
     component.dependency "MaterialComponents/private/KeyboardWatcher"
     component.dependency "MaterialComponents/private/Math"
+    component.dependency "MaterialComponents/private/ShapeLibrary"
+    component.dependency "MaterialComponents/private/Shapes"
   end
 
   # Buttons
@@ -535,6 +537,18 @@
     component.source_files = "components/#{component.base_name}/src/*.{h,m}", "components/#{component.base_name}/src/private/*.{h,m}"
   end
 
+  # List
+
+  mdc.subspec "List" do |component|
+    component.ios.deployment_target = '8.0'
+    component.public_header_files = "components/#{component.base_name}/src/*.h"
+    component.source_files = "components/#{component.base_name}/src/*.{h,m}", "components/#{component.base_name}/src/private/*.{h,m}"
+
+    component.dependency "MaterialComponents/Ink"
+    component.dependency "MaterialComponents/ShadowElevations"
+    component.dependency "MaterialComponents/ShadowLayer"
+  end
+
   # MaskedTransition
 
   mdc.subspec "MaskedTransition" do |component|
@@ -827,6 +841,7 @@
     component.source_files = "components/#{component.base_name}/src/*.{h,m}", "components/#{component.base_name}/src/private/*.{h,m}"
 
     component.dependency "MaterialComponents/private/Application"
+    component.dependency "MaterialComponents/private/Math"
   end
 
   mdc.subspec "schemes" do |scheme_spec|
diff --git a/MaterialComponentsEarlGreyTests.podspec b/MaterialComponentsEarlGreyTests.podspec
index 154b6af..bc3abe7 100644
--- a/MaterialComponentsEarlGreyTests.podspec
+++ b/MaterialComponentsEarlGreyTests.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "MaterialComponentsEarlGreyTests"
-  s.version      = "56.0.0"
+  s.version      = "57.0.0"
   s.authors      = "The Material Components authors."
   s.summary      = "This spec is an aggregate of all the Material Components EarlGrey tests."
   s.description  = "This spec is made for use in the MDC Catalog."
diff --git a/MaterialComponentsExamples.podspec b/MaterialComponentsExamples.podspec
index 9645aec..27bb525 100644
--- a/MaterialComponentsExamples.podspec
+++ b/MaterialComponentsExamples.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "MaterialComponentsExamples"
-  s.version      = "56.0.0"
+  s.version      = "57.0.0"
   s.authors      = "The Material Components authors."
   s.summary      = "This spec is an aggregate of all the Material Components examples."
   s.description  = "This spec is made for use in the MDC Catalog. Used in conjunction with CatalogByConvention we create our Material Catalog."
diff --git a/MaterialComponentsUnitTests.podspec b/MaterialComponentsUnitTests.podspec
index 3f478ef..6f7f301 100644
--- a/MaterialComponentsUnitTests.podspec
+++ b/MaterialComponentsUnitTests.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "MaterialComponentsUnitTests"
-  s.version      = "56.0.0"
+  s.version      = "57.0.0"
   s.authors      = "The Material Components authors."
   s.summary      = "This spec is an aggregate of all the Material Components unit tests."
   s.description  = "This spec is made for use in the MDC Catalog."
diff --git a/VERSION b/VERSION
index 293f11f..81168fd 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-56.0.0
+57.0.0
diff --git a/catalog/MDCCatalog.xcworkspace/xcshareddata/IDETemplateMacros.plist b/catalog/MDCCatalog.xcworkspace/xcshareddata/IDETemplateMacros.plist
new file mode 100644
index 0000000..855b52b
--- /dev/null
+++ b/catalog/MDCCatalog.xcworkspace/xcshareddata/IDETemplateMacros.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>FILEHEADER</key>
+	<string> Copyright ___YEAR___-present the Material Components for iOS authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.</string>
+</dict>
+</plist>
diff --git a/catalog/MDCCatalog/AppDelegate.swift b/catalog/MDCCatalog/AppDelegate.swift
index 6854322..23a7567 100644
--- a/catalog/MDCCatalog/AppDelegate.swift
+++ b/catalog/MDCCatalog/AppDelegate.swift
@@ -73,6 +73,7 @@
                                    target: self,
                                    action: #selector(presentMenu))
     menuItem.accessibilityLabel = "Menu"
+    menuItem.accessibilityHint = "Opens catalog configuration options."
     viewController.navigationItem.rightBarButtonItem = menuItem
   }
 
@@ -89,10 +90,10 @@
       appBarFont = UIFont(descriptor: descriptor, size: 16)
     }
     let container = MDCAppBarContainerViewController(contentViewController: viewController)
+    MDCAppBarColorThemer.applySemanticColorScheme(AppTheme.globalTheme.colorScheme,
+                                                  to: container.appBar);
     container.appBar.navigationBar.titleAlignment = .center
-    container.appBar.navigationBar.tintColor = UIColor.white
-    container.appBar.navigationBar.titleTextAttributes =
-      [ NSForegroundColorAttributeName: UIColor.white, NSFontAttributeName: appBarFont ]
+    container.appBar.navigationBar.titleTextAttributes = [ NSFontAttributeName: appBarFont ]
     MDCAppBarColorThemer.applySemanticColorScheme(AppTheme.globalTheme.colorScheme,
                                                   to: container.appBar)
     // TODO(featherless): Remove once
diff --git a/catalog/MDCCatalog/Info.plist b/catalog/MDCCatalog/Info.plist
index 1f95ce0..d9413a7 100644
--- a/catalog/MDCCatalog/Info.plist
+++ b/catalog/MDCCatalog/Info.plist
@@ -15,7 +15,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>56.0.0</string>
+	<string>57.0.0</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
diff --git a/catalog/MDCCatalog/MDCCatalogCollectionViewCell.swift b/catalog/MDCCatalog/MDCCatalogCollectionViewCell.swift
index 7c2bb5f..a1549e2 100644
--- a/catalog/MDCCatalog/MDCCatalogCollectionViewCell.swift
+++ b/catalog/MDCCatalog/MDCCatalogCollectionViewCell.swift
@@ -39,6 +39,8 @@
     contentView.addSubview(label)
     contentView.clipsToBounds = true
     contentView.addSubview(tile)
+    self.isAccessibilityElement = true
+    self.accessibilityTraits |= UIAccessibilityTraitButton
   }
 
   @available(*, unavailable)
@@ -77,4 +79,13 @@
     tile.componentName = componentName
     accessibilityIdentifier = componentName
   }
+
+  override public var accessibilityLabel: String? {
+    get {
+      return self.label.accessibilityLabel
+    }
+    set {
+      self.label.accessibilityLabel = newValue
+    }
+  }
 }
diff --git a/catalog/MDCCatalog/MDCCatalogComponentsController.swift b/catalog/MDCCatalog/MDCCatalogComponentsController.swift
index d8548a1..e245991 100644
--- a/catalog/MDCCatalog/MDCCatalogComponentsController.swift
+++ b/catalog/MDCCatalog/MDCCatalogComponentsController.swift
@@ -62,7 +62,8 @@
     let dotsImage = MDCIcons.imageFor_ic_more_horiz()?.withRenderingMode(.alwaysTemplate)
     button.setImage(dotsImage, for: .normal)
     button.adjustsImageWhenHighlighted = false
-    button.tintColor = .white
+    button.accessibilityLabel = "Menu"
+    button.accessibilityHint = "Opens catalog configuration options."
     return button
   }()
 
@@ -122,6 +123,8 @@
     MDCFlexibleHeaderColorThemer.applySemanticColorScheme(colorScheme,
                                                           to: headerViewController.headerView)
 
+    titleLabel.textColor = colorScheme.onPrimaryColor
+    menuButton.tintColor = colorScheme.onPrimaryColor
     collectionView?.collectionViewLayout.invalidateLayout()
     collectionView?.reloadData()
   }
@@ -174,7 +177,7 @@
     menuButton.addTarget(self.navigationController,
                          action: #selector(navigationController?.presentMenu),
                          for: .touchUpInside)
-
+    menuButton.tintColor = colorScheme.onPrimaryColor
     containerView.addSubview(menuButton)
 
     setupFlexibleHeaderContentConstraints()
diff --git a/catalog/MDCCatalog/MDCMenuViewController.swift b/catalog/MDCCatalog/MDCMenuViewController.swift
index 49b8848..5705314 100644
--- a/catalog/MDCCatalog/MDCMenuViewController.swift
+++ b/catalog/MDCCatalog/MDCMenuViewController.swift
@@ -23,13 +23,29 @@
 
 class MDCMenuViewController: UITableViewController {
 
-  let tableData =
-    [(title: "Settings", icon: MDCIcons.imageFor_ic_settings()?.withRenderingMode(.alwaysTemplate)),
-     (title: "Themes", icon: MDCIcons.imageFor_ic_color_lens()?.withRenderingMode(.alwaysTemplate)),
-     (title:  "v\(MDCLibraryInfo.versionString)",
-      icon: MDCIcons.imageFor_ic_help_outline()?.withRenderingMode(.alwaysTemplate))]
+  private struct MDCMenuItem {
+    let title: String!
+    let icon: UIImage?
+    let accessibilityLabel: String?
+    let accessibilityHint: String?
+    init(_ title: String, _ icon: UIImage?, _ accessibilityLabel: String?,
+         _ accessibilityHint: String?) {
+      self.title = title
+      self.icon = icon
+      self.accessibilityLabel = accessibilityLabel
+      self.accessibilityHint = accessibilityHint
+    }
+  }
+
+  private let tableData =
+    [MDCMenuItem("Settings", MDCIcons.imageFor_ic_settings()?.withRenderingMode(.alwaysTemplate),
+                 nil, "Opens debugging menu."),
+     MDCMenuItem("Themes", MDCIcons.imageFor_ic_color_lens()?.withRenderingMode(.alwaysTemplate),
+                  nil, "Opens color theme chooser."),
+     MDCMenuItem("v\(MDCLibraryInfo.versionString)",
+      MDCIcons.imageFor_ic_help_outline()?.withRenderingMode(.alwaysTemplate),
+      "Version \(MDCLibraryInfo.versionString)", "Closes this menu.")]
   let cellIdentifier = "MenuCell"
-  let iconColor = AppTheme.globalTheme.colorScheme.onSurfaceColor.withAlphaComponent(0.61)
 
   override func viewDidLoad() {
     super.viewDidLoad()
@@ -39,12 +55,15 @@
 
   override func tableView(_ tableView: UITableView,
                           cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+    let iconColor = AppTheme.globalTheme.colorScheme.onSurfaceColor.withAlphaComponent(0.61)
     let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
     let cellData = tableData[indexPath.item]
     cell.textLabel?.text = cellData.title
     cell.textLabel?.textColor = iconColor
     cell.imageView?.image = cellData.icon
     cell.imageView?.tintColor = iconColor
+    cell.accessibilityLabel = cellData.accessibilityLabel
+    cell.accessibilityHint = cellData.accessibilityHint
     return cell
   }
 
diff --git a/catalog/MDCCatalog/MDCNodeListViewController.swift b/catalog/MDCCatalog/MDCNodeListViewController.swift
index 509cc45..b76e8e6 100644
--- a/catalog/MDCCatalog/MDCNodeListViewController.swift
+++ b/catalog/MDCCatalog/MDCNodeListViewController.swift
@@ -272,8 +272,6 @@
 
   private func applyColorScheme(_ colorScheme: MDCColorScheming) {
     MDCAppBarColorThemer.applySemanticColorScheme(colorScheme, to: appBar)
-
-    appBar.navigationBar.tintColor = UIColor.white
   }
 
   func applyThemeToCurrentExample() {
@@ -631,6 +629,11 @@
     return cell!
   }
 
+  override func accessibilityPerformMagicTap() -> Bool {
+    primaryDemoButtonClicked()
+    return true
+  }
+
   func primaryDemoButtonClicked () {
     let indexPath = IndexPath(row: 0, section: Section.description.rawValue)
     self.tableView(self.tableView, didSelectRowAt: indexPath)
diff --git a/catalog/MDCCatalog/MDCThemePickerViewController.swift b/catalog/MDCCatalog/MDCThemePickerViewController.swift
index 44ac525..5f47701 100644
--- a/catalog/MDCCatalog/MDCThemePickerViewController.swift
+++ b/catalog/MDCCatalog/MDCThemePickerViewController.swift
@@ -14,6 +14,7 @@
  limitations under the License.
  */
 
+import MDFTextAccessibility
 import MaterialComponents.MaterialIcons_ic_check
 import MaterialComponents.MaterialPalettes
 import MaterialComponents.MaterialThemes
@@ -24,9 +25,37 @@
   scheme.primaryColor = palette.tint500
   scheme.primaryColorVariant = palette.tint900
   scheme.secondaryColor = scheme.primaryColor
+  if let onPrimaryColor = MDFTextAccessibility.textColor(fromChoices: [MDCPalette.grey.tint100,
+                                                                      MDCPalette.grey.tint900,
+                                                                      UIColor.black,
+                                                                      UIColor.white],
+                                                        onBackgroundColor: scheme.primaryColor,
+                                                        options: .preferLighter) {
+    scheme.onPrimaryColor = onPrimaryColor
+  }
+  if let onSecondaryColor = MDFTextAccessibility.textColor(fromChoices: [MDCPalette.grey.tint100,
+                                                                         MDCPalette.grey.tint900,
+                                                                         UIColor.black,
+                                                                         UIColor.white],
+                                                           onBackgroundColor: scheme.secondaryColor,
+                                                           options: .preferLighter) {
+    scheme.onSecondaryColor = onSecondaryColor
+  }
   return scheme
 }
 
+private struct MDCColorThemeCellConfiguration {
+  let name: String
+  let mainColor: UIColor
+  let colorScheme: () -> MDCColorScheming
+
+  init(name: String, mainColor: UIColor, colorScheme: @escaping () -> MDCColorScheming) {
+    self.name = name
+    self.mainColor = mainColor
+    self.colorScheme = colorScheme
+  }
+}
+
 class MDCThemePickerViewController: UIViewController, UICollectionViewDataSource,
   UICollectionViewDelegateFlowLayout {
 
@@ -36,37 +65,42 @@
   let titleColor = AppTheme.globalTheme.colorScheme.onSurfaceColor.withAlphaComponent(0.5)
   let titleFont = AppTheme.globalTheme.typographyScheme.button
   private let cellReuseIdentifier = "cell"
-  private let colorSchemeCells = [
-    (
-      mainColor: AppTheme.defaultTheme.colorScheme.primaryColor,
-      colorScheme: { return AppTheme.defaultTheme.colorScheme }
-    ),
-    (
-      mainColor: MDCPalette.blue.tint500,
-      colorScheme: { return createSchemeWithPalette(MDCPalette.blue) }
-    ),
-    (
-      mainColor: MDCPalette.red.tint500,
-      colorScheme: { return createSchemeWithPalette(MDCPalette.red) }
-    ),
-    (
-      mainColor: MDCPalette.green.tint500,
-      colorScheme: { return createSchemeWithPalette(MDCPalette.green) }
-    ),
-    (
-      mainColor: MDCPalette.amber.tint500,
-      colorScheme: { return createSchemeWithPalette(MDCPalette.amber) }
-    ),
-    (
-      mainColor: MDCPalette.pink.tint500,
-      colorScheme: { return createSchemeWithPalette(MDCPalette.pink) }
-    ),
-    (
-      mainColor: MDCPalette.orange.tint500,
-      colorScheme: { return createSchemeWithPalette(MDCPalette.orange) }
-    )
+  private let colorSchemeConfigurations = [
+    MDCColorThemeCellConfiguration(name: "Default",
+                                   mainColor: AppTheme.defaultTheme.colorScheme.primaryColor,
+                                   colorScheme: { return AppTheme.defaultTheme.colorScheme }),
+    MDCColorThemeCellConfiguration(name: "Blue",
+                                   mainColor: MDCPalette.blue.tint500,
+                                   colorScheme: {
+                                    return createSchemeWithPalette(MDCPalette.blue)
+    }),
+    MDCColorThemeCellConfiguration(name: "Red",
+                                   mainColor: MDCPalette.red.tint500,
+                                   colorScheme: {
+                                    return createSchemeWithPalette(MDCPalette.red)
+    }),
+    MDCColorThemeCellConfiguration(name: "Green",
+                                   mainColor: MDCPalette.green.tint500,
+                                   colorScheme: {
+                                    return createSchemeWithPalette(MDCPalette.green)
+    }),
+    MDCColorThemeCellConfiguration(name: "Amber",
+                                   mainColor: MDCPalette.amber.tint500,
+                                   colorScheme: {
+                                    return createSchemeWithPalette(MDCPalette.amber)
+    }),
+    MDCColorThemeCellConfiguration(name: "Pink",
+                                   mainColor: MDCPalette.pink.tint500,
+                                   colorScheme: {
+                                    return createSchemeWithPalette(MDCPalette.pink)
+    }),
+    MDCColorThemeCellConfiguration(name: "Orange",
+                                   mainColor: MDCPalette.orange.tint500,
+                                   colorScheme: {
+                                    return createSchemeWithPalette(MDCPalette.orange)
+    })
   ]
-  private let cellSize : CGFloat = 33.0
+  private let cellSize : CGFloat = 48.0 // minimum touch target
   private let cellSpacing : CGFloat = 8.0
 
   override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
@@ -80,7 +114,7 @@
   override func viewDidLoad() {
     super.viewDidLoad()
 
-    paletteTitle.text = "Material Palette"
+    paletteTitle.text = "Material Palette-based themes"
     paletteTitle.font = titleFont
     paletteTitle.textColor = titleColor
     paletteTitle.translatesAutoresizingMaskIntoConstraints = false
@@ -108,6 +142,10 @@
     palettesCollectionView.backgroundColor = .white
     palettesCollectionView.contentInset = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0)
     view.addSubview(palettesCollectionView)
+    let rowWidth = view.bounds.width - cellSpacing * 2
+    let cellsPerRow = floor(rowWidth / (cellSize + cellSpacing))
+    let numberOfCells = CGFloat(colorSchemeConfigurations.count)
+    let numberOfRows = ceil(numberOfCells / cellsPerRow)
     view.addConstraint(NSLayoutConstraint(item: palettesCollectionView,
                                           attribute: .left,
                                           relatedBy: .equal,
@@ -135,7 +173,7 @@
                                           toItem: nil,
                                           attribute: .notAnAttribute,
                                           multiplier: 1,
-                                          constant: cellSize + (cellSpacing * 2)))
+                                          constant: numberOfRows * (cellSize + (cellSpacing * 2))))
     view.backgroundColor = .white
   }
 
@@ -143,17 +181,22 @@
                       cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellReuseIdentifier,
                                                   for: indexPath) as! PaletteCell
-    cell.contentView.backgroundColor = colorSchemeCells[indexPath.item].mainColor
+    cell.contentView.backgroundColor = colorSchemeConfigurations[indexPath.item].mainColor
     cell.contentView.layer.cornerRadius = cellSize / 2
     cell.contentView.layer.borderWidth = 1
     cell.contentView.layer.borderColor =
       AppTheme.globalTheme.colorScheme.onSurfaceColor.withAlphaComponent(0.05).cgColor
     if AppTheme.globalTheme.colorScheme.primaryColor
-      == colorSchemeCells[indexPath.item].mainColor {
+      == colorSchemeConfigurations[indexPath.item].mainColor {
       cell.imageView.isHidden = false
+      cell.isSelected = true
     } else {
       cell.imageView.isHidden = true
+      cell.isSelected = false
     }
+    cell.isAccessibilityElement = true
+    cell.accessibilityLabel = colorSchemeConfigurations[indexPath.row].name
+    cell.accessibilityHint = "Changes the catalog color theme."
     return cell
   }
 
@@ -190,13 +233,13 @@
 
   func collectionView(_ collectionView: UICollectionView,
                       numberOfItemsInSection section: Int) -> Int {
-    return colorSchemeCells.count
+    return colorSchemeConfigurations.count
   }
 
   func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
-    let colorScheme = colorSchemeCells[indexPath.item].colorScheme
+    let colorScheme = colorSchemeConfigurations[indexPath.item].colorScheme()
     navigationController?.popViewController(animated: true)
-    AppTheme.globalTheme = AppTheme(colorScheme: colorScheme(),
+    AppTheme.globalTheme = AppTheme(colorScheme: colorScheme,
                                     typographyScheme: AppTheme.globalTheme.typographyScheme)
   }
 
diff --git a/catalog/MaterialCatalog/MaterialCatalog.podspec b/catalog/MaterialCatalog/MaterialCatalog.podspec
index 8b67d67..39cdae7 100644
--- a/catalog/MaterialCatalog/MaterialCatalog.podspec
+++ b/catalog/MaterialCatalog/MaterialCatalog.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "MaterialCatalog"
-  s.version      = "56.0.0"
+  s.version      = "57.0.0"
   s.summary      = "Helper Objective-C classes for the MDC catalog."
   s.description  = "This spec is made for use in the MDC Catalog."
   s.homepage     = "https://github.com/material-components/material-components-ios"
diff --git a/components/BottomNavigation/examples/BottomNavigationResetButtons.swift b/components/BottomNavigation/examples/BottomNavigationResetButtons.swift
new file mode 100644
index 0000000..82ebeca
--- /dev/null
+++ b/components/BottomNavigation/examples/BottomNavigationResetButtons.swift
@@ -0,0 +1,131 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import Foundation
+import MaterialComponents
+
+/// Example to showcase a reorder of the tabs from an user action
+class BottomNavigationResetExample: UIViewController {
+
+  var colorScheme = MDCSemanticColorScheme()
+  var typographyScheme = MDCTypographyScheme()
+
+  let bottomNavBar = MDCBottomNavigationBar()
+
+  // The tabs that will be reordered later
+  let tabBarItem1 = UITabBarItem(title: "Home", image: UIImage(named: "Home"), tag: 0)
+  let tabBarItem2 =
+    UITabBarItem(title: "Messages", image: UIImage(named: "Email"), tag: 1)
+  let tabBarItem3 =
+    UITabBarItem(title: "Favorites", image: UIImage(named: "Favorite"), tag: 2)
+  let tabBarItem4 = UITabBarItem(title: "Cake", image: UIImage(named: "Cake"), tag: 3)
+
+  let buttonOne = MDCButton()
+  let buttonTwo = MDCButton()
+
+  init() {
+    super.init(nibName: nil, bundle: nil)
+  }
+
+  @available(*, unavailable)
+  required init?(coder aDecoder: NSCoder) {
+    super.init(coder: aDecoder)
+  }
+
+  func layoutBottomNavBar() {
+    let size = bottomNavBar.sizeThatFits(view.bounds.size)
+    let bottomNavBarFrame = CGRect(x: 0,
+                                   y: view.bounds.height - size.height,
+                                   width: size.width,
+                                   height: size.height)
+    bottomNavBar.frame = bottomNavBarFrame
+  }
+
+  override func viewWillLayoutSubviews() {
+    super.viewWillLayoutSubviews()
+    layoutBottomNavBar()
+  }
+
+  #if swift(>=3.2)
+  @available(iOS 11, *)
+  override func viewSafeAreaInsetsDidChange() {
+    super.viewSafeAreaInsetsDidChange()
+    layoutBottomNavBar()
+  }
+  #endif
+
+  override func viewDidLoad() {
+    super.viewDidLoad()
+    view.backgroundColor = colorScheme.backgroundColor
+    view.addSubview(bottomNavBar)
+
+    bottomNavBar.alignment = .centered
+
+    // Add items to the bottom navigation bar.
+    bottomNavBar.items = [ tabBarItem1, tabBarItem2, tabBarItem3 ]
+
+    // Select a bottom navigation bar item.
+    bottomNavBar.selectedItem = tabBarItem2
+
+    // Layout buttons
+    buttonOne.setTitle("Reorder One", for: .normal)
+    buttonOne.sizeToFit()
+    buttonOne.frame.origin = CGPoint(x: view.center.x - (buttonOne.frame.width / 2),
+                                     y: view.center.y - (buttonOne.frame.height + 16))
+    buttonOne.addTarget(self, action: #selector(reorderItems), for: .touchUpInside)
+    view.addSubview(buttonOne)
+
+    buttonTwo.setTitle("Reorder Two", for: .normal)
+    buttonTwo.sizeToFit()
+    buttonTwo.frame.origin = CGPoint(x: view.center.x - (buttonTwo.frame.width / 2),
+                                      y: view.center.y + 16)
+    buttonTwo.addTarget(self, action: #selector(reorderItemsAndSetSelected), for: .touchUpInside)
+    view.addSubview(buttonTwo)
+
+    MDCBottomNavigationBarColorThemer.applySemanticColorScheme(colorScheme,
+                                                               toBottomNavigation: bottomNavBar)
+    MDCBottomNavigationBarTypographyThemer.applyTypographyScheme(typographyScheme,
+                                                                 to: bottomNavBar)
+  }
+
+  @objc func reorderItems(_ button: UIButton) {
+    bottomNavBar.items = [tabBarItem2, tabBarItem3, tabBarItem1]
+  }
+
+  @objc func reorderItemsAndSetSelected(_ button: UIButton) {
+    bottomNavBar.items = [tabBarItem3, tabBarItem1, tabBarItem2, tabBarItem4]
+    bottomNavBar.selectedItem = tabBarItem3
+  }
+}
+
+// MARK: Catalog by convention
+extension BottomNavigationResetExample {
+  class func catalogBreadcrumbs() -> [String] {
+    return ["Bottom Navigation", "Bottom Navigation Reorder (Swift)"]
+  }
+
+  class func catalogIsPrimaryDemo() -> Bool {
+    return false
+  }
+
+  @objc class func catalogIsPresentable() -> Bool {
+    return false
+  }
+
+  class func catalogShouldHideNavigation() -> Bool {
+    return true
+  }
+}
diff --git a/components/BottomNavigation/examples/BottomNavigationSelectedIconExample.swift b/components/BottomNavigation/examples/BottomNavigationSelectedIconExample.swift
new file mode 100644
index 0000000..e894009
--- /dev/null
+++ b/components/BottomNavigation/examples/BottomNavigationSelectedIconExample.swift
@@ -0,0 +1,77 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import Foundation
+import MaterialComponents
+
+// Example to show different icons for selected and unselected states
+class BottomNavigationSelectedIconExample: UIViewController {
+  var colorScheme = MDCSemanticColorScheme()
+  var typographyScheme = MDCTypographyScheme()
+
+  let bottomNavBar = MDCBottomNavigationBar()
+
+  override func viewDidLoad() {
+    colorScheme.backgroundColor = .white
+    view.backgroundColor = colorScheme.backgroundColor
+
+    let tabBarItem1 = UITabBarItem(title: "Home", image: UIImage(named: "Home"), tag: 0)
+    let tabBarItem2 = UITabBarItem(title: "Messages", image: UIImage(named: "Email"), tag: 1)
+    tabBarItem2.selectedImage = nil
+    let tabBarItem3 = UITabBarItem(title: "Favorites", image: UIImage(named: "Cake"), tag: 2)
+    tabBarItem3.selectedImage = UIImage(named: "Favorite")
+    bottomNavBar.items = [ tabBarItem1, tabBarItem2, tabBarItem3 ]
+    bottomNavBar.selectedItem = tabBarItem1
+    view.addSubview(bottomNavBar)
+
+    MDCBottomNavigationBarColorThemer.applySemanticColorScheme(colorScheme,
+                                                               toBottomNavigation: bottomNavBar)
+  }
+
+  func layoutBottomNavBar() {
+    let size = bottomNavBar.sizeThatFits(view.bounds.size)
+    let bottomNavBarFrame = CGRect(x: 0,
+                                   y: view.bounds.height - size.height,
+                                   width: size.width,
+                                   height: size.height)
+    bottomNavBar.frame = bottomNavBarFrame
+  }
+
+  override func viewWillLayoutSubviews() {
+    super.viewWillLayoutSubviews()
+    layoutBottomNavBar()
+  }
+
+  #if swift(>=3.2)
+  @available(iOS 11, *)
+  override func viewSafeAreaInsetsDidChange() {
+    super.viewSafeAreaInsetsDidChange()
+    layoutBottomNavBar()
+  }
+  #endif
+}
+
+
+// MARK: - Catalog by Conventions
+extension BottomNavigationSelectedIconExample {
+  class func catalogBreadcrumbs() -> [String] {
+    return ["Bottom Navigation", "Bottom Navigation Selected"]
+  }
+
+  class func catalogIsPrimaryDemo() -> Bool {
+    return false
+  }
+}
diff --git a/components/BottomNavigation/src/MDCBottomNavigationBar.m b/components/BottomNavigation/src/MDCBottomNavigationBar.m
index 4358a78..05ac530 100644
--- a/components/BottomNavigation/src/MDCBottomNavigationBar.m
+++ b/components/BottomNavigation/src/MDCBottomNavigationBar.m
@@ -55,11 +55,18 @@
 static const CGFloat kMDCBottomNavigationBarLandscapeContainerWidth = 320.f;
 static NSString *const kMDCBottomNavigationBarBadgeColorString = @"badgeColor";
 static NSString *const kMDCBottomNavigationBarBadgeValueString = @"badgeValue";
+static NSString *const kMDCBottomNavigationBarAccessibilityValueString =
+    @"accessibilityValue";
 static NSString *const kMDCBottomNavigationBarImageString = @"image";
+static NSString *const kMDCBottomNavigationBarSelectedImageString = @"selectedImage";
+// TODO: - Change to NSKeyValueChangeNewKey
 static NSString *const kMDCBottomNavigationBarNewString = @"new";
-static NSString *const kMDCBottomNavigationBarOfString = @"of";
 static NSString *const kMDCBottomNavigationBarTitleString = @"title";
 
+
+static NSString *const kMDCBottomNavigationBarOfAnnouncement = @"of";
+
+
 @interface MDCBottomNavigationBar ()
 
 @property(nonatomic, assign) BOOL itemsDistributed;
@@ -300,10 +307,18 @@
               options:NSKeyValueObservingOptionNew
               context:nil];
     [item addObserver:self
+           forKeyPath:kMDCBottomNavigationBarAccessibilityValueString
+              options:NSKeyValueObservingOptionNew
+              context:nil];
+    [item addObserver:self
            forKeyPath:kMDCBottomNavigationBarImageString
               options:NSKeyValueObservingOptionNew
               context:nil];
     [item addObserver:self
+           forKeyPath:kMDCBottomNavigationBarSelectedImageString
+              options:NSKeyValueObservingOptionNew
+              context:nil];
+    [item addObserver:self
            forKeyPath:kMDCBottomNavigationBarTitleString
               options:NSKeyValueObservingOptionNew
               context:nil];
@@ -315,7 +330,11 @@
     @try {
       [item removeObserver:self forKeyPath:kMDCBottomNavigationBarBadgeColorString];
       [item removeObserver:self forKeyPath:kMDCBottomNavigationBarBadgeValueString];
+      [item removeObserver:self
+                forKeyPath:kMDCBottomNavigationBarAccessibilityValueString];
       [item removeObserver:self forKeyPath:kMDCBottomNavigationBarImageString];
+      [item removeObserver:self
+                forKeyPath:kMDCBottomNavigationBarSelectedImageString];
       [item removeObserver:self forKeyPath:kMDCBottomNavigationBarTitleString];
     }
     @catch (NSException *exception) {
@@ -342,10 +361,15 @@
     MDCBottomNavigationItemView *itemView = _itemViews[selectedItemNum];
     if ([keyPath isEqualToString:kMDCBottomNavigationBarBadgeColorString]) {
       itemView.badgeColor = change[kMDCBottomNavigationBarNewString];
+    } else if ([keyPath
+                isEqualToString:kMDCBottomNavigationBarAccessibilityValueString]) {
+      itemView.accessibilityValue = change[NSKeyValueChangeNewKey];
     } else if ([keyPath isEqualToString:kMDCBottomNavigationBarBadgeValueString]) {
       itemView.badgeValue = change[kMDCBottomNavigationBarNewString];
     } else if ([keyPath isEqualToString:kMDCBottomNavigationBarImageString]) {
       itemView.image = change[kMDCBottomNavigationBarNewString];
+    } else if ([keyPath isEqualToString:kMDCBottomNavigationBarSelectedImageString]) {
+      itemView.selectedImage = change[kMDCBottomNavigationBarNewString];
     } else if ([keyPath isEqualToString:kMDCBottomNavigationBarTitleString]) {
       itemView.title = change[kMDCBottomNavigationBarNewString];
     }
@@ -405,7 +429,7 @@
 #pragma mark - Setters
 
 - (void)setItems:(NSArray<UITabBarItem *> *)items {
-  if (_items == items) {
+  if ([_items isEqual:items] || _items == items) {
     return;
   }
 
@@ -429,6 +453,7 @@
     itemView.unselectedItemTintColor = self.unselectedItemTintColor;
     itemView.titleVisibility = self.titleVisibility;
     itemView.titleBelowIcon = self.titleBelowItem;
+    itemView.accessibilityValue = item.accessibilityValue;
 
     NSString *key =
         kMaterialBottomNavigationStringTable[kStr_MaterialBottomNavigationItemCountAccessibilityHint];
@@ -443,6 +468,9 @@
     if (item.image) {
       itemView.image = item.image;
     }
+    if (item.selectedImage) {
+      itemView.selectedImage = item.selectedImage;
+    }
     if (item.badgeValue) {
       itemView.badgeValue = item.badgeValue;
     }
@@ -473,7 +501,9 @@
     [self.itemViews addObject:itemView];
     [self.containerView addSubview:itemView];
   }
+  self.selectedItem = nil;
   [self addObserversToTabBarItems];
+  [self setNeedsLayout];
 }
 
 - (void)setSelectedItem:(UITabBarItem *)selectedItem {
diff --git a/components/BottomNavigation/src/private/MDCBottomNavigationItemView.h b/components/BottomNavigation/src/private/MDCBottomNavigationItemView.h
index 9e323fb..e0d0656 100644
--- a/components/BottomNavigation/src/private/MDCBottomNavigationItemView.h
+++ b/components/BottomNavigation/src/private/MDCBottomNavigationItemView.h
@@ -32,6 +32,7 @@
 
 @property(nonatomic, strong) UIButton *button;
 @property(nonatomic, strong) UIImage *image;
+@property(nonatomic, strong) UIImage *selectedImage;
 
 @property(nonatomic, strong) UIColor *badgeColor UI_APPEARANCE_SELECTOR;
 @property(nonatomic, strong) UIColor *selectedItemTintColor UI_APPEARANCE_SELECTOR;
diff --git a/components/BottomNavigation/src/private/MDCBottomNavigationItemView.m b/components/BottomNavigation/src/private/MDCBottomNavigationItemView.m
index 6f3666c..b56f523 100644
--- a/components/BottomNavigation/src/private/MDCBottomNavigationItemView.m
+++ b/components/BottomNavigation/src/private/MDCBottomNavigationItemView.m
@@ -196,6 +196,7 @@
     _button.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
     _button.accessibilityLabel = [self accessibilityLabelWithTitle:_title];
     _button.accessibilityTraits &= ~UIAccessibilityTraitButton;
+    _button.accessibilityValue = self.accessibilityValue;
     [self addSubview:_button];
   }
 }
@@ -213,7 +214,7 @@
   [self centerLayoutAnimated:NO];
 }
 
-- (void)centerLayoutAnimated:(bool)animated {
+- (void)centerLayoutAnimated:(BOOL)animated {
   if (self.titleBelowIcon) {
     CGPoint iconImageViewCenter =
         CGPointMake(CGRectGetMidX(self.bounds), CGRectGetHeight(self.iconImageView.bounds) / 2 +
@@ -315,7 +316,7 @@
     self.label.textColor = self.selectedItemTitleColor;
     self.iconImageView.tintColor = self.selectedItemTintColor;
     self.button.accessibilityTraits |= UIAccessibilityTraitSelected;
-
+    self.iconImageView.image = (self.selectedImage) ? self.selectedImage : self.image;
     switch (self.titleVisibility) {
       case MDCBottomNavigationBarTitleVisibilitySelected:
         self.label.hidden = NO;
@@ -331,7 +332,7 @@
     self.label.textColor = self.unselectedItemTintColor;
     self.iconImageView.tintColor = self.unselectedItemTintColor;
     self.button.accessibilityTraits &= ~UIAccessibilityTraitSelected;
-
+    self.iconImageView.image = self.image;
     switch (self.titleVisibility) {
       case MDCBottomNavigationBarTitleVisibilitySelected:
         self.label.hidden = YES;
@@ -386,7 +387,9 @@
     badgeValue = nil;
   }
   self.badge.badgeValue = badgeValue;
-  self.button.accessibilityValue = badgeValue;
+  if (self.accessibilityValue == nil || self.accessibilityValue.length == 0) {
+    self.button.accessibilityValue = badgeValue;
+  }
   if (badgeValue == nil || badgeValue.length == 0) {
     self.badge.hidden = YES;
   } else {
@@ -397,6 +400,14 @@
 - (void)setImage:(UIImage *)image {
   _image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
   self.iconImageView.image = _image;
+  self.iconImageView.tintColor = (self.selected) ? self.selectedItemTintColor
+      : self.unselectedItemTintColor;
+  [self.iconImageView sizeToFit];
+}
+
+-(void)setSelectedImage:(UIImage *)selectedImage {
+  _selectedImage = [selectedImage imageWithRenderingMode: UIImageRenderingModeAlwaysTemplate];
+  self.iconImageView.image = _selectedImage;
   self.iconImageView.tintColor = self.selectedItemTintColor;
   [self.iconImageView sizeToFit];
 }
@@ -413,6 +424,14 @@
   [self setNeedsLayout];
 }
 
+-(void)setAccessibilityValue:(NSString *)accessibilityValue {
+  self.button.accessibilityValue = accessibilityValue;
+}
+
+- (NSString *)accessibilityValue {
+  return self.button.accessibilityValue;
+}
+
 #pragma mark - Resource bundle
 
 + (NSBundle *)bundle {
diff --git a/components/BottomNavigation/tests/unit/BottomNavigationTests.m b/components/BottomNavigation/tests/unit/BottomNavigationTests.m
index 126a902..cd27b4d 100644
--- a/components/BottomNavigation/tests/unit/BottomNavigationTests.m
+++ b/components/BottomNavigation/tests/unit/BottomNavigationTests.m
@@ -97,4 +97,35 @@
   XCTAssertEqual(self.bottomNavBar.itemViews.count, tabsCount);
 }
 
+-(void)testFramesAfterReset {
+  // Given
+  UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"1" image:nil tag:0];
+  UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"2" image:nil tag:1];
+  UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"2" image:nil tag:2];
+  [self.bottomNavBar sizeToFit];
+  self.bottomNavBar.frame = CGRectMake(0, 0, 320, 56);
+
+  // When
+  self.bottomNavBar.items = @[item1, item2];
+  self.bottomNavBar.items = @[item1, item2, item3];
+  [self.bottomNavBar layoutIfNeeded];
+
+  // Then
+  XCTAssertFalse(CGRectEqualToRect(self.bottomNavBar.itemViews[0].frame, CGRectZero));
+}
+
+-(void)testSelectedItemAfterReset {
+  // Given
+  UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"1" image:nil tag:0];
+  UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"2" image:nil tag:0];
+  UITabBarItem *item3 = [[UITabBarItem alloc] initWithTitle:@"2" image:nil tag:0];
+
+  // When
+  self.bottomNavBar.items = @[item1, item2];
+  self.bottomNavBar.items = @[item1, item2, item3];
+
+  // Then
+  XCTAssertNil(self.bottomNavBar.selectedItem);
+}
+
 @end
diff --git a/components/BottomSheet/BUILD b/components/BottomSheet/BUILD
index 61fa241..419ed77 100644
--- a/components/BottomSheet/BUILD
+++ b/components/BottomSheet/BUILD
@@ -29,6 +29,8 @@
     deps = [
       "//components/private/KeyboardWatcher",
       "//components/private/Math",
+      "//components/private/ShapeLibrary",
+      "//components/private/Shapes",
     ],
 )
 
diff --git a/components/BottomSheet/examples/BottomSheetShapedExample.m b/components/BottomSheet/examples/BottomSheetShapedExample.m
new file mode 100644
index 0000000..36125dd
--- /dev/null
+++ b/components/BottomSheet/examples/BottomSheetShapedExample.m
@@ -0,0 +1,56 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import <UIKit/UIKit.h>
+
+#import "MaterialAppBar.h"
+#import "MaterialAppBar+ColorThemer.h"
+#import "MaterialAppBar+TypographyThemer.h"
+#import "MaterialBottomSheet.h"
+#import "MaterialShapes.h"
+#import "MaterialShapeLibrary.h"
+#import "supplemental/BottomSheetDummyStaticViewController.h"
+#import "supplemental/BottomSheetDummyCollectionViewController.h"
+#import "supplemental/BottomSheetSupplemental.h"
+
+@implementation BottomSheetShapedExample
+
+- (void)presentBottomSheet {
+  BottomSheetDummyCollectionViewController *viewController =
+      [[BottomSheetDummyCollectionViewController alloc] initWithNumItems:102];
+  viewController.title = @"Shaped bottom sheet example";
+
+  MDCAppBarContainerViewController *container =
+      [[MDCAppBarContainerViewController alloc] initWithContentViewController:viewController];
+  container.preferredContentSize = CGSizeMake(500, 200);
+  container.appBar.headerViewController.headerView.trackingScrollView =
+      viewController.collectionView;
+
+  [MDCAppBarColorThemer applySemanticColorScheme:self.colorScheme toAppBar:container.appBar];
+  [MDCAppBarTypographyThemer applyTypographyScheme:self.typographyScheme toAppBar:container.appBar];
+
+  MDCBottomSheetController *bottomSheet =
+      [[MDCBottomSheetController alloc] initWithContentViewController:container];
+  bottomSheet.trackingScrollView = viewController.collectionView;
+  MDCRectangleShapeGenerator *shapeGenerator = [[MDCRectangleShapeGenerator alloc] init];
+  MDCCornerTreatment *cornerTreatment = [[MDCRoundedCornerTreatment alloc] initWithRadius:16.f];
+  shapeGenerator.topLeftCorner = cornerTreatment;
+  shapeGenerator.topRightCorner = cornerTreatment;
+  [bottomSheet setShapeGenerator:shapeGenerator forState:MDCSheetStatePreferred];
+  [self presentViewController:bottomSheet animated:YES completion:nil];
+}
+
+@end
diff --git a/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.h b/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.h
index 0a8d438..5f0263d 100644
--- a/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.h
+++ b/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.h
@@ -30,3 +30,6 @@
 
 @interface BottomSheetTypicalUseExample : BottomSheetPresenterViewController
 @end
+
+@interface BottomSheetShapedExample : BottomSheetPresenterViewController
+@end
diff --git a/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.m b/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.m
index 613a23b..1e16d3c 100644
--- a/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.m
+++ b/components/BottomSheet/examples/supplemental/BottomSheetSupplemental.m
@@ -100,3 +100,19 @@
 }
 
 @end
+
+@implementation BottomSheetShapedExample (CatalogByConvention)
+
++ (NSArray *)catalogBreadcrumbs {
+  return @[ @"Bottom Sheet", @"Shaped Bottom Sheet" ];
+}
+
++ (BOOL)catalogIsPrimaryDemo {
+  return NO;
+}
+
++ (BOOL)catalogIsPresentable {
+  return NO;
+}
+
+@end
diff --git a/components/BottomSheet/src/MDCBottomSheetController.h b/components/BottomSheet/src/MDCBottomSheetController.h
index ebcce48..d7f2fda 100644
--- a/components/BottomSheet/src/MDCBottomSheetController.h
+++ b/components/BottomSheet/src/MDCBottomSheetController.h
@@ -15,6 +15,8 @@
  */
 
 #import <UIKit/UIKit.h>
+#import "MDCSheetState.h"
+#import "MaterialShapes.h"
 
 @protocol MDCBottomSheetControllerDelegate;
 
@@ -51,11 +53,69 @@
 @property(nonatomic, assign) BOOL dismissOnBackgroundTap;
 
 /**
+ If @c YES, then the dimmed scrim view will act as an accessibility element for dismissing the
+ bottom sheet.
+
+ Defaults to @c NO.
+ */
+@property(nonatomic, assign) BOOL isScrimAccessibilityElement;
+
+/**
+ The @c accessibilityLabel value of the dimmed scrim view.
+
+ Defaults to @c nil.
+ */
+@property(nullable, nonatomic, copy) NSString *scrimAccessibilityLabel;
+
+/**
+ The @c accessibilityHint value of the dimmed scrim view.
+
+ Defaults to @c nil.
+ */
+@property(nullable, nonatomic, copy) NSString *scrimAccessibilityHint;
+
+/**
+ The @c accessibilityTraits of the dimmed scrim view.
+
+ Defaults to @c UIAccessibilityTraitButton.
+ */
+@property(nonatomic, assign) UIAccessibilityTraits scrimAccessibilityTraits;
+
+/**
  The bottom sheet delegate.
  */
 @property(nonatomic, weak, nullable) id<MDCBottomSheetControllerDelegate> delegate;
 
 /**
+ The current state of the bottom sheet.
+ */
+@property(nonatomic, readonly) MDCSheetState state;
+
+/**
+ Sets the shape generator for state that is used to define the bottom sheet's shape for that state.
+
+ note: If a layer property is explicitly set after the shapeGenerator has been set,
+ it can lead to unexpected behavior. As an example, changes to the view layer's properties such as
+ cornerRadius, mask, or shadow properties are not advised when the shapeGenerator is set.
+
+ When the shapeGenerator for a state is nil, MDCBottomSheetController will use the default view's
+ underlying layer (self.view.layer) with its default settings.
+
+ @param shapeGenerator The shape generator holding the desired shape of the sheet.
+ @param state The state of the bottom sheet.
+ */
+- (void)setShapeGenerator:(nullable id<MDCShapeGenerating>)shapeGenerator
+                 forState:(MDCSheetState)state;
+
+/**
+ Returns the shape generator for an MDCSheetState state.
+
+ @param state The state of the bottom sheet
+ @return the shape generator for the state given.
+ */
+- (nullable id<MDCShapeGenerating>)shapeGeneratorForState:(MDCSheetState)state;
+
+/**
  Initializes the controller with a content view controller.
 
  @param contentViewController The view controller to be presented as a bottom sheet.
diff --git a/components/BottomSheet/src/MDCBottomSheetController.m b/components/BottomSheet/src/MDCBottomSheetController.m
index 31d8845..de4e3d7 100644
--- a/components/BottomSheet/src/MDCBottomSheetController.m
+++ b/components/BottomSheet/src/MDCBottomSheetController.m
@@ -21,10 +21,18 @@
 #import "UIViewController+MaterialBottomSheet.h"
 
 @interface MDCBottomSheetController () <MDCBottomSheetPresentationControllerDelegate>
+@property(nonatomic, readonly, strong) MDCShapedView *view;
 @end
 
 @implementation MDCBottomSheetController {
   MDCBottomSheetTransitionController *_transitionController;
+  NSMutableDictionary<NSNumber *, id<MDCShapeGenerating>> *_shapeGenerators;
+}
+
+@dynamic view;
+
+- (void)loadView {
+  self.view = [[MDCShapedView alloc] initWithFrame:CGRectZero];
 }
 
 - (nonnull instancetype)initWithContentViewController:
@@ -35,6 +43,8 @@
     _transitionController.dismissOnBackgroundTap = YES;
     super.transitioningDelegate = _transitionController;
     super.modalPresentationStyle = UIModalPresentationCustom;
+    _shapeGenerators = [NSMutableDictionary dictionary];
+    _state = MDCSheetStatePreferred;
   }
   return self;
 }
@@ -45,7 +55,6 @@
   self.contentViewController.view.autoresizingMask =
       UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
   self.contentViewController.view.frame = self.view.bounds;
-
   [self addChildViewController:self.contentViewController];
   [self.view addSubview:self.contentViewController.view];
   [self.contentViewController didMoveToParentViewController:self];
@@ -112,6 +121,43 @@
   self.mdc_bottomSheetPresentationController.dismissOnBackgroundTap = dismissOnBackgroundTap;
 }
 
+- (void)bottomSheetWillChangeState:(MDCBottomSheetPresentationController *)bottomSheet
+                        sheetState:(MDCSheetState)sheetState {
+  _state = sheetState;
+  [self updateShapeGenerator];
+}
+
+- (id<MDCShapeGenerating>)shapeGeneratorForState:(MDCSheetState)state {
+  id<MDCShapeGenerating> shapeGenerator = _shapeGenerators[@(state)];
+  if (state != MDCSheetStateClosed && shapeGenerator == nil) {
+    shapeGenerator = _shapeGenerators[@(MDCSheetStateClosed)];
+  }
+  if (shapeGenerator != nil) {
+    return shapeGenerator;
+  }
+  return nil;
+}
+
+- (void)setShapeGenerator:(id<MDCShapeGenerating>)shapeGenerator
+                 forState:(MDCSheetState)state {
+  _shapeGenerators[@(state)] = shapeGenerator;
+
+  [self updateShapeGenerator];
+}
+
+- (void)updateShapeGenerator {
+  id<MDCShapeGenerating> shapeGenerator = [self shapeGeneratorForState:_state];
+  if (self.view.shapeGenerator != shapeGenerator) {
+    self.view.shapeGenerator = shapeGenerator;
+    if (shapeGenerator != nil) {
+      self.contentViewController.view.layer.mask =
+      ((MDCShapedShadowLayer *)self.view.layer).shapeLayer;
+    } else {
+      self.contentViewController.view.layer.mask = nil;
+    }
+  }
+}
+
 /* Disable setter. Always use internal transition controller */
 - (void)setTransitioningDelegate:
     (__unused id<UIViewControllerTransitioningDelegate>)transitioningDelegate {
@@ -125,6 +171,38 @@
   return;
 }
 
+- (void)setIsScrimAccessibilityElement:(BOOL)isScrimAccessibilityElement {
+  _transitionController.isScrimAccessibilityElement = isScrimAccessibilityElement;
+}
+
+- (BOOL)isScrimAccessibilityElement {
+  return _transitionController.isScrimAccessibilityElement;
+}
+
+- (void)setScrimAccessibilityLabel:(NSString *)scrimAccessibilityLabel {
+  _transitionController.scrimAccessibilityLabel = scrimAccessibilityLabel;
+}
+
+- (NSString *)scrimAccessibilityLabel {
+  return _transitionController.scrimAccessibilityLabel;
+}
+
+- (void)setScrimAccessibilityHint:(NSString *)scrimAccessibilityHint {
+  _transitionController.scrimAccessibilityHint = scrimAccessibilityHint;
+}
+
+- (NSString *)scrimAccessibilityHint {
+  return _transitionController.scrimAccessibilityHint;
+}
+
+- (void)setScrimAccessibilityTraits:(UIAccessibilityTraits)scrimAccessibilityTraits {
+  _transitionController.scrimAccessibilityTraits = scrimAccessibilityTraits;
+}
+
+- (UIAccessibilityTraits)scrimAccessibilityTraits {
+  return _transitionController.scrimAccessibilityTraits;
+}
+
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
 - (void)bottomSheetPresentationControllerDidDismissBottomSheet:
diff --git a/components/BottomSheet/src/MDCBottomSheetPresentationController.h b/components/BottomSheet/src/MDCBottomSheetPresentationController.h
index 185f9ec..fac46ed 100644
--- a/components/BottomSheet/src/MDCBottomSheetPresentationController.h
+++ b/components/BottomSheet/src/MDCBottomSheetPresentationController.h
@@ -15,6 +15,7 @@
  */
 
 #import <UIKit/UIKit.h>
+#import "MDCBottomSheetController.h"
 
 @class MDCBottomSheetPresentationController;
 
@@ -43,6 +44,8 @@
 - (void)bottomSheetPresentationControllerDidDismissBottomSheet:
     (nonnull MDCBottomSheetPresentationController *)bottomSheet;
 
+- (void)bottomSheetWillChangeState:(nonnull MDCBottomSheetPresentationController *)bottomSheet
+                        sheetState:(MDCSheetState)sheetState;
 @end
 
 /**
@@ -64,6 +67,35 @@
 @property(nonatomic, assign) BOOL dismissOnBackgroundTap;
 
 /**
+ If @c YES, then the dimmed scrim view will act as an accessibility element for dismissing the
+ bottom sheet.
+
+ Defaults to @c NO.
+ */
+@property(nonatomic, assign) BOOL isScrimAccessibilityElement;
+
+/**
+ The @c accessibilityLabel value of the dimmed scrim view.
+
+ Defaults to @c nil.
+ */
+@property(nullable, nonatomic, copy) NSString *scrimAccessibilityLabel;
+
+/**
+ The @c accessibilityHint value of the dimmed scrim view.
+
+ Defaults to @c nil.
+ */
+@property(nullable, nonatomic, copy) NSString *scrimAccessibilityHint;
+
+/**
+ The @c accessibilityTraits of the dimmed scrim view.
+
+ Defaults to @c UIAccessibilityTraitButton.
+ */
+@property(nonatomic, assign) UIAccessibilityTraits scrimAccessibilityTraits;
+
+/**
  Delegate to tell the presenter when to dismiss.
  */
 @property(nonatomic, weak, nullable) id<MDCBottomSheetPresentationControllerDelegate> delegate;
diff --git a/components/BottomSheet/src/MDCBottomSheetPresentationController.m b/components/BottomSheet/src/MDCBottomSheetPresentationController.m
index 82e216c..83fba1f 100644
--- a/components/BottomSheet/src/MDCBottomSheetPresentationController.m
+++ b/components/BottomSheet/src/MDCBottomSheetPresentationController.m
@@ -15,9 +15,6 @@
  */
 
 #import "MDCBottomSheetPresentationController.h"
-
-#import "MDCBottomSheetController.h"
-
 #import "MaterialMath.h"
 #import "private/MDCSheetContainerView.h"
 
@@ -50,6 +47,10 @@
 @implementation MDCBottomSheetPresentationController {
   UIView *_dimmingView;
   MDCSheetContainerView *_sheetView;
+  @private BOOL _scrimIsAccessibilityElement;
+  @private NSString *_scrimAccessibilityLabel;
+  @private NSString *_scrimAccessibilityHint;
+  @private UIAccessibilityTraits _scrimAccessibilityTraits;
 }
 
 @synthesize delegate;
@@ -86,6 +87,11 @@
   _dimmingView.translatesAutoresizingMaskIntoConstraints = NO;
   _dimmingView.autoresizingMask =
       UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+  _dimmingView.accessibilityTraits |= UIAccessibilityTraitButton;
+  _dimmingView.isAccessibilityElement = _scrimIsAccessibilityElement;
+  _dimmingView.accessibilityTraits = _scrimAccessibilityTraits;
+  _dimmingView.accessibilityLabel = _scrimAccessibilityLabel;
+  _dimmingView.accessibilityHint = _scrimAccessibilityHint;
 
   UIScrollView *scrollView = self.trackingScrollView;
   if (scrollView == nil) {
@@ -192,6 +198,44 @@
   }
 }
 
+#pragma mark - Properties
+
+- (void)setIsScrimAccessibilityElement:(BOOL)isScrimAccessibilityElement {
+  _scrimIsAccessibilityElement = isScrimAccessibilityElement;
+  _dimmingView.isAccessibilityElement = isScrimAccessibilityElement;
+}
+
+- (BOOL)isScrimAccessibilityElement {
+  return _scrimIsAccessibilityElement;
+}
+
+- (void)setScrimAccessibilityLabel:(NSString *)scrimAccessibilityLabel {
+  _scrimAccessibilityLabel = scrimAccessibilityLabel;
+  _dimmingView.accessibilityLabel = scrimAccessibilityLabel;
+}
+
+- (NSString *)scrimAccessibilityLabel {
+  return _scrimAccessibilityLabel;
+}
+
+- (void)setScrimAccessibilityHint:(NSString *)scrimAccessibilityHint {
+  _scrimAccessibilityHint = scrimAccessibilityHint;
+  _dimmingView.accessibilityHint = scrimAccessibilityHint;
+}
+
+- (NSString *)scrimAccessibilityHint {
+  return _scrimAccessibilityHint;
+}
+
+- (void)setScrimAccessibilityTraits:(UIAccessibilityTraits)scrimAccessibilityTraits {
+  _scrimAccessibilityTraits = scrimAccessibilityTraits;
+  _dimmingView.accessibilityTraits = scrimAccessibilityTraits;
+}
+
+- (UIAccessibilityTraits)scrimAccessibilityTraits {
+  return _scrimAccessibilityTraits;
+}
+
 #pragma mark - MDCSheetContainerViewDelegate
 
 - (void)sheetContainerViewDidHide:(nonnull __unused MDCSheetContainerView *)containerView {
@@ -204,4 +248,13 @@
   }
 }
 
+- (void)sheetContainerViewWillChangeState:(nonnull MDCSheetContainerView *)containerView
+                               sheetState:(MDCSheetState)sheetState {
+  id<MDCBottomSheetPresentationControllerDelegate> strongDelegate = self.delegate;
+  if ([strongDelegate respondsToSelector:
+       @selector(bottomSheetWillChangeState:sheetState:)]) {
+    [strongDelegate bottomSheetWillChangeState:self sheetState:sheetState];
+  }
+}
+
 @end
diff --git a/components/BottomSheet/src/MDCBottomSheetTransitionController.h b/components/BottomSheet/src/MDCBottomSheetTransitionController.h
index da92622..99c4a94 100644
--- a/components/BottomSheet/src/MDCBottomSheetTransitionController.h
+++ b/components/BottomSheet/src/MDCBottomSheetTransitionController.h
@@ -48,3 +48,36 @@
 @property(nonatomic, assign) BOOL dismissOnBackgroundTap;
 
 @end
+
+@interface MDCBottomSheetTransitionController (ScrimAccessibility)
+
+/**
+ If @c YES, then the dimmed scrim view will act as an accessibility element for dismissing the
+ bottom sheet.
+
+ Defaults to @c NO.
+ */
+@property(nonatomic, assign) BOOL isScrimAccessibilityElement;
+
+/**
+ The @c accessibilityLabel value of the dimmed scrim view.
+
+ Defaults to @c nil.
+ */
+@property(nullable, nonatomic, copy) NSString *scrimAccessibilityLabel;
+
+/**
+ The @c accessibilityHint value of the dimmed scrim view.
+
+ Defaults to @c nil.
+ */
+@property(nullable, nonatomic, copy) NSString *scrimAccessibilityHint;
+
+/**
+ The @c accessibilityTraits of the dimmed scrim view.
+
+ Defaults to @c UIAccessibilityTraitButton.
+ */
+@property(nonatomic, assign) UIAccessibilityTraits scrimAccessibilityTraits;
+
+@end
diff --git a/components/BottomSheet/src/MDCBottomSheetTransitionController.m b/components/BottomSheet/src/MDCBottomSheetTransitionController.m
index f98668f..39aaca5 100644
--- a/components/BottomSheet/src/MDCBottomSheetTransitionController.m
+++ b/components/BottomSheet/src/MDCBottomSheetTransitionController.m
@@ -20,10 +20,23 @@
 
 static const NSTimeInterval MDCBottomSheetTransitionDuration = 0.25;
 
-@implementation MDCBottomSheetTransitionController
+@implementation MDCBottomSheetTransitionController {
+  @protected BOOL _isScrimAccessibilityElement;
+  @protected NSString *_scrimAccessibilityLabel;
+  @protected NSString *_scrimAccessibilityHint;
+  @protected UIAccessibilityTraits _scrimAccessibilityTraits;
+}
 
 #pragma mark - UIViewControllerTransitioningDelegate
 
+- (instancetype)init {
+  self = [super init];
+  if (self) {
+    _scrimAccessibilityTraits = UIAccessibilityTraitButton;
+  }
+  return self;
+}
+
 - (UIPresentationController *)
     presentationControllerForPresentedViewController:(UIViewController *)presented
                             presentingViewController:(UIViewController *)presenting
@@ -33,6 +46,10 @@
                                                            presentingViewController:presenting];
   presentationController.trackingScrollView = self.trackingScrollView;
   presentationController.dismissOnBackgroundTap = self.dismissOnBackgroundTap;
+  presentationController.scrimAccessibilityTraits = _scrimAccessibilityTraits;
+  presentationController.isScrimAccessibilityElement = _isScrimAccessibilityElement;
+  presentationController.scrimAccessibilityHint = _scrimAccessibilityHint;
+  presentationController.scrimAccessibilityLabel = _scrimAccessibilityLabel;
   return presentationController;
 }
 
@@ -131,4 +148,36 @@
   }
 }
 
+- (void)setIsScrimAccessibilityElement:(BOOL)isScrimAccessibilityElement {
+  _isScrimAccessibilityElement = isScrimAccessibilityElement;
+}
+
+- (BOOL)isScrimAccessibilityElement {
+  return _isScrimAccessibilityElement;
+}
+
+- (void)setScrimAccessibilityLabel:(NSString *)scrimAccessibilityLabel {
+  _scrimAccessibilityLabel = scrimAccessibilityLabel;
+}
+
+- (NSString *)scrimAccessibilityLabel {
+  return _scrimAccessibilityLabel;
+}
+
+- (void)setScrimAccessibilityHint:(NSString *)scrimAccessibilityHint {
+  _scrimAccessibilityHint = scrimAccessibilityHint;
+}
+
+- (NSString *)scrimAccessibilityHint {
+  return _scrimAccessibilityHint;
+}
+
+- (void)setScrimAccessibilityTraits:(UIAccessibilityTraits)scrimAccessibilityTraits {
+  _scrimAccessibilityTraits = scrimAccessibilityTraits;
+}
+
+- (UIAccessibilityTraits)scrimAccessibilityTraits {
+  return _scrimAccessibilityTraits;
+}
+
 @end
diff --git a/components/BottomSheet/src/MDCSheetState.h b/components/BottomSheet/src/MDCSheetState.h
new file mode 100644
index 0000000..d88dfe5
--- /dev/null
+++ b/components/BottomSheet/src/MDCSheetState.h
@@ -0,0 +1,35 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+
+/**
+ The MDCSheetState enum provides the different possible states the bottom sheet can be in.
+ There are currently 3 different states for the bottom sheet:
+
+ - MDCSheetStateClosed: This state is reached when the bottom sheet is dragged down and is
+   dismissed.
+ - MDCSheetStatePreferred: This state is reached when the bottom sheet is half collapsed - when
+   it visible but not in full screen. This state is also the default state for the sheet.
+ - MDCSheetStateExtended: This state is reached when the sheet is expanded and is in full screen.
+ */
+typedef NS_ENUM(NSUInteger, MDCSheetState) {
+  MDCSheetStateClosed,
+  MDCSheetStatePreferred,
+  MDCSheetStateExtended
+};
+
diff --git a/components/BottomSheet/src/private/MDCSheetContainerView.h b/components/BottomSheet/src/private/MDCSheetContainerView.h
index 69c661c..2f0d786 100644
--- a/components/BottomSheet/src/private/MDCSheetContainerView.h
+++ b/components/BottomSheet/src/private/MDCSheetContainerView.h
@@ -15,15 +15,10 @@
  */
 
 #import <UIKit/UIKit.h>
+#import "MDCSheetState.h"
 
 @protocol MDCSheetContainerViewDelegate;
 
-typedef NS_ENUM(NSUInteger, MDCSheetState) {
-  MDCSheetStateClosed,
-  MDCSheetStatePreferred,
-  MDCSheetStateExtended
-};
-
 @interface MDCSheetContainerView : UIView
 
 @property(nonatomic, weak, nullable) id<MDCSheetContainerViewDelegate> delegate;
@@ -42,5 +37,7 @@
 @protocol MDCSheetContainerViewDelegate <NSObject>
 
 - (void)sheetContainerViewDidHide:(nonnull MDCSheetContainerView *)containerView;
+- (void)sheetContainerViewWillChangeState:(nonnull MDCSheetContainerView *)containerView
+                               sheetState:(MDCSheetState)sheetState;
 
 @end
diff --git a/components/BottomSheet/src/private/MDCSheetContainerView.m b/components/BottomSheet/src/private/MDCSheetContainerView.m
index c353646..dc7a4a7 100644
--- a/components/BottomSheet/src/private/MDCSheetContainerView.m
+++ b/components/BottomSheet/src/private/MDCSheetContainerView.m
@@ -388,4 +388,11 @@
   self.isDragging = YES;
 }
 
+- (void)setSheetState:(MDCSheetState)sheetState {
+  if (sheetState != _sheetState) {
+    _sheetState = sheetState;
+    [self.delegate sheetContainerViewWillChangeState:self sheetState:sheetState];
+  }
+}
+
 @end
diff --git a/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m b/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m
index 2e321f7..42d57ea 100644
--- a/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m
+++ b/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m
@@ -160,6 +160,13 @@
   ];
 
   [self setupExampleViews];
+
+  NSMutableArray *accessibilityElements = [@[] mutableCopy];
+  for (NSUInteger index = 0; index < self.buttons.count; ++index) {
+    [accessibilityElements addObject:self.labels[index]];
+    [accessibilityElements addObject:self.buttons[index]];
+  }
+  self.view.accessibilityElements = [accessibilityElements copy];
 }
 
 - (void)setupExampleViews {
diff --git a/components/Cards/examples/CardExampleViewController.swift b/components/Cards/examples/CardExampleViewController.swift
index a60b403..3f099b4 100644
--- a/components/Cards/examples/CardExampleViewController.swift
+++ b/components/Cards/examples/CardExampleViewController.swift
@@ -19,7 +19,7 @@
 
 class CardExampleViewController: UIViewController {
   @IBOutlet var contentView: UIView!
-  @IBOutlet weak var imageView: UIImageView!
+  @IBOutlet weak var imageView: CardImageView!
   @IBOutlet weak var card: MDCCard!
   @IBOutlet weak var button: MDCButton!
 
@@ -36,15 +36,6 @@
     contentView.frame = self.view.bounds
     self.view.addSubview(contentView)
 
-    let bezierPath = UIBezierPath(roundedRect: imageView.bounds,
-                                  byRoundingCorners: [.topLeft, .topRight],
-                                  cornerRadii: CGSize(width: card.cornerRadius,
-                                                      height: card.cornerRadius))
-    let shapeLayer = CAShapeLayer()
-    shapeLayer.frame = imageView.bounds
-    shapeLayer.path = bezierPath.cgPath
-    imageView.layer.mask = shapeLayer
-
     let buttonScheme = MDCButtonScheme();
     buttonScheme.colorScheme = colorScheme
     buttonScheme.typographyScheme = typographyScheme
@@ -53,11 +44,7 @@
     let cardScheme = MDCCardScheme();
     cardScheme.colorScheme = colorScheme
     MDCCardThemer.applyScheme(cardScheme, to: card)
-  }
-
-  override func didReceiveMemoryWarning() {
-      super.didReceiveMemoryWarning()
-      // Dispose of any resources that can be recreated.
+    card.isInteractable = false
   }
 
   override public var traitCollection: UITraitCollection {
@@ -91,3 +78,32 @@
     return "Cards contain content and actions about a single subject."
   }
 }
+
+class CardImageView: UIImageView {
+  override func layoutSubviews() {
+    super.layoutSubviews()
+    self.curveImageToCorners()
+  }
+
+  func curveImageToCorners() {
+    // The main image from the xib is taken from: https://unsplash.com/photos/wMzx2nBdeng
+    // License details: https://unsplash.com/license
+    var roundingCorners = UIRectCorner.topLeft
+    if (UIDevice.current.orientation == .portrait ||
+      UIDevice.current.orientation == .portraitUpsideDown) {
+      roundingCorners.formUnion(.topRight)
+    } else {
+      roundingCorners.formUnion(.bottomLeft)
+    }
+
+    let bezierPath = UIBezierPath(roundedRect: self.bounds,
+                                  byRoundingCorners: roundingCorners,
+                                  cornerRadii: CGSize(width: 4,
+                                                      height: 4))
+    let shapeLayer = CAShapeLayer()
+    shapeLayer.frame = self.bounds
+    shapeLayer.path = bezierPath.cgPath
+    self.layer.mask = shapeLayer
+  }
+
+}
diff --git a/components/Cards/examples/resources/CardExampleViewController.xib b/components/Cards/examples/resources/CardExampleViewController.xib
index 5afb889..9322834 100644
--- a/components/Cards/examples/resources/CardExampleViewController.xib
+++ b/components/Cards/examples/resources/CardExampleViewController.xib
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13770" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
-    <device id="retina4_7" orientation="portrait">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
+    <device id="retina5_9" orientation="portrait">
         <adaptation id="fullscreen"/>
     </device>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13770"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
         <capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
         <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -21,33 +21,35 @@
         </placeholder>
         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
         <view clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
-            <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+            <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
             <subviews>
                 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="BAQ-GJ-1pn" customClass="MDCCard">
-                    <rect key="frame" x="30" y="94" width="315" height="479"/>
+                    <rect key="frame" x="26" y="150.33333333333334" width="323" height="511.33333333333326"/>
                     <subviews>
-                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sample-image" translatesAutoresizingMaskIntoConstraints="NO" id="ldt-3r-Agk">
-                            <rect key="frame" x="0.0" y="0.0" width="315" height="315"/>
+                        <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sample-image" translatesAutoresizingMaskIntoConstraints="NO" id="ldt-3r-Agk" customClass="CardImageView" customModule="MaterialComponentsExamples" customModuleProvider="target">
+                            <rect key="frame" x="0.0" y="0.0" width="323" height="322.66666666666669"/>
                             <constraints>
                                 <constraint firstAttribute="width" secondItem="ldt-3r-Agk" secondAttribute="height" multiplier="15:15" id="OUj-9G-eou"/>
                             </constraints>
                         </imageView>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mpO-dS-0yd">
-                            <rect key="frame" x="8" y="325" width="299" height="20.5"/>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" text="Title Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mpO-dS-0yd">
+                            <rect key="frame" x="8" y="332.66666666666663" width="307" height="20.333333333333314"/>
                             <fontDescription key="fontDescription" type="system" pointSize="17"/>
                             <nil key="highlightedColor"/>
                         </label>
-                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="249" verticalCompressionResistancePriority="749" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tmz-Bt-Hco">
-                            <rect key="frame" x="8" y="353.5" width="299" height="75.5"/>
-                            <string key="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</string>
+                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalCompressionResistancePriority="751" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tmz-Bt-Hco">
+                            <rect key="frame" x="8" y="361" width="307" height="100.33333333333331"/>
+                            <string key="text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</string>
                             <fontDescription key="fontDescription" type="system" pointSize="14"/>
                             <color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                             <nil key="highlightedColor"/>
                         </label>
-                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NWQ-Eq-COf" customClass="MDCButton">
-                            <rect key="frame" x="102.5" y="437" width="110" height="34"/>
-                            <state key="normal" title="Action Button"/>
+                        <button opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="251" verticalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="NWQ-Eq-COf" customClass="MDCButton">
+                            <rect key="frame" x="106.66666666666666" y="469.33333333333326" width="110" height="34"/>
+                            <state key="normal" title="Action Button">
+                                <color key="titleColor" red="0.0" green="0.47058823529999999" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+                            </state>
                         </button>
                     </subviews>
                     <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -59,7 +61,6 @@
                         <constraint firstAttribute="trailing" secondItem="mpO-dS-0yd" secondAttribute="trailing" constant="8" id="MFB-Nj-dQU"/>
                         <constraint firstItem="mpO-dS-0yd" firstAttribute="leading" secondItem="BAQ-GJ-1pn" secondAttribute="leading" constant="8" id="WJn-vb-ReP"/>
                         <constraint firstItem="mpO-dS-0yd" firstAttribute="top" secondItem="ldt-3r-Agk" secondAttribute="bottom" constant="10" id="Y9S-sz-I8f"/>
-                        <constraint firstItem="NWQ-Eq-COf" firstAttribute="centerX" secondItem="BAQ-GJ-1pn" secondAttribute="centerX" id="YBt-vK-89V"/>
                         <constraint firstItem="Tmz-Bt-Hco" firstAttribute="top" secondItem="mpO-dS-0yd" secondAttribute="bottom" constant="8" id="bRb-kf-lM3"/>
                         <constraint firstItem="ldt-3r-Agk" firstAttribute="trailing" secondItem="Tmz-Bt-Hco" secondAttribute="leading" constant="-8" id="bjC-5v-fyc"/>
                         <constraint firstAttribute="trailing" secondItem="ldt-3r-Agk" secondAttribute="trailing" id="bzX-OZ-rhy"/>
@@ -68,6 +69,7 @@
                         <constraint firstItem="Tmz-Bt-Hco" firstAttribute="leading" secondItem="BAQ-GJ-1pn" secondAttribute="leading" constant="8" id="hBu-ah-26L"/>
                         <constraint firstItem="ldt-3r-Agk" firstAttribute="leading" secondItem="BAQ-GJ-1pn" secondAttribute="leading" id="laW-HO-JiJ"/>
                         <constraint firstAttribute="trailing" secondItem="Tmz-Bt-Hco" secondAttribute="trailing" constant="8" id="qQK-f0-FLE"/>
+                        <constraint firstItem="NWQ-Eq-COf" firstAttribute="centerX" secondItem="Tmz-Bt-Hco" secondAttribute="centerX" id="yhl-7M-gxu"/>
                     </constraints>
                     <variation key="default">
                         <mask key="constraints">
@@ -107,10 +109,14 @@
                     </variation>
                     <variation key="heightClass=regular-widthClass=regular">
                         <mask key="constraints">
-                            <include reference="0CE-xb-4pW"/>
-                            <include reference="6nf-mh-lPb"/>
-                            <include reference="bjC-5v-fyc"/>
-                            <include reference="DhK-tR-doL"/>
+                            <exclude reference="0CE-xb-4pW"/>
+                            <exclude reference="6nf-mh-lPb"/>
+                            <exclude reference="bjC-5v-fyc"/>
+                            <include reference="bzX-OZ-rhy"/>
+                            <exclude reference="DhK-tR-doL"/>
+                            <include reference="WJn-vb-ReP"/>
+                            <include reference="Y9S-sz-I8f"/>
+                            <include reference="hBu-ah-26L"/>
                         </mask>
                     </variation>
                 </view>
@@ -119,10 +125,10 @@
             <constraints>
                 <constraint firstItem="BAQ-GJ-1pn" firstAttribute="centerY" secondItem="i5M-Pr-FkT" secondAttribute="centerY" id="57T-Xi-SQb"/>
                 <constraint firstItem="BAQ-GJ-1pn" firstAttribute="centerX" secondItem="i5M-Pr-FkT" secondAttribute="centerX" id="Yc8-Tp-Oxg"/>
-                <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="BAQ-GJ-1pn" secondAttribute="trailing" constant="30" id="bdn-MZ-eeg"/>
-                <constraint firstItem="BAQ-GJ-1pn" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="30" id="qTV-9a-RUO"/>
-                <constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="BAQ-GJ-1pn" secondAttribute="bottom" constant="30" id="rBD-rT-QRT"/>
-                <constraint firstItem="BAQ-GJ-1pn" firstAttribute="top" relation="greaterThanOrEqual" secondItem="i5M-Pr-FkT" secondAttribute="topMargin" constant="30" id="tgZ-0g-Sb2"/>
+                <constraint firstAttribute="trailingMargin" relation="greaterThanOrEqual" secondItem="BAQ-GJ-1pn" secondAttribute="trailing" constant="10" id="bdn-MZ-eeg"/>
+                <constraint firstItem="BAQ-GJ-1pn" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="i5M-Pr-FkT" secondAttribute="leadingMargin" constant="10" id="qTV-9a-RUO"/>
+                <constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="BAQ-GJ-1pn" secondAttribute="bottom" constant="20" id="rBD-rT-QRT"/>
+                <constraint firstItem="BAQ-GJ-1pn" firstAttribute="top" relation="greaterThanOrEqual" secondItem="i5M-Pr-FkT" secondAttribute="topMargin" constant="20" id="tgZ-0g-Sb2"/>
             </constraints>
             <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
             <point key="canvasLocation" x="34.5" y="54.5"/>
diff --git a/components/Cards/examples/supplemental/CardTintExampleCell.m b/components/Cards/examples/supplemental/CardTintExampleCell.m
index 1ada686..2a604cd 100644
--- a/components/Cards/examples/supplemental/CardTintExampleCell.m
+++ b/components/Cards/examples/supplemental/CardTintExampleCell.m
@@ -33,6 +33,7 @@
 
     [self setImageTintColor:[UIColor blueColor] forState:MDCCardCellStateNormal];
     [self setImageTintColor:[UIColor blueColor] forState:MDCCardCellStateSelected];
+    [self setInteractable:NO];
   }
   return self;
 }
diff --git a/components/Cards/src/CardThemer/MDCCardThemer.m b/components/Cards/src/CardThemer/MDCCardThemer.m
index 14c0b2e..2d0d203 100644
--- a/components/Cards/src/CardThemer/MDCCardThemer.m
+++ b/components/Cards/src/CardThemer/MDCCardThemer.m
@@ -29,7 +29,7 @@
              toCard:(nonnull MDCCard *)card {
   [card setShadowElevation:kNormalElevation forState:UIControlStateNormal];
   [card setShadowElevation:kHighlightedElevation forState:UIControlStateHighlighted];
-
+  card.interactable = YES;
   [MDCCardsColorThemer applySemanticColorScheme:scheme.colorScheme toCard:card];
 }
 
@@ -38,7 +38,7 @@
   [cardCell setShadowElevation:kNormalElevation forState:MDCCardCellStateNormal];
   [cardCell setShadowElevation:kHighlightedElevation forState:MDCCardCellStateHighlighted];
   [cardCell setShadowElevation:kSelectedElevation forState:MDCCardCellStateSelected];
-
+  cardCell.interactable = YES;
   [MDCCardsColorThemer applySemanticColorScheme:scheme.colorScheme toCardCell:cardCell];
 }
 
diff --git a/components/Cards/src/MDCCard.h b/components/Cards/src/MDCCard.h
index c91b514..8de40a4 100644
--- a/components/Cards/src/MDCCard.h
+++ b/components/Cards/src/MDCCard.h
@@ -33,6 +33,19 @@
  */
 @property(nonatomic, readonly, strong, nonnull) MDCInkView *inkView;
 
+/**
+ This property defines if a card as a whole should be interactable or not.
+ What this means is that when isInteractable is set to NO, there will be no ink ripple and
+ no change in shadow elevation when tapped or selected. Also the card container itself will not be
+ tappable, but any of its subviews will still be tappable.
+
+ Default is set to YES.
+
+ Important: Our specification for cards explicitly define a card as being an interactable component.
+ Therefore, this property should be set to NO *only if* there are other interactable items within
+ the card's content, such as buttons or other tappable controls.
+ */
+@property (nonatomic, getter=isInteractable) IBInspectable BOOL interactable;
 
 /**
  Sets the shadow elevation for an UIControlState state
diff --git a/components/Cards/src/MDCCard.m b/components/Cards/src/MDCCard.m
index 4a3f251..3300790 100644
--- a/components/Cards/src/MDCCard.m
+++ b/components/Cards/src/MDCCard.m
@@ -26,11 +26,12 @@
 static NSString *const MDCCardInkViewKey = @"MDCCardInkViewKey";
 static NSString *const MDCCardShadowColorsKey = @"MDCCardShadowColorsKey";
 static NSString *const MDCCardShadowElevationsKey = @"MDCCardShadowElevationsKey";
+static NSString *const MDCCardIsInteractableKey = @"MDCCardIsInteractableKey";
 
 static const CGFloat MDCCardShadowElevationNormal = 1.f;
 static const CGFloat MDCCardShadowElevationHighlighted = 8.f;
 static const CGFloat MDCCardCornerRadiusDefault = 4.f;
-
+static const BOOL MDCCardIsInteractableDefault = YES;
 
 @interface MDCCard ()
 @property(nonatomic, readonly, strong) MDCShapedShadowLayer *layer;
@@ -72,6 +73,11 @@
       [self.layer setShapedBackgroundColor:[coder decodeObjectOfClass:[UIColor class]
                                                                forKey:MDCCardBackgroundColorsKey]];
     }
+    if ([coder containsValueForKey:MDCCardIsInteractableKey]) {
+      _interactable = [coder decodeBoolForKey:MDCCardIsInteractableKey];
+    } else {
+      _interactable = MDCCardIsInteractableDefault;
+    }
     [self commonMDCCardInit];
   }
   return self;
@@ -81,6 +87,7 @@
   self = [super initWithFrame:frame];
   if (self) {
     self.layer.cornerRadius = MDCCardCornerRadiusDefault;
+    _interactable = MDCCardIsInteractableDefault;
     [self commonMDCCardInit];
   }
   return self;
@@ -135,6 +142,7 @@
   [coder encodeObject:_inkView forKey:MDCCardInkViewKey];
   [coder encodeDouble:self.layer.cornerRadius forKey:MDCCardCornerRadiusKey];
   [coder encodeObject:self.layer.shapedBackgroundColor forKey:MDCCardBackgroundColorsKey];
+  [coder encodeBool:_interactable forKey:MDCCardIsInteractableKey];
 }
 
 - (void)layoutSubviews {
@@ -270,14 +278,16 @@
 }
 
 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
+  UIView *result = [super hitTest:point withEvent:event];
+  if (!_interactable && result == self) {
+    return nil;
+  }
   if (self.layer.shapeGenerator) {
-    if (CGPathContainsPoint(self.layer.shapeLayer.path, nil, point, true)) {
-      return self;
-    } else {
+    if (!CGPathContainsPoint(self.layer.shapeLayer.path, nil, point, true)) {
       return nil;
     }
   }
-  return [super hitTest:point withEvent:event];
+  return result;
 }
 
 - (void)setShapeGenerator:(id<MDCShapeGenerating>)shapeGenerator {
diff --git a/components/Cards/src/MDCCardCollectionCell.h b/components/Cards/src/MDCCardCollectionCell.h
index 86449ff..96e9c99 100644
--- a/components/Cards/src/MDCCardCollectionCell.h
+++ b/components/Cards/src/MDCCardCollectionCell.h
@@ -90,6 +90,20 @@
  */
 @property(nonatomic, readonly, strong, nonnull) MDCInkView *inkView;
 
+/**
+ This property defines if a card as a whole should be interactable or not.
+ What this means is that when isInteractable is set to NO, there will be no ink ripple and
+ no change in shadow elevation when tapped or selected. Also the card container itself will not be
+ tappable, but any of its subviews will still be tappable.
+
+ Default is set to YES.
+
+ Important: Our specification for cards explicitly define a card as being an interactable component.
+ Therefore, this property should be set to NO *only if* there are other interactable items within
+ the card's content, such as buttons or other tappable controls.
+ */
+@property (nonatomic, getter=isInteractable) IBInspectable BOOL interactable;
+
 /*
  The shape generator used to define the card cell's shape.
  When set, layer properties such as cornerRadius and other layer properties are nullified/zeroed.
diff --git a/components/Cards/src/MDCCardCollectionCell.m b/components/Cards/src/MDCCardCollectionCell.m
index 54294d7..7e78f77 100644
--- a/components/Cards/src/MDCCardCollectionCell.m
+++ b/components/Cards/src/MDCCardCollectionCell.m
@@ -36,13 +36,14 @@
 static NSString *const MDCCardCellStateKey = @"MDCCardCellStateKey";
 static NSString *const MDCCardCellVerticalImageAlignmentsKey =
     @"MDCCardCellVerticalImageAlignmentsKey";
+static NSString *const MDCCardCellIsInteractableKey = @"MDCCardCellIsInteractableKey";
 
 static const CGFloat MDCCardCellCornerRadiusDefault = 4.f;
 static const CGFloat MDCCardCellSelectedImagePadding = 8;
 static const CGFloat MDCCardCellShadowElevationHighlighted = 8.f;
 static const CGFloat MDCCardCellShadowElevationNormal = 1.f;
 static const CGFloat MDCCardCellShadowElevationSelected = 8.f;
-
+static const BOOL MDCCardCellIsInteractableDefault = YES;
 
 @interface MDCCardCollectionCell ()
 @property(nonatomic, strong, nullable) UIImageView *selectedImageView;
@@ -103,6 +104,11 @@
           [coder decodeObjectOfClass:[UIColor class]
                               forKey:MDCCardCellBackgroundColorsKey]];
     }
+    if ([coder containsValueForKey:MDCCardCellIsInteractableKey]) {
+      _interactable = [coder decodeBoolForKey:MDCCardCellIsInteractableKey];
+    } else {
+      _interactable = MDCCardCellIsInteractableDefault;
+    }
     [self commonMDCCardCollectionCellInit];
   }
   return self;
@@ -112,6 +118,7 @@
   self = [super initWithFrame:frame];
   if (self) {
     self.layer.cornerRadius = MDCCardCellCornerRadiusDefault;
+    _interactable = MDCCardCellIsInteractableDefault;
     [self commonMDCCardCollectionCellInit];
   }
   return self;
@@ -207,6 +214,7 @@
   [coder encodeObject:_verticalImageAlignments forKey:MDCCardCellVerticalImageAlignmentsKey];
   [coder encodeObject:_imageTintColors forKey:MDCCardCellImageTintColorsKey];
   [coder encodeObject:self.layer.shapedBackgroundColor forKey:MDCCardCellBackgroundColorsKey];
+  [coder encodeBool:_interactable forKey:MDCCardCellIsInteractableKey];
 }
 
 - (void)layoutSubviews {
@@ -537,6 +545,14 @@
 
 #pragma mark - UIResponder
 
+- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
+  UIView *result = [super hitTest:point withEvent:event];
+  if (!_interactable && (result == self.contentView || result == self)) {
+    return nil;
+  }
+  return result;
+}
+
 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
   [super touchesBegan:touches withEvent:event];
 
diff --git a/components/Cards/tests/unit/MDCCardTests.m b/components/Cards/tests/unit/MDCCardTests.m
index 63dd62d..12f5dc7 100644
--- a/components/Cards/tests/unit/MDCCardTests.m
+++ b/components/Cards/tests/unit/MDCCardTests.m
@@ -103,6 +103,18 @@
   XCTAssertEqual(self.card.inkView.layer.sublayers.count, 2U);
 }
 
+- (void)testCardInteractabilityToggle {
+  self.card.interactable = NO;
+  self.card.frame = CGRectMake(0, 0, 1000, 1000);
+  NSMutableArray *touchArray = [NSMutableArray new];
+  [touchArray addObject:[UITouch new]];
+  NSSet *touches = [[NSSet alloc] init];
+  [touches setByAddingObjectsFromArray:touchArray];
+  UIEvent *event = [[UIEvent alloc] init];
+  UIView *view = [self.card hitTest:self.card.center withEvent:event];
+  XCTAssertNil(view);
+}
+
 - (void)testCardEncoding {
   self.card.cornerRadius = 7.5f;
   self.card.bounds = CGRectMake(1, 2, 3, 4);
@@ -114,6 +126,7 @@
   [self.card setShadowColor:[UIColor greenColor] forState:UIControlStateHighlighted];
   [self.card setBorderColor:[UIColor redColor] forState:UIControlStateNormal];
   [self.card setBorderColor:[UIColor greenColor] forState:UIControlStateHighlighted];
+  self.card.interactable = NO;
 
   NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.card];
   MDCCard *unarchivedCard = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
@@ -146,6 +159,7 @@
                  [self.card borderWidthForState:UIControlStateHighlighted]);
   XCTAssertNotNil(unarchivedCard.inkView);
   XCTAssertEqual(unarchivedCard.subviews.count, self.card.subviews.count);
+  XCTAssertEqual(unarchivedCard.isInteractable, NO);
 }
 
 - (void)testCellSelectAndUnselect {
@@ -177,6 +191,18 @@
   XCTAssertEqual(self.cell.inkView.layer.sublayers.count, 1U);
 }
 
+- (void)testCellInteractabilityToggle {
+  self.cell.interactable = NO;
+  self.cell.frame = CGRectMake(0, 0, 1000, 1000);
+  NSMutableArray *touchArray = [NSMutableArray new];
+  [touchArray addObject:[UITouch new]];
+  NSSet *touches = [[NSSet alloc] init];
+  [touches setByAddingObjectsFromArray:touchArray];
+  UIEvent *event = [[UIEvent alloc] init];
+  UIView *view = [self.cell hitTest:self.cell.center withEvent:event];
+  XCTAssertNil(view);
+}
+
 - (void)testCellLongPress {
   NSMutableArray *touchArray = [NSMutableArray new];
   [touchArray addObject:[UITouch new]];
@@ -411,6 +437,7 @@
   [self.cell setBorderColor:[UIColor redColor] forState:MDCCardCellStateNormal];
   [self.cell setBorderColor:[UIColor greenColor] forState:MDCCardCellStateHighlighted];
   [self.cell setBorderColor:[UIColor blueColor] forState:MDCCardCellStateSelected];
+  self.cell.interactable = NO;
 
   NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.cell];
   MDCCardCollectionCell *unarchivedCell = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
@@ -481,6 +508,7 @@
                  [self.cell verticalImageAlignmentForState:MDCCardCellStateHighlighted]);
   XCTAssertEqual([unarchivedCell verticalImageAlignmentForState:MDCCardCellStateSelected],
                  [self.cell verticalImageAlignmentForState:MDCCardCellStateSelected]);
+  XCTAssertEqual(unarchivedCell.isInteractable, NO);
 }
 
 @end
diff --git a/components/Chips/examples/ChipsChoiceExampleViewController.m b/components/Chips/examples/ChipsChoiceExampleViewController.m
index 9d0051e..f8611ca 100644
--- a/components/Chips/examples/ChipsChoiceExampleViewController.m
+++ b/components/Chips/examples/ChipsChoiceExampleViewController.m
@@ -19,10 +19,12 @@
 #import "MaterialChips.h"
 #import "MaterialChips+ChipThemer.h"
 
-@implementation ChipsChoiceExampleViewController {
-  MDCChipView *_sizingChip;
-  BOOL _isOutlined;
-}
+@interface ChipsChoiceExampleViewController ()
+@property(nonatomic, strong) MDCChipView *sizingChip;
+@property(nonatomic, assign, getter=isOutlined) BOOL outlined;
+@end
+
+@implementation ChipsChoiceExampleViewController
 
 - (id)init {
   self = [super init];
@@ -62,7 +64,7 @@
 - (void)viewDidLoad {
   [super viewDidLoad];
 
-  _isOutlined = NO;
+  self.outlined = NO;
   self.navigationItem.rightBarButtonItem =
       [[UIBarButtonItem alloc] initWithTitle:@"Outlined Style"
                                        style:UIBarButtonItemStylePlain
@@ -72,8 +74,8 @@
 
 
 - (void)switchStyle {
-  _isOutlined = !_isOutlined;
-  NSString *buttonTitle = _isOutlined ? @"Filled Style" : @"Outlined Style";
+  self.outlined = !self.isOutlined;
+  NSString *buttonTitle = self.isOutlined ? @"Filled Style" : @"Outlined Style";
   [self.navigationItem.rightBarButtonItem setTitle:buttonTitle];
   NSArray *indexPaths = [_collectionView indexPathsForSelectedItems];
   [_collectionView reloadData];
@@ -90,7 +92,6 @@
   _collectionView.frame = self.view.bounds;
 }
 
-
 - (NSInteger)collectionView:(UICollectionView *)collectionView
      numberOfItemsInSection:(NSInteger)section {
   return self.titles.count;
@@ -104,14 +105,13 @@
 
   // Customize Chip
   chipView.titleLabel.text = self.titles[indexPath.row];
-  if (indexPath.row == 2) {
-    [chipView setEnabled:NO];
-  }
-  
+  chipView.enabled = indexPath.row != 2;
+  cell.userInteractionEnabled = indexPath.row != 2;
+
   MDCChipViewScheme *scheme = [[MDCChipViewScheme alloc] init];
   scheme.colorScheme = self.colorScheme;
   
-  if (_isOutlined) {
+  if (self.isOutlined) {
     [MDCChipViewThemer applyOutlinedVariantWithScheme:scheme toChipView:chipView];
   } else {
     [MDCChipViewThemer applyScheme:scheme toChipView:chipView];
@@ -125,8 +125,8 @@
   sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
 
   // The size of the chip depends on title here.
-  _sizingChip.titleLabel.text = self.titles[indexPath.row];
-  return [_sizingChip sizeThatFits:collectionView.bounds.size];
+  self.sizingChip.titleLabel.text = self.titles[indexPath.row];
+  return [self.sizingChip sizeThatFits:collectionView.bounds.size];
 }
 
 - (NSArray *)titles {
diff --git a/components/Chips/examples/ChipsShapingExampleViewController.m b/components/Chips/examples/ChipsShapingExampleViewController.m
new file mode 100644
index 0000000..58449bb
--- /dev/null
+++ b/components/Chips/examples/ChipsShapingExampleViewController.m
@@ -0,0 +1,133 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import "ChipsExamplesSupplemental.h"
+
+#import "MaterialChips.h"
+#import "MaterialChips+ChipThemer.h"
+#import "MaterialSlider.h"
+#import "MaterialSlider+ColorThemer.h"
+#import "MaterialShapes.h"
+#import "MaterialShapeLibrary.h"
+
+@interface ChipsShapingExampleViewController()
+@property(nonatomic, strong) MDCSemanticColorScheme *colorScheme;
+@property(nonatomic, strong) MDCTypographyScheme *typographyScheme;
+@end
+
+@implementation ChipsShapingExampleViewController {
+  MDCChipView *_chipView;
+  MDCSlider *_cornerSlider;
+  MDCRectangleShapeGenerator *_rectangleShapeGenerator;
+  UISegmentedControl *_cornerStyleControl;
+}
+
+- (id)init {
+  self = [super init];
+  if (self) {
+    _colorScheme = [[MDCSemanticColorScheme alloc] init];
+    _typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  self.view.backgroundColor = [UIColor whiteColor];
+
+  _rectangleShapeGenerator = [[MDCRectangleShapeGenerator alloc] init];
+
+  _chipView = [[MDCChipView alloc] init];
+  _chipView.titleLabel.text = @"Material";
+  _chipView.imageView.image = [self faceImage];
+  _chipView.accessoryView = [self deleteButton];
+  _chipView.imagePadding = UIEdgeInsetsMake(0, 10.f, 0, 0);
+  _chipView.accessoryPadding = UIEdgeInsetsMake(0, 0, 0, 10.f);
+  CGSize chipSize = [_chipView sizeThatFits:self.view.bounds.size];
+  _chipView.frame = CGRectMake(20, 20, chipSize.width + 20, chipSize.height + 20);
+  _chipView.shapeGenerator = _rectangleShapeGenerator;
+
+  MDCChipViewScheme *chipScheme = [[MDCChipViewScheme alloc] init];
+  chipScheme.colorScheme = _colorScheme;
+  chipScheme.typographyScheme = _typographyScheme;
+  [MDCChipViewThemer applyScheme:chipScheme toChipView:_chipView];
+  [self.view addSubview:_chipView];
+
+  _cornerSlider = [[MDCSlider alloc] initWithFrame:CGRectZero];
+  _cornerSlider.maximumValue =
+      MIN(CGRectGetWidth(_chipView.bounds), CGRectGetHeight(_chipView.bounds)) / 2;
+  _cornerSlider.value = _cornerSlider.maximumValue / 2;
+  [_cornerSlider addTarget:self
+                    action:@selector(cornerSliderChanged:)
+          forControlEvents:UIControlEventValueChanged];
+  [MDCSliderColorThemer applySemanticColorScheme:_colorScheme toSlider:_cornerSlider];
+  [self.view addSubview:_cornerSlider];
+
+  _cornerStyleControl = [[UISegmentedControl alloc] initWithItems:@[ @"Rounded", @"Cut", @"None" ]];
+  _cornerStyleControl.selectedSegmentIndex = 0;
+  [_cornerStyleControl addTarget:self
+                          action:@selector(cornerStyleChanged:)
+                forControlEvents:UIControlEventValueChanged];
+  [self.view addSubview:_cornerStyleControl];
+}
+
+- (void)viewWillLayoutSubviews {
+  [super viewWillLayoutSubviews];
+
+  CGSize sliderSize = [_cornerSlider sizeThatFits:self.view.bounds.size];
+  _cornerSlider.frame = CGRectMake(20, 140, self.view.bounds.size.width - 40, sliderSize.height);
+  _cornerSlider.frame =
+      CGRectMake(20,
+                 140 + sliderSize.height + 20,
+                 self.view.bounds.size.width - 40,
+                 sliderSize.height);
+  _cornerStyleControl.frame =
+      CGRectMake(20,
+                 CGRectGetMaxY(_cornerSlider.frame) + 20,
+                 self.view.bounds.size.width - 40,
+                 _cornerStyleControl.frame.size.height);
+
+  [self cornerSliderChanged:_cornerSlider];
+}
+
+- (void)cornerSliderChanged:(MDCSlider *)slider {
+  if (_cornerStyleControl.selectedSegmentIndex == 0) {
+    // Rounded
+    MDCRoundedCornerTreatment *roundedCorners =
+        [[MDCRoundedCornerTreatment alloc] initWithRadius:slider.value];
+    [_rectangleShapeGenerator setCorners:roundedCorners];
+  } else if (_cornerStyleControl.selectedSegmentIndex == 1) {
+    // Cut
+    MDCCutCornerTreatment *cutCorners = [[MDCCutCornerTreatment alloc] initWithCut:slider.value];
+    [_rectangleShapeGenerator setCorners:cutCorners];
+  }
+  [_chipView setNeedsLayout];
+}
+
+- (void)cornerStyleChanged:(UISegmentedControl *)segmentedControl {
+  if (segmentedControl.selectedSegmentIndex == 2) {
+    _chipView.shapeGenerator = nil;
+    _cornerSlider.hidden = YES;
+  } else {
+    _chipView.shapeGenerator = _rectangleShapeGenerator;
+    _cornerSlider.hidden = NO;
+  }
+  _cornerSlider.value = _cornerSlider.maximumValue / 2;
+  [self cornerSliderChanged:_cornerSlider];
+}
+
+@end
diff --git a/components/Chips/examples/supplemental/ChipsExamplesSupplemental.h b/components/Chips/examples/supplemental/ChipsExamplesSupplemental.h
index 0eddda3..a086b1b 100644
--- a/components/Chips/examples/supplemental/ChipsExamplesSupplemental.h
+++ b/components/Chips/examples/supplemental/ChipsExamplesSupplemental.h
@@ -89,6 +89,14 @@
 - (UIImage *)doneImage;
 @end
 
+@interface ChipsShapingExampleViewController : UIViewController
+@end
+
+@interface ChipsShapingExampleViewController (Supplemental)
+- (UIImage *)faceImage;
+- (UIButton *)deleteButton;
+@end
+
 @interface ChipModel : NSObject
 @property(nonatomic, strong) NSString *title;
 @property(nonatomic, assign) BOOL showProfilePic;
diff --git a/components/Chips/examples/supplemental/ChipsExamplesSupplemental.m b/components/Chips/examples/supplemental/ChipsExamplesSupplemental.m
index 12b761f..2689c9e 100644
--- a/components/Chips/examples/supplemental/ChipsExamplesSupplemental.m
+++ b/components/Chips/examples/supplemental/ChipsExamplesSupplemental.m
@@ -253,6 +253,30 @@
 
 @end
 
+@implementation ChipsShapingExampleViewController (Supplemental)
+
++ (NSArray *)catalogBreadcrumbs {
+  return @[ @"Chips", @"Shaped Chip" ];
+}
+
++ (BOOL)catalogIsPrimaryDemo {
+  return NO;
+}
+
+- (UIImage *)faceImage {
+  return FaceImage();
+}
+
+- (UIButton *)deleteButton {
+  return DeleteButton();
+}
+
++ (BOOL)catalogIsPresentable {
+  return NO;
+}
+
+@end
+
 @implementation ChipModel
 
 - (void)apply:(MDCChipView *)chipView {
diff --git a/components/Chips/src/MDCChipView.m b/components/Chips/src/MDCChipView.m
index f37fa2f..3800bb0 100644
--- a/components/Chips/src/MDCChipView.m
+++ b/components/Chips/src/MDCChipView.m
@@ -318,6 +318,11 @@
   if (shapeGenerator) {
     self.layer.cornerRadius = 0;
     self.layer.shadowPath = nil;
+  } else {
+    CGFloat cornerRadius = MIN(CGRectGetHeight(self.frame), CGRectGetWidth(self.frame)) / 2;
+    self.layer.cornerRadius = cornerRadius;
+    self.layer.shadowPath =
+        [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:cornerRadius].CGPath;
   }
 
   self.layer.shapeGenerator = shapeGenerator;
diff --git a/components/FeatureHighlight/examples/FeatureHightlightTypicalUseViewController.swift b/components/FeatureHighlight/examples/FeatureHightlightTypicalUseViewController.swift
new file mode 100644
index 0000000..f373f5a
--- /dev/null
+++ b/components/FeatureHighlight/examples/FeatureHightlightTypicalUseViewController.swift
@@ -0,0 +1,75 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import MaterialComponents
+
+/// Example to show how to use a feature highlight
+class FeatureHighlightSwiftViewController: UIViewController {
+
+  let showButton = MDCButton()
+  let featureButton = MDCButton()
+  var colorScheme = MDCSemanticColorScheme()
+  var typographyScheme = MDCTypographyScheme()
+  let buttonScheme = MDCButtonScheme()
+
+  override func viewDidLoad() {
+    super.viewDidLoad()
+    colorScheme.backgroundColor = .white
+    view.backgroundColor = colorScheme.backgroundColor
+
+    showButton.setTitle("Show Feature Highlight", for: .normal)
+    showButton.addTarget(self, action: #selector(showFeatureHighlight), for: .touchUpInside)
+    MDCContainedButtonThemer.applyScheme(buttonScheme, to: showButton)
+    self.view.addSubview(showButton)
+
+    featureButton.setTitle("Feature", for: .normal)
+    MDCContainedButtonThemer.applyScheme(buttonScheme, to: featureButton)
+    self.view.addSubview(featureButton)
+  }
+
+  override func viewDidLayoutSubviews() {
+    super.viewDidLayoutSubviews()
+    showButton.sizeToFit()
+    showButton.frame.origin.y =
+      view.bounds.height - (showButton.frame.height + 60)
+    showButton.frame.origin.x = view.center.x - showButton.frame.width / 2
+
+    featureButton.sizeToFit()
+    featureButton.frame.origin.x = view.center.x - featureButton.frame.width / 2
+    featureButton.frame.origin.y = view.bounds.height / 2 - featureButton.frame.height / 2
+  }
+
+  func showFeatureHighlight() {
+    let vc = MDCFeatureHighlightViewController(highlightedView: featureButton,
+                                               completion: nil)
+    MDCFeatureHighlightColorThemer.applySemanticColorScheme(colorScheme, to: vc)
+    MDCFeatureHighlightTypographyThemer.applyTypographyScheme(typographyScheme, to: vc)
+    vc.mdc_adjustsFontForContentSizeCategory = true
+    vc.titleText = "Hey this is a title for the Feature Highlight"
+    vc.bodyText = "This is the description of the feature highlight view controller"
+    self.present(vc, animated: true, completion: nil)
+  }
+}
+
+extension FeatureHighlightSwiftViewController {
+  class func catalogBreadcrumbs() -> [String] {
+    return ["Feature Highlight", "Feature Highlight (Swift)"]
+  }
+
+  class func catalogIsPrimaryDemo() -> Bool {
+    return false
+  }
+}
diff --git a/components/FlexibleHeader/src/MDCFlexibleHeaderView.m b/components/FlexibleHeader/src/MDCFlexibleHeaderView.m
index 0881aaa..feb5b5e 100644
--- a/components/FlexibleHeader/src/MDCFlexibleHeaderView.m
+++ b/components/FlexibleHeader/src/MDCFlexibleHeaderView.m
@@ -191,12 +191,14 @@
 @synthesize sharedWithManyScrollViews = _sharedWithManyScrollViews;
 @synthesize visibleShadowOpacity = _visibleShadowOpacity;
 
-#if DEBUG
 - (void)dealloc {
+#if DEBUG
   [_trackingScrollView.panGestureRecognizer removeTarget:self
                                                   action:@selector(fhv_scrollViewDidPan:)];
-}
 #endif
+  [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
 
 - (instancetype)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
@@ -352,6 +354,11 @@
   self.layer.shadowOffset = CGSizeMake(0, 1);
   self.layer.shadowRadius = 4.f;
   self.layer.shadowOpacity = 0;
+
+  [[NSNotificationCenter defaultCenter] addObserver:self
+                                           selector:@selector(fhv_updateLayout)
+                                               name:UIAccessibilityVoiceOverStatusChanged
+                                             object:nil];
 }
 
 - (void)setVisibleShadowOpacity:(float)visibleShadowOpacity {
@@ -1004,7 +1011,7 @@
 
   CGRect bounds = self.bounds;
 
-  if (_canOverExtend) {
+  if (_canOverExtend && !UIAccessibilityIsVoiceOverRunning()) {
     bounds.size.height = MAX(self.computedMinimumHeight, headerHeight);
 
   } else {
@@ -1069,11 +1076,28 @@
   // header other than as a subview to the scroll view. This is the most common case to which the
   // following logic has been written.
   if (self.superview == self.trackingScrollView) {
-    self.transform = CGAffineTransformMakeTranslation(0, self.trackingScrollView.contentOffset.y);
-
     if (self.superview.subviews.lastObject != self) {
       [self.superview bringSubviewToFront:self];
     }
+
+    if (UIAccessibilityIsVoiceOverRunning()) {
+      // Clamp the offset to at least -self.maximumHeight. Accessibility may attempt to scroll to
+      // a lesser offset than this to pull the flexible header into the center of the scrollview on
+      // focusing.
+      CGPoint offset = self.trackingScrollView.contentOffset;
+      offset.y = MAX(offset.y, -self.maximumHeight);
+      self.trackingScrollView.contentOffset = offset;
+      // Setting the transform on the same run loop as the accessibility scroll can cause additional
+      // incorrect scrolling as the scrollview attempts to resolve to a position that will place
+      // the header in the center of the scroll. Punting to the next loop prevents this.
+      dispatch_async(dispatch_get_main_queue(), ^{
+        self.transform =
+            CGAffineTransformMakeTranslation(0, self.trackingScrollView.contentOffset.y);
+        [self fhv_updateLayout];
+      });
+    } else {
+      self.transform = CGAffineTransformMakeTranslation(0, self.trackingScrollView.contentOffset.y);
+    }
   }
 
   // While the interface orientation is rotating we don't respond to any adjustments to the content
diff --git a/components/LibraryInfo/src/MDCLibraryInfo.m b/components/LibraryInfo/src/MDCLibraryInfo.m
index fd8a2aa..0a2139c 100644
--- a/components/LibraryInfo/src/MDCLibraryInfo.m
+++ b/components/LibraryInfo/src/MDCLibraryInfo.m
@@ -21,7 +21,7 @@
 // This string is updated automatically as a part of the release process and should not be edited
 // manually. Do not rename this constant or change the formatting without updating the release
 // scripts.
-static NSString const *MDCLibraryInfoVersionString = @"56.0.0";
+static NSString const *MDCLibraryInfoVersionString = @"57.0.0";
 
 @implementation MDCLibraryInfo
 
diff --git a/components/LibraryInfo/tests/unit/LibraryInfoTests.swift b/components/LibraryInfo/tests/unit/LibraryInfoTests.swift
index f0ae9f9..5565d62 100644
--- a/components/LibraryInfo/tests/unit/LibraryInfoTests.swift
+++ b/components/LibraryInfo/tests/unit/LibraryInfoTests.swift
@@ -23,7 +23,7 @@
     // Given
 
     // This regex pattern does the following:
-    // Accept: "56.0.0", etc.
+    // Accept: "57.0.0", etc.
     // Reject: "0.0.0", "1.2", "1", "-1.2.3", "Hi, I'm a version 1.2.3", "1.2.3 is my version", etc.
     //
     // Note the major version must be >= 1 since "0.0.0" is used as the version when something goes
diff --git a/components/List/BUILD b/components/List/BUILD
new file mode 100644
index 0000000..ca0fcf7
--- /dev/null
+++ b/components/List/BUILD
@@ -0,0 +1,31 @@
+# Copyright 2018-present The Material Components for iOS Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+load("//:material_components_ios.bzl",
+     "mdc_public_objc_library")
+
+licenses(["notice"])  # Apache 2.0
+
+mdc_public_objc_library(
+    name = "List",
+    sdk_frameworks = [
+        "CoreGraphics",
+        "UIKit",
+    ],
+    deps = [
+        "//components/Ink",
+        "//components/ShadowLayer",
+        "//components/ShadowElevations",
+    ],
+)
diff --git a/components/List/README.md b/components/List/README.md
index e972df7..314876e 100644
--- a/components/List/README.md
+++ b/components/List/README.md
@@ -1,13 +1,18 @@
-# Lists
+# List
 
-Material Design lists are a continuous group of text or images. They are composed of items containing primary and supplemental actions, which are represented by icons and text.
+Material Design Lists are a continuous group of text or images. The elements comprising Lists are referred to as List Items. The MDCBaseCell is a List Item at its simplest--a basic UICollectionViewCell subclass with Material Ink Ripple and Elevation.
 
-## Status
+## Description
 
-The [Lists component](https://material.io/go/design-lists) is yet to be completed, please follow the [tracking issue](https://www.pivotaltracker.com/epic/show/3950586) for more information.
+The [Material guidelines](https://material.io/go/design-lists) for Lists are extensive, and there is no class at this time for implementing any one of them, let alone all of them. However, the MDCBaseCell provides a starting point to build anything the guidelines provide.
 
-In the meanwhile, we are offering an example on how to implement a list cell that is self-sizing, supports dynamic type, and right-to-left using pure UIKit classes. 
-We will walk through the example and discuss things needed to achieve a list cell implementation of your own.
+To build a List using the MDCBaseCell simply treat it like you would any other UICollectionViewCell.
+
+The MDCBaseCell has two configurable properties--Ink Ripple color (`currentInkColor`) and Elevation (`elevation`).
+
+Below is an example:
+
+![MDCBaseCell Example](https://user-images.githubusercontent.com/8020010/42164205-3a7f699a-7dfd-11e8-9109-a7a6040996db.gif)
 
 ## Example Walkthrough / How to implement your own List Cell
 
@@ -217,4 +222,4 @@
 ```objc
 _titleLabel.autoresizingMask =
     MDFTrailingMarginAutoresizingMaskForLayoutDirection(self.mdf_effectiveUserInterfaceLayoutDirection);
-``` 
\ No newline at end of file
+``` 
diff --git a/components/List/docs/assets/mdcbaselistcellexample.gif b/components/List/docs/assets/mdcbaselistcellexample.gif
new file mode 100644
index 0000000..e5fa40a
--- /dev/null
+++ b/components/List/docs/assets/mdcbaselistcellexample.gif
Binary files differ
diff --git a/components/List/examples/BaseCellExample.swift b/components/List/examples/BaseCellExample.swift
new file mode 100644
index 0000000..492f492
--- /dev/null
+++ b/components/List/examples/BaseCellExample.swift
@@ -0,0 +1,136 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+import Foundation
+
+class BaseCellExample : UIViewController {
+  private let arbitraryCellHeight: CGFloat = 75
+  fileprivate let baseCellIdentifier: String = "baseCellIdentifier"
+  fileprivate let numberOfCells: Int = 100
+
+  private lazy var collectionView: UICollectionView = {
+    return UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
+  }()
+
+  private var collectionViewLayout: UICollectionViewFlowLayout {
+    return collectionView.collectionViewLayout as! UICollectionViewFlowLayout
+  }
+
+  private var collectionViewEstimatedCellSize: CGSize {
+    return CGSize(width: collectionView.bounds.size.width - 20,
+                  height: arbitraryCellHeight)
+  }
+
+  override func viewDidLoad() {
+    super.viewDidLoad()
+    parent?.automaticallyAdjustsScrollViewInsets = false
+    automaticallyAdjustsScrollViewInsets = false
+    setUpCollectionView()
+  }
+
+  override func viewWillLayoutSubviews() {
+    super.viewWillLayoutSubviews()
+    positionCollectionView()
+  }
+
+  func setUpCollectionView() {
+    collectionViewLayout.estimatedItemSize = collectionViewEstimatedCellSize
+    collectionViewLayout.minimumInteritemSpacing = 5
+    collectionViewLayout.minimumLineSpacing = 5
+    collectionView.backgroundColor = .white
+    collectionView.register(MDCBaseCell.self, forCellWithReuseIdentifier: baseCellIdentifier)
+    collectionView.delegate = self
+    collectionView.dataSource = self
+    view.addSubview(collectionView)
+  }
+
+  func positionCollectionView() {
+    var originX = view.bounds.origin.x
+    var originY = view.bounds.origin.y
+    var width = view.bounds.size.width
+    var height = view.bounds.size.height
+
+    #if swift(>=3.2)
+    if #available(iOS 11.0, *) {
+      originX += view.safeAreaInsets.left
+      originY += view.safeAreaInsets.top
+      width -= (view.safeAreaInsets.left + view.safeAreaInsets.right)
+      height -= (view.safeAreaInsets.top + view.safeAreaInsets.bottom)
+    }
+    #endif
+
+    let frame = CGRect(x: originX, y: originY, width: width, height: height);
+    collectionView.frame = frame
+    collectionViewLayout.estimatedItemSize = collectionViewEstimatedCellSize
+    collectionViewLayout.invalidateLayout()
+    collectionView.reloadData()
+  }
+}
+
+extension BaseCellExample: UICollectionViewDelegate {
+  func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
+    guard let cell = collectionView.cellForItem(at: indexPath) as? MDCBaseCell else { fatalError() }
+    cell.elevation = ShadowElevation(rawValue: 10)
+  }
+
+  func collectionView(_ collectionView: UICollectionView,
+                      didUnhighlightItemAt indexPath: IndexPath) {
+    guard let cell = collectionView.cellForItem(at: indexPath) as? MDCBaseCell else { fatalError() }
+    cell.elevation = ShadowElevation(rawValue: 0)
+  }
+}
+
+extension BaseCellExample: UICollectionViewDataSource {
+  func numberOfSections(in collectionView: UICollectionView) -> Int {
+    return 1
+  }
+
+  func collectionView(_ collectionView: UICollectionView,
+                      numberOfItemsInSection section: Int) -> Int {
+    return numberOfCells
+  }
+
+  func collectionView(_ collectionView: UICollectionView,
+                      cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
+    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: baseCellIdentifier,
+                                                        for: indexPath) as? MDCBaseCell
+      else { fatalError() }
+    cell.layer.borderColor = UIColor.darkGray.cgColor
+    cell.layer.borderWidth = 1
+    cell.inkColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1)
+    return cell
+  }
+}
+
+// MARK: Catalog By Convention
+extension BaseCellExample {
+  @objc class func catalogBreadcrumbs() -> [String] {
+    return ["List Items", "MDCBaseCell Example (Swift)"]
+  }
+
+  @objc class func catalogIsPrimaryDemo() -> Bool {
+    return true
+  }
+
+  @objc class func catalogDescription() -> String {
+    return "MDCBaseCell Example (Swift)"
+  }
+
+  @objc class func catalogIsPresentable() -> Bool {
+    return true
+  }
+
+  @objc class func catalogIsDebug() -> Bool {
+    return false
+  }
+}
diff --git a/components/List/examples/MDCBaseCellExample.h b/components/List/examples/MDCBaseCellExample.h
new file mode 100644
index 0000000..99370ea
--- /dev/null
+++ b/components/List/examples/MDCBaseCellExample.h
@@ -0,0 +1,29 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import <UIKit/UIKit.h>
+
+static CGFloat const kArbitraryCellHeight = 75.f;
+static NSString *const kBaseCellIdentifier = @"kBaseCellIdentifier";
+
+@interface MDCBaseCellExample : UIViewController
+@end
+
+@interface MDCBaseCellExample () <UICollectionViewDelegate,
+                                  UICollectionViewDataSource>
+
+@property (strong, nonatomic) UICollectionView *collectionView;
+@property (strong, nonatomic) UICollectionViewFlowLayout *collectionViewLayout;
+@property (nonatomic, assign) NSInteger numberOfCells;
+
+@end
diff --git a/components/List/examples/MDCBaseCellExample.m b/components/List/examples/MDCBaseCellExample.m
new file mode 100644
index 0000000..4ab0878
--- /dev/null
+++ b/components/List/examples/MDCBaseCellExample.m
@@ -0,0 +1,124 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import "MDCBaseCellExample.h"
+
+#import "MDCBaseCell.h"
+
+@implementation MDCBaseCellExample
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.parentViewController.automaticallyAdjustsScrollViewInsets = NO;
+  self.automaticallyAdjustsScrollViewInsets = NO;
+  [self createCollectionView];
+}
+
+-(void)viewWillLayoutSubviews {
+  [super viewWillLayoutSubviews];
+  [self positionCollectionView];
+}
+
+- (void)createCollectionView {
+  self.collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
+  self.collectionViewLayout.estimatedItemSize =
+      CGSizeMake(self.collectionView.bounds.size.width - 20, kArbitraryCellHeight);
+  self.collectionViewLayout.minimumInteritemSpacing = 5;
+  self.collectionViewLayout.minimumLineSpacing = 5;
+  self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds
+                                           collectionViewLayout:self.collectionViewLayout];
+  self.collectionView.backgroundColor = [UIColor whiteColor];
+  [self.collectionView registerClass:[MDCBaseCell class]
+          forCellWithReuseIdentifier:kBaseCellIdentifier];
+  self.collectionView.delegate = self;
+  self.collectionView.dataSource = self;
+  self.numberOfCells = 100;
+  [self.view addSubview:self.collectionView];
+}
+
+- (void)positionCollectionView {
+  CGFloat originX = self.view.bounds.origin.x;
+  CGFloat originY = self.view.bounds.origin.y;
+  CGFloat width = self.view.bounds.size.width;
+  CGFloat height = self.view.bounds.size.height;
+#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
+  if (@available(iOS 11.0, *)) {
+    originX += self.view.safeAreaInsets.left;
+    originY += self.view.safeAreaInsets.top;
+    width -= (self.view.safeAreaInsets.left + self.view.safeAreaInsets.right);
+    height -= (self.view.safeAreaInsets.top + self.view.safeAreaInsets.bottom);
+  }
+#endif
+  CGRect frame = CGRectMake(originX, originY, width, height);
+  self.collectionView.frame = frame;
+  self.collectionViewLayout.estimatedItemSize =
+      CGSizeMake(self.collectionView.bounds.size.width - 20, kArbitraryCellHeight);
+  [self.collectionViewLayout invalidateLayout];
+  [self.collectionView reloadData];
+}
+
+-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
+  return 1;
+}
+
+-(NSInteger)collectionView:(UICollectionView *)collectionView
+    numberOfItemsInSection:(NSInteger)section {
+  return self.numberOfCells;
+}
+
+-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
+                 cellForItemAtIndexPath:(NSIndexPath *)indexPath {
+  MDCBaseCell *cell =
+      [collectionView dequeueReusableCellWithReuseIdentifier:kBaseCellIdentifier
+                                                forIndexPath:indexPath];
+  cell.layer.borderColor = [UIColor darkGrayColor].CGColor;
+  cell.layer.borderWidth = 1;
+  cell.inkColor = [UIColor colorWithRed:0 green:(CGFloat)0 blue:(CGFloat)0 alpha:(CGFloat)0.1];
+  return cell;
+}
+
+-(void)collectionView:(UICollectionView *)collectionView
+    didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
+  MDCBaseCell *cell = (MDCBaseCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
+  cell.elevation = 10;
+}
+
+-(void)collectionView:(UICollectionView *)collectionView
+    didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
+  MDCBaseCell *cell = (MDCBaseCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
+  cell.elevation = 0;
+}
+
+#pragma mark - CatalogByConvention
+
++ (NSArray *)catalogBreadcrumbs {
+  return @[ @"List Items", @"MDCBaseCell Example" ];
+}
+
++ (BOOL)catalogIsPrimaryDemo {
+  return YES;
+}
+
++ (NSString *)catalogDescription {
+  return @"MDCBaseCell Example";
+}
+
++ (BOOL)catalogIsPresentable {
+  return YES;
+}
+
++ (BOOL)catalogIsDebug {
+  return NO;
+}
+
+@end
diff --git a/components/List/src/MDCBaseCell.h b/components/List/src/MDCBaseCell.h
new file mode 100644
index 0000000..5e2bb63
--- /dev/null
+++ b/components/List/src/MDCBaseCell.h
@@ -0,0 +1,30 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import <UIKit/UIKit.h>
+
+#import "MaterialShadowElevations.h"
+
+@interface MDCBaseCell : UICollectionViewCell
+
+/**
+ The current elevation of the cell.
+ */
+@property (nonatomic, assign) MDCShadowElevation elevation;
+
+/**
+ The color of the cell’s underlying Ripple.
+ */
+@property (nonatomic, strong, nonnull) UIColor *inkColor;
+
+@end
diff --git a/components/List/src/MDCBaseCell.m b/components/List/src/MDCBaseCell.m
new file mode 100644
index 0000000..3f8cc0c
--- /dev/null
+++ b/components/List/src/MDCBaseCell.m
@@ -0,0 +1,178 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import "MDCBaseCell.h"
+
+#import "MaterialInk.h"
+#import "MaterialShadowLayer.h"
+
+static NSString *const MDCListBaseCellInkViewKey = @"MDCListBaseCellInkViewKey";
+static NSString *const MDCListBaseCellCurrentInkColorKey = @"MDCListBaseCellCurrentInkColorKey";
+static NSString *const MDCListBaseCellCurrentElevationKey = @"MDCListBaseCellCurrentElevationKey";
+
+@interface MDCBaseCell ()
+
+@property (nonatomic, assign) CGPoint lastTouch;
+@property (strong, nonatomic, nonnull) MDCInkView *inkView;
+
+@end
+
+@implementation MDCBaseCell
+
+#pragma mark Object Lifecycle
+
+- (instancetype)initWithFrame:(CGRect)frame {
+  self = [super initWithFrame:frame];
+  if (self) {
+    [self commonMDCBaseCellInit];
+  }
+  return self;
+}
+
+- (instancetype)initWithCoder:(NSCoder *)aDecoder {
+  self = [super initWithCoder:aDecoder];
+  if (self) {
+    MDCInkView *decodedInkView = [aDecoder decodeObjectOfClass:[MDCInkView class]
+                                                        forKey:MDCListBaseCellInkViewKey];
+    if (decodedInkView) {
+      self.inkView = decodedInkView;
+    }
+    UIColor *decodedColor = [aDecoder decodeObjectOfClass:[UIColor class]
+                                                   forKey:MDCListBaseCellCurrentInkColorKey];
+    if (decodedColor) {
+      self.inkView.inkColor = decodedColor;
+    }
+    NSNumber *decodedElevation = [aDecoder decodeObjectOfClass:[NSNumber class]
+                                                        forKey:MDCListBaseCellCurrentElevationKey];
+    if (decodedElevation) {
+      self.elevation = (CGFloat)[decodedElevation doubleValue];
+    }
+    [self commonMDCBaseCellInit];
+  }
+  return self;
+}
+
+- (void)encodeWithCoder:(NSCoder *)coder {
+  [super encodeWithCoder:coder];
+  [coder encodeObject:_inkView forKey:MDCListBaseCellInkViewKey];
+  [coder encodeObject:_inkView.inkColor forKey:MDCListBaseCellCurrentInkColorKey];
+  [coder encodeObject:[NSNumber numberWithDouble:(double)_elevation]
+               forKey:MDCListBaseCellCurrentInkColorKey];
+}
+
+#pragma mark Setup
+
+- (void)commonMDCBaseCellInit {
+  if (!self.inkView) {
+    self.inkView = [[MDCInkView alloc] initWithFrame:self.bounds];
+  }
+  _inkView.usesLegacyInkRipple = NO;
+  [self addSubview:_inkView];
+}
+
+#pragma mark Ink
+
+- (void)startInk {
+  [self.inkView startTouchBeganAtPoint:_lastTouch
+                              animated:YES
+                        withCompletion:nil];
+}
+
+- (void)endInk {
+  [self.inkView startTouchEndAtPoint:_lastTouch
+                            animated:YES
+                      withCompletion:nil];
+}
+
+#pragma mark Shadow
+
+- (UIBezierPath *)boundingPath {
+  return [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:self.layer.cornerRadius];
+}
+
+- (void)updateShadowElevation {
+  self.layer.shadowPath = [self boundingPath].CGPath;
+  [self.shadowLayer setElevation:self.elevation];
+}
+
+#pragma mark - UIResponder
+
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
+  [super touchesBegan:touches withEvent:event];
+  UITouch *touch = [touches anyObject];
+  CGPoint location = [touch locationInView:self];
+  self.lastTouch = location;
+  [self startInk];
+}
+
+- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
+  [super touchesEnded:touches withEvent:event];
+  [self endInk];
+}
+
+#pragma mark UIView Overrides
+
++ (Class)layerClass {
+  return [MDCShadowLayer class];
+}
+
+- (void)layoutSubviews {
+  [super layoutSubviews];
+  [self updateShadowElevation];
+  self.inkView.frame = self.bounds;
+}
+
+#pragma mark UICollectionViewCell Overrides
+
+- (void)setHighlighted:(BOOL)highlighted {
+  [super setHighlighted:highlighted];
+  if (!highlighted) {
+    [self endInk];
+  }
+}
+
+- (void)prepareForReuse {
+  [super prepareForReuse];
+  self.elevation = 0;
+  [self.inkView cancelAllAnimationsAnimated:NO];
+}
+
+#pragma mark Accessors
+
+- (void)setElevation:(MDCShadowElevation)elevation {
+  if (elevation == _elevation) {
+    return;
+  }
+  _elevation = elevation;
+  [self updateShadowElevation];
+}
+
+- (void)setInkColor:(UIColor *)inkColor {
+  if ([self.inkColor isEqual:inkColor]) {
+    return;
+  }
+  self.inkView.inkColor = inkColor;
+}
+
+- (UIColor *)inkColor {
+  return self.inkView.inkColor;
+}
+
+- (MDCShadowLayer *)shadowLayer {
+  if ([self.layer isMemberOfClass:[MDCShadowLayer class]]) {
+    return (MDCShadowLayer *)self.layer;
+  }
+  return nil;
+}
+
+@end
diff --git a/components/List/src/MaterialList.h b/components/List/src/MaterialList.h
new file mode 100644
index 0000000..7fb3249
--- /dev/null
+++ b/components/List/src/MaterialList.h
@@ -0,0 +1,17 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import "MDCBaseCell.h"
diff --git a/components/Tabs/examples/TabBarIconExample.m b/components/Tabs/examples/TabBarIconExample.m
index a86e0b6..2676dbf 100644
--- a/components/Tabs/examples/TabBarIconExample.m
+++ b/components/Tabs/examples/TabBarIconExample.m
@@ -106,6 +106,8 @@
       [UIAlertController alertControllerWithTitle:nil
                                           message:nil
                                    preferredStyle:UIAlertControllerStyleActionSheet];
+  sheet.popoverPresentationController.sourceView = self.alignmentButton;
+  sheet.popoverPresentationController.sourceRect = self.alignmentButton.bounds;
   [sheet addAction:[UIAlertAction actionWithTitle:@"Leading"
                                             style:UIAlertActionStyleDefault
                                           handler:^(UIAlertAction *_Nonnull action) {
diff --git a/components/Tabs/examples/TabBarIconExample.swift b/components/Tabs/examples/TabBarIconExample.swift
index 3da1802..eba0713 100644
--- a/components/Tabs/examples/TabBarIconExample.swift
+++ b/components/Tabs/examples/TabBarIconExample.swift
@@ -76,6 +76,8 @@
 
   @objc func changeAlignmentDidTouch(sender: UIButton) {
     let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
+    sheet.popoverPresentationController?.sourceView = self.alignmentButton
+    sheet.popoverPresentationController?.sourceRect = self.alignmentButton.bounds
     sheet.addAction(UIAlertAction(title: "Leading", style: .default, handler: { _ in
       self.alignment = .leading
     }))
diff --git a/components/Tabs/examples/TabBarIndicatorTemplateExample.swift b/components/Tabs/examples/TabBarIndicatorTemplateExample.swift
index eea18e9..0d87695 100644
--- a/components/Tabs/examples/TabBarIndicatorTemplateExample.swift
+++ b/components/Tabs/examples/TabBarIndicatorTemplateExample.swift
@@ -99,6 +99,8 @@
 
   @objc func changeAlignmentDidTouch(sender: UIButton) {
     let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
+    sheet.popoverPresentationController?.sourceView = self.alignmentButton
+    sheet.popoverPresentationController?.sourceRect = self.alignmentButton.bounds
     sheet.addAction(UIAlertAction(title: "Leading", style: .default, handler: { _ in
       self.alignment = .leading
     }))
@@ -116,6 +118,8 @@
 
   @objc func changeAppearance(fromSender sender: UIButton) {
     let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
+    sheet.popoverPresentationController?.sourceView = self.appearanceButton
+    sheet.popoverPresentationController?.sourceRect = self.appearanceButton.bounds
     sheet.addAction(UIAlertAction(title: "Titles", style: .default, handler: { _ in
       self.itemAppearance = .titles
     }))
diff --git a/components/Tabs/examples/TabBarInterfaceBuilderExample.m b/components/Tabs/examples/TabBarInterfaceBuilderExample.m
index b2ee445..d729bc8 100644
--- a/components/Tabs/examples/TabBarInterfaceBuilderExample.m
+++ b/components/Tabs/examples/TabBarInterfaceBuilderExample.m
@@ -72,6 +72,8 @@
       [UIAlertController alertControllerWithTitle:nil
                                           message:nil
                                    preferredStyle:UIAlertControllerStyleActionSheet];
+  sheet.popoverPresentationController.sourceView = sender;
+  sheet.popoverPresentationController.sourceRect = sender.bounds;
   [sheet addAction:[UIAlertAction actionWithTitle:@"Leading"
                                             style:UIAlertActionStyleDefault
                                           handler:^(UIAlertAction *_Nonnull action) {
diff --git a/components/Tabs/examples/TabBarTextOnlyExample.m b/components/Tabs/examples/TabBarTextOnlyExample.m
index 75cb732..b0cf717 100644
--- a/components/Tabs/examples/TabBarTextOnlyExample.m
+++ b/components/Tabs/examples/TabBarTextOnlyExample.m
@@ -81,6 +81,8 @@
       [UIAlertController alertControllerWithTitle:nil
                                           message:nil
                                    preferredStyle:UIAlertControllerStyleActionSheet];
+  sheet.popoverPresentationController.sourceView = (UICollectionViewCell *)sender;
+  sheet.popoverPresentationController.sourceRect = ((UICollectionViewCell *)sender).bounds;
   [sheet addAction:[UIAlertAction actionWithTitle:@"Leading"
                                             style:UIAlertActionStyleDefault
                                           handler:^(UIAlertAction *_Nonnull action) {
@@ -115,7 +117,7 @@
   [super collectionView:collectionView didSelectItemAtIndexPath:indexPath];
   switch (indexPath.row) {
     case 0:
-      [self changeAlignment:collectionView];
+      [self changeAlignment:[collectionView cellForItemAtIndexPath:indexPath]];
       break;
 
     case 1:
diff --git a/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.m b/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.m
index f931c91..9a56623 100644
--- a/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.m
+++ b/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.m
@@ -107,8 +107,6 @@
   [self.appBar addSubviewsToParent];
 
   self.appBar.navigationBar.tintColor = UIColor.whiteColor;
-
-  self.title = @"Tabs With Icons";
 }
 
 - (void)setupScrollView {
@@ -282,7 +280,7 @@
 @implementation TabBarIconExample (CatalogByConvention)
 
 + (NSArray *)catalogBreadcrumbs {
-  return @[ @"Tab Bar", @"Icons and Text" ];
+  return @[ @"Tab Bar", @"Tabs with Icons" ];
 }
 
 + (BOOL)catalogIsPrimaryDemo {
diff --git a/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.swift b/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.swift
index 315c5ad..5628b35 100644
--- a/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.swift
+++ b/components/Tabs/examples/supplemental/TabBarIconExampleSupplemental.swift
@@ -82,8 +82,6 @@
 
     self.navigationItem.rightBarButtonItem = badgeIncrementItem
 
-    self.title = "Tabs With Icons"
-
     setupScrollingContent()
   }
 
@@ -245,7 +243,7 @@
 // MARK: - Catalog by convention
 extension TabBarIconSwiftExample {
   @objc class func catalogBreadcrumbs() -> [String] {
-    return ["Tab Bar", "Icons and Text (Swift)"]
+    return ["Tab Bar", "Tabs with Icons (Swift)"]
   }
 
   @objc class func catalogIsPrimaryDemo() -> Bool {
diff --git a/components/TextFields/examples/TextFieldFilledExample.swift b/components/TextFields/examples/TextFieldFilledExample.swift
index d302a95..2ed2ba4 100644
--- a/components/TextFields/examples/TextFieldFilledExample.swift
+++ b/components/TextFields/examples/TextFieldFilledExample.swift
@@ -121,6 +121,14 @@
     self.navigationItem.rightBarButtonItem = styleButton
   }
 
+  func style(textInputController:MDCTextInputControllerFilled) {
+    MDCFilledTextFieldColorThemer.applySemanticColorScheme(colorScheme, to: textInputController)
+    MDCTextFieldTypographyThemer.applyTypographyScheme(typographyScheme, to: textInputController)
+    if let textInput = textInputController.textInput as? MDCTextInput {
+      MDCTextFieldTypographyThemer.applyTypographyScheme(typographyScheme, to: textInput)
+    }
+  }
+
   func setupTextFields() {
     scrollView.addSubview(name)
     let nameController = MDCTextInputControllerFilled(textInput: name)
@@ -305,11 +313,6 @@
 
     scrollView.layoutMargins = margins
   }
-
-  func style(textInputController : MDCTextInputControllerFilled) {
-    MDCFilledTextFieldColorThemer.applySemanticColorScheme(colorScheme, to: textInputController)
-    MDCTextFieldTypographyThemer.applyTypographyScheme(typographyScheme, to: textInputController)
-  }
   
   func addGestureRecognizer() {
     let tapRecognizer = UITapGestureRecognizer(target: self,
diff --git a/components/TextFields/examples/TextFieldOutlinedExample.m b/components/TextFields/examples/TextFieldOutlinedExample.m
index dedce4d..1040319 100644
--- a/components/TextFields/examples/TextFieldOutlinedExample.m
+++ b/components/TextFields/examples/TextFieldOutlinedExample.m
@@ -15,6 +15,8 @@
  */
 
 #import "MaterialTextFields.h"
+#import "MaterialTextFields+ColorThemer.h"
+#import "MaterialTextFields+TypographyThemer.h"
 
 @interface TextFieldOutlinedObjectiveCExample
     : UIViewController <UITextFieldDelegate, UITextViewDelegate>
@@ -28,6 +30,9 @@
 
 @property(nonatomic) MDCTextInputControllerOutlinedTextArea *messageController;
 
+@property(nonatomic, strong) MDCSemanticColorScheme *colorScheme;
+@property(nonatomic, strong) MDCTypographyScheme *typographyScheme;
+
 @property(nonatomic) UIScrollView *scrollView;
 
 @end
@@ -38,9 +43,26 @@
   [[NSNotificationCenter defaultCenter] removeObserver:self];
 }
 
+- (void)styleTextInputController:(id<MDCTextInputController>)controller {
+  [MDCOutlinedTextFieldColorThemer applySemanticColorScheme:self.colorScheme
+                                      toTextInputController:controller];
+  [MDCTextFieldTypographyThemer applyTypographyScheme:self.typographyScheme
+                                toTextInputController:controller];
+  [MDCTextFieldTypographyThemer applyTypographyScheme:self.typographyScheme
+                                          toTextInput:controller.textInput];
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
-  self.view.backgroundColor = [UIColor whiteColor];
+
+  if (!self.colorScheme) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  if (!self.typographyScheme) {
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+
+  self.view.backgroundColor = self.colorScheme.backgroundColor;
 
   [self registerKeyboardNotifications];
 
@@ -72,6 +94,7 @@
 
   self.nameController = [[MDCTextInputControllerOutlined alloc] initWithTextInput:textFieldName];
   self.nameController.placeholderText = @"Full Name";
+  [self styleTextInputController:self.nameController];
 
   MDCTextField *textFieldAddress = [[MDCTextField alloc] init];
   textFieldAddress.translatesAutoresizingMaskIntoConstraints = NO;
@@ -84,6 +107,7 @@
   self.addressController =
       [[MDCTextInputControllerOutlined alloc] initWithTextInput:textFieldAddress];
   self.addressController.placeholderText = @"Address";
+  [self styleTextInputController:self.addressController];
 
   MDCTextField *textFieldCity = [[MDCTextField alloc] init];
   textFieldCity.translatesAutoresizingMaskIntoConstraints = NO;
@@ -95,6 +119,7 @@
 
   self.cityController = [[MDCTextInputControllerOutlined alloc] initWithTextInput:textFieldCity];
   self.cityController.placeholderText = @"City";
+  [self styleTextInputController:self.cityController];
 
   MDCTextField *textFieldState = [[MDCTextField alloc] init];
   textFieldState.translatesAutoresizingMaskIntoConstraints = NO;
@@ -105,6 +130,7 @@
 
   self.stateController = [[MDCTextInputControllerOutlined alloc] initWithTextInput:textFieldState];
   self.stateController.placeholderText = @"State";
+  [self styleTextInputController:self.stateController];
 
   MDCTextField *textFieldZip = [[MDCTextField alloc] init];
   textFieldZip.translatesAutoresizingMaskIntoConstraints = NO;
@@ -115,6 +141,7 @@
 
   self.zipController = [[MDCTextInputControllerOutlined alloc] initWithTextInput:textFieldZip];
   self.zipController.placeholderText = @"Zip Code";
+  [self styleTextInputController:self.zipController];
 
   UIView *stateZip = [[UIView alloc] initWithFrame:CGRectZero];
   stateZip.translatesAutoresizingMaskIntoConstraints = NO;
@@ -135,6 +162,7 @@
   self.phoneController = [[MDCTextInputControllerOutlined alloc] initWithTextInput:textFieldPhone];
   self.phoneController.placeholderText = @"Phone Number";
   self.phoneController.helperText = @"XXX-XXX-XXXX";
+  [self styleTextInputController:self.phoneController];
 
   MDCMultilineTextField *textFieldMessage = [[MDCMultilineTextField alloc] init];
   textFieldMessage.translatesAutoresizingMaskIntoConstraints = NO;
@@ -147,6 +175,7 @@
   textFieldMessage.text = @"This is where you could put a multi-line message like an email.\n\n"
       "It can even handle new lines.";
   self.messageController.placeholderText = @"Message";
+  [self styleTextInputController:self.messageController];
 
   NSDictionary *views = @{
     @"name" : textFieldName,
diff --git a/components/TextFields/src/ColorThemer/MDCFilledTextFieldColorThemer.m b/components/TextFields/src/ColorThemer/MDCFilledTextFieldColorThemer.m
index 98b362c..6287d2b 100644
--- a/components/TextFields/src/ColorThemer/MDCFilledTextFieldColorThemer.m
+++ b/components/TextFields/src/ColorThemer/MDCFilledTextFieldColorThemer.m
@@ -21,12 +21,12 @@
 static CGFloat const kFilledTextFieldDisabledAlpha = 0.38f;
 static CGFloat const kFilledTextFieldSurfaceOverlayAlpha = 0.04f;
 static CGFloat const kFilledTextFieldIndicatorLineAlpha = 0.42f;
+static CGFloat const kFilledTextFieldIconAlpha = 0.54f;
 
 @implementation MDCFilledTextFieldColorThemer
 
 + (void)applySemanticColorScheme:(nonnull id<MDCColorScheming>)colorScheme
      toTextInputControllerFilled:(nonnull MDCTextInputControllerFilled *)textInputControllerFilled {
-  textInputControllerFilled.backgroundColor = colorScheme.surfaceColor;
   textInputControllerFilled.borderFillColor =
       [colorScheme.onSurfaceColor colorWithAlphaComponent:kFilledTextFieldSurfaceOverlayAlpha];
   textInputControllerFilled.normalColor =
@@ -45,6 +45,8 @@
       [colorScheme.onSurfaceColor colorWithAlphaComponent:kFilledTextFieldOnSurfaceAlpha];
   textInputControllerFilled.floatingPlaceholderActiveColor =
       [colorScheme.primaryColor colorWithAlphaComponent:kFilledTextFieldActiveAlpha];
+  textInputControllerFilled.textInputClearButtonTintColor =
+      [colorScheme.onSurfaceColor colorWithAlphaComponent:kFilledTextFieldIconAlpha];
 }
 
 @end
diff --git a/components/TextFields/src/ColorThemer/MDCOutlinedTextFieldColorThemer.m b/components/TextFields/src/ColorThemer/MDCOutlinedTextFieldColorThemer.m
index 1dc43e1..7708341 100644
--- a/components/TextFields/src/ColorThemer/MDCOutlinedTextFieldColorThemer.m
+++ b/components/TextFields/src/ColorThemer/MDCOutlinedTextFieldColorThemer.m
@@ -15,10 +15,12 @@
  */
 
 #import "MDCOutlinedTextFieldColorThemer.h"
+#import "MDCTextInputControllerBase.h"
 
 static CGFloat const kOutlinedTextFieldActiveAlpha = 0.87f;
 static CGFloat const kOutlinedTextFieldOnSurfaceAlpha = 0.6f;
 static CGFloat const kOutlinedTextFieldDisabledAlpha = 0.38f;
+static CGFloat const kOutlinedTextFieldIconAlpha = 0.54f;
 
 @implementation MDCOutlinedTextFieldColorThemer
 
@@ -37,6 +39,13 @@
   textInputController.disabledColor =
       [colorScheme.onSurfaceColor colorWithAlphaComponent:kOutlinedTextFieldDisabledAlpha];
 
+  if ([textInputController isKindOfClass:[MDCTextInputControllerBase class]]) {
+    MDCTextInputControllerBase *baseController =
+        (MDCTextInputControllerBase *)textInputController;
+    baseController.textInputClearButtonTintColor =
+        [colorScheme.onSurfaceColor colorWithAlphaComponent:kOutlinedTextFieldIconAlpha];
+  }
+
   if ([textInputController
        conformsToProtocol:@protocol(MDCTextInputControllerFloatingPlaceholder)]) {
     id<MDCTextInputControllerFloatingPlaceholder> textInputControllerFloatingPlaceholder =
diff --git a/components/TextFields/src/ColorThemer/MDCTextFieldColorThemer.m b/components/TextFields/src/ColorThemer/MDCTextFieldColorThemer.m
index be79ba3..f0e0354 100644
--- a/components/TextFields/src/ColorThemer/MDCTextFieldColorThemer.m
+++ b/components/TextFields/src/ColorThemer/MDCTextFieldColorThemer.m
@@ -63,7 +63,6 @@
   textInputController.inlinePlaceholderColor = onSurface60Opacity;
   textInputController.trailingUnderlineLabelTextColor = onSurface60Opacity;
   textInputController.leadingUnderlineLabelTextColor = onSurface60Opacity;
-  textInputController.backgroundColor = colorScheme.surfaceColor;
 
   if ([textInputController
           conformsToProtocol:@protocol(MDCTextInputControllerFloatingPlaceholder)]) {
diff --git a/components/TextFields/src/MDCMultilineTextField.m b/components/TextFields/src/MDCMultilineTextField.m
index 6de387e..d4cac22 100644
--- a/components/TextFields/src/MDCMultilineTextField.m
+++ b/components/TextFields/src/MDCMultilineTextField.m
@@ -175,6 +175,7 @@
   self.backgroundColor = [UIColor clearColor];
 
   self.textColor = _fundament.textColor;
+  // TODO: (#4331) This needs to be converted to the new text scheme.
   self.font = [UIFont mdc_standardFontForMaterialTextStyle:MDCFontTextStyleBody1];
   self.clearButton.tintColor = [UIColor colorWithWhite:0 alpha:[MDCTypography captionFontOpacity]];
 
diff --git a/components/TextFields/src/MDCTextField.m b/components/TextFields/src/MDCTextField.m
index 384e4df..2b4c051 100644
--- a/components/TextFields/src/MDCTextField.m
+++ b/components/TextFields/src/MDCTextField.m
@@ -808,13 +808,12 @@
   NSMutableArray *accessibilityStrings = [[NSMutableArray alloc] init];
   if ([super accessibilityValue].length > 0) {
     [accessibilityStrings addObject:[super accessibilityValue]];
+  } else if (self.placeholderLabel.accessibilityLabel.length > 0) {
+    [accessibilityStrings addObject:self.placeholderLabel.accessibilityLabel];
   }
   if (self.leadingUnderlineLabel.accessibilityLabel.length > 0) {
     [accessibilityStrings addObject:self.leadingUnderlineLabel.accessibilityLabel];
   }
-  if (self.placeholderLabel.accessibilityLabel.length > 0) {
-    [accessibilityStrings addObject:self.placeholderLabel.accessibilityLabel];
-  }
   return accessibilityStrings.count > 0 ?
       [accessibilityStrings componentsJoinedByString:@", "] : nil;
 }
diff --git a/components/TextFields/src/MDCTextInputController.h b/components/TextFields/src/MDCTextInputController.h
index 307ccc2..5fac597 100644
--- a/components/TextFields/src/MDCTextInputController.h
+++ b/components/TextFields/src/MDCTextInputController.h
@@ -37,19 +37,6 @@
 @property(class, nonatomic, null_resettable, strong) UIColor *activeColorDefault;
 
 /**
- Color for background for the various views making up a text field.
-
- Default is backgroundColorDefault.
- */
-@property(nonatomic, null_resettable, strong) UIColor *backgroundColor;
-
-/**
- Default value for backgroundColor.
- */
-@property(class, nonatomic, null_resettable, strong) UIColor *backgroundColorDefault;
-
-
-/**
  The character counter. Override to use a custom character counter.
 
  Default is an internal instance MDCTextInputAllCharactersCounter. Setting this property to null
@@ -209,6 +196,16 @@
 @property(nonatomic, nullable, strong) UIView<MDCTextInput> *textInput;
 
 /**
+ The tintColor applied to the textInput's clear button.
+ See @c UIImageView.tintColor for additional details.
+ */
+@property(nonatomic, null_resettable, strong) UIColor *textInputClearButtonTintColor;
+
+/**
+ Default value for @c textInputClearButtonTintColor. */
+@property(class, nonatomic, nullable, strong) UIColor *textInputClearButtonTintColorDefault;
+
+/**
  The font applied to the trailing side underline label.
 
  Default is trailingUnderlineLabelFontDefault.
diff --git a/components/TextFields/src/MDCTextInputControllerBase.h b/components/TextFields/src/MDCTextInputControllerBase.h
index c26a45b..88f40df 100644
--- a/components/TextFields/src/MDCTextInputControllerBase.h
+++ b/components/TextFields/src/MDCTextInputControllerBase.h
@@ -60,13 +60,6 @@
 @interface MDCTextInputControllerBase : NSObject <MDCTextInputControllerFloatingPlaceholder>
 
 /**
- Color for background for the various views making up a text field.
-
- Default is backgroundColorDefault.
- */
-@property(nonatomic, null_resettable, strong) UIColor *backgroundColor;
-
-/**
  The color behind the input and label that defines the preferred tap zone.
 
  Default is borderFillColorDefault.
diff --git a/components/TextFields/src/MDCTextInputControllerBase.m b/components/TextFields/src/MDCTextInputControllerBase.m
index 4c6741d..6892aab 100644
--- a/components/TextFields/src/MDCTextInputControllerBase.m
+++ b/components/TextFields/src/MDCTextInputControllerBase.m
@@ -45,8 +45,6 @@
 
 static NSString *const MDCTextInputControllerBaseActiveColorKey =
     @"MDCTextInputControllerBaseActiveColorKey";
-static NSString *const MDCTextInputControllerBaseBackgroundColorKey =
-    @"MDCTextInputControllerBaseBackgroundColorKey";
 static NSString *const MDCTextInputControllerBaseBorderFillColorKey =
     @"MDCTextInputControllerBaseBorderFillColorKey";
 static NSString *const MDCTextInputControllerBaseCharacterCounterKey =
@@ -129,7 +127,6 @@
 static CGFloat _underlineHeightNormalDefault = 0;
 
 static UIColor *_activeColorDefault;
-static UIColor *_backgroundColorDefault;
 static UIColor *_borderFillColorDefault;
 static UIColor *_disabledColorDefault;
 static UIColor *_errorColorDefault;
@@ -143,6 +140,7 @@
 static UIFont *_inlinePlaceholderFontDefault;
 static UIFont *_leadingUnderlineLabelFontDefault;
 static UIFont *_textInputFontDefault;
+static UIColor *_textInputClearButtonTintColorDefault;
 static UIFont *_trailingUnderlineLabelFontDefault;
 
 static UIRectCorner _roundedCornersDefault = 0;
@@ -157,7 +155,6 @@
   NSNumber *_floatingPlaceholderScale;
 
   UIColor *_activeColor;
-  UIColor *_backgroundColor;
   UIColor *_borderFillColor;
   UIColor *_disabledColor;
   UIColor *_errorColor;
@@ -171,6 +168,7 @@
   UIFont *_inlinePlaceholderFont;
   UIFont *_leadingUnderlineLabelFont;
   UIFont *_textInputFont;
+  UIColor *_textInputClearButtonTintColor;
   UIFont *_trailingUnderlineLabelFont;
 
   UIRectCorner _roundedCorners;
@@ -192,7 +190,6 @@
 
 @implementation MDCTextInputControllerBase
 
-@synthesize backgroundColor = _backgroundColor;
 @synthesize characterCountMax = _characterCountMax;
 @synthesize characterCountViewMode = _characterCountViewMode;
 @synthesize floatingEnabled = _floatingEnabled;
@@ -222,8 +219,6 @@
   if (self) {
     _activeColor = [aDecoder decodeObjectOfClass:[UIColor class]
                                           forKey:MDCTextInputControllerBaseActiveColorKey];
-    _backgroundColor = [aDecoder decodeObjectOfClass:[UIColor class]
-                                              forKey:MDCTextInputControllerBaseBackgroundColorKey];
     _borderFillColor = [aDecoder decodeObjectOfClass:[UIColor class]
                                               forKey:MDCTextInputControllerBaseBorderFillColorKey];
     _characterCounter =
@@ -322,7 +317,6 @@
 
 - (void)encodeWithCoder:(NSCoder *)aCoder {
   [aCoder encodeObject:self.activeColor forKey:MDCTextInputControllerBaseActiveColorKey];
-  [aCoder encodeObject:self.backgroundColor forKey:MDCTextInputControllerBaseBackgroundColorKey];
   [aCoder encodeObject:self.borderFillColor forKey:MDCTextInputControllerBaseBorderFillColorKey];
   if ([self.characterCounter conformsToProtocol:@protocol(NSSecureCoding)]) {
     [aCoder encodeObject:self.characterCounter
@@ -376,7 +370,6 @@
   MDCTextInputControllerBase *copy = [[[self class] alloc] init];
 
   copy.activeColor = self.activeColor;
-  copy.backgroundColor = self.backgroundColor;
   copy.borderFillColor = self.borderFillColor;
   copy.characterCounter = self.characterCounter;  // Just a pointer value copy
   copy.characterCountViewMode = self.characterCountViewMode;
@@ -456,6 +449,7 @@
 
   [self subscribeForNotifications];
   _textInput.underline.color = [self class].normalColorDefault;
+  _textInput.clearButton.tintColor = self.textInputClearButtonTintColor;
   [self forceUpdatePlaceholderY];
 }
 
@@ -568,10 +562,9 @@
 - (void)updateLeadingUnderlineLabel {
   UIFont *font = self.leadingUnderlineLabelFont;
   if (self.mdc_adjustsFontForContentSizeCategory) {
-    font =
-        [font mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleCaption
-                           scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
-
+    // TODO: (#4331) This needs to be converted to the new text scheme.
+    font = [font mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleCaption
+                              scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
   }
   self.textInput.leadingUnderlineLabel.font = font;
 
@@ -588,6 +581,7 @@
   if (self.mdc_adjustsFontForContentSizeCategory) {
     font = [font mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleBody1
                               scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
+    // TODO: (#4331) This needs to be converted to the new text scheme.
   }
   self.textInput.font = font;
 }
@@ -599,12 +593,19 @@
 - (void)updatePlaceholder {
   UIFont *placeHolderFont = self.inlinePlaceholderFont;
   if (self.mdc_adjustsFontForContentSizeCategory) {
+    // TODO: (#4331) This needs to be converted to the new text scheme.
     placeHolderFont =
         [placeHolderFont mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleBody1
                                       scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
 
   }
-  self.textInput.placeholderLabel.font = placeHolderFont;
+
+  // Aside from not wanting to kick off extra work for setting a font that hasn't changed, we use
+  // this custom equality check to prevent an edge case that caused a 1 pixel change in width even
+  // when the important parts of the new font were the same as the existing font.
+  if (![self.textInput.placeholderLabel.font mdc_isSimplyEqual:placeHolderFont]){
+    self.textInput.placeholderLabel.font = placeHolderFont;
+  }
 
   UIColor *placeholderColor;
   if ([self isPlaceholderUp]) {
@@ -845,6 +846,7 @@
     self.textInput.trailingUnderlineLabel.text = [self characterCountText];
     UIFont *font = self.trailingUnderlineLabelFont;
     if (self.mdc_adjustsFontForContentSizeCategory) {
+      // TODO: (#4331) This needs to be converted to the new text scheme.
       font =
           [font mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleCaption
                              scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
@@ -920,9 +922,11 @@
 
 + (UIFont *)placeholderFont {
   return [UIFont mdc_standardFontForMaterialTextStyle:MDCFontTextStyleBody1];
+  // TODO: (#4331) This needs to be converted to the new text scheme.
 }
 
 + (UIFont *)underlineLabelsFont {
+  // TODO: (#4331) This needs to be converted to the new text scheme.
   return [UIFont mdc_standardFontForMaterialTextStyle:MDCFontTextStyleCaption];
 }
 
@@ -951,30 +955,6 @@
                                            : MDCTextInputControllerBaseDefaultActiveColorDefault();
 }
 
-- (UIColor *)backgroundColor {
-  if (!_backgroundColor) {
-    _backgroundColor = [self class].backgroundColorDefault;
-  }
-  return _backgroundColor;
-}
-
-- (void)setBackgroundColor:(UIColor *)backgroundColor {
-  if (_backgroundColor != backgroundColor) {
-    _backgroundColor = backgroundColor ?: [self class].backgroundColorDefault;
-  }
-}
-
-+ (UIColor *)backgroundColorDefault {
-  if (!_backgroundColorDefault) {
-    _backgroundColorDefault = [UIColor clearColor];
-  }
-  return _backgroundColorDefault;
-}
-
-+ (void)setBackgroundColorDefault:(UIColor *)backgroundColorDefault {
-  _backgroundColorDefault = backgroundColorDefault ?: [UIColor clearColor];
-}
-
 - (UIColor *)borderFillColor {
   if (!_borderFillColor) {
     _borderFillColor = [self class].borderFillColorDefault;
@@ -1404,6 +1384,26 @@
     _textInputFontDefault = textInputFontDefault;
 }
 
+- (UIColor *)textInputClearButtonTintColor {
+  if (_textInputClearButtonTintColor) {
+    return _textInputClearButtonTintColor;
+  }
+  return [self class].textInputClearButtonTintColorDefault ?: self.textInput.clearButton.tintColor;
+}
+
+- (void)setTextInputClearButtonTintColor:(UIColor *)textInputClearButtonTintColor {
+  _textInputClearButtonTintColor = textInputClearButtonTintColor;
+  _textInput.clearButton.tintColor = _textInputClearButtonTintColor;
+}
+
++ (UIColor *)textInputClearButtonTintColorDefault {
+  return _textInputClearButtonTintColorDefault;
+}
+
++ (void)setTextInputClearButtonTintColorDefault:(UIColor *)textInputClearButtonTintColorDefault {
+  _textInputClearButtonTintColorDefault = textInputClearButtonTintColorDefault;
+}
+
 - (UIFont *)trailingUnderlineLabelFont {
   return _trailingUnderlineLabelFont ?: [self class].trailingUnderlineLabelFontDefault;
 }
diff --git a/components/TextFields/src/MDCTextInputControllerFullWidth.h b/components/TextFields/src/MDCTextInputControllerFullWidth.h
index 0ed8f57..6266059 100644
--- a/components/TextFields/src/MDCTextInputControllerFullWidth.h
+++ b/components/TextFields/src/MDCTextInputControllerFullWidth.h
@@ -56,4 +56,16 @@
  */
 @interface MDCTextInputControllerFullWidth : NSObject <MDCTextInputController>
 
+/**
+ Color for background for the various views making up a text field.
+
+ Default is backgroundColorDefault.
+ */
+@property(nonatomic, null_resettable, strong) UIColor *backgroundColor;
+
+/**
+ Default value for backgroundColor.
+ */
+@property(class, nonatomic, null_resettable, strong) UIColor *backgroundColorDefault;
+
 @end
diff --git a/components/TextFields/src/MDCTextInputControllerFullWidth.m b/components/TextFields/src/MDCTextInputControllerFullWidth.m
index ae3fdef..e214296 100644
--- a/components/TextFields/src/MDCTextInputControllerFullWidth.m
+++ b/components/TextFields/src/MDCTextInputControllerFullWidth.m
@@ -78,6 +78,7 @@
 
 static UIFont *_inlinePlaceholderFontDefault;
 static UIFont *_textInputFontDefault;
+static UIColor *_textInputClearButtonTintColorDefault;
 static UIFont *_trailingUnderlineLabelFontDefault;
 
 @interface MDCTextInputControllerFullWidth () {
@@ -92,6 +93,7 @@
 
   UIFont *_inlinePlaceholderFont;
   UIFont *_textInputFont;
+  UIColor *_textInputClearButtonTintColor;
   UIFont *_trailingUnderlineLabelFont;
 }
 
@@ -258,6 +260,7 @@
 
   [self subscribeForNotifications];
   _textInput.underline.color = [UIColor clearColor];
+  _textInput.clearButton.tintColor = self.textInputClearButtonTintColor;
   [self updateLayout];
 }
 
@@ -340,6 +343,7 @@
 - (void)updateTextInput {
   UIFont *font = self.textInputFont;
   if (self.mdc_adjustsFontForContentSizeCategory) {
+    // TODO: (#4331) This needs to be converted to the new text scheme.
     font =
         [font mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleBody1
                            scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
@@ -359,6 +363,7 @@
 - (void)updatePlaceholder {
   UIFont *placeHolderFont = self.inlinePlaceholderFont;
   if (self.mdc_adjustsFontForContentSizeCategory) {
+    // TODO: (#4331) This needs to be converted to the new text scheme.
     placeHolderFont =
         [placeHolderFont mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleBody1
                                       scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
@@ -379,6 +384,7 @@
     self.textInput.trailingUnderlineLabel.text = [self characterCountText];
     UIFont *font = self.trailingUnderlineLabelFont;
     if (self.mdc_adjustsFontForContentSizeCategory) {
+      // TODO: (#4331) This needs to be converted to the new text scheme.
       font =
           [font mdc_fontSizedForMaterialTextStyle:MDCFontTextStyleCaption
                              scaledForDynamicType:_mdc_adjustsFontForContentSizeCategory];
@@ -426,10 +432,12 @@
 #pragma mark - Underline Labels Fonts
 
 + (UIFont *)placeholderFont {
+  // TODO: (#4331) This needs to be converted to the new text scheme.
   return [UIFont mdc_standardFontForMaterialTextStyle:MDCFontTextStyleBody1];
 }
 
 + (UIFont *)underlineLabelsFont {
+  // TODO: (#4331) This needs to be converted to the new text scheme.
   return [UIFont mdc_standardFontForMaterialTextStyle:MDCFontTextStyleCaption];
 }
 
@@ -731,6 +739,26 @@
   _textInputFontDefault = textInputFontDefault;
 }
 
+- (UIColor *)textInputClearButtonTintColor {
+    if (_textInputClearButtonTintColor) {
+        return _textInputClearButtonTintColor;
+    }
+    return [self class].textInputClearButtonTintColorDefault ?: self.textInput.clearButton.tintColor;
+}
+
+- (void)setTextInputClearButtonTintColor:(UIColor *)textInputClearButtonTintColor {
+    _textInputClearButtonTintColor = textInputClearButtonTintColor;
+    _textInput.clearButton.tintColor = _textInputClearButtonTintColor;
+}
+
++ (UIColor *)textInputClearButtonTintColorDefault {
+    return _textInputClearButtonTintColorDefault;
+}
+
++ (void)setTextInputClearButtonTintColorDefault:(UIColor *)textInputClearButtonTintColorDefault {
+    _textInputClearButtonTintColorDefault = textInputClearButtonTintColorDefault;
+}
+
 - (UIFont *)trailingUnderlineLabelFont {
   return _trailingUnderlineLabelFont ?: [self class].trailingUnderlineLabelFontDefault;
 }
diff --git a/components/TextFields/src/private/MDCTextInputCommonFundament.m b/components/TextFields/src/private/MDCTextInputCommonFundament.m
index e5e0433..d9854c8 100644
--- a/components/TextFields/src/private/MDCTextInputCommonFundament.m
+++ b/components/TextFields/src/private/MDCTextInputCommonFundament.m
@@ -134,6 +134,7 @@
     // This is the first call to the .textInput property. On MDCMultilineTextField, .textView is a
     // failsafe, lazy var. It will create a .textView instance if there wasn't one on the ivar.
     _textInput.font = [UIFont mdc_standardFontForMaterialTextStyle:MDCFontTextStyleBody1];
+    // TODO: (#4331) This needs to be converted to the new text scheme.
 
     // Initialize elements of UI
     [self setupPlaceholderLabel];
@@ -550,7 +551,7 @@
 - (void)updateClearButton {
   UIImage *image = self.clearButton.currentImage
                        ? self.clearButton.currentImage
-                       : [self drawnClearButtonImage:self.clearButton.tintColor];
+                       : [self drawnClearButtonImage];
 
   if (![self.clearButton imageForState:UIControlStateNormal]) {
     [self.clearButton setImage:image forState:UIControlStateNormal];
@@ -627,14 +628,14 @@
   return clearButtonAlpha;
 }
 
-- (UIImage *)drawnClearButtonImage:(UIColor *)color {
+- (UIImage *)drawnClearButtonImage {
   CGSize clearButtonSize = CGSizeMake(MDCTextInputClearButtonImageSquareWidthHeight,
                                       MDCTextInputClearButtonImageSquareWidthHeight);
 
   CGFloat scale = [UIScreen mainScreen].scale;
   CGRect bounds = CGRectMake(0, 0, clearButtonSize.width * scale, clearButtonSize.height * scale);
   UIGraphicsBeginImageContextWithOptions(bounds.size, false, scale);
-  [color setFill];
+  [UIColor.grayColor setFill];
 
   [MDCPathForClearButtonImageFrame(bounds) fill];
   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
@@ -867,6 +868,7 @@
 - (void)updateFontsForDynamicType {
   if (self.mdc_adjustsFontForContentSizeCategory) {
     UIFont *textFont = [UIFont mdc_preferredFontForMaterialTextStyle:MDCFontTextStyleBody1];
+    // TODO: (#4331) This needs to be converted to the new text scheme.
     self.textInput.font = textFont;
     self.leadingUnderlineLabel.font = textFont;
     self.trailingUnderlineLabel.font = textFont;
diff --git a/components/TextFields/tests/unit/FilledTextFieldColorThemerTests.m b/components/TextFields/tests/unit/FilledTextFieldColorThemerTests.m
new file mode 100644
index 0000000..c4cb805
--- /dev/null
+++ b/components/TextFields/tests/unit/FilledTextFieldColorThemerTests.m
@@ -0,0 +1,158 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import <XCTest/XCTest.h>
+
+#import "MDCTextInputBorderView.h"
+#import "MaterialColorScheme.h"
+#import "MaterialTextFields.h"
+#import "MaterialTextFields+ColorThemer.h"
+
+@interface FilledTextFieldColorThemerTests : XCTestCase
+
+@end
+
+@implementation FilledTextFieldColorThemerTests
+
+- (void)testThemerWithBaselineColorSchemeAppliesToSingleLineTextField {
+  // Given
+  MDCTextField *textField = [[MDCTextField alloc] init];
+  MDCTextInputControllerFilled *controller =
+      [[MDCTextInputControllerFilled alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCFilledTextFieldColorThemer applySemanticColorScheme:colorScheme
+                              toTextInputControllerFilled:controller];
+
+  // Then
+  XCTAssertNil(textField.backgroundColor);
+  XCTAssertEqualObjects(controller.borderFillColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.04f]);
+  XCTAssertEqualObjects(textField.borderView.borderFillColor, controller.borderFillColor);
+  XCTAssertEqualObjects(controller.normalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.42f]);
+  XCTAssertEqualObjects(textField.underline.color, controller.normalColor);
+  XCTAssertEqualObjects(controller.inlinePlaceholderColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor, controller.inlinePlaceholderColor);
+  XCTAssertEqualObjects(controller.leadingUnderlineLabelTextColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.leadingUnderlineLabel.textColor,
+                        controller.leadingUnderlineLabelTextColor);
+  XCTAssertEqualObjects(controller.activeColor, colorScheme.primaryColor);
+  // Set directly in the themer, not via the controller
+  XCTAssertEqualObjects(textField.textColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.87f]);
+  XCTAssertEqualObjects(controller.errorColor, colorScheme.errorColor);
+  XCTAssertEqualObjects(controller.disabledColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.38f]);
+  XCTAssertEqualObjects(controller.floatingPlaceholderNormalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor,
+                        controller.floatingPlaceholderNormalColor);
+  XCTAssertEqualObjects(controller.floatingPlaceholderActiveColor,
+                        [colorScheme.primaryColor colorWithAlphaComponent:0.87f]);
+  XCTAssertEqualObjects(controller.textInputClearButtonTintColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.54f]);
+  XCTAssertEqualObjects(textField.clearButton.tintColor, controller.textInputClearButtonTintColor);
+}
+
+// TODO(https://github.com/material-components/material-components-ios/issues/4443 ): Restore this
+// test
+- (void)_disabled_testThemerWithBaselineColorSchemeAppliesToSingleLineTextFieldDisabledState {
+  // Given
+  MDCTextField *textField = [[MDCTextField alloc] init];
+  MDCTextInputControllerFilled *controller =
+      [[MDCTextInputControllerFilled alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCFilledTextFieldColorThemer applySemanticColorScheme:colorScheme
+                              toTextInputControllerFilled:controller];
+  textField.enabled = NO;
+
+  // Then
+  XCTAssertEqualObjects(controller.disabledColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.38f]);
+  XCTAssertEqualObjects(textField.underline.color, controller.disabledColor);
+}
+
+- (void)testThemerWithBaselineColorSchemeAppliesToMultilineTextField {
+  // Given
+  MDCMultilineTextField *textField = [[MDCMultilineTextField alloc] init];
+  MDCTextInputControllerFilled *controller =
+      [[MDCTextInputControllerFilled alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCFilledTextFieldColorThemer applySemanticColorScheme:colorScheme
+                              toTextInputControllerFilled:controller];
+
+  // Then
+  XCTAssertEqualObjects(textField.backgroundColor, UIColor.clearColor);
+  XCTAssertEqualObjects(controller.borderFillColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.04f]);
+  XCTAssertEqualObjects(textField.borderView.borderFillColor, controller.borderFillColor);
+  XCTAssertEqualObjects(controller.normalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.42f]);
+  XCTAssertEqualObjects(textField.underline.color, controller.normalColor);
+  XCTAssertEqualObjects(controller.inlinePlaceholderColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor, controller.inlinePlaceholderColor);
+  XCTAssertEqualObjects(controller.leadingUnderlineLabelTextColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.leadingUnderlineLabel.textColor,
+                        controller.leadingUnderlineLabelTextColor);
+  XCTAssertEqualObjects(controller.activeColor, colorScheme.primaryColor);
+  // Set directly in the themer, not via the controller
+  XCTAssertEqualObjects(textField.textColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.87f]);
+  XCTAssertEqualObjects(controller.errorColor, colorScheme.errorColor);
+  XCTAssertEqualObjects(controller.disabledColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.38f]);
+  XCTAssertEqualObjects(controller.floatingPlaceholderNormalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor,
+                        controller.floatingPlaceholderNormalColor);
+  XCTAssertEqualObjects(controller.floatingPlaceholderActiveColor,
+                        [colorScheme.primaryColor colorWithAlphaComponent:0.87f]);
+  XCTAssertEqualObjects(controller.textInputClearButtonTintColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.54f]);
+  XCTAssertEqualObjects(textField.clearButton.tintColor, controller.textInputClearButtonTintColor);
+}
+
+// TODO(https://github.com/material-components/material-components-ios/issues/4443 ): Restore this
+// test
+- (void)_disabled_testThemerWithBaselineColorSchemeAppliesToMultilineTextFieldDisabledState {
+  // Given
+  MDCMultilineTextField *textField = [[MDCMultilineTextField alloc] init];
+  MDCTextInputControllerFilled *controller =
+      [[MDCTextInputControllerFilled alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCFilledTextFieldColorThemer applySemanticColorScheme:colorScheme
+                              toTextInputControllerFilled:controller];
+  textField.enabled = NO;
+
+  // Then
+  XCTAssertEqualObjects(controller.disabledColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.38f]);
+  XCTAssertEqualObjects(textField.underline.color, controller.disabledColor);
+}
+
+@end
diff --git a/components/TextFields/tests/unit/OutlinedTextFieldColorThemerTests.m b/components/TextFields/tests/unit/OutlinedTextFieldColorThemerTests.m
new file mode 100644
index 0000000..265bfd1
--- /dev/null
+++ b/components/TextFields/tests/unit/OutlinedTextFieldColorThemerTests.m
@@ -0,0 +1,156 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import <XCTest/XCTest.h>
+
+#import "MDCTextInputBorderView.h"
+#import "MaterialColorScheme.h"
+#import "MaterialTextFields.h"
+#import "MaterialTextFields+ColorThemer.h"
+
+@interface OutlinedTextFieldColorThemerTests : XCTestCase
+
+@end
+
+@implementation OutlinedTextFieldColorThemerTests
+
+- (void)testThemerWithBaselineColorSchemeAppliesToSingleLineTextField {
+  // Given
+  MDCTextField *textField = [[MDCTextField alloc] init];
+  MDCTextInputControllerOutlined *controller =
+      [[MDCTextInputControllerOutlined alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCOutlinedTextFieldColorThemer applySemanticColorScheme:colorScheme
+                                      toTextInputController:controller];
+
+  // Then
+  XCTAssertEqualObjects(controller.activeColor, colorScheme.primaryColor);
+  XCTAssertEqualObjects(controller.errorColor, colorScheme.errorColor);
+  XCTAssertEqualObjects(controller.trailingUnderlineLabelTextColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.trailingUnderlineLabel.textColor,
+                        controller.trailingUnderlineLabelTextColor);
+  XCTAssertEqualObjects(controller.normalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.underline.color, controller.normalColor);
+  XCTAssertEqualObjects(textField.borderView.borderStrokeColor, controller.normalColor);
+  XCTAssertEqualObjects(controller.inlinePlaceholderColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor, controller.inlinePlaceholderColor);
+  // Set directly in the themer, not by the controller
+  XCTAssertEqualObjects(textField.textColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.87f]);
+  XCTAssertEqualObjects(controller.leadingUnderlineLabelTextColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.leadingUnderlineLabel.textColor,
+                        controller.leadingUnderlineLabelTextColor);
+  XCTAssertEqualObjects(controller.textInputClearButtonTintColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.54f]);
+  XCTAssertEqualObjects(textField.clearButton.tintColor, controller.textInputClearButtonTintColor);
+  XCTAssertEqualObjects(controller.floatingPlaceholderNormalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor,
+                        controller.floatingPlaceholderNormalColor);
+  XCTAssertEqualObjects(controller.floatingPlaceholderActiveColor,
+                        [colorScheme.primaryColor colorWithAlphaComponent:0.87f]);
+}
+
+// TODO(https://github.com/material-components/material-components-ios/issues/4443 ): Restore this
+// test
+- (void)_disabled_testThemerWithBaselineColorSchemeAppliesToSingleLineTextFieldDisabledState {
+  // Given
+  MDCTextField *textField = [[MDCTextField alloc] init];
+  MDCTextInputControllerOutlined *controller =
+      [[MDCTextInputControllerOutlined alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCOutlinedTextFieldColorThemer applySemanticColorScheme:colorScheme
+                                      toTextInputController:controller];
+  textField.enabled = NO;
+
+  // Then
+  XCTAssertEqualObjects(controller.disabledColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.38f]);
+  XCTAssertEqualObjects(textField.underline.disabledColor, controller.disabledColor);
+}
+
+- (void)testThemerWithBaselineColorSchemeAppliesToMultilineTextField {
+  // Given
+  MDCMultilineTextField *textField = [[MDCMultilineTextField alloc] init];
+  MDCTextInputControllerOutlinedTextArea *controller =
+      [[MDCTextInputControllerOutlinedTextArea alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCOutlinedTextFieldColorThemer applySemanticColorScheme:colorScheme
+                                      toTextInputController:controller];
+
+  // Then
+  XCTAssertEqualObjects(controller.activeColor, colorScheme.primaryColor);
+  XCTAssertEqualObjects(controller.errorColor, colorScheme.errorColor);
+  XCTAssertEqualObjects(controller.trailingUnderlineLabelTextColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.trailingUnderlineLabel.textColor,
+                        controller.trailingUnderlineLabelTextColor);
+  XCTAssertEqualObjects(controller.normalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.underline.color, controller.normalColor);
+  XCTAssertEqualObjects(textField.borderView.borderStrokeColor, controller.normalColor);
+  XCTAssertEqualObjects(controller.inlinePlaceholderColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor, controller.inlinePlaceholderColor);
+  // Set directly in the themer, not by the controller
+  XCTAssertEqualObjects(textField.textColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.87f]);
+  XCTAssertEqualObjects(controller.leadingUnderlineLabelTextColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.leadingUnderlineLabel.textColor,
+                        controller.leadingUnderlineLabelTextColor);
+  XCTAssertEqualObjects(controller.textInputClearButtonTintColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.54f]);
+  XCTAssertEqualObjects(textField.clearButton.tintColor, controller.textInputClearButtonTintColor);
+  XCTAssertEqualObjects(controller.floatingPlaceholderNormalColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.6f]);
+  XCTAssertEqualObjects(textField.placeholderLabel.textColor,
+                        controller.floatingPlaceholderNormalColor);
+  XCTAssertEqualObjects(controller.floatingPlaceholderActiveColor,
+                        [colorScheme.primaryColor colorWithAlphaComponent:0.87f]);
+}
+
+// TODO(https://github.com/material-components/material-components-ios/issues/4443 ): Restore this
+// test
+- (void)_disabled_testThemerWithBaselineColorSchemeAppliesToMultilineTextFieldDisabledState {
+  // Given
+  MDCMultilineTextField *textField = [[MDCMultilineTextField alloc] init];
+  MDCTextInputControllerOutlinedTextArea *controller =
+      [[MDCTextInputControllerOutlinedTextArea alloc] initWithTextInput:textField];
+  MDCSemanticColorScheme *colorScheme = [[MDCSemanticColorScheme alloc] init];
+
+  // When
+  [MDCOutlinedTextFieldColorThemer applySemanticColorScheme:colorScheme
+                                      toTextInputController:controller];
+  textField.enabled = NO;
+
+  // Then
+  XCTAssertEqualObjects(controller.disabledColor,
+                        [colorScheme.onSurfaceColor colorWithAlphaComponent:0.38f]);
+  XCTAssertEqualObjects(textField.underline.disabledColor, controller.disabledColor);
+}
+
+@end
diff --git a/components/TextFields/tests/unit/TextFieldControllerClassPropertiesLegacyTests.swift b/components/TextFields/tests/unit/TextFieldControllerClassPropertiesLegacyTests.swift
index d54478b..571862e 100644
--- a/components/TextFields/tests/unit/TextFieldControllerClassPropertiesLegacyTests.swift
+++ b/components/TextFields/tests/unit/TextFieldControllerClassPropertiesLegacyTests.swift
@@ -42,6 +42,7 @@
     MDCTextInputControllerLegacyDefault.floatingPlaceholderNormalColorDefault = nil
     MDCTextInputControllerLegacyDefault.floatingPlaceholderScaleDefault = 0.75
     MDCTextInputControllerLegacyDefault.isFloatingEnabledDefault = true
+    MDCTextInputControllerLegacyDefault.textInputClearButtonTintColorDefault = nil
 
     MDCTextInputControllerLegacyFullWidth.errorColorDefault = nil
     MDCTextInputControllerLegacyFullWidth.inlinePlaceholderColorDefault = nil
@@ -56,6 +57,8 @@
     MDCTextInputControllerLegacyFullWidth.inlinePlaceholderFontDefault = nil
     MDCTextInputControllerLegacyFullWidth.leadingUnderlineLabelFontDefault = nil
     MDCTextInputControllerLegacyFullWidth.trailingUnderlineLabelFontDefault = nil
+    
+    MDCTextInputControllerLegacyFullWidth.textInputClearButtonTintColorDefault = nil
   }
 
   func testLegacyDefault() {
@@ -92,6 +95,8 @@
                    UIColor(white: 0, alpha: CGFloat(Float(0.54))))
     XCTAssertEqual(Float(MDCTextInputControllerLegacyDefault.floatingPlaceholderScaleDefault), 0.75)
     XCTAssertEqual(MDCTextInputControllerLegacyDefault.isFloatingEnabledDefault, true)
+    
+    XCTAssertNil(MDCTextInputControllerLegacyDefault.textInputClearButtonTintColorDefault)
 
     // Test the use of the class properties.
     let textField = MDCTextField()
@@ -244,6 +249,8 @@
                    MDCTextInputControllerLegacyFullWidth.trailingUnderlineLabelFontDefault)
     XCTAssertEqual(MDCTextInputControllerLegacyFullWidth.leadingUnderlineLabelFontDefault,
                    UIFont.mdc_standardFont(forMaterialTextStyle: .caption))
+    
+    XCTAssertNil(MDCTextInputControllerLegacyFullWidth.textInputClearButtonTintColorDefault)
 
     // Test the use of the class properties.
     let textField = MDCTextField()
@@ -356,4 +363,83 @@
     XCTAssertEqual(controller.trailingUnderlineLabelFont,
                    MDCTextInputControllerLegacyFullWidth.trailingUnderlineLabelFontDefault)
   }
+  
+  func testLegacyDefaultTextInputClearButtonTintColorUsesDefault() {
+    // Given
+    MDCTextInputControllerLegacyDefault.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInput = MDCTextField()
+    let controllerLegacyDefault = MDCTextInputControllerLegacyDefault(textInput: textInput)
+    
+    // Then
+    XCTAssertEqual(controllerLegacyDefault.textInputClearButtonTintColor,
+                   MDCTextInputControllerLegacyDefault.textInputClearButtonTintColorDefault)
+  }
+  
+  func testLegacyDefaultTextInputClearButtonTintColorDefaultAppliesToTextField() {
+    // Given
+    MDCTextInputControllerLegacyDefault.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInputLegacyDefault = MDCTextField()
+    let _ = MDCTextInputControllerLegacyDefault(textInput: textInputLegacyDefault)
+    
+    // Then
+    XCTAssertEqual(textInputLegacyDefault.clearButton.tintColor,
+                   MDCTextInputControllerLegacyDefault.textInputClearButtonTintColorDefault)
+  }
+  
+  func testLegacyDefaultTextInputClearButtonTintColorAppliesToTextField() {
+    // Given
+    let textInputLegacyDefault = MDCTextField()
+    let controllerLegacyDefault = MDCTextInputControllerLegacyDefault(textInput: textInputLegacyDefault)
+    
+    // When
+    controllerLegacyDefault.textInputClearButtonTintColor = .black
+    
+    // Then
+    XCTAssertEqual(textInputLegacyDefault.clearButton.tintColor,
+                   controllerLegacyDefault.textInputClearButtonTintColor)
+  }
+  
+  func testLegacyFullWidthTextInputClearButtonTintColorUsesDefault() {
+    // Given
+    MDCTextInputControllerLegacyFullWidth.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInput = MDCTextField()
+    let controllerLegacyFullWidth = MDCTextInputControllerLegacyFullWidth(textInput: textInput)
+    
+    // Then
+    XCTAssertEqual(controllerLegacyFullWidth.textInputClearButtonTintColor,
+                   MDCTextInputControllerLegacyFullWidth.textInputClearButtonTintColorDefault)
+  }
+  
+  func testLegacyFullWidthTextinputClearButtonTintColorDefaultAppliesToTextField() {
+    // Given
+    MDCTextInputControllerLegacyFullWidth.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInputLegacyFullWidth = MDCTextField()
+    let _ = MDCTextInputControllerLegacyFullWidth(textInput: textInputLegacyFullWidth)
+    
+    // Then
+    XCTAssertEqual(textInputLegacyFullWidth.clearButton.tintColor,
+                   MDCTextInputControllerLegacyFullWidth.textInputClearButtonTintColorDefault)
+  }
+  
+  func testLegacyFullWidthTextInputClearButtonTintColorAppliesToTextField() {
+    // Given
+    let textInputLegacyFullWidth = MDCTextField()
+    let controllerLegacyFullWidth  = MDCTextInputControllerLegacyFullWidth(textInput: textInputLegacyFullWidth)
+    
+    // When
+    controllerLegacyFullWidth.textInputClearButtonTintColor = .black
+    
+    // Then
+    XCTAssertEqual(textInputLegacyFullWidth.clearButton.tintColor,
+                   controllerLegacyFullWidth.textInputClearButtonTintColor)
+  }
+  
 }
diff --git a/components/TextFields/tests/unit/TextFieldControllerClassPropertiesTests.swift b/components/TextFields/tests/unit/TextFieldControllerClassPropertiesTests.swift
index a9e8af3..e0c6882 100644
--- a/components/TextFields/tests/unit/TextFieldControllerClassPropertiesTests.swift
+++ b/components/TextFields/tests/unit/TextFieldControllerClassPropertiesTests.swift
@@ -45,6 +45,7 @@
 
     MDCTextInputControllerFilled.floatingPlaceholderNormalColorDefault = nil
     MDCTextInputControllerFilled.floatingPlaceholderScaleDefault = 0.75
+    MDCTextInputControllerFilled.textInputClearButtonTintColorDefault = nil;
 
     MDCTextInputControllerOutlined.roundedCornersDefault = []
     MDCTextInputControllerOutlined.errorColorDefault = nil
@@ -66,6 +67,7 @@
     MDCTextInputControllerOutlined.floatingPlaceholderNormalColorDefault = nil
     MDCTextInputControllerOutlined.floatingPlaceholderScaleDefault = 0.75
     MDCTextInputControllerOutlined.isFloatingEnabledDefault = true
+    MDCTextInputControllerOutlined.textInputClearButtonTintColorDefault = nil;
 
     MDCTextInputControllerUnderline.roundedCornersDefault = []
     MDCTextInputControllerUnderline.errorColorDefault = nil
@@ -87,6 +89,7 @@
     MDCTextInputControllerUnderline.floatingPlaceholderNormalColorDefault = nil
     MDCTextInputControllerUnderline.floatingPlaceholderScaleDefault = 0.75
     MDCTextInputControllerUnderline.isFloatingEnabledDefault = true
+    MDCTextInputControllerUnderline.textInputClearButtonTintColorDefault = nil;
 
     MDCTextInputControllerFullWidth.errorColorDefault = nil
     MDCTextInputControllerFullWidth.inlinePlaceholderColorDefault = nil
@@ -102,6 +105,8 @@
     MDCTextInputControllerFullWidth.inlinePlaceholderFontDefault = nil
     MDCTextInputControllerFullWidth.leadingUnderlineLabelFontDefault = nil
     MDCTextInputControllerFullWidth.trailingUnderlineLabelFontDefault = nil
+    
+    MDCTextInputControllerFullWidth.textInputClearButtonTintColorDefault = nil
   }
 
   func testFilled() {
@@ -143,6 +148,8 @@
     XCTAssertEqual(MDCTextInputControllerFilled.isFloatingEnabledDefault, true)
     XCTAssertEqual(MDCTextInputControllerFilled.roundedCornersDefault, .allCorners)
 
+    XCTAssertNil(MDCTextInputControllerFilled.textInputClearButtonTintColorDefault)
+
     // Test the use of the class properties.
     let textField = MDCTextField()
     var controller = MDCTextInputControllerFilled(textInput: textField)
@@ -285,7 +292,6 @@
   }
 
   func testOutlined() {
-
     // Test the values of the class properties.
     XCTAssertEqual(MDCTextInputControllerOutlined.errorColorDefault, MDCPalette.red.accent400)
     XCTAssertEqual(MDCTextInputControllerOutlined.inlinePlaceholderColorDefault,
@@ -322,6 +328,8 @@
     XCTAssertEqual(Float(MDCTextInputControllerOutlined.floatingPlaceholderScaleDefault), 0.75)
     XCTAssertEqual(MDCTextInputControllerOutlined.isFloatingEnabledDefault, true)
     XCTAssertEqual(MDCTextInputControllerOutlined.roundedCornersDefault, [])
+    
+    XCTAssertNil(MDCTextInputControllerOutlined.textInputClearButtonTintColorDefault)
 
     // Test the use of the class properties.
     let textField = MDCTextField()
@@ -501,6 +509,8 @@
     XCTAssertEqual(Float(MDCTextInputControllerUnderline.floatingPlaceholderScaleDefault), 0.75)
     XCTAssertEqual(MDCTextInputControllerUnderline.isFloatingEnabledDefault, true)
     XCTAssertEqual(MDCTextInputControllerUnderline.roundedCornersDefault, [])
+    
+    XCTAssertNil(MDCTextInputControllerUnderline.textInputClearButtonTintColorDefault)
 
     // Test the use of the class properties.
     let textField = MDCTextField()
@@ -667,6 +677,8 @@
                    MDCTextInputControllerFullWidth.trailingUnderlineLabelFontDefault)
     XCTAssertEqual(MDCTextInputControllerFullWidth.leadingUnderlineLabelFontDefault,
                    UIFont.mdc_standardFont(forMaterialTextStyle: .caption))
+    
+    XCTAssertNil(MDCTextInputControllerFilled.textInputClearButtonTintColorDefault)
 
     // Test the use of the class properties.
     let textField = MDCTextField()
@@ -778,4 +790,162 @@
     XCTAssertEqual(controller.trailingUnderlineLabelFont,
                    MDCTextInputControllerFullWidth.trailingUnderlineLabelFontDefault)
   }
+
+  // MARK: - textInputClearButtonTintColor
+
+  func testFilledTextInputClearButtonTintColorUsesDefault() {
+    // Given
+    MDCTextInputControllerFilled.textInputClearButtonTintColorDefault = .orange
+
+    // When
+    let textInput = MDCTextField()
+    let controllerFilled = MDCTextInputControllerFilled(textInput: textInput)
+
+    // Then
+    XCTAssertEqual(controllerFilled.textInputClearButtonTintColor,
+                   MDCTextInputControllerFilled.textInputClearButtonTintColorDefault)
+  }
+
+  func testFilledTextInputClearButtonTintColorDefaultAppliesToTextField() {
+    // Given
+    MDCTextInputControllerFilled.textInputClearButtonTintColorDefault = .orange
+
+    // When
+    let textInputFilled = MDCTextField()
+    let _ = MDCTextInputControllerFilled(textInput: textInputFilled)
+
+    // Then
+    XCTAssertEqual(textInputFilled.clearButton.tintColor,
+                   MDCTextInputControllerFilled.textInputClearButtonTintColorDefault)
+  }
+
+  func testFilledTextInputClearButtonTintColorAppliesToTextField() {
+    // Given
+    let textInputFilled = MDCTextField()
+    let controllerFilled = MDCTextInputControllerFilled(textInput: textInputFilled)
+
+    // When
+    controllerFilled.textInputClearButtonTintColor = .black
+
+    // Then
+    XCTAssertEqual(textInputFilled.clearButton.tintColor,
+                   controllerFilled.textInputClearButtonTintColor)
+  }
+
+  func testOutlinedTextInputClearButtonTintColorUsesDefault() {
+    // Given
+    MDCTextInputControllerOutlined.textInputClearButtonTintColorDefault = .cyan
+
+    // When
+    let textInput = MDCTextField()
+    let controllerOutlined = MDCTextInputControllerOutlined(textInput: textInput)
+
+    // Then
+    XCTAssertEqual(controllerOutlined.textInputClearButtonTintColor,
+                   MDCTextInputControllerFilled.textInputClearButtonTintColorDefault)
+  }
+
+  func testOutlinedTextInputClearButtonTintColorDefaultAppliesToTextField() {
+    // Given
+    MDCTextInputControllerOutlined.textInputClearButtonTintColorDefault = .cyan
+
+    // When
+    let textInputOutlined = MDCTextField()
+    let _ = MDCTextInputControllerOutlined(textInput: textInputOutlined)
+
+    // Then
+    XCTAssertEqual(textInputOutlined.clearButton.tintColor,
+                   MDCTextInputControllerFilled.textInputClearButtonTintColorDefault)
+  }
+
+  func testOutlinedTextInputClearButtonTintColorAppliesToTextField() {
+    // Given
+    let textInputOutlined = MDCTextField()
+    let controllerOutlined = MDCTextInputControllerOutlined(textInput: textInputOutlined)
+
+    // When
+    controllerOutlined.textInputClearButtonTintColor = .red
+
+    // Then
+    XCTAssertEqual(textInputOutlined.clearButton.tintColor,
+                   controllerOutlined.textInputClearButtonTintColor)
+  }
+  
+  func testUnderlineTextInputClearButtonTintColorUsesDefault() {
+    // Given
+    MDCTextInputControllerUnderline.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInput = MDCTextField()
+    let controllerUnderline = MDCTextInputControllerUnderline(textInput: textInput)
+    
+    // Then
+    XCTAssertEqual(controllerUnderline.textInputClearButtonTintColor,
+                   MDCTextInputControllerUnderline.textInputClearButtonTintColorDefault)
+  }
+  
+  func testUnderlineTextInputClearButtonTintColorDefaultAppliesToTextField() {
+    // Given
+    MDCTextInputControllerUnderline.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInputUnderline = MDCTextField()
+    let _ = MDCTextInputControllerUnderline(textInput: textInputUnderline)
+    
+    // Then
+    XCTAssertEqual(textInputUnderline.clearButton.tintColor,
+                   MDCTextInputControllerUnderline.textInputClearButtonTintColorDefault)
+  }
+  
+  func testUnderlineTextInputClearButtonTintColorAppliesToTextField() {
+    // Given
+    let textInputUnderline = MDCTextField()
+    let controllerUnderline = MDCTextInputControllerUnderline(textInput: textInputUnderline)
+    
+    // When
+    controllerUnderline.textInputClearButtonTintColor = .black
+    
+    // Then
+    XCTAssertEqual(textInputUnderline.clearButton.tintColor,
+                   controllerUnderline.textInputClearButtonTintColor)
+  }
+  
+  func testFullWidthTextInputClearButtonTintColorUsesDefault() {
+    // Given
+    MDCTextInputControllerFullWidth.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInput = MDCTextField()
+    let controllerFullWidth = MDCTextInputControllerFullWidth(textInput: textInput)
+    
+    // Then
+    XCTAssertEqual(controllerFullWidth.textInputClearButtonTintColor,
+                   MDCTextInputControllerFullWidth.textInputClearButtonTintColorDefault)
+  }
+  
+  func testFullWidthTextInputClearButtonTintColorDefaultAppliesToTextField() {
+    // Given
+    MDCTextInputControllerFullWidth.textInputClearButtonTintColorDefault = .orange
+    
+    // When
+    let textInputFullWidth = MDCTextField()
+    let _ = MDCTextInputControllerFullWidth(textInput: textInputFullWidth)
+    
+    // Then
+    XCTAssertEqual(textInputFullWidth.clearButton.tintColor,
+                   MDCTextInputControllerFullWidth.textInputClearButtonTintColorDefault)
+  }
+  
+  func testFullWidthTextInputClearButtonTintColorAppliesToTextField() {
+    // Given
+    let textInputFullWidth = MDCTextField()
+    let controllerFullWidth = MDCTextInputControllerFullWidth(textInput: textInputFullWidth)
+    
+    // When
+    controllerFullWidth.textInputClearButtonTintColor = .black
+    
+    // Then
+    XCTAssertEqual(textInputFullWidth.clearButton.tintColor,
+                   controllerFullWidth.textInputClearButtonTintColor)
+  }
 }
diff --git a/components/Typography/BUILD b/components/Typography/BUILD
index ae983af..26be641 100644
--- a/components/Typography/BUILD
+++ b/components/Typography/BUILD
@@ -27,6 +27,7 @@
     ],
     deps = [
         "//components/private/Application",
+        "//components/private/Math",
         "@material_internationalization_ios//:MDFInternationalization"
     ],
 )
diff --git a/components/Typography/src/MaterialTypography.h b/components/Typography/src/MaterialTypography.h
index 1275c7a..85a90cf 100644
--- a/components/Typography/src/MaterialTypography.h
+++ b/components/Typography/src/MaterialTypography.h
@@ -25,5 +25,6 @@
 
 #import "MDCFontTextStyle.h"
 #import "MDCTypography.h"
+#import "UIFont+MaterialSimpleEquality.h"
 #import "UIFont+MaterialTypography.h"
 #import "UIFontDescriptor+MaterialTypography.h"
diff --git a/components/Typography/src/UIFont+MaterialSimpleEquality.h b/components/Typography/src/UIFont+MaterialSimpleEquality.h
new file mode 100644
index 0000000..2a2b3b8
--- /dev/null
+++ b/components/Typography/src/UIFont+MaterialSimpleEquality.h
@@ -0,0 +1,39 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+/**
+ The Typography component provides methods for getting sized fonts and opacities following Material
+ style guidelines.
+
+ This header is the umbrella header for the component and should be imported by consumers of the
+ Typography component. Please do not directly import other headers. This will allow the componet to
+ expand or contract the header file space without consumer modifications.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface UIFont (MaterialSimpleEquality)
+
+/*
+ Checks simple characteristics: name, weight, pointsize, traits.
+
+ While the actual implementation of UIFont's isEqual: is not known, it is believed that
+ isSimplyEqual: is more 'shallow' than isEqual:.
+ */
+
+- (BOOL)mdc_isSimplyEqual:(UIFont*)font;
+
+@end
diff --git a/components/Typography/src/UIFont+MaterialSimpleEquality.m b/components/Typography/src/UIFont+MaterialSimpleEquality.m
new file mode 100644
index 0000000..32ccca3
--- /dev/null
+++ b/components/Typography/src/UIFont+MaterialSimpleEquality.m
@@ -0,0 +1,30 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import "UIFont+MaterialSimpleEquality.h"
+
+#import "MaterialMath.h"
+
+@implementation UIFont (MaterialSimpleEquality)
+
+- (BOOL)mdc_isSimplyEqual:(UIFont *)font {
+  return [self.fontName isEqualToString:font.fontName] &&
+         MDCCGFloatEqual(self.pointSize, font.pointSize) &&
+         [[self.fontDescriptor objectForKey:UIFontDescriptorFaceAttribute]
+             isEqual:[font.fontDescriptor objectForKey:UIFontDescriptorFaceAttribute]];
+}
+
+@end
diff --git a/components/Typography/tests/unit/FontEqualityTests.m b/components/Typography/tests/unit/FontEqualityTests.m
new file mode 100644
index 0000000..defc1f5
--- /dev/null
+++ b/components/Typography/tests/unit/FontEqualityTests.m
@@ -0,0 +1,43 @@
+/*
+ Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#import <XCTest/XCTest.h>
+#import "MaterialTypography.h"
+
+@interface FontEqualityTests : XCTestCase
+
+@end
+
+@implementation FontEqualityTests
+
+- (void)testSimpleFontEquality {
+  CGFloat fontSize = 16.0;
+  UIFont *baseFont = [UIFont systemFontOfSize:fontSize];
+  XCTAssertNotNil(baseFont);
+
+  UIFontDescriptor *newDescriptor = [[baseFont fontDescriptor]
+      fontDescriptorByAddingAttributes:@{@"NSCTFontUIUsageAttribute" : UIFontTextStyleBody}];
+  XCTAssertNotNil(newDescriptor);
+
+  UIFont *additionalAttributeFont = [UIFont fontWithDescriptor:newDescriptor size:fontSize];
+  XCTAssertNotNil(additionalAttributeFont);
+
+  XCTAssertFalse(baseFont == additionalAttributeFont);
+  XCTAssertFalse([baseFont isEqual:additionalAttributeFont]);
+  XCTAssertTrue([baseFont mdc_isSimplyEqual:additionalAttributeFont]);
+}
+
+@end
diff --git a/components/private/Math/src/MDCMath.h b/components/private/Math/src/MDCMath.h
index 6b95625..60ca5c3 100644
--- a/components/private/Math/src/MDCMath.h
+++ b/components/private/Math/src/MDCMath.h
@@ -66,7 +66,7 @@
 #endif
 }
 
-static inline bool MDCCGFloatEqual(CGFloat a, CGFloat b) {
+static inline BOOL MDCCGFloatEqual(CGFloat a, CGFloat b) {
   const CGFloat constantK = 3;
 #if CGFLOAT_IS_DOUBLE
   const CGFloat epsilon = DBL_EPSILON;
diff --git a/demos/supplemental/RemoteImageServiceForMDCDemos.podspec b/demos/supplemental/RemoteImageServiceForMDCDemos.podspec
index 59508d5..e05614b 100644
--- a/demos/supplemental/RemoteImageServiceForMDCDemos.podspec
+++ b/demos/supplemental/RemoteImageServiceForMDCDemos.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "RemoteImageServiceForMDCDemos"
-  s.version      = "56.0.0"
+  s.version      = "57.0.0"
   s.summary      = "A helper image class for the MDC demos."
   s.description  = "This spec is made for use in the MDC demos. It gets images via url."
   s.homepage     = "https://github.com/material-components/material-components-ios"