diff --git a/.gitignore b/.gitignore
index 0ef0e2d..10f38dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
 /dart/packages
 /dart/.packages
 /dart/.pub
+/dart/*.log
 /dart/shortcut_commands
 /dart/snapshot_blob.bin
-/.jiri
\ No newline at end of file
+/.jiri
diff --git a/dart/FLUTTER_VERSION b/dart/FLUTTER_VERSION
index b01d319..cd75950 100644
--- a/dart/FLUTTER_VERSION
+++ b/dart/FLUTTER_VERSION
@@ -1 +1 @@
-b70a53807aca5c74c48298f68fcb6f041fedbe9a
+4df24abb336ff5120eba3617d82b0022bbb77b0f
diff --git a/dart/Makefile b/dart/Makefile
index 85074d9..0b8308a 100644
--- a/dart/Makefile
+++ b/dart/Makefile
@@ -67,7 +67,7 @@
 
 .PHONY: build
 build: packages
-	pub run flutter_tools build
+	pub run flutter_tools build flx
 
 .PHONY: create-shortcut
 create-shortcut: clear-shortcut build install-shell
diff --git a/dart/flutter.yaml b/dart/flutter.yaml
index ac78010..ac9fb10 100644
--- a/dart/flutter.yaml
+++ b/dart/flutter.yaml
@@ -1,19 +1,5 @@
 name: syncslides
-material-design-icons:
-  - name: action/account_circle
-  - name: action/delete
-  - name: action/perm_device_information
-  - name: av/loop
-  - name: av/stop
-  - name: av/play_arrow
-  - name: communication/live_help
-  - name: content/add
-  - name: maps/layers
-  - name: navigation/arrow_back
-  - name: navigation/arrow_forward
-  - name: navigation/menu
-  - name: notification/sync
-  - name: maps/layers
+uses-material-design: true
 assets:
   - assets/images/defaults/thumbnail.png
   - assets/images/splash/background.png
diff --git a/dart/lib/components/askquestion.dart b/dart/lib/components/askquestion.dart
index 3762a43..7ffba1a 100644
--- a/dart/lib/components/askquestion.dart
+++ b/dart/lib/components/askquestion.dart
@@ -13,6 +13,7 @@
 
   AskQuestionPage(this._deckId, this._currSlideNum);
 
+  @override
   Widget build(BuildContext context, AppState appState, AppActions appActions) {
     if (!appState.decks.containsKey(_deckId)) {
       // TODO(aghassemi): Proper error page with navigation back to main view.
@@ -27,24 +28,27 @@
 
     // TODO(aghassemi): Switch to multi-line input when support is added.
     // https://github.com/flutter/flutter/issues/627
-    var input = new Input(labelText: 'Your question', autofocus: true,
-        onSubmitted: (String questionText) async {
-      await appActions.askQuestion(
-          deckState.deck.key, _currSlideNum, questionText);
+    var input = new Input(
+        labelText: 'Your question',
+        autofocus: true,
+        onSubmitted: (InputValue questionText) async {
+          await appActions.askQuestion(
+              deckState.deck.key, _currSlideNum, questionText.text);
 
-      // TODO(aghassemi): Add a 'Question submitted.' toast on the parent page.
-      // Blocked on https://github.com/flutter/flutter/issues/608
-      Navigator.pop(context);
-    });
+          // TODO(aghassemi): Add a 'Question submitted.' toast on the parent page.
+          // Blocked on https://github.com/flutter/flutter/issues/608
+          Navigator.pop(context);
+        });
 
-    var view = new Row(children: [input], alignItems: FlexAlignItems.stretch);
+    var view = new Row(
+        children: [input], crossAxisAlignment: CrossAxisAlignment.stretch);
 
     return new Scaffold(
-        toolBar: new ToolBar(
-            left: new IconButton(
-                icon: 'navigation/arrow_back',
+        appBar: new AppBar(
+            leading: new IconButton(
+                icon: Icons.arrow_back,
                 onPressed: () => Navigator.pop(context)),
-            center: new Text('Ask a question')),
+            title: new Text('Ask a question')),
         body: new Material(child: view));
   }
 }
diff --git a/dart/lib/components/deckgrid.dart b/dart/lib/components/deckgrid.dart
index 1131d3f..f920ba8 100644
--- a/dart/lib/components/deckgrid.dart
+++ b/dart/lib/components/deckgrid.dart
@@ -7,7 +7,7 @@
 import '../models/all.dart' as model;
 import '../stores/store.dart';
 import '../styles/common.dart' as style;
-import '../utils/image_provider.dart' as imageProvider;
+import '../utils/image_provider.dart' as image_provider;
 import 'slidelist.dart';
 import 'slideshow.dart';
 import 'syncslides_page.dart';
@@ -18,6 +18,7 @@
 
 // DeckGridPage is the full page view of the list of decks.
 class DeckGridPage extends SyncSlidesPage {
+  @override
   Widget build(BuildContext context, AppState appState, AppActions appActions) {
     // Advertised decks.
     List<model.PresentationAdvertisement> presentations =
@@ -25,32 +26,33 @@
 
     // Local decks that are not advertised.
     List<model.Deck> decks = appState.decks.values
-        .where((DeckState d) => d.deck != null &&
+        .where((DeckState d) =>
+            d.deck != null &&
             !presentations.any((model.PresentationAdvertisement p) =>
                 p.deck.key == d.deck.key))
         .map((DeckState d) => d.deck);
 
     return new Scaffold(
         key: _scaffoldKey,
-        toolBar: new ToolBar(center: new Text('SyncSlides')),
+        appBar: new AppBar(title: new Text('SyncSlides')),
         floatingActionButton: new FloatingActionButton(
-            child: new Icon(icon: 'content/add'), onPressed: () {
-          appActions.loadDeckFromSdCard();
-        }),
+            child: new Icon(icon: Icons.add),
+            onPressed: () {
+              appActions.loadDeckFromSdCard();
+            }),
         drawer: _buildDrawer(context, appState),
         body: new Material(
             child: new DeckGrid(decks, presentations, appState, appActions)));
   }
 
   Widget _buildDrawer(BuildContext context, AppState appState) {
-    return new Drawer(
-        child: new Block(children: [
+    return new Drawer(child: new Block(children: [
       new DrawerItem(
-          icon: 'action/account_circle',
+          icon: Icons.account_circle,
           child: stopWrapping(
               new Text(appState.user.name, style: style.Text.titleStyle))),
       new DrawerItem(
-          icon: 'action/perm_device_information',
+          icon: Icons.devices,
           child: stopWrapping(new Text(appState.settings.deviceId,
               style: style.Text.titleStyle)))
     ]));
@@ -58,7 +60,7 @@
 }
 
 // DeckGrid is scrollable grid view of decks.
-class DeckGrid extends StatelessComponent {
+class DeckGrid extends StatelessWidget {
   AppActions _appActions;
   AppState _appState;
   List<model.Deck> _decks;
@@ -66,6 +68,7 @@
 
   DeckGrid(this._decks, this._presentations, this._appState, this._appActions);
 
+  @override
   Widget build(BuildContext context) {
     List<Widget> deckBoxes = _decks.map((deck) => _buildDeckBox(context, deck));
     List<Widget> presentationBoxes = _presentations
@@ -80,7 +83,7 @@
 
   Widget _buildDeckBox(BuildContext context, model.Deck deckData) {
     var thumbnail = new AsyncImage(
-        provider: imageProvider.getDeckThumbnailImage(deckData),
+        provider: image_provider.getDeckThumbnailImage(deckData),
         fit: ImageFit.scaleDown);
 
     var resumeLiveBox;
@@ -108,7 +111,7 @@
   Widget _buildPresentationBox(
       BuildContext context, model.PresentationAdvertisement presentationData) {
     var thumbnail = new AsyncImage(
-        provider: imageProvider.getDeckThumbnailImage(presentationData.deck),
+        provider: image_provider.getDeckThumbnailImage(presentationData.deck),
         fit: ImageFit.scaleDown);
     var liveBox = new Row(children: [
       new Container(
@@ -130,12 +133,10 @@
 
         Navigator.openTransaction(context, (NavigatorTransaction transaction) {
           // Push slides list page first before navigating to the slideshow.
-          transaction.push(new MaterialPageRoute(
-              builder: (context) =>
-                  new SlideListPage(presentationData.deck.key)));
-          transaction.push(new MaterialPageRoute(
-              builder: (context) =>
-                  new SlideshowPage(presentationData.deck.key)));
+          transaction.push(new MaterialPageRoute(builder: (context) =>
+              new SlideListPage(presentationData.deck.key)));
+          transaction.push(new MaterialPageRoute(builder: (context) =>
+              new SlideshowPage(presentationData.deck.key)));
         });
       } catch (e) {
         toast.error(_scaffoldKey,
@@ -168,9 +169,9 @@
             new Size.fromHeight(style.Size.boxFooterHeight)));
     footer = new Flexible(child: footer, flex: 0);
     var content = new Container(
-        child: new Card(
-            child: new Column(
-                children: [image, footer], alignItems: FlexAlignItems.stretch)),
+        child: new Card(child: new Column(
+            children: [image, footer],
+            crossAxisAlignment: CrossAxisAlignment.stretch)),
         margin: style.Spacing.normalMargin);
 
     return new InkWell(key: new Key(key), child: content, onTap: onTap);
diff --git a/dart/lib/components/questionlist.dart b/dart/lib/components/questionlist.dart
index 8182ffb..1159de6 100644
--- a/dart/lib/components/questionlist.dart
+++ b/dart/lib/components/questionlist.dart
@@ -8,7 +8,7 @@
 import '../models/all.dart' as model;
 import '../stores/store.dart';
 import '../styles/common.dart' as style;
-import '../utils/image_provider.dart' as imageProvider;
+import '../utils/image_provider.dart' as image_provider;
 import 'syncslides_page.dart';
 import 'toast.dart' as toast;
 
@@ -19,6 +19,7 @@
 
   QuestionListPage(this._deckId);
 
+  @override
   Widget build(BuildContext context, AppState appState, AppActions appActions) {
     if (!appState.decks.containsKey(_deckId)) {
       // TODO(aghassemi): Proper error page with navigation back to main view.
@@ -37,18 +38,17 @@
 
     return new Scaffold(
         key: _scaffoldKey,
-        toolBar: new ToolBar(
-            left: new IconButton(
-                icon: 'navigation/arrow_back',
+        appBar: new AppBar(
+            leading: new IconButton(
+                icon: Icons.arrow_back,
                 onPressed: () => Navigator.pop(context)),
-            center: new Text('Answer questions')),
-        body: new Material(
-            child: new QuestionList(_deckId, presentationState,
-                deckState.slides, appActions, appState)));
+            title: new Text('Answer questions')),
+        body: new Material(child: new QuestionList(_deckId, presentationState,
+            deckState.slides, appActions, appState)));
   }
 }
 
-class QuestionList extends StatelessComponent {
+class QuestionList extends StatelessWidget {
   String _deckId;
   PresentationState _presentationState;
   List<model.Slide> _slides;
@@ -57,6 +57,7 @@
   QuestionList(this._deckId, this._presentationState, this._slides,
       this._appActions, this._appState);
 
+  @override
   Widget build(BuildContext context) {
     List<Widget> questionCards = _presentationState.questions
         .map((model.Question q) => _buildQuestionCard(context, q))
@@ -71,10 +72,12 @@
 
     Widget jumpToSlide;
     if (_presentationState.isDriving(_appState.user)) {
-      jumpToSlide = new IconButton(icon: 'av/loop', onPressed: () async {
-        await _appActions.setCurrSlideNum(_deckId, q.slideNum);
-        toast.info(_scaffoldKey, 'Jumped to slide ${q.slideNum + 1}');
-      });
+      jumpToSlide = new IconButton(
+          icon: Icons.loop,
+          onPressed: () async {
+            await _appActions.setCurrSlideNum(_deckId, q.slideNum);
+            toast.info(_scaffoldKey, 'Jumped to slide ${q.slideNum + 1}');
+          });
       titleChildren.add(jumpToSlide);
     }
 
@@ -82,41 +85,40 @@
       new Text('${q.questioner.name} asked about',
           style: style.Text.subtitleStyle),
       new Row(children: titleChildren)
-    ], alignItems: FlexAlignItems.start);
+    ], crossAxisAlignment: CrossAxisAlignment.start);
 
-    Widget thumbnail = new Container(
-        child: new AsyncImage(
-            width: style.Size.questionListThumbnailWidth,
-            provider:
-                imageProvider.getSlideImage(_deckId, _slides[q.slideNum])));
+    Widget thumbnail = new Container(child: new AsyncImage(
+        width: style.Size.questionListThumbnailWidth,
+        provider: image_provider.getSlideImage(_deckId, _slides[q.slideNum])));
 
     Widget titleAndThumbnail = new Row(children: [
       new Flexible(child: title, flex: 2),
       new Flexible(child: thumbnail, flex: 1)
-    ], alignItems: FlexAlignItems.start);
+    ], crossAxisAlignment: CrossAxisAlignment.start);
 
     Widget question = new Container(
         child: new BlockBody(children: [titleAndThumbnail, new Text(q.text)]),
         padding: style.Spacing.normalPadding);
 
-    Widget handoff = new GestureDetector(onTap: () async {
-      await _appActions.setDriver(_deckId, q.questioner);
-      Navigator.pop(context);
-    }, child: new Container(child: new Text('HAND OFF')));
+    Widget handoff = new GestureDetector(
+        onTap: () async {
+          await _appActions.setDriver(_deckId, q.questioner);
+          Navigator.pop(context);
+        },
+        child: new Container(child: new Text('HAND OFF')));
 
     Widget actions = new Container(
         padding: style.Spacing.normalPadding,
-        decoration: new BoxDecoration(
-            border: new Border(
-                top: new BorderSide(color: style.theme.dividerColor))),
+        decoration: new BoxDecoration(border: new Border(
+            top: new BorderSide(color: style.theme.dividerColor))),
         child: new DefaultTextStyle(
             style: new TextStyle(color: style.theme.accentColor),
             child: new Row(
-                children: [handoff], justifyContent: FlexJustifyContent.end)));
+                children: [handoff],
+                mainAxisAlignment: MainAxisAlignment.end)));
 
-    return new Card(
-        child: new Container(
-            child: new BlockBody(children: [question, actions]),
-            margin: style.Spacing.listItemMargin));
+    return new Card(child: new Container(
+        child: new BlockBody(children: [question, actions]),
+        margin: style.Spacing.listItemMargin));
   }
 }
diff --git a/dart/lib/components/slidelist.dart b/dart/lib/components/slidelist.dart
index ac09153..514a5a1 100644
--- a/dart/lib/components/slidelist.dart
+++ b/dart/lib/components/slidelist.dart
@@ -7,7 +7,7 @@
 import '../models/all.dart' as model;
 import '../stores/store.dart';
 import '../styles/common.dart' as style;
-import '../utils/image_provider.dart' as imageProvider;
+import '../utils/image_provider.dart' as image_provider;
 import 'slideshow.dart';
 import 'syncslides_page.dart';
 import 'toast.dart' as toast;
@@ -19,6 +19,7 @@
 
   SlideListPage(this._deckId);
 
+  @override
   Widget build(BuildContext context, AppState appState, AppActions appActions) {
     if (!appState.decks.containsKey(_deckId)) {
       // TODO(aghassemi): Proper error page with navigation back to main view.
@@ -33,79 +34,86 @@
     }
     return new Scaffold(
         key: _scaffoldKey,
-        toolBar: new ToolBar(
-            left: new IconButton(
-                icon: 'navigation/arrow_back',
+        appBar: new AppBar(
+            leading: new IconButton(
+                icon: Icons.arrow_back,
                 onPressed: () => Navigator.pop(context)),
-            center: new Text(deckState.deck.name),
-            right: toolbarActions),
+            title: new Text(deckState.deck.name),
+            actions: toolbarActions),
         floatingActionButton: _buildFab(context, appState, appActions),
         body: new Material(child: new SlideList(_deckId, slides, appActions)));
   }
 
-  _buildDelete(BuildContext context, AppState appState, AppActions appActions) {
+  IconButton _buildDelete(
+      BuildContext context, AppState appState, AppActions appActions) {
     var deckState = appState.decks[_deckId];
     if (deckState.presentation != null) {
       // Can't delete while in a presentation.
       return null;
     }
 
-    return new IconButton(icon: 'action/delete', onPressed: () async {
-      await appActions.removeDeck(deckState.deck.key);
-      Navigator.pop(context);
-    });
+    return new IconButton(
+        icon: Icons.delete,
+        onPressed: () async {
+          await appActions.removeDeck(deckState.deck.key);
+          Navigator.pop(context);
+        });
   }
 
-  _buildFab(BuildContext context, AppState appState, AppActions appActions) {
+  FloatingActionButton _buildFab(
+      BuildContext context, AppState appState, AppActions appActions) {
     var deckState = appState.decks[_deckId];
 
     if (deckState.presentation == null) {
-      return new FloatingActionButton(child: new Icon(icon: 'av/play_arrow'),
+      return new FloatingActionButton(
+          child: new Icon(icon: Icons.play_arrow),
           onPressed: () async {
-        toast.info(_scaffoldKey, 'Starting presentation...',
-            duration: toast.Durations.permanent);
+            toast.info(_scaffoldKey, 'Starting presentation...',
+                duration: toast.Durations.permanent);
 
-        try {
-          await appActions.startPresentation(_deckId);
-          toast.info(_scaffoldKey, 'Presentation started.');
+            try {
+              await appActions.startPresentation(_deckId);
+              toast.info(_scaffoldKey, 'Presentation started.');
 
-          Navigator.push(
-              context,
-              new MaterialPageRoute(
-                  builder: (context) => new SlideshowPage(_deckId)));
-        } catch (e) {
-          toast.error(_scaffoldKey, 'Failed to start presentation.', e);
-        }
-      });
+              Navigator.push(
+                  context,
+                  new MaterialPageRoute(
+                      builder: (context) => new SlideshowPage(_deckId)));
+            } catch (e) {
+              toast.error(_scaffoldKey, 'Failed to start presentation.', e);
+            }
+          });
     }
 
     // Already presenting own deck, allow for stopping it.
     if (deckState.presentation != null && deckState.presentation.isOwner) {
       var key = deckState.presentation.key;
-      return new FloatingActionButton(child: new Icon(icon: 'av/stop'),
+      return new FloatingActionButton(
+          child: new Icon(icon: Icons.stop),
           onPressed: () async {
-        toast.info(_scaffoldKey, 'Stopping presentation...',
-            duration: toast.Durations.permanent);
+            toast.info(_scaffoldKey, 'Stopping presentation...',
+                duration: toast.Durations.permanent);
 
-        try {
-          await appActions.stopPresentation(key);
-          toast.info(_scaffoldKey, 'Presentation stopped.');
-        } catch (e) {
-          toast.error(_scaffoldKey, 'Failed to stop presentation.', e);
-        }
-      });
+            try {
+              await appActions.stopPresentation(key);
+              toast.info(_scaffoldKey, 'Presentation stopped.');
+            } catch (e) {
+              toast.error(_scaffoldKey, 'Failed to stop presentation.', e);
+            }
+          });
     }
 
     return null;
   }
 }
 
-class SlideList extends StatelessComponent {
+class SlideList extends StatelessWidget {
   String _deckId;
   List<model.Slide> _slides = new List<model.Slide>();
   AppActions _appActions;
   SlideList(this._deckId, this._slides, this._appActions);
 
+  @override
   Widget build(BuildContext context) {
     Iterable<Widget> items = _slides.map(
         (slide) => _buildSlide(context, _deckId, slide.num, slide, onTap: () {
@@ -126,7 +134,7 @@
     BuildContext context, String deckId, int slideIndex, model.Slide slideData,
     {Function onTap}) {
   var thumbnail = new AsyncImage(
-      provider: imageProvider.getSlideImage(deckId, slideData),
+      provider: image_provider.getSlideImage(deckId, slideData),
       fit: ImageFit.cover,
       width: style.Size.slideListThumbnailWidth);
 
@@ -136,11 +144,11 @@
       new Text('Slide ${slideIndex + 1}', style: style.Text.subtitleStyle);
   var notes = new Text(
       'This is the teaser slide. It should be memorable and descriptive.');
-  var titleAndNotes = new Flexible(
-      child: new Container(
-          child: new Column(
-              children: [title, notes], alignItems: FlexAlignItems.start),
-          padding: style.Spacing.normalPadding));
+  var titleAndNotes = new Flexible(child: new Container(
+      child: new Column(
+          children: [title, notes],
+          crossAxisAlignment: CrossAxisAlignment.start),
+      padding: style.Spacing.normalPadding));
 
   var card = new Container(
       child: new Container(
diff --git a/dart/lib/components/slideshow.dart b/dart/lib/components/slideshow.dart
index 76dc606..fb3cb64 100644
--- a/dart/lib/components/slideshow.dart
+++ b/dart/lib/components/slideshow.dart
@@ -7,7 +7,7 @@
 
 import '../stores/store.dart';
 import '../styles/common.dart' as style;
-import '../utils/image_provider.dart' as imageProvider;
+import '../utils/image_provider.dart' as image_provider;
 import 'askquestion.dart';
 import 'questionlist.dart';
 import 'slideshow_fullscreen.dart';
@@ -22,6 +22,7 @@
 
   SlideshowPage(this._deckId);
 
+  @override
   Widget build(BuildContext context, AppState appState, AppActions appActions) {
     if (!appState.decks.containsKey(_deckId)) {
       // TODO(aghassemi): Proper error page with navigation back to main view.
@@ -36,7 +37,7 @@
   }
 }
 
-class SlideShow extends StatelessComponent {
+class SlideShow extends StatelessWidget {
   AppActions _appActions;
   AppState _appState;
   DeckState _deckState;
@@ -44,6 +45,7 @@
 
   SlideShow(this._appActions, this._appState, this._deckState);
 
+  @override
   Widget build(BuildContext context) {
     if (_deckState.slides.length == 0) {
       // TODO(aghassemi): Proper error page with navigation back to main view.
@@ -92,8 +94,8 @@
       items.add(footer);
     }
 
-    var layout =
-        new Column(children: items, alignItems: FlexAlignItems.stretch);
+    var layout = new Column(
+        children: items, crossAxisAlignment: CrossAxisAlignment.stretch);
 
     return layout;
   }
@@ -108,22 +110,24 @@
 
     var notesAndNavColumn = new Flexible(
         child: new Column(
-            children: [notes, nav], alignItems: FlexAlignItems.stretch),
+            children: [notes, nav],
+            crossAxisAlignment: CrossAxisAlignment.stretch),
         flex: 4);
     var imageAndActionsColumn = new Flexible(
         child: new Column(
-            children: [image, actions], alignItems: FlexAlignItems.stretch),
+            children: [image, actions],
+            crossAxisAlignment: CrossAxisAlignment.stretch),
         flex: 16);
 
     var layout = new Row(
         children: [notesAndNavColumn, imageAndActionsColumn],
-        alignItems: FlexAlignItems.stretch);
+        crossAxisAlignment: CrossAxisAlignment.stretch);
 
     var footer = _buildFooter();
     if (footer != null) {
       layout = new Column(
           children: [new Flexible(child: layout, flex: 8), footer],
-          alignItems: FlexAlignItems.stretch);
+          crossAxisAlignment: CrossAxisAlignment.stretch);
     }
 
     return layout;
@@ -137,7 +141,7 @@
   }
 
   Widget _buildImage(BuildContext context) {
-    var provider = imageProvider.getSlideImage(
+    var provider = image_provider.getSlideImage(
         _deckState.deck.key, _deckState.slides[_currSlideNum]);
 
     var image = new AsyncImage(provider: provider, fit: ImageFit.scaleDown);
@@ -145,13 +149,14 @@
     // If not driving the presentation, tapping the image navigates to fullscreen mode.
     if (_deckState.presentation == null ||
         !_deckState.presentation.isDriving(_appState.user)) {
-      image = new InkWell(child: image, onTap: () {
-        Navigator.push(
-            context,
-            new MaterialPageRoute(
-                builder: (context) =>
+      image = new InkWell(
+          child: image,
+          onTap: () {
+            Navigator.push(
+                context,
+                new MaterialPageRoute(builder: (context) =>
                     new SlideshowFullscreenPage(_deckState.deck.key)));
-      });
+          });
     }
 
     var counter = _buildBubbleOverlay(
@@ -167,9 +172,8 @@
     var container = new Container(
         child: notes,
         padding: style.Spacing.normalPadding,
-        decoration: new BoxDecoration(
-            border: new Border(
-                bottom: new BorderSide(color: style.theme.dividerColor))));
+        decoration: new BoxDecoration(border: new Border(
+            bottom: new BorderSide(color: style.theme.dividerColor))));
     return container;
   }
 
@@ -178,19 +182,20 @@
 
     if (slideNum >= 0 && slideNum < _deckState.slides.length) {
       var thumbnail = new AsyncImage(
-          provider: imageProvider.getSlideImage(
+          provider: image_provider.getSlideImage(
               _deckState.deck.key, _deckState.slides[slideNum]),
           height: style.Size.thumbnailNavHeight,
           fit: ImageFit.scaleDown);
 
-      container = new InkWell(child: thumbnail, onTap: () {
-        _appActions.setCurrSlideNum(_deckState.deck.key, slideNum);
-      });
+      container = new InkWell(
+          child: thumbnail,
+          onTap: () {
+            _appActions.setCurrSlideNum(_deckState.deck.key, slideNum);
+          });
     } else {
       // Empty grey placeholder.
       container = new Container(
-          decoration: new BoxDecoration(
-              backgroundColor: style.theme.primarySwatch[100]));
+          decoration: new BoxDecoration(backgroundColor: Colors.grey[100]));
     }
 
     var nextPreviousBubble = _buildBubbleOverlay(label, 0.5, 0.05);
@@ -207,37 +212,40 @@
     List<Widget> left = [];
     List<Widget> right = [];
 
-    _buildActions_prev(left, right);
-    _buildActions_slidelist(left, right, context);
-    _buildActions_question(left, right, context);
-    _buildActions_next(left, right);
-    _buildActions_followPresentation(left, right);
+    _buildActionsPrev(left, right);
+    _buildActionsSlidelist(left, right, context);
+    _buildActionsQuestion(left, right, context);
+    _buildActionsNext(left, right);
+    _buildActionsFollowPresentation(left, right);
 
-    return new ToolBar(
-        left: new Row(children: _buildActions_addMargin(left)), right: right);
+    return new AppBar(
+        leading: new Row(children: _buildActionsAddMargin(left)),
+        actions: right);
   }
 
-  void _buildActions_prev(List<Widget> left, List<Widget> right) {
+  void _buildActionsPrev(List<Widget> left, List<Widget> right) {
     if (_currSlideNum == 0) {
       return;
     }
-    var prev =
-        new InkWell(child: new Icon(icon: 'navigation/arrow_back'), onTap: () {
-      _appActions.setCurrSlideNum(_deckState.deck.key, _currSlideNum - 1);
-    });
+    var prev = new InkWell(
+        child: new Icon(icon: Icons.arrow_back),
+        onTap: () {
+          _appActions.setCurrSlideNum(_deckState.deck.key, _currSlideNum - 1);
+        });
     left.add(prev);
   }
 
-  void _buildActions_slidelist(
+  void _buildActionsSlidelist(
       List<Widget> left, List<Widget> right, BuildContext context) {
-    var slideList =
-        new InkWell(child: new Icon(icon: 'maps/layers'), onTap: () {
-      Navigator.pop(context);
-    });
+    var slideList = new InkWell(
+        child: new Icon(icon: Icons.layers),
+        onTap: () {
+          Navigator.pop(context);
+        });
     left.add(slideList);
   }
 
-  void _buildActions_question(
+  void _buildActionsQuestion(
       List<Widget> left, List<Widget> right, BuildContext context) {
     if (_deckState.presentation == null) {
       return;
@@ -245,9 +253,9 @@
 
     // Presentation over is taken to a list of questions view.
     if (_deckState.presentation.isOwner) {
-      var numQuestions = new FloatingActionButton(
-          child: new Text(_deckState.presentation.questions.length.toString(),
-              style: style.theme.primaryTextTheme.title));
+      var numQuestions = new FloatingActionButton(child: new Text(
+          _deckState.presentation.questions.length.toString(),
+          style: style.theme.primaryTextTheme.title));
       // TODO(aghassemi): Find a better way. Scaling down a FAB and
       // using transform to position it does not seem to be the best approach.
       final Matrix4 moveUp = new Matrix4.identity().translate(-95.0, 25.0);
@@ -256,26 +264,26 @@
       numQuestions = new Transform(child: numQuestions, transform: scaleDown);
 
       var questions = new InkWell(
-          child: new Icon(icon: 'communication/live_help'), onTap: () {
-        Navigator.push(
-            context,
-            new MaterialPageRoute(
-                builder: (context) =>
+          child: new Icon(icon: Icons.help),
+          onTap: () {
+            Navigator.push(
+                context,
+                new MaterialPageRoute(builder: (context) =>
                     new QuestionListPage(_deckState.deck.key)));
-      });
+          });
 
       left.add(questions);
       left.add(numQuestions);
     } else {
       // Audience is taken to ask a question view.
-      var route = new MaterialPageRoute(
-          builder: (context) =>
-              new AskQuestionPage(_deckState.deck.key, _currSlideNum));
+      var route = new MaterialPageRoute(builder: (context) =>
+          new AskQuestionPage(_deckState.deck.key, _currSlideNum));
 
       var askQuestion = new InkWell(
-          child: new Icon(icon: 'communication/live_help'), onTap: () {
-        Navigator.push(context, route);
-      });
+          child: new Icon(icon: Icons.help),
+          onTap: () {
+            Navigator.push(context, route);
+          });
       left.add(askQuestion);
     }
   }
@@ -283,7 +291,7 @@
   final Matrix4 moveUpFabTransform =
       new Matrix4.identity().translate(0.0, -27.5);
 
-  void _buildActions_next(List<Widget> left, List<Widget> right) {
+  void _buildActionsNext(List<Widget> left, List<Widget> right) {
     if (_currSlideNum >= (_deckState.slides.length - 1)) {
       return;
     }
@@ -297,8 +305,7 @@
     if (_deckState.presentation != null &&
         _deckState.presentation.isDriving(_appState.user)) {
       var next = new FloatingActionButton(
-          child: new Icon(icon: 'navigation/arrow_forward'),
-          onPressed: nextOnTap);
+          child: new Icon(icon: Icons.arrow_forward), onPressed: nextOnTap);
 
       var container =
           new Container(child: next, margin: style.Spacing.fabMargin);
@@ -307,21 +314,22 @@
       right.add(next);
     } else {
       var next = new InkWell(
-          child: new Icon(icon: 'navigation/arrow_forward'), onTap: nextOnTap);
+          child: new Icon(icon: Icons.arrow_forward), onTap: nextOnTap);
       left.add(next);
     }
   }
 
-  void _buildActions_followPresentation(List<Widget> left, List<Widget> right) {
+  void _buildActionsFollowPresentation(List<Widget> left, List<Widget> right) {
     if (_deckState.presentation == null ||
         _deckState.presentation.isFollowingPresentation) {
       return;
     }
 
     var syncNav = new FloatingActionButton(
-        child: new Icon(icon: 'notification/sync'), onPressed: () async {
-      _appActions.followPresentation(_deckState.deck.key);
-    });
+        child: new Icon(icon: Icons.sync),
+        onPressed: () async {
+          _appActions.followPresentation(_deckState.deck.key);
+        });
 
     syncNav =
         new Container(child: syncNav, margin: style.Spacing.actionsMargin);
@@ -338,10 +346,11 @@
     // Owner and not driving?
     if (_deckState.presentation.isOwner &&
         !_deckState.presentation.isDriving(_appState.user)) {
-      SnackBarAction resume =
-          new SnackBarAction(label: 'RESUME', onPressed: () {
-        _appActions.setDriver(_deckState.deck.key, _appState.user);
-      });
+      SnackBarAction resume = new SnackBarAction(
+          label: 'RESUME',
+          onPressed: () {
+            _appActions.setDriver(_deckState.deck.key, _appState.user);
+          });
 
       return _buildSnackbarFooter('You have handed off control.',
           action: resume);
@@ -356,7 +365,7 @@
     return null;
   }
 
-  _buildActions_addMargin(List<Widget> actions) {
+  List<Widget> _buildActionsAddMargin(List<Widget> actions) {
     return actions
         .map(
             (w) => new Container(child: w, margin: style.Spacing.actionsMargin))
@@ -372,34 +381,32 @@
                 borderRadius: 50.0, // Make the bubble round.
                 backgroundColor:
                     style.Box.bubbleOverlayBackground), // Transparent gray.
-            padding: new EdgeDims.symmetric(horizontal: 5.0, vertical: 2.0)),
+            padding: new EdgeInsets.symmetric(horizontal: 5.0, vertical: 2.0)),
         alignment: new FractionalOffset(xOffset, yOffset));
   }
 
-  _buildSnackbarFooter(String lable, {SnackBarAction action}) {
+  Widget _buildSnackbarFooter(String lable, {SnackBarAction action}) {
     var text = new Text(lable);
     text = new DefaultTextStyle(style: Typography.white.subhead, child: text);
     List<Widget> children = <Widget>[
-      new Flexible(
-          child: new Container(
-              margin: style.Spacing.footerVerticalMargin,
-              child: new DefaultTextStyle(
-                  style: Typography.white.subhead, child: text)))
+      new Flexible(child: new Container(
+          margin: style.Spacing.footerVerticalMargin,
+          child: new DefaultTextStyle(
+              style: Typography.white.subhead, child: text)))
     ];
 
     if (action != null) {
       children.add(action);
     }
 
-    var clipper = new ClipRect(
-        child: new Material(
-            elevation: 6,
-            color: style.Box.footerBackground,
-            child: new Container(
-                margin: style.Spacing.footerHorizontalMargin,
-                child: new DefaultTextStyle(
-                    style: new TextStyle(color: style.theme.accentColor),
-                    child: new Row(children: children)))));
+    var clipper = new ClipRect(child: new Material(
+        elevation: 6,
+        color: style.Box.footerBackground,
+        child: new Container(
+            margin: style.Spacing.footerHorizontalMargin,
+            child: new DefaultTextStyle(
+                style: new TextStyle(color: style.theme.accentColor),
+                child: new Row(children: children)))));
 
     return new Flexible(child: clipper, flex: 1);
   }
diff --git a/dart/lib/components/slideshow_fullscreen.dart b/dart/lib/components/slideshow_fullscreen.dart
index 009592c..c48ee2c 100644
--- a/dart/lib/components/slideshow_fullscreen.dart
+++ b/dart/lib/components/slideshow_fullscreen.dart
@@ -6,7 +6,7 @@
 import 'package:flutter/widgets.dart';
 
 import '../stores/store.dart';
-import '../utils/image_provider.dart' as imageProvider;
+import '../utils/image_provider.dart' as image_provider;
 import 'slideshow.dart';
 
 class SlideshowFullscreenPage extends SlideshowPage {
@@ -28,7 +28,7 @@
     } else {
       currSlideNum = deckState.currSlideNum;
     }
-    var provider = imageProvider.getSlideImage(
+    var provider = image_provider.getSlideImage(
         deckState.deck.key, deckState.slides[currSlideNum]);
     return new GestureDetector(
         child: new AsyncImage(provider: provider, fit: ImageFit.contain),
diff --git a/dart/lib/components/syncslides_page.dart b/dart/lib/components/syncslides_page.dart
index c6c3a25..a9d6c0b 100644
--- a/dart/lib/components/syncslides_page.dart
+++ b/dart/lib/components/syncslides_page.dart
@@ -14,10 +14,12 @@
 // The base class for every page.
 // Responsible for watching state changes from the store and passing
 // the state and actions to the build function of descendant components.
-abstract class SyncSlidesPage extends StatefulComponent {
-  build(BuildContext context, AppState appState, AppActions appActions);
-  initState(AppState appState, AppActions appActions) {}
+abstract class SyncSlidesPage extends StatefulWidget {
+  Widget build(BuildContext context, AppState appState, AppActions appActions);
 
+  void initState(AppState appState, AppActions appActions) {}
+
+  @override
   _SyncSlidesPage createState() => new _SyncSlidesPage();
 }
 
@@ -44,6 +46,7 @@
     super.dispose();
   }
 
+  @override
   Widget build(BuildContext context) {
     return config.build(context, _state, _store.actions);
   }
diff --git a/dart/lib/components/utils/stop_wrapping.dart b/dart/lib/components/utils/stop_wrapping.dart
index 68d0e4b..bbe8e86 100644
--- a/dart/lib/components/utils/stop_wrapping.dart
+++ b/dart/lib/components/utils/stop_wrapping.dart
@@ -9,5 +9,5 @@
   // overflow: hidden or text-overflow: ellipsis in Flutter yet.
   // This workaround simulates white-space: nowrap and overflow: hidden.
   // See https://github.com/flutter/flutter/issues/417
-  return new Viewport(child: child, scrollDirection: Axis.horizontal);
+  return new Viewport(child: child, mainAxis: Axis.horizontal);
 }
diff --git a/dart/lib/discovery/client.dart b/dart/lib/discovery/client.dart
index cf3d7dc..0f84a39 100644
--- a/dart/lib/discovery/client.dart
+++ b/dart/lib/discovery/client.dart
@@ -4,11 +4,11 @@
 
 import 'dart:async';
 
-import 'package:flutter/services.dart' show shell;
+import 'package:flutter/shell.dart' show shell;
 import 'package:logging/logging.dart';
 import 'package:v23discovery/discovery.dart' as discovery;
 
-export 'package:v23discovery/discovery.dart' show UpdateType;
+export 'package:v23discovery/discovery.dart' show UpdateTypes;
 
 import '../models/all.dart' as model;
 
@@ -26,7 +26,7 @@
     new discovery.Client(shell.connectToService, _discoveryMojoUrl);
 
 final Map<String, discovery.Advertiser> _advertisers = new Map();
-discovery.Scanner _scanner = null;
+discovery.Scanner _scanner;
 
 Future advertise(model.PresentationAdvertisement presentation) async {
   if (_advertisers.containsKey(presentation.key)) {
@@ -40,11 +40,8 @@
   serviceAttrs['name'] = presentation.deck.name;
   serviceAttrs['thumbnailkey'] = presentation.deck.thumbnail.key;
   serviceAttrs['presentationid'] = presentation.key;
-  discovery.Service service = new discovery.Service()
-    ..interfaceName = _presentationInterfaceName
-    ..instanceName = presentation.key
-    ..attrs = serviceAttrs
-    ..addrs = [presentation.syncgroupName, presentation.thumbnailSyncgroupName];
+  discovery.Advertisement service = new discovery.Advertisement('s/v', []);
+  ..attributes = serviceAttrs;
 
   _advertisers[presentation.key] = await _discoveryClient.advertise(service);
 
@@ -63,20 +60,19 @@
 // Transforms a stream of discovery services to PresentationAdvertisement model objects.
 StreamTransformer toPresentationUpdate = new StreamTransformer.fromHandlers(
     handleData: (discovery.Update u, EventSink<PresentationUpdate> sink) {
-  discovery.Service s = u.service;
-
-  String key = s.attrs['presentationid'];
-  log.info('Found presentation ${s.attrs['name']} under $key.');
+  String key = u.attributes['presentationid'];
+  log.info('Found presentation ${u.attributes['name']} under $key.');
   // Ignore our own advertised services.
   if (_advertisers.containsKey(key)) {
-    log.info('Presentation ${s.attrs['name']} was advertised by us; ignoring.');
+    log.info(
+        'Presentation ${u.attributes['name']} was advertised by us; ignoring.');
     return;
   }
 
-  model.Deck deck = new model.Deck(s.attrs['deckid'], s.attrs['name'],
-      new model.BlobRef(s.attrs['thumbnailkey']));
-  var syncgroupName = s.addrs[0];
-  var thumbnailSyncgroupName = s.addrs[1];
+  model.Deck deck = new model.Deck(u.attributes['deckid'], u.attributes['name'],
+      new model.BlobRef(u.attributes['thumbnailkey']));
+  var syncgroupName = u.addresses[0];
+  var thumbnailSyncgroupName = u.addresses[1];
   model.PresentationAdvertisement presentation =
       new model.PresentationAdvertisement(
           key, deck, syncgroupName, thumbnailSyncgroupName);
@@ -105,7 +101,7 @@
 
 class PresentationUpdate {
   model.PresentationAdvertisement presentation;
-  discovery.UpdateType updateType;
+  discovery.UpdateTypes updateType;
   PresentationUpdate._internal(this.presentation, this.updateType);
 }
 
diff --git a/dart/lib/identity/client.dart b/dart/lib/identity/client.dart
index 91de45b..5146b36 100644
--- a/dart/lib/identity/client.dart
+++ b/dart/lib/identity/client.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import 'package:flutter/services.dart' show shell;
+import 'package:flutter/shell.dart' show shell;
 import 'package:logging/logging.dart';
 import 'package:mojo_services/authentication/authentication.mojom.dart' as auth;
 
diff --git a/dart/lib/loaders/loader.dart b/dart/lib/loaders/loader.dart
index 4d6a58e..ef584a6 100644
--- a/dart/lib/loaders/loader.dart
+++ b/dart/lib/loaders/loader.dart
@@ -27,7 +27,7 @@
     return _singletonLoader;
   }
 
-  Loader._internal() {}
+  Loader._internal();
 
   // Loads all the decks in /sdcard/syncslides/decks
   // Name of each deck is the name of its directory.
diff --git a/dart/lib/main.dart b/dart/lib/main.dart
index dc642a7..ac0f96e 100644
--- a/dart/lib/main.dart
+++ b/dart/lib/main.dart
@@ -9,8 +9,8 @@
 import 'components/deckgrid.dart';
 import 'stores/store.dart';
 import 'styles/common.dart' as style;
-import 'utils/back_button.dart' as backButtonUtil;
-import 'utils/image_provider.dart' as imageProvider;
+import 'utils/back_button.dart' as back_button_util;
+import 'utils/image_provider.dart' as image_provider;
 
 NavigatorState _navigator;
 final Completer storeStatus = new Completer();
@@ -21,15 +21,18 @@
     storeStatus.complete();
   });
   _initLogging();
-  _initBackButtonHandler();
+  // TODO(aghassemi): Fix back button integration. It has been broken throwing
+  // "Only one back button handler can exist per app"
+  //_initBackButtonHandler();
 
   runApp(new MaterialApp(
       theme: style.theme,
       title: 'SyncSlides',
-      routes: {'/': (RouteArguments args) => new LandingPage()}));
+      routes: {'/': (BuildContext context) => new LandingPage()}));
 }
 
-class LandingPage extends StatefulComponent {
+class LandingPage extends StatefulWidget {
+  @override
   _LandingPage createState() => new _LandingPage();
 }
 
@@ -49,6 +52,7 @@
     }
   }
 
+  @override
   Widget build(BuildContext context) {
     if (!_initialized) {
       return _buildSplashScreen();
@@ -61,22 +65,23 @@
   Widget _buildSplashScreen() {
     var stack = new Stack(children: [
       new AsyncImage(
-          provider: imageProvider.splashBackgroundImageProvider,
+          provider: image_provider.splashBackgroundImageProvider,
           fit: ImageFit.cover),
       new Row(children: [
         new AsyncImage(
-            provider: imageProvider.splashFlutterImageProvider,
+            provider: image_provider.splashFlutterImageProvider,
             width: style.Size.splashLogo),
         new AsyncImage(
-            provider: imageProvider.splashVanadiumImageProvider,
+            provider: image_provider.splashVanadiumImageProvider,
             width: style.Size.splashLogo)
-      ], justifyContent: FlexJustifyContent.center),
+      ], mainAxisAlignment: MainAxisAlignment.center),
       new Container(
           child: new Row(
-              children:
-                  [new Text('Loading SyncSlides...', style: style.Text.splash)],
-              alignItems: FlexAlignItems.end,
-              justifyContent: FlexJustifyContent.center),
+              children: [
+                new Text('Loading SyncSlides...', style: style.Text.splash)
+              ],
+              crossAxisAlignment: CrossAxisAlignment.end,
+              mainAxisAlignment: MainAxisAlignment.center),
           padding: style.Spacing.normalPadding)
     ]);
     return stack;
@@ -91,7 +96,7 @@
 }
 
 void _initBackButtonHandler() {
-  backButtonUtil.onBackButton(() {
+  back_button_util.onBackButton(() {
     if (_navigator != null && _navigator.canPop()) {
       bool returnValue;
       _navigator.openTransaction((NavigatorTransaction transaction) {
diff --git a/dart/lib/models/blobref.dart b/dart/lib/models/blobref.dart
index bf89028..46855b3 100644
--- a/dart/lib/models/blobref.dart
+++ b/dart/lib/models/blobref.dart
@@ -11,20 +11,19 @@
 const Duration interval = const Duration(milliseconds: 100);
 
 class BlobRef {
+  BlobRef(this._key);
   String _key;
   String get key => _key;
 
-  BlobRef(this._key);
-
   Future<List<int>> getData() {
     var store = new Store.singleton();
     int numTries = 0;
 
-    getBlobFromStore() async {
+    Future<List<int>> getBlobFromStore() async {
       return store.actions.getBlob(key);
     }
 
-    getBlobWithRetries() async {
+    Future<List<int>> getBlobWithRetries() async {
       // Don't fail immediately if blob is not found in store, it might be still syncing.
       try {
         numTries++;
diff --git a/dart/lib/models/deck.dart b/dart/lib/models/deck.dart
index 861d186..56ed325 100644
--- a/dart/lib/models/deck.dart
+++ b/dart/lib/models/deck.dart
@@ -8,6 +8,15 @@
 
 // Deck represents a deck of slides.
 class Deck {
+  Deck(this._key, this._name, this._thumbnail);
+
+  Deck.fromJson(String key, String json) {
+    Map map = JSON.decode(json);
+    _key = key;
+    _name = map['name'];
+    _thumbnail = new BlobRef(map['thumbnailkey']);
+  }
+
   String _key;
   String get key => _key;
 
@@ -17,15 +26,6 @@
   BlobRef _thumbnail;
   BlobRef get thumbnail => _thumbnail;
 
-  Deck(this._key, this._name, this._thumbnail) {}
-
-  Deck.fromJson(String key, String json) {
-    Map map = JSON.decode(json);
-    _key = key;
-    _name = map['name'];
-    _thumbnail = new BlobRef(map['thumbnailkey']);
-  }
-
   String toJson() {
     // NOTE(aghassemi): We never serialize the key with the object.
     Map map = new Map();
diff --git a/dart/lib/models/presentation_advertisement.dart b/dart/lib/models/presentation_advertisement.dart
index 925fc8a..ece1ae8 100644
--- a/dart/lib/models/presentation_advertisement.dart
+++ b/dart/lib/models/presentation_advertisement.dart
@@ -6,6 +6,9 @@
 
 // Represents an advertised presentation of a deck.
 class PresentationAdvertisement {
+  PresentationAdvertisement(
+      this._key, this._deck, this._syncgroupName, this._thumbnailSyncgroupName);
+
   // TODO(aghassemi): Fix inconsistencies between key and id everywhere.
   String _key;
   String get key => _key;
@@ -18,7 +21,4 @@
 
   String _thumbnailSyncgroupName;
   String get thumbnailSyncgroupName => _thumbnailSyncgroupName;
-
-  PresentationAdvertisement(
-      this._key, this._deck, this._syncgroupName, this._thumbnailSyncgroupName);
 }
diff --git a/dart/lib/models/question.dart b/dart/lib/models/question.dart
index cc7fd73..57c031f 100644
--- a/dart/lib/models/question.dart
+++ b/dart/lib/models/question.dart
@@ -7,6 +7,18 @@
 import 'user.dart';
 
 class Question {
+  Question(
+      this._id, this._text, this._slideNum, this._questioner, this._timestamp);
+
+  Question.fromJson(String id, String json) {
+    Map map = JSON.decode(json);
+    _id = id;
+    _text = map['text'];
+    _slideNum = map['slidenum'];
+    _questioner = new User.fromJson(map['questioner']);
+    _timestamp = new DateTime.fromMillisecondsSinceEpoch(map['timestamp']);
+  }
+
   // TODO(aghassemi): Fix inconsistencies between key and id everywhere.
   String _id;
   String get id => _id;
@@ -23,18 +35,6 @@
   DateTime _timestamp;
   DateTime get timestamp => _timestamp;
 
-  Question(
-      this._id, this._text, this._slideNum, this._questioner, this._timestamp);
-
-  Question.fromJson(String id, String json) {
-    Map map = JSON.decode(json);
-    _id = id;
-    _text = map['text'];
-    _slideNum = map['slidenum'];
-    _questioner = new User.fromJson(map['questioner']);
-    _timestamp = new DateTime.fromMillisecondsSinceEpoch(map['timestamp']);
-  }
-
   String toJson() {
     Map map = new Map();
     map['text'] = text;
diff --git a/dart/lib/models/settings.dart b/dart/lib/models/settings.dart
index cfb1638..09537ba 100644
--- a/dart/lib/models/settings.dart
+++ b/dart/lib/models/settings.dart
@@ -5,12 +5,6 @@
 import 'dart:convert';
 
 class Settings {
-  String _deviceId;
-  String get deviceId => _deviceId;
-
-  String _mounttable;
-  String get mounttable => _mounttable;
-
   Settings(this._deviceId, this._mounttable);
 
   Settings.fromJson(String json) {
@@ -18,6 +12,11 @@
     _deviceId = map['deviceid'];
     _mounttable = map['mounttable'];
   }
+  String _deviceId;
+  String get deviceId => _deviceId;
+
+  String _mounttable;
+  String get mounttable => _mounttable;
 
   String toJson() {
     Map map = new Map();
diff --git a/dart/lib/models/slide.dart b/dart/lib/models/slide.dart
index 7694ddd..72abb17 100644
--- a/dart/lib/models/slide.dart
+++ b/dart/lib/models/slide.dart
@@ -8,13 +8,7 @@
 
 // Slide represents a slide within a deck.
 class Slide {
-  int _num;
-  int get num => _num;
-
-  BlobRef _image;
-  BlobRef get image => _image;
-
-  Slide(this._num, this._image) {}
+  Slide(this._num, this._image);
 
   Slide.fromJson(String json) {
     Map map = JSON.decode(json);
@@ -22,6 +16,12 @@
     _image = new BlobRef(map['imagekey']);
   }
 
+  int _num;
+  int get num => _num;
+
+  BlobRef _image;
+  BlobRef get image => _image;
+
   String toJson() {
     Map map = new Map();
     map['num'] = _num;
diff --git a/dart/lib/models/user.dart b/dart/lib/models/user.dart
index 15e9607..c153da1 100644
--- a/dart/lib/models/user.dart
+++ b/dart/lib/models/user.dart
@@ -5,15 +5,6 @@
 import 'dart:convert';
 
 class User {
-  String _name;
-  String get name => _name;
-
-  String _blessing;
-  String get blessing => _blessing;
-
-  String _deviceId;
-  String get deviceId => _deviceId;
-
   User(this._name, this._blessing, this._deviceId);
 
   User.fromJson(String json) {
@@ -23,6 +14,15 @@
     _deviceId = map['deviceid'];
   }
 
+  String _name;
+  String get name => _name;
+
+  String _blessing;
+  String get blessing => _blessing;
+
+  String _deviceId;
+  String get deviceId => _deviceId;
+
   String toJson() {
     Map map = new Map();
     map['name'] = name;
diff --git a/dart/lib/stores/syncbase/actions.dart b/dart/lib/stores/syncbase/actions.dart
index a266586..b56531a 100644
--- a/dart/lib/stores/syncbase/actions.dart
+++ b/dart/lib/stores/syncbase/actions.dart
@@ -12,6 +12,7 @@
   //////////////////////////////////////
   // Decks
 
+  @override
   Future addDeck(model.Deck deck) async {
     log.info("Adding deck ${deck.name}...");
     sb.SyncbaseTable tb = _getDecksTable();
@@ -19,11 +20,13 @@
     log.info("Deck ${deck.name} added.");
   }
 
+  @override
   Future removeDeck(String deckKey) async {
     sb.SyncbaseTable tb = _getDecksTable();
     tb.deleteRange(new sb.RowRange.prefix(deckKey));
   }
 
+  @override
   Future setSlides(String deckKey, List<model.Slide> slides) async {
     sb.SyncbaseTable tb = _getDecksTable();
 
@@ -34,6 +37,7 @@
     });
   }
 
+  @override
   Future setCurrSlideNum(String deckId, int slideNum) async {
     var deckState = _state._getOrCreateDeckState(deckId);
     if (slideNum < 0 || slideNum >= deckState.slides.length) {
@@ -64,6 +68,7 @@
     _emitChange();
   }
 
+  @override
   Future loadDeckFromSdCard() {
     return new Loader.singleton().loadDeck();
   }
@@ -71,6 +76,7 @@
   //////////////////////////////////////
   // Presentation
 
+  @override
   Future<model.PresentationAdvertisement> startPresentation(
       String deckId) async {
     if (!_state._decks.containsKey(deckId)) {
@@ -116,7 +122,7 @@
         deckState._getOrCreatePresentationState(presentation.key);
     presentationstate._isOwner = true;
 
-    setDefaultsAndJoin() async {
+    Future setDefaultsAndJoin() async {
       // Set the current slide number to 0.
       sb.SyncbaseTable tb = _getPresentationsTable();
       await tb.put(
@@ -141,6 +147,7 @@
     return presentation;
   }
 
+  @override
   Future joinPresentation(model.PresentationAdvertisement presentation) async {
     String deckId = presentation.deck.key;
 
@@ -151,7 +158,7 @@
     deckState._isPresenting = true;
 
     // Wait until at least the current slide number, driver and the slide for current slide number is synced.
-    join() async {
+    Future join() async {
       bool isMyOwnPresentation =
           _state._advertisedPresentation?.key == presentation.key;
       if (!isMyOwnPresentation) {
@@ -185,6 +192,7 @@
     log.info('Joined presentation ${presentation.key}');
   }
 
+  @override
   Future stopPresentation(String presentationId) async {
     await discovery.stopAdvertising(presentationId);
     _state._advertisedPresentation = null;
@@ -198,6 +206,7 @@
     log.info('Presentation $presentationId stopped');
   }
 
+  @override
   Future followPresentation(String deckId) async {
     var deckState = _state._getOrCreateDeckState(deckId);
 
@@ -211,6 +220,7 @@
     deckState.presentation._isFollowingPresentation = true;
   }
 
+  @override
   Future askQuestion(String deckId, int slideNum, String questionText) async {
     var deckState = _state._getOrCreateDeckState(deckId);
 
@@ -231,6 +241,7 @@
     await tb.put(key, UTF8.encode(question.toJson()));
   }
 
+  @override
   Future setDriver(String deckId, model.User driver) async {
     var deckState = _state._getOrCreateDeckState(deckId);
 
@@ -244,11 +255,13 @@
   //////////////////////////////////////
   // Blobs
 
+  @override
   Future putBlob(String key, List<int> bytes) async {
     sb.SyncbaseTable tb = _getBlobsTable();
     await tb.put(key, bytes);
   }
 
+  @override
   Future<List<int>> getBlob(String key) async {
     sb.SyncbaseTable tb = _getBlobsTable();
     return tb.get(key);
diff --git a/dart/lib/stores/syncbase/state.dart b/dart/lib/stores/syncbase/state.dart
index b943899..78c4abf 100644
--- a/dart/lib/stores/syncbase/state.dart
+++ b/dart/lib/stores/syncbase/state.dart
@@ -5,14 +5,6 @@
 part of syncbase_store;
 
 class _AppState extends AppState {
-  model.User get user => _user;
-  model.Settings get settings => _settings;
-  UnmodifiableMapView<String, DeckState> decks;
-  model.PresentationAdvertisement get advertisedPresentation =>
-      _advertisedPresentation;
-  UnmodifiableMapView<String,
-      model.PresentationAdvertisement> presentationAdvertisements;
-
   _AppState() {
     _user = null;
     _settings = null;
@@ -21,6 +13,22 @@
         new UnmodifiableMapView(_presentationsAdvertisements);
   }
 
+  @override
+  model.User get user => _user;
+  @override
+  model.Settings get settings => _settings;
+
+  @override
+  UnmodifiableMapView<String, DeckState> decks;
+
+  @override
+  model.PresentationAdvertisement get advertisedPresentation =>
+      _advertisedPresentation;
+
+  @override
+  UnmodifiableMapView<String, model.PresentationAdvertisement>
+      presentationAdvertisements;
+
   model.User _user;
   model.Settings _settings;
   Map<String, _DeckState> _decks = new Map();
@@ -36,13 +44,20 @@
 }
 
 class _DeckState extends DeckState {
+  _DeckState() {
+    slides = new UnmodifiableListView(_slides);
+  }
+
   model.Deck _deck;
+  @override
   model.Deck get deck => _deck;
 
   List<model.Slide> _slides = new List();
+  @override
   UnmodifiableListView<model.Slide> slides;
 
-  _PresentationState _presentation = null;
+  _PresentationState _presentation;
+  @override
   PresentationState get presentation {
     if (_isPresenting) {
       return _presentation;
@@ -51,14 +66,11 @@
   }
 
   int _currSlideNum = 0;
+  @override
   int get currSlideNum => _currSlideNum;
 
   bool _isPresenting = false;
 
-  _DeckState() {
-    slides = new UnmodifiableListView(_slides);
-  }
-
   _PresentationState _getOrCreatePresentationState(String presentationId) {
     if (_presentation == null || _presentation.key != presentationId) {
       _presentation = new _PresentationState(presentationId);
@@ -68,24 +80,30 @@
 }
 
 class _PresentationState extends PresentationState {
-  final String key;
-
-  int _currSlideNum = 0;
-  int get currSlideNum => _currSlideNum;
-
-  model.User _driver;
-  model.User get driver => _driver;
-
-  bool _isOwner = false;
-  bool get isOwner => _isOwner;
-
-  bool _isFollowingPresentation = true;
-  bool get isFollowingPresentation => _isFollowingPresentation;
-
-  List<model.Question> _questions = new List();
-  UnmodifiableListView<model.Question> questions;
-
   _PresentationState(this.key) {
     questions = new UnmodifiableListView(_questions);
   }
+
+  @override
+  final String key;
+
+  int _currSlideNum = 0;
+  @override
+  int get currSlideNum => _currSlideNum;
+
+  model.User _driver;
+  @override
+  model.User get driver => _driver;
+
+  bool _isOwner = false;
+  @override
+  bool get isOwner => _isOwner;
+
+  bool _isFollowingPresentation = true;
+  @override
+  bool get isFollowingPresentation => _isFollowingPresentation;
+
+  List<model.Question> _questions = new List();
+  @override
+  UnmodifiableListView<model.Question> questions;
 }
diff --git a/dart/lib/stores/syncbase/store.dart b/dart/lib/stores/syncbase/store.dart
index 7825e5b..4f73f3b 100644
--- a/dart/lib/stores/syncbase/store.dart
+++ b/dart/lib/stores/syncbase/store.dart
@@ -27,19 +27,25 @@
 
 // Implementation of Store using Syncbase (http://v.io/syncbase) storage system.
 class SyncbaseStore implements Store {
-  _AppState _state;
-  _AppActions _actions;
-  StreamController _stateChangeEmitter = new StreamController.broadcast();
-
-  AppState get state => _state;
-  Stream get onStateChange => _stateChangeEmitter.stream;
-  AppActions get actions => _actions;
-
   SyncbaseStore() {
     _state = new _AppState();
     _actions = new _AppActions(_state, _triggerStateChange);
   }
 
+  _AppState _state;
+  _AppActions _actions;
+  StreamController _stateChangeEmitter = new StreamController.broadcast();
+
+  @override
+  AppState get state => _state;
+
+  @override
+  Stream get onStateChange => _stateChangeEmitter.stream;
+
+  @override
+  AppActions get actions => _actions;
+
+  @override
   Future init() async {
     // Wait for synchronous initializers.
     await _syncInits();
@@ -79,7 +85,7 @@
     discovery.PresentationScanner scanner = await discovery.scan();
 
     scanner.onUpdate.listen((discovery.PresentationUpdate update) {
-      if (update.updateType == discovery.UpdateType.found) {
+      if (update.updateType == discovery.UpdateTypes.found) {
         _state._presentationsAdvertisements[update.presentation.key] =
             update.presentation;
         _triggerStateChange();
@@ -89,7 +95,7 @@
         // Join the thumbnail syncgroup to get the thumbnail blob.
         String sgName = update.presentation.thumbnailSyncgroupName;
         sb.joinSyncgroup(sgName);
-      } else if (update.updateType == discovery.UpdateType.lost) {
+      } else if (update.updateType == discovery.UpdateTypes.lost) {
         String presentationId = update.presentation.key;
         _state._presentationsAdvertisements.remove(presentationId);
         _state._decks.values.forEach((_DeckState deck) {
@@ -129,7 +135,7 @@
         _onChange(table, change.changeType, change.rowKey, change.valueBytes));
   }
 
-  _onChange(String table, int changeType, String rowKey, List<int> value) {
+  void _onChange(String table, int changeType, String rowKey, List<int> value) {
     log.finest('Change in $table for $rowKey of the type $changeType.');
 
     keyutil.KeyType keyType = keyutil.getKeyType(rowKey);
@@ -155,7 +161,7 @@
     _triggerStateChange();
   }
 
-  _onDeckChange(int changeType, String rowKey, List<int> value) {
+  void _onDeckChange(int changeType, String rowKey, List<int> value) {
     var deckId = rowKey;
     if (changeType == sb.WatchChangeTypes.put) {
       _state._getOrCreateDeckState(deckId)._deck =
@@ -165,7 +171,7 @@
     }
   }
 
-  _onSlideChange(int changeType, String rowKey, List<int> value) {
+  void _onSlideChange(int changeType, String rowKey, List<int> value) {
     var deckId = keyutil.currSlideKeyToDeckId(rowKey);
     var index = keyutil.currSlideKeyToIndex(rowKey);
     var slides = _state._getOrCreateDeckState(deckId)._slides;
@@ -182,7 +188,7 @@
     });
   }
 
-  _onPresentationSlideNumChange(
+  void _onPresentationSlideNumChange(
       int changeType, String rowKey, List<int> value) {
     String deckId = keyutil.presentationCurrSlideNumKeyToDeckId(rowKey);
     String presentationId =
@@ -200,7 +206,8 @@
     }
   }
 
-  _onPresentationDriverChange(int changeType, String rowKey, List<int> value) {
+  void _onPresentationDriverChange(
+      int changeType, String rowKey, List<int> value) {
     String deckId = keyutil.presentationDriverKeyToDeckId(rowKey);
     String presentationId =
         keyutil.presentationDriverKeyToPresentationId(rowKey);
@@ -218,7 +225,7 @@
     }
   }
 
-  _onPresentationQuestionChange(
+  void _onPresentationQuestionChange(
       int changeType, String rowKey, List<int> value) {
     String deckId = keyutil.presentationQuestionKeyToDeckId(rowKey);
 
diff --git a/dart/lib/styles/common.dart b/dart/lib/styles/common.dart
index fbd8017..d11c6a7 100644
--- a/dart/lib/styles/common.dart
+++ b/dart/lib/styles/common.dart
@@ -28,19 +28,20 @@
 }
 
 class Spacing {
-  static final EdgeDims extraSmallPadding = new EdgeDims.all(2.0);
-  static final EdgeDims smallPadding = new EdgeDims.all(5.0);
-  static final EdgeDims normalPadding = new EdgeDims.all(10.0);
-  static final EdgeDims normalMargin = new EdgeDims.all(2.0);
-  static final EdgeDims cardMargin = new EdgeDims.all(4.0);
-  static final EdgeDims listItemMargin = new EdgeDims.TRBL(3.0, 6.0, 0.0, 6.0);
-  static final EdgeDims actionsMargin =
-      new EdgeDims.symmetric(horizontal: 10.0);
-  static final EdgeDims fabMargin = new EdgeDims.only(right: 7.0);
-  static final EdgeDims footerVerticalMargin =
-      const EdgeDims.symmetric(vertical: 14.0);
-  static final EdgeDims footerHorizontalMargin =
-      const EdgeDims.symmetric(horizontal: 24.0);
+  static final EdgeInsets extraSmallPadding = new EdgeInsets.all(2.0);
+  static final EdgeInsets smallPadding = new EdgeInsets.all(5.0);
+  static final EdgeInsets normalPadding = new EdgeInsets.all(10.0);
+  static final EdgeInsets normalMargin = new EdgeInsets.all(2.0);
+  static final EdgeInsets cardMargin = new EdgeInsets.all(4.0);
+  static final EdgeInsets listItemMargin =
+      new EdgeInsets.fromLTRB(6.0, 3.0, 6.0, 0.0);
+  static final EdgeInsets actionsMargin =
+      new EdgeInsets.symmetric(horizontal: 10.0);
+  static final EdgeInsets fabMargin = new EdgeInsets.only(right: 7.0);
+  static final EdgeInsets footerVerticalMargin =
+      const EdgeInsets.symmetric(vertical: 14.0);
+  static final EdgeInsets footerHorizontalMargin =
+      const EdgeInsets.symmetric(horizontal: 24.0);
 }
 
 class Box {
diff --git a/dart/lib/syncbase/client.dart b/dart/lib/syncbase/client.dart
index c4d0c73..238ff48 100644
--- a/dart/lib/syncbase/client.dart
+++ b/dart/lib/syncbase/client.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import 'package:flutter/services.dart' show shell;
+import 'package:flutter/shell.dart' show shell;
 import 'package:logging/logging.dart';
 import 'package:syncbase/syncbase_client.dart';
 
diff --git a/dart/lib/utils/image_provider.dart b/dart/lib/utils/image_provider.dart
index 50777cf..6a26125 100644
--- a/dart/lib/utils/image_provider.dart
+++ b/dart/lib/utils/image_provider.dart
@@ -4,7 +4,6 @@
 
 import 'dart:async';
 import 'dart:typed_data' show Uint8List;
-import 'dart:ui' as ui;
 
 import 'package:flutter/services.dart';
 import 'package:logging/logging.dart';
@@ -56,21 +55,28 @@
 
   _RawImageProvider(this.imageKey, this.blobFetcher);
 
-  Future<ui.Image> loadImage() async {
+  @override
+  Future<ImageInfo> loadImage() async {
     List<int> imageData;
     try {
       imageData = await blobFetcher();
     } catch (e) {
-      log.warning('Blob for ${imageKey} not found.');
+      log.warning('Blob for $imageKey not found.');
       imageData =
           await assetutil.getRawBytes(assetutil.defaultThumbnailAssetKey);
     }
 
-    return await decodeImageFromList(new Uint8List.fromList(imageData));
+    return new ImageInfo(
+        image: await decodeImageFromList(new Uint8List.fromList(imageData)));
   }
 
+  @override
   bool operator ==(other) =>
       other is _RawImageProvider && imageKey == other.imageKey;
+
+  @override
   int get hashCode => imageKey.hashCode;
+
+  @override
   String toString() => imageKey;
 }
diff --git a/dart/pubspec.lock b/dart/pubspec.lock
index 3f442c6..15d2911 100644
--- a/dart/pubspec.lock
+++ b/dart/pubspec.lock
@@ -2,33 +2,53 @@
 # See http://pub.dartlang.org/doc/glossary.html#lockfile
 packages:
   analyzer:
-    description: analyzer
+    description:
+      name: analyzer
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.27.1+2"
+    version: "0.27.2"
   archive:
-    description: archive
+    description:
+      name: archive
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.20"
   args:
-    description: args
+    description:
+      name: args
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.13.3+1"
+    version: "0.13.4"
   asn1lib:
-    description: asn1lib
+    description:
+      name: asn1lib
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.4.1"
   async:
-    description: async
+    description:
+      name: async
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.8.0"
+    version: "1.9.0"
   barback:
-    description: barback
+    description:
+      name: barback
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.15.2+7"
   bignum:
-    description: bignum
+    description:
+      name: bignum
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.0.7"
+    version: "0.1.0"
+  boolean_selector:
+    description:
+      name: boolean_selector
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
   cassowary:
     description:
       path: "../../../../../flutter/packages/cassowary"
@@ -36,41 +56,77 @@
     source: path
     version: "0.1.7"
   charcode:
-    description: charcode
+    description:
+      name: charcode
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.1.0"
-  cipher:
-    description: cipher
+  cli_util:
+    description:
+      name: cli_util
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.7.1"
+    version: "0.0.1+2"
+  code_transformers:
+    description:
+      name: code_transformers
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.4.2+1"
   collection:
-    description: collection
+    description:
+      name: collection
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.4.0"
+    version: "1.5.1"
   contrast:
-    description: contrast
+    description:
+      name: contrast
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.1.1"
   convert:
-    description: convert
+    description:
+      name: convert
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.1"
   crypto:
-    description: crypto
+    description:
+      name: crypto
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.9.1"
+    version: "0.9.2"
   csslib:
-    description: csslib
+    description:
+      name: csslib
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.12.2"
+  dart_style:
+    description:
+      name: dart_style
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.4"
   den_api:
-    description: den_api
+    description:
+      name: den_api
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.1.0"
+  file:
+    description:
+      name: file
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.1.0"
   fixnum:
-    description: fixnum
+    description:
+      name: fixnum
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.9.1+2"
+    version: "0.10.2"
   flutter:
     description:
       path: "../../../../../flutter/packages/flutter"
@@ -90,71 +146,93 @@
     source: path
     version: "0.0.10"
   github:
-    description: github
+    description:
+      name: github
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "2.3.1+1"
   glob:
-    description: glob
+    description:
+      name: glob
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.0"
+    version: "1.1.1"
   html:
-    description: html
+    description:
+      name: html
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.12.2+1"
   http:
-    description: http
+    description:
+      name: http
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.11.3+3"
   http_multi_server:
-    description: http_multi_server
+    description:
+      name: http_multi_server
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.3.2"
+    version: "2.0.0"
   http_parser:
-    description: http_parser
+    description:
+      name: http_parser
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.0"
+    version: "2.2.1"
   intl:
-    description: intl
+    description:
+      name: intl
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.12.6"
+    version: "0.12.7"
+  json_schema:
+    description:
+      name: json_schema
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.3"
   logging:
-    description: logging
+    description:
+      name: logging
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.11.2"
   matcher:
-    description: matcher
+    description:
+      name: matcher
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.12.0+1"
-  material_design_icons:
-    description: material_design_icons
-    source: hosted
-    version: "0.0.3"
+    version: "0.12.0+2"
   mime:
-    description: mime
+    description:
+      name: mime
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.9.3"
   mojo:
-    description: mojo
+    description:
+      name: mojo
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.12"
-  mojo_apptest:
-    description: mojo_apptest
-    source: hosted
-    version: "0.2.16"
+    version: "0.4.18"
   mojo_sdk:
-    description: mojo_sdk
+    description:
+      name: mojo_sdk
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.11"
+    version: "0.2.22"
   mojo_services:
-    description: mojo_services
+    description:
+      name: mojo_services
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.14"
-  mojom:
-    description: mojom
-    source: hosted
-    version: "0.2.16"
+    version: "0.4.25"
   mustache4dart:
-    description: mustache4dart
+    description:
+      name: mustache4dart
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.10"
   newton:
@@ -164,122 +242,225 @@
     source: path
     version: "0.1.5"
   package_config:
-    description: package_config
+    description:
+      name: package_config
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.1.3"
   path:
-    description: path
+    description:
+      name: path
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.3.9"
   petitparser:
-    description: petitparser
+    description:
+      name: petitparser
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.5.1"
   plugin:
-    description: plugin
+    description:
+      name: plugin
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.1.0"
+  pointycastle:
+    description:
+      name: pointycastle
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.10.0"
   pool:
-    description: pool
+    description:
+      name: pool
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.2.1"
   pub_package_data:
-    description: pub_package_data
+    description:
+      name: pub_package_data
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.0.1"
   pub_semver:
-    description: pub_semver
+    description:
+      name: pub_semver
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.2.3"
   quiver:
-    description: quiver
+    description:
+      name: quiver
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.21.4"
+  quiver_collection:
+    description:
+      name: quiver_collection
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  quiver_iterables:
+    description:
+      name: quiver_iterables
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  quiver_pattern:
+    description:
+      name: quiver_pattern
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
+  reflectable:
+    description:
+      name: reflectable
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.5.3"
   shelf:
-    description: shelf
+    description:
+      name: shelf
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.6.4+3"
+    version: "0.6.5"
   shelf_static:
-    description: shelf_static
+    description:
+      name: shelf_static
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.3+2"
+    version: "0.2.3+3"
   shelf_web_socket:
-    description: shelf_web_socket
+    description:
+      name: shelf_web_socket
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.0.1+5"
+    version: "0.2.0"
   sky_engine:
-    description: sky_engine
-    source: hosted
-    version: "0.0.89"
+    description:
+      path: "../../../../../flutter/bin/cache/pkg/sky_engine"
+      relative: true
+    source: path
+    version: "0.0.99"
   sky_services:
-    description: sky_services
-    source: hosted
-    version: "0.0.89"
+    description:
+      path: "../../../../../flutter/bin/cache/pkg/sky_services"
+      relative: true
+    source: path
+    version: "0.0.99"
   source_map_stack_trace:
-    description: source_map_stack_trace
+    description:
+      name: source_map_stack_trace
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "1.0.4"
   source_maps:
-    description: source_maps
+    description:
+      name: source_maps
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.10.1"
+    version: "0.10.1+1"
   source_span:
-    description: source_span
+    description:
+      name: source_span
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.2.1"
+    version: "1.2.2"
   stack_trace:
-    description: stack_trace
+    description:
+      name: stack_trace
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.6.0"
+    version: "1.6.4"
+  stream_channel:
+    description:
+      name: stream_channel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.3.1"
   string_scanner:
-    description: string_scanner
+    description:
+      name: string_scanner
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.1.4+1"
   syncbase:
-    description: syncbase
+    description:
+      name: syncbase
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.0.28"
+    version: "0.0.35"
   test:
-    description: test
+    description:
+      name: test
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.12.6+1"
+    version: "0.12.13"
   typed_data:
-    description: typed_data
+    description:
+      name: typed_data
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.1.1"
+    version: "1.1.2"
   utf:
-    description: utf
+    description:
+      name: utf
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.9.0+2"
+    version: "0.9.0+3"
   uuid:
-    description: uuid
+    description:
+      name: uuid
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.5.0"
+    version: "0.5.1"
   v23discovery:
-    description: v23discovery
-    source: hosted
-    version: "0.0.12"
+    description:
+      path: "../../../mojo/discovery"
+      relative: true
+    source: path
+    version: "0.0.17"
   vector_math:
-    description: vector_math
+    description:
+      name: vector_math
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.4.6"
+    version: "1.4.7"
   watcher:
-    description: watcher
+    description:
+      name: watcher
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.9.7"
+  web_socket_channel:
+    description:
+      name: web_socket_channel
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.2"
   when:
-    description: when
+    description:
+      name: when
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.2.0"
   which:
-    description: which
+    description:
+      name: which
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "0.1.3"
   xml:
-    description: xml
+    description:
+      name: xml
+      url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.4.1"
+    version: "2.4.2"
   yaml:
-    description: yaml
+    description:
+      name: yaml
+      url: "https://pub.dartlang.org"
     source: hosted
     version: "2.1.8"
+sdk: ">=1.14.0 <1.17.0"
diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml
index ca27e2c..93d94a0 100644
--- a/dart/pubspec.yaml
+++ b/dart/pubspec.yaml
@@ -5,8 +5,8 @@
     path: "../../../../../flutter/packages/flutter"
   logging: ">=0.11.2 <0.12.0"
   mojo_services: ">=0.4.5 <0.5.0"
-  syncbase: ">=0.0.28 <0.1.0"
-  v23discovery: ">=0.0.12 < 0.1.0"
+  syncbase: ">=0.0.34 <0.1.0"
+  v23discovery: ">=0.0.17 < 0.1.0"
   uuid: ">=0.5.0 <0.6.0"
 dev_dependencies:
   flutter_tools:
