Merge branch 'release-candidate' into stable
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 299476c..7c2c74d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,170 @@
+# 55.2.0
+
+This minor release includes new Snackbar features and minor improvements to the Catalog.
+
+## New features
+
+Snackbar now allows you to change the snackbar message alignment on iPad. For example:
+
+```objc
+MDCSnackbarManager.alignment = MDCSnackbarAlignmentLeading;
+```
+
+Snackbar also exposes a delegate for theming snackbar messages.
+
+```objc
+MDCSnackbarManager.delegate = appDelegate;
+
+- (void)willPresentSnackbarWithMessageView:(nullable MDCSnackbarMessageView *)messageView {
+  // You can theme the individual messageView.actionButtons here.
+}
+```
+
+There is a new shadow elevation constant, `MDCShadowElevationBottomNavigationBar`.
+
+## API changes
+
+### ShadowElevations
+
+#### MDCShadowElevationBottomNavigationBar
+
+*new* constant: `MDCShadowElevationBottomNavigationBar`
+
+### Snackbar
+
+#### MDCSnackbarAlignment
+
+*new* enum value: `MDCSnackbarAlignmentCenter` in `MDCSnackbarAlignment`
+
+*new* enum value: `MDCSnackbarAlignmentLeading` in `MDCSnackbarAlignment`
+
+*new* enum: `MDCSnackbarAlignment`
+
+#### MDCSnackbarMessageView
+
+*new* property: `actionButtons` in `MDCSnackbarMessageView`
+
+#### MDCSnackbarManager
+
+*new* property: `delegate` in `MDCSnackbarManager`
+
+*new* property: `alignment` in `MDCSnackbarManager`
+
+#### MDCSnackbarManagerDelegate
+
+*new* protocol: `MDCSnackbarManagerDelegate`
+
+*new* method: `-willPresentSnackbarWithMessageView:` in `MDCSnackbarManagerDelegate`
+
+## Component changes
+
+### Tabs
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### schemes/Typography
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### FeatureHighlight
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### AppBar
+
+#### Changes
+
+* [Create an example of MDCAppBarContainerViewController usage (#4197)](https://github.com/material-components/material-components-ios/commit/82afdff90d2f40a6c8830c70360943269c821553) (John Detloff)
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### Buttons
+
+#### Changes
+
+* [Disable flaky test. (#4157)](https://github.com/material-components/material-components-ios/commit/480ceda7225a8dc8b0503e06ecc6407c2ebf0a8c) (featherless)
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### ButtonBar
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### TextFields
+
+#### Changes
+
+* [Getting rid of paddedLabel Class since it's not needed anymore. (#4196)](https://github.com/material-components/material-components-ios/commit/9e7db06c7e917cd8fa023f6d885ae58ffa2a74cd) (Mohammad Cazi)
+
+### Chips
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### Snackbar
+
+#### Changes
+
+* [Allow Snackbars to have leading alignment on iPads (#4163)](https://github.com/material-components/material-components-ios/commit/fe0780ce5592553f0b2fce2116f82a5381731afd) (Andrew Overton)
+* [Exposed the snackbar button class (#4171)](https://github.com/material-components/material-components-ios/commit/b9d4698caa1d3652ccddf2f86c18e4838a093674) (Yarden Eitan)
+
+### Slider
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### NavigationBar
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### ActivityIndicator
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### Typography
+
+#### Changes
+
+* [Add unit test to improve coverage (#4198)](https://github.com/material-components/material-components-ios/commit/5f0e12550df56a9db112aaae5617cad4f4a1ff6d) (ianegordon)
+
+### Dialogs
+
+#### Changes
+
+* [Initialize default color and typography schemes in examples (#4200)](https://github.com/material-components/material-components-ios/commit/0c0ce4248edb23aeed4d139a55367192edff710c) (John Detloff)
+
+### BottomNavigation
+
+#### Changes
+
+* [Fix shadow elevation value (#4195)](https://github.com/material-components/material-components-ios/commit/7bf1c4ad8f6d0e974431aa512db5f542d2046131) (Robert Moore)
+
+### FlexibleHeader
+
+#### Changes
+
+* [Always update opacity for views that hide when shifted. (#4170)](https://github.com/material-components/material-components-ios/commit/28b93d5bbf32412a67f101068c2a1b7fedaaeaab) (featherless)
+
+### ShadowElevations
+
+#### Changes
+
+* [Expose BottomNavigationBar elevation (#4194)](https://github.com/material-components/material-components-ios/commit/fb77f5c42cd5ec5c031775cef4d2402b7ae83387) (Robert Moore)
+
+---
+
 # 55.1.0
 
 This minor release introduces some new features to Flexible Header and Snackbar and includes some
diff --git a/CODEOWNERS b/CODEOWNERS
index 073df2b..1f6ba2c 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -40,6 +40,6 @@
 /components/Slider/               @romoore
 /components/Snackbar/             @yarneo
 /components/Tabs/                 @mohammadcazig @brianjmoore
-/components/TextFields/           @willlarche
+/components/TextFields/           @mohammadcazig
 /components/Themes/               @featherless
 /components/Typography/           @randallli
diff --git a/MaterialComponents.podspec b/MaterialComponents.podspec
index 3108627..98b66db 100644
--- a/MaterialComponents.podspec
+++ b/MaterialComponents.podspec
@@ -2,7 +2,7 @@
 
 Pod::Spec.new do |mdc|
   mdc.name         = "MaterialComponents"
-  mdc.version      = "55.1.0"
+  mdc.version      = "55.2.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"
diff --git a/MaterialComponentsEarlGreyTests.podspec b/MaterialComponentsEarlGreyTests.podspec
index d2a7b13..02ebe0c 100644
--- a/MaterialComponentsEarlGreyTests.podspec
+++ b/MaterialComponentsEarlGreyTests.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "MaterialComponentsEarlGreyTests"
-  s.version      = "55.1.0"
+  s.version      = "55.2.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 cc2e104..edb4c17 100644
--- a/MaterialComponentsExamples.podspec
+++ b/MaterialComponentsExamples.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "MaterialComponentsExamples"
-  s.version      = "55.1.0"
+  s.version      = "55.2.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 0cb61fb..2680c3d 100644
--- a/MaterialComponentsUnitTests.podspec
+++ b/MaterialComponentsUnitTests.podspec
@@ -1,6 +1,6 @@
 Pod::Spec.new do |s|
   s.name         = "MaterialComponentsUnitTests"
-  s.version      = "55.1.0"
+  s.version      = "55.2.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 7bfbc46..afb1988 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-55.1.0
+55.2.0
diff --git a/catalog/MDCCatalog/Info.plist b/catalog/MDCCatalog/Info.plist
index b561d9d..da22956 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>55.1.0</string>
+	<string>55.2.0</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
diff --git a/catalog/MaterialCatalog/MaterialCatalog.podspec b/catalog/MaterialCatalog/MaterialCatalog.podspec
index a03e29f..9cb19f5 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      = "55.1.0"
+  s.version      = "55.2.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/ActivityIndicator/examples/ActivityIndicatorExample.m b/components/ActivityIndicator/examples/ActivityIndicatorExample.m
index 4c1b9d6..60e0e8f 100644
--- a/components/ActivityIndicator/examples/ActivityIndicatorExample.m
+++ b/components/ActivityIndicator/examples/ActivityIndicatorExample.m
@@ -35,6 +35,7 @@
   self = [super init];
   if (self) {
     self.title = @"Activity Indicator";
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
   }
   return self;
 }
diff --git a/components/ActivityIndicator/examples/ActivityIndicatorTransitionExample.m b/components/ActivityIndicator/examples/ActivityIndicatorTransitionExample.m
index 6aaa5d7..f563c1e 100644
--- a/components/ActivityIndicator/examples/ActivityIndicatorTransitionExample.m
+++ b/components/ActivityIndicator/examples/ActivityIndicatorTransitionExample.m
@@ -44,6 +44,8 @@
   self = [super init];
   if (self) {
     self.title = @"Activity Indicator Transition";
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
   }
   return self;
 }
diff --git a/components/AppBar/examples/AppBarImageryExample.m b/components/AppBar/examples/AppBarImageryExample.m
index 080d55b..118a207 100644
--- a/components/AppBar/examples/AppBarImageryExample.m
+++ b/components/AppBar/examples/AppBarImageryExample.m
@@ -26,6 +26,14 @@
 
 @implementation AppBarImageryExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/AppBar/examples/AppBarInterfaceBuilderExampleController.m b/components/AppBar/examples/AppBarInterfaceBuilderExampleController.m
index a967ce6..c6d3ab1 100644
--- a/components/AppBar/examples/AppBarInterfaceBuilderExampleController.m
+++ b/components/AppBar/examples/AppBarInterfaceBuilderExampleController.m
@@ -49,6 +49,7 @@
 
 - (void)commonAppBarInterfaceBuilderExampleSetup {
   self.appBar = [[MDCAppBar alloc] init];
+  self.colorScheme = [[MDCSemanticColorScheme alloc] init];
   [self addChildViewController:self.appBar.headerViewController];
 }
 
diff --git a/components/AppBar/examples/AppBarModalPresentationExample.m b/components/AppBar/examples/AppBarModalPresentationExample.m
index 1cb483d..5a4d376 100644
--- a/components/AppBar/examples/AppBarModalPresentationExample.m
+++ b/components/AppBar/examples/AppBarModalPresentationExample.m
@@ -39,6 +39,8 @@
 
     // Set preferred content size
     self.preferredContentSize = CGSizeMake(250, 500);
+
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
   }
   return self;
 }
diff --git a/components/AppBar/examples/AppBarSectionHeadersExample.m b/components/AppBar/examples/AppBarSectionHeadersExample.m
index 8859284..fa0f140 100644
--- a/components/AppBar/examples/AppBarSectionHeadersExample.m
+++ b/components/AppBar/examples/AppBarSectionHeadersExample.m
@@ -37,6 +37,8 @@
     // Step 2: Initialize the App Bar and add the headerViewController as a child.
     _appBar = [[MDCAppBar alloc] init];
     [self addChildViewController:_appBar.headerViewController];
+
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
   }
   return self;
 }
diff --git a/components/AppBar/examples/AppBarTypicalCollectionViewExample.m b/components/AppBar/examples/AppBarTypicalCollectionViewExample.m
index ae7e634..f53681d 100644
--- a/components/AppBar/examples/AppBarTypicalCollectionViewExample.m
+++ b/components/AppBar/examples/AppBarTypicalCollectionViewExample.m
@@ -43,6 +43,9 @@
     // Step 2: Initialize the App Bar and add the headerViewController as a child.
     _appBar = [[MDCAppBar alloc] init];
     [self addChildViewController:_appBar.headerViewController];
+
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
   }
   return self;
 }
diff --git a/components/AppBar/examples/AppBarTypicalUseExample.m b/components/AppBar/examples/AppBarTypicalUseExample.m
index 3b9fa76..a7c4d63 100644
--- a/components/AppBar/examples/AppBarTypicalUseExample.m
+++ b/components/AppBar/examples/AppBarTypicalUseExample.m
@@ -46,6 +46,9 @@
     _appBar.navigationBar.inkColor = [UIColor colorWithWhite:0.9f alpha:0.1f];
 
     _appBar.navigationBar.useFlexibleTopBottomInsets = YES;
+
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
   }
   return self;
 }
diff --git a/components/AppBar/examples/AppBarWrappedExample.m b/components/AppBar/examples/AppBarWrappedExample.m
new file mode 100644
index 0000000..f78c458
--- /dev/null
+++ b/components/AppBar/examples/AppBarWrappedExample.m
@@ -0,0 +1,97 @@
+/*
+ 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"
+
+
+@interface WrappedDemoViewController : UIViewController
+@end
+
+@implementation WrappedDemoViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  self.title = @"Wrapped App Bar";
+
+  self.view.backgroundColor = [UIColor colorWithWhite:0.95f alpha:1];
+
+  UILabel *label = [[UILabel alloc] init];
+  label.text = @"Wrapped UIViewController";
+  [self.view addSubview:label];
+
+  [label sizeToFit];
+  label.center = self.view.center;
+}
+
+@end
+
+@interface AppBarWrappedExample : UIViewController
+
+@property(nonatomic, strong) MDCAppBarContainerViewController *appBarContainerViewController;
+@property(nonatomic, strong) MDCSemanticColorScheme *colorScheme;
+@property(nonatomic, strong) MDCTypographyScheme *typographyScheme;
+
+@end
+
+@implementation AppBarWrappedExample
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  WrappedDemoViewController *demoVC = [[WrappedDemoViewController alloc] init];
+  self.appBarContainerViewController =
+      [[MDCAppBarContainerViewController alloc] initWithContentViewController:demoVC];
+
+  [MDCAppBarColorThemer applySemanticColorScheme:self.colorScheme
+                                        toAppBar:self.appBarContainerViewController.appBar];
+  [MDCAppBarTypographyThemer applyTypographyScheme:self.typographyScheme
+                                          toAppBar:self.appBarContainerViewController.appBar];
+
+  // Need to update the status bar style after applying the theme.
+  [self setNeedsStatusBarAppearanceUpdate];
+
+  [self addChildViewController:self.appBarContainerViewController];
+  self.appBarContainerViewController.view.frame = self.view.bounds;
+  [self.view addSubview:self.appBarContainerViewController.view];
+  [self.appBarContainerViewController didMoveToParentViewController:self];
+}
+
+@end
+
+@implementation AppBarWrappedExample (CatalogByConvention)
+
++ (NSArray *)catalogBreadcrumbs {
+  return @[ @"App Bar", @"Wrapped" ];
+}
+
++ (BOOL)catalogIsPrimaryDemo {
+  return NO;
+}
+
+- (BOOL)catalogShouldHideNavigation {
+  return YES;
+}
+
++ (BOOL)catalogIsPresentable {
+  return YES;
+}
+
+@end
diff --git a/components/BottomNavigation/BUILD b/components/BottomNavigation/BUILD
index a2dac6c..216d345 100644
--- a/components/BottomNavigation/BUILD
+++ b/components/BottomNavigation/BUILD
@@ -29,6 +29,7 @@
     ],
     deps = [
         "//components/Ink",
+        "//components/ShadowElevations",
         "//components/ShadowLayer",
         "//components/Typography",
         "//components/private/Math",
diff --git a/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m b/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m
index 8b53474..85fb092 100644
--- a/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m
+++ b/components/BottomNavigation/examples/BottomNavigationTypicalUseExample.m
@@ -18,7 +18,6 @@
 
 #import "BottomNavigationTypicalUseSupplemental.h"
 
-#import "MaterialAppBar.h"
 #import "MaterialBottomNavigation.h"
 #import "MaterialPalettes.h"
 #import "MaterialBottomNavigation+ColorThemer.h"
@@ -27,7 +26,6 @@
 @interface BottomNavigationTypicalUseExample () <MDCBottomNavigationBarDelegate>
 
 @property(nonatomic, assign) int badgeCount;
-@property(nonatomic, strong) MDCAppBar *appBar;
 @property(nonatomic, strong) MDCBottomNavigationBar *bottomNavBar;
 @end
 
@@ -37,13 +35,11 @@
   self = [super init];
   if (self) {
     self.title = @"Bottom Navigation";
-    [self commonBottomNavigationTypicalUseExampleInit];
   }
   return self;
 }
 
-- (void)commonBottomNavigationTypicalUseExampleInit {
-  [self setupAppBar];
+- (void)commonBottomNavigationTypicalUseExampleViewDidLoad {
 
   _bottomNavBar = [[MDCBottomNavigationBar alloc] initWithFrame:CGRectZero];
   _bottomNavBar.titleVisibility = MDCBottomNavigationBarTitleVisibilitySelected;
@@ -98,12 +94,13 @@
 - (void)viewDidLoad {
   [super viewDidLoad];
 
-  [self.appBar addSubviewsToParent];
+  [self commonBottomNavigationTypicalUseExampleViewDidLoad];
 
   [MDCBottomNavigationBarTypographyThemer applyTypographyScheme:self.typographyScheme
                                           toBottomNavigationBar:_bottomNavBar];
   [MDCBottomNavigationBarColorThemer applySemanticColorScheme:self.colorScheme
                                            toBottomNavigation:_bottomNavBar];
+  self.view.backgroundColor = self.colorScheme.backgroundColor;
 }
 
 - (void)viewWillLayoutSubviews {
@@ -122,8 +119,6 @@
 
 - (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
-  
-  [self.navigationController setNavigationBarHidden:YES animated:animated];
 }
 
 - (void)updateBadgeItemCount {
@@ -148,28 +143,4 @@
   NSLog(@"Selected Item: %@", item.title);
 }
 
-#pragma mark - Configure MDCAppBar for navigation
-
-- (UIViewController *)childViewControllerForStatusBarHidden {
-  return self.appBar.headerViewController;
-}
-
-- (UIViewController *)childViewControllerForStatusBarStyle {
-  return self.appBar.headerViewController;
-}
-
-- (void)setupAppBar {
-  _appBar = [[MDCAppBar alloc] init];
-  [self addChildViewController:_appBar.headerViewController];
-  UIColor *color = [UIColor colorWithWhite:0.2f alpha:1];
-  _appBar.headerViewController.headerView.backgroundColor = color;
-  _appBar.headerViewController.headerView.shiftBehavior = MDCFlexibleHeaderShiftBehaviorEnabled;
-  [_appBar.headerViewController.headerView hideViewWhenShifted:_appBar.headerStackView];
-
-  _appBar.navigationBar.tintColor = [UIColor whiteColor];
-  _appBar.navigationBar.titleTextAttributes =
-      @{ NSForegroundColorAttributeName : [UIColor whiteColor] };
-  self.view.backgroundColor = [UIColor lightGrayColor];
-}
-
 @end
diff --git a/components/BottomNavigation/examples/supplemental/BottomNavigationTypicalUseSupplemental.m b/components/BottomNavigation/examples/supplemental/BottomNavigationTypicalUseSupplemental.m
index e406844..9c28140 100644
--- a/components/BottomNavigation/examples/supplemental/BottomNavigationTypicalUseSupplemental.m
+++ b/components/BottomNavigation/examples/supplemental/BottomNavigationTypicalUseSupplemental.m
@@ -32,10 +32,6 @@
   return YES;
 }
 
-- (BOOL)catalogShouldHideNavigation {
-  return NO;
-}
-
 + (BOOL)catalogIsPresentable {
   return YES;
 }
diff --git a/components/BottomNavigation/src/MDCBottomNavigationBar.m b/components/BottomNavigation/src/MDCBottomNavigationBar.m
index f53f2a6..9bfed55 100644
--- a/components/BottomNavigation/src/MDCBottomNavigationBar.m
+++ b/components/BottomNavigation/src/MDCBottomNavigationBar.m
@@ -20,6 +20,7 @@
 
 #import <MDFInternationalization/MDFInternationalization.h>
 
+#import "MaterialShadowElevations.h"
 #import "MaterialShadowLayer.h"
 #import "MaterialTypography.h"
 #import "private/MaterialBottomNavigationStrings.h"
@@ -52,7 +53,6 @@
 static const CGFloat kMDCBottomNavigationBarHeight = 56.f;
 static const CGFloat kMDCBottomNavigationBarHeightAdjacentTitles = 40.f;
 static const CGFloat kMDCBottomNavigationBarLandscapeContainerWidth = 320.f;
-static const MDCShadowElevation kMDCBottomNavigationBarElevation = 6.f;
 static NSString *const kMDCBottomNavigationBarBadgeColorString = @"badgeColor";
 static NSString *const kMDCBottomNavigationBarBadgeValueString = @"badgeValue";
 static NSString *const kMDCBottomNavigationBarImageString = @"image";
@@ -184,7 +184,7 @@
                                      UIViewAutoresizingFlexibleRightMargin);
   _containerView.clipsToBounds = YES;
   [self addSubview:_containerView];
-  [self setElevation:kMDCBottomNavigationBarElevation];
+  [self setElevation:MDCShadowElevationBottomNavigationBar];
   _itemViews = [NSMutableArray array];
   _itemTitleFont = [UIFont mdc_standardFontForMaterialTextStyle:MDCFontTextStyleCaption];
 }
diff --git a/components/ButtonBar/examples/ButtonBarCustomizedFontExample.m b/components/ButtonBar/examples/ButtonBarCustomizedFontExample.m
index 9c18f94..278c213 100644
--- a/components/ButtonBar/examples/ButtonBarCustomizedFontExample.m
+++ b/components/ButtonBar/examples/ButtonBarCustomizedFontExample.m
@@ -27,6 +27,15 @@
 
 @implementation ButtonBarCustomizedFontExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/ButtonBar/examples/ButtonBarTypicalUseExample.m b/components/ButtonBar/examples/ButtonBarTypicalUseExample.m
index b7a7e53..3c3c716 100644
--- a/components/ButtonBar/examples/ButtonBarTypicalUseExample.m
+++ b/components/ButtonBar/examples/ButtonBarTypicalUseExample.m
@@ -26,6 +26,14 @@
 
 @implementation ButtonBarTypicalUseExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Buttons/examples/ButtonsShapesExampleViewController.m b/components/Buttons/examples/ButtonsShapesExampleViewController.m
index f964b7e..5d8fee2 100644
--- a/components/Buttons/examples/ButtonsShapesExampleViewController.m
+++ b/components/Buttons/examples/ButtonsShapesExampleViewController.m
@@ -29,6 +29,15 @@
 
 @implementation ButtonsShapesExampleViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (MDCButton *)buildCustomStrokedButton {
   MDCButton *button = [[MDCButton alloc] init];
   [button setBorderWidth:1.0 forState:UIControlStateNormal];
diff --git a/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m b/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m
index c86fd7b..235639b 100644
--- a/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m
+++ b/components/Buttons/examples/ButtonsTypicalUseExampleViewController.m
@@ -29,6 +29,15 @@
 
 @implementation ButtonsTypicalUseExampleViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Buttons/examples/FloatingButtonExampleViewController.m b/components/Buttons/examples/FloatingButtonExampleViewController.m
index 3b8097b..065a90d 100644
--- a/components/Buttons/examples/FloatingButtonExampleViewController.m
+++ b/components/Buttons/examples/FloatingButtonExampleViewController.m
@@ -29,6 +29,14 @@
 
 @implementation FloatingButtonExampleViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Buttons/tests/unit/FloatingButtonTests.m b/components/Buttons/tests/unit/FloatingButtonTests.m
index 0e27d37..5c482c3 100644
--- a/components/Buttons/tests/unit/FloatingButtonTests.m
+++ b/components/Buttons/tests/unit/FloatingButtonTests.m
@@ -716,7 +716,9 @@
       NSStringFromCGAffineTransform(transform), NSStringFromCGAffineTransform(button.transform));
 }
 
-- (void)testCollapseExpandAnimatedRestoresTransform {
+// This test is flaky.
+// <unknown>:0: error: -[FloatingButtonsTests testCollapseExpandAnimatedRestoresTransform] : Asynchronous wait failed: Exceeded timeout of 1 seconds, with unfulfilled expectations: "Expand animation complete".
+- (void)disabled_testCollapseExpandAnimatedRestoresTransform {
   // Given
   MDCFloatingButton *button = [[MDCFloatingButton alloc] init];
   CGAffineTransform transform = CGAffineTransformMakeTranslation(10, (CGFloat)-77.1);
diff --git a/components/Chips/examples/ChipsActionExampleViewController.m b/components/Chips/examples/ChipsActionExampleViewController.m
index a95a649..1e65834 100644
--- a/components/Chips/examples/ChipsActionExampleViewController.m
+++ b/components/Chips/examples/ChipsActionExampleViewController.m
@@ -25,6 +25,14 @@
   BOOL _isOutlined;
 }
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)loadView {
   [super loadView];
 
diff --git a/components/Chips/examples/ChipsChoiceExampleViewController.m b/components/Chips/examples/ChipsChoiceExampleViewController.m
index c84455a..9d0051e 100644
--- a/components/Chips/examples/ChipsChoiceExampleViewController.m
+++ b/components/Chips/examples/ChipsChoiceExampleViewController.m
@@ -24,6 +24,14 @@
   BOOL _isOutlined;
 }
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)loadView {
   [super loadView];
   self.view.backgroundColor = [UIColor whiteColor];
diff --git a/components/Chips/examples/ChipsFilterExampleViewController.m b/components/Chips/examples/ChipsFilterExampleViewController.m
index afba2a0..8a362d9 100644
--- a/components/Chips/examples/ChipsFilterExampleViewController.m
+++ b/components/Chips/examples/ChipsFilterExampleViewController.m
@@ -26,6 +26,14 @@
   BOOL _isOutlined;
 }
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)loadView {
   [super loadView];
 
diff --git a/components/Chips/examples/ChipsInputExampleViewController.m b/components/Chips/examples/ChipsInputExampleViewController.m
index 1575838..80b3ff1 100644
--- a/components/Chips/examples/ChipsInputExampleViewController.m
+++ b/components/Chips/examples/ChipsInputExampleViewController.m
@@ -27,6 +27,14 @@
   MDCChipField *_chipField;
 }
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Chips/examples/ChipsTypicalUseViewController.m b/components/Chips/examples/ChipsTypicalUseViewController.m
index 7148714..6a167bd 100644
--- a/components/Chips/examples/ChipsTypicalUseViewController.m
+++ b/components/Chips/examples/ChipsTypicalUseViewController.m
@@ -31,6 +31,7 @@
   if (self) {
     _sizingChip = [[MDCChipView alloc] init];
     _sizingChip.mdc_adjustsFontForContentSizeCategory = YES;
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
   }
   return self;
 }
diff --git a/components/Dialogs/examples/DialogsAlertViewController.m b/components/Dialogs/examples/DialogsAlertViewController.m
index 46a72de..e77aa01 100644
--- a/components/Dialogs/examples/DialogsAlertViewController.m
+++ b/components/Dialogs/examples/DialogsAlertViewController.m
@@ -22,6 +22,15 @@
 
 @implementation DialogsAlertViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Dialogs/examples/DialogsTypicalUseViewController.m b/components/Dialogs/examples/DialogsTypicalUseViewController.m
index 1bb25dd..1e9836a 100644
--- a/components/Dialogs/examples/DialogsTypicalUseViewController.m
+++ b/components/Dialogs/examples/DialogsTypicalUseViewController.m
@@ -26,6 +26,15 @@
 
 @implementation DialogsTypicalUseViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   [self loadCollectionView:@[@"Dismissable Programmatic", @"Dismissable Storyboard",
diff --git a/components/FeatureHighlight/examples/FeatureHighlightShownViewExample.m b/components/FeatureHighlight/examples/FeatureHighlightShownViewExample.m
index c276270..a40947f 100644
--- a/components/FeatureHighlight/examples/FeatureHighlightShownViewExample.m
+++ b/components/FeatureHighlight/examples/FeatureHighlightShownViewExample.m
@@ -24,6 +24,15 @@
 
 @implementation FeatureHighlightShownViewExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)didTapButton:(id)sender {
   MDCButtonScheme *buttonScheme = [[MDCButtonScheme alloc] init];
   buttonScheme.colorScheme = self.colorScheme;
diff --git a/components/FeatureHighlight/examples/FeatureHighlightTypicalUseViewController.m b/components/FeatureHighlight/examples/FeatureHighlightTypicalUseViewController.m
index dc02a1d..703793b 100644
--- a/components/FeatureHighlight/examples/FeatureHighlightTypicalUseViewController.m
+++ b/components/FeatureHighlight/examples/FeatureHighlightTypicalUseViewController.m
@@ -21,6 +21,15 @@
 
 @implementation FeatureHighlightTypicalUseViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)didTapButton:(id)sender {
   MDCFeatureHighlightViewController *vc =
       [[MDCFeatureHighlightViewController alloc] initWithHighlightedView:_button completion:nil];
diff --git a/components/FlexibleHeader/examples/supplemental/FlexibleHeaderConfiguratorSupplemental.m b/components/FlexibleHeader/examples/supplemental/FlexibleHeaderConfiguratorSupplemental.m
index 4105c34..88b4030 100644
--- a/components/FlexibleHeader/examples/supplemental/FlexibleHeaderConfiguratorSupplemental.m
+++ b/components/FlexibleHeader/examples/supplemental/FlexibleHeaderConfiguratorSupplemental.m
@@ -99,6 +99,8 @@
       UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
   [self.fhvc.headerView addSubview:titleLabel];
 
+  [self.fhvc.headerView hideViewWhenShifted:titleLabel];
+
   self.fhvc.headerView.minimumHeight = CGRectGetMaxY(titleLabel.frame);
 
   id (^switchItem)(NSString *, FlexibleHeaderConfiguratorField) = ^(
diff --git a/components/FlexibleHeader/src/MDCFlexibleHeaderView.m b/components/FlexibleHeader/src/MDCFlexibleHeaderView.m
index 165c86a..0881aaa 100644
--- a/components/FlexibleHeader/src/MDCFlexibleHeaderView.m
+++ b/components/FlexibleHeader/src/MDCFlexibleHeaderView.m
@@ -30,9 +30,8 @@
 // The maximum default opacity of the shadow.
 static const float kDefaultVisibleShadowOpacity = 0.4f;
 
-// The threshold in which the _viewsToHideWhenShifted should be fully hidden. 0.5 means the views
-// are completely hidden when the header has shifted half of its content height upwards. This should
-// never be 0.
+// The percentage shifted threshold at which point the _viewsToHideWhenShifted should be fully
+// hidden.
 static const float kContentHidingThreshold = 0.5f;
 
 // This length defines the moment at which the shadow will be fully visible as the header shifts
@@ -841,15 +840,6 @@
   frameBottomEdge = MAX(0, MIN(kShadowScaleLength, frameBottomEdge));
   CGFloat boundedAccumulator = MIN([self fhv_accumulatorMax], _shiftAccumulator);
 
-  if (_shiftBehavior != MDCFlexibleHeaderShiftBehaviorDisabled) {
-    CGFloat contentHeight = self.computedMinimumHeight - MDCDeviceTopSafeAreaInset();
-    CGFloat hideThreshold = kContentHidingThreshold;
-    CGFloat alpha = MAX(contentHeight - boundedAccumulator / hideThreshold, 0) / contentHeight;
-    for (UIView *view in _viewsToHideWhenShifted) {
-      view.alpha = alpha;
-    }
-  }
-
   CGFloat shadowIntensity;
   if (self.hidesStatusBarWhenCollapsed) {
     // Calculate the desired shadow strength for the offset & accumulator and then take the
@@ -1043,8 +1033,9 @@
 // Commit the current shiftOffscreenAccumulator value to the view's position.
 - (void)fhv_commitAccumulatorToFrame {
   CGPoint position = self.center;
+  CGFloat shiftOffset = MIN([self fhv_accumulatorMax], _shiftAccumulator);
   // Offset the frame.
-  position.y = -MIN([self fhv_accumulatorMax], _shiftAccumulator);
+  position.y = -shiftOffset;
   position.y += self.bounds.size.height / 2;
 
   self.center = position;
@@ -1052,6 +1043,15 @@
   [self fhv_accumulatorDidChange];
   [self fhv_recalculatePhase];
 
+  CGFloat opacityShiftThreshold = [self fhv_accumulatorMax] * kContentHidingThreshold;
+  // 0% means not shifted at all, 100% means shifted up to our threshold amount.
+  CGFloat percentShiftedAlongThreshold = MIN(1, MAX(0, shiftOffset / opacityShiftThreshold));
+  for (UIView *view in _viewsToHideWhenShifted) {
+    // When not shifted at all, we want to be fully visible. We invert the percentage to get our
+    // desired alpha.
+    view.alpha = 1 - percentShiftedAlongThreshold;
+  }
+
   [_statusBarShifter setOffset:_shiftAccumulator];
 
   [self.delegate flexibleHeaderViewFrameDidChange:self];
diff --git a/components/LibraryInfo/src/MDCLibraryInfo.m b/components/LibraryInfo/src/MDCLibraryInfo.m
index 58a30d5..470bb9c 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 = @"55.1.0";
+static NSString const *MDCLibraryInfoVersionString = @"55.2.0";
 
 @implementation MDCLibraryInfo
 
diff --git a/components/LibraryInfo/tests/unit/LibraryInfoTests.swift b/components/LibraryInfo/tests/unit/LibraryInfoTests.swift
index bf2f64d..3fa6d45 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: "55.1.0", etc.
+    // Accept: "55.2.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/NavigationBar/examples/NavigationBarIconsExample.m b/components/NavigationBar/examples/NavigationBarIconsExample.m
index c0a12a2..f52983e 100644
--- a/components/NavigationBar/examples/NavigationBarIconsExample.m
+++ b/components/NavigationBar/examples/NavigationBarIconsExample.m
@@ -36,6 +36,15 @@
 @end
 @implementation NavigationBarIconsExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/NavigationBar/examples/NavigationBarLayoutExample.m b/components/NavigationBar/examples/NavigationBarLayoutExample.m
index 4c66a08..6e5da88 100644
--- a/components/NavigationBar/examples/NavigationBarLayoutExample.m
+++ b/components/NavigationBar/examples/NavigationBarLayoutExample.m
@@ -33,6 +33,14 @@
 @end
 @implementation NavigationBarLayoutExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/NavigationBar/examples/NavigationBarTypicalUseExample.m b/components/NavigationBar/examples/NavigationBarTypicalUseExample.m
index 4e596a3..0063663 100644
--- a/components/NavigationBar/examples/NavigationBarTypicalUseExample.m
+++ b/components/NavigationBar/examples/NavigationBarTypicalUseExample.m
@@ -26,6 +26,14 @@
 
 @implementation NavigationBarTypicalUseExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   self.view.backgroundColor = [UIColor whiteColor];
diff --git a/components/NavigationBar/examples/NavigationBarWithBarItemsExample.m b/components/NavigationBar/examples/NavigationBarWithBarItemsExample.m
index e4ee415..19ff9f0 100644
--- a/components/NavigationBar/examples/NavigationBarWithBarItemsExample.m
+++ b/components/NavigationBar/examples/NavigationBarWithBarItemsExample.m
@@ -22,6 +22,14 @@
 
 @implementation NavigationBarWithBarItemsExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   self.view.backgroundColor = [UIColor whiteColor];
diff --git a/components/NavigationBar/examples/NavigationbarWithCustomFont.m b/components/NavigationBar/examples/NavigationbarWithCustomFont.m
index b79bdfa..9322946 100644
--- a/components/NavigationBar/examples/NavigationbarWithCustomFont.m
+++ b/components/NavigationBar/examples/NavigationbarWithCustomFont.m
@@ -22,6 +22,14 @@
 
 @implementation NavigationBarWithCustomFontExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   self.view.backgroundColor = [UIColor whiteColor];
diff --git a/components/ShadowElevations/src/MDCShadowElevations.h b/components/ShadowElevations/src/MDCShadowElevations.h
index 7c68d08..2ba0dab 100644
--- a/components/ShadowElevations/src/MDCShadowElevations.h
+++ b/components/ShadowElevations/src/MDCShadowElevations.h
@@ -35,6 +35,9 @@
 /** The shadow elevation of the app bar. */
 FOUNDATION_EXPORT const MDCShadowElevation MDCShadowElevationAppBar;
 
+/** The shadow elevation of the Bottom App Bar. */
+FOUNDATION_EXPORT const MDCShadowElevation MDCShadowElevationBottomNavigationBar;
+
 /** The shadow elevation of a card in its picked up state. */
 FOUNDATION_EXPORT const MDCShadowElevation MDCShadowElevationCardPickedUp;
 
diff --git a/components/Slider/examples/SliderAutolayoutExampleViewController.m b/components/Slider/examples/SliderAutolayoutExampleViewController.m
index afda815..580812b 100644
--- a/components/Slider/examples/SliderAutolayoutExampleViewController.m
+++ b/components/Slider/examples/SliderAutolayoutExampleViewController.m
@@ -29,6 +29,14 @@
 
 @implementation SliderAutolayoutExampleViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   // Do any additional setup after loading the view, typically from a nib.
diff --git a/components/Slider/examples/SliderCollectionViewController.m b/components/Slider/examples/SliderCollectionViewController.m
index 4d1bd83..eff9963 100644
--- a/components/Slider/examples/SliderCollectionViewController.m
+++ b/components/Slider/examples/SliderCollectionViewController.m
@@ -249,6 +249,8 @@
     model.anchorValue = 0.1f;
     model.enabled = NO;
     [_sliders addObject:model];
+
+    _colorScheme = [[MDCSemanticColorScheme alloc] init];
   }
 
   return self;
diff --git a/components/Slider/examples/SliderCompareExampleViewController.m b/components/Slider/examples/SliderCompareExampleViewController.m
index 8b6d13b..752d975 100644
--- a/components/Slider/examples/SliderCompareExampleViewController.m
+++ b/components/Slider/examples/SliderCompareExampleViewController.m
@@ -27,6 +27,14 @@
 
 @implementation SliderCompareExampleViewController
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   self.view.backgroundColor = [UIColor whiteColor];
diff --git a/components/Snackbar/examples/SnackbarSimpleExample.m b/components/Snackbar/examples/SnackbarSimpleExample.m
index f6dae85..d9ebad6 100644
--- a/components/Snackbar/examples/SnackbarSimpleExample.m
+++ b/components/Snackbar/examples/SnackbarSimpleExample.m
@@ -48,6 +48,7 @@
                                          style:UIBarButtonItemStylePlain
                                         target:self
                                         action:@selector(toggleDynamicType)]];
+  MDCSnackbarManager.delegate = self;
 }
 
 - (void)toggleModes {
@@ -199,4 +200,8 @@
   }
 }
 
+- (void)willPresentSnackbarWithMessageView:(nullable MDCSnackbarMessageView *)messageView {
+  NSLog(@"A snackbar will be presented");
+}
+
 @end
diff --git a/components/Snackbar/examples/supplemental/SnackbarExampleSupplemental.h b/components/Snackbar/examples/supplemental/SnackbarExampleSupplemental.h
index e1b2113..f95dc07 100644
--- a/components/Snackbar/examples/supplemental/SnackbarExampleSupplemental.h
+++ b/components/Snackbar/examples/supplemental/SnackbarExampleSupplemental.h
@@ -19,6 +19,7 @@
 #import "MaterialButtons.h"
 #import "MaterialCollections.h"
 #import "MaterialColorScheme.h"
+#import "MaterialSnackbar.h"
 #import "MaterialTypography.h"
 #import "MaterialTypographyScheme.h"
 
@@ -41,7 +42,7 @@
 
 @end
 
-@interface SnackbarSimpleExample : SnackbarExample
+@interface SnackbarSimpleExample : SnackbarExample <MDCSnackbarManagerDelegate>
 @end
 
 @interface SnackbarSuspensionExample : SnackbarExample
diff --git a/components/Snackbar/src/MDCSnackbarAlignment.h b/components/Snackbar/src/MDCSnackbarAlignment.h
new file mode 100644
index 0000000..d3dc6ec
--- /dev/null
+++ b/components/Snackbar/src/MDCSnackbarAlignment.h
@@ -0,0 +1,32 @@
+/*
+ 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>
+
+/**
+ States used to configure Snackbar alignment.
+ */
+typedef NS_ENUM(NSInteger, MDCSnackbarAlignment) {
+  /**
+   Snackbar is positioned in the center of the screen.
+   */
+  MDCSnackbarAlignmentCenter = 0,
+
+  /**
+   Snackbar is positioned near the leading margin.
+   */
+  MDCSnackbarAlignmentLeading = 1,
+};
diff --git a/components/Snackbar/src/MDCSnackbarManager.h b/components/Snackbar/src/MDCSnackbarManager.h
index 8d60723..fa08ea4 100644
--- a/components/Snackbar/src/MDCSnackbarManager.h
+++ b/components/Snackbar/src/MDCSnackbarManager.h
@@ -15,10 +15,29 @@
  */
 
 #import <UIKit/UIKit.h>
+#import "MDCSnackbarAlignment.h"
 
 @class MDCSnackbarMessage;
+@class MDCSnackbarMessageView;
 @protocol MDCSnackbarSuspensionToken;
 
+
+/**
+ Delegate protocol for the MDCSnackbarManager.
+ */
+@protocol MDCSnackbarManagerDelegate <NSObject>
+
+
+/**
+ This method is called after the MDCSnackbarMessageView instance is initialized and right before
+ The view is presented on the screen.
+
+ @param messageView The messageView of the snackbar that will be presented.
+ */
+- (void)willPresentSnackbarWithMessageView:(nullable MDCSnackbarMessageView *)messageView;
+
+@end
+
 /**
  Provides a means of displaying an unobtrusive message to the user.
 
@@ -33,6 +52,19 @@
 @interface MDCSnackbarManager : NSObject
 
 /**
+ Determines the Snackbar alignment to the screen.
+
+ If called within an animation block, the change will be animated.
+
+ @note This setting is only used when both the horizontal and vertical size classes of the presenting
+ window are @c UIUserInterfaceSizeClassRegular. Otherwise @c MDCSnackbarAlignmentCenter
+ will be used.
+
+ @note The setter must be called from the main thread.
+ */
+@property (class, nonatomic, assign) MDCSnackbarAlignment alignment;
+
+/**
  Shows @c message to the user, in a style consistent with the data contained in @c message.
 
  For messages with the same category, the firing of completion blocks has a guaranteed FIFO
@@ -44,7 +76,7 @@
 /**
  MDCSnackbarManager will display the messages in this view.
 
- Call this method to choose where in the view hierarchy snackbar messages will be presented. It is
+ Call this method to choose where in the view hierarchy Snackbar messages will be presented. It is
  only necessary to provide a host view if the default behavior is unable to find one on it's own,
  most commonly when using MDCSnackbarManager inside an application extension. By default, if you use
  MDCSnackbarManager without calling @c setPresentationHostView, the manager will attempt to find a
@@ -123,34 +155,33 @@
 #pragma mark Styling
 
 /**
- The color for the background of the snackbar message view.
+ The color for the background of the Snackbar message view.
  */
 @property(class, nonatomic, strong, nullable) UIColor *snackbarMessageViewBackgroundColor;
 
 /**
- The color for the shadow color for the snackbar message view.
+ The color for the shadow color for the Snackbar message view.
  */
 @property(class, nonatomic, strong, nullable) UIColor *snackbarMessageViewShadowColor;
 
 /**
- The color for the message text in the snackbar message view.
+ The color for the message text in the Snackbar message view.
  */
 @property(class, nonatomic, strong, nullable) UIColor *messageTextColor;
 
 /**
- The font for the message text in the snackbar message view.
+ The font for the message text in the Snackbar message view.
  */
 @property(class, nonatomic, strong, nullable) UIFont *messageFont;
 
 /**
- The font for the button text in the snackbar message view.
+ The font for the button text in the Snackbar message view.
  */
 @property(class, nonatomic, strong, nullable) UIFont *buttonFont;
 
-
 /**
  If enabled, modifications of class styling properties will be applied immediately
- to the currently presented snackbar.
+ to the currently presented Snackbar.
 
  Default is set to NO.
  */
@@ -173,7 +204,7 @@
 + (void)setButtonTitleColor:(nullable UIColor *)titleColor forState:(UIControlState)state;
 
 /**
- Indicates whether the snackbar should automatically update its font when the device’s
+ Indicates whether the Snackbar should automatically update its font when the device’s
  UIContentSizeCategory is changed.
 
  This property is modeled after the adjustsFontForContentSizeCategory property in the
@@ -187,10 +218,16 @@
 @property(class, nonatomic, readwrite, setter=mdc_setAdjustsFontForContentSizeCategory:)
     BOOL mdc_adjustsFontForContentSizeCategory;
 
+
+/**
+ The delegate for MDCSnackbarManager through which it may inform of snackbar presentation updates.
+ */
+@property(class, nonatomic, weak, nullable) id<MDCSnackbarManagerDelegate> delegate;
+
 @end
 
 /**
- A suspension token is returned when messages are suspended by the snackbar manager.
+ A suspension token is returned when messages are suspended by the Snackbar manager.
 
  Messages are suppressed while a suspension token is kept in memory. Messages will resume being
  displayed when the suspension token is released or when the suspension token is passed to
diff --git a/components/Snackbar/src/MDCSnackbarManager.m b/components/Snackbar/src/MDCSnackbarManager.m
index 8407212..1cc526f 100644
--- a/components/Snackbar/src/MDCSnackbarManager.m
+++ b/components/Snackbar/src/MDCSnackbarManager.m
@@ -42,7 +42,7 @@
 static NSString *const kAllMessagesCategory = @"$$___ALL_MESSAGES___$$";
 
 /**
- The 'actual' snackbar manager which will take care of showing/hiding snackbar messages.
+ The 'actual' Snackbar manager which will take care of showing/hiding Snackbar messages.
  */
 @interface MDCSnackbarManagerInternal : NSObject
 
@@ -60,7 +60,7 @@
 @property(nonatomic) NSMutableDictionary<NSString *, NSMutableSet<NSUUID *> *> *suspensionTokens;
 
 /**
- The view which will host our snackbar messages.
+ The view which will host our Snackbar messages.
  */
 @property(nonatomic) MDCSnackbarOverlayView *overlayView;
 
@@ -70,7 +70,7 @@
 @property(nonatomic) UIView *presentationHostView;
 
 /**
- The currently-showing snackbar.
+ The currently-showing Snackbar.
  */
 @property(nonatomic) MDCSnackbarMessageView *currentSnackbar;
 
@@ -79,6 +79,11 @@
  */
 @property(nonatomic) BOOL showingMessage;
 
+/**
+ The delegate for MDCSnackbarManagerDelegate
+ */
+@property(nonatomic, weak) id<MDCSnackbarManagerDelegate> delegate;
+
 @end
 
 @interface MDCSnackbarManagerSuspensionToken : NSObject <MDCSnackbarSuspensionToken>
@@ -130,7 +135,7 @@
 #pragma mark - Message Displaying
 
 /**
- Determines whether or not a message is eligible to be shown based on the snackbar manager's current
+ Determines whether or not a message is eligible to be shown based on the Snackbar manager's current
  configuration.
 
  @note This method should ensure that messages in the same category are not shown out of order.
@@ -208,9 +213,9 @@
   __block BOOL shouldDismiss = YES;
   MDCSnackbarMessageDismissHandler dismissHandler =
       ^(BOOL userInitiated, MDCSnackbarMessageAction *action) {
-        // Because we start a timer to dismiss the snackbar once it is on screen, there exists the
-        // potential to try and dismiss the snackbar view multiple times, say if the user taps on
-        // the snackbar (dismissal one) and then the timer fires (dismissal two). This check ensures
+        // Because we start a timer to dismiss the Snackbar once it is on screen, there exists the
+        // potential to try and dismiss the Snackbar view multiple times, say if the user taps on
+        // the Snackbar (dismissal one) and then the timer fires (dismissal two). This check ensures
         // that the dismissal logic will only fire one time for a given Snackbar view.
         if (shouldDismiss) {
           shouldDismiss = NO;
@@ -222,6 +227,7 @@
 
   Class viewClass = [message viewClass];
   snackbarView = [[viewClass alloc] initWithMessage:message dismissHandler:dismissHandler];
+  [self.delegate willPresentSnackbarWithMessageView:snackbarView];
   self.currentSnackbar = snackbarView;
   self.overlayView.accessibilityViewIsModal = ![self isSnackbarTransient:snackbarView];
   self.overlayView.hidden = NO;
@@ -252,7 +258,7 @@
                   BOOL hasVoiceOverFocus = UIAccessibilityIsVoiceOverRunning() &&
                                            UIViewHasFocusedAccessibilityElement(strongSnackbarView);
                   if (strongSnackbarView && !hasVoiceOverFocus) {
-                    // Mimic the user tapping on the snackbar.
+                    // Mimic the user tapping on the Snackbar.
                     [strongSnackbarView dismissWithAction:nil userInitiated:NO];
                   }
                 });
@@ -266,7 +272,7 @@
   // Ensure that this method is called on the main thread.
   NSAssert([NSThread isMainThread], @"Method is not called on main thread.");
 
-  // Mark the snackbar as being in the process of dismissal.
+  // Mark the Snackbar as being in the process of dismissal.
   snackbarView.dismissing = YES;
 
   MDCSnackbarMessage *message = snackbarView.message;
@@ -284,7 +290,7 @@
                                        [self deactivateOverlay:self.overlayView];
 
                                        // If VoiceOver had been enabled and the snackbarView was
-                                       // transient, the snackbar was just announced (layout was not
+                                       // transient, the Snackbar was just announced (layout was not
                                        // reported as changed) so there is no need to post a layout
                                        // change here.
                                        if (![self isSnackbarTransient:snackbarView]) {
@@ -294,7 +300,7 @@
 
                                        self.currentSnackbar = nil;
 
-                                       // Now that the snackbar view is offscreen, we can allow more
+                                       // Now that the snackbarView is offscreen, we can allow more
                                        // messages to be shown.
                                        self.showingMessage = NO;
                                        [self showNextMessageIfNecessaryMainThread];
@@ -399,7 +405,7 @@
   // Ensure that this method is called on the main thread.
   NSAssert([NSThread isMainThread], @"Method is not called on main thread.");
 
-  // Make sure that if there is a snackbar on screen, it does not belong to the current category.
+  // Make sure that if there is a Snackbar on screen, it does not belong to the current category.
   if (self.currentSnackbar != nil && !self.currentSnackbar.dismissing) {
     MDCSnackbarMessage *currentMessage = self.currentSnackbar.message;
 
@@ -412,7 +418,7 @@
     }
   }
 
-  // Now that we've ensured that the currently showing snackbar has been taken care of, we can go
+  // Now that we've ensured that the currently showing Snackbar has been taken care of, we can go
   // through pending messages and fire off their completion blocks as we remove them from the
   // queue.
   NSMutableIndexSet *indexesToRemove = [NSMutableIndexSet indexSet];
@@ -424,7 +430,7 @@
           // Mark the message for removal from the pending messages list.
           [indexesToRemove addIndex:idx];
 
-          // Notify the outside world that this snackbar has been completed.
+          // Notify the outside world that this Snackbar has been completed.
           [pendingMessage executeCompletionHandlerWithUserInteraction:NO completion:nil];
         }
       }];
@@ -494,6 +500,16 @@
 
 @implementation MDCSnackbarManager
 
++ (void)setDelegate:(id<MDCSnackbarManagerDelegate>)delegate {
+  MDCSnackbarManagerInternal *manager = [MDCSnackbarManagerInternal sharedInstance];
+  manager.delegate = delegate;
+}
+
++ (id<MDCSnackbarManagerDelegate>)delegate {
+  MDCSnackbarManagerInternal *manager = [MDCSnackbarManagerInternal sharedInstance];
+  return manager.delegate;
+}
+
 + (void)showMessage:(MDCSnackbarMessage *)inputMessage {
   if (!inputMessage) {
     return;
@@ -542,6 +558,18 @@
   manager.overlayView.bottomOffset = offset;
 }
 
++ (void)setAlignment:(MDCSnackbarAlignment)alignment {
+  NSAssert([NSThread isMainThread], @"setAlignment must be called on main thread.");
+
+  MDCSnackbarManagerInternal *manager = [MDCSnackbarManagerInternal sharedInstance];
+  manager.overlayView.alignment = alignment;
+}
+
++ (MDCSnackbarAlignment)alignment {
+  MDCSnackbarManagerInternal *manager = [MDCSnackbarManagerInternal sharedInstance];
+  return manager.overlayView.alignment;
+}
+
 #pragma mark - Suspension
 
 + (id<MDCSnackbarSuspensionToken>)suspendMessagesWithCategory:(NSString *)category {
diff --git a/components/Snackbar/src/MDCSnackbarMessage.h b/components/Snackbar/src/MDCSnackbarMessage.h
index 082e693..62677ed 100644
--- a/components/Snackbar/src/MDCSnackbarMessage.h
+++ b/components/Snackbar/src/MDCSnackbarMessage.h
@@ -24,7 +24,7 @@
 typedef void (^MDCSnackbarMessageCompletionHandler)(BOOL userInitiated);
 
 /**
- Called when the button in the snackbar is tapped.
+ Called when the button in the Snackbar is tapped.
  */
 typedef void (^MDCSnackbarMessageActionHandler)(void);
 
@@ -47,7 +47,7 @@
 /**
  Represents a message to unobtrusively show to the user.
 
- A snackbar message provides brief feedback about an operation. Messages are passed to the snackbar
+ A Snackbar message provides brief feedback about an operation. Messages are passed to the Snackbar
  manager to be displayed.
 
  Snackbars prefer an application's main window is a subclass of @c MDCOverlayWindow. When a standard
@@ -72,7 +72,7 @@
 + (nonnull instancetype)messageWithAttributedText:(nonnull NSAttributedString *)attributedText;
 
 /**
- Use the older legacy version of snackbar. Default is YES.
+ Use the older legacy version of Snackbar. Default is YES.
  */
 @property(class, nonatomic, assign) BOOL usesLegacySnackbar;
 
@@ -87,20 +87,20 @@
  The primary text of the message with styling.
 
  Any attributes supported by UIKit may be set, though font and color will be overridden by the
- snackbar. Either @c text or @c attributedText must be set.
+ Snackbar. Either @c text or @c attributedText must be set.
  */
 @property(nonatomic, copy, nullable) NSAttributedString *attributedText;
 
 /**
  Optional button to show along with the rest of the message.
 
- A MDCSnackbarMessageAction is displayed as a button on the snackbar. If no action is set no button
+ A MDCSnackbarMessageAction is displayed as a button on the Snackbar. If no action is set no button
  will appear on the Snackbar.
  */
 @property(nonatomic, strong, nullable) MDCSnackbarMessageAction *action;
 
 /**
-  The color used for button text on the snackbar in normal state.
+  The color used for button text on the Snackbar in normal state.
 
   Default is nil, but MDCRGBAColor(0xFF, 0xFF, 0xFF, 0.6f) will be set as the default color
   and is taken from MDCSnackbarMessageView's buttonTitleColorForState:
@@ -129,7 +129,7 @@
 
  Default is nil. If set, only the last message of this category will be shown, any currently
  showing or pending messages in this category will be dismissed as if the user had directly tapped
- the snackbar.
+ the Snackbar.
  */
 @property(nonatomic, copy, nullable) NSString *category;
 
@@ -156,7 +156,7 @@
 @property(nonatomic, copy, nullable) NSString *title;
 
 /**
- Called when the button in the snackbar is tapped.
+ Called when the button in the Snackbar is tapped.
 
  Always called on the main thread.
  */
diff --git a/components/Snackbar/src/MDCSnackbarMessageView.h b/components/Snackbar/src/MDCSnackbarMessageView.h
index b7d4fee..dcfa426 100644
--- a/components/Snackbar/src/MDCSnackbarMessageView.h
+++ b/components/Snackbar/src/MDCSnackbarMessageView.h
@@ -15,14 +15,15 @@
  */
 
 #import <UIKit/UIKit.h>
+#import "MaterialButtons.h"
 
 /**
- Class which provides the default implementation of a snackbar.
+ Class which provides the default implementation of a Snackbar.
  */
 @interface MDCSnackbarMessageView : UIView
 
 /**
- The color for the background of the snackbar message view.
+ The color for the background of the Snackbar message view.
 
  The default color is a dark gray color.
  */
@@ -30,7 +31,7 @@
     UIColor *snackbarMessageViewBackgroundColor UI_APPEARANCE_SELECTOR;
 
 /**
- The color for the shadow color for the snackbar message view.
+ The color for the shadow color for the Snackbar message view.
 
  The default color is @c blackColor.
  */
@@ -38,23 +39,28 @@
     UIColor *snackbarMessageViewShadowColor UI_APPEARANCE_SELECTOR;
 
 /**
- The color for the message text in the snackbar message view.
+ The color for the message text in the Snackbar message view.
 
  The default color is @c whiteColor.
  */
 @property(nonatomic, strong, nullable) UIColor *messageTextColor UI_APPEARANCE_SELECTOR;
 
 /**
- The font for the message text in the snackbar message view.
+ The font for the message text in the Snackbar message view.
  */
 @property(nonatomic, strong, nullable) UIFont *messageFont UI_APPEARANCE_SELECTOR;
 
 /**
- The font for the button text in the snackbar message view.
+ The font for the button text in the Snackbar message view.
  */
 @property(nonatomic, strong, nullable) UIFont *buttonFont UI_APPEARANCE_SELECTOR;
 
 /**
+ The array of action buttons of the snackbar.
+ */
+@property(nonatomic, strong, nullable) NSMutableArray<MDCButton *> *actionButtons;
+
+/**
  Returns the button title color for a particular control state.
 
  Default for UIControlStateNormal is MDCRGBAColor(0xFF, 0xFF, 0xFF, 0.6f).
@@ -76,7 +82,7 @@
 
 
 /**
- Indicates whether the snackbar should automatically update its font when the device’s
+ Indicates whether the Snackbar should automatically update its font when the device’s
  UIContentSizeCategory is changed.
 
  This property is modeled after the adjustsFontForContentSizeCategory property in the
diff --git a/components/Snackbar/src/MDCSnackbarMessageView.m b/components/Snackbar/src/MDCSnackbarMessageView.m
index c8c8bae..e1f0474 100644
--- a/components/Snackbar/src/MDCSnackbarMessageView.m
+++ b/components/Snackbar/src/MDCSnackbarMessageView.m
@@ -21,7 +21,6 @@
 #import "MDCSnackbarMessageView.h"
 
 #import "MaterialAnimationTiming.h"
-#import "MaterialButtons.h"
 #import "MaterialTypography.h"
 #import "private/MaterialSnackbarStrings.h"
 #import "private/MaterialSnackbarStrings_table.h"
@@ -39,7 +38,7 @@
 }
 
 /**
- The thickness of the snackbar border.
+ The thickness of the Snackbar border.
  */
 static const CGFloat kBorderWidth = 0;
 
@@ -61,7 +60,7 @@
 static const CGFloat kLegacyCornerRadius = 0;
 
 /**
- Padding between the edges of the snackbar and any content.
+ Padding between the edges of the Snackbar and any content.
  */
 static UIEdgeInsets kContentMargin = (UIEdgeInsets){16.0, 16.0, 16.0, 8.0};
 static UIEdgeInsets kLegacyContentMargin = (UIEdgeInsets){18.0, 24.0, 18.0, 24.0};
@@ -84,12 +83,12 @@
 
 
 /**
- Minimum padding for the vertical padding of the buttons to the snackbar
+ Minimum padding for the vertical padding of the buttons to the Snackbar
  */
 static const CGFloat kMinVerticalButtonPadding = 6.0f;
 
 /**
- The width of the snackbar.
+ The width of the Snackbar.
  */
 static const CGFloat kMinimumViewWidth_iPad = 288.0f;
 static const CGFloat kMaximumViewWidth_iPad = 568.0f;
@@ -97,7 +96,7 @@
 static const CGFloat kMaximumViewWidth_iPhone = 320.0f;
 
 /**
- The minimum height of the snackbar.
+ The minimum height of the Snackbar.
  */
 static const CGFloat kMinimumHeight = 48.0f;
 
@@ -157,7 +156,7 @@
 @property(nonatomic, strong) UIView *contentView;
 
 /**
- Holds onto the dismissal handler, called when the snackbar should dismiss due to user interaction.
+ Holds onto the dismissal handler, called when the Snackbar should dismiss due to user interaction.
  */
 @property(nonatomic, copy) MDCSnackbarMessageDismissHandler dismissalHandler;
 
@@ -174,6 +173,28 @@
     self.inkMaxRippleRadius = kButtonInkRadius;
     self.inkColor = [UIColor colorWithWhite:1 alpha:0.06f];
     self.inkStyle = MDCInkStyleUnbounded;
+
+    CGFloat buttonContentPadding =
+        MDCSnackbarMessage.usesLegacySnackbar ? kLegacyButtonPadding : kButtonPadding;
+    [self setTranslatesAutoresizingMaskIntoConstraints:NO];
+    self.tag = kButtonTagStart;
+
+    // Style the text in the button.
+    self.titleLabel.numberOfLines = 1;
+    self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
+    self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
+    self.contentEdgeInsets = UIEdgeInsetsMake(buttonContentPadding,
+                                                buttonContentPadding,
+                                                buttonContentPadding,
+                                                buttonContentPadding);
+
+    // Make sure the button doesn't get too compressed.
+    [self setContentCompressionResistancePriority:UILayoutPriorityRequired
+                                            forAxis:UILayoutConstraintAxisHorizontal];
+    [self setContentHuggingPriority:UILayoutPriorityDefaultHigh
+                              forAxis:UILayoutConstraintAxisHorizontal];
+
+
   }
   return self;
 }
@@ -238,7 +259,7 @@
       self.layer.shadowRadius = kShadowSpread;
     }
 
-    _anchoredToScreenEdge = YES;
+    _anchoredToScreenBottom = YES;
 
     // Borders are drawn inside of the bounds of a layer. Because our border is translucent, we need
     // to have a view with transparent background and border only (@c self). Inside will be a
@@ -329,7 +350,7 @@
                                            [[self class] bundle],
                                            @"Dismissal accessibility hint for Snackbar");
 
-    // For VoiceOver purposes, the label is the primary 'button' for dismissing the snackbar, so
+    // For VoiceOver purposes, the label is the primary 'button' for dismissing the Snackbar, so
     // we'll make sure the label looks like a button.
     _label.accessibilityTraits = UIAccessibilityTraitButton;
     _label.accessibilityIdentifier = MDCSnackbarMessageTitleAutomationIdentifier;
@@ -386,22 +407,9 @@
     }
 #pragma clang diagnostic pop
 
-    CGFloat buttonContentPadding =
-        MDCSnackbarMessage.usesLegacySnackbar ? kLegacyButtonPadding : kButtonPadding;
-    [button setTranslatesAutoresizingMaskIntoConstraints:NO];
-    button.tag = kButtonTagStart;
     [buttonView addSubview:button];
     [_actionButtons addObject:button];
 
-    // Style the text in the button.
-    button.titleLabel.numberOfLines = 1;
-    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
-    button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
-    button.contentEdgeInsets = UIEdgeInsetsMake(buttonContentPadding,
-                                                buttonContentPadding,
-                                                buttonContentPadding,
-                                                buttonContentPadding);
-
     // Set up the button's accessibility values.
     button.accessibilityIdentifier = message.action.accessibilityIdentifier;
     button.accessibilityHint = message.action.accessibilityHint;
@@ -409,15 +417,12 @@
     [button setTitle:message.action.title forState:UIControlStateNormal];
     [button setTitle:message.action.title forState:UIControlStateHighlighted];
 
-    // Make sure the button doesn't get too compressed.
-    [button setContentCompressionResistancePriority:UILayoutPriorityRequired
-                                            forAxis:UILayoutConstraintAxisHorizontal];
-    [button setContentHuggingPriority:UILayoutPriorityDefaultHigh
-                              forAxis:UILayoutConstraintAxisHorizontal];
     [button addTarget:self
                action:@selector(handleButtonTapped:)
      forControlEvents:UIControlEventTouchUpInside];
 
+    CGFloat buttonContentPadding =
+        MDCSnackbarMessage.usesLegacySnackbar ? kLegacyButtonPadding : kButtonPadding;
     CGSize buttonSize = [button sizeThatFits:CGSizeMake(CGFLOAT_MAX,CGFLOAT_MAX)];
     availableTextWidth -= buttonSize.width;
     availableTextWidth -= 2 * buttonContentPadding;
@@ -635,8 +640,8 @@
 
 #pragma mark - Constraints and layout
 
-- (void)setAnchoredToScreenEdge:(BOOL)anchoredToScreenEdge {
-  _anchoredToScreenEdge = anchoredToScreenEdge;
+- (void)setAnchoredToScreenBottom:(BOOL)anchoredToScreenBottom {
+  _anchoredToScreenBottom = anchoredToScreenBottom;
   [self invalidateIntrinsicContentSize];
 
   if (self.viewConstraints) {
@@ -664,7 +669,7 @@
 }
 
 /**
- Provides constraints to pin the container view to the size of the snackbar, inset by
+ Provides constraints to pin the container view to the size of the Snackbar, inset by
  @c kBorderWidth. Also positions the content view and button view inside of the container view.
  */
 - (NSArray *)containerViewConstraints {
@@ -690,14 +695,14 @@
   NSString *formatString = nil;  // Scratch variable.
   NSMutableArray *constraints = [NSMutableArray array];
 
-  // Pin the left and right edges of the container view to the snackbar.
+  // Pin the left and right edges of the container view to the Snackbar.
   formatString = @"H:|-(==kBorderMargin)-[container]-(==kBorderMargin)-|";
   [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:formatString
                                                                            options:0
                                                                            metrics:metrics
                                                                              views:views]];
 
-  // Pin the top and bottom edges of the container view to the snackbar.
+  // Pin the top and bottom edges of the container view to the Snackbar.
   formatString = @"V:|-(==kBorderMargin)-[container]-(==kContentSafeBottomInset)-|";
   [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:formatString
                                                                            options:0
@@ -874,7 +879,7 @@
       views[@"previousButton"] = previousButton;
     }
 
-    // In a horizontal layout, the button takes on the height of the snackbar.
+    // In a horizontal layout, the button takes on the height of the Snackbar.
     [constraints
         addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[buttonContainer]|"
                                                                     options:0
@@ -953,10 +958,10 @@
 }
 
 - (CGFloat)contentSafeBottomInset {
-  // If a bottom offset has been set to raise the HUD, e.g. above a tab bar, we should ignore
+  // If a bottom offset has been set to raise the HUD/Snackbar, e.g. above a tab bar, we should ignore
   // any safeAreaInsets, since it is no longer 'anchored' to the bottom of the screen. This is set
   // by the MDCSnackbarOverlayView whenever the bottomOffset is non-zero.
-  if (!self.anchoredToScreenEdge || !MDCSnackbarMessage.usesLegacySnackbar) {
+  if (!self.anchoredToScreenBottom || !MDCSnackbarMessage.usesLegacySnackbar) {
     return 0;
   }
 #if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
diff --git a/components/Snackbar/src/MaterialSnackbar.h b/components/Snackbar/src/MaterialSnackbar.h
index 700adbb..22e55e3 100644
--- a/components/Snackbar/src/MaterialSnackbar.h
+++ b/components/Snackbar/src/MaterialSnackbar.h
@@ -14,6 +14,7 @@
  limitations under the License.
  */
 
+#import "MDCSnackbarAlignment.h"
 #import "MDCSnackbarManager.h"
 #import "MDCSnackbarMessage.h"
 #import "MDCSnackbarMessageView.h"
diff --git a/components/Snackbar/src/private/MDCSnackbarMessageViewInternal.h b/components/Snackbar/src/private/MDCSnackbarMessageViewInternal.h
index b1b8dde..7dae68a 100644
--- a/components/Snackbar/src/private/MDCSnackbarMessageViewInternal.h
+++ b/components/Snackbar/src/private/MDCSnackbarMessageViewInternal.h
@@ -20,7 +20,7 @@
 @class MDCSnackbarMessageAction;
 
 /**
- Called by the snackbar message view when the user interacts with the snackbar view.
+ Called by the Snackbar message view when the user interacts with the Snackbar view.
 
  @c userInitiated indicates whether or not the handler is being called due to direct user
  interaction. @c action, if non-nil, indicates that the user chose to execute a specific action.
@@ -31,17 +31,17 @@
 @interface MDCSnackbarMessageView ()
 
 /**
- If the user has tapped on the snackbar or if @c dismissWithAction:userInitiated: has been called.
+ If the user has tapped on the Snackbar or if @c dismissWithAction:userInitiated: has been called.
  */
 @property(nonatomic, getter=isDismissing) BOOL dismissing;
 
 /**
- The minimum width of the snackbar.
+ The minimum width of the Snackbar.
  */
 @property(nonatomic, readonly) CGFloat minimumWidth;
 
 /**
- The maximum width of the snackbar.
+ The maximum width of the Snackbar.
  */
 @property(nonatomic, readonly) CGFloat maximumWidth;
 
@@ -51,14 +51,14 @@
 @property(nonatomic, nullable, readonly, strong) MDCSnackbarMessage *message;
 
 /**
- If the snackbar view should be anchored to the bottom of the screen. Default is YES.
+ If the Snackbar view should be anchored to the bottom of the screen. Default is YES.
  */
-@property(nonatomic) BOOL anchoredToScreenEdge;
+@property(nonatomic) BOOL anchoredToScreenBottom;
 
 /**
- Creates a snackbar view to display @c message.
+ Creates a Snackbar view to display @c message.
 
- The view will call @c handler when the user has interacted with the snackbar view in such a way
+ The view will call @c handler when the user has interacted with the Snackbar view in such a way
  that it needs to be dismissed prior to its timer-based dismissal time.
  */
 - (_Nonnull instancetype)initWithMessage:(MDCSnackbarMessage *_Nullable)message
@@ -95,7 +95,7 @@
 
 
 /**
- Animate the opacity of the snackbar view.
+ Animate the opacity of the Snackbar view.
 
  @param fromOpacity initial opacity to start animation.
  @param toOpacity opacity to finish animation.
@@ -106,7 +106,7 @@
 
 
 /**
- Animate the scale of the snackbar view.
+ Animate the scale of the Snackbar view.
 
  @param fromScale initial scale to start animation.
  @param toScale scale to finish animation.
diff --git a/components/Snackbar/src/private/MDCSnackbarOverlayView.h b/components/Snackbar/src/private/MDCSnackbarOverlayView.h
index a41501d..086dbf3 100644
--- a/components/Snackbar/src/private/MDCSnackbarOverlayView.h
+++ b/components/Snackbar/src/private/MDCSnackbarOverlayView.h
@@ -15,17 +15,18 @@
  */
 
 #import <UIKit/UIKit.h>
+#import "MDCSnackbarAlignment.h"
 
 @class MDCSnackbarMessageView;
 
-/** The identifier reported for the snackbar. */
+/** The identifier reported for the Snackbar. */
 OBJC_EXTERN NSString *const MDCSnackbarOverlayIdentifier;
 
-/** The time it takes to show or hide the snackbar. */
+/** The time it takes to show or hide the Snackbar. */
 OBJC_EXTERN NSTimeInterval const MDCSnackbarLegacyTransitionDuration;
 
 /**
- Custom overlay view for displaying snackbars.
+ Custom overlay view for displaying Snackbars.
  */
 @interface MDCSnackbarOverlayView : UIView
 
@@ -37,9 +38,9 @@
 - (instancetype)initWithFrame:(CGRect)frame;
 
 /**
- Shows the snackbar view with the most appropriate animation.
+ Shows the Snackbar view with the most appropriate animation.
 
- @param snackbarView The snackbar view to display.
+ @param snackbarView The Snackbar view to display.
  @param animated Whether or not the show should be animated.
  @param completion A block to execute when the presentation is finished.
  */
@@ -48,7 +49,7 @@
               completion:(void (^)(void))completion;
 
 /**
- Dismisses the currently showing snackbar view.
+ Dismisses the currently showing Snackbar view.
 
  @param animated Whether or not the dismiss should be animated.
  @param completion A block to execute when the dismissal is finished.
@@ -56,10 +57,20 @@
 - (void)dismissSnackbarViewAnimated:(BOOL)animated completion:(void (^)(void))completion;
 
 /**
- How far from the bottom of the screen should snackbars be presented.
+ How far from the bottom of the screen should Snackbars be presented.
 
  If set inside of an animation block, the change will animate.
  */
 @property(nonatomic) CGFloat bottomOffset;
 
+/**
+ Determines whether the Snackbar is presented in the center of the of the screen or (on iPad only)
+ the leading edge of the screen.
+
+ If called within an animation block, the change will be animated.
+
+ @note This method must be called from the main thread.
+*/
+@property(nonatomic) MDCSnackbarAlignment alignment;
+
 @end
diff --git a/components/Snackbar/src/private/MDCSnackbarOverlayView.m b/components/Snackbar/src/private/MDCSnackbarOverlayView.m
index 0cc86a4..e81b650 100644
--- a/components/Snackbar/src/private/MDCSnackbarOverlayView.m
+++ b/components/Snackbar/src/private/MDCSnackbarOverlayView.m
@@ -14,9 +14,11 @@
  limitations under the License.
  */
 
+#import "MDCSnackbarOverlayView.h"
+
 #import <Foundation/Foundation.h>
 
-#import "MDCSnackbarOverlayView.h"
+#import <MDFInternationalization/MDFInternationalization.h>
 
 #import "../MDCSnackbarMessage.h"
 #import "MDCSnackbarMessageViewInternal.h"
@@ -27,26 +29,26 @@
 
 NSString *const MDCSnackbarOverlayIdentifier = @"MDCSnackbar";
 
-// The time it takes to show or hide the snackbar.
+// The time it takes to show or hide the Snackbar.
 NSTimeInterval const MDCSnackbarEnterTransitionDuration = 0.15f;
 NSTimeInterval const MDCSnackbarExitTransitionDuration = 0.075f;
 NSTimeInterval const MDCSnackbarLegacyTransitionDuration = 0.5f;
 
-// The scaling starting point for presenting the new snackbar.
+// The scaling starting point for presenting the new Snackbar.
 static const CGFloat MDCSnackbarEnterStartingScale = 0.8f;
 
-// How far from the bottom of the screen should the snackbar be.
+// How far from the bottom of the screen should the Snackbar be.
 static const CGFloat MDCSnackbarBottomMargin_iPhone = 8.f;
 static const CGFloat MDCSnackbarBottomMargin_iPad = 24.f;
 static const CGFloat MDCSnackbarLegacyBottomMargin_iPhone = 0.f;
 static const CGFloat MDCSnackbarLegacyBottomMargin_iPad = 0.f;
 
-// How far from the sides of the screen should the snackbar be.
-static const CGFloat MDCSnackbarSideMargin_iPhone = 8.f;
-static const CGFloat MDCSnackbarLegacySideMargin_iPhone = 0.f;
-static const CGFloat MDCSnackbarSideMargin_iPad = 24.0f;
+// How far from the sides of the screen should the Snackbar be.
+static const CGFloat MDCSnackbarSideMargin_CompactWidth = 8.f;
+static const CGFloat MDCSnackbarLegacySideMargin_CompactWidth = 0.f;
+static const CGFloat MDCSnackbarSideMargin_RegularWidth = 24.0f;
 
-// The maximum height of the snackbar.
+// The maximum height of the Snackbar.
 static const CGFloat kMaximumHeight = 80.0f;
 
 #if defined(__IPHONE_10_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)
@@ -57,29 +59,41 @@
 @interface MDCSnackbarOverlayView ()
 
 /**
- The snackbar view to show. Setting this property simply puts the snackbar view into the window
+ The Snackbar view to show. Setting this property simply puts the Snackbar view into the window
  hierarchy and installs constraints which will keep it pinned to the bottom of the screen.
  */
 @property(nonatomic) MDCSnackbarMessageView *snackbarView;
 
 /**
+ The layout constraint which determines how far the Snackbar is from the leading edge of the screen.
+ It is active when the alignment of the parent overlay view is MDCSnackbarAlignmentLeading.
+ */
+@property(nonatomic) NSLayoutConstraint *snackbarViewLeadingConstraint;
+
+/**
+ The layout constraint used to center the Snackbar.
+ It is active when the alignment of the parent overlay view is MDCSnackbarAlignmentCenter.
+ */
+@property(nonatomic) NSLayoutConstraint *snackbarViewCenterConstraint;
+
+/**
  The object which will notify us of changes in the keyboard position.
  */
 @property(nonatomic) MDCKeyboardWatcher *watcher;
 
 /**
  The layout constraint which determines the bottom of the containing view. Setting the constant
- to a negative value will cause snackbars to appear from a point above the bottom of the screen.
+ to a negative value will cause Snackbars to appear from a point above the bottom of the screen.
  */
 @property(nonatomic) NSLayoutConstraint *bottomConstraint;
 
 /**
- The layout constraint which determines the maximum height of the snackbar .
+ The layout constraint which determines the maximum height of the Snackbar .
  */
 @property(nonatomic) NSLayoutConstraint *maximumHeightConstraint;
 
 /**
- The view which actually houses the snackbar. This view is sized to be the same width and height as
+ The view which actually houses the Snackbar. This view is sized to be the same width and height as
  ourselves, except offset from the bottom, based on the keyboard height as well as any user-set
  content offsets.
  */
@@ -87,7 +101,7 @@
 
 /**
  Whether or not we are triggering a layout change ourselves. This is to distinguish when our bounds
- are changing due to rotation rather than us adding/removing a snackbar.
+ are changing due to rotation rather than us adding/removing a Snackbar.
  */
 @property(nonatomic) BOOL manualLayoutChange;
 
@@ -97,12 +111,12 @@
 @property(nonatomic) NSTimeInterval rotationDuration;
 
 /**
- The constraint used to pin the bottom of the snackbar to the bottom of the screen.
+ The constraint used to pin the bottom of the Snackbar to the bottom of the screen.
  */
 @property(nonatomic) NSLayoutConstraint *snackbarOnscreenConstraint;
 
 /**
- The constraint used to pin the top of the snackbar to the bottom of the screen.
+ The constraint used to pin the top of the Snackbar to the bottom of the screen.
  */
 @property(nonatomic) NSLayoutConstraint *snackbarOffscreenConstraint;
 
@@ -159,7 +173,7 @@
  Installs constraints for the ever-present container view.
 
  @note These constraints remain installed for the life of the overlay view, whereas the
-       constraints installed in @c setsnackbarView: come and go with the current snackbar.
+       constraints installed in @c setSnackbarView: come and go with the current Snackbar.
  */
 - (void)setupContainerConstraints {
   [self addConstraint:[NSLayoutConstraint constraintWithItem:_containingView
@@ -232,11 +246,13 @@
 
 - (CGFloat)sideMargin {
   if (MDCSnackbarMessage.usesLegacySnackbar) {
-    return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? MDCSnackbarSideMargin_iPad
-                                                                : MDCSnackbarLegacySideMargin_iPhone;
+    return self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular ?
+        MDCSnackbarSideMargin_RegularWidth :
+        MDCSnackbarLegacySideMargin_CompactWidth;
   }
-  return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? MDCSnackbarSideMargin_iPad
-                                                              : MDCSnackbarSideMargin_iPhone;
+  return self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular ?
+      MDCSnackbarSideMargin_RegularWidth :
+      MDCSnackbarSideMargin_CompactWidth;
 }
 
 - (void)setSnackbarView:(MDCSnackbarMessageView *)snackbarView {
@@ -246,51 +262,41 @@
 
     CGFloat bottomMargin = [self staticBottomMargin];
     CGFloat sideMargin = [self sideMargin];
-    BOOL fullWidth = UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad;
+    CGFloat leftMargin = sideMargin;
+    CGFloat rightMargin = sideMargin;
 
     UIView *container = self.containingView;
 
     if (snackbarView) {
       [container addSubview:snackbarView];
 
-      // Pin the snackbar to the bottom of the screen.
+      // Pin the Snackbar to the bottom of the screen.
       [snackbarView setTranslatesAutoresizingMaskIntoConstraints:NO];
 
-      if (fullWidth) {
-        CGFloat leftMargin = sideMargin;
-        CGFloat rightMargin = sideMargin;
+      BOOL isRegularWidth =
+          self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular;
+      BOOL isRegularHeight =
+          self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular;
+      if (isRegularWidth && isRegularHeight) {
+        self.snackbarViewCenterConstraint =
+            [NSLayoutConstraint constraintWithItem:snackbarView
+                                         attribute:NSLayoutAttributeCenterX
+                                         relatedBy:NSLayoutRelationEqual
+                                            toItem:container
+                                         attribute:NSLayoutAttributeCenterX
+                                        multiplier:1.0
+                                          constant:0];
+        self.snackbarViewCenterConstraint.active = self.alignment == MDCSnackbarAlignmentCenter;
 
-#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
-        if (@available(iOS 11.0, *)) {
-          leftMargin += self.safeAreaInsets.left;
-          rightMargin += self.safeAreaInsets.right;
-        }
-#endif
-
-        [container addConstraint:[NSLayoutConstraint constraintWithItem:snackbarView
-                                                              attribute:NSLayoutAttributeLeading
-                                                              relatedBy:NSLayoutRelationEqual
-                                                                 toItem:container
-                                                              attribute:NSLayoutAttributeLeading
-                                                             multiplier:1.0
-                                                               constant:leftMargin]];
-
-        [container addConstraint:[NSLayoutConstraint constraintWithItem:snackbarView
-                                                              attribute:NSLayoutAttributeTrailing
-                                                              relatedBy:NSLayoutRelationEqual
-                                                                 toItem:container
-                                                              attribute:NSLayoutAttributeTrailing
-                                                             multiplier:1.0
-                                                               constant:-1 * rightMargin]];
-      } else {
-
-        [container addConstraint:[NSLayoutConstraint constraintWithItem:snackbarView
-                                                              attribute:NSLayoutAttributeCenterX
-                                                              relatedBy:NSLayoutRelationEqual
-                                                                 toItem:container
-                                                              attribute:NSLayoutAttributeCenterX
-                                                             multiplier:1.0
-                                                               constant:0]];
+        self.snackbarViewLeadingConstraint =
+            [NSLayoutConstraint constraintWithItem:snackbarView
+                                         attribute:NSLayoutAttributeLeading
+                                         relatedBy:NSLayoutRelationEqual
+                                            toItem:container
+                                         attribute:NSLayoutAttributeLeading
+                                        multiplier:1.0
+                                          constant:sideMargin];
+        self.snackbarViewLeadingConstraint.active = self.alignment == MDCSnackbarAlignmentLeading;
 
         // If not full width, ensure that it doesn't get any larger than our own width.
         [container
@@ -321,6 +327,35 @@
                                                        attribute:NSLayoutAttributeNotAnAttribute
                                                       multiplier:1.0
                                                         constant:[snackbarView maximumWidth]]];
+      } else {
+#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
+        if (@available(iOS 11.0, *)) {
+          if (self.mdf_effectiveUserInterfaceLayoutDirection ==
+              UIUserInterfaceLayoutDirectionLeftToRight) {
+            leftMargin += self.mdc_safeAreaInsets.left;
+            rightMargin += self.mdc_safeAreaInsets.right;
+          } else {
+            leftMargin += self.mdc_safeAreaInsets.right;
+            rightMargin += self.mdc_safeAreaInsets.left;
+          }
+        }
+#endif
+
+        [container addConstraint:[NSLayoutConstraint constraintWithItem:snackbarView
+                                                              attribute:NSLayoutAttributeLeading
+                                                              relatedBy:NSLayoutRelationEqual
+                                                                 toItem:container
+                                                              attribute:NSLayoutAttributeLeading
+                                                             multiplier:1.0
+                                                               constant:leftMargin]];
+
+        [container addConstraint:[NSLayoutConstraint constraintWithItem:snackbarView
+                                                              attribute:NSLayoutAttributeTrailing
+                                                              relatedBy:NSLayoutRelationEqual
+                                                                 toItem:container
+                                                              attribute:NSLayoutAttributeTrailing
+                                                             multiplier:1.0
+                                                               constant:-1 * rightMargin]];
       }
 
       _snackbarOnscreenConstraint = [NSLayoutConstraint constraintWithItem:snackbarView
@@ -337,18 +372,19 @@
       [container addConstraint:_snackbarOnscreenConstraint];
 
       if (MDCSnackbarMessage.usesLegacySnackbar) {
-        _snackbarOffscreenConstraint = [NSLayoutConstraint constraintWithItem:snackbarView
-                                                                    attribute:NSLayoutAttributeTop
-                                                                    relatedBy:NSLayoutRelationEqual
-                                                                       toItem:container
-                                                                    attribute:NSLayoutAttributeBottom
-                                                                   multiplier:1.0
-                                                                     constant:-bottomMargin];
+        _snackbarOffscreenConstraint =
+            [NSLayoutConstraint constraintWithItem:snackbarView
+                                         attribute:NSLayoutAttributeTop
+                                         relatedBy:NSLayoutRelationEqual
+                                            toItem:container
+                                         attribute:NSLayoutAttributeBottom
+                                        multiplier:1.0
+                                          constant:-bottomMargin];
         _snackbarOffscreenConstraint.active = YES;
         [container addConstraint:_snackbarOffscreenConstraint];
       }
 
-      // Always limit the height of the snackbar.
+      // Always limit the height of the Snackbar.
       self.maximumHeightConstraint =
           [NSLayoutConstraint constraintWithItem:snackbarView
                                        attribute:NSLayoutAttributeHeight
@@ -363,8 +399,8 @@
   }
 }
 
-// All we care about is whether or not we tapped on the snackbar view. Everything else should pass
-// through to other windows. Only ask the snackbar view if the given point belongs, and ignore all
+// All we care about is whether or not we tapped on the Snackbar view. Everything else should pass
+// through to other windows. Only ask the Snackbar view if the given point belongs, and ignore all
 // other touches.
 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
   BOOL result = NO;
@@ -379,7 +415,7 @@
 
 - (void)triggerSnackbarLayoutChange {
   self.manualLayoutChange = YES;
-  self.snackbarView.anchoredToScreenEdge = self.anchoredToScreenEdge;
+  self.snackbarView.anchoredToScreenBottom = self.anchoredToScreenBottom;
   [self layoutIfNeeded];
   self.manualLayoutChange = NO;
 }
@@ -402,7 +438,7 @@
   // Maximum height must be extended to include the bottom content safe area.
   CGFloat maximumHeight = kMaximumHeight;
 #if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
-  if (self.anchoredToScreenEdge && MDCSnackbarMessage.usesLegacySnackbar) {
+  if (self.anchoredToScreenBottom && MDCSnackbarMessage.usesLegacySnackbar) {
     if (@available(iOS 11.0, *)) {
       maximumHeight += self.safeAreaInsets.bottom;
     }
@@ -411,7 +447,7 @@
   return maximumHeight;
 }
 
-- (BOOL)anchoredToScreenEdge {
+- (BOOL)anchoredToScreenBottom {
   return [self dynamicBottomMargin] == 0;
 }
 
@@ -422,12 +458,23 @@
   [self triggerSnackbarLayoutChange];
 }
 
+- (UIEdgeInsets)mdc_safeAreaInsets {
+  UIEdgeInsets insets = UIEdgeInsetsZero;
+#if defined(__IPHONE_11_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0)
+  if (@available(iOS 11.0, *)) {
+    // Accommodate insets for iPhone X.
+    insets = self.safeAreaInsets;
+  }
+#endif
+  return insets;
+}
+
 #pragma mark - Presentation/Dismissal
 
 - (void)showSnackbarView:(MDCSnackbarMessageView *)snackbarView
                 animated:(BOOL)animated
               completion:(void (^)(void))completion {
-  self.snackbarView = snackbarView;  // Install the snackbar.
+  self.snackbarView = snackbarView;  // Install the Snackbar.
   self.bottomConstraint.constant = -self.dynamicBottomMargin;
 
   if (animated) {
@@ -443,7 +490,7 @@
   if (animated) {
     [self slideOutMessageView:self.snackbarView
                    completion:^{
-                     self.snackbarView = nil;  // Uninstall the snackbar
+                     self.snackbarView = nil;  // Uninstall the Snackbar
 
                      if (completion) {
                        completion();
@@ -464,7 +511,7 @@
       fromContentOpacity:(CGFloat)fromContentOpacity
         toContentOpacity:(CGFloat)toContentOpacity
               completion:(void (^)(void))completion {
-  // Prepare to move the snackbar.
+  // Prepare to move the Snackbar.
   NSTimeInterval duration = MDCSnackbarLegacyTransitionDuration;
   if (!MDCSnackbarMessage.usesLegacySnackbar) {
     duration = onscreen ? MDCSnackbarEnterTransitionDuration : MDCSnackbarExitTransitionDuration;
@@ -488,7 +535,7 @@
                           delay:0
                         options:0
                      animations:^{
-                       // Trigger snackbar animation.
+                       // Trigger Snackbar animation.
                        [self->_containingView layoutIfNeeded];
                      }
                      completion:nil];
@@ -512,7 +559,7 @@
   [CATransaction commit];
 
   // To support the MDCOverlayObserver seeing frame changes, we need to update the frame of the
-  // new snackbar for the observer, as now it doesn't change frame but rather change opacity.
+  // new Snackbar for the observer, as now it doesn't change frame but rather change opacity.
   // In future we should add support for opacity to our MDCOverlayObserver and not only frame.
   CGRect snackbarRect = [self snackbarRectInScreenCoordinates];
   if (!MDCSnackbarMessage.usesLegacySnackbar && !onscreen) {
@@ -528,7 +575,7 @@
 
 - (void)slideInMessageView:(MDCSnackbarMessageView *)snackbarView
                 completion:(void (^)(void))completion {
-  // Make sure that the snackbar has been properly sized to calculate the translation value.
+  // Make sure that the Snackbar has been properly sized to calculate the translation value.
   [self triggerSnackbarLayoutChange];
 
   [self slideMessageView:snackbarView
@@ -540,7 +587,7 @@
 
 - (void)slideOutMessageView:(MDCSnackbarMessageView *)snackbarView
                  completion:(void (^)(void))completion {
-  // Make sure that the snackbar has been properly sized to calculate the translation value.
+  // Make sure that the Snackbar has been properly sized to calculate the translation value.
   [self triggerSnackbarLayoutChange];
 
   [self slideMessageView:snackbarView
@@ -553,7 +600,7 @@
 #pragma mark - Keyboard Notifications
 
 - (void)updatesnackbarPositionWithKeyboardUserInfo:(NSDictionary *)userInfo {
-  // Always set the bottom constraint, even if there isn't a snackbar currently displayed.
+  // Always set the bottom constraint, even if there isn't a Snackbar currently displayed.
   void (^updateBlock)(void) = ^{
     self.bottomConstraint.constant = -[self dynamicBottomMargin];
     [self triggerSnackbarLayoutChange];
@@ -593,7 +640,7 @@
   [self updatesnackbarPositionWithKeyboardUserInfo:[notification userInfo]];
 }
 
-#pragma mark - Bottom Offset
+#pragma mark - Bottom And Side Margins
 
 - (void)setBottomOffset:(CGFloat)bottomOffset {
   if (_bottomOffset != bottomOffset) {
@@ -603,7 +650,7 @@
     self.bottomConstraint.constant = -self.dynamicBottomMargin;
     [self triggerSnackbarLayoutChange];
 
-    // If there is no snackbar the following method returns CGRectNull, but we still need to notify
+    // If there is no Snackbar the following method returns CGRectNull, but we still need to notify
     // observers of bottom offset changes.
     CGRect frame = [self snackbarRectInScreenCoordinates];
     if (CGRectIsNull(frame)) {
@@ -617,6 +664,45 @@
   }
 }
 
+- (void)setAlignment:(MDCSnackbarAlignment)alignment {
+  if (_alignment != alignment) {
+    _alignment = alignment;
+
+    [self activateSnackbarViewConstraintsForAlignment:alignment];
+
+    [self triggerSnackbarLayoutChange];
+
+    // If there is no Snackbar the following method returns CGRectNull, but we still need to notify
+    // observers of bottom offset changes.
+    CGRect frame = [self snackbarRectInScreenCoordinates];
+    if (CGRectIsNull(frame)) {
+      frame = CGRectMake(0, CGRectGetHeight(self.frame) - self.bottomOffset,
+                         CGRectGetWidth(self.frame), self.bottomOffset);
+    }
+    [self notifyOverlayChangeWithFrame:frame
+                              duration:[CATransaction animationDuration]
+                                 curve:UIViewAnimationCurveEaseInOut
+                        timingFunction:nil];
+  }
+}
+
+- (void)activateSnackbarViewConstraintsForAlignment:(MDCSnackbarAlignment)alignment {
+  switch (alignment) {
+    case MDCSnackbarAlignmentCenter:
+      self.snackbarViewLeadingConstraint.active = NO;
+      self.snackbarViewCenterConstraint.active = YES;
+      break;
+    case MDCSnackbarAlignmentLeading:
+      self.snackbarViewLeadingConstraint.active = YES;
+      self.snackbarViewCenterConstraint.active = NO;
+      break;
+    default:
+      self.snackbarViewLeadingConstraint.active = NO;
+      self.snackbarViewCenterConstraint.active = YES;
+      break;
+  }
+}
+
 #pragma mark - Rotation
 
 - (void)handleRotation {
diff --git a/components/Tabs/examples/BottomNavigationBarExample.m b/components/Tabs/examples/BottomNavigationBarExample.m
index e308805..b2d9724 100644
--- a/components/Tabs/examples/BottomNavigationBarExample.m
+++ b/components/Tabs/examples/BottomNavigationBarExample.m
@@ -27,6 +27,14 @@
   NSArray<UIColor *> *_colors;
 }
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Tabs/examples/TabBarIconExample.m b/components/Tabs/examples/TabBarIconExample.m
index 7eb0ce4..a86e0b6 100644
--- a/components/Tabs/examples/TabBarIconExample.m
+++ b/components/Tabs/examples/TabBarIconExample.m
@@ -27,6 +27,15 @@
 
 @implementation TabBarIconExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Tabs/examples/TabBarInterfaceBuilderExample.m b/components/Tabs/examples/TabBarInterfaceBuilderExample.m
index 271f04d..b2ee445 100644
--- a/components/Tabs/examples/TabBarInterfaceBuilderExample.m
+++ b/components/Tabs/examples/TabBarInterfaceBuilderExample.m
@@ -31,6 +31,14 @@
 
 @implementation TabBarInterfaceBuilderExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
 
diff --git a/components/Tabs/examples/TabBarTextOnlyExample.m b/components/Tabs/examples/TabBarTextOnlyExample.m
index 75554fc..75cb732 100644
--- a/components/Tabs/examples/TabBarTextOnlyExample.m
+++ b/components/Tabs/examples/TabBarTextOnlyExample.m
@@ -30,6 +30,7 @@
   self = [super initWithCollectionViewLayout:layout];
   if (self) {
     [self setupExampleViews:@[@"Change Alignment", @"Toggle Case", @"Clear Selection"]];
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
   }
   return self;
 }
diff --git a/components/Tabs/examples/TabBarViewControllerExample.m b/components/Tabs/examples/TabBarViewControllerExample.m
index 69d1ec8..f77a292 100644
--- a/components/Tabs/examples/TabBarViewControllerExample.m
+++ b/components/Tabs/examples/TabBarViewControllerExample.m
@@ -26,6 +26,15 @@
 
 @implementation TabBarViewControllerExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   self.view.backgroundColor = UIColor.whiteColor;
diff --git a/components/Tabs/examples/TabBarViewControllerInterfaceBuilderExample.m b/components/Tabs/examples/TabBarViewControllerInterfaceBuilderExample.m
index bc1438c..67cc5e9 100644
--- a/components/Tabs/examples/TabBarViewControllerInterfaceBuilderExample.m
+++ b/components/Tabs/examples/TabBarViewControllerInterfaceBuilderExample.m
@@ -26,6 +26,14 @@
 
 @implementation TabBarViewControllerInterfaceBuilderExample
 
+- (id)init {
+  self = [super init];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+  }
+  return self;
+}
+
 - (void)awakeFromNib {
   [super awakeFromNib];
   self.viewControllers = @[
diff --git a/components/TextFields/src/MDCTextInputControllerOutlined.m b/components/TextFields/src/MDCTextInputControllerOutlined.m
index 1ca1181..c3e1bbb 100644
--- a/components/TextFields/src/MDCTextInputControllerOutlined.m
+++ b/components/TextFields/src/MDCTextInputControllerOutlined.m
@@ -22,7 +22,6 @@
 #import "MDCTextInputControllerBase.h"
 #import "MDCTextInputControllerFloatingPlaceholder.h"
 #import "MDCTextInputUnderlineView.h"
-#import "private/MDCPaddedLabel.h"
 #import "private/MDCTextInputControllerBase+Subclassing.h"
 
 #import "MaterialMath.h"
@@ -31,7 +30,7 @@
 
 static const CGFloat MDCTextInputOutlinedTextFieldFullPadding = 16.f;
 static const CGFloat MDCTextInputOutlinedTextFieldNormalPlaceholderPadding = 20.f;
-static const CGFloat MDCTextInputOutlinedTextFieldPlaceholderPadding = 4.f;
+static const CGFloat MDCTextInputOutlinedTextFieldFloatingPlaceholderPadding = 8.f;
 
 static UIRectCorner _roundedCornersDefault = UIRectCornerAllCorners;
 
@@ -69,8 +68,6 @@
   UIOffset offset = [super floatingPlaceholderOffset];
   CGFloat textVerticalOffset = 0;
   offset.vertical = textVerticalOffset;
-  MDCPaddedLabel *placeholderLabel = (MDCPaddedLabel *)self.textInput.placeholderLabel;
-  offset.horizontal += placeholderLabel.horizontalPadding;
   return offset;
 }
 
@@ -140,9 +137,12 @@
         [self.textInput.placeholderLabel systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]
         .width * (CGFloat)self.floatingPlaceholderScale.floatValue;
 
+    placeholderWidth += MDCTextInputOutlinedTextFieldFloatingPlaceholderPadding;
+
     path = [self roundedPathFromRect:pathRect
                        withTextSpace:placeholderWidth
-                          leftOffset:MDCTextInputOutlinedTextFieldFullPadding];
+                          leftOffset:MDCTextInputOutlinedTextFieldFullPadding -
+                                     MDCTextInputOutlinedTextFieldFloatingPlaceholderPadding/2.0f];
   } else {
     CGSize cornerRadius = CGSizeMake(MDCTextInputControllerBaseDefaultBorderRadius,
                                      MDCTextInputControllerBaseDefaultBorderRadius);
@@ -171,9 +171,9 @@
 
   // Draw the path
   [path moveToPoint:CGPointMake(radius + xOffset, yOffset)];
-  [path addLineToPoint:CGPointMake(offset + xOffset - radius, yOffset)];
+  [path addLineToPoint:CGPointMake(offset + xOffset, yOffset)];
 
-  [path moveToPoint:CGPointMake(textSpace + offset + xOffset - radius, yOffset)];
+  [path moveToPoint:CGPointMake(textSpace + offset + xOffset, yOffset)];
 
   [path addLineToPoint:CGPointMake(f.size.width - radius + xOffset, yOffset)];
   [path addArcWithCenter:CGPointMake(f.size.width - radius + xOffset, radius + yOffset)
@@ -229,9 +229,6 @@
   }
   self.placeholderCenterY.constant = placeholderConstant;
 
-  MDCPaddedLabel *placeholderLabel = (MDCPaddedLabel *)self.textInput.placeholderLabel;
-  placeholderLabel.horizontalPadding = MDCTextInputOutlinedTextFieldPlaceholderPadding;
-
   if (!self.placeholderLeading) {
     self.placeholderLeading =
         [NSLayoutConstraint constraintWithItem:self.textInput.placeholderLabel
@@ -240,8 +237,7 @@
                                         toItem:self.textInput
                                      attribute:NSLayoutAttributeLeading
                                     multiplier:1
-                                      constant:MDCTextInputOutlinedTextFieldFullPadding -
-                                               placeholderLabel.horizontalPadding];
+                                      constant:MDCTextInputOutlinedTextFieldFullPadding];
     self.placeholderLeading.priority = UILayoutPriorityDefaultHigh;
     self.placeholderLeading.active = YES;
   }
diff --git a/components/TextFields/src/private/MDCPaddedLabel.h b/components/TextFields/src/private/MDCPaddedLabel.h
deleted file mode 100644
index c26b72c..0000000
--- a/components/TextFields/src/private/MDCPaddedLabel.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- Copyright 2017-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>
-
-/**
- A label with in-frame padding.
-
- @note This label was created for use with auto layout. If you are using manual layout, test it
- first. You may need to adjust code around sizeThatFits: etc.
- */
-@interface MDCPaddedLabel : UILabel
-
-/**
- The padding to be applied.
-
- The padding is applied the same on each side (left and right both get the value of
- .horizontalPadding added to them. This will result in a label that's 2 * .horizontalPadding wider
- than a plain UILabel.
- */
-@property(nonatomic, assign) CGFloat horizontalPadding;
-
-@end
diff --git a/components/TextFields/src/private/MDCPaddedLabel.m b/components/TextFields/src/private/MDCPaddedLabel.m
deleted file mode 100644
index 759d3f5..0000000
--- a/components/TextFields/src/private/MDCPaddedLabel.m
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- Copyright 2017-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 "MDCPaddedLabel.h"
-
-static NSString *const MDCPaddedLabelHorizontalPaddingKey = @"MDCPaddedLabelHorizontalPaddingKey";
-
-@implementation MDCPaddedLabel
-
-- (instancetype)initWithCoder:(NSCoder *)aDecoder {
-  self = [super initWithCoder:aDecoder];
-  if (self) {
-    _horizontalPadding = (CGFloat)[aDecoder decodeDoubleForKey:MDCPaddedLabelHorizontalPaddingKey];
-  }
-  return self;
-}
-
-- (void)encodeWithCoder:(NSCoder *)aCoder {
-  [super encodeWithCoder:aCoder];
-  [aCoder encodeDouble:(double)_horizontalPadding forKey:MDCPaddedLabelHorizontalPaddingKey];
-}
-
-#pragma mark - Setters
-
-- (void)setHorizontalPadding:(CGFloat)horizontalPadding {
-  _horizontalPadding = horizontalPadding;
-
-  [self invalidateIntrinsicContentSize];
-}
-
-#pragma mark - UILabel Overrides
-
-- (void)drawTextInRect:(CGRect)rect {
-  [super drawTextInRect:CGRectInset(rect, self.horizontalPadding, 0)];
-}
-
-#pragma mark - UIView Overrides
-
-- (CGSize)intrinsicContentSize {
-  CGSize size = [super intrinsicContentSize];
-
-  size.width += self.horizontalPadding * 2.f;
-
-  return size;
-}
-
-@end
diff --git a/components/TextFields/src/private/MDCTextInputCommonFundament.m b/components/TextFields/src/private/MDCTextInputCommonFundament.m
index e51d71d..0483169 100644
--- a/components/TextFields/src/private/MDCTextInputCommonFundament.m
+++ b/components/TextFields/src/private/MDCTextInputCommonFundament.m
@@ -18,7 +18,6 @@
 
 #import "MDCMultilineTextField.h"
 #import "MDCMultilineTextInputDelegate.h"
-#import "MDCPaddedLabel.h"
 #import "MDCTextField.h"
 #import "MDCTextFieldPositioningDelegate.h"
 #import "MDCTextInput.h"
@@ -337,7 +336,7 @@
 
 - (void)setupPlaceholderLabel {
   if (!_placeholderLabel) {
-    _placeholderLabel = [[MDCPaddedLabel alloc] initWithFrame:CGRectZero];
+    _placeholderLabel = [[UILabel alloc] initWithFrame:CGRectZero];
   }
   _placeholderLabel.translatesAutoresizingMaskIntoConstraints = NO;
   [_placeholderLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow - 2
diff --git a/components/Typography/BUILD b/components/Typography/BUILD
index a27d326..ae983af 100644
--- a/components/Typography/BUILD
+++ b/components/Typography/BUILD
@@ -32,6 +32,13 @@
 )
 
 mdc_objc_library(
+    name = "private",
+    hdrs = native.glob(["src/private/*.h"]),
+    includes = ["src/private"],
+    visibility = ["//visibility:private"],
+)
+
+mdc_objc_library(
     name = "unit_test_sources",
     testonly = 1,
     srcs = glob(["tests/unit/*.m"]),
@@ -40,7 +47,10 @@
         "UIKit",
         "XCTest",
     ],
-    deps = [":Typography"],
+    deps = [
+        ":Typography",
+        ":private",
+    ],
     visibility = ["//visibility:private"],
 )
 
diff --git a/components/Typography/tests/unit/TypographyTests.m b/components/Typography/tests/unit/TypographyTests.m
index c47150b..e865978 100644
--- a/components/Typography/tests/unit/TypographyTests.m
+++ b/components/Typography/tests/unit/TypographyTests.m
@@ -17,6 +17,7 @@
 #import <XCTest/XCTest.h>
 
 #import "MaterialTypography.h"
+#import "../../src/private/UIFont+MaterialTypographyPrivate.h"
 
 static const CGFloat kEpsilon = 0.001f;
 static const CGFloat kOpacityLight = 0.54f;
@@ -366,4 +367,25 @@
   }
 }
 
+- (void)testExtendedDescription {
+  // Given
+  UIFont *systemFont;
+  if ([UIFont respondsToSelector:@selector(systemFontOfSize:weight:)]) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wpartial-availability"
+    systemFont = [UIFont systemFontOfSize:22.0 weight:UIFontWeightRegular];
+  } else {
+    systemFont = [UIFont systemFontOfSize:22.0];
+  }
+#pragma clang diagnostic pop
+  XCTAssertNotNil(systemFont);
+
+  // When
+  NSString *fontExtendedDescription = [systemFont mdc_extendedDescription];
+
+  // Then
+  XCTAssertNotNil(fontExtendedDescription);
+}
+
+
 @end
diff --git a/components/schemes/Typography/examples/MDCTypographySchemeFontListExampleViewController.m b/components/schemes/Typography/examples/MDCTypographySchemeFontListExampleViewController.m
index 15893d6..51a2539 100644
--- a/components/schemes/Typography/examples/MDCTypographySchemeFontListExampleViewController.m
+++ b/components/schemes/Typography/examples/MDCTypographySchemeFontListExampleViewController.m
@@ -105,7 +105,12 @@
 }
 
 - (instancetype)init {
-  return [super initWithStyle:UITableViewStyleGrouped];
+  self = [super initWithStyle:UITableViewStyleGrouped];
+  if (self) {
+    self.colorScheme = [[MDCSemanticColorScheme alloc] init];
+    self.typographyScheme = [[MDCTypographyScheme alloc] init];
+  }
+  return self;
 }
 
 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
diff --git a/dangerfile.js b/dangerfile.js
deleted file mode 100644
index 4f1a38c..0000000
--- a/dangerfile.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- 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.
- */
-
-const {danger, warn, fail} = require('danger')
-
-// Danger.js documentation: http://danger.systems/js/
-
-// Check for PRs having a [ ] at the beginning of their title.
-
-if (!danger.github.pr.title.startsWith("[")) {
-  warn('This PR title does not include an affected component.'
-    + ' For example: "[SomeComponent] Title. If something is affecting multiple components and the'
-    + ' change can\'t be broken up into multiple PRs, then the common trait of the change could be'
-    + ' used in the PR title. E.g. `[documentation]`.');
-}
-
-// Check for PRs that modify multiple components.
-
-let all_files = danger.git.modified_files
-  .concat(danger.git.deleted_files)
-  .concat(danger.git.created_files);
-
-// Extract any component source modifications.
-let component_files = all_files.filter(function(path) {
-  return path.startsWith('components/') && path.indexOf('/src') >= 0;
-});
-
-// Generate a list of unique components that have been modified.
-let components = Array.from(new Set(component_files.map(function(path) {
-  var path_parts = path.split('/');
-  path_parts.splice(0, 1); // Drop the components/ prefix.
-  
-  var component_path = [];
-  // Convention: all-lower-case names are directories, e.g. `components/private/`.
-  // Capitalized names are components, e.g. `BottomNavigation`.
-  // We want to get the full path up to and including the first component folder.
-  while (path_parts[0][0] == path_parts[0][0].toLowerCase()) {
-    component_path.push(path_parts.splice(0, 1));
-  }
-  // Only return a string if we actually found a component folder
-  // (the string starts with an uppercase character).
-  var first_character = path_parts[0][0];
-  if (first_character == first_character.toUpperCase()) {
-    component_path.push(path_parts.splice(0, 1));
-    return component_path.join('/');
-  }
-  return null;
-}).filter(function(path) { return path !== null; })));
-
-if (components.length > 1) {
-  warn('This PR affects more than one component. Consider splitting it up into smaller PRs if'
-  + ' possible. Components found in this PR: '+components.join(", ")+'.');
-}
diff --git a/demos/supplemental/RemoteImageServiceForMDCDemos.podspec b/demos/supplemental/RemoteImageServiceForMDCDemos.podspec
index 0850b93..3aeba18 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      = "55.1.0"
+  s.version      = "55.2.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"
diff --git a/package.json b/package.json
deleted file mode 100644
index f5fb13f..0000000
--- a/package.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "dependencies": {
-    "danger": "^3.6.5"
-  }
-}