From 5e8ff50d5ed3f0d569ce4e196fcd272d594eabb7 Mon Sep 17 00:00:00 2001
From: Tom Robinson <tlrobinson@gmail.com>
Date: Fri, 30 Aug 2019 11:29:51 -0700
Subject: [PATCH] Various frontend cleanup (#10450)

* Remove .jsx extension from imports

* Use color() function instead of colors[...]

* Remove depreacted MBQL from frontned

* Remove more deprecated MBQL

* Revert a couple removals of .jsx due to flow conflict with .css files

* Fix reference/utils tests

* Fix color conflict
---
 frontend/src/metabase/App.jsx                 |   2 +-
 .../components/CreatedDatabaseModal.jsx       |   2 +-
 .../components/DatabaseEditForms.jsx          |   2 +-
 .../components/DatabaseSchedulingForm.jsx     |   6 +-
 .../components/DeleteDatabaseModal.jsx        |   2 +-
 .../databases/containers/DatabaseEditApp.jsx  |  12 +-
 .../databases/containers/DatabaseListApp.jsx  |   8 +-
 .../components/ObjectActionSelect.jsx         |   8 +-
 .../components/ObjectRetireModal.jsx          |   4 +-
 .../components/PartialQueryBuilder.jsx        |  12 +-
 .../components/UpdateCachedFieldValues.jsx    |   2 +-
 .../components/database/ColumnItem.jsx        |   4 +-
 .../components/database/ColumnsList.jsx       |   2 +-
 .../components/database/MetadataHeader.jsx    |  10 +-
 .../database/MetadataSchemaList.jsx           |   2 +-
 .../components/database/MetadataTable.jsx     |   8 +-
 .../components/database/MetadataTableList.jsx |   2 +-
 .../database/MetadataTablePicker.jsx          |   4 +-
 .../components/database/MetricItem.jsx        |   2 +-
 .../components/database/MetricsList.jsx       |   2 +-
 .../components/database/SegmentItem.jsx       |   2 +-
 .../components/database/SegmentsList.jsx      |   2 +-
 .../components/revisions/QueryDiff.jsx        |   6 +-
 .../components/revisions/Revision.jsx         |   4 +-
 .../components/revisions/RevisionDiff.jsx     |   6 +-
 .../components/revisions/RevisionHistory.jsx  |   6 +-
 .../admin/datamodel/containers/FieldApp.jsx   |  11 +-
 .../containers/MetadataEditorApp.jsx          |  10 +-
 .../admin/datamodel/containers/MetricApp.jsx  |   2 +-
 .../admin/datamodel/containers/MetricForm.jsx |  12 +-
 .../containers/RevisionHistoryApp.jsx         |   2 +-
 .../admin/datamodel/containers/SegmentApp.jsx |   2 +-
 .../datamodel/containers/SegmentForm.jsx      |  12 +-
 .../datamodel/containers/TableSettingsApp.jsx |   2 +-
 .../admin/people/components/GroupDetail.jsx   |  30 ++---
 .../admin/people/components/GroupSelect.jsx   |   2 +-
 .../admin/people/components/GroupsListing.jsx |  24 ++--
 .../people/components/UserGroupSelect.jsx     |  12 +-
 .../people/containers/AdminPeopleApp.jsx      |   7 +-
 .../people/containers/GroupDetailApp.jsx      |   2 +-
 .../people/containers/GroupsListingApp.jsx    |   2 +-
 .../people/containers/PeopleListingApp.jsx    |  16 ++-
 .../components/PermissionsEditor.jsx          |  14 +--
 .../components/PermissionsGrid.jsx            |  24 ++--
 .../containers/CollectionPermissionsModal.jsx |   2 +-
 .../containers/CollectionsPermissionsApp.jsx  |   4 +-
 .../containers/DataPermissionsApp.jsx         |   2 +-
 .../containers/DatabasesPermissionsApp.jsx    |   2 +-
 .../permissions/containers/PermissionsApp.jsx |   4 +-
 .../containers/SchemasPermissionsApp.jsx      |   2 +-
 .../containers/TablesPermissionsApp.jsx       |   2 +-
 .../src/metabase/admin/permissions/routes.jsx |  10 +-
 .../metabase/admin/permissions/selectors.js   |  14 +--
 frontend/src/metabase/admin/routes.jsx        |  28 ++---
 .../settings/components/SettingsSetting.jsx   |  14 +--
 .../settings/components/SettingsSetupList.jsx |  12 +-
 .../components/SettingsSingleSignOnForm.jsx   |   4 +-
 .../settings/components/SettingsSlackForm.jsx |   4 +-
 .../components/SettingsUpdatesForm.jsx        |   2 +-
 .../widgets/CustomGeoJSONWidget.jsx           |  14 +--
 .../components/widgets/SettingInput.jsx       |   2 +-
 .../components/widgets/SettingPassword.jsx    |   2 +-
 .../components/widgets/SettingSelect.jsx      |   2 +-
 .../components/widgets/SettingToggle.jsx      |   2 +-
 .../settings/containers/SettingsEditorApp.jsx |  18 +--
 .../src/metabase/admin/settings/selectors.js  |   6 +-
 .../admin/tasks/containers/JobInfoApp.jsx     |   2 +-
 .../tasks/containers/JobTriggersModal.jsx     |   2 +-
 .../metabase/admin/tasks/containers/Logs.jsx  |  18 +--
 .../tasks/containers/TroubleshootingApp.jsx   |   7 +-
 frontend/src/metabase/alert/alert.js          |   2 +-
 frontend/src/metabase/app-embed.js            |   2 +-
 frontend/src/metabase/app-main.js             |   2 +-
 frontend/src/metabase/app-public.js           |   2 +-
 .../auth/components/GoogleNoAccount.jsx       |   6 +-
 .../auth/containers/ForgotPasswordApp.jsx     |  14 +--
 .../src/metabase/auth/containers/LoginApp.jsx |  12 +-
 .../auth/containers/PasswordResetApp.jsx      |  12 +-
 .../src/metabase/components/AccordionList.jsx |   4 +-
 .../components/AdminAwareEmptyState.jsx       |   2 +-
 .../src/metabase/components/AdminHeader.jsx   |   2 +-
 .../src/metabase/components/AdminLayout.jsx   |   2 +-
 frontend/src/metabase/components/Alert.jsx    |   2 +-
 .../src/metabase/components/ArchivedItem.jsx  |   6 +-
 .../src/metabase/components/Breadcrumbs.jsx   |   4 +-
 .../src/metabase/components/BrowserCrumbs.jsx |   4 +-
 frontend/src/metabase/components/Button.jsx   |   2 +-
 frontend/src/metabase/components/Card.jsx     |  10 +-
 .../metabase/components/ChannelSetupModal.jsx |   2 +-
 frontend/src/metabase/components/CheckBox.jsx |   4 +-
 .../metabase/components/CollectionItem.jsx    |  20 ++--
 .../metabase/components/CollectionLanding.jsx |  18 ++-
 .../metabase/components/CollectionList.jsx    |   6 +-
 .../metabase/components/ColumnarSelector.jsx  |   2 +-
 frontend/src/metabase/components/Confirm.jsx  |   4 +-
 .../metabase/components/ConfirmContent.jsx    |   2 +-
 .../components/DatabaseDetailsForm.jsx        |   8 +-
 .../components/DeleteModalWithConfirm.jsx     |   4 +-
 .../metabase/components/DirectionalButton.jsx |   6 +-
 .../metabase/components/DownloadButton.jsx    |  10 +-
 .../src/metabase/components/EntityItem.jsx    |   6 +-
 .../src/metabase/components/EntityLayout.js   |   8 +-
 .../metabase/components/EntityMenuItem.jsx    |  10 +-
 .../src/metabase/components/EntityPage.jsx    |   6 +-
 .../src/metabase/components/ExplorePane.jsx   |   4 +-
 frontend/src/metabase/components/Header.jsx   |   8 +-
 .../src/metabase/components/HistoryModal.jsx  |   4 +-
 frontend/src/metabase/components/Icon.jsx     |   6 +-
 .../src/metabase/components/IconWrapper.jsx   |   4 +-
 .../metabase/components/ItemTypeFilterBar.jsx |  12 +-
 .../src/metabase/components/LabelIcon.jsx     |   2 +-
 frontend/src/metabase/components/ListItem.jsx |   4 +-
 .../components/LoadingAndErrorWrapper.jsx     |   2 +-
 frontend/src/metabase/components/Modal.jsx    |   2 +-
 .../src/metabase/components/ModalContent.jsx  |   2 +-
 .../metabase/components/ModalWithTrigger.jsx  |   4 +-
 .../metabase/components/NewsletterForm.jsx    |   8 +-
 .../src/metabase/components/NumericInput.jsx  |   2 +-
 .../metabase/components/PasswordReveal.jsx    |   4 +-
 .../components/PopoverWithTrigger.jsx         |   4 +-
 .../src/metabase/components/ProgressBar.jsx   |   6 +-
 .../src/metabase/components/QueryButton.jsx   |   2 +-
 .../components/QuestionSavedModal.jsx         |   2 +-
 .../src/metabase/components/SaveStatus.jsx    |   4 +-
 .../metabase/components/SchedulePicker.jsx    |   2 +-
 frontend/src/metabase/components/Select.jsx   |   6 +-
 .../src/metabase/components/SelectButton.jsx  |   2 +-
 .../src/metabase/components/SidebarItem.jsx   |   2 +-
 .../metabase/components/StackedCheckBox.jsx   |   2 +-
 .../metabase/components/StepIndicators.jsx    |   6 +-
 frontend/src/metabase/components/Text.jsx     |   4 +-
 .../components/TitleAndDescription.jsx        |   4 +-
 frontend/src/metabase/components/Tooltip.jsx  |   2 +-
 .../metabase/components/TooltipPopover.jsx    |   2 +-
 .../src/metabase/components/Triggerable.jsx   |   2 +-
 .../src/metabase/components/UserAvatar.jsx    |   4 +-
 .../components/icons/FullscreenIcon.jsx       |   2 +-
 .../components/icons/NightModeIcon.jsx        |   2 +-
 .../containers/AddToDashSelectDashModal.jsx   |   2 +-
 .../src/metabase/containers/ItemPicker.jsx    |   4 +-
 .../src/metabase/containers/Overworld.jsx     |  28 ++---
 .../metabase/containers/SaveQuestionModal.jsx |   6 +-
 .../src/metabase/containers/UndoListing.jsx   |   6 +-
 .../containers/UserCollectionList.jsx         |   4 +-
 .../dashboard/components/AddSeriesModal.jsx   |  20 ++--
 .../AddToDashSelectQuestionModal.jsx          |   2 +-
 .../dashboard/components/DashCard.jsx         |  10 +-
 .../components/DashCardParameterMapper.jsx    |   8 +-
 .../dashboard/components/Dashboard.jsx        |   8 +-
 .../dashboard/components/DashboardGrid.jsx    |  12 +-
 .../components/DashboardMoveModal.jsx         |   4 +-
 .../dashboard/components/RefreshWidget.jsx    |  10 +-
 .../dashboard/components/grid/GridLayout.jsx  |  10 +-
 .../containers/AutomaticDashboardApp.jsx      |  10 +-
 .../DashCardCardParameterMapper.jsx           |   8 +-
 .../dashboard/containers/DashboardApp.jsx     |   2 +-
 frontend/src/metabase/entities/collections.js |   6 +-
 frontend/src/metabase/entities/dashboards.js  |   4 +-
 frontend/src/metabase/entities/metrics.js     |   4 +-
 frontend/src/metabase/entities/pulses.js      |   4 +-
 frontend/src/metabase/entities/questions.js   |   4 +-
 frontend/src/metabase/entities/segments.js    |   4 +-
 frontend/src/metabase/entities/tables.js      |   4 +-
 .../src/metabase/home/components/Activity.jsx |  20 ++--
 .../metabase/home/components/ActivityItem.jsx |  10 +-
 .../home/components/ActivityStory.jsx         |   6 +-
 .../components/NewUserOnboardingModal.jsx     |   6 +-
 .../src/metabase/home/components/NextStep.jsx |   2 +-
 .../metabase/home/components/RecentViews.jsx  |  10 +-
 .../home/components/SidebarSection.jsx        |   6 +-
 .../metabase/home/containers/SearchApp.jsx    |  12 +-
 frontend/src/metabase/lib/colors.js           |   3 +
 frontend/src/metabase/lib/dataset.js          |   3 -
 frontend/src/metabase/lib/formatting.js       |   2 +-
 frontend/src/metabase/lib/query_time.js       |   2 +-
 .../components/actions/CountByTimeAction.jsx  |   7 +-
 frontend/src/metabase/modes/lib/actions.js    |  13 +--
 .../src/metabase/nav/containers/Navbar.jsx    |  17 +--
 .../new_query/components/NewQueryOption.jsx   |   6 +-
 .../components/ParameterValueWidget.jsx       |  20 ++--
 .../parameters/components/ParameterWidget.jsx |   4 +-
 .../parameters/components/Parameters.jsx      |   6 +-
 .../components/widgets/CategoryWidget.jsx     |   2 +-
 .../widgets/DateAllOptionsWidget.jsx          |   6 +-
 .../widgets/DateMonthYearWidget.jsx           |   2 +-
 .../widgets/DateQuarterYearWidget.jsx         |   2 +-
 .../components/widgets/DateRangeWidget.jsx    |   2 +-
 .../components/widgets/DateSingleWidget.jsx   |   2 +-
 .../components/widgets/YearPicker.jsx         |   2 +-
 .../widgets/AdvancedSettingsPane.jsx          |   4 +-
 .../components/widgets/EmbedModalContent.jsx  |   4 +-
 .../pulse/components/PulseCardPreview.jsx     |  12 +-
 .../metabase/pulse/components/PulseEdit.jsx   |  18 +--
 .../pulse/components/PulseEditCards.jsx       |   6 +-
 .../pulse/components/PulseEditChannels.jsx    |  12 +-
 .../pulse/components/PulseEditSkip.jsx        |   2 +-
 .../pulse/containers/PulseEditApp.jsx         |   2 +-
 .../components/AddClauseButton.jsx            |   4 +-
 .../components/AggregationPopover.jsx         |  14 +--
 .../query_builder/components/BreakoutName.jsx |   2 +-
 .../components/BreakoutPopover.jsx            |   2 +-
 .../query_builder/components/Clearable.jsx    |   2 +-
 .../query_builder/components/DataSelector.jsx |   7 +-
 .../components/ExtendedOptions.jsx            |  12 +-
 .../query_builder/components/FieldName.jsx    |   2 +-
 .../query_builder/components/FieldWidget.jsx  |   6 +-
 .../query_builder/components/Filter.jsx       |   2 +-
 .../query_builder/components/FilterList.jsx   |   2 +-
 .../components/GuiQueryEditor.jsx             |  16 +--
 .../components/QueryDefinitionTooltip.jsx     |   6 +-
 .../components/QueryDownloadWidget.jsx        |   8 +-
 .../components/SavedQuestionIntroModal.jsx    |   2 +-
 .../components/SelectionModule.jsx            |   6 +-
 .../query_builder/components/SortWidget.jsx   |   6 +-
 .../components/TimeGroupingPopover.jsx        |   1 -
 .../components/VisualizationResult.jsx        |   2 +-
 .../components/dataref/DatabasePane.jsx       |   2 +-
 .../components/dataref/DetailPane.jsx         |   4 +-
 .../components/dataref/FieldPane.jsx          |   6 +-
 .../components/dataref/MainPane.jsx           |   2 +-
 .../components/dataref/MetricPane.jsx         |   6 +-
 .../components/dataref/QueryDefinition.jsx    |   4 +-
 .../components/dataref/SegmentPane.jsx        |   8 +-
 .../components/dataref/TablePane.jsx          |   4 +-
 .../components/dataref/UseForButton.jsx       |   2 +-
 .../expressions/ExpressionEditorTextfield.jsx |   4 +-
 .../expressions/ExpressionWidget.jsx          |   2 +-
 .../components/expressions/Expressions.jsx    |   6 +-
 .../components/expressions/TokenizedInput.jsx |   2 +-
 .../components/filters/FilterWidget.jsx       |   6 +-
 .../components/filters/FilterWidgetList.jsx   |   2 +-
 .../filters/pickers/HoursMinutesInput.jsx     |   2 +-
 .../filters/pickers/NumberPicker.jsx          |   2 +-
 .../filters/pickers/RelativeDatePicker.jsx    |   2 +-
 .../filters/pickers/SelectPicker.jsx          |   4 +-
 .../components/notebook/NotebookStep.jsx      |  28 ++---
 .../components/notebook/steps/SortStep.jsx    |   2 +-
 .../template_tags/TagEditorHelp.jsx           |   2 +-
 .../template_tags/TagEditorParam.jsx          |   8 +-
 .../components/view/QuestionSummaries.jsx     |   6 +-
 .../components/view/ViewButton.jsx            |   4 +-
 .../components/view/ViewFooter.jsx            |   9 +-
 .../components/view/ViewPill.jsx              |   4 +-
 .../questions/containers/AddToDashboard.jsx   |   2 +-
 .../reference/components/EditButton.jsx       |   2 +-
 .../reference/components/EditHeader.jsx       |   2 +-
 .../components/EditableReferenceHeader.jsx    |  14 +--
 .../metabase/reference/components/Field.jsx   |   4 +-
 .../reference/components/FieldToGroupBy.jsx   |   2 +-
 .../reference/components/FieldTypeDetail.jsx  |   2 +-
 .../reference/components/FieldsToGroupBy.jsx  |   2 +-
 .../metabase/reference/components/Formula.jsx |   4 +-
 .../components/GuideDetailEditor.jsx          |   6 +-
 .../reference/components/GuideEditSection.jsx |   2 +-
 .../reference/components/GuideHeader.jsx      |   2 +-
 .../MetricImportantFieldsDetail.jsx           |   4 +-
 .../reference/components/ReferenceHeader.jsx  |  10 +-
 .../components/RevisionMessageModal.jsx       |   4 +-
 .../reference/components/UsefulQuestions.jsx  |   2 +-
 .../reference/databases/DatabaseDetail.jsx    |  10 +-
 .../databases/DatabaseDetailContainer.jsx     |   6 +-
 .../reference/databases/DatabaseList.jsx      |   8 +-
 .../databases/DatabaseListContainer.jsx       |   6 +-
 .../reference/databases/DatabaseSidebar.jsx   |   4 +-
 .../reference/databases/FieldDetail.jsx       |  14 +--
 .../databases/FieldDetailContainer.jsx        |   6 +-
 .../reference/databases/FieldList.jsx         |  12 +-
 .../databases/FieldListContainer.jsx          |   6 +-
 .../reference/databases/TableDetail.jsx       |  12 +-
 .../databases/TableDetailContainer.jsx        |   6 +-
 .../reference/databases/TableList.jsx         |  10 +-
 .../databases/TableListContainer.jsx          |   6 +-
 .../reference/databases/TableQuestions.jsx    |  10 +-
 .../databases/TableQuestionsContainer.jsx     |   6 +-
 .../metabase/reference/guide/BaseSidebar.jsx  |   4 +-
 .../reference/guide/GettingStartedGuide.jsx   |   6 +-
 .../guide/GettingStartedGuideContainer.jsx    |   4 +-
 .../guide/GettingStartedGuideEditForm.jsx     |  12 +-
 .../reference/metrics/MetricDetail.jsx        |  16 +--
 .../metrics/MetricDetailContainer.jsx         |   6 +-
 .../metabase/reference/metrics/MetricList.jsx |  10 +-
 .../reference/metrics/MetricListContainer.jsx |   6 +-
 .../reference/metrics/MetricQuestions.jsx     |  10 +-
 .../metrics/MetricQuestionsContainer.jsx      |   6 +-
 .../reference/metrics/MetricRevisions.jsx     |   8 +-
 .../metrics/MetricRevisionsContainer.jsx      |   6 +-
 .../reference/segments/SegmentDetail.jsx      |  14 +--
 .../segments/SegmentDetailContainer.jsx       |   6 +-
 .../reference/segments/SegmentFieldDetail.jsx |  14 +--
 .../segments/SegmentFieldDetailContainer.jsx  |   6 +-
 .../reference/segments/SegmentFieldList.jsx   |  12 +-
 .../segments/SegmentFieldListContainer.jsx    |   6 +-
 .../segments/SegmentFieldSidebar.jsx          |   4 +-
 .../reference/segments/SegmentList.jsx        |  10 +-
 .../segments/SegmentListContainer.jsx         |   6 +-
 .../reference/segments/SegmentQuestions.jsx   |  10 +-
 .../segments/SegmentQuestionsContainer.jsx    |   6 +-
 .../reference/segments/SegmentRevisions.jsx   |   8 +-
 .../segments/SegmentRevisionsContainer.jsx    |   6 +-
 frontend/src/metabase/reference/utils.js      |   6 +-
 frontend/src/metabase/routes-embed.jsx        |   6 +-
 frontend/src/metabase/routes-public.jsx       |   6 +-
 frontend/src/metabase/routes.jsx              |  68 ++++++------
 .../setup/components/CollapsedStep.jsx        |   2 +-
 .../components/DatabaseConnectionStep.jsx     |   8 +-
 .../components/DatabaseSchedulingStep.jsx     |   4 +-
 .../setup/components/PreferencesStep.jsx      |   6 +-
 .../src/metabase/setup/components/Setup.jsx   |  10 +-
 .../metabase/setup/components/StepTitle.jsx   |   2 +-
 .../metabase/setup/components/UserStep.jsx    |  10 +-
 .../metabase/setup/containers/SetupApp.jsx    |   2 +-
 .../user/components/SetUserPassword.jsx       |   6 +-
 .../user/containers/UserSettingsApp.jsx       |   2 +-
 .../components/CardRenderer.jsx               |   2 +-
 .../components/ChartSettings.jsx              |   4 +-
 .../components/ChartTooltip.jsx               |   2 +-
 .../components/ChartWithLegend.jsx            |   6 +-
 .../components/ChoroplethMap.jsx              |   8 +-
 .../visualizations/components/FunnelBar.jsx   |   2 +-
 .../components/FunnelNormal.jsx               |   2 +-
 .../components/LeafletChoropleth.jsx          |   6 +-
 .../components/LeafletGridHeatMap.jsx         |  10 +-
 .../components/LeafletHeatMap.jsx             |   2 +-
 .../components/LeafletMarkerPinMap.jsx        |   2 +-
 .../components/LeafletTilePinMap.jsx          |   2 +-
 .../components/LegendHorizontal.jsx           |   2 +-
 .../visualizations/components/LegendItem.jsx  |   6 +-
 .../components/LegendVertical.jsx             |   4 +-
 .../components/LineAreaBarChart.jsx           |   6 +-
 .../visualizations/components/MiniBar.jsx     |   4 +-
 .../components/TableInteractive.jsx           |   6 +-
 .../visualizations/components/TableSimple.jsx |   6 +-
 .../components/TitleLegendHeader.jsx          |   2 +-
 .../components/Visualization.jsx              |  14 +--
 .../settings/ChartSettingColorsPicker.jsx     |   2 +-
 .../settings/ChartSettingFieldPicker.jsx      |   2 +-
 .../settings/ChartSettingFieldsPicker.jsx     |   2 +-
 .../settings/ChartSettingGaugeSegments.jsx    |  10 +-
 .../settings/ChartSettingInputGroup.jsx       |   2 +-
 .../components/settings/ChartSettingRadio.jsx |   2 +-
 .../settings/ChartSettingSelect.jsx           |   2 +-
 .../settings/ChartSettingToggle.jsx           |   2 +-
 .../settings/ChartSettingsTableFormatting.jsx |  10 +-
 frontend/src/metabase/visualizations/index.js |  32 +++---
 .../lib/LineAreaBarPostRender.js              |   4 +-
 .../metabase/visualizations/lib/settings.js   |  22 ++--
 .../visualizations/visualizations/Gauge.jsx   |  18 +--
 .../visualizations/visualizations/Map.jsx     |   4 +-
 .../visualizations/ObjectDetail.jsx           |   8 +-
 .../visualizations/PieChart.jsx               |  10 +-
 .../visualizations/Progress.jsx               |   8 +-
 .../visualizations/SmartScalar.jsx            |  23 ++--
 .../visualizations/visualizations/Table.jsx   |   6 +-
 .../visualizations/visualizations/Text.jsx    |   2 +-
 frontend/test/__support__/mocks.js            |   2 +-
 .../metabase-lib/lib/Dimension.unit.spec.js   |  28 +++--
 .../StructuredQuery-nesting.unit.spec.js      |   2 +-
 .../containers/PeopleListingApp.integ.spec.js |   2 +-
 .../SettingsAuthenticationOptions.e2e.spec.js |   4 +-
 .../metabase/dashboard/DashCard.unit.spec.js  |   2 +-
 .../metabase/dashboard/dashboard.e2e.spec.js  |   2 +-
 .../test/metabase/lib/dataset.unit.spec.js    |   4 +-
 .../test/metabase/lib/formatting.unit.spec.js |   2 +-
 frontend/test/metabase/lib/query.unit.spec.js | 103 ++++++++----------
 .../metabase/lib/query/query.unit.spec.js     |  29 +++--
 .../test/metabase/lib/query_time.unit.spec.js |  24 ++--
 frontend/test/metabase/meta/Card.unit.spec.js |  12 +-
 .../actions/CountByTimeAction.unit.spec.js    |   7 +-
 .../drill/UnderlyingRecordsDrill.unit.spec.js |  15 +--
 .../components/drill/ZoomDrill.unit.spec.js   |  15 +--
 .../metabase/modes/lib/actions.unit.spec.js   |   2 +-
 .../test/metabase/public/public.e2e.spec.js   |   4 +-
 .../components/FieldName.unit.spec.js         |   7 +-
 .../metabase/reference/databases.e2e.spec.js  |  10 +-
 .../test/metabase/reference/guide.e2e.spec.js |   4 +-
 .../metabase/reference/segments.e2e.spec.js   |   2 +-
 .../metabase/reference/utils.unit.spec.js     |  16 +--
 .../components/LegendVertical.unit.spec.js    |   2 +-
 .../components/LineAreaBarChart.unit.spec.js  |   2 +-
 .../components/Visualization.unit.spec.js     |  30 ++---
 .../visualizations/lib/utils.unit.spec.js     |   5 +-
 381 files changed, 1289 insertions(+), 1318 deletions(-)

diff --git a/frontend/src/metabase/App.jsx b/frontend/src/metabase/App.jsx
index 32d4d78077e..527e4e7ee1e 100644
--- a/frontend/src/metabase/App.jsx
+++ b/frontend/src/metabase/App.jsx
@@ -3,7 +3,7 @@
 import React, { Component } from "react";
 import { connect } from "react-redux";
 import ScrollToTop from "metabase/hoc/ScrollToTop";
-import Navbar from "metabase/nav/containers/Navbar.jsx";
+import Navbar from "metabase/nav/containers/Navbar";
 
 import UndoListing from "metabase/containers/UndoListing";
 
diff --git a/frontend/src/metabase/admin/databases/components/CreatedDatabaseModal.jsx b/frontend/src/metabase/admin/databases/components/CreatedDatabaseModal.jsx
index 56663669856..d1f683e8d02 100644
--- a/frontend/src/metabase/admin/databases/components/CreatedDatabaseModal.jsx
+++ b/frontend/src/metabase/admin/databases/components/CreatedDatabaseModal.jsx
@@ -6,7 +6,7 @@ import { t } from "ttag";
 import MetabaseSettings from "metabase/lib/settings";
 
 import Button from "metabase/components/Button";
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalContent from "metabase/components/ModalContent";
 
 type Props = {
   databaseId: number,
diff --git a/frontend/src/metabase/admin/databases/components/DatabaseEditForms.jsx b/frontend/src/metabase/admin/databases/components/DatabaseEditForms.jsx
index 8cbf4a565bc..04c5001cf2a 100644
--- a/frontend/src/metabase/admin/databases/components/DatabaseEditForms.jsx
+++ b/frontend/src/metabase/admin/databases/components/DatabaseEditForms.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
-import DatabaseDetailsForm from "metabase/components/DatabaseDetailsForm.jsx";
+import DatabaseDetailsForm from "metabase/components/DatabaseDetailsForm";
 import { t } from "ttag";
 
 export default class DatabaseEditForms extends Component {
diff --git a/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx b/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx
index 6be60668a1b..af9654bae0a 100644
--- a/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx
+++ b/frontend/src/metabase/admin/databases/components/DatabaseSchedulingForm.jsx
@@ -9,7 +9,7 @@ import SchedulePicker from "metabase/components/SchedulePicker";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export const SyncOption = ({ selected, name, children, select }) => (
   <div
@@ -22,7 +22,7 @@ export const SyncOption = ({ selected, name, children, select }) => (
         width: 18,
         height: 18,
         borderWidth: 2,
-        borderColor: selected ? colors["brand"] : colors["text-light"],
+        borderColor: selected ? color("brand") : color("text-light"),
         borderStyle: "solid",
       }}
     >
@@ -32,7 +32,7 @@ export const SyncOption = ({ selected, name, children, select }) => (
           style={{
             width: 8,
             height: 8,
-            backgroundColor: selected ? colors["brand"] : colors["text-light"],
+            backgroundColor: selected ? color("brand") : color("text-light"),
           }}
         />
       )}
diff --git a/frontend/src/metabase/admin/databases/components/DeleteDatabaseModal.jsx b/frontend/src/metabase/admin/databases/components/DeleteDatabaseModal.jsx
index d0e72281b83..471f31402ac 100644
--- a/frontend/src/metabase/admin/databases/components/DeleteDatabaseModal.jsx
+++ b/frontend/src/metabase/admin/databases/components/DeleteDatabaseModal.jsx
@@ -3,7 +3,7 @@ import PropTypes from "prop-types";
 import { t } from "ttag";
 
 import Button from "metabase/components/Button";
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalContent from "metabase/components/ModalContent";
 
 export default class DeleteDatabaseModal extends Component {
   constructor(props, context) {
diff --git a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx
index f047ef7a2bd..ed65466c735 100644
--- a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx
+++ b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.jsx
@@ -7,13 +7,13 @@ import title from "metabase/hoc/Title";
 import { t } from "ttag";
 
 import MetabaseSettings from "metabase/lib/settings";
-import DeleteDatabaseModal from "../components/DeleteDatabaseModal.jsx";
-import DatabaseEditForms from "../components/DatabaseEditForms.jsx";
+import DeleteDatabaseModal from "../components/DeleteDatabaseModal";
+import DatabaseEditForms from "../components/DatabaseEditForms";
 import DatabaseSchedulingForm from "../components/DatabaseSchedulingForm";
-import ActionButton from "metabase/components/ActionButton.jsx";
-import Breadcrumbs from "metabase/components/Breadcrumbs.jsx";
-import Radio from "metabase/components/Radio.jsx";
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
+import ActionButton from "metabase/components/ActionButton";
+import Breadcrumbs from "metabase/components/Breadcrumbs";
+import Radio from "metabase/components/Radio";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
 
 import {
   getEditingDatabase,
diff --git a/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx b/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx
index 372956fa7c6..3d255df31a3 100644
--- a/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx
+++ b/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx
@@ -9,12 +9,12 @@ import { t } from "ttag";
 import cx from "classnames";
 import MetabaseSettings from "metabase/lib/settings";
 
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
 import FormMessage from "metabase/components/form/FormMessage";
 
-import CreatedDatabaseModal from "../components/CreatedDatabaseModal.jsx";
-import DeleteDatabaseModal from "../components/DeleteDatabaseModal.jsx";
+import CreatedDatabaseModal from "../components/CreatedDatabaseModal";
+import DeleteDatabaseModal from "../components/DeleteDatabaseModal";
 
 import Database from "metabase/entities/databases";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/ObjectActionSelect.jsx b/frontend/src/metabase/admin/datamodel/components/ObjectActionSelect.jsx
index 03d3eb83d13..96d54afea25 100644
--- a/frontend/src/metabase/admin/datamodel/components/ObjectActionSelect.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/ObjectActionSelect.jsx
@@ -2,11 +2,11 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Link } from "react-router";
 
-import Icon from "metabase/components/Icon.jsx";
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
+import Icon from "metabase/components/Icon";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
 import { t } from "ttag";
-import ObjectRetireModal from "./ObjectRetireModal.jsx";
+import ObjectRetireModal from "./ObjectRetireModal";
 
 import { capitalize } from "metabase/lib/formatting";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/ObjectRetireModal.jsx b/frontend/src/metabase/admin/datamodel/components/ObjectRetireModal.jsx
index 63e929c66fd..bee4564245c 100644
--- a/frontend/src/metabase/admin/datamodel/components/ObjectRetireModal.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/ObjectRetireModal.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 import ReactDOM from "react-dom";
 
-import ActionButton from "metabase/components/ActionButton.jsx";
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ActionButton from "metabase/components/ActionButton";
+import ModalContent from "metabase/components/ModalContent";
 import { t } from "ttag";
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/PartialQueryBuilder.jsx b/frontend/src/metabase/admin/datamodel/components/PartialQueryBuilder.jsx
index 09367576675..cbd99ae08d8 100644
--- a/frontend/src/metabase/admin/datamodel/components/PartialQueryBuilder.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/PartialQueryBuilder.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import GuiQueryEditor from "metabase/query_builder/components/GuiQueryEditor.jsx";
+import GuiQueryEditor from "metabase/query_builder/components/GuiQueryEditor";
 import { t } from "ttag";
 import * as Urls from "metabase/lib/urls";
 
@@ -57,15 +57,7 @@ export default class PartialQueryBuilder extends Component {
     }).query();
 
     const previewCard = {
-      dataset_query: {
-        ...datasetQuery,
-        query: {
-          aggregation: ["rows"],
-          breakout: [],
-          filter: [],
-          ...datasetQuery.query,
-        },
-      },
+      dataset_query: datasetQuery,
     };
     const previewUrl = Urls.question(null, previewCard);
 
diff --git a/frontend/src/metabase/admin/datamodel/components/UpdateCachedFieldValues.jsx b/frontend/src/metabase/admin/datamodel/components/UpdateCachedFieldValues.jsx
index 272ed82f91b..3c624998553 100644
--- a/frontend/src/metabase/admin/datamodel/components/UpdateCachedFieldValues.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/UpdateCachedFieldValues.jsx
@@ -2,7 +2,7 @@ import React from "react";
 
 import { t } from "ttag";
 
-import ActionButton from "metabase/components/ActionButton.jsx";
+import ActionButton from "metabase/components/ActionButton";
 
 export default class UpdateCachedFieldValues extends React.Component {
   render() {
diff --git a/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx b/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx
index 9dd28f2a1d3..2c3438adf54 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/ColumnItem.jsx
@@ -2,8 +2,8 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Link, withRouter } from "react-router";
 
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
-import Select, { Option } from "metabase/components/Select.jsx";
+import InputBlurChange from "metabase/components/InputBlurChange";
+import Select, { Option } from "metabase/components/Select";
 import Icon from "metabase/components/Icon";
 import { t } from "ttag";
 import * as MetabaseCore from "metabase/lib/core";
diff --git a/frontend/src/metabase/admin/datamodel/components/database/ColumnsList.jsx b/frontend/src/metabase/admin/datamodel/components/database/ColumnsList.jsx
index 62763d4a27e..4c10806f7ec 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/ColumnsList.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/ColumnsList.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import ColumnItem from "./ColumnItem.jsx";
+import ColumnItem from "./ColumnItem";
 
 export default class ColumnsList extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetadataHeader.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetadataHeader.jsx
index 2f39d34d19e..12d58b0a88f 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetadataHeader.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetadataHeader.jsx
@@ -2,11 +2,11 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Link, withRouter } from "react-router";
 import { t } from "ttag";
-import SaveStatus from "metabase/components/SaveStatus.jsx";
-import Toggle from "metabase/components/Toggle.jsx";
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import ColumnarSelector from "metabase/components/ColumnarSelector.jsx";
-import Icon from "metabase/components/Icon.jsx";
+import SaveStatus from "metabase/components/SaveStatus";
+import Toggle from "metabase/components/Toggle";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import ColumnarSelector from "metabase/components/ColumnarSelector";
+import Icon from "metabase/components/Icon";
 import Databases from "metabase/entities/databases";
 
 @withRouter
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetadataSchemaList.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetadataSchemaList.jsx
index 3b64300ac9a..8cc488974a8 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetadataSchemaList.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetadataSchemaList.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 import { t, ngettext, msgid } from "ttag";
 
 import _ from "underscore";
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx
index eb175bd54da..727f90e5e95 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetadataTable.jsx
@@ -1,11 +1,11 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import MetricsList from "./MetricsList.jsx";
-import ColumnsList from "./ColumnsList.jsx";
-import SegmentsList from "./SegmentsList.jsx";
+import MetricsList from "./MetricsList";
+import ColumnsList from "./ColumnsList";
+import SegmentsList from "./SegmentsList";
 import { t } from "ttag";
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
+import InputBlurChange from "metabase/components/InputBlurChange";
 import Databases from "metabase/entities/databases";
 import Tables from "metabase/entities/tables";
 import withTableMetadataLoaded from "metabase/admin/datamodel/withTableMetadataLoaded";
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetadataTableList.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetadataTableList.jsx
index 9567e13e5ec..0b4111f3879 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetadataTableList.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetadataTableList.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 import { t, ngettext, msgid } from "ttag";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetadataTablePicker.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetadataTablePicker.jsx
index 8ad5296c73e..05be829c1d0 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetadataTablePicker.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetadataTablePicker.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import MetadataTableList from "./MetadataTableList.jsx";
-import MetadataSchemaList from "./MetadataSchemaList.jsx";
+import MetadataTableList from "./MetadataTableList";
+import MetadataSchemaList from "./MetadataSchemaList";
 
 import Tables from "metabase/entities/tables";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetricItem.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetricItem.jsx
index 9bafb2ba22b..493d2d994ff 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetricItem.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetricItem.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import ObjectActionSelect from "../ObjectActionSelect.jsx";
+import ObjectActionSelect from "../ObjectActionSelect";
 
 import * as Q_DEPRECATED from "metabase/lib/query";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/database/MetricsList.jsx b/frontend/src/metabase/admin/datamodel/components/database/MetricsList.jsx
index caa1dc1e378..5130d5b2ec9 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/MetricsList.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/MetricsList.jsx
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Link } from "react-router";
 import { t } from "ttag";
-import MetricItem from "./MetricItem.jsx";
+import MetricItem from "./MetricItem";
 
 export default class MetricsList extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/admin/datamodel/components/database/SegmentItem.jsx b/frontend/src/metabase/admin/datamodel/components/database/SegmentItem.jsx
index 6b4832445bf..3fbf1c6ab4e 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/SegmentItem.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/SegmentItem.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import ObjectActionSelect from "../ObjectActionSelect.jsx";
+import ObjectActionSelect from "../ObjectActionSelect";
 
 import * as Q_DEPRECATED from "metabase/lib/query";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/database/SegmentsList.jsx b/frontend/src/metabase/admin/datamodel/components/database/SegmentsList.jsx
index eb7b24adb3b..40c2eb74bcb 100644
--- a/frontend/src/metabase/admin/datamodel/components/database/SegmentsList.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/database/SegmentsList.jsx
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Link } from "react-router";
 import { t } from "ttag";
-import SegmentItem from "./SegmentItem.jsx";
+import SegmentItem from "./SegmentItem";
 
 export default class SegmentsList extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/admin/datamodel/components/revisions/QueryDiff.jsx b/frontend/src/metabase/admin/datamodel/components/revisions/QueryDiff.jsx
index 11dd6bd6df3..3bf2eef36d9 100644
--- a/frontend/src/metabase/admin/datamodel/components/revisions/QueryDiff.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/revisions/QueryDiff.jsx
@@ -1,10 +1,10 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import FilterList from "metabase/query_builder/components/FilterList.jsx";
-import AggregationWidget from "metabase/query_builder/components/AggregationWidget.jsx";
+import FilterList from "metabase/query_builder/components/FilterList";
+import AggregationWidget from "metabase/query_builder/components/AggregationWidget";
 
 import * as Query from "metabase/lib/query/query";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/revisions/Revision.jsx b/frontend/src/metabase/admin/datamodel/components/revisions/Revision.jsx
index 20aa1f7e567..d0698fd9344 100644
--- a/frontend/src/metabase/admin/datamodel/components/revisions/Revision.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/revisions/Revision.jsx
@@ -1,9 +1,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import RevisionDiff from "./RevisionDiff.jsx";
+import RevisionDiff from "./RevisionDiff";
 import { t } from "ttag";
-import UserAvatar from "metabase/components/UserAvatar.jsx";
+import UserAvatar from "metabase/components/UserAvatar";
 
 import moment from "moment";
 
diff --git a/frontend/src/metabase/admin/datamodel/components/revisions/RevisionDiff.jsx b/frontend/src/metabase/admin/datamodel/components/revisions/RevisionDiff.jsx
index 0574a0a9325..4e2b03cf07b 100644
--- a/frontend/src/metabase/admin/datamodel/components/revisions/RevisionDiff.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/revisions/RevisionDiff.jsx
@@ -1,10 +1,10 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import TextDiff from "./TextDiff.jsx";
-import QueryDiff from "./QueryDiff.jsx";
+import TextDiff from "./TextDiff";
+import QueryDiff from "./QueryDiff";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 export default class RevisionDiff extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/admin/datamodel/components/revisions/RevisionHistory.jsx b/frontend/src/metabase/admin/datamodel/components/revisions/RevisionHistory.jsx
index 457bbe71962..59f3ea01465 100644
--- a/frontend/src/metabase/admin/datamodel/components/revisions/RevisionHistory.jsx
+++ b/frontend/src/metabase/admin/datamodel/components/revisions/RevisionHistory.jsx
@@ -1,10 +1,10 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Revision from "./Revision.jsx";
+import Revision from "./Revision";
 import { t } from "ttag";
-import Breadcrumbs from "metabase/components/Breadcrumbs.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import Breadcrumbs from "metabase/components/Breadcrumbs";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import Tables from "metabase/entities/tables";
 
 import { assignUserColors } from "metabase/lib/formatting";
diff --git a/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx b/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx
index eb0c7f8b91d..66d559604b1 100644
--- a/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/FieldApp.jsx
@@ -22,11 +22,8 @@ import SaveStatus from "metabase/components/SaveStatus";
 import Breadcrumbs from "metabase/components/Breadcrumbs";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import AdminLayout from "metabase/components/AdminLayout.jsx";
-import {
-  LeftNavPane,
-  LeftNavPaneItem,
-} from "metabase/components/LeftNavPane.jsx";
+import AdminLayout from "metabase/components/AdminLayout";
+import { LeftNavPane, LeftNavPaneItem } from "metabase/components/LeftNavPane";
 import Section, { SectionHeader } from "../components/Section";
 import SelectSeparator from "../components/SelectSeparator";
 
@@ -47,7 +44,7 @@ import { rescanFieldValues, discardFieldValues } from "../field";
 // LIB
 import Metadata from "metabase-lib/lib/metadata/Metadata";
 import { has_field_values_options } from "metabase/lib/core";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import { getGlobalSettingsForColumn } from "metabase/visualizations/lib/settings/column";
 import { isCurrency } from "metabase/lib/schema_metadata";
 
@@ -392,7 +389,7 @@ export const BackButton = ({
   <Link
     to={`/admin/datamodel/database/${databaseId}/table/${tableId}`}
     className="circle text-white p2 flex align-center justify-center inline"
-    style={{ backgroundColor: colors["bg-dark"] }}
+    style={{ backgroundColor: color("bg-dark") }}
   >
     <Icon name="arrow_back" />
   </Link>
diff --git a/frontend/src/metabase/admin/datamodel/containers/MetadataEditorApp.jsx b/frontend/src/metabase/admin/datamodel/containers/MetadataEditorApp.jsx
index 6599ed65e4e..4cf2b35b856 100644
--- a/frontend/src/metabase/admin/datamodel/containers/MetadataEditorApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/MetadataEditorApp.jsx
@@ -6,11 +6,11 @@ import { push } from "react-router-redux";
 import { t } from "ttag";
 import MetabaseAnalytics from "metabase/lib/analytics";
 
-import AdminEmptyText from "metabase/components/AdminEmptyText.jsx";
-import MetadataHeader from "../components/database/MetadataHeader.jsx";
-import MetadataTablePicker from "../components/database/MetadataTablePicker.jsx";
-import MetadataTable from "../components/database/MetadataTable.jsx";
-import MetadataSchema from "../components/database/MetadataSchema.jsx";
+import AdminEmptyText from "metabase/components/AdminEmptyText";
+import MetadataHeader from "../components/database/MetadataHeader";
+import MetadataTablePicker from "../components/database/MetadataTablePicker";
+import MetadataTable from "../components/database/MetadataTable";
+import MetadataSchema from "../components/database/MetadataSchema";
 import {
   metrics as Metrics,
   segments as Segments,
diff --git a/frontend/src/metabase/admin/datamodel/containers/MetricApp.jsx b/frontend/src/metabase/admin/datamodel/containers/MetricApp.jsx
index 676f98d985d..ae887c13d7b 100644
--- a/frontend/src/metabase/admin/datamodel/containers/MetricApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/MetricApp.jsx
@@ -10,7 +10,7 @@ import Tables from "metabase/entities/tables";
 import { updatePreviewSummary } from "../datamodel";
 import { getPreviewSummary } from "../selectors";
 import withTableMetadataLoaded from "../withTableMetadataLoaded";
-import MetricForm from "./MetricForm.jsx";
+import MetricForm from "./MetricForm";
 
 const mapDispatchToProps = {
   updatePreviewSummary,
diff --git a/frontend/src/metabase/admin/datamodel/containers/MetricForm.jsx b/frontend/src/metabase/admin/datamodel/containers/MetricForm.jsx
index 0c146be8714..7705071da85 100644
--- a/frontend/src/metabase/admin/datamodel/containers/MetricForm.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/MetricForm.jsx
@@ -1,11 +1,11 @@
 import React, { Component } from "react";
 import { Link } from "react-router";
 
-import FormLabel from "../components/FormLabel.jsx";
-import FormInput from "../components/FormInput.jsx";
-import FormTextArea from "../components/FormTextArea.jsx";
-import FieldSet from "metabase/components/FieldSet.jsx";
-import PartialQueryBuilder from "../components/PartialQueryBuilder.jsx";
+import FormLabel from "../components/FormLabel";
+import FormInput from "../components/FormInput";
+import FormTextArea from "../components/FormTextArea";
+import FieldSet from "metabase/components/FieldSet";
+import PartialQueryBuilder from "../components/PartialQueryBuilder";
 import { t } from "ttag";
 import { formatValue } from "metabase/lib/formatting";
 
@@ -57,7 +57,7 @@ export default class MetricForm extends Component {
     this.props.updatePreviewSummary({
       ...datasetQuery,
       query: {
-        aggregation: ["count"],
+        aggregation: [["count"]],
         ...datasetQuery.query,
       },
     });
diff --git a/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx b/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx
index 9fbe93a3bef..313d76887bf 100644
--- a/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import { connect } from "react-redux";
 
-import RevisionHistory from "../components/revisions/RevisionHistory.jsx";
+import RevisionHistory from "../components/revisions/RevisionHistory";
 import Metrics from "metabase/entities/metrics";
 import Segments from "metabase/entities/segments";
 
diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
index ec0c94d8d25..07fc554995b 100644
--- a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
@@ -4,7 +4,7 @@ import { push } from "react-router-redux";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
 
-import SegmentForm from "./SegmentForm.jsx";
+import SegmentForm from "./SegmentForm";
 
 import { updatePreviewSummary } from "../datamodel";
 import { getPreviewSummary } from "../selectors";
diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentForm.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentForm.jsx
index 8c1dfe72e42..ea6b470d130 100644
--- a/frontend/src/metabase/admin/datamodel/containers/SegmentForm.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/SegmentForm.jsx
@@ -1,11 +1,11 @@
 import React, { Component } from "react";
 import { Link } from "react-router";
 
-import FormLabel from "../components/FormLabel.jsx";
-import FormInput from "../components/FormInput.jsx";
-import FormTextArea from "../components/FormTextArea.jsx";
-import FieldSet from "metabase/components/FieldSet.jsx";
-import PartialQueryBuilder from "../components/PartialQueryBuilder.jsx";
+import FormLabel from "../components/FormLabel";
+import FormInput from "../components/FormInput";
+import FormTextArea from "../components/FormTextArea";
+import FieldSet from "metabase/components/FieldSet";
+import PartialQueryBuilder from "../components/PartialQueryBuilder";
 import { t } from "ttag";
 import { formatValue } from "metabase/lib/formatting";
 
@@ -64,7 +64,7 @@ export default class SegmentForm extends Component {
       ...datasetQuery,
       query: {
         ...datasetQuery.query,
-        aggregation: ["count"],
+        aggregation: [["count"]],
       },
     });
   }
diff --git a/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx b/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx
index 24c6c3e6246..34a65c92438 100644
--- a/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/TableSettingsApp.jsx
@@ -4,7 +4,7 @@ import { connect } from "react-redux";
 import { t } from "ttag";
 import Breadcrumbs from "metabase/components/Breadcrumbs";
 import { BackButton } from "metabase/admin/datamodel/containers/FieldApp";
-import ActionButton from "metabase/components/ActionButton.jsx";
+import ActionButton from "metabase/components/ActionButton";
 import Section, { SectionHeader } from "../components/Section";
 
 import Databases from "metabase/entities/databases";
diff --git a/frontend/src/metabase/admin/people/components/GroupDetail.jsx b/frontend/src/metabase/admin/people/components/GroupDetail.jsx
index cb2f5d4b0b9..033b586a7ff 100644
--- a/frontend/src/metabase/admin/people/components/GroupDetail.jsx
+++ b/frontend/src/metabase/admin/people/components/GroupDetail.jsx
@@ -10,22 +10,22 @@ import {
   getGroupNameLocalized,
 } from "metabase/lib/groups";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import { PermissionsApi } from "metabase/services";
 import { t } from "ttag";
-import Icon from "metabase/components/Icon.jsx";
-import Popover from "metabase/components/Popover.jsx";
-import UserAvatar from "metabase/components/UserAvatar.jsx";
-import AdminEmptyText from "metabase/components/AdminEmptyText.jsx";
-import Alert from "metabase/components/Alert.jsx";
+import Icon from "metabase/components/Icon";
+import Popover from "metabase/components/Popover";
+import UserAvatar from "metabase/components/UserAvatar";
+import AdminEmptyText from "metabase/components/AdminEmptyText";
+import Alert from "metabase/components/Alert";
 
-import AdminContentTable from "metabase/components/AdminContentTable.jsx";
-import AdminPaneLayout from "metabase/components/AdminPaneLayout.jsx";
+import AdminContentTable from "metabase/components/AdminContentTable";
+import AdminPaneLayout from "metabase/components/AdminPaneLayout";
 
-import Typeahead from "metabase/hoc/Typeahead.jsx";
+import Typeahead from "metabase/hoc/Typeahead";
 
-import AddRow from "./AddRow.jsx";
+import AddRow from "./AddRow";
 
 const GroupDescription = ({ group }) =>
   isDefaultGroup(group) ? (
@@ -71,11 +71,11 @@ const AddMemberAutocompleteSuggestion = ({
 );
 
 const COLORS = [
-  colors["brand"],
-  colors["accent1"],
-  colors["accent2"],
-  colors["accent3"],
-  colors["accent4"],
+  color("brand"),
+  color("accent1"),
+  color("accent2"),
+  color("accent3"),
+  color("accent4"),
 ];
 
 const AddMemberTypeahead = Typeahead({
diff --git a/frontend/src/metabase/admin/people/components/GroupSelect.jsx b/frontend/src/metabase/admin/people/components/GroupSelect.jsx
index 34b3eb36f2b..5ab714823a3 100644
--- a/frontend/src/metabase/admin/people/components/GroupSelect.jsx
+++ b/frontend/src/metabase/admin/people/components/GroupSelect.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import CheckBox from "metabase/components/CheckBox.jsx";
+import CheckBox from "metabase/components/CheckBox";
 
 import {
   isDefaultGroup,
diff --git a/frontend/src/metabase/admin/people/components/GroupsListing.jsx b/frontend/src/metabase/admin/people/components/GroupsListing.jsx
index 980a1351200..a94a1a2e2ea 100644
--- a/frontend/src/metabase/admin/people/components/GroupsListing.jsx
+++ b/frontend/src/metabase/admin/people/components/GroupsListing.jsx
@@ -13,18 +13,18 @@ import {
 import { KEYCODE_ENTER } from "metabase/lib/keyboard";
 
 import { t } from "ttag";
-import Icon from "metabase/components/Icon.jsx";
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
-import ModalContent from "metabase/components/ModalContent.jsx";
-import Alert from "metabase/components/Alert.jsx";
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import UserAvatar from "metabase/components/UserAvatar.jsx";
-
-import AdminContentTable from "metabase/components/AdminContentTable.jsx";
-import AdminPaneLayout from "metabase/components/AdminPaneLayout.jsx";
-
-import AddRow from "./AddRow.jsx";
+import Icon from "metabase/components/Icon";
+import InputBlurChange from "metabase/components/InputBlurChange";
+import ModalContent from "metabase/components/ModalContent";
+import Alert from "metabase/components/Alert";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import UserAvatar from "metabase/components/UserAvatar";
+
+import AdminContentTable from "metabase/components/AdminContentTable";
+import AdminPaneLayout from "metabase/components/AdminPaneLayout";
+
+import AddRow from "./AddRow";
 
 // ------------------------------------------------------------ Add Group ------------------------------------------------------------
 
diff --git a/frontend/src/metabase/admin/people/components/UserGroupSelect.jsx b/frontend/src/metabase/admin/people/components/UserGroupSelect.jsx
index 67cc0dbbf28..537a1a229f5 100644
--- a/frontend/src/metabase/admin/people/components/UserGroupSelect.jsx
+++ b/frontend/src/metabase/admin/people/components/UserGroupSelect.jsx
@@ -3,13 +3,13 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
 
-import Icon from "metabase/components/Icon.jsx";
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import CheckBox from "metabase/components/CheckBox.jsx";
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
+import Icon from "metabase/components/Icon";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import CheckBox from "metabase/components/CheckBox";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
 
-import GroupSelect from "./GroupSelect.jsx";
-import GroupSummary from "./GroupSummary.jsx";
+import GroupSelect from "./GroupSelect";
+import GroupSummary from "./GroupSummary";
 
 const GroupOption = ({ name, color, selected, disabled, onChange }) => (
   <div
diff --git a/frontend/src/metabase/admin/people/containers/AdminPeopleApp.jsx b/frontend/src/metabase/admin/people/containers/AdminPeopleApp.jsx
index 463f62c8390..cd3b9efbb2a 100644
--- a/frontend/src/metabase/admin/people/containers/AdminPeopleApp.jsx
+++ b/frontend/src/metabase/admin/people/containers/AdminPeopleApp.jsx
@@ -3,12 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 
-import {
-  LeftNavPane,
-  LeftNavPaneItem,
-} from "metabase/components/LeftNavPane.jsx";
+import { LeftNavPane, LeftNavPaneItem } from "metabase/components/LeftNavPane";
 
-import AdminLayout from "metabase/components/AdminLayout.jsx";
+import AdminLayout from "metabase/components/AdminLayout";
 
 export default class AdminPeopleApp extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/admin/people/containers/GroupDetailApp.jsx b/frontend/src/metabase/admin/people/containers/GroupDetailApp.jsx
index d716d6a9f60..95c244b9787 100644
--- a/frontend/src/metabase/admin/people/containers/GroupDetailApp.jsx
+++ b/frontend/src/metabase/admin/people/containers/GroupDetailApp.jsx
@@ -6,7 +6,7 @@ import Group from "metabase/entities/groups";
 import { getUsersWithMemberships } from "../selectors";
 import { getUser } from "metabase/selectors/user";
 
-import GroupDetail from "../components/GroupDetail.jsx";
+import GroupDetail from "../components/GroupDetail";
 
 @User.loadList()
 @Group.load({ id: (state, props) => props.params.groupId })
diff --git a/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx b/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx
index 048d8588013..925c5e0abdc 100644
--- a/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx
+++ b/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx
@@ -2,7 +2,7 @@ import React from "react";
 import { connect } from "react-redux";
 
 import Group from "metabase/entities/groups";
-import GroupsListing from "../components/GroupsListing.jsx";
+import GroupsListing from "../components/GroupsListing";
 import { getGroupsWithoutMetabot } from "../selectors";
 
 @Group.loadList()
diff --git a/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx b/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx
index 95d91db640e..a77ac3272ba 100644
--- a/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx
+++ b/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx
@@ -7,19 +7,19 @@ import { t } from "ttag";
 import _ from "underscore";
 import moment from "moment";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import * as Urls from "metabase/lib/urls";
 
-import AdminPaneLayout from "metabase/components/AdminPaneLayout.jsx";
+import AdminPaneLayout from "metabase/components/AdminPaneLayout";
 import EntityMenu from "metabase/components/EntityMenu";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 import Link from "metabase/components/Link";
 import Radio from "metabase/components/Radio";
-import Tooltip from "metabase/components/Tooltip.jsx";
-import UserAvatar from "metabase/components/UserAvatar.jsx";
+import Tooltip from "metabase/components/Tooltip";
+import UserAvatar from "metabase/components/UserAvatar";
 
-import UserGroupSelect from "../components/UserGroupSelect.jsx";
+import UserGroupSelect from "../components/UserGroupSelect";
 
 import { loadMemberships, createMembership, deleteMembership } from "../people";
 import {
@@ -142,9 +142,7 @@ export default class PeopleListingApp extends Component {
                     <span className="text-white inline-block">
                       <UserAvatar
                         bg={
-                          user.is_superuser
-                            ? colors["accent2"]
-                            : colors["brand"]
+                          user.is_superuser ? color("accent2") : color("brand")
                         }
                         user={user}
                       />
diff --git a/frontend/src/metabase/admin/permissions/components/PermissionsEditor.jsx b/frontend/src/metabase/admin/permissions/components/PermissionsEditor.jsx
index ef72e327408..0efc85327fa 100644
--- a/frontend/src/metabase/admin/permissions/components/PermissionsEditor.jsx
+++ b/frontend/src/metabase/admin/permissions/components/PermissionsEditor.jsx
@@ -1,12 +1,12 @@
 import React from "react";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
-import Confirm from "metabase/components/Confirm.jsx";
-import PermissionsGrid from "../components/PermissionsGrid.jsx";
-import PermissionsConfirm from "../components/PermissionsConfirm.jsx";
-import PermissionsTabs from "../components/PermissionsTabs.jsx";
-import EditBar from "metabase/components/EditBar.jsx";
-import Breadcrumbs from "metabase/components/Breadcrumbs.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import Confirm from "metabase/components/Confirm";
+import PermissionsGrid from "../components/PermissionsGrid";
+import PermissionsConfirm from "../components/PermissionsConfirm";
+import PermissionsTabs from "../components/PermissionsTabs";
+import EditBar from "metabase/components/EditBar";
+import Breadcrumbs from "metabase/components/Breadcrumbs";
 import Button from "metabase/components/Button";
 import { t } from "ttag";
 import cx from "classnames";
diff --git a/frontend/src/metabase/admin/permissions/components/PermissionsGrid.jsx b/frontend/src/metabase/admin/permissions/components/PermissionsGrid.jsx
index d7c21cba8cf..ace4ff30d9a 100644
--- a/frontend/src/metabase/admin/permissions/components/PermissionsGrid.jsx
+++ b/frontend/src/metabase/admin/permissions/components/PermissionsGrid.jsx
@@ -5,23 +5,23 @@ import { connect } from "react-redux";
 
 import { Link } from "react-router";
 
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import ConfirmContent from "metabase/components/ConfirmContent.jsx";
-import Modal from "metabase/components/Modal.jsx";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import Tooltip from "metabase/components/Tooltip";
+import Icon from "metabase/components/Icon";
+import ConfirmContent from "metabase/components/ConfirmContent";
+import Modal from "metabase/components/Modal";
 
-import FixedHeaderGrid from "./FixedHeaderGrid.jsx";
+import FixedHeaderGrid from "./FixedHeaderGrid";
 import { AutoSizer } from "react-virtualized";
 
 import { isAdminGroup, getGroupNameLocalized } from "metabase/lib/groups";
 import cx from "classnames";
 import _ from "underscore";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
-const LIGHT_BORDER = colors["text-light"];
-const DARK_BORDER = colors["text-medium"];
+const LIGHT_BORDER = color("text-light");
+const DARK_BORDER = color("text-medium");
 const BORDER_RADIUS = 4;
 
 const getBorderStyles = ({
@@ -48,8 +48,8 @@ const HEADER_WIDTH = 240;
 
 const DEFAULT_OPTION = {
   icon: "unknown",
-  iconColor: colors["text-medium"],
-  bgColor: colors["bg-medium"],
+  iconColor: color("text-medium"),
+  bgColor: color("bg-medium"),
 };
 
 const PermissionsHeader = ({ permissions, isFirst, isLast }) => (
@@ -274,7 +274,7 @@ class GroupPermissionCell extends Component {
                 size={28}
                 style={{
                   color: this.state.hovered
-                    ? colors["text-white"]
+                    ? color("text-white")
                     : option.iconColor,
                 }}
               />
diff --git a/frontend/src/metabase/admin/permissions/containers/CollectionPermissionsModal.jsx b/frontend/src/metabase/admin/permissions/containers/CollectionPermissionsModal.jsx
index bba51b9de7d..a1d25ef06de 100644
--- a/frontend/src/metabase/admin/permissions/containers/CollectionPermissionsModal.jsx
+++ b/frontend/src/metabase/admin/permissions/containers/CollectionPermissionsModal.jsx
@@ -5,7 +5,7 @@ import { t } from "ttag";
 import ModalContent from "metabase/components/ModalContent";
 import Button from "metabase/components/Button";
 import Link from "metabase/components/Link";
-import PermissionsGrid from "../components/PermissionsGrid.jsx";
+import PermissionsGrid from "../components/PermissionsGrid";
 import fitViewport from "metabase/hoc/FitViewPort";
 
 import { CollectionsApi } from "metabase/services";
diff --git a/frontend/src/metabase/admin/permissions/containers/CollectionsPermissionsApp.jsx b/frontend/src/metabase/admin/permissions/containers/CollectionsPermissionsApp.jsx
index cd5c6735a81..12ece333133 100644
--- a/frontend/src/metabase/admin/permissions/containers/CollectionsPermissionsApp.jsx
+++ b/frontend/src/metabase/admin/permissions/containers/CollectionsPermissionsApp.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 import { connect } from "react-redux";
 
-import PermissionsEditor from "../components/PermissionsEditor.jsx";
-import PermissionsApp from "./PermissionsApp.jsx";
+import PermissionsEditor from "../components/PermissionsEditor";
+import PermissionsApp from "./PermissionsApp";
 import fitViewport from "metabase/hoc/FitViewPort";
 
 import { CollectionsApi } from "metabase/services";
diff --git a/frontend/src/metabase/admin/permissions/containers/DataPermissionsApp.jsx b/frontend/src/metabase/admin/permissions/containers/DataPermissionsApp.jsx
index 1ef7ec0d75b..e00095eb2c6 100644
--- a/frontend/src/metabase/admin/permissions/containers/DataPermissionsApp.jsx
+++ b/frontend/src/metabase/admin/permissions/containers/DataPermissionsApp.jsx
@@ -3,7 +3,7 @@ import { connect } from "react-redux";
 
 import fitViewport from "metabase/hoc/FitViewPort";
 
-import PermissionsApp from "./PermissionsApp.jsx";
+import PermissionsApp from "./PermissionsApp";
 
 import { PermissionsApi } from "metabase/services";
 import { fetchRealDatabases } from "metabase/redux/metadata";
diff --git a/frontend/src/metabase/admin/permissions/containers/DatabasesPermissionsApp.jsx b/frontend/src/metabase/admin/permissions/containers/DatabasesPermissionsApp.jsx
index d3dce2903c9..c5a1849fee1 100644
--- a/frontend/src/metabase/admin/permissions/containers/DatabasesPermissionsApp.jsx
+++ b/frontend/src/metabase/admin/permissions/containers/DatabasesPermissionsApp.jsx
@@ -1,7 +1,7 @@
 import { connect } from "react-redux";
 import { push } from "react-router-redux";
 
-import PermissionsEditor from "../components/PermissionsEditor.jsx";
+import PermissionsEditor from "../components/PermissionsEditor";
 
 import {
   getDatabasesPermissionsGrid,
diff --git a/frontend/src/metabase/admin/permissions/containers/PermissionsApp.jsx b/frontend/src/metabase/admin/permissions/containers/PermissionsApp.jsx
index c2bac3e9588..acbc88dceba 100644
--- a/frontend/src/metabase/admin/permissions/containers/PermissionsApp.jsx
+++ b/frontend/src/metabase/admin/permissions/containers/PermissionsApp.jsx
@@ -7,8 +7,8 @@ import { push } from "react-router-redux";
 import { initialize } from "../permissions";
 import { getIsDirty } from "../selectors";
 import { t } from "ttag";
-import ConfirmContent from "metabase/components/ConfirmContent.jsx";
-import Modal from "metabase/components/Modal.jsx";
+import ConfirmContent from "metabase/components/ConfirmContent";
+import Modal from "metabase/components/Modal";
 
 const mapStateToProps = (state, props) => ({
   isDirty: getIsDirty(state, props),
diff --git a/frontend/src/metabase/admin/permissions/containers/SchemasPermissionsApp.jsx b/frontend/src/metabase/admin/permissions/containers/SchemasPermissionsApp.jsx
index 717755aacfc..fd699545d0e 100644
--- a/frontend/src/metabase/admin/permissions/containers/SchemasPermissionsApp.jsx
+++ b/frontend/src/metabase/admin/permissions/containers/SchemasPermissionsApp.jsx
@@ -1,7 +1,7 @@
 import { connect } from "react-redux";
 import { push } from "react-router-redux";
 
-import PermissionsEditor from "../components/PermissionsEditor.jsx";
+import PermissionsEditor from "../components/PermissionsEditor";
 
 import {
   getSchemasPermissionsGrid,
diff --git a/frontend/src/metabase/admin/permissions/containers/TablesPermissionsApp.jsx b/frontend/src/metabase/admin/permissions/containers/TablesPermissionsApp.jsx
index 097f54a53c0..f415a377771 100644
--- a/frontend/src/metabase/admin/permissions/containers/TablesPermissionsApp.jsx
+++ b/frontend/src/metabase/admin/permissions/containers/TablesPermissionsApp.jsx
@@ -1,7 +1,7 @@
 import { connect } from "react-redux";
 import { push } from "react-router-redux";
 
-import PermissionsEditor from "../components/PermissionsEditor.jsx";
+import PermissionsEditor from "../components/PermissionsEditor";
 
 import {
   getTablesPermissionsGrid,
diff --git a/frontend/src/metabase/admin/permissions/routes.jsx b/frontend/src/metabase/admin/permissions/routes.jsx
index 4a2ed7055d3..3a1c7b5155c 100644
--- a/frontend/src/metabase/admin/permissions/routes.jsx
+++ b/frontend/src/metabase/admin/permissions/routes.jsx
@@ -2,11 +2,11 @@ import React from "react";
 import { Route } from "metabase/hoc/Title";
 import { IndexRedirect, IndexRoute } from "react-router";
 import { t } from "ttag";
-import DataPermissionsApp from "./containers/DataPermissionsApp.jsx";
-import DatabasesPermissionsApp from "./containers/DatabasesPermissionsApp.jsx";
-import SchemasPermissionsApp from "./containers/SchemasPermissionsApp.jsx";
-import TablesPermissionsApp from "./containers/TablesPermissionsApp.jsx";
-import CollectionPermissions from "./containers/CollectionsPermissionsApp.jsx";
+import DataPermissionsApp from "./containers/DataPermissionsApp";
+import DatabasesPermissionsApp from "./containers/DatabasesPermissionsApp";
+import SchemasPermissionsApp from "./containers/SchemasPermissionsApp";
+import TablesPermissionsApp from "./containers/TablesPermissionsApp";
+import CollectionPermissions from "./containers/CollectionsPermissionsApp";
 
 const getRoutes = store => (
   <Route title={t`Permissions`} path="permissions">
diff --git a/frontend/src/metabase/admin/permissions/selectors.js b/frontend/src/metabase/admin/permissions/selectors.js
index ebcdb90a59e..e9e98e14c65 100644
--- a/frontend/src/metabase/admin/permissions/selectors.js
+++ b/frontend/src/metabase/admin/permissions/selectors.js
@@ -7,7 +7,7 @@ import { push } from "react-router-redux";
 import TogglePropagateAction from "./containers/TogglePropagateAction";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
-import colors, { alpha } from "metabase/lib/colors";
+import { color, alpha } from "metabase/lib/colors";
 
 import { t } from "ttag";
 
@@ -234,18 +234,18 @@ const BG_ALPHA = 0.15;
 
 const OPTION_GREEN = {
   icon: "check",
-  iconColor: colors["success"],
-  bgColor: alpha(colors["success"], BG_ALPHA),
+  iconColor: color("success"),
+  bgColor: alpha(color("success"), BG_ALPHA),
 };
 const OPTION_YELLOW = {
   icon: "eye",
-  iconColor: colors["warning"],
-  bgColor: alpha(colors["warning"], BG_ALPHA),
+  iconColor: color("warning"),
+  bgColor: alpha(color("warning"), BG_ALPHA),
 };
 const OPTION_RED = {
   icon: "close",
-  iconColor: colors["error"],
-  bgColor: alpha(colors["error"], BG_ALPHA),
+  iconColor: color("error"),
+  bgColor: alpha(color("error"), BG_ALPHA),
 };
 
 const OPTION_ALL = {
diff --git a/frontend/src/metabase/admin/routes.jsx b/frontend/src/metabase/admin/routes.jsx
index 0dccf05efb7..fe3ed2444ed 100644
--- a/frontend/src/metabase/admin/routes.jsx
+++ b/frontend/src/metabase/admin/routes.jsx
@@ -13,20 +13,20 @@ import EditUserModal from "metabase/admin/people/containers/EditUserModal";
 import UserActivationModal from "metabase/admin/people/containers/UserActivationModal";
 
 // Settings
-import SettingsEditorApp from "metabase/admin/settings/containers/SettingsEditorApp.jsx";
+import SettingsEditorApp from "metabase/admin/settings/containers/SettingsEditorApp";
 
 //  DB Add / list
-import DatabaseListApp from "metabase/admin/databases/containers/DatabaseListApp.jsx";
-import DatabaseEditApp from "metabase/admin/databases/containers/DatabaseEditApp.jsx";
+import DatabaseListApp from "metabase/admin/databases/containers/DatabaseListApp";
+import DatabaseEditApp from "metabase/admin/databases/containers/DatabaseEditApp";
 
 // Metadata / Data model
-import MetadataEditorApp from "metabase/admin/datamodel/containers/MetadataEditorApp.jsx";
-import MetricApp from "metabase/admin/datamodel/containers/MetricApp.jsx";
-import SegmentApp from "metabase/admin/datamodel/containers/SegmentApp.jsx";
-import RevisionHistoryApp from "metabase/admin/datamodel/containers/RevisionHistoryApp.jsx";
-import AdminPeopleApp from "metabase/admin/people/containers/AdminPeopleApp.jsx";
-import FieldApp from "metabase/admin/datamodel/containers/FieldApp.jsx";
-import TableSettingsApp from "metabase/admin/datamodel/containers/TableSettingsApp.jsx";
+import MetadataEditorApp from "metabase/admin/datamodel/containers/MetadataEditorApp";
+import MetricApp from "metabase/admin/datamodel/containers/MetricApp";
+import SegmentApp from "metabase/admin/datamodel/containers/SegmentApp";
+import RevisionHistoryApp from "metabase/admin/datamodel/containers/RevisionHistoryApp";
+import AdminPeopleApp from "metabase/admin/people/containers/AdminPeopleApp";
+import FieldApp from "metabase/admin/datamodel/containers/FieldApp";
+import TableSettingsApp from "metabase/admin/datamodel/containers/TableSettingsApp";
 
 import TroubleshootingApp from "metabase/admin/tasks/containers/TroubleshootingApp";
 import TasksApp from "metabase/admin/tasks/containers/TasksApp";
@@ -36,11 +36,11 @@ import JobTriggersModal from "metabase/admin/tasks/containers/JobTriggersModal";
 import Logs from "metabase/admin/tasks/containers/Logs";
 
 // People
-import PeopleListingApp from "metabase/admin/people/containers/PeopleListingApp.jsx";
-import GroupsListingApp from "metabase/admin/people/containers/GroupsListingApp.jsx";
-import GroupDetailApp from "metabase/admin/people/containers/GroupDetailApp.jsx";
+import PeopleListingApp from "metabase/admin/people/containers/PeopleListingApp";
+import GroupsListingApp from "metabase/admin/people/containers/GroupsListingApp";
+import GroupDetailApp from "metabase/admin/people/containers/GroupDetailApp";
 
-import getAdminPermissionsRoutes from "metabase/admin/permissions/routes.jsx";
+import getAdminPermissionsRoutes from "metabase/admin/permissions/routes";
 
 const getRoutes = (store, IsAdmin) => (
   <Route
diff --git a/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx b/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx
index f3c1502dc57..e946b00ce43 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsSetting.jsx
@@ -2,14 +2,14 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { assocIn } from "icepick";
 
-import SettingHeader from "./SettingHeader.jsx";
+import SettingHeader from "./SettingHeader";
 import { t } from "ttag";
-import SettingInput from "./widgets/SettingInput.jsx";
-import SettingNumber from "./widgets/SettingNumber.jsx";
-import SettingPassword from "./widgets/SettingPassword.jsx";
-import SettingRadio from "./widgets/SettingRadio.jsx";
-import SettingToggle from "./widgets/SettingToggle.jsx";
-import SettingSelect from "./widgets/SettingSelect.jsx";
+import SettingInput from "./widgets/SettingInput";
+import SettingNumber from "./widgets/SettingNumber";
+import SettingPassword from "./widgets/SettingPassword";
+import SettingRadio from "./widgets/SettingRadio";
+import SettingToggle from "./widgets/SettingToggle";
+import SettingSelect from "./widgets/SettingSelect";
 
 const SETTING_WIDGET_MAP = {
   string: SettingInput,
diff --git a/frontend/src/metabase/admin/settings/components/SettingsSetupList.jsx b/frontend/src/metabase/admin/settings/components/SettingsSetupList.jsx
index 62c62e7b6d8..27221bf3438 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsSetupList.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsSetupList.jsx
@@ -1,10 +1,10 @@
 import React, { Component } from "react";
 import { Link } from "react-router";
-import Icon from "metabase/components/Icon.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import Icon from "metabase/components/Icon";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import { SetupApi } from "metabase/services";
 import { t } from "ttag";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const TaskList = ({ tasks }) => (
   <ol>
@@ -41,14 +41,14 @@ const CompletionBadge = ({ completed }) => (
     style={{
       borderWidth: 1,
       borderStyle: "solid",
-      borderColor: completed ? colors["success"] : colors["text-light"],
-      backgroundColor: completed ? colors["success"] : colors["text-white"],
+      borderColor: completed ? color("success") : color("text-light"),
+      backgroundColor: completed ? color("success") : color("text-white"),
       width: 32,
       height: 32,
       borderRadius: 99,
     }}
   >
-    {completed && <Icon name="check" color={colors["text-white"]} />}
+    {completed && <Icon name="check" color={color("text-white")} />}
   </div>
 );
 
diff --git a/frontend/src/metabase/admin/settings/components/SettingsSingleSignOnForm.jsx b/frontend/src/metabase/admin/settings/components/SettingsSingleSignOnForm.jsx
index 07351faa5b5..e55c2892869 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsSingleSignOnForm.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsSingleSignOnForm.jsx
@@ -4,8 +4,8 @@ import cx from "classnames";
 import _ from "underscore";
 import { t, jt } from "ttag";
 
-import Breadcrumbs from "metabase/components/Breadcrumbs.jsx";
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
+import Breadcrumbs from "metabase/components/Breadcrumbs";
+import InputBlurChange from "metabase/components/InputBlurChange";
 
 export default class SettingsSingleSignOnForm extends Component {
   constructor(props, context) {
diff --git a/frontend/src/metabase/admin/settings/components/SettingsSlackForm.jsx b/frontend/src/metabase/admin/settings/components/SettingsSlackForm.jsx
index c2400c1e5b4..a882df7a6b6 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsSlackForm.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsSlackForm.jsx
@@ -2,10 +2,10 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseUtils from "metabase/lib/utils";
-import SettingsSetting from "./SettingsSetting.jsx";
+import SettingsSetting from "./SettingsSetting";
 
 import Button from "metabase/components/Button";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 import RetinaImage from "react-retina-image";
 
diff --git a/frontend/src/metabase/admin/settings/components/SettingsUpdatesForm.jsx b/frontend/src/metabase/admin/settings/components/SettingsUpdatesForm.jsx
index fd83d921637..643bfd42b30 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsUpdatesForm.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsUpdatesForm.jsx
@@ -3,7 +3,7 @@ import PropTypes from "prop-types";
 import { t, jt } from "ttag";
 import MetabaseSettings from "metabase/lib/settings";
 import MetabaseUtils from "metabase/lib/utils";
-import SettingsSetting from "./SettingsSetting.jsx";
+import SettingsSetting from "./SettingsSetting";
 
 import _ from "underscore";
 
diff --git a/frontend/src/metabase/admin/settings/components/widgets/CustomGeoJSONWidget.jsx b/frontend/src/metabase/admin/settings/components/widgets/CustomGeoJSONWidget.jsx
index 0403621cd41..e52cc4b8adb 100644
--- a/frontend/src/metabase/admin/settings/components/widgets/CustomGeoJSONWidget.jsx
+++ b/frontend/src/metabase/admin/settings/components/widgets/CustomGeoJSONWidget.jsx
@@ -3,19 +3,19 @@ import PropTypes from "prop-types";
 import { t } from "ttag";
 
 import Utils from "metabase/lib/utils";
-import Select, { Option } from "metabase/components/Select.jsx";
-import Confirm from "metabase/components/Confirm.jsx";
-import Ellipsified from "metabase/components/Ellipsified.jsx";
-import Modal from "metabase/components/Modal.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import Select, { Option } from "metabase/components/Select";
+import Confirm from "metabase/components/Confirm";
+import Ellipsified from "metabase/components/Ellipsified";
+import Modal from "metabase/components/Modal";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import SettingHeader from "../SettingHeader.jsx";
+import SettingHeader from "../SettingHeader";
 
 import { SettingsApi, GeoJSONApi } from "metabase/services";
 
 import cx from "classnames";
 
-import LeafletChoropleth from "metabase/visualizations/components/LeafletChoropleth.jsx";
+import LeafletChoropleth from "metabase/visualizations/components/LeafletChoropleth";
 
 import pure from "recompose/pure";
 
diff --git a/frontend/src/metabase/admin/settings/components/widgets/SettingInput.jsx b/frontend/src/metabase/admin/settings/components/widgets/SettingInput.jsx
index bde7ab9dcf2..4febc8303b9 100644
--- a/frontend/src/metabase/admin/settings/components/widgets/SettingInput.jsx
+++ b/frontend/src/metabase/admin/settings/components/widgets/SettingInput.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
+import InputBlurChange from "metabase/components/InputBlurChange";
 import cx from "classnames";
 
 const SettingInput = ({
diff --git a/frontend/src/metabase/admin/settings/components/widgets/SettingPassword.jsx b/frontend/src/metabase/admin/settings/components/widgets/SettingPassword.jsx
index 3ab5ac103a0..0277751ac06 100644
--- a/frontend/src/metabase/admin/settings/components/widgets/SettingPassword.jsx
+++ b/frontend/src/metabase/admin/settings/components/widgets/SettingPassword.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import SettingInput from "./SettingInput.jsx";
+import SettingInput from "./SettingInput";
 
 const SettingPassword = props => <SettingInput {...props} type="password" />;
 
diff --git a/frontend/src/metabase/admin/settings/components/widgets/SettingSelect.jsx b/frontend/src/metabase/admin/settings/components/widgets/SettingSelect.jsx
index 72c493af863..f21abaa2a14 100644
--- a/frontend/src/metabase/admin/settings/components/widgets/SettingSelect.jsx
+++ b/frontend/src/metabase/admin/settings/components/widgets/SettingSelect.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Select, { Option } from "metabase/components/Select.jsx";
+import Select, { Option } from "metabase/components/Select";
 
 const SettingSelect = ({
   setting: { placeholder, value, options, defaultValue },
diff --git a/frontend/src/metabase/admin/settings/components/widgets/SettingToggle.jsx b/frontend/src/metabase/admin/settings/components/widgets/SettingToggle.jsx
index 63aa0146c1d..5477d9481ec 100644
--- a/frontend/src/metabase/admin/settings/components/widgets/SettingToggle.jsx
+++ b/frontend/src/metabase/admin/settings/components/widgets/SettingToggle.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 import { t } from "ttag";
-import Toggle from "metabase/components/Toggle.jsx";
+import Toggle from "metabase/components/Toggle";
 
 const SettingToggle = ({ setting, onChange, disabled }) => {
   const value = setting.value == null ? setting.default : setting.value;
diff --git a/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx b/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx
index ffb5f70bd05..5c8773d30ac 100644
--- a/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx
+++ b/frontend/src/metabase/admin/settings/containers/SettingsEditorApp.jsx
@@ -6,17 +6,17 @@ import title from "metabase/hoc/Title";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import { slugify } from "metabase/lib/formatting";
 import { t } from "ttag";
-import AdminLayout from "metabase/components/AdminLayout.jsx";
+import AdminLayout from "metabase/components/AdminLayout";
 import { NotFound } from "metabase/containers/ErrorPages";
 
-import SettingsSetting from "../components/SettingsSetting.jsx";
-import SettingsEmailForm from "../components/SettingsEmailForm.jsx";
-import SettingsSlackForm from "../components/SettingsSlackForm.jsx";
-import SettingsLdapForm from "../components/SettingsLdapForm.jsx";
-import SettingsSetupList from "../components/SettingsSetupList.jsx";
-import SettingsUpdatesForm from "../components/SettingsUpdatesForm.jsx";
-import SettingsSingleSignOnForm from "../components/SettingsSingleSignOnForm.jsx";
-import SettingsAuthenticationOptions from "../components/SettingsAuthenticationOptions.jsx";
+import SettingsSetting from "../components/SettingsSetting";
+import SettingsEmailForm from "../components/SettingsEmailForm";
+import SettingsSlackForm from "../components/SettingsSlackForm";
+import SettingsLdapForm from "../components/SettingsLdapForm";
+import SettingsSetupList from "../components/SettingsSetupList";
+import SettingsUpdatesForm from "../components/SettingsUpdatesForm";
+import SettingsSingleSignOnForm from "../components/SettingsSingleSignOnForm";
+import SettingsAuthenticationOptions from "../components/SettingsAuthenticationOptions";
 
 import { prepareAnalyticsValue } from "metabase/admin/settings/utils";
 
diff --git a/frontend/src/metabase/admin/settings/selectors.js b/frontend/src/metabase/admin/settings/selectors.js
index 18f5be6d471..212665231ef 100644
--- a/frontend/src/metabase/admin/settings/selectors.js
+++ b/frontend/src/metabase/admin/settings/selectors.js
@@ -2,14 +2,14 @@ import _ from "underscore";
 import { createSelector } from "reselect";
 import MetabaseSettings from "metabase/lib/settings";
 import { t } from "ttag";
-import CustomGeoJSONWidget from "./components/widgets/CustomGeoJSONWidget.jsx";
+import CustomGeoJSONWidget from "./components/widgets/CustomGeoJSONWidget";
 import {
   PublicLinksDashboardListing,
   PublicLinksQuestionListing,
   EmbeddedQuestionListing,
   EmbeddedDashboardListing,
-} from "./components/widgets/PublicLinksListing.jsx";
-import SecretKeyWidget from "./components/widgets/SecretKeyWidget.jsx";
+} from "./components/widgets/PublicLinksListing";
+import SecretKeyWidget from "./components/widgets/SecretKeyWidget";
 import EmbeddingLegalese from "./components/widgets/EmbeddingLegalese";
 import EmbeddingLevel from "./components/widgets/EmbeddingLevel";
 import LdapGroupMappingsWidget from "./components/widgets/LdapGroupMappingsWidget";
diff --git a/frontend/src/metabase/admin/tasks/containers/JobInfoApp.jsx b/frontend/src/metabase/admin/tasks/containers/JobInfoApp.jsx
index 98008f694b5..5de7de8ade9 100644
--- a/frontend/src/metabase/admin/tasks/containers/JobInfoApp.jsx
+++ b/frontend/src/metabase/admin/tasks/containers/JobInfoApp.jsx
@@ -4,7 +4,7 @@ import { connect } from "react-redux";
 
 import { Box, Flex } from "grid-styled";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import AdminHeader from "metabase/components/AdminHeader";
 import Link from "metabase/components/Link";
 
diff --git a/frontend/src/metabase/admin/tasks/containers/JobTriggersModal.jsx b/frontend/src/metabase/admin/tasks/containers/JobTriggersModal.jsx
index a4ce50da611..0f4b39e62cd 100644
--- a/frontend/src/metabase/admin/tasks/containers/JobTriggersModal.jsx
+++ b/frontend/src/metabase/admin/tasks/containers/JobTriggersModal.jsx
@@ -4,7 +4,7 @@ import { connect } from "react-redux";
 import { goBack } from "react-router-redux";
 import _ from "underscore";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import ModalContent from "metabase/components/ModalContent";
 
 import { fetchJobInfo } from "../jobInfo";
diff --git a/frontend/src/metabase/admin/tasks/containers/Logs.jsx b/frontend/src/metabase/admin/tasks/containers/Logs.jsx
index 247779c9ad3..8552015cd42 100644
--- a/frontend/src/metabase/admin/tasks/containers/Logs.jsx
+++ b/frontend/src/metabase/admin/tasks/containers/Logs.jsx
@@ -14,17 +14,17 @@ import { t } from "ttag";
 
 import Select, { Option } from "metabase/components/Select";
 import { addCSSRule } from "metabase/lib/dom";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const ANSI_COLORS = {
-  black: colors["text-black"],
-  white: colors["text-white"],
-  gray: colors["text-medium"],
-  red: colors["saturated-red"],
-  green: colors["saturated-green"],
-  yellow: colors["saturated-yellow"],
-  blue: colors["saturated-blue"],
-  magenta: colors["saturated-purple"],
+  black: color("text-dark"),
+  white: color("text-white"),
+  gray: color("text-medium"),
+  red: color("saturated-red"),
+  green: color("saturated-green"),
+  yellow: color("saturated-yellow"),
+  blue: color("saturated-blue"),
+  magenta: color("saturated-purple"),
   cyan: "cyan",
 };
 for (const [name, color] of Object.entries(ANSI_COLORS)) {
diff --git a/frontend/src/metabase/admin/tasks/containers/TroubleshootingApp.jsx b/frontend/src/metabase/admin/tasks/containers/TroubleshootingApp.jsx
index 7f24a6cc286..67a16d84e4f 100644
--- a/frontend/src/metabase/admin/tasks/containers/TroubleshootingApp.jsx
+++ b/frontend/src/metabase/admin/tasks/containers/TroubleshootingApp.jsx
@@ -3,12 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 
-import {
-  LeftNavPane,
-  LeftNavPaneItem,
-} from "metabase/components/LeftNavPane.jsx";
+import { LeftNavPane, LeftNavPaneItem } from "metabase/components/LeftNavPane";
 
-import AdminLayout from "metabase/components/AdminLayout.jsx";
+import AdminLayout from "metabase/components/AdminLayout";
 
 export default class TroubleshootingApp extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/alert/alert.js b/frontend/src/metabase/alert/alert.js
index 6682808f6a2..2fc3b7f2ca2 100644
--- a/frontend/src/metabase/alert/alert.js
+++ b/frontend/src/metabase/alert/alert.js
@@ -6,7 +6,7 @@ import { addUndo } from "metabase/redux/undo";
 import { t } from "ttag";
 import { AlertApi } from "metabase/services";
 import { RestfulRequest } from "metabase/lib/request";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 export const FETCH_ALL_ALERTS = "metabase/alerts/FETCH_ALL_ALERTS";
 const fetchAllAlertsRequest = new RestfulRequest({
diff --git a/frontend/src/metabase/app-embed.js b/frontend/src/metabase/app-embed.js
index c73ea000448..b686ad0516e 100644
--- a/frontend/src/metabase/app-embed.js
+++ b/frontend/src/metabase/app-embed.js
@@ -5,7 +5,7 @@
 
 import { init } from "./app";
 
-import { getRoutes } from "./routes-embed.jsx";
+import { getRoutes } from "./routes-embed";
 import reducers from "./reducers-public";
 
 import { IFRAMED } from "metabase/lib/dom";
diff --git a/frontend/src/metabase/app-main.js b/frontend/src/metabase/app-main.js
index 5dba41cdfe6..1b823d790e9 100644
--- a/frontend/src/metabase/app-main.js
+++ b/frontend/src/metabase/app-main.js
@@ -1,7 +1,7 @@
 import { push } from "react-router-redux";
 
 import { init } from "metabase/app";
-import { getRoutes } from "metabase/routes.jsx";
+import { getRoutes } from "metabase/routes";
 import reducers from "metabase/reducers-main";
 
 import api from "metabase/lib/api";
diff --git a/frontend/src/metabase/app-public.js b/frontend/src/metabase/app-public.js
index 3c2e6afa78f..15fa8f22d76 100644
--- a/frontend/src/metabase/app-public.js
+++ b/frontend/src/metabase/app-public.js
@@ -1,6 +1,6 @@
 import { init } from "./app";
 
-import { getRoutes } from "./routes-public.jsx";
+import { getRoutes } from "./routes-public";
 import reducers from "./reducers-public";
 
 init(reducers, getRoutes, () => {});
diff --git a/frontend/src/metabase/auth/components/GoogleNoAccount.jsx b/frontend/src/metabase/auth/components/GoogleNoAccount.jsx
index 60dafba4bc5..1e67b780a4a 100644
--- a/frontend/src/metabase/auth/components/GoogleNoAccount.jsx
+++ b/frontend/src/metabase/auth/components/GoogleNoAccount.jsx
@@ -1,8 +1,8 @@
 import React from "react";
 import { t } from "ttag";
-import AuthScene from "./AuthScene.jsx";
-import LogoIcon from "metabase/components/LogoIcon.jsx";
-import BackToLogin from "./BackToLogin.jsx";
+import AuthScene from "./AuthScene";
+import LogoIcon from "metabase/components/LogoIcon";
+import BackToLogin from "./BackToLogin";
 
 const GoogleNoAccount = () => (
   <div className="full-height bg-white flex flex-column flex-full md-layout-centered">
diff --git a/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx b/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx
index eaa5a42137f..8c50f9f1d05 100644
--- a/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx
+++ b/frontend/src/metabase/auth/containers/ForgotPasswordApp.jsx
@@ -3,13 +3,13 @@ import React, { Component } from "react";
 import _ from "underscore";
 import cx from "classnames";
 import { t } from "ttag";
-import AuthScene from "../components/AuthScene.jsx";
-import BackToLogin from "../components/BackToLogin.jsx";
-import FormField from "metabase/components/form/FormField.jsx";
-import FormLabel from "metabase/components/form/FormLabel.jsx";
-import FormMessage from "metabase/components/form/FormMessage.jsx";
-import LogoIcon from "metabase/components/LogoIcon.jsx";
-import Icon from "metabase/components/Icon.jsx";
+import AuthScene from "../components/AuthScene";
+import BackToLogin from "../components/BackToLogin";
+import FormField from "metabase/components/form/FormField";
+import FormLabel from "metabase/components/form/FormLabel";
+import FormMessage from "metabase/components/form/FormMessage";
+import LogoIcon from "metabase/components/LogoIcon";
+import Icon from "metabase/components/Icon";
 
 import MetabaseSettings from "metabase/lib/settings";
 
diff --git a/frontend/src/metabase/auth/containers/LoginApp.jsx b/frontend/src/metabase/auth/containers/LoginApp.jsx
index 6138ca943b1..4de4677a4c7 100644
--- a/frontend/src/metabase/auth/containers/LoginApp.jsx
+++ b/frontend/src/metabase/auth/containers/LoginApp.jsx
@@ -4,14 +4,14 @@ import { Link } from "react-router";
 import { connect } from "react-redux";
 
 import { t } from "ttag";
-import AuthScene from "../components/AuthScene.jsx";
-import SSOLoginButton from "../components/SSOLoginButton.jsx";
+import AuthScene from "../components/AuthScene";
+import SSOLoginButton from "../components/SSOLoginButton";
 import Button from "metabase/components/Button";
 import CheckBox from "metabase/components/CheckBox";
-import FormField from "metabase/components/form/FormField.jsx";
-import FormLabel from "metabase/components/form/FormLabel.jsx";
-import FormMessage from "metabase/components/form/FormMessage.jsx";
-import LogoIcon from "metabase/components/LogoIcon.jsx";
+import FormField from "metabase/components/form/FormField";
+import FormLabel from "metabase/components/form/FormLabel";
+import FormMessage from "metabase/components/form/FormMessage";
+import LogoIcon from "metabase/components/LogoIcon";
 import Settings from "metabase/lib/settings";
 import Utils from "metabase/lib/utils";
 
diff --git a/frontend/src/metabase/auth/containers/PasswordResetApp.jsx b/frontend/src/metabase/auth/containers/PasswordResetApp.jsx
index fafebfc66ce..ef0d0a080df 100644
--- a/frontend/src/metabase/auth/containers/PasswordResetApp.jsx
+++ b/frontend/src/metabase/auth/containers/PasswordResetApp.jsx
@@ -4,12 +4,12 @@ import { Link } from "react-router";
 
 import cx from "classnames";
 import { t, jt } from "ttag";
-import AuthScene from "../components/AuthScene.jsx";
-import FormField from "metabase/components/form/FormField.jsx";
-import FormLabel from "metabase/components/form/FormLabel.jsx";
-import FormMessage from "metabase/components/form/FormMessage.jsx";
-import LogoIcon from "metabase/components/LogoIcon.jsx";
-import Icon from "metabase/components/Icon.jsx";
+import AuthScene from "../components/AuthScene";
+import FormField from "metabase/components/form/FormField";
+import FormLabel from "metabase/components/form/FormLabel";
+import FormMessage from "metabase/components/form/FormMessage";
+import LogoIcon from "metabase/components/LogoIcon";
+import Icon from "metabase/components/Icon";
 
 import MetabaseSettings from "metabase/lib/settings";
 
diff --git a/frontend/src/metabase/components/AccordionList.jsx b/frontend/src/metabase/components/AccordionList.jsx
index 0c2c32e270f..8ae5d80aae9 100644
--- a/frontend/src/metabase/components/AccordionList.jsx
+++ b/frontend/src/metabase/components/AccordionList.jsx
@@ -5,8 +5,8 @@ import cx from "classnames";
 import _ from "underscore";
 import { color } from "metabase/lib/colors";
 
-import Icon from "metabase/components/Icon.jsx";
-import ListSearchField from "metabase/components/ListSearchField.jsx";
+import Icon from "metabase/components/Icon";
+import ListSearchField from "metabase/components/ListSearchField";
 import { List, CellMeasurer, CellMeasurerCache } from "react-virtualized";
 
 export type RenderItemWrapper = (
diff --git a/frontend/src/metabase/components/AdminAwareEmptyState.jsx b/frontend/src/metabase/components/AdminAwareEmptyState.jsx
index fdb3410b5f0..5ec81f64b74 100644
--- a/frontend/src/metabase/components/AdminAwareEmptyState.jsx
+++ b/frontend/src/metabase/components/AdminAwareEmptyState.jsx
@@ -1,5 +1,5 @@
 import React, { Component } from "react";
-import EmptyState from "metabase/components/EmptyState.jsx";
+import EmptyState from "metabase/components/EmptyState";
 import { getUser } from "metabase/selectors/user";
 import { connect } from "react-redux";
 
diff --git a/frontend/src/metabase/components/AdminHeader.jsx b/frontend/src/metabase/components/AdminHeader.jsx
index 8b21a6a6a4e..992ee651f23 100644
--- a/frontend/src/metabase/components/AdminHeader.jsx
+++ b/frontend/src/metabase/components/AdminHeader.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 
-import SaveStatus from "metabase/components/SaveStatus.jsx";
+import SaveStatus from "metabase/components/SaveStatus";
 
 export default class AdminHeader extends Component {
   render() {
diff --git a/frontend/src/metabase/components/AdminLayout.jsx b/frontend/src/metabase/components/AdminLayout.jsx
index d0e7079aa71..e2605b26100 100644
--- a/frontend/src/metabase/components/AdminLayout.jsx
+++ b/frontend/src/metabase/components/AdminLayout.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 
-import AdminHeader from "./AdminHeader.jsx";
+import AdminHeader from "./AdminHeader";
 
 export default class AdminLayout extends Component {
   setSaving = () => {
diff --git a/frontend/src/metabase/components/Alert.jsx b/frontend/src/metabase/components/Alert.jsx
index e92a516c737..2b646d075b0 100644
--- a/frontend/src/metabase/components/Alert.jsx
+++ b/frontend/src/metabase/components/Alert.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 import { t } from "ttag";
-import Modal from "metabase/components/Modal.jsx";
+import Modal from "metabase/components/Modal";
 
 const Alert = ({ message, onClose }) => (
   <Modal small isOpen={!!message}>
diff --git a/frontend/src/metabase/components/ArchivedItem.jsx b/frontend/src/metabase/components/ArchivedItem.jsx
index 4be734da9ff..4773be74b15 100644
--- a/frontend/src/metabase/components/ArchivedItem.jsx
+++ b/frontend/src/metabase/components/ArchivedItem.jsx
@@ -4,19 +4,19 @@ import React from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 
-import CheckBox from "metabase/components/CheckBox.jsx";
+import CheckBox from "metabase/components/CheckBox";
 import Icon from "metabase/components/Icon";
 import IconWrapper from "metabase/components/IconWrapper";
 import Swapper from "metabase/components/Swapper";
 import Tooltip from "metabase/components/Tooltip";
 
-import colors from "metabase/lib/colors";
+import { color as c } from "metabase/lib/colors";
 
 const ArchivedItem = ({
   name,
   type,
   icon,
-  color = colors["text-light"],
+  color = c("text-light"),
   isAdmin = false,
   onUnarchive,
   onDelete,
diff --git a/frontend/src/metabase/components/Breadcrumbs.jsx b/frontend/src/metabase/components/Breadcrumbs.jsx
index 0924d7a31f7..51548fd2ee8 100644
--- a/frontend/src/metabase/components/Breadcrumbs.jsx
+++ b/frontend/src/metabase/components/Breadcrumbs.jsx
@@ -4,8 +4,8 @@ import { Link } from "react-router";
 
 import S from "./Breadcrumbs.css";
 
-import Icon from "metabase/components/Icon.jsx";
-import Ellipsified from "metabase/components/Ellipsified.jsx";
+import Icon from "metabase/components/Icon";
+import Ellipsified from "metabase/components/Ellipsified";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/components/BrowserCrumbs.jsx b/frontend/src/metabase/components/BrowserCrumbs.jsx
index eede9117497..5b351a6a668 100644
--- a/frontend/src/metabase/components/BrowserCrumbs.jsx
+++ b/frontend/src/metabase/components/BrowserCrumbs.jsx
@@ -3,7 +3,7 @@ import { Flex } from "grid-styled";
 import Icon from "metabase/components/Icon";
 import Link from "metabase/components/Link";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 // TODO: merge with Breadcrumbs
 
@@ -35,7 +35,7 @@ const BrowserCrumbs = ({ crumbs, analyticsContext }) => (
             <Icon
               key={"divider" + index}
               name="chevronright"
-              color={colors["text-light"]}
+              color={color("text-light")}
               mx={1}
             />
           ) : null}
diff --git a/frontend/src/metabase/components/Button.jsx b/frontend/src/metabase/components/Button.jsx
index f0f91e593b2..4ea0fe0a515 100644
--- a/frontend/src/metabase/components/Button.jsx
+++ b/frontend/src/metabase/components/Button.jsx
@@ -2,7 +2,7 @@ import React from "react";
 import PropTypes from "prop-types";
 import sys from "system-components";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 import cx from "classnames";
 import _ from "underscore";
 
diff --git a/frontend/src/metabase/components/Card.jsx b/frontend/src/metabase/components/Card.jsx
index 10aded46d1e..63e0db6e3cd 100644
--- a/frontend/src/metabase/components/Card.jsx
+++ b/frontend/src/metabase/components/Card.jsx
@@ -1,22 +1,22 @@
 import styled from "styled-components";
 import { space, width } from "styled-system";
-import colors, { alpha } from "metabase/lib/colors";
+import { color, alpha } from "metabase/lib/colors";
 
 const Card = styled.div`
   ${width}
   ${space}
-  background-color: ${props => (props.dark ? colors["text-dark"] : "white")};
+  background-color: ${props => (props.dark ? color("text-dark") : "white")};
   border: 1px solid ${props =>
-    props.dark ? "transparent" : colors["bg-medium"]};
+    props.dark ? "transparent" : color("bg-medium")};
   ${props => props.dark && `color: white`};
   border-radius: 6px;
-  box-shadow: 0 7px 20px ${props => colors["shadow"]};
+  box-shadow: 0 7px 20px ${props => color("shadow")};
   transition: all 0.2s linear;
   line-height: 24px;
   ${props =>
     props.hoverable &&
     `&:hover {
-    box-shadow: 0 10px 22px ${alpha(colors["shadow"], 0.09)};
+    box-shadow: 0 10px 22px ${alpha(color("shadow"), 0.09)};
   }`};
 `;
 
diff --git a/frontend/src/metabase/components/ChannelSetupModal.jsx b/frontend/src/metabase/components/ChannelSetupModal.jsx
index bc399a6fb0c..37e860d125e 100644
--- a/frontend/src/metabase/components/ChannelSetupModal.jsx
+++ b/frontend/src/metabase/components/ChannelSetupModal.jsx
@@ -3,7 +3,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
 import { t } from "ttag";
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalContent from "metabase/components/ModalContent";
 import ChannelSetupMessage from "metabase/components/ChannelSetupMessage";
 
 export default class ChannelSetupModal extends Component {
diff --git a/frontend/src/metabase/components/CheckBox.jsx b/frontend/src/metabase/components/CheckBox.jsx
index dc60c49aea7..c9dcff158c3 100644
--- a/frontend/src/metabase/components/CheckBox.jsx
+++ b/frontend/src/metabase/components/CheckBox.jsx
@@ -4,7 +4,7 @@ import cx from "classnames";
 
 import Icon from "metabase/components/Icon";
 
-import colors, { normal as defaultColors } from "metabase/lib/colors";
+import { color as c, normal as defaultColors } from "metabase/lib/colors";
 
 export default class CheckBox extends Component {
   static propTypes = {
@@ -48,7 +48,7 @@ export default class CheckBox extends Component {
     } = this.props;
 
     const checkedColor = defaultColors[color];
-    const uncheckedColor = colors["text-light"];
+    const uncheckedColor = c("text-light");
 
     const checkboxStyle = {
       width: size,
diff --git a/frontend/src/metabase/components/CollectionItem.jsx b/frontend/src/metabase/components/CollectionItem.jsx
index 00c06dd72a0..9ac4e1a4a72 100644
--- a/frontend/src/metabase/components/CollectionItem.jsx
+++ b/frontend/src/metabase/components/CollectionItem.jsx
@@ -6,27 +6,27 @@ import Ellipsified from "metabase/components/Ellipsified";
 import Icon from "metabase/components/Icon";
 import Link from "metabase/components/Link";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const ItemLink = props => (
   <Link
     to={`collection/${props.collection.id}`}
     bg={
       props.hovered
-        ? colors["brand"]
+        ? color("brand")
         : props.highlighted
-        ? colors["bg-light"]
-        : colors["bg-medium"]
+        ? color("bg-light")
+        : color("bg-medium")
     }
-    color={props.hovered ? "white" : colors["text-medium"]}
+    color={props.hovered ? "white" : color("text-medium")}
     className="block rounded relative text-brand-hover"
     data-metabase-event={props.event}
     style={{
       borderSize: 1,
       borderColor: props.hovered
-        ? colors["brand"]
+        ? color("brand")
         : props.highlighted
-        ? colors["bg-medium"]
+        ? color("bg-medium")
         : "transparent",
       borderStyle: props.hovered
         ? "solid"
@@ -34,7 +34,7 @@ const ItemLink = props => (
         ? "dotted"
         : "solid",
     }}
-    hover={{ color: colors["brand"] }}
+    hover={{ color: color("brand") }}
   >
     {props.children}
   </Link>
@@ -51,7 +51,7 @@ const CollectionItem = props => {
     <Icon
       name={props.iconName}
       mx={props.asCard ? 0 : 1}
-      color={props.asCard ? "white" : colors["bg-dark"]}
+      color={props.asCard ? "white" : color("bg-dark")}
     />
   );
 
@@ -67,7 +67,7 @@ const CollectionItem = props => {
           align="center"
           justify="center"
           w="42px"
-          bg={colors["bg-dark"]}
+          bg={color("bg-dark")}
           style={{ height: 42, borderRadius: 6, flexShrink: 0 }}
           mr={1}
         >
diff --git a/frontend/src/metabase/components/CollectionLanding.jsx b/frontend/src/metabase/components/CollectionLanding.jsx
index f71b47cfb21..f6523a8bb6a 100644
--- a/frontend/src/metabase/components/CollectionLanding.jsx
+++ b/frontend/src/metabase/components/CollectionLanding.jsx
@@ -16,7 +16,7 @@ import listSelect from "metabase/hoc/ListSelect";
 import BulkActionBar from "metabase/components/BulkActionBar";
 
 import * as Urls from "metabase/lib/urls";
-import colors, { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import Button from "metabase/components/Button";
 import Card from "metabase/components/Card";
@@ -217,7 +217,7 @@ class DefaultLanding extends React.Component {
             pt={2}
             pb={3}
             px={4}
-            bg={pinned.length ? colors["bg-medium"] : null}
+            bg={pinned.length ? color("bg-medium") : null}
           >
             <Box>
               <Box mb={1}>
@@ -245,8 +245,8 @@ class DefaultLanding extends React.Component {
                       name="info"
                       ml={1}
                       mt="4px"
-                      color={colors["bg-dark"]}
-                      hover={{ color: colors["brand"] }}
+                      color={color("bg-dark")}
+                      hover={{ color: color("brand") }}
                     />
                   </Tooltip>
                 )}
@@ -282,7 +282,7 @@ class DefaultLanding extends React.Component {
           <Box>
             <Box>
               {collectionHasPins ? (
-                <Box px={PAGE_PADDING} pt={2} pb={3} bg={colors["bg-medium"]}>
+                <Box px={PAGE_PADDING} pt={2} pb={3} bg={color("bg-medium")}>
                   <CollectionSectionHeading>{t`Pins`}</CollectionSectionHeading>
                   <PinDropTarget
                     pinIndex={pinned[pinned.length - 1].collection_position + 1}
@@ -447,9 +447,7 @@ class DefaultLanding extends React.Component {
                         justify="center"
                         py={2}
                         m={2}
-                        color={
-                          hovered ? colors["brand"] : colors["text-medium"]
-                        }
+                        color={hovered ? color("brand") : color("text-medium")}
                       >
                         {t`Drag here to un-pin`}
                       </Flex>
@@ -582,7 +580,7 @@ const PinnedItem = ({ item, index, collection }) => (
   <Link
     to={item.getUrl()}
     className="hover-parent hover--visibility"
-    hover={{ color: normal.blue }}
+    hover={{ color: color("brand") }}
     data-metabase-event={`${ANALYTICS_CONTEXT};Pinned Item;Click;${item.model}`}
   >
     <Card hoverable p={3}>
@@ -678,7 +676,7 @@ class CollectionLanding extends React.Component {
 const CollectionSectionHeading = ({ children }) => (
   <h5
     className="text-uppercase"
-    style={{ color: colors["text-medium"], fontWeight: 900 }}
+    style={{ color: color("text-medium"), fontWeight: 900 }}
   >
     {children}
   </h5>
diff --git a/frontend/src/metabase/components/CollectionList.jsx b/frontend/src/metabase/components/CollectionList.jsx
index 1cd150cad46..d2c5c7b3ac0 100644
--- a/frontend/src/metabase/components/CollectionList.jsx
+++ b/frontend/src/metabase/components/CollectionList.jsx
@@ -6,7 +6,7 @@ import { connect } from "react-redux";
 import * as Urls from "metabase/lib/urls";
 
 import CollectionItem from "metabase/components/CollectionItem";
-import { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import { Grid, GridItem } from "metabase/components/Grid";
 import Icon from "metabase/components/Icon";
 import Link from "metabase/components/Link";
@@ -97,8 +97,8 @@ class CollectionList extends React.Component {
             <GridItem w={w}>
               <Link
                 to={Urls.newCollection(currentCollection.id)}
-                color={normal.grey2}
-                hover={{ color: normal.blue }}
+                color={color("text-medium")}
+                hover={{ color: color("brand") }}
                 p={w === 1 ? [1, 2] : 0}
                 data-metabase-event={`${analyticsContext};Collection List; New Collection Click`}
               >
diff --git a/frontend/src/metabase/components/ColumnarSelector.jsx b/frontend/src/metabase/components/ColumnarSelector.jsx
index 67f4b2b8859..d8b7e666544 100644
--- a/frontend/src/metabase/components/ColumnarSelector.jsx
+++ b/frontend/src/metabase/components/ColumnarSelector.jsx
@@ -3,7 +3,7 @@ import PropTypes from "prop-types";
 
 import "./ColumnarSelector.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/components/Confirm.jsx b/frontend/src/metabase/components/Confirm.jsx
index 843c4683ea1..fbb3cdeb107 100644
--- a/frontend/src/metabase/components/Confirm.jsx
+++ b/frontend/src/metabase/components/Confirm.jsx
@@ -2,8 +2,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
-import ConfirmContent from "./ConfirmContent.jsx";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
+import ConfirmContent from "./ConfirmContent";
 
 export default class Confirm extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/components/ConfirmContent.jsx b/frontend/src/metabase/components/ConfirmContent.jsx
index 13852bdc46f..681b5a22182 100644
--- a/frontend/src/metabase/components/ConfirmContent.jsx
+++ b/frontend/src/metabase/components/ConfirmContent.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalContent from "metabase/components/ModalContent";
 import { t } from "ttag";
 
 import Button from "metabase/components/Button";
diff --git a/frontend/src/metabase/components/DatabaseDetailsForm.jsx b/frontend/src/metabase/components/DatabaseDetailsForm.jsx
index 15ab3d01610..b79a9ac5410 100644
--- a/frontend/src/metabase/components/DatabaseDetailsForm.jsx
+++ b/frontend/src/metabase/components/DatabaseDetailsForm.jsx
@@ -2,10 +2,10 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
 import { t, jt } from "ttag";
-import FormField from "metabase/components/form/FormField.jsx";
-import FormLabel from "metabase/components/form/FormLabel.jsx";
-import FormMessage from "metabase/components/form/FormMessage.jsx";
-import Toggle from "metabase/components/Toggle.jsx";
+import FormField from "metabase/components/form/FormField";
+import FormLabel from "metabase/components/form/FormLabel";
+import FormMessage from "metabase/components/form/FormMessage";
+import Toggle from "metabase/components/Toggle";
 
 import { shallowEqual } from "recompose";
 
diff --git a/frontend/src/metabase/components/DeleteModalWithConfirm.jsx b/frontend/src/metabase/components/DeleteModalWithConfirm.jsx
index c82a0413229..203f08dbfe2 100644
--- a/frontend/src/metabase/components/DeleteModalWithConfirm.jsx
+++ b/frontend/src/metabase/components/DeleteModalWithConfirm.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import ModalContent from "metabase/components/ModalContent.jsx";
-import CheckBox from "metabase/components/CheckBox.jsx";
+import ModalContent from "metabase/components/ModalContent";
+import CheckBox from "metabase/components/CheckBox";
 import { t } from "ttag";
 import cx from "classnames";
 import _ from "underscore";
diff --git a/frontend/src/metabase/components/DirectionalButton.jsx b/frontend/src/metabase/components/DirectionalButton.jsx
index 61f3ab05ee8..6d9fcb24e82 100644
--- a/frontend/src/metabase/components/DirectionalButton.jsx
+++ b/frontend/src/metabase/components/DirectionalButton.jsx
@@ -1,15 +1,15 @@
 import React from "react";
 import Icon from "metabase/components/Icon";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const DirectionalButton = ({ direction = "back", onClick }) => (
   <div
     className="shadowed cursor-pointer text-brand-hover text-medium flex align-center circle p2 bg-white transition-background transition-color"
     onClick={onClick}
     style={{
-      border: `1px solid ${colors["border"]}`,
-      boxShadow: `0 2px 4px 0 ${colors["shadow"]}`,
+      border: `1px solid ${color("border")}`,
+      boxShadow: `0 2px 4px 0 ${color("shadow")}`,
     }}
   >
     <Icon name={`arrow_${direction}`} />
diff --git a/frontend/src/metabase/components/DownloadButton.jsx b/frontend/src/metabase/components/DownloadButton.jsx
index 54ce9421e0a..3c9f9b87986 100644
--- a/frontend/src/metabase/components/DownloadButton.jsx
+++ b/frontend/src/metabase/components/DownloadButton.jsx
@@ -2,7 +2,7 @@ import React from "react";
 import PropTypes from "prop-types";
 import { Box, Flex } from "grid-styled";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import { extractQueryParams } from "metabase/lib/urls";
 
 import Icon from "metabase/components/Icon";
@@ -11,13 +11,13 @@ import Text from "metabase/components/Text";
 function colorForType(type) {
   switch (type) {
     case "csv":
-      return colors["accent7"];
+      return color("accent7");
     case "xlsx":
-      return colors["accent1"];
+      return color("accent1");
     case "json":
-      return colors["bg-dark"];
+      return color("bg-dark");
     default:
-      return colors["brand"];
+      return color("brand");
   }
 }
 
diff --git a/frontend/src/metabase/components/EntityItem.jsx b/frontend/src/metabase/components/EntityItem.jsx
index 0c3e04bd3d8..29f21b6f5d0 100644
--- a/frontend/src/metabase/components/EntityItem.jsx
+++ b/frontend/src/metabase/components/EntityItem.jsx
@@ -10,14 +10,14 @@ import CheckBox from "metabase/components/CheckBox";
 import Ellipsified from "metabase/components/Ellipsified";
 import Icon from "metabase/components/Icon";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const EntityItemWrapper = Flex.extend`
-  border-bottom: 1px solid ${colors["bg-medium"]};
+  border-bottom: 1px solid ${color("bg-medium")};
   /* TODO - figure out how to use the prop instead of this? */
   align-items: center;
   &:hover {
-    color: ${colors["brand"]};
+    color: ${color("brand")};
   }
 `;
 
diff --git a/frontend/src/metabase/components/EntityLayout.js b/frontend/src/metabase/components/EntityLayout.js
index af41b3dab72..18d76249cfb 100644
--- a/frontend/src/metabase/components/EntityLayout.js
+++ b/frontend/src/metabase/components/EntityLayout.js
@@ -2,7 +2,7 @@ import React from "react";
 import { Box, Flex } from "grid-styled";
 import Subhead from "metabase/components/Subhead";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export const Wrapper = ({ children }) => (
   <Box w="80%" ml="auto" mr="auto">
@@ -12,11 +12,11 @@ export const Wrapper = ({ children }) => (
 
 export const Canvas = ({ children }) => (
   <Box
-    bg={colors["bg-white"]}
+    bg={color("bg-white")}
     p={2}
     style={{
-      borderTop: colors["border"],
-      borderBottom: colors["border"],
+      borderTop: color("border"),
+      borderBottom: color("border"),
     }}
   >
     {children}
diff --git a/frontend/src/metabase/components/EntityMenuItem.jsx b/frontend/src/metabase/components/EntityMenuItem.jsx
index cfd75cdbaa4..079a4afeb87 100644
--- a/frontend/src/metabase/components/EntityMenuItem.jsx
+++ b/frontend/src/metabase/components/EntityMenuItem.jsx
@@ -4,25 +4,25 @@ import { Link } from "react-router";
 
 import Icon from "metabase/components/Icon";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const Item = styled.div`
   display: flex;
   align-items: center;
   cursor: pointer;
-  color: ${colors["text-medium"]};
+  color: ${color("text-medium")};
   padding: 0.85em 1.45em;
   text-decoration: none;
   transition: all 300ms linear;
   :hover {
-    color: ${colors["brand"]};
+    color: ${color("brand")};
   }
   > .Icon {
-    color: ${colors["text-light"]};
+    color: ${color("text-light")};
     margin-right: 0.65em;
   }
   :hover > .Icon {
-    color: ${colors["brand"]};
+    color: ${color("brand")};
     transition: all 300ms linear;
   },
   /* icon specific tweaks
diff --git a/frontend/src/metabase/components/EntityPage.jsx b/frontend/src/metabase/components/EntityPage.jsx
index 3a15c0ed518..fb79dde5de2 100644
--- a/frontend/src/metabase/components/EntityPage.jsx
+++ b/frontend/src/metabase/components/EntityPage.jsx
@@ -13,7 +13,7 @@ import QuestionAndResultLoader from "metabase/containers/QuestionAndResultLoader
 
 import RelatedItems from "metabase/components/RelatedItems";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 class EntityPage extends Component {
   render() {
@@ -34,7 +34,7 @@ class EntityPage extends Component {
             <div key="entity">
               <Box
                 className="border-bottom hover-parent hover--visibility relative"
-                style={{ backgroundColor: colors["bg-white"], height: "65vh" }}
+                style={{ backgroundColor: color("bg-white"), height: "65vh" }}
               >
                 <Box className="hover-child absolute top right">
                   {!loading && (
@@ -68,7 +68,7 @@ class EntityPage extends Component {
                         p={2}
                         mt={4}
                         style={{
-                          border: `1px solid ${colors["border"]}`,
+                          border: `1px solid ${color("border")}`,
                           borderRadius: 6,
                         }}
                       >
diff --git a/frontend/src/metabase/components/ExplorePane.jsx b/frontend/src/metabase/components/ExplorePane.jsx
index 092e8f825e2..42a0eceb33e 100644
--- a/frontend/src/metabase/components/ExplorePane.jsx
+++ b/frontend/src/metabase/components/ExplorePane.jsx
@@ -9,7 +9,7 @@ import Select, { Option } from "metabase/components/Select";
 import { Grid, GridItem } from "metabase/components/Grid";
 import Card from "metabase/components/Card";
 import { Flex } from "grid-styled";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import { t } from "ttag";
 import _ from "underscore";
@@ -162,7 +162,7 @@ export const ExploreOption = ({ option }: { option: Candidate }) => (
     <Flex
       align="center"
       justify="center"
-      bg={colors["accent4"]}
+      bg={color("accent4")}
       w="42px"
       style={{ borderRadius: 6, height: 42 }}
       mr={1}
diff --git a/frontend/src/metabase/components/Header.jsx b/frontend/src/metabase/components/Header.jsx
index 76d3f9eca9f..4b5f4384964 100644
--- a/frontend/src/metabase/components/Header.jsx
+++ b/frontend/src/metabase/components/Header.jsx
@@ -2,10 +2,10 @@ import React, { Component } from "react";
 import ReactDOM from "react-dom";
 
 import CollectionBadge from "metabase/questions/components/CollectionBadge";
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
-import HeaderModal from "metabase/components/HeaderModal.jsx";
-import TitleAndDescription from "metabase/components/TitleAndDescription.jsx";
-import EditBar from "metabase/components/EditBar.jsx";
+import InputBlurChange from "metabase/components/InputBlurChange";
+import HeaderModal from "metabase/components/HeaderModal";
+import TitleAndDescription from "metabase/components/TitleAndDescription";
+import EditBar from "metabase/components/EditBar";
 import { t } from "ttag";
 import { getScrollY } from "metabase/lib/dom";
 
diff --git a/frontend/src/metabase/components/HistoryModal.jsx b/frontend/src/metabase/components/HistoryModal.jsx
index c6085581d92..93b42d40d83 100644
--- a/frontend/src/metabase/components/HistoryModal.jsx
+++ b/frontend/src/metabase/components/HistoryModal.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import ActionButton from "metabase/components/ActionButton.jsx";
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ActionButton from "metabase/components/ActionButton";
+import ModalContent from "metabase/components/ModalContent";
 
 import moment from "moment";
 
diff --git a/frontend/src/metabase/components/Icon.jsx b/frontend/src/metabase/components/Icon.jsx
index 454c42ebff4..2d9e3aa3be2 100644
--- a/frontend/src/metabase/components/Icon.jsx
+++ b/frontend/src/metabase/components/Icon.jsx
@@ -5,7 +5,7 @@ import RetinaImage from "react-retina-image";
 import styled from "styled-components";
 import { color, space, hover } from "styled-system";
 import cx from "classnames";
-import colors, { darken } from "metabase/lib/colors";
+import { color as c, darken } from "metabase/lib/colors";
 
 import { loadIcon } from "metabase/icon_paths";
 import { stripLayoutProps } from "metabase/lib/utils";
@@ -21,7 +21,7 @@ export const IconWrapper = styled("div")`
   height: 40px;
   border-radius: 99px;
   cursor: pointer;
-  color: ${props => (props.open ? colors["brand"] : "inherit")};
+  color: ${props => (props.open ? c("brand") : "inherit")};
   // special cases for certain icons
   // Icon-share has a taller viewvbox than most so to optically center
   // the icon we need to translate it upwards
@@ -33,7 +33,7 @@ export const IconWrapper = styled("div")`
 
 IconWrapper.defaultProps = {
   hover: {
-    backgroundColor: darken(colors["brand"]),
+    backgroundColor: darken(c("brand")),
     color: "white",
   },
 };
diff --git a/frontend/src/metabase/components/IconWrapper.jsx b/frontend/src/metabase/components/IconWrapper.jsx
index 5deb01190c3..f8d9b11bc59 100644
--- a/frontend/src/metabase/components/IconWrapper.jsx
+++ b/frontend/src/metabase/components/IconWrapper.jsx
@@ -1,8 +1,8 @@
 import { Flex } from "grid-styled";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const IconWrapper = Flex.extend`
-  background: ${colors["bg-medium"]};
+  background: ${color("bg-medium")};
   border-radius: 6px;
 `;
 
diff --git a/frontend/src/metabase/components/ItemTypeFilterBar.jsx b/frontend/src/metabase/components/ItemTypeFilterBar.jsx
index 8c03b7fe5f1..96c64f5b5de 100644
--- a/frontend/src/metabase/components/ItemTypeFilterBar.jsx
+++ b/frontend/src/metabase/components/ItemTypeFilterBar.jsx
@@ -6,7 +6,7 @@ import { withRouter } from "react-router";
 import Icon from "metabase/components/Icon";
 import Link from "metabase/components/Link";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export const FILTERS = [
   {
@@ -42,7 +42,7 @@ const ItemTypeFilterBar = props => {
           isActive = true;
         }
 
-        const color = isActive ? colors.brand : "inherit";
+        const linkColor = isActive ? color("brand") : "inherit";
 
         return (
           <Link
@@ -50,8 +50,8 @@ const ItemTypeFilterBar = props => {
               pathname: location.pathname,
               query: { ...location.query, type: f.filter },
             }}
-            color={color}
-            hover={{ color: colors.brand }}
+            color={linkColor}
+            hover={{ color: color("brand") }}
             className="flex-full flex align-center justify-center sm-block text-brand-hover text-medium"
             mr={[0, 2]}
             key={f.filter}
@@ -59,7 +59,7 @@ const ItemTypeFilterBar = props => {
             data-metabase-event={`${analyticsContext};Item Filter;${f.name}`}
             style={{
               borderBottom: `2px solid ${
-                isActive ? colors.brand : "transparent"
+                isActive ? color("brand") : "transparent"
               }`,
             }}
           >
@@ -67,7 +67,7 @@ const ItemTypeFilterBar = props => {
             <h5
               className="text-uppercase hide sm-show"
               style={{
-                color: isActive ? colors.brand : "inherit",
+                color: isActive ? color("brand") : "inherit",
                 fontWeight: 900,
               }}
             >
diff --git a/frontend/src/metabase/components/LabelIcon.jsx b/frontend/src/metabase/components/LabelIcon.jsx
index a6a145c6094..e5b0f5eefba 100644
--- a/frontend/src/metabase/components/LabelIcon.jsx
+++ b/frontend/src/metabase/components/LabelIcon.jsx
@@ -4,7 +4,7 @@ import PropTypes from "prop-types";
 
 import S from "./LabelIcon.css";
 
-import Icon from "./Icon.jsx";
+import Icon from "./Icon";
 import cx from "classnames";
 
 const LabelIcon = ({ icon, size = 18, className, style }) =>
diff --git a/frontend/src/metabase/components/ListItem.jsx b/frontend/src/metabase/components/ListItem.jsx
index bbd0c1f20f9..b0fd19885a5 100644
--- a/frontend/src/metabase/components/ListItem.jsx
+++ b/frontend/src/metabase/components/ListItem.jsx
@@ -4,8 +4,8 @@ import PropTypes from "prop-types";
 import { Link } from "react-router";
 import S from "./List.css";
 import { t } from "ttag";
-import Icon from "./Icon.jsx";
-import Ellipsified from "./Ellipsified.jsx";
+import Icon from "./Icon";
+import Ellipsified from "./Ellipsified";
 
 import cx from "classnames";
 import pure from "recompose/pure";
diff --git a/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx b/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx
index b2f90f8dfa9..af08de46963 100644
--- a/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx
+++ b/frontend/src/metabase/components/LoadingAndErrorWrapper.jsx
@@ -2,7 +2,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
 import { t } from "ttag";
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/components/Modal.jsx b/frontend/src/metabase/components/Modal.jsx
index a024d83ce86..b5532589fb5 100644
--- a/frontend/src/metabase/components/Modal.jsx
+++ b/frontend/src/metabase/components/Modal.jsx
@@ -8,7 +8,7 @@ import { getScrollX, getScrollY } from "metabase/lib/dom";
 import { CSSTransitionGroup } from "react-transition-group";
 import { Motion, spring } from "react-motion";
 
-import OnClickOutsideWrapper from "./OnClickOutsideWrapper.jsx";
+import OnClickOutsideWrapper from "./OnClickOutsideWrapper";
 import ModalContent from "./ModalContent";
 
 import _ from "underscore";
diff --git a/frontend/src/metabase/components/ModalContent.jsx b/frontend/src/metabase/components/ModalContent.jsx
index ecefdbd1b25..a44c955f080 100644
--- a/frontend/src/metabase/components/ModalContent.jsx
+++ b/frontend/src/metabase/components/ModalContent.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 export default class ModalContent extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/components/ModalWithTrigger.jsx b/frontend/src/metabase/components/ModalWithTrigger.jsx
index fd89cf9df6e..0f60abb7946 100644
--- a/frontend/src/metabase/components/ModalWithTrigger.jsx
+++ b/frontend/src/metabase/components/ModalWithTrigger.jsx
@@ -1,4 +1,4 @@
-import Triggerable from "./Triggerable.jsx";
-import Modal from "./Modal.jsx";
+import Triggerable from "./Triggerable";
+import Modal from "./Modal";
 
 export default Triggerable(Modal);
diff --git a/frontend/src/metabase/components/NewsletterForm.jsx b/frontend/src/metabase/components/NewsletterForm.jsx
index e8864ec4bfa..5a9fce98eaa 100644
--- a/frontend/src/metabase/components/NewsletterForm.jsx
+++ b/frontend/src/metabase/components/NewsletterForm.jsx
@@ -3,8 +3,8 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import ReactDOM from "react-dom";
 import { t } from "ttag";
-import Icon from "metabase/components/Icon.jsx";
-import colors from "metabase/lib/colors";
+import Icon from "metabase/components/Icon";
+import { color } from "metabase/lib/colors";
 
 export default class NewsletterForm extends Component {
   constructor(props, context) {
@@ -19,7 +19,7 @@ export default class NewsletterForm extends Component {
 
       input: {
         fontSize: "1.1rem",
-        color: colors["text-dark"],
+        color: color("text-dark"),
         width: "350px",
       },
 
@@ -75,7 +75,7 @@ export default class NewsletterForm extends Component {
         <div className="MB-Newsletter sm-float-right">
           <div>
             <div
-              style={{ color: colors["text-medium"] }}
+              style={{ color: color("text-medium") }}
               className="text-medium h3 pb3"
             >
               {t`Get infrequent emails about new releases and feature updates.`}
diff --git a/frontend/src/metabase/components/NumericInput.jsx b/frontend/src/metabase/components/NumericInput.jsx
index d46ce4df601..87d3ce292dd 100644
--- a/frontend/src/metabase/components/NumericInput.jsx
+++ b/frontend/src/metabase/components/NumericInput.jsx
@@ -2,7 +2,7 @@
 
 import React from "react";
 
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
+import InputBlurChange from "metabase/components/InputBlurChange";
 
 type Props = {
   value: ?(number | string),
diff --git a/frontend/src/metabase/components/PasswordReveal.jsx b/frontend/src/metabase/components/PasswordReveal.jsx
index 7bcb141a226..2a74e4c4f93 100644
--- a/frontend/src/metabase/components/PasswordReveal.jsx
+++ b/frontend/src/metabase/components/PasswordReveal.jsx
@@ -2,7 +2,7 @@
 import React, { Component } from "react";
 import CopyButton from "metabase/components/CopyButton";
 import { t } from "ttag";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 type State = {
   visible: boolean,
@@ -16,7 +16,7 @@ const styles = {
   input: {
     fontSize: "1.2rem",
     letterSpacing: "2",
-    color: colors["text-dark"],
+    color: color("text-dark"),
     outline: "none",
   },
 };
diff --git a/frontend/src/metabase/components/PopoverWithTrigger.jsx b/frontend/src/metabase/components/PopoverWithTrigger.jsx
index 8385d166964..3cc78915e5a 100644
--- a/frontend/src/metabase/components/PopoverWithTrigger.jsx
+++ b/frontend/src/metabase/components/PopoverWithTrigger.jsx
@@ -1,4 +1,4 @@
-import Triggerable from "./Triggerable.jsx";
-import Popover from "./Popover.jsx";
+import Triggerable from "./Triggerable";
+import Popover from "./Popover";
 
 export default Triggerable(Popover);
diff --git a/frontend/src/metabase/components/ProgressBar.jsx b/frontend/src/metabase/components/ProgressBar.jsx
index 3a86939221f..0cc9694d364 100644
--- a/frontend/src/metabase/components/ProgressBar.jsx
+++ b/frontend/src/metabase/components/ProgressBar.jsx
@@ -2,7 +2,7 @@
 import React, { Component } from "react";
 import styled from "styled-components";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 type Props = {
   percentage: number,
@@ -36,7 +36,7 @@ const Progress = styled.div`
         left: 0;
         width: ${props => props.width / 4}%;
         height: 100%;
-        background-color: ${colors["bg-black"]};
+        background-color: ${color("bg-black")};
         animation: ${props =>
           props.animated ? "progress-bar 1.5s linear infinite" : "none"};
       },
@@ -47,7 +47,7 @@ export default class ProgressBar extends Component {
 
   static defaultProps = {
     animated: false,
-    color: colors["brand"],
+    color: color("brand"),
     height: 10,
   };
 
diff --git a/frontend/src/metabase/components/QueryButton.jsx b/frontend/src/metabase/components/QueryButton.jsx
index 89320373a9b..d3f503129d0 100644
--- a/frontend/src/metabase/components/QueryButton.jsx
+++ b/frontend/src/metabase/components/QueryButton.jsx
@@ -6,7 +6,7 @@ import cx from "classnames";
 
 import S from "./QueryButton.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const QueryButton = ({ className, text, icon, iconClass, onClick, link }) => (
   <div className={className}>
diff --git a/frontend/src/metabase/components/QuestionSavedModal.jsx b/frontend/src/metabase/components/QuestionSavedModal.jsx
index 2ea5d8b1ed9..901f08d7ccd 100644
--- a/frontend/src/metabase/components/QuestionSavedModal.jsx
+++ b/frontend/src/metabase/components/QuestionSavedModal.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalContent from "metabase/components/ModalContent";
 import { t } from "ttag";
 
 export default class QuestionSavedModal extends Component {
diff --git a/frontend/src/metabase/components/SaveStatus.jsx b/frontend/src/metabase/components/SaveStatus.jsx
index 91fc265b9b4..94701f4d981 100644
--- a/frontend/src/metabase/components/SaveStatus.jsx
+++ b/frontend/src/metabase/components/SaveStatus.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 
-import Icon from "metabase/components/Icon.jsx";
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
+import Icon from "metabase/components/Icon";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
 import { t } from "ttag";
 import _ from "underscore";
 
diff --git a/frontend/src/metabase/components/SchedulePicker.jsx b/frontend/src/metabase/components/SchedulePicker.jsx
index d9e0ab3257f..b6edf37d4ce 100644
--- a/frontend/src/metabase/components/SchedulePicker.jsx
+++ b/frontend/src/metabase/components/SchedulePicker.jsx
@@ -2,7 +2,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Select from "metabase/components/Select.jsx";
+import Select from "metabase/components/Select";
 
 import Settings from "metabase/lib/settings";
 import { capitalize } from "metabase/lib/formatting";
diff --git a/frontend/src/metabase/components/Select.jsx b/frontend/src/metabase/components/Select.jsx
index 6cd29e5a1df..248f1acb155 100644
--- a/frontend/src/metabase/components/Select.jsx
+++ b/frontend/src/metabase/components/Select.jsx
@@ -5,9 +5,9 @@ import PropTypes from "prop-types";
 import { List } from "react-virtualized";
 import "react-virtualized/styles.css";
 import { t } from "ttag";
-import ColumnarSelector from "metabase/components/ColumnarSelector.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
+import ColumnarSelector from "metabase/components/ColumnarSelector";
+import Icon from "metabase/components/Icon";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
 import SelectButton from "./SelectButton";
 
 import cx from "classnames";
diff --git a/frontend/src/metabase/components/SelectButton.jsx b/frontend/src/metabase/components/SelectButton.jsx
index 20dd188605b..4cbe3439370 100644
--- a/frontend/src/metabase/components/SelectButton.jsx
+++ b/frontend/src/metabase/components/SelectButton.jsx
@@ -2,7 +2,7 @@
 import React from "react";
 import PropTypes from "prop-types";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/components/SidebarItem.jsx b/frontend/src/metabase/components/SidebarItem.jsx
index ff77101a75e..fb368483938 100644
--- a/frontend/src/metabase/components/SidebarItem.jsx
+++ b/frontend/src/metabase/components/SidebarItem.jsx
@@ -4,7 +4,7 @@ import PropTypes from "prop-types";
 import { Link } from "react-router";
 import S from "./Sidebar.css";
 
-import LabelIcon from "./LabelIcon.jsx";
+import LabelIcon from "./LabelIcon";
 
 import pure from "recompose/pure";
 
diff --git a/frontend/src/metabase/components/StackedCheckBox.jsx b/frontend/src/metabase/components/StackedCheckBox.jsx
index cb5b3444802..a227b5dc96d 100644
--- a/frontend/src/metabase/components/StackedCheckBox.jsx
+++ b/frontend/src/metabase/components/StackedCheckBox.jsx
@@ -1,7 +1,7 @@
 import React from "react";
 import cx from "classnames";
 
-import CheckBox from "metabase/components/CheckBox.jsx";
+import CheckBox from "metabase/components/CheckBox";
 
 const OFFSET = 4;
 
diff --git a/frontend/src/metabase/components/StepIndicators.jsx b/frontend/src/metabase/components/StepIndicators.jsx
index f705ef5886e..74c4dad7cba 100644
--- a/frontend/src/metabase/components/StepIndicators.jsx
+++ b/frontend/src/metabase/components/StepIndicators.jsx
@@ -1,7 +1,7 @@
 /* @flow */
 import React from "react";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 type Props = {
   activeDotColor?: string,
@@ -12,7 +12,7 @@ type Props = {
 };
 
 const StepIndicators = ({
-  activeDotColor = colors["brand"],
+  activeDotColor = color("brand"),
   currentStep = 0,
   dotSize = 8,
   goToStep,
@@ -30,7 +30,7 @@ const StepIndicators = ({
           marginLeft: 2,
           marginRight: 2,
           backgroundColor:
-            index + 1 === currentStep ? activeDotColor : colors["text-light"],
+            index + 1 === currentStep ? activeDotColor : color("text-light"),
           transition: "background 600ms ease-in",
         }}
         key={index}
diff --git a/frontend/src/metabase/components/Text.jsx b/frontend/src/metabase/components/Text.jsx
index 6bc72e697ad..c8089fd7723 100644
--- a/frontend/src/metabase/components/Text.jsx
+++ b/frontend/src/metabase/components/Text.jsx
@@ -1,10 +1,10 @@
 import styled from "styled-components";
 import { space } from "system-components";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const Text = styled.p`
   ${space};
-  color: ${props => colors[`text-${props.color}`]};
+  color: ${props => color(`text-${props.color}`)};
 `;
 
 Text.defaultProps = {
diff --git a/frontend/src/metabase/components/TitleAndDescription.jsx b/frontend/src/metabase/components/TitleAndDescription.jsx
index 28d86f33a38..2c16183e3e0 100644
--- a/frontend/src/metabase/components/TitleAndDescription.jsx
+++ b/frontend/src/metabase/components/TitleAndDescription.jsx
@@ -3,8 +3,8 @@ import React from "react";
 import cx from "classnames";
 import pure from "recompose/pure";
 
-import Icon from "metabase/components/Icon.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import Icon from "metabase/components/Icon";
+import Tooltip from "metabase/components/Tooltip";
 
 type Attributes = {
   title: string,
diff --git a/frontend/src/metabase/components/Tooltip.jsx b/frontend/src/metabase/components/Tooltip.jsx
index 8d48042547b..cdb63bcdfc3 100644
--- a/frontend/src/metabase/components/Tooltip.jsx
+++ b/frontend/src/metabase/components/Tooltip.jsx
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import ReactDOM from "react-dom";
 
-import TooltipPopover from "./TooltipPopover.jsx";
+import TooltipPopover from "./TooltipPopover";
 
 // TOOLTIP_STACK and related functions are to ensure only the most recent tooltip is visible
 
diff --git a/frontend/src/metabase/components/TooltipPopover.jsx b/frontend/src/metabase/components/TooltipPopover.jsx
index a437d5f1eb1..9d0833c701d 100644
--- a/frontend/src/metabase/components/TooltipPopover.jsx
+++ b/frontend/src/metabase/components/TooltipPopover.jsx
@@ -2,7 +2,7 @@ import React from "react";
 import cx from "classnames";
 import pure from "recompose/pure";
 
-import Popover from "./Popover.jsx";
+import Popover from "./Popover";
 
 // if the tooltip is passed a long description we'll want to conditionally
 // format it to make it easier to read.
diff --git a/frontend/src/metabase/components/Triggerable.jsx b/frontend/src/metabase/components/Triggerable.jsx
index 41843dcc453..2103bbb588a 100644
--- a/frontend/src/metabase/components/Triggerable.jsx
+++ b/frontend/src/metabase/components/Triggerable.jsx
@@ -3,7 +3,7 @@ import ReactDOM from "react-dom";
 
 import { isObscured } from "metabase/lib/dom";
 
-import Tooltip from "./Tooltip.jsx";
+import Tooltip from "./Tooltip";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/components/UserAvatar.jsx b/frontend/src/metabase/components/UserAvatar.jsx
index 90641f39ddf..f0ac0ecaa3c 100644
--- a/frontend/src/metabase/components/UserAvatar.jsx
+++ b/frontend/src/metabase/components/UserAvatar.jsx
@@ -4,7 +4,7 @@ import styled from "styled-components";
 import { Flex } from "grid-styled";
 import { height } from "styled-system";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const Avatar = styled(Flex).attrs({
   align: "center",
@@ -20,7 +20,7 @@ const Avatar = styled(Flex).attrs({
 `;
 
 Avatar.defaultProps = {
-  bg: colors["brand"],
+  bg: color("brand"),
   color: "white",
   size: ["3em"],
 };
diff --git a/frontend/src/metabase/components/icons/FullscreenIcon.jsx b/frontend/src/metabase/components/icons/FullscreenIcon.jsx
index 38e8eb9005c..6a5c28d8b2e 100644
--- a/frontend/src/metabase/components/icons/FullscreenIcon.jsx
+++ b/frontend/src/metabase/components/icons/FullscreenIcon.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const FullscreenIcon = ({ isFullscreen, ...props }) => (
   <Icon name={isFullscreen ? "contract" : "expand"} {...props} />
diff --git a/frontend/src/metabase/components/icons/NightModeIcon.jsx b/frontend/src/metabase/components/icons/NightModeIcon.jsx
index b1ffbbb840d..b75a0381bff 100644
--- a/frontend/src/metabase/components/icons/NightModeIcon.jsx
+++ b/frontend/src/metabase/components/icons/NightModeIcon.jsx
@@ -2,7 +2,7 @@
 
 import React from "react";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 type Props = {
   // ...IconProps,
diff --git a/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx b/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx
index d0d38e07bcf..b343455b445 100644
--- a/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx
+++ b/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx
@@ -6,7 +6,7 @@ import { Flex } from "grid-styled";
 
 import Icon from "metabase/components/Icon";
 import Link from "metabase/components/Link";
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalContent from "metabase/components/ModalContent";
 import DashboardPicker from "metabase/containers/DashboardPicker";
 
 import * as Urls from "metabase/lib/urls";
diff --git a/frontend/src/metabase/containers/ItemPicker.jsx b/frontend/src/metabase/containers/ItemPicker.jsx
index 199715105f0..b394d791ed2 100644
--- a/frontend/src/metabase/containers/ItemPicker.jsx
+++ b/frontend/src/metabase/containers/ItemPicker.jsx
@@ -7,7 +7,7 @@ import Icon from "metabase/components/Icon";
 import Breadcrumbs from "metabase/components/Breadcrumbs";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import { connect } from "react-redux";
 
@@ -18,7 +18,7 @@ import EntityListLoader, {
 
 import Collections from "metabase/entities/collections";
 
-const COLLECTION_ICON_COLOR = colors["text-light"];
+const COLLECTION_ICON_COLOR = color("text-light");
 
 const isRoot = collection => collection.id === "root" || collection.id == null;
 
diff --git a/frontend/src/metabase/containers/Overworld.jsx b/frontend/src/metabase/containers/Overworld.jsx
index a0bed11f3dc..a4faa099787 100644
--- a/frontend/src/metabase/containers/Overworld.jsx
+++ b/frontend/src/metabase/containers/Overworld.jsx
@@ -8,7 +8,7 @@ import { createSelector } from "reselect";
 import CollectionItemsLoader from "metabase/containers/CollectionItemsLoader";
 import CandidateListLoader from "metabase/containers/CandidateListLoader";
 import ExplorePane from "metabase/components/ExplorePane";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import Tooltip from "metabase/components/Tooltip";
 import MetabotLogo from "metabase/components/MetabotLogo";
 import CollectionList from "metabase/components/CollectionList";
 
@@ -20,7 +20,7 @@ import Subhead from "metabase/components/Subhead";
 import RetinaImage from "react-retina-image";
 
 import * as Urls from "metabase/lib/urls";
-import colors, { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import Greeting from "metabase/lib/greeting";
 
 import Database from "metabase/entities/databases";
@@ -138,12 +138,12 @@ class Overworld extends React.Component {
                             pin.model
                           }`}
                           to={Urls.dashboard(pin.id)}
-                          hover={{ color: normal.blue }}
+                          hover={{ color: color("brand") }}
                         >
                           <Card hoverable p={3}>
                             <Icon
                               name="dashboard"
-                              color={normal.blue}
+                              color={color("brand")}
                               mb={2}
                               size={28}
                             />
@@ -163,7 +163,7 @@ class Overworld extends React.Component {
 
         <Box px={PAGE_PADDING} my={3}>
           <SectionHeading>{ROOT_COLLECTION.name}</SectionHeading>
-          <Box p={[1, 2]} mt={2} bg={colors["bg-medium"]}>
+          <Box p={[1, 2]} mt={2} bg={color("bg-medium")}>
             {this.props.collections.filter(
               c => c.id !== user.personal_collection_id,
             ).length > 0 ? (
@@ -193,11 +193,11 @@ class Overworld extends React.Component {
             )}
             <Link
               to="/collection/root"
-              color={normal.grey2}
+              color={color("text-medium")}
               className="text-brand-hover"
               data-metabase-event={`Homepage;Browse Items Clicked;`}
             >
-              <Flex color={colors["brand"]} p={2} my={1} align="center">
+              <Flex color={color("brand")} p={2} my={1} align="center">
                 <Box ml="auto" mr="auto">
                   <Flex align="center">
                     <h4>{t`Browse all items`}</h4>
@@ -223,19 +223,19 @@ class Overworld extends React.Component {
                       <GridItem w={[1, 1 / 3]} key={database.id}>
                         <Link
                           to={`browse/${database.id}`}
-                          hover={{ color: normal.blue }}
+                          hover={{ color: color("brand") }}
                           data-metabase-event={`Homepage;Browse DB Clicked; DB Type ${
                             database.engine
                           }`}
                         >
                           <Box
                             p={3}
-                            bg={colors["bg-medium"]}
+                            bg={color("bg-medium")}
                             className="hover-parent hover--visibility"
                           >
                             <Icon
                               name="database"
-                              color={normal.purple}
+                              color={color("database")}
                               mb={3}
                               size={28}
                             />
@@ -251,7 +251,7 @@ class Overworld extends React.Component {
                                     >
                                       <Icon
                                         name="reference"
-                                        color={normal.grey1}
+                                        color={color("text-light")}
                                       />
                                     </Link>
                                   </Tooltip>
@@ -301,13 +301,13 @@ export class AdminPinMessage extends React.Component {
         <SectionHeading>{t`Start here`}</SectionHeading>
 
         <Flex
-          bg={colors["bg-medium"]}
+          bg={color("bg-medium")}
           p={2}
           align="center"
           style={{ borderRadius: 6 }}
           className="hover-parent hover--visibility"
         >
-          <Icon name="dashboard" color={colors["brand"]} size={32} mr={1} />
+          <Icon name="dashboard" color={color("brand")} size={32} mr={1} />
           <Box ml={1}>
             <h3>{t`Your team's most important dashboards go here`}</h3>
             <p className="m0 mt1 text-medium text-bold">{jt`Pin dashboards in ${link} to have them appear in this space for everyone`}</p>
@@ -328,7 +328,7 @@ const SectionHeading = ({ children }) => (
   <Box mb={1}>
     <h5
       className="text-uppercase"
-      style={{ color: colors["text-medium"], fontWeight: 900 }}
+      style={{ color: color("text-medium"), fontWeight: 900 }}
     >
       {children}
     </h5>
diff --git a/frontend/src/metabase/containers/SaveQuestionModal.jsx b/frontend/src/metabase/containers/SaveQuestionModal.jsx
index 274b8f1cdaf..b16d17bc115 100644
--- a/frontend/src/metabase/containers/SaveQuestionModal.jsx
+++ b/frontend/src/metabase/containers/SaveQuestionModal.jsx
@@ -3,9 +3,9 @@ import PropTypes from "prop-types";
 
 import { CSSTransitionGroup } from "react-transition-group";
 
-import FormField from "metabase/components/form/FormField.jsx";
-import ModalContent from "metabase/components/ModalContent.jsx";
-import Radio from "metabase/components/Radio.jsx";
+import FormField from "metabase/components/form/FormField";
+import ModalContent from "metabase/components/ModalContent";
+import Radio from "metabase/components/Radio";
 import Button from "metabase/components/Button";
 import CollectionSelect from "metabase/containers/CollectionSelect";
 
diff --git a/frontend/src/metabase/containers/UndoListing.jsx b/frontend/src/metabase/containers/UndoListing.jsx
index 3f5f4c1e81a..4a296a2f4cc 100644
--- a/frontend/src/metabase/containers/UndoListing.jsx
+++ b/frontend/src/metabase/containers/UndoListing.jsx
@@ -8,7 +8,7 @@ import { Flex } from "grid-styled";
 import { t } from "ttag";
 import { capitalize, inflect } from "metabase/lib/formatting";
 
-import { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import { dismissUndo, performUndo } from "metabase/redux/undo";
 import { getUndos } from "metabase/selectors/undo";
 
@@ -84,8 +84,8 @@ export default class UndoListing extends Component {
               )}
               <Icon
                 ml={1}
-                color={normal.grey1}
-                hover={{ color: normal.grey2 }}
+                color={color("text-light")}
+                hover={{ color: color("text-medium") }}
                 name="close"
                 onClick={() => dismissUndo(undo.id)}
               />
diff --git a/frontend/src/metabase/containers/UserCollectionList.jsx b/frontend/src/metabase/containers/UserCollectionList.jsx
index 2048378af9b..c4baf25589a 100644
--- a/frontend/src/metabase/containers/UserCollectionList.jsx
+++ b/frontend/src/metabase/containers/UserCollectionList.jsx
@@ -2,7 +2,7 @@ import React from "react";
 import { Box, Flex } from "grid-styled";
 
 import * as Urls from "metabase/lib/urls";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import Card from "metabase/components/Card";
 import Icon from "metabase/components/Icon";
@@ -45,7 +45,7 @@ const UserCollectionList = () => (
                             <Icon
                               name="person"
                               mr={1}
-                              color={colors["text-medium"]}
+                              color={color("text-medium")}
                               size={18}
                             />
                             <h3>{user.common_name}</h3>
diff --git a/frontend/src/metabase/dashboard/components/AddSeriesModal.jsx b/frontend/src/metabase/dashboard/components/AddSeriesModal.jsx
index f836280d757..06477a1ca35 100644
--- a/frontend/src/metabase/dashboard/components/AddSeriesModal.jsx
+++ b/frontend/src/metabase/dashboard/components/AddSeriesModal.jsx
@@ -2,14 +2,14 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 
-import Visualization from "metabase/visualizations/components/Visualization.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
-import CheckBox from "metabase/components/CheckBox.jsx";
+import Visualization from "metabase/visualizations/components/Visualization";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import Icon from "metabase/components/Icon";
+import Tooltip from "metabase/components/Tooltip";
+import CheckBox from "metabase/components/CheckBox";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import * as Q_DEPRECATED from "metabase/lib/query";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import { getVisualizationRaw } from "metabase/visualizations";
 
@@ -263,7 +263,7 @@ export default class AddSeriesModal extends Component {
             {this.state.state && (
               <div
                 className="spred flex layout-centered"
-                style={{ backgroundColor: colors["bg-white"] }}
+                style={{ backgroundColor: color("bg-white") }}
               >
                 {this.state.state === "loading" ? (
                   <div className="h3 rounded bordered p3 bg-white shadowed">
@@ -294,13 +294,13 @@ export default class AddSeriesModal extends Component {
           className="border-left flex flex-column"
           style={{
             width: 370,
-            backgroundColor: colors["bg-light"],
-            borderColor: colors["border"],
+            backgroundColor: color("bg-light"),
+            borderColor: color("border"),
           }}
         >
           <div
             className="flex-no-shrink border-bottom flex flex-row align-center"
-            style={{ borderColor: colors["border"] }}
+            style={{ borderColor: color("border") }}
           >
             <Icon className="ml2" name="search" size={16} />
             <input
diff --git a/frontend/src/metabase/dashboard/components/AddToDashSelectQuestionModal.jsx b/frontend/src/metabase/dashboard/components/AddToDashSelectQuestionModal.jsx
index 818a4c8371e..3e378558c1d 100644
--- a/frontend/src/metabase/dashboard/components/AddToDashSelectQuestionModal.jsx
+++ b/frontend/src/metabase/dashboard/components/AddToDashSelectQuestionModal.jsx
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
-import AddToDashboard from "metabase/questions/containers/AddToDashboard.jsx";
+import AddToDashboard from "metabase/questions/containers/AddToDashboard";
 
 export default class AddToDashSelectQuestionModal extends Component {
   constructor(props, context) {
diff --git a/frontend/src/metabase/dashboard/components/DashCard.jsx b/frontend/src/metabase/dashboard/components/DashCard.jsx
index aab57cdc8c6..33bbe4cdd8b 100644
--- a/frontend/src/metabase/dashboard/components/DashCard.jsx
+++ b/frontend/src/metabase/dashboard/components/DashCard.jsx
@@ -6,15 +6,15 @@ import visualizations, { getVisualizationRaw } from "metabase/visualizations";
 import Visualization, {
   ERROR_MESSAGE_GENERIC,
   ERROR_MESSAGE_PERMISSION,
-} from "metabase/visualizations/components/Visualization.jsx";
+} from "metabase/visualizations/components/Visualization";
 import QueryDownloadWidget from "metabase/query_builder/components/QueryDownloadWidget";
 
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
-import { ChartSettingsWithState } from "metabase/visualizations/components/ChartSettings.jsx";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
+import { ChartSettingsWithState } from "metabase/visualizations/components/ChartSettings";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
-import DashCardParameterMapper from "./DashCardParameterMapper.jsx";
+import DashCardParameterMapper from "./DashCardParameterMapper";
 
 import { IS_EMBED_PREVIEW } from "metabase/lib/embed";
 
diff --git a/frontend/src/metabase/dashboard/components/DashCardParameterMapper.jsx b/frontend/src/metabase/dashboard/components/DashCardParameterMapper.jsx
index e85ab03e284..87c8e53e012 100644
--- a/frontend/src/metabase/dashboard/components/DashCardParameterMapper.jsx
+++ b/frontend/src/metabase/dashboard/components/DashCardParameterMapper.jsx
@@ -1,9 +1,9 @@
 import React from "react";
 import { t } from "ttag";
 
-import DashCardCardParameterMapper from "../containers/DashCardCardParameterMapper.jsx";
+import DashCardCardParameterMapper from "../containers/DashCardCardParameterMapper";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const DashCardParameterMapper = ({ dashcard }) => (
   <div className="relative flex-full flex flex-column layout-centered">
@@ -11,8 +11,8 @@ const DashCardParameterMapper = ({ dashcard }) => (
       <div
         className="mx4 my1 p1 rounded"
         style={{
-          backgroundColor: colors["bg-light"],
-          color: colors["text-medium"],
+          backgroundColor: color("bg-light"),
+          color: color("text-medium"),
           marginTop: -10,
         }}
       >
diff --git a/frontend/src/metabase/dashboard/components/Dashboard.jsx b/frontend/src/metabase/dashboard/components/Dashboard.jsx
index ccf06356e7e..9b0d0accaa2 100644
--- a/frontend/src/metabase/dashboard/components/Dashboard.jsx
+++ b/frontend/src/metabase/dashboard/components/Dashboard.jsx
@@ -6,11 +6,11 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Box } from "grid-styled";
 
-import DashboardHeader from "../components/DashboardHeader.jsx";
-import DashboardGrid from "../components/DashboardGrid.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import DashboardHeader from "../components/DashboardHeader";
+import DashboardGrid from "../components/DashboardGrid";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import { t } from "ttag";
-import Parameters from "metabase/parameters/components/Parameters.jsx";
+import Parameters from "metabase/parameters/components/Parameters";
 import EmptyState from "metabase/components/EmptyState";
 
 import DashboardControls from "../hoc/DashboardControls";
diff --git a/frontend/src/metabase/dashboard/components/DashboardGrid.jsx b/frontend/src/metabase/dashboard/components/DashboardGrid.jsx
index 3acd7ba1700..355a6df2149 100644
--- a/frontend/src/metabase/dashboard/components/DashboardGrid.jsx
+++ b/frontend/src/metabase/dashboard/components/DashboardGrid.jsx
@@ -1,13 +1,13 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import GridLayout from "./grid/GridLayout.jsx";
-import DashCard from "./DashCard.jsx";
+import GridLayout from "./grid/GridLayout";
+import DashCard from "./DashCard";
 
-import Modal from "metabase/components/Modal.jsx";
-import ExplicitSize from "metabase/components/ExplicitSize.jsx";
-import RemoveFromDashboardModal from "./RemoveFromDashboardModal.jsx";
-import AddSeriesModal from "./AddSeriesModal.jsx";
+import Modal from "metabase/components/Modal";
+import ExplicitSize from "metabase/components/ExplicitSize";
+import RemoveFromDashboardModal from "./RemoveFromDashboardModal";
+import AddSeriesModal from "./AddSeriesModal";
 
 import { getVisualizationRaw } from "metabase/visualizations";
 import MetabaseAnalytics from "metabase/lib/analytics";
diff --git a/frontend/src/metabase/dashboard/components/DashboardMoveModal.jsx b/frontend/src/metabase/dashboard/components/DashboardMoveModal.jsx
index 848652083b4..fa39b757bca 100644
--- a/frontend/src/metabase/dashboard/components/DashboardMoveModal.jsx
+++ b/frontend/src/metabase/dashboard/components/DashboardMoveModal.jsx
@@ -9,7 +9,7 @@ import Link from "metabase/components/Link";
 import CollectionMoveModal from "metabase/containers/CollectionMoveModal";
 
 import * as Urls from "metabase/lib/urls";
-import { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import Dashboards from "metabase/entities/dashboards";
 import { ROOT_COLLECTION } from "metabase/entities/collections";
@@ -55,7 +55,7 @@ const DashbordMoveToast = ({ collection }) => (
     {jt`Dashboard moved to ${(
       <Link
         ml={1}
-        color={normal.blue}
+        color={color("brand")}
         to={Urls.collection(collection && collection.id)}
       >
         {collection ? collection.name : ROOT_COLLECTION.name}
diff --git a/frontend/src/metabase/dashboard/components/RefreshWidget.jsx b/frontend/src/metabase/dashboard/components/RefreshWidget.jsx
index 875ac2e66f8..a4aa03154bb 100644
--- a/frontend/src/metabase/dashboard/components/RefreshWidget.jsx
+++ b/frontend/src/metabase/dashboard/components/RefreshWidget.jsx
@@ -1,11 +1,11 @@
 import React, { Component } from "react";
 import styles from "./RefreshWidget.css";
 
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import ClockIcon from "metabase/components/icons/ClockIcon.jsx";
-import CountdownIcon from "metabase/components/icons/CountdownIcon.jsx";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import Tooltip from "metabase/components/Tooltip";
+import Icon from "metabase/components/Icon";
+import ClockIcon from "metabase/components/icons/ClockIcon";
+import CountdownIcon from "metabase/components/icons/CountdownIcon";
 import { t } from "ttag";
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/dashboard/components/grid/GridLayout.jsx b/frontend/src/metabase/dashboard/components/grid/GridLayout.jsx
index a7208e8e242..9db4e1ae42c 100644
--- a/frontend/src/metabase/dashboard/components/grid/GridLayout.jsx
+++ b/frontend/src/metabase/dashboard/components/grid/GridLayout.jsx
@@ -1,10 +1,10 @@
 import React, { Component } from "react";
 import ReactDOM from "react-dom";
 
-import GridItem from "./GridItem.jsx";
+import GridItem from "./GridItem";
 
 import _ from "underscore";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export default class GridLayout extends Component {
   constructor(props, context) {
@@ -238,9 +238,9 @@ export default class GridLayout extends Component {
       _(cols)
         .times(
           i =>
-            `<rect stroke='${
-              colors["border"]
-            }' stroke-width='1' fill='none' x='${Math.round(
+            `<rect stroke='${color(
+              "border",
+            )}' stroke-width='1' fill='none' x='${Math.round(
               margin / 2 + i * cellSize.width,
             ) + 1.5}' y='${margin / 2 + 1.5}' width='${Math.round(
               cellSize.width - margin - 3,
diff --git a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
index 5eb13f59c07..9913e39ce9d 100644
--- a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
+++ b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
@@ -28,7 +28,7 @@ import * as Urls from "metabase/lib/urls";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import * as Q from "metabase/lib/query/query";
 import Dimension from "metabase-lib/lib/Dimension";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import { dissoc } from "icepick";
 
@@ -247,7 +247,7 @@ const SuggestionsList = ({ suggestions, section }) => (
         {suggestions[s].length > 0 &&
           suggestions[s].map((item, itemIndex) => (
             <Link
-              hover={{ color: colors["brand"] }}
+              hover={{ color: color("brand") }}
               key={itemIndex}
               to={item.url}
               className="block hover-parent hover--visibility"
@@ -258,14 +258,14 @@ const SuggestionsList = ({ suggestions, section }) => (
                 <Flex align="center">
                   <Icon
                     name={RELATED_CONTENT[s].icon}
-                    color={colors["accent4"]}
+                    color={color("accent4")}
                     mr={1}
                     size={22}
                   />
                   <h4 className="text-wrap">{item.title}</h4>
                   <Box ml="auto" className="hover-child">
                     <Tooltip tooltip={item.description}>
-                      <Icon name="question" color={colors["bg-dark"]} />
+                      <Icon name="question" color={color("bg-dark")} />
                     </Tooltip>
                   </Box>
                 </Flex>
@@ -282,7 +282,7 @@ const SuggetsionSectionHeading = ({ children }) => (
     style={{
       fontWeight: 900,
       textTransform: "uppercase",
-      color: colors["text-medium"],
+      color: color("text-medium"),
     }}
     className="mb1"
   >
diff --git a/frontend/src/metabase/dashboard/containers/DashCardCardParameterMapper.jsx b/frontend/src/metabase/dashboard/containers/DashCardCardParameterMapper.jsx
index a3024a655b7..0eaaf28880d 100644
--- a/frontend/src/metabase/dashboard/containers/DashCardCardParameterMapper.jsx
+++ b/frontend/src/metabase/dashboard/containers/DashCardCardParameterMapper.jsx
@@ -6,10 +6,10 @@ import { connect } from "react-redux";
 import { t } from "ttag";
 import S from "./DashCardCardParameterMapper.css";
 
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import AccordionList from "metabase/components/AccordionList.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import Icon from "metabase/components/Icon";
+import AccordionList from "metabase/components/AccordionList";
+import Tooltip from "metabase/components/Tooltip";
 
 import { fetchDatabaseMetadata } from "metabase/redux/metadata";
 
diff --git a/frontend/src/metabase/dashboard/containers/DashboardApp.jsx b/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
index a42b978a6a9..452a52be515 100644
--- a/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
+++ b/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
@@ -5,7 +5,7 @@ import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import title from "metabase/hoc/Title";
 
-import Dashboard from "metabase/dashboard/components/Dashboard.jsx";
+import Dashboard from "metabase/dashboard/components/Dashboard";
 
 import { fetchDatabaseMetadata } from "metabase/redux/metadata";
 import { setErrorPage } from "metabase/redux/app";
diff --git a/frontend/src/metabase/entities/collections.js b/frontend/src/metabase/entities/collections.js
index ff40e74de34..b2d8cd3457c 100644
--- a/frontend/src/metabase/entities/collections.js
+++ b/frontend/src/metabase/entities/collections.js
@@ -2,7 +2,7 @@
 
 import { createEntity, undo } from "metabase/lib/entities";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import * as Urls from "metabase/lib/urls";
 
 import { CollectionSchema } from "metabase/schema";
@@ -86,7 +86,7 @@ const Collections = createEntity({
   form: {
     fields: (
       values = {
-        color: colors.brand,
+        color: color("brand"),
       },
     ) => [
       {
@@ -108,7 +108,7 @@ const Collections = createEntity({
         name: "color",
         title: t`Color`,
         type: "hidden",
-        initial: () => colors.brand,
+        initial: () => color("brand"),
         validate: color => !color && t`Color is required`,
       },
       {
diff --git a/frontend/src/metabase/entities/dashboards.js b/frontend/src/metabase/entities/dashboards.js
index ad8d214ce35..0abb9e08c1c 100644
--- a/frontend/src/metabase/entities/dashboards.js
+++ b/frontend/src/metabase/entities/dashboards.js
@@ -9,7 +9,7 @@ import {
 
 import { createEntity, undo } from "metabase/lib/entities";
 import * as Urls from "metabase/lib/urls";
-import { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import { assocIn } from "icepick";
 import { t } from "ttag";
 
@@ -132,7 +132,7 @@ const Dashboards = createEntity({
     getName: dashboard => dashboard && dashboard.name,
     getUrl: dashboard => dashboard && Urls.dashboard(dashboard.id),
     getIcon: dashboard => "dashboard",
-    getColor: () => normal.blue,
+    getColor: () => color("dashboard"),
   },
 
   form: {
diff --git a/frontend/src/metabase/entities/metrics.js b/frontend/src/metabase/entities/metrics.js
index 3a35fcb5662..0dfd89c2cb1 100644
--- a/frontend/src/metabase/entities/metrics.js
+++ b/frontend/src/metabase/entities/metrics.js
@@ -1,7 +1,7 @@
 import { createEntity } from "metabase/lib/entities";
 
 import { MetricSchema } from "metabase/schema";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import * as Urls from "metabase/lib/urls";
 
 const Metrics = createEntity({
@@ -26,7 +26,7 @@ const Metrics = createEntity({
     getName: metric => metric && metric.name,
     getUrl: metric =>
       Urls.tableRowsQuery(metric.database_id, metric.table_id, metric.id),
-    getColor: metric => colors["accent1"],
+    getColor: metric => color("accent1"),
     getIcon: metric => "sum",
   },
 
diff --git a/frontend/src/metabase/entities/pulses.js b/frontend/src/metabase/entities/pulses.js
index 0aebd4d7bb6..8845f407a6e 100644
--- a/frontend/src/metabase/entities/pulses.js
+++ b/frontend/src/metabase/entities/pulses.js
@@ -1,6 +1,6 @@
 import { createEntity, undo } from "metabase/lib/entities";
 import * as Urls from "metabase/lib/urls";
-import { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import {
   canonicalCollectionId,
@@ -41,7 +41,7 @@ const Pulses = createEntity({
     getName: pulse => pulse && pulse.name,
     getUrl: pulse => pulse && Urls.pulse(pulse.id),
     getIcon: pulse => "pulse",
-    getColor: pulse => normal.yellow,
+    getColor: pulse => color("pulse"),
   },
 
   form: {
diff --git a/frontend/src/metabase/entities/questions.js b/frontend/src/metabase/entities/questions.js
index 962ed1a2498..351d979a30f 100644
--- a/frontend/src/metabase/entities/questions.js
+++ b/frontend/src/metabase/entities/questions.js
@@ -4,7 +4,7 @@ import { assocIn } from "icepick";
 
 import { createEntity, undo } from "metabase/lib/entities";
 import * as Urls from "metabase/lib/urls";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import {
   canonicalCollectionId,
@@ -64,7 +64,7 @@ const Questions = createEntity({
   objectSelectors: {
     getName: question => question && question.name,
     getUrl: question => question && Urls.question(question.id),
-    getColor: () => colors["text-medium"],
+    getColor: () => color("text-medium"),
     getIcon: question =>
       (require("metabase/visualizations").default.get(question.display) || {})
         .iconName || "beaker",
diff --git a/frontend/src/metabase/entities/segments.js b/frontend/src/metabase/entities/segments.js
index b5ea283c9c5..21fb5615ec0 100644
--- a/frontend/src/metabase/entities/segments.js
+++ b/frontend/src/metabase/entities/segments.js
@@ -3,7 +3,7 @@
 import { createEntity } from "metabase/lib/entities";
 
 import { SegmentSchema } from "metabase/schema";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import * as Urls from "metabase/lib/urls";
 
 const Segments = createEntity({
@@ -33,7 +33,7 @@ const Segments = createEntity({
         null,
         segment.id,
       ),
-    getColor: segment => colors["accent7"],
+    getColor: segment => color("accent7"),
     getIcon: segment => "segment",
   },
 
diff --git a/frontend/src/metabase/entities/tables.js b/frontend/src/metabase/entities/tables.js
index 1f19a26cf81..6417822dc13 100644
--- a/frontend/src/metabase/entities/tables.js
+++ b/frontend/src/metabase/entities/tables.js
@@ -9,7 +9,7 @@ import {
 import _ from "underscore";
 
 import * as Urls from "metabase/lib/urls";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import { createSelector } from "reselect";
 
@@ -172,7 +172,7 @@ const Tables = createEntity({
     getUrl: table =>
       Urls.tableRowsQuery(table.database_id, table.table_id, null),
     getIcon: table => "table",
-    getColor: table => colors["accent2"],
+    getColor: table => color("accent2"),
   },
 
   selectors: {
diff --git a/frontend/src/metabase/home/components/Activity.jsx b/frontend/src/metabase/home/components/Activity.jsx
index 4aee6c711ee..50caa2feec8 100644
--- a/frontend/src/metabase/home/components/Activity.jsx
+++ b/frontend/src/metabase/home/components/Activity.jsx
@@ -4,11 +4,11 @@ import { Link } from "react-router";
 import _ from "underscore";
 import { t } from "ttag";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
-import ActivityItem from "./ActivityItem.jsx";
-import ActivityStory from "./ActivityStory.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import ActivityItem from "./ActivityItem";
+import ActivityStory from "./ActivityStory";
 
 import * as Urls from "metabase/lib/urls";
 
@@ -18,12 +18,12 @@ export default class Activity extends Component {
     this.state = { error: null, userColors: {} };
 
     this.colorClasses = [
-      colors["brand"],
-      colors["accent1"],
-      colors["accent2"],
-      colors["accent3"],
-      colors["accent4"],
-      colors["accent5"],
+      color("brand"),
+      color("accent1"),
+      color("accent2"),
+      color("accent3"),
+      color("accent4"),
+      color("accent5"),
     ];
   }
 
diff --git a/frontend/src/metabase/home/components/ActivityItem.jsx b/frontend/src/metabase/home/components/ActivityItem.jsx
index 3b00919ca02..bfee02ee4f9 100644
--- a/frontend/src/metabase/home/components/ActivityItem.jsx
+++ b/frontend/src/metabase/home/components/ActivityItem.jsx
@@ -1,9 +1,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
-import Icon from "metabase/components/Icon.jsx";
-import IconBorder from "metabase/components/IconBorder.jsx";
-import UserAvatar from "metabase/components/UserAvatar.jsx";
-import colors from "metabase/lib/colors";
+import Icon from "metabase/components/Icon";
+import IconBorder from "metabase/components/IconBorder";
+import UserAvatar from "metabase/components/UserAvatar";
+import { color } from "metabase/lib/colors";
 
 export default class ActivityItem extends Component {
   static propTypes = {
@@ -21,7 +21,7 @@ export default class ActivityItem extends Component {
           {item.user ? (
             <UserAvatar user={item.user} bg={userColors} />
           ) : (
-            <IconBorder style={{ color: colors["text-light"] }}>
+            <IconBorder style={{ color: color("text-light") }}>
               <Icon name="sync" size={16} />
             </IconBorder>
           )}
diff --git a/frontend/src/metabase/home/components/ActivityStory.jsx b/frontend/src/metabase/home/components/ActivityStory.jsx
index a95cfa56c54..c4bd0824d72 100644
--- a/frontend/src/metabase/home/components/ActivityStory.jsx
+++ b/frontend/src/metabase/home/components/ActivityStory.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Link } from "react-router";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export default class ActivityStory extends Component {
   constructor(props, context) {
@@ -9,7 +9,7 @@ export default class ActivityStory extends Component {
 
     this.styles = {
       borderWidth: "2px",
-      borderColor: colors["border"],
+      borderColor: color("border"),
     };
   }
 
@@ -30,7 +30,7 @@ export default class ActivityStory extends Component {
         style={{
           borderWidth: "3px",
           marginLeft: "22px",
-          borderColor: colors["border"],
+          borderColor: color("border"),
         }}
       >
         <div className="flex full ml4 bordered rounded p2" style={this.styles}>
diff --git a/frontend/src/metabase/home/components/NewUserOnboardingModal.jsx b/frontend/src/metabase/home/components/NewUserOnboardingModal.jsx
index d5d60a6b025..f92c84eae8a 100644
--- a/frontend/src/metabase/home/components/NewUserOnboardingModal.jsx
+++ b/frontend/src/metabase/home/components/NewUserOnboardingModal.jsx
@@ -4,7 +4,7 @@ import StepIndicators from "metabase/components/StepIndicators";
 import RetinaImage from "react-retina-image";
 import { t } from "ttag";
 import MetabaseSettings from "metabase/lib/settings";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 type Props = {
   onClose: () => void,
@@ -107,8 +107,8 @@ const OnboardingImages = ({ currentStep }, { currentStep: object }) => (
   <div
     style={{
       position: "relative",
-      backgroundColor: colors["bg-medium"],
-      borderBottom: `1px solid ${colors["border"]}`,
+      backgroundColor: color("bg-medium"),
+      borderBottom: `1px solid ${color("border")}`,
       height: 254,
       paddingTop: "3em",
       paddingBottom: "3em",
diff --git a/frontend/src/metabase/home/components/NextStep.jsx b/frontend/src/metabase/home/components/NextStep.jsx
index 4722b1a478c..9833661bcff 100644
--- a/frontend/src/metabase/home/components/NextStep.jsx
+++ b/frontend/src/metabase/home/components/NextStep.jsx
@@ -4,7 +4,7 @@ import { t } from "ttag";
 
 import { SetupApi } from "metabase/services";
 
-import SidebarSection from "./SidebarSection.jsx";
+import SidebarSection from "./SidebarSection";
 
 export default class NextStep extends Component {
   constructor(props, context) {
diff --git a/frontend/src/metabase/home/components/RecentViews.jsx b/frontend/src/metabase/home/components/RecentViews.jsx
index c829102f02b..0dbe3a12017 100644
--- a/frontend/src/metabase/home/components/RecentViews.jsx
+++ b/frontend/src/metabase/home/components/RecentViews.jsx
@@ -2,13 +2,13 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 import Ellipsified from "metabase/components/Ellipsified";
 import Link from "metabase/components/Link";
-import SidebarSection from "./SidebarSection.jsx";
+import SidebarSection from "./SidebarSection";
 import * as Urls from "metabase/lib/urls";
 
-import { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export default class RecentViews extends Component {
   static propTypes = {
@@ -49,7 +49,9 @@ export default class RecentViews extends Component {
                     size={18}
                     style={{
                       color:
-                        iconName === "dashboard" ? normal.purple : normal.blue,
+                        iconName === "dashboard"
+                          ? color("dashboard")
+                          : color("brand"),
                     }}
                   />
                   <Link
diff --git a/frontend/src/metabase/home/components/SidebarSection.jsx b/frontend/src/metabase/home/components/SidebarSection.jsx
index 64de827720c..76743b24e92 100644
--- a/frontend/src/metabase/home/components/SidebarSection.jsx
+++ b/frontend/src/metabase/home/components/SidebarSection.jsx
@@ -1,7 +1,7 @@
 import React from "react";
 
-import Icon from "metabase/components/Icon.jsx";
-import colors from "metabase/lib/colors";
+import Icon from "metabase/components/Icon";
+import { color } from "metabase/lib/colors";
 
 const SidebarSection = ({ title, icon, extra, children }) => (
   <div className="px2 pt1">
@@ -12,7 +12,7 @@ const SidebarSection = ({ title, icon, extra, children }) => (
     </div>
     <div
       className="rounded bg-white"
-      style={{ border: `1px solid ${colors["border"]}` }}
+      style={{ border: `1px solid ${color("border")}` }}
     >
       {children}
     </div>
diff --git a/frontend/src/metabase/home/containers/SearchApp.jsx b/frontend/src/metabase/home/containers/SearchApp.jsx
index b12e483a765..29ced20aa52 100644
--- a/frontend/src/metabase/home/containers/SearchApp.jsx
+++ b/frontend/src/metabase/home/containers/SearchApp.jsx
@@ -15,7 +15,7 @@ import EntityItem from "metabase/components/EntityItem";
 import Subhead from "metabase/components/Subhead";
 import { FILTERS } from "metabase/components/ItemTypeFilterBar";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import Icon from "metabase/components/Icon";
 
 const PAGE_PADDING = [1, 2, 4];
@@ -103,7 +103,7 @@ export default class SearchApp extends React.Component {
                     <Link
                       className="flex align-center"
                       mb={3}
-                      color={!location.query.type ? colors.brand : "inherit"}
+                      color={!location.query.type ? color("brand") : "inherit"}
                       to={{
                         pathname: location.pathname,
                         query: { ...location.query, type: null },
@@ -120,8 +120,8 @@ export default class SearchApp extends React.Component {
                       }
 
                       const color = isActive
-                        ? colors.brand
-                        : colors["text-medium"];
+                        ? color("brand")
+                        : color("text-medium");
 
                       return (
                         <Link
@@ -158,7 +158,7 @@ const SearchResultSection = ({ title, items }) => (
         case "segment":
         case "metric":
           extraInfo = (
-            <Flex align="center" color={colors["text-medium"]}>
+            <Flex align="center" color={color("text-medium")}>
               <Icon name="database" size={8} mr="4px" />
               <span className="text-small text-bold" style={{ lineHeight: 1 }}>
                 <Database.Name id={item.database_id} />
@@ -171,7 +171,7 @@ const SearchResultSection = ({ title, items }) => (
         default:
           extraInfo = (
             <div className="inline-block">
-              <Flex align="center" color={colors["text-medium"]}>
+              <Flex align="center" color={color("text-medium")}>
                 <Icon name="all" size={10} mr="4px" />
                 <span
                   className="text-small text-bold"
diff --git a/frontend/src/metabase/lib/colors.js b/frontend/src/metabase/lib/colors.js
index 286375410f5..1db7276779b 100644
--- a/frontend/src/metabase/lib/colors.js
+++ b/frontend/src/metabase/lib/colors.js
@@ -52,6 +52,9 @@ export default colors;
 export const aliases = {
   summarize: "accent1",
   filter: "accent7",
+  database: "accent2",
+  dashboard: "brand",
+  pulse: "accent4",
 };
 
 export const harmony = [];
diff --git a/frontend/src/metabase/lib/dataset.js b/frontend/src/metabase/lib/dataset.js
index 534caf2797e..c32dce705c1 100644
--- a/frontend/src/metabase/lib/dataset.js
+++ b/frontend/src/metabase/lib/dataset.js
@@ -80,9 +80,6 @@ export function fieldRefForColumnWithLegacyFallback(
 /**
  * Returns a MBQL field reference (FieldReference) for a given result dataset column
  *
- * NOTE: this returns non-normalized ["fk->", 1, 2] style fk field references
- * which is unfortunately used in table.columns visualization_settings
- *
  * @param  {Column} column Dataset result column
  * @param  {?Column[]} columns Full array of columns, unfortunately needed to determine the aggregation index
  * @return {?FieldReference} MBQL field reference
diff --git a/frontend/src/metabase/lib/formatting.js b/frontend/src/metabase/lib/formatting.js
index 9b30fa8b99a..b80ad1ff3b2 100644
--- a/frontend/src/metabase/lib/formatting.js
+++ b/frontend/src/metabase/lib/formatting.js
@@ -10,7 +10,7 @@ import { ngettext, msgid } from "ttag";
 import Mustache from "mustache";
 import ReactMarkdown from "react-markdown";
 
-import ExternalLink from "metabase/components/ExternalLink.jsx";
+import ExternalLink from "metabase/components/ExternalLink";
 
 import {
   isDate,
diff --git a/frontend/src/metabase/lib/query_time.js b/frontend/src/metabase/lib/query_time.js
index bb4fad139b2..3b99ff589d2 100644
--- a/frontend/src/metabase/lib/query_time.js
+++ b/frontend/src/metabase/lib/query_time.js
@@ -69,7 +69,7 @@ export function expandTimeIntervalFilter(filter) {
     n = 1;
   }
 
-  field = ["datetime-field", field, "as", unit];
+  field = ["datetime-field", field, unit];
 
   if (n < -1) {
     return [
diff --git a/frontend/src/metabase/modes/components/actions/CountByTimeAction.jsx b/frontend/src/metabase/modes/components/actions/CountByTimeAction.jsx
index a71dfa7a591..4473ff01a0c 100644
--- a/frontend/src/metabase/modes/components/actions/CountByTimeAction.jsx
+++ b/frontend/src/metabase/modes/components/actions/CountByTimeAction.jsx
@@ -31,12 +31,7 @@ export default ({ question }: ClickActionProps): ClickAction[] => {
       question: () =>
         question
           .summarize(["count"])
-          .breakout([
-            "datetime-field",
-            ["field-id", dateField.id],
-            "as",
-            "day",
-          ]),
+          .breakout(["datetime-field", ["field-id", dateField.id], "day"]),
     },
   ];
 };
diff --git a/frontend/src/metabase/modes/lib/actions.js b/frontend/src/metabase/modes/lib/actions.js
index 2614dd6de83..fd430ef3494 100644
--- a/frontend/src/metabase/modes/lib/actions.js
+++ b/frontend/src/metabase/modes/lib/actions.js
@@ -127,7 +127,7 @@ export const drillFilter = (card, value, column) => {
   if (isDate(column)) {
     filter = [
       "=",
-      ["datetime-field", getFieldRefFromColumn(column), "as", column.unit],
+      ["datetime-field", getFieldRefFromColumn(column), column.unit],
       parseTimestamp(value, column.unit).format(),
     ];
   } else {
@@ -293,12 +293,7 @@ export const updateDateTimeFilter = (card, column, start, end): CardObject => {
     }
 
     // update the breakout
-    newCard = addOrUpdateBreakout(newCard, [
-      "datetime-field",
-      fieldRef,
-      "as",
-      unit,
-    ]);
+    newCard = addOrUpdateBreakout(newCard, ["datetime-field", fieldRef, unit]);
 
     // round to start of the original unit
     start = start.startOf(column.unit);
@@ -311,14 +306,14 @@ export const updateDateTimeFilter = (card, column, start, end): CardObject => {
       // is the start and end are the same (in whatever the original unit was) then just do an "="
       return addOrUpdateFilter(newCard, [
         "=",
-        ["datetime-field", fieldRef, "as", column.unit],
+        ["datetime-field", fieldRef, column.unit],
         start.format(),
       ]);
     } else {
       // otherwise do a between
       return addOrUpdateFilter(newCard, [
         "between",
-        ["datetime-field", fieldRef, "as", column.unit],
+        ["datetime-field", fieldRef, column.unit],
         start.format(),
         end.format(),
       ]);
diff --git a/frontend/src/metabase/nav/containers/Navbar.jsx b/frontend/src/metabase/nav/containers/Navbar.jsx
index ab0509001e1..0898d9fca76 100644
--- a/frontend/src/metabase/nav/containers/Navbar.jsx
+++ b/frontend/src/metabase/nav/containers/Navbar.jsx
@@ -10,10 +10,9 @@ import { t } from "ttag";
 import { Flex } from "grid-styled";
 import styled from "styled-components";
 import { space } from "styled-system";
-import color from "color";
 
 import * as Urls from "metabase/lib/urls";
-import colors, { darken } from "metabase/lib/colors";
+import { color, darken, lighten } from "metabase/lib/colors";
 
 import Icon, { IconWrapper } from "metabase/components/Icon";
 import Link from "metabase/components/Link";
@@ -61,12 +60,8 @@ const AdminNavItem = ({ name, path, currentPath }) => (
   </li>
 );
 
-const DefaultSearchColor = color(colors.brand)
-  .lighten(0.07)
-  .string();
-const ActiveSearchColor = color(colors.brand)
-  .lighten(0.1)
-  .string();
+const DefaultSearchColor = lighten("brand", 0.07);
+const ActiveSearchColor = lighten("brand", 0.1);
 
 const SearchWrapper = Flex.extend`
   background-color: ${props =>
@@ -93,7 +88,7 @@ const SearchInput = styled.input`
     outline: none;
   }
   &::placeholder {
-    color: ${colors["text-white"]};
+    color: ${color("text-white")};
   }
 `;
 
@@ -316,7 +311,7 @@ export default class Navbar extends Component {
               to={Urls.newQuestionFlow()}
               p={1}
               hover={{
-                backgroundColor: darken(colors["brand"]),
+                backgroundColor: darken(color("brand")),
               }}
               className="flex align-center rounded transition-background"
               data-metabase-event={`NavBar;New Question`}
@@ -333,7 +328,7 @@ export default class Navbar extends Component {
               className="flex align-center rounded transition-background"
               data-metabase-event={`NavBar;Data Browse`}
               hover={{
-                backgroundColor: darken(colors["brand"]),
+                backgroundColor: darken(color("brand")),
               }}
             >
               <Icon name="table_spaced" size={14} />
diff --git a/frontend/src/metabase/new_query/components/NewQueryOption.jsx b/frontend/src/metabase/new_query/components/NewQueryOption.jsx
index 3ee6d8d9946..34565b3be57 100644
--- a/frontend/src/metabase/new_query/components/NewQueryOption.jsx
+++ b/frontend/src/metabase/new_query/components/NewQueryOption.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import cx from "classnames";
 import { Link } from "react-router";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export default class NewQueryOption extends Component {
   props: {
@@ -26,8 +26,8 @@ export default class NewQueryOption extends Component {
         style={{
           boxSizing: "border-box",
           boxShadow: hover
-            ? `0 3px 8px 0 ${colors["text-light"]}`
-            : `0 1px 3px 0 ${colors["text-light"]}`,
+            ? `0 3px 8px 0 ${color("text-light")}`
+            : `0 1px 3px 0 ${color("text-light")}`,
           height: 340,
         }}
         onMouseOver={() => this.setState({ hover: true })}
diff --git a/frontend/src/metabase/parameters/components/ParameterValueWidget.jsx b/frontend/src/metabase/parameters/components/ParameterValueWidget.jsx
index 2cb805d650a..b50cf23b87a 100644
--- a/frontend/src/metabase/parameters/components/ParameterValueWidget.jsx
+++ b/frontend/src/metabase/parameters/components/ParameterValueWidget.jsx
@@ -5,16 +5,16 @@ import PropTypes from "prop-types";
 import { connect } from "react-redux";
 import { t } from "ttag";
 
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import DateSingleWidget from "./widgets/DateSingleWidget.jsx";
-import DateRangeWidget from "./widgets/DateRangeWidget.jsx";
-import DateRelativeWidget from "./widgets/DateRelativeWidget.jsx";
-import DateMonthYearWidget from "./widgets/DateMonthYearWidget.jsx";
-import DateQuarterYearWidget from "./widgets/DateQuarterYearWidget.jsx";
-import DateAllOptionsWidget from "./widgets/DateAllOptionsWidget.jsx";
-import CategoryWidget from "./widgets/CategoryWidget.jsx";
-import TextWidget from "./widgets/TextWidget.jsx";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import Icon from "metabase/components/Icon";
+import DateSingleWidget from "./widgets/DateSingleWidget";
+import DateRangeWidget from "./widgets/DateRangeWidget";
+import DateRelativeWidget from "./widgets/DateRelativeWidget";
+import DateMonthYearWidget from "./widgets/DateMonthYearWidget";
+import DateQuarterYearWidget from "./widgets/DateQuarterYearWidget";
+import DateAllOptionsWidget from "./widgets/DateAllOptionsWidget";
+import CategoryWidget from "./widgets/CategoryWidget";
+import TextWidget from "./widgets/TextWidget";
 import ParameterFieldWidget from "./widgets/ParameterFieldWidget";
 
 import { fetchField, fetchFieldValues } from "metabase/redux/metadata";
diff --git a/frontend/src/metabase/parameters/components/ParameterWidget.jsx b/frontend/src/metabase/parameters/components/ParameterWidget.jsx
index 69215f0f77e..3298b9cbd6f 100644
--- a/frontend/src/metabase/parameters/components/ParameterWidget.jsx
+++ b/frontend/src/metabase/parameters/components/ParameterWidget.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import ParameterValueWidget from "./ParameterValueWidget.jsx";
-import Icon from "metabase/components/Icon.jsx";
+import ParameterValueWidget from "./ParameterValueWidget";
+import Icon from "metabase/components/Icon";
 
 import S from "./ParameterWidget.css";
 import cx from "classnames";
diff --git a/frontend/src/metabase/parameters/components/Parameters.jsx b/frontend/src/metabase/parameters/components/Parameters.jsx
index 1dae670bb39..294fec3262c 100644
--- a/frontend/src/metabase/parameters/components/Parameters.jsx
+++ b/frontend/src/metabase/parameters/components/Parameters.jsx
@@ -2,9 +2,9 @@
 
 import React, { Component } from "react";
 
-import StaticParameterWidget from "./ParameterWidget.jsx";
+import StaticParameterWidget from "./ParameterWidget";
 import Icon from "metabase/components/Icon";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import querystring from "querystring";
 import cx from "classnames";
@@ -215,7 +215,7 @@ const SortableParameterHandle = SortableHandle(() => (
   <div
     className="absolute top bottom left flex layout-centered hover-child cursor-grab"
     style={{
-      color: colors["border"],
+      color: color("border"),
       // width should match the left padding of the ParameterWidget container class so that it's centered
       width: "1em",
       marginLeft: "1px",
diff --git a/frontend/src/metabase/parameters/components/widgets/CategoryWidget.jsx b/frontend/src/metabase/parameters/components/widgets/CategoryWidget.jsx
index c2dbd3dec1a..da86242943b 100644
--- a/frontend/src/metabase/parameters/components/widgets/CategoryWidget.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/CategoryWidget.jsx
@@ -8,7 +8,7 @@ import { t, ngettext, msgid } from "ttag";
 import { createMultiwordSearchRegex } from "metabase/lib/string";
 import { getHumanReadableValue } from "metabase/lib/query/field";
 
-import SelectPicker from "../../../query_builder/components/filters/pickers/SelectPicker.jsx";
+import SelectPicker from "../../../query_builder/components/filters/pickers/SelectPicker";
 
 type Props = {
   value: any,
diff --git a/frontend/src/metabase/parameters/components/widgets/DateAllOptionsWidget.jsx b/frontend/src/metabase/parameters/components/widgets/DateAllOptionsWidget.jsx
index 68f3e1924cb..ab50aa71e0c 100644
--- a/frontend/src/metabase/parameters/components/widgets/DateAllOptionsWidget.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/DateAllOptionsWidget.jsx
@@ -6,12 +6,12 @@ import { t } from "ttag";
 import DatePicker, {
   DATE_OPERATORS,
   getOperator,
-} from "metabase/query_builder/components/filters/pickers/DatePicker.jsx";
-import FilterOptions from "metabase/query_builder/components/filters/FilterOptions.jsx";
+} from "metabase/query_builder/components/filters/pickers/DatePicker";
+import FilterOptions from "metabase/query_builder/components/filters/FilterOptions";
 import { generateTimeFilterValuesDescriptions } from "metabase/lib/query_time";
 import { dateParameterValueToMBQL } from "metabase/meta/Parameter";
 
-import type { OperatorName } from "metabase/query_builder/components/filters/pickers/DatePicker.jsx";
+import type { OperatorName } from "metabase/query_builder/components/filters/pickers/DatePicker";
 import type { FieldFilter } from "metabase/meta/types/Query";
 
 type UrlEncoded = string;
diff --git a/frontend/src/metabase/parameters/components/widgets/DateMonthYearWidget.jsx b/frontend/src/metabase/parameters/components/widgets/DateMonthYearWidget.jsx
index 9e3dff80602..28097167370 100644
--- a/frontend/src/metabase/parameters/components/widgets/DateMonthYearWidget.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/DateMonthYearWidget.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 
-import YearPicker from "./YearPicker.jsx";
+import YearPicker from "./YearPicker";
 
 import moment from "moment";
 import _ from "underscore";
diff --git a/frontend/src/metabase/parameters/components/widgets/DateQuarterYearWidget.jsx b/frontend/src/metabase/parameters/components/widgets/DateQuarterYearWidget.jsx
index 7839a9bcce5..8663b4fdabb 100644
--- a/frontend/src/metabase/parameters/components/widgets/DateQuarterYearWidget.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/DateQuarterYearWidget.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 
-import YearPicker from "./YearPicker.jsx";
+import YearPicker from "./YearPicker";
 
 import moment from "moment";
 import _ from "underscore";
diff --git a/frontend/src/metabase/parameters/components/widgets/DateRangeWidget.jsx b/frontend/src/metabase/parameters/components/widgets/DateRangeWidget.jsx
index dea2154ba46..01d2674fc55 100644
--- a/frontend/src/metabase/parameters/components/widgets/DateRangeWidget.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/DateRangeWidget.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Calendar from "metabase/components/Calendar.jsx";
+import Calendar from "metabase/components/Calendar";
 import moment from "moment";
 
 const SEPARATOR = "~"; // URL-safe
diff --git a/frontend/src/metabase/parameters/components/widgets/DateSingleWidget.jsx b/frontend/src/metabase/parameters/components/widgets/DateSingleWidget.jsx
index 674098d748e..3a46d571361 100644
--- a/frontend/src/metabase/parameters/components/widgets/DateSingleWidget.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/DateSingleWidget.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Calendar from "metabase/components/Calendar.jsx";
+import Calendar from "metabase/components/Calendar";
 import moment from "moment";
 
 const DateSingleWidget = ({ value, setValue, onClose }) => (
diff --git a/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx b/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx
index 861ec358d49..3b6ede05d5e 100644
--- a/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx
+++ b/frontend/src/metabase/parameters/components/widgets/YearPicker.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Select from "metabase/components/Select.jsx";
+import Select from "metabase/components/Select";
 import _ from "underscore";
 
 const YEARS = _.range(new Date().getFullYear(), 1900, -1);
diff --git a/frontend/src/metabase/public/components/widgets/AdvancedSettingsPane.jsx b/frontend/src/metabase/public/components/widgets/AdvancedSettingsPane.jsx
index 02f0a2b9d3e..6ff16344f58 100644
--- a/frontend/src/metabase/public/components/widgets/AdvancedSettingsPane.jsx
+++ b/frontend/src/metabase/public/components/widgets/AdvancedSettingsPane.jsx
@@ -9,7 +9,7 @@ import Button from "metabase/components/Button";
 import Parameters from "metabase/parameters/components/Parameters";
 import Select, { Option } from "metabase/components/Select";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import DisplayOptionsPane from "./DisplayOptionsPane";
 
@@ -88,7 +88,7 @@ const AdvancedSettingsPane = ({
             <Icon
               name={getIconForParameter(parameter)}
               className="mr2"
-              style={{ color: colors["text-light"] }}
+              style={{ color: color("text-light") }}
             />
             <h3>{parameter.name}</h3>
             <Select
diff --git a/frontend/src/metabase/public/components/widgets/EmbedModalContent.jsx b/frontend/src/metabase/public/components/widgets/EmbedModalContent.jsx
index f0ea3a949ae..9be56e86a73 100644
--- a/frontend/src/metabase/public/components/widgets/EmbedModalContent.jsx
+++ b/frontend/src/metabase/public/components/widgets/EmbedModalContent.jsx
@@ -16,7 +16,7 @@ import {
   getUnsignedPreviewUrl,
   getSignedToken,
 } from "metabase/public/lib/embed";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import {
   getSiteUrl,
@@ -179,7 +179,7 @@ export default class EmbedModalContent extends Component {
           style={{
             boxShadow:
               embedType === "application"
-                ? `0px 8px 15px -9px ${colors["text-dark"]}`
+                ? `0px 8px 15px -9px ${color("text-dark")}`
                 : undefined,
           }}
         >
diff --git a/frontend/src/metabase/pulse/components/PulseCardPreview.jsx b/frontend/src/metabase/pulse/components/PulseCardPreview.jsx
index bc864a0df86..70a4ee0f09d 100644
--- a/frontend/src/metabase/pulse/components/PulseCardPreview.jsx
+++ b/frontend/src/metabase/pulse/components/PulseCardPreview.jsx
@@ -3,13 +3,13 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Icon from "metabase/components/Icon.jsx";
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import Icon from "metabase/components/Icon";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
+import Tooltip from "metabase/components/Tooltip";
 
 import { t } from "ttag";
 import cx from "classnames";
-import colors, { alpha } from "metabase/lib/colors";
+import { color, alpha } from "metabase/lib/colors";
 
 export default class PulseCardPreview extends Component {
   constructor(props, context) {
@@ -80,7 +80,7 @@ export default class PulseCardPreview extends Component {
             top: 2,
             right: 2,
             background: `linear-gradient(to right, ${alpha(
-              colors["bg-white"],
+              color("bg-white"),
               0.2,
             )}, white, white)`,
             paddingLeft: 100,
@@ -179,7 +179,7 @@ const RenderedPulseCardPreviewHeader = ({ children }) => (
                 'Lato, "Helvetica Neue", Helvetica, Arial, sans-serif',
               fontSize: 16,
               fontWeight: 700,
-              color: colors["text-dark"],
+              color: color("text-dark"),
               textDecoration: "none",
             }}
           >
diff --git a/frontend/src/metabase/pulse/components/PulseEdit.jsx b/frontend/src/metabase/pulse/components/PulseEdit.jsx
index 8c03db90b28..05570924936 100644
--- a/frontend/src/metabase/pulse/components/PulseEdit.jsx
+++ b/frontend/src/metabase/pulse/components/PulseEdit.jsx
@@ -3,19 +3,19 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t, jt, ngettext, msgid } from "ttag";
 
-import PulseEditName from "./PulseEditName.jsx";
+import PulseEditName from "./PulseEditName";
 import PulseEditCollection from "./PulseEditCollection";
-import PulseEditCards from "./PulseEditCards.jsx";
-import PulseEditChannels from "./PulseEditChannels.jsx";
-import PulseEditSkip from "./PulseEditSkip.jsx";
-import WhatsAPulse from "./WhatsAPulse.jsx";
+import PulseEditCards from "./PulseEditCards";
+import PulseEditChannels from "./PulseEditChannels";
+import PulseEditSkip from "./PulseEditSkip";
+import WhatsAPulse from "./WhatsAPulse";
 
-import ActionButton from "metabase/components/ActionButton.jsx";
+import ActionButton from "metabase/components/ActionButton";
 import Button from "metabase/components/Button";
 import MetabaseAnalytics from "metabase/lib/analytics";
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
-import ModalContent from "metabase/components/ModalContent.jsx";
-import DeleteModalWithConfirm from "metabase/components/DeleteModalWithConfirm.jsx";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
+import ModalContent from "metabase/components/ModalContent";
+import DeleteModalWithConfirm from "metabase/components/DeleteModalWithConfirm";
 
 import { pulseIsValid, cleanPulse, emailIsEnabled } from "metabase/lib/pulse";
 import * as Urls from "metabase/lib/urls";
diff --git a/frontend/src/metabase/pulse/components/PulseEditCards.jsx b/frontend/src/metabase/pulse/components/PulseEditCards.jsx
index 943e0c7fd4d..6451e0c7630 100644
--- a/frontend/src/metabase/pulse/components/PulseEditCards.jsx
+++ b/frontend/src/metabase/pulse/components/PulseEditCards.jsx
@@ -4,13 +4,13 @@ import PropTypes from "prop-types";
 import { t } from "ttag";
 import cx from "classnames";
 
-import PulseCardPreview from "./PulseCardPreview.jsx";
+import PulseCardPreview from "./PulseCardPreview";
 
 import QuestionSelect from "metabase/containers/QuestionSelect";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const SOFT_LIMIT = 10;
 const HARD_LIMIT = 25;
@@ -169,7 +169,7 @@ export default class PulseEditCards extends Component {
                   className="my4 ml3"
                   style={{
                     width: 375,
-                    borderTop: `1px dashed ${colors["border"]}`,
+                    borderTop: `1px dashed ${color("border")}`,
                   }}
                 />
               )}
diff --git a/frontend/src/metabase/pulse/components/PulseEditChannels.jsx b/frontend/src/metabase/pulse/components/PulseEditChannels.jsx
index 03b5979bc79..a9ef407d7f1 100644
--- a/frontend/src/metabase/pulse/components/PulseEditChannels.jsx
+++ b/frontend/src/metabase/pulse/components/PulseEditChannels.jsx
@@ -5,13 +5,13 @@ import _ from "underscore";
 import { assoc, assocIn } from "icepick";
 import { t } from "ttag";
 
-import RecipientPicker from "./RecipientPicker.jsx";
+import RecipientPicker from "./RecipientPicker";
 
-import SchedulePicker from "metabase/components/SchedulePicker.jsx";
-import ActionButton from "metabase/components/ActionButton.jsx";
-import Select, { Option } from "metabase/components/Select.jsx";
-import Toggle from "metabase/components/Toggle.jsx";
-import Icon from "metabase/components/Icon.jsx";
+import SchedulePicker from "metabase/components/SchedulePicker";
+import ActionButton from "metabase/components/ActionButton";
+import Select, { Option } from "metabase/components/Select";
+import Toggle from "metabase/components/Toggle";
+import Icon from "metabase/components/Icon";
 import ChannelSetupMessage from "metabase/components/ChannelSetupMessage";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
diff --git a/frontend/src/metabase/pulse/components/PulseEditSkip.jsx b/frontend/src/metabase/pulse/components/PulseEditSkip.jsx
index 02199fcb389..494f73adb57 100644
--- a/frontend/src/metabase/pulse/components/PulseEditSkip.jsx
+++ b/frontend/src/metabase/pulse/components/PulseEditSkip.jsx
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 
-import Toggle from "metabase/components/Toggle.jsx";
+import Toggle from "metabase/components/Toggle";
 
 export default class PulseEditSkip extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/pulse/containers/PulseEditApp.jsx b/frontend/src/metabase/pulse/containers/PulseEditApp.jsx
index f73bdfe93a6..a0e21d32b05 100644
--- a/frontend/src/metabase/pulse/containers/PulseEditApp.jsx
+++ b/frontend/src/metabase/pulse/containers/PulseEditApp.jsx
@@ -4,7 +4,7 @@ import { connect } from "react-redux";
 
 import title from "metabase/hoc/Title";
 
-import PulseEdit from "../components/PulseEdit.jsx";
+import PulseEdit from "../components/PulseEdit";
 
 import Collections from "metabase/entities/collections";
 import Pulses from "metabase/entities/pulses";
diff --git a/frontend/src/metabase/query_builder/components/AddClauseButton.jsx b/frontend/src/metabase/query_builder/components/AddClauseButton.jsx
index fac84a957e9..f9da920ec11 100644
--- a/frontend/src/metabase/query_builder/components/AddClauseButton.jsx
+++ b/frontend/src/metabase/query_builder/components/AddClauseButton.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Icon from "metabase/components/Icon.jsx";
-import IconBorder from "metabase/components/IconBorder.jsx";
+import Icon from "metabase/components/Icon";
+import IconBorder from "metabase/components/IconBorder";
 
 export default class AddClauseButton extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/query_builder/components/AggregationPopover.jsx b/frontend/src/metabase/query_builder/components/AggregationPopover.jsx
index 5d7481d3e0f..930e3587c59 100644
--- a/frontend/src/metabase/query_builder/components/AggregationPopover.jsx
+++ b/frontend/src/metabase/query_builder/components/AggregationPopover.jsx
@@ -2,13 +2,13 @@ import React, { Component } from "react";
 import ReactDOM from "react-dom";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import AccordionList from "metabase/components/AccordionList.jsx";
-import FieldList from "./FieldList.jsx";
-import QueryDefinitionTooltip from "./QueryDefinitionTooltip.jsx";
+import AccordionList from "metabase/components/AccordionList";
+import FieldList from "./FieldList";
+import QueryDefinitionTooltip from "./QueryDefinitionTooltip";
 
-import Icon from "metabase/components/Icon.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
-import Button from "metabase/components/Button.jsx";
+import Icon from "metabase/components/Icon";
+import Tooltip from "metabase/components/Tooltip";
+import Button from "metabase/components/Button";
 
 import * as Q_DEPRECATED from "metabase/lib/query";
 import * as A_DEPRECATED from "metabase/lib/query_aggregation";
@@ -17,7 +17,7 @@ import Aggregation from "metabase-lib/lib/queries/structured/Aggregation";
 
 import _ from "underscore";
 
-import ExpressionEditorTextfield from "./expressions/ExpressionEditorTextfield.jsx";
+import ExpressionEditorTextfield from "./expressions/ExpressionEditorTextfield";
 
 const COMMON_SECTION_NAME = t`Common Metrics`;
 const BASIC_SECTION_NAME = t`Basic Metrics`;
diff --git a/frontend/src/metabase/query_builder/components/BreakoutName.jsx b/frontend/src/metabase/query_builder/components/BreakoutName.jsx
index a22f597a2ee..daeb69e711c 100644
--- a/frontend/src/metabase/query_builder/components/BreakoutName.jsx
+++ b/frontend/src/metabase/query_builder/components/BreakoutName.jsx
@@ -5,7 +5,7 @@ import React from "react";
 import type { Breakout } from "metabase/meta/types/Query";
 import StructuredQuery from "metabase-lib/lib/queries/StructuredQuery";
 
-import FieldName from "./FieldName.jsx";
+import FieldName from "./FieldName";
 
 type Props = {
   breakout: Breakout,
diff --git a/frontend/src/metabase/query_builder/components/BreakoutPopover.jsx b/frontend/src/metabase/query_builder/components/BreakoutPopover.jsx
index de3a17ac698..b1f534b131a 100644
--- a/frontend/src/metabase/query_builder/components/BreakoutPopover.jsx
+++ b/frontend/src/metabase/query_builder/components/BreakoutPopover.jsx
@@ -3,7 +3,7 @@
 import React from "react";
 import cx from "classnames";
 
-import FieldList from "metabase/query_builder/components/FieldList.jsx";
+import FieldList from "metabase/query_builder/components/FieldList";
 
 import type { Breakout } from "metabase/meta/types/Query";
 import type { FieldOptions } from "metabase/meta/types/Metadata";
diff --git a/frontend/src/metabase/query_builder/components/Clearable.jsx b/frontend/src/metabase/query_builder/components/Clearable.jsx
index 12c205e56ad..ca2e03a26df 100644
--- a/frontend/src/metabase/query_builder/components/Clearable.jsx
+++ b/frontend/src/metabase/query_builder/components/Clearable.jsx
@@ -1,7 +1,7 @@
 import React from "react";
 import cx from "classnames";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const Clearable = ({ onClear, children, className }) => (
   <span className={cx("flex align-center", className)}>
diff --git a/frontend/src/metabase/query_builder/components/DataSelector.jsx b/frontend/src/metabase/query_builder/components/DataSelector.jsx
index 3e37045557a..6c602cc430b 100644
--- a/frontend/src/metabase/query_builder/components/DataSelector.jsx
+++ b/frontend/src/metabase/query_builder/components/DataSelector.jsx
@@ -3,9 +3,10 @@ import { connect } from "react-redux";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 import cx from "classnames";
-import Icon from "metabase/components/Icon.jsx";
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import AccordionList from "metabase/components/AccordionList.jsx";
+
+import Icon from "metabase/components/Icon";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import AccordionList from "metabase/components/AccordionList";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
 import { isQueryable } from "metabase/lib/table";
diff --git a/frontend/src/metabase/query_builder/components/ExtendedOptions.jsx b/frontend/src/metabase/query_builder/components/ExtendedOptions.jsx
index 86d2e7e0a0a..fe9f18b1e65 100644
--- a/frontend/src/metabase/query_builder/components/ExtendedOptions.jsx
+++ b/frontend/src/metabase/query_builder/components/ExtendedOptions.jsx
@@ -5,12 +5,12 @@ import PropTypes from "prop-types";
 import _ from "underscore";
 import cx from "classnames";
 import { t } from "ttag";
-import AddClauseButton from "./AddClauseButton.jsx";
-import Expressions from "./expressions/Expressions.jsx";
-import ExpressionWidget from "./expressions/ExpressionWidget.jsx";
-import LimitWidget from "./LimitWidget.jsx";
-import SortWidget from "./SortWidget.jsx";
-import Popover from "metabase/components/Popover.jsx";
+import AddClauseButton from "./AddClauseButton";
+import Expressions from "./expressions/Expressions";
+import ExpressionWidget from "./expressions/ExpressionWidget";
+import LimitWidget from "./LimitWidget";
+import SortWidget from "./SortWidget";
+import Popover from "metabase/components/Popover";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
 
diff --git a/frontend/src/metabase/query_builder/components/FieldName.jsx b/frontend/src/metabase/query_builder/components/FieldName.jsx
index 54fb72d05d4..35c5c8393b3 100644
--- a/frontend/src/metabase/query_builder/components/FieldName.jsx
+++ b/frontend/src/metabase/query_builder/components/FieldName.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import Clearable from "./Clearable.jsx";
+import Clearable from "./Clearable";
 
 import * as Q_DEPRECATED from "metabase/lib/query";
 
diff --git a/frontend/src/metabase/query_builder/components/FieldWidget.jsx b/frontend/src/metabase/query_builder/components/FieldWidget.jsx
index a09cea34478..f113a20652d 100644
--- a/frontend/src/metabase/query_builder/components/FieldWidget.jsx
+++ b/frontend/src/metabase/query_builder/components/FieldWidget.jsx
@@ -1,9 +1,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import FieldList from "./FieldList.jsx";
-import FieldName from "./FieldName.jsx";
-import Popover from "metabase/components/Popover.jsx";
+import FieldList from "./FieldList";
+import FieldName from "./FieldName";
+import Popover from "metabase/components/Popover";
 
 import * as Q_DEPRECATED from "metabase/lib/query";
 
diff --git a/frontend/src/metabase/query_builder/components/Filter.jsx b/frontend/src/metabase/query_builder/components/Filter.jsx
index 3e051eea094..c099521e495 100644
--- a/frontend/src/metabase/query_builder/components/Filter.jsx
+++ b/frontend/src/metabase/query_builder/components/Filter.jsx
@@ -2,7 +2,7 @@
 
 import React from "react";
 
-import FieldName from "./FieldName.jsx";
+import FieldName from "./FieldName";
 import Value from "metabase/components/Value";
 
 import Dimension from "metabase-lib/lib/Dimension";
diff --git a/frontend/src/metabase/query_builder/components/FilterList.jsx b/frontend/src/metabase/query_builder/components/FilterList.jsx
index 8b6f9b76755..00d179a67b6 100644
--- a/frontend/src/metabase/query_builder/components/FilterList.jsx
+++ b/frontend/src/metabase/query_builder/components/FilterList.jsx
@@ -3,7 +3,7 @@
 import React, { Component } from "react";
 import { connect } from "react-redux";
 
-import Filter from "./Filter.jsx";
+import Filter from "./Filter";
 import { filterWidgetFilterRenderer } from "./filters/FilterWidget";
 
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/query_builder/components/GuiQueryEditor.jsx b/frontend/src/metabase/query_builder/components/GuiQueryEditor.jsx
index 4928ab55394..a1fc8cca54c 100644
--- a/frontend/src/metabase/query_builder/components/GuiQueryEditor.jsx
+++ b/frontend/src/metabase/query_builder/components/GuiQueryEditor.jsx
@@ -5,14 +5,14 @@ import PropTypes from "prop-types";
 import ReactDOM from "react-dom";
 import { t } from "ttag";
 
-import AggregationWidget from "./AggregationWidget.jsx";
-import BreakoutWidget from "./BreakoutWidget.jsx";
-import ExtendedOptions from "./ExtendedOptions.jsx";
-import FilterWidgetList from "./filters/FilterWidgetList.jsx";
-import FilterPopover from "./filters/FilterPopover.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import IconBorder from "metabase/components/IconBorder.jsx";
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
+import AggregationWidget from "./AggregationWidget";
+import BreakoutWidget from "./BreakoutWidget";
+import ExtendedOptions from "./ExtendedOptions";
+import FilterWidgetList from "./filters/FilterWidgetList";
+import FilterPopover from "./filters/FilterPopover";
+import Icon from "metabase/components/Icon";
+import IconBorder from "metabase/components/IconBorder";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
 import { DatabaseSchemaAndTableDataSelector } from "metabase/query_builder/components/DataSelector";
 
 import cx from "classnames";
diff --git a/frontend/src/metabase/query_builder/components/QueryDefinitionTooltip.jsx b/frontend/src/metabase/query_builder/components/QueryDefinitionTooltip.jsx
index 7e0c7c5b90b..0ad12787999 100644
--- a/frontend/src/metabase/query_builder/components/QueryDefinitionTooltip.jsx
+++ b/frontend/src/metabase/query_builder/components/QueryDefinitionTooltip.jsx
@@ -1,9 +1,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import FilterList from "./FilterList.jsx";
-import AggregationName from "./AggregationName.jsx";
-import FieldSet from "metabase/components/FieldSet.jsx";
+import FilterList from "./FilterList";
+import AggregationName from "./AggregationName";
+import FieldSet from "metabase/components/FieldSet";
 
 import * as Q_DEPRECATED from "metabase/lib/query";
 import { t } from "ttag";
diff --git a/frontend/src/metabase/query_builder/components/QueryDownloadWidget.jsx b/frontend/src/metabase/query_builder/components/QueryDownloadWidget.jsx
index 64cd10dc127..5decc7d726f 100644
--- a/frontend/src/metabase/query_builder/components/QueryDownloadWidget.jsx
+++ b/frontend/src/metabase/query_builder/components/QueryDownloadWidget.jsx
@@ -6,10 +6,10 @@ import { t } from "ttag";
 import { parse as urlParse } from "url";
 import querystring from "querystring";
 
-import PopoverWithTrigger from "metabase/components/PopoverWithTrigger.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import DownloadButton from "metabase/components/DownloadButton.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
+import Icon from "metabase/components/Icon";
+import DownloadButton from "metabase/components/DownloadButton";
+import Tooltip from "metabase/components/Tooltip";
 
 import * as Urls from "metabase/lib/urls";
 
diff --git a/frontend/src/metabase/query_builder/components/SavedQuestionIntroModal.jsx b/frontend/src/metabase/query_builder/components/SavedQuestionIntroModal.jsx
index 8a97461d255..b85d7bf68e1 100644
--- a/frontend/src/metabase/query_builder/components/SavedQuestionIntroModal.jsx
+++ b/frontend/src/metabase/query_builder/components/SavedQuestionIntroModal.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 
-import Modal from "metabase/components/Modal.jsx";
+import Modal from "metabase/components/Modal";
 import { t } from "ttag";
 
 export default class SavedQuestionIntroModal extends Component {
diff --git a/frontend/src/metabase/query_builder/components/SelectionModule.jsx b/frontend/src/metabase/query_builder/components/SelectionModule.jsx
index 9f410efb100..f0fdd092988 100644
--- a/frontend/src/metabase/query_builder/components/SelectionModule.jsx
+++ b/frontend/src/metabase/query_builder/components/SelectionModule.jsx
@@ -1,9 +1,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Popover from "metabase/components/Popover.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import SearchBar from "./SearchBar.jsx";
+import Popover from "metabase/components/Popover";
+import Icon from "metabase/components/Icon";
+import SearchBar from "./SearchBar";
 import { t } from "ttag";
 import _ from "underscore";
 import cx from "classnames";
diff --git a/frontend/src/metabase/query_builder/components/SortWidget.jsx b/frontend/src/metabase/query_builder/components/SortWidget.jsx
index ba9d5511d5a..ec8af3c297d 100644
--- a/frontend/src/metabase/query_builder/components/SortWidget.jsx
+++ b/frontend/src/metabase/query_builder/components/SortWidget.jsx
@@ -1,9 +1,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import Icon from "metabase/components/Icon.jsx";
-import FieldWidget from "./FieldWidget.jsx";
-import SelectionModule from "./SelectionModule.jsx";
+import Icon from "metabase/components/Icon";
+import FieldWidget from "./FieldWidget";
+import SelectionModule from "./SelectionModule";
 
 import _ from "underscore";
 
diff --git a/frontend/src/metabase/query_builder/components/TimeGroupingPopover.jsx b/frontend/src/metabase/query_builder/components/TimeGroupingPopover.jsx
index e43ae0ebd78..6a846e4e4ca 100644
--- a/frontend/src/metabase/query_builder/components/TimeGroupingPopover.jsx
+++ b/frontend/src/metabase/query_builder/components/TimeGroupingPopover.jsx
@@ -62,7 +62,6 @@ export default class TimeGroupingPopover extends Component {
     this.props.onFieldChange([
       "datetime-field",
       this.props.field[1],
-      "as",
       bucketing,
     ]);
   }
diff --git a/frontend/src/metabase/query_builder/components/VisualizationResult.jsx b/frontend/src/metabase/query_builder/components/VisualizationResult.jsx
index ec02d3f0c51..3d88ad30e66 100644
--- a/frontend/src/metabase/query_builder/components/VisualizationResult.jsx
+++ b/frontend/src/metabase/query_builder/components/VisualizationResult.jsx
@@ -5,7 +5,7 @@ import { t, jt } from "ttag";
 import cx from "classnames";
 
 import ErrorMessage from "metabase/components/ErrorMessage";
-import Visualization from "metabase/visualizations/components/Visualization.jsx";
+import Visualization from "metabase/visualizations/components/Visualization";
 import { datasetContainsNoResults } from "metabase/lib/dataset";
 import { DatasetQuery } from "metabase/meta/types/Card";
 import { CreateAlertModalContent } from "metabase/query_builder/components/AlertModals";
diff --git a/frontend/src/metabase/query_builder/components/dataref/DatabasePane.jsx b/frontend/src/metabase/query_builder/components/dataref/DatabasePane.jsx
index 7cfc60f4fc6..fc7c71cdaf9 100644
--- a/frontend/src/metabase/query_builder/components/dataref/DatabasePane.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/DatabasePane.jsx
@@ -2,7 +2,7 @@
 import React from "react";
 import PropTypes from "prop-types";
 import { isQueryable } from "metabase/lib/table";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const DatabasePane = ({ database, show, ...props }) => (
   <div>
diff --git a/frontend/src/metabase/query_builder/components/dataref/DetailPane.jsx b/frontend/src/metabase/query_builder/components/dataref/DetailPane.jsx
index 7051d51ce9c..a9cb58f0ebe 100644
--- a/frontend/src/metabase/query_builder/components/dataref/DetailPane.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/DetailPane.jsx
@@ -3,8 +3,8 @@ import React from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 import cx from "classnames";
-import Icon from "metabase/components/Icon.jsx";
-import Card from "metabase/components/Card.jsx";
+import Icon from "metabase/components/Icon";
+import Card from "metabase/components/Card";
 
 const DetailPane = ({ name, description, extra, values }) => (
   <div className="ml1">
diff --git a/frontend/src/metabase/query_builder/components/dataref/FieldPane.jsx b/frontend/src/metabase/query_builder/components/dataref/FieldPane.jsx
index e6572aeefb0..e247dd9e67a 100644
--- a/frontend/src/metabase/query_builder/components/dataref/FieldPane.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/FieldPane.jsx
@@ -2,9 +2,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import DetailPane from "./DetailPane.jsx";
-import QueryButton from "metabase/components/QueryButton.jsx";
-import UseForButton from "./UseForButton.jsx";
+import DetailPane from "./DetailPane";
+import QueryButton from "metabase/components/QueryButton";
+import UseForButton from "./UseForButton";
 
 import { fetchTableMetadata, fetchFieldValues } from "metabase/redux/metadata";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx b/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx
index 2bfe87989f5..e55e6d5bc31 100644
--- a/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx
@@ -2,7 +2,7 @@
 import React from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const MainPane = ({ databases, show }) => (
   <div>
diff --git a/frontend/src/metabase/query_builder/components/dataref/MetricPane.jsx b/frontend/src/metabase/query_builder/components/dataref/MetricPane.jsx
index eed81f60226..e86174e8dea 100644
--- a/frontend/src/metabase/query_builder/components/dataref/MetricPane.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/MetricPane.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import { connect } from "react-redux";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import DetailPane from "./DetailPane.jsx";
-import QueryButton from "metabase/components/QueryButton.jsx";
-import QueryDefinition from "./QueryDefinition.jsx";
+import DetailPane from "./DetailPane";
+import QueryButton from "metabase/components/QueryButton";
+import QueryDefinition from "./QueryDefinition";
 
 import { createCard } from "metabase/lib/card";
 import * as Q_DEPRECATED from "metabase/lib/query";
diff --git a/frontend/src/metabase/query_builder/components/dataref/QueryDefinition.jsx b/frontend/src/metabase/query_builder/components/dataref/QueryDefinition.jsx
index 15ed579116c..4fe43231fbc 100644
--- a/frontend/src/metabase/query_builder/components/dataref/QueryDefinition.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/QueryDefinition.jsx
@@ -1,7 +1,7 @@
 import React from "react";
 
-import FilterList from "../FilterList.jsx";
-import AggregationName from "../AggregationName.jsx";
+import FilterList from "../FilterList";
+import AggregationName from "../AggregationName";
 
 import Question from "metabase-lib/lib/Question";
 
diff --git a/frontend/src/metabase/query_builder/components/dataref/SegmentPane.jsx b/frontend/src/metabase/query_builder/components/dataref/SegmentPane.jsx
index 29f7c708f33..323135b59a7 100644
--- a/frontend/src/metabase/query_builder/components/dataref/SegmentPane.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/SegmentPane.jsx
@@ -6,10 +6,10 @@ import { t } from "ttag";
 import { fetchTableMetadata } from "metabase/redux/metadata";
 import { getMetadata } from "metabase/selectors/metadata";
 
-import DetailPane from "./DetailPane.jsx";
-import QueryButton from "metabase/components/QueryButton.jsx";
-import UseForButton from "./UseForButton.jsx";
-import QueryDefinition from "./QueryDefinition.jsx";
+import DetailPane from "./DetailPane";
+import QueryButton from "metabase/components/QueryButton";
+import UseForButton from "./UseForButton";
+import QueryDefinition from "./QueryDefinition";
 
 import { createCard } from "metabase/lib/card";
 import * as Q_DEPRECATED from "metabase/lib/query";
diff --git a/frontend/src/metabase/query_builder/components/dataref/TablePane.jsx b/frontend/src/metabase/query_builder/components/dataref/TablePane.jsx
index 1742ac460b4..ce9cc73e7c3 100644
--- a/frontend/src/metabase/query_builder/components/dataref/TablePane.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/TablePane.jsx
@@ -3,10 +3,10 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
 import cx from "classnames";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 // components
-import Expandable from "metabase/components/Expandable.jsx";
+import Expandable from "metabase/components/Expandable";
 
 // lib
 import { createCard } from "metabase/lib/card";
diff --git a/frontend/src/metabase/query_builder/components/dataref/UseForButton.jsx b/frontend/src/metabase/query_builder/components/dataref/UseForButton.jsx
index c5a470013a5..d46c5aa149a 100644
--- a/frontend/src/metabase/query_builder/components/dataref/UseForButton.jsx
+++ b/frontend/src/metabase/query_builder/components/dataref/UseForButton.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const UseForButton = ({ title, onClick }) => (
   <a
diff --git a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx
index 413159b8b6c..712e1b1f4f2 100644
--- a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx
+++ b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield.jsx
@@ -18,9 +18,9 @@ import {
   KEYCODE_DOWN,
 } from "metabase/lib/keyboard";
 
-import Popover from "metabase/components/Popover.jsx";
+import Popover from "metabase/components/Popover";
 
-import TokenizedInput from "./TokenizedInput.jsx";
+import TokenizedInput from "./TokenizedInput";
 
 import { isExpression } from "metabase/lib/expressions";
 
diff --git a/frontend/src/metabase/query_builder/components/expressions/ExpressionWidget.jsx b/frontend/src/metabase/query_builder/components/expressions/ExpressionWidget.jsx
index 61cd58fd17a..abfe751e8f4 100644
--- a/frontend/src/metabase/query_builder/components/expressions/ExpressionWidget.jsx
+++ b/frontend/src/metabase/query_builder/components/expressions/ExpressionWidget.jsx
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
 import { t } from "ttag";
-import ExpressionEditorTextfield from "./ExpressionEditorTextfield.jsx";
+import ExpressionEditorTextfield from "./ExpressionEditorTextfield";
 import { isExpression } from "metabase/lib/expressions";
 import MetabaseSettings from "metabase/lib/settings";
 
diff --git a/frontend/src/metabase/query_builder/components/expressions/Expressions.jsx b/frontend/src/metabase/query_builder/components/expressions/Expressions.jsx
index 98fbf590e48..024976759e2 100644
--- a/frontend/src/metabase/query_builder/components/expressions/Expressions.jsx
+++ b/frontend/src/metabase/query_builder/components/expressions/Expressions.jsx
@@ -2,9 +2,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import _ from "underscore";
 import { t } from "ttag";
-import Icon from "metabase/components/Icon.jsx";
-import IconBorder from "metabase/components/IconBorder.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import Icon from "metabase/components/Icon";
+import IconBorder from "metabase/components/IconBorder";
+import Tooltip from "metabase/components/Tooltip";
 
 import { format } from "metabase/lib/expressions/formatter";
 
diff --git a/frontend/src/metabase/query_builder/components/expressions/TokenizedInput.jsx b/frontend/src/metabase/query_builder/components/expressions/TokenizedInput.jsx
index 370aaab0b14..7a454430d5d 100644
--- a/frontend/src/metabase/query_builder/components/expressions/TokenizedInput.jsx
+++ b/frontend/src/metabase/query_builder/components/expressions/TokenizedInput.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import ReactDOM from "react-dom";
 
-import TokenizedExpression from "./TokenizedExpression.jsx";
+import TokenizedExpression from "./TokenizedExpression";
 
 import {
   getCaretPosition,
diff --git a/frontend/src/metabase/query_builder/components/filters/FilterWidget.jsx b/frontend/src/metabase/query_builder/components/filters/FilterWidget.jsx
index b5aa4026744..e6ceb9cf9b0 100644
--- a/frontend/src/metabase/query_builder/components/filters/FilterWidget.jsx
+++ b/frontend/src/metabase/query_builder/components/filters/FilterWidget.jsx
@@ -2,9 +2,9 @@
 
 import React, { Component } from "react";
 
-import Icon from "metabase/components/Icon.jsx";
-import Popover from "metabase/components/Popover.jsx";
-import FilterPopover from "./FilterPopover.jsx";
+import Icon from "metabase/components/Icon";
+import Popover from "metabase/components/Popover";
+import FilterPopover from "./FilterPopover";
 import Filter from "metabase/query_builder/components/Filter";
 
 import cx from "classnames";
diff --git a/frontend/src/metabase/query_builder/components/filters/FilterWidgetList.jsx b/frontend/src/metabase/query_builder/components/filters/FilterWidgetList.jsx
index b373fd54625..d759672554a 100644
--- a/frontend/src/metabase/query_builder/components/filters/FilterWidgetList.jsx
+++ b/frontend/src/metabase/query_builder/components/filters/FilterWidgetList.jsx
@@ -3,7 +3,7 @@
 import React, { Component } from "react";
 import { findDOMNode } from "react-dom";
 import { t } from "ttag";
-import FilterWidget from "./FilterWidget.jsx";
+import FilterWidget from "./FilterWidget";
 
 import StructuredQuery from "metabase-lib/lib/queries/StructuredQuery";
 import Filter from "metabase-lib/lib/queries/structured/Filter";
diff --git a/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx b/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx
index d44eb475837..20e7dfd3d7e 100644
--- a/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx
+++ b/frontend/src/metabase/query_builder/components/filters/pickers/HoursMinutesInput.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import NumericInput from "metabase/components/NumericInput.jsx";
+import NumericInput from "metabase/components/NumericInput";
 import Icon from "metabase/components/Icon";
 
 import cx from "classnames";
diff --git a/frontend/src/metabase/query_builder/components/filters/pickers/NumberPicker.jsx b/frontend/src/metabase/query_builder/components/filters/pickers/NumberPicker.jsx
index cccc9deb59f..7d31a69b72e 100644
--- a/frontend/src/metabase/query_builder/components/filters/pickers/NumberPicker.jsx
+++ b/frontend/src/metabase/query_builder/components/filters/pickers/NumberPicker.jsx
@@ -3,7 +3,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import TextPicker from "./TextPicker.jsx";
+import TextPicker from "./TextPicker";
 
 type Props = {
   values: Array<number | null>,
diff --git a/frontend/src/metabase/query_builder/components/filters/pickers/RelativeDatePicker.jsx b/frontend/src/metabase/query_builder/components/filters/pickers/RelativeDatePicker.jsx
index 352c369d034..0f7773020d4 100644
--- a/frontend/src/metabase/query_builder/components/filters/pickers/RelativeDatePicker.jsx
+++ b/frontend/src/metabase/query_builder/components/filters/pickers/RelativeDatePicker.jsx
@@ -3,7 +3,7 @@
 import React, { Component } from "react";
 import cx from "classnames";
 
-import NumericInput from "metabase/components/NumericInput.jsx";
+import NumericInput from "metabase/components/NumericInput";
 import DateUnitSelector from "../DateUnitSelector";
 
 import { assoc } from "icepick";
diff --git a/frontend/src/metabase/query_builder/components/filters/pickers/SelectPicker.jsx b/frontend/src/metabase/query_builder/components/filters/pickers/SelectPicker.jsx
index 77b1304b7ff..97ef93e0bcc 100644
--- a/frontend/src/metabase/query_builder/components/filters/pickers/SelectPicker.jsx
+++ b/frontend/src/metabase/query_builder/components/filters/pickers/SelectPicker.jsx
@@ -3,8 +3,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import CheckBox from "metabase/components/CheckBox.jsx";
-import ListSearchField from "metabase/components/ListSearchField.jsx";
+import CheckBox from "metabase/components/CheckBox";
+import ListSearchField from "metabase/components/ListSearchField";
 
 import { capitalize } from "metabase/lib/formatting";
 import { createMultiwordSearchRegex } from "metabase/lib/string";
diff --git a/frontend/src/metabase/query_builder/components/notebook/NotebookStep.jsx b/frontend/src/metabase/query_builder/components/notebook/NotebookStep.jsx
index c56a181ecf1..126a766414b 100644
--- a/frontend/src/metabase/query_builder/components/notebook/NotebookStep.jsx
+++ b/frontend/src/metabase/query_builder/components/notebook/NotebookStep.jsx
@@ -3,7 +3,7 @@ import React from "react";
 import { t } from "ttag";
 import _ from "underscore";
 
-import colors, { lighten, darken } from "metabase/lib/colors";
+import { color as c, lighten, darken } from "metabase/lib/colors";
 
 import Tooltip from "metabase/components/Tooltip";
 import Icon from "metabase/components/Icon";
@@ -27,60 +27,60 @@ import LimitStep from "./steps/LimitStep";
 const STEP_UI = {
   data: {
     title: t`Data`,
-    color: colors["brand"],
+    color: c("brand"),
     component: DataStep,
   },
   join: {
     title: t`Join data`,
-    color: colors["brand"],
+    color: c("brand"),
     icon: "join_left_outer",
     component: JoinStep,
     priority: 1,
   },
   expression: {
     title: t`Custom column`,
-    color: colors["bg-dark"],
+    color: c("bg-dark"),
     icon: "add_data",
     component: ExpressionStep,
   },
   filter: {
     title: t`Filter`,
-    color: colors["accent7"],
+    color: c("accent7"),
     icon: "filter",
     component: FilterStep,
     priority: 10,
   },
   summarize: {
     title: t`Summarize`,
-    color: colors["accent1"],
+    color: c("accent1"),
     icon: "sum",
     component: SummarizeStep,
     priority: 5,
   },
   aggregate: {
     title: t`Aggregate`,
-    color: colors["accent1"],
+    color: c("accent1"),
     icon: "sum",
     component: AggregateStep,
     priority: 5,
   },
   breakout: {
     title: t`Breakout`,
-    color: colors["accent4"],
+    color: c("accent4"),
     icon: "segment",
     component: BreakoutStep,
     priority: 1,
   },
   sort: {
     title: t`Sort`,
-    color: colors["bg-dark"],
+    color: c("bg-dark"),
     icon: "smartscalar",
     component: SortStep,
     compact: true,
   },
   limit: {
     title: t`Row limit`,
-    color: colors["bg-dark"],
+    color: c("bg-dark"),
     icon: "list",
     component: LimitStep,
     compact: true,
@@ -182,7 +182,7 @@ export default class NotebookStep extends React.Component {
                   }
                   icon="play"
                   title={t`Preview`}
-                  color={colors["text-light"]}
+                  color={c("text-light")}
                   onClick={() => this.setState({ showPreview: true })}
                 />
               </Box>
@@ -205,12 +205,12 @@ export default class NotebookStep extends React.Component {
 
 const ColorButton = Button.extend`
   border: none;
-  color: ${({ color }) => (color ? color : colors["text-medium"])}
+  color: ${({ color }) => (color ? color : c("text-medium"))}
   background-color: ${({ color }) => (color ? lighten(color, 0.61) : null)};
   &:hover {
-    color: ${({ color }) => (color ? darken(color, 0.115) : colors["brand"])};
+    color: ${({ color }) => (color ? darken(color, 0.115) : color("brand"))};
     background-color: ${({ color }) =>
-      color ? lighten(color, 0.5) : lighten(colors["brand"], 0.61)};
+      color ? lighten(color, 0.5) : lighten(color("brand"), 0.61)};
   }
   transition: background 300ms;
 `;
diff --git a/frontend/src/metabase/query_builder/components/notebook/steps/SortStep.jsx b/frontend/src/metabase/query_builder/components/notebook/steps/SortStep.jsx
index 863f5865da4..0466846beb9 100644
--- a/frontend/src/metabase/query_builder/components/notebook/steps/SortStep.jsx
+++ b/frontend/src/metabase/query_builder/components/notebook/steps/SortStep.jsx
@@ -54,7 +54,7 @@ const SortName = ({ sort, query }) => (
   <FieldName field={sort && sort[1]} query={query} />
 );
 
-import FieldList from "metabase/query_builder/components/FieldList.jsx";
+import FieldList from "metabase/query_builder/components/FieldList";
 
 import type { OrderBy } from "metabase/meta/types/Query";
 import type { FieldOptions } from "metabase/meta/types/Metadata";
diff --git a/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx b/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx
index f373ab7ee38..d708dd4fcff 100644
--- a/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx
+++ b/frontend/src/metabase/query_builder/components/template_tags/TagEditorHelp.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 import { t, jt } from "ttag";
-import Code from "metabase/components/Code.jsx";
+import Code from "metabase/components/Code";
 import MetabaseSettings from "metabase/lib/settings";
 
 const EXAMPLES = {
diff --git a/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.jsx b/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.jsx
index ee34b3f115c..23c4e291ac3 100644
--- a/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.jsx
+++ b/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.jsx
@@ -4,10 +4,10 @@ import _ from "underscore";
 import { connect } from "react-redux";
 import { Link } from "react-router";
 
-import Toggle from "metabase/components/Toggle.jsx";
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
-import Select, { Option } from "metabase/components/Select.jsx";
-import ParameterValueWidget from "metabase/parameters/components/ParameterValueWidget.jsx";
+import Toggle from "metabase/components/Toggle";
+import InputBlurChange from "metabase/components/InputBlurChange";
+import Select, { Option } from "metabase/components/Select";
+import ParameterValueWidget from "metabase/parameters/components/ParameterValueWidget";
 
 import { parameterOptionsForField } from "metabase/meta/Dashboard";
 import type { TemplateTag } from "metabase/meta/types/Query";
diff --git a/frontend/src/metabase/query_builder/components/view/QuestionSummaries.jsx b/frontend/src/metabase/query_builder/components/view/QuestionSummaries.jsx
index 43690b15676..893b9d4977b 100644
--- a/frontend/src/metabase/query_builder/components/view/QuestionSummaries.jsx
+++ b/frontend/src/metabase/query_builder/components/view/QuestionSummaries.jsx
@@ -8,17 +8,17 @@ import ViewButton from "./ViewButton";
 
 import SummarizeSidebar from "./sidebars/SummarizeSidebar";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const SummarizePill = props => (
-  <ViewPill icon="insight" color={colors["accent1"]} {...props} />
+  <ViewPill icon="insight" color={color("accent1")} {...props} />
 );
 
 const SummarizeButton = props => (
   <ViewButton
     medium
     icon="insight"
-    color={colors["accent1"]}
+    color={color("accent1")}
     labelBreakpoint="sm"
     {...props}
   />
diff --git a/frontend/src/metabase/query_builder/components/view/ViewButton.jsx b/frontend/src/metabase/query_builder/components/view/ViewButton.jsx
index da627bfe73a..1f027f3e940 100644
--- a/frontend/src/metabase/query_builder/components/view/ViewButton.jsx
+++ b/frontend/src/metabase/query_builder/components/view/ViewButton.jsx
@@ -1,5 +1,5 @@
 import Button from "metabase/components/Button";
-import colors, { alpha } from "metabase/lib/colors";
+import { color, alpha } from "metabase/lib/colors";
 
 import styled from "styled-components";
 
@@ -20,7 +20,7 @@ const ViewButton = styled(Button)`
   }
 `;
 ViewButton.defaultProps = {
-  color: colors["brand"],
+  color: color("brand"),
 };
 
 export default ViewButton;
diff --git a/frontend/src/metabase/query_builder/components/view/ViewFooter.jsx b/frontend/src/metabase/query_builder/components/view/ViewFooter.jsx
index d68e2e60f0d..12813fa7611 100644
--- a/frontend/src/metabase/query_builder/components/view/ViewFooter.jsx
+++ b/frontend/src/metabase/query_builder/components/view/ViewFooter.jsx
@@ -4,7 +4,7 @@ import { t } from "ttag";
 import cx from "classnames";
 import styled from "styled-components";
 import { Flex } from "grid-styled";
-import colors, { darken } from "metabase/lib/colors";
+import { color, darken } from "metabase/lib/colors";
 
 import Icon from "metabase/components/Icon";
 
@@ -201,7 +201,7 @@ const VizSettingsButton = ({ ...props }) => (
 const Well = styled(Flex)`
   border-radius: 99px;
   &:hover {
-    background-color: ${darken(colors["bg-medium"], 0.05)};
+    background-color: ${darken(color("bg-medium"), 0.05)};
   }
   transition: background 300ms linear;
 `;
@@ -210,13 +210,12 @@ Well.defaultProps = {
   px: "6px",
   py: "4px",
   align: "center",
-  bg: colors["bg-medium"],
+  bg: color("bg-medium"),
 };
 
 const ToggleIcon = styled(Flex)`
   cursor: pointer;
-  background-color: ${props =>
-    props.active ? colors["brand"] : "transparent"};
+  background-color: ${props => (props.active ? color("brand") : "transparent")};
   color: ${props => (props.active ? "white" : "inherit")};
   border-radius: 99px;
 `;
diff --git a/frontend/src/metabase/query_builder/components/view/ViewPill.jsx b/frontend/src/metabase/query_builder/components/view/ViewPill.jsx
index 9c9d9e6d126..02dc18c1196 100644
--- a/frontend/src/metabase/query_builder/components/view/ViewPill.jsx
+++ b/frontend/src/metabase/query_builder/components/view/ViewPill.jsx
@@ -1,13 +1,13 @@
 import React from "react";
 
 import Icon from "metabase/components/Icon";
-import colors, { alpha } from "metabase/lib/colors";
+import { color as c, alpha } from "metabase/lib/colors";
 import cx from "classnames";
 
 export default function ViewPill({
   className,
   style = {},
-  color = colors["brand"],
+  color = c("brand"),
   invert,
   children,
   onClick,
diff --git a/frontend/src/metabase/questions/containers/AddToDashboard.jsx b/frontend/src/metabase/questions/containers/AddToDashboard.jsx
index acb81b2921c..117457f3403 100644
--- a/frontend/src/metabase/questions/containers/AddToDashboard.jsx
+++ b/frontend/src/metabase/questions/containers/AddToDashboard.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import { t } from "ttag";
 
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalContent from "metabase/components/ModalContent";
 import QuestionPicker from "metabase/containers/QuestionPicker";
 
 export default class AddToDashboard extends Component {
diff --git a/frontend/src/metabase/reference/components/EditButton.jsx b/frontend/src/metabase/reference/components/EditButton.jsx
index f0686968f69..3084e652c41 100644
--- a/frontend/src/metabase/reference/components/EditButton.jsx
+++ b/frontend/src/metabase/reference/components/EditButton.jsx
@@ -5,7 +5,7 @@ import pure from "recompose/pure";
 import { t } from "ttag";
 import S from "./EditButton.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const EditButton = ({ className, startEditing }) => (
   <button
diff --git a/frontend/src/metabase/reference/components/EditHeader.jsx b/frontend/src/metabase/reference/components/EditHeader.jsx
index 35d2f4b0a14..4d24715ddde 100644
--- a/frontend/src/metabase/reference/components/EditHeader.jsx
+++ b/frontend/src/metabase/reference/components/EditHeader.jsx
@@ -5,7 +5,7 @@ import pure from "recompose/pure";
 import { t } from "ttag";
 import S from "./EditHeader.css";
 
-import RevisionMessageModal from "metabase/reference/components/RevisionMessageModal.jsx";
+import RevisionMessageModal from "metabase/reference/components/RevisionMessageModal";
 
 const EditHeader = ({
   hasRevisionHistory,
diff --git a/frontend/src/metabase/reference/components/EditableReferenceHeader.jsx b/frontend/src/metabase/reference/components/EditableReferenceHeader.jsx
index 590927dec64..2916bb830fa 100644
--- a/frontend/src/metabase/reference/components/EditableReferenceHeader.jsx
+++ b/frontend/src/metabase/reference/components/EditableReferenceHeader.jsx
@@ -8,13 +8,13 @@ import S from "./ReferenceHeader.css";
 import L from "metabase/components/List.css";
 import E from "metabase/reference/components/EditButton.css";
 
-import IconBorder from "metabase/components/IconBorder.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
-import Ellipsified from "metabase/components/Ellipsified.jsx";
-import EditButton from "metabase/reference/components/EditButton.jsx";
+import IconBorder from "metabase/components/IconBorder";
+import Icon from "metabase/components/Icon";
+import InputBlurChange from "metabase/components/InputBlurChange";
+import Ellipsified from "metabase/components/Ellipsified";
+import EditButton from "metabase/reference/components/EditButton";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const EditableReferenceHeader = ({
   entity = {},
@@ -40,7 +40,7 @@ const EditableReferenceHeader = ({
         {headerIcon && (
           <IconBorder
             borderWidth="0"
-            style={{ backgroundColor: colors["bg-medium"] }}
+            style={{ backgroundColor: color("bg-medium") }}
           >
             <Icon
               className="text-brand"
diff --git a/frontend/src/metabase/reference/components/Field.jsx b/frontend/src/metabase/reference/components/Field.jsx
index 63db960d9bb..e7f8b0b1bbd 100644
--- a/frontend/src/metabase/reference/components/Field.jsx
+++ b/frontend/src/metabase/reference/components/Field.jsx
@@ -12,8 +12,8 @@ import { getIn } from "icepick";
 import S from "metabase/components/List.css";
 import F from "./Field.css";
 
-import Select from "metabase/components/Select.jsx";
-import Icon from "metabase/components/Icon.jsx";
+import Select from "metabase/components/Select";
+import Icon from "metabase/components/Icon";
 
 import cx from "classnames";
 import pure from "recompose/pure";
diff --git a/frontend/src/metabase/reference/components/FieldToGroupBy.jsx b/frontend/src/metabase/reference/components/FieldToGroupBy.jsx
index e4d82c39e9d..6c56d738207 100644
--- a/frontend/src/metabase/reference/components/FieldToGroupBy.jsx
+++ b/frontend/src/metabase/reference/components/FieldToGroupBy.jsx
@@ -5,7 +5,7 @@ import { t } from "ttag";
 import S from "./FieldToGroupBy.css";
 import Q from "metabase/components/QueryButton.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const FieldToGroupBy = ({
   className,
diff --git a/frontend/src/metabase/reference/components/FieldTypeDetail.jsx b/frontend/src/metabase/reference/components/FieldTypeDetail.jsx
index a5ba51a1759..266af6dee15 100644
--- a/frontend/src/metabase/reference/components/FieldTypeDetail.jsx
+++ b/frontend/src/metabase/reference/components/FieldTypeDetail.jsx
@@ -8,7 +8,7 @@ import * as MetabaseCore from "metabase/lib/core";
 import { isNumericBaseType } from "metabase/lib/schema_metadata";
 import { isFK } from "metabase/lib/types";
 
-import Select from "metabase/components/Select.jsx";
+import Select from "metabase/components/Select";
 
 import D from "metabase/reference/components/Detail.css";
 
diff --git a/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx b/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx
index f3bd75f4bff..4c224589e04 100644
--- a/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx
+++ b/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx
@@ -8,7 +8,7 @@ import L from "metabase/components/List.css";
 
 import { getQuestionUrl } from "../utils";
 
-import FieldToGroupBy from "metabase/reference/components/FieldToGroupBy.jsx";
+import FieldToGroupBy from "metabase/reference/components/FieldToGroupBy";
 
 import { fetchTableMetadata } from "metabase/redux/metadata";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/reference/components/Formula.jsx b/frontend/src/metabase/reference/components/Formula.jsx
index ddd8e5eaf03..34e717c7734 100644
--- a/frontend/src/metabase/reference/components/Formula.jsx
+++ b/frontend/src/metabase/reference/components/Formula.jsx
@@ -6,9 +6,9 @@ import { CSSTransitionGroup } from "react-transition-group";
 
 import S from "./Formula.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
-import QueryDefinition from "metabase/query_builder/components/dataref/QueryDefinition.jsx";
+import QueryDefinition from "metabase/query_builder/components/dataref/QueryDefinition";
 import { fetchTableMetadata } from "metabase/redux/metadata";
 import { getMetadata } from "metabase/selectors/metadata";
 
diff --git a/frontend/src/metabase/reference/components/GuideDetailEditor.jsx b/frontend/src/metabase/reference/components/GuideDetailEditor.jsx
index d1bc126f5c6..e917b34ac49 100644
--- a/frontend/src/metabase/reference/components/GuideDetailEditor.jsx
+++ b/frontend/src/metabase/reference/components/GuideDetailEditor.jsx
@@ -6,9 +6,9 @@ import cx from "classnames";
 import { t } from "ttag";
 import S from "./GuideDetailEditor.css";
 
-import Select from "metabase/components/Select.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import Select from "metabase/components/Select";
+import Icon from "metabase/components/Icon";
+import Tooltip from "metabase/components/Tooltip";
 
 import { typeToBgClass } from "../utils.js";
 import { SchemaTableAndSegmentDataSelector } from "metabase/query_builder/components/DataSelector";
diff --git a/frontend/src/metabase/reference/components/GuideEditSection.jsx b/frontend/src/metabase/reference/components/GuideEditSection.jsx
index 7931724618c..b42b16ee688 100644
--- a/frontend/src/metabase/reference/components/GuideEditSection.jsx
+++ b/frontend/src/metabase/reference/components/GuideEditSection.jsx
@@ -6,7 +6,7 @@ import cx from "classnames";
 
 import S from "./GuideEditSection.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 const GuideEditSection = ({
   children,
diff --git a/frontend/src/metabase/reference/components/GuideHeader.jsx b/frontend/src/metabase/reference/components/GuideHeader.jsx
index 80e9687f3e7..bc4a732cb76 100644
--- a/frontend/src/metabase/reference/components/GuideHeader.jsx
+++ b/frontend/src/metabase/reference/components/GuideHeader.jsx
@@ -2,7 +2,7 @@ import React from "react";
 import PropTypes from "prop-types";
 import pure from "recompose/pure";
 import { t } from "ttag";
-import EditButton from "metabase/reference/components/EditButton.jsx";
+import EditButton from "metabase/reference/components/EditButton";
 
 const GuideHeader = ({ startEditing, isSuperuser }) => (
   <div>
diff --git a/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx b/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx
index 9ad8d1c1e07..f666d6d5038 100644
--- a/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx
+++ b/frontend/src/metabase/reference/components/MetricImportantFieldsDetail.jsx
@@ -3,9 +3,9 @@ import PropTypes from "prop-types";
 import cx from "classnames";
 import pure from "recompose/pure";
 import { t } from "ttag";
-import FieldsToGroupBy from "metabase/reference/components/FieldsToGroupBy.jsx";
+import FieldsToGroupBy from "metabase/reference/components/FieldsToGroupBy";
 
-import Select from "metabase/components/Select.jsx";
+import Select from "metabase/components/Select";
 
 import D from "metabase/reference/components/Detail.css";
 
diff --git a/frontend/src/metabase/reference/components/ReferenceHeader.jsx b/frontend/src/metabase/reference/components/ReferenceHeader.jsx
index 3042fba7264..390ecc28389 100644
--- a/frontend/src/metabase/reference/components/ReferenceHeader.jsx
+++ b/frontend/src/metabase/reference/components/ReferenceHeader.jsx
@@ -8,11 +8,11 @@ import S from "./ReferenceHeader.css";
 import L from "metabase/components/List.css";
 import E from "metabase/reference/components/EditButton.css";
 
-import IconBorder from "metabase/components/IconBorder.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import Ellipsified from "metabase/components/Ellipsified.jsx";
+import IconBorder from "metabase/components/IconBorder";
+import Icon from "metabase/components/Icon";
+import Ellipsified from "metabase/components/Ellipsified";
 import { t } from "ttag";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 const ReferenceHeader = ({
   name,
@@ -27,7 +27,7 @@ const ReferenceHeader = ({
         {headerIcon && (
           <IconBorder
             borderWidth="0"
-            style={{ backgroundColor: colors["bg-medium"] }}
+            style={{ backgroundColor: color("bg-medium") }}
           >
             <Icon
               className="text-brand"
diff --git a/frontend/src/metabase/reference/components/RevisionMessageModal.jsx b/frontend/src/metabase/reference/components/RevisionMessageModal.jsx
index 051c414dbfa..5f14fc2a51e 100644
--- a/frontend/src/metabase/reference/components/RevisionMessageModal.jsx
+++ b/frontend/src/metabase/reference/components/RevisionMessageModal.jsx
@@ -2,8 +2,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import ModalWithTrigger from "metabase/components/ModalWithTrigger.jsx";
-import ModalContent from "metabase/components/ModalContent.jsx";
+import ModalWithTrigger from "metabase/components/ModalWithTrigger";
+import ModalContent from "metabase/components/ModalContent";
 
 import S from "./RevisionMessageModal.css";
 
diff --git a/frontend/src/metabase/reference/components/UsefulQuestions.jsx b/frontend/src/metabase/reference/components/UsefulQuestions.jsx
index dd1c183f80a..9b81233d8c2 100644
--- a/frontend/src/metabase/reference/components/UsefulQuestions.jsx
+++ b/frontend/src/metabase/reference/components/UsefulQuestions.jsx
@@ -7,7 +7,7 @@ import S from "./UsefulQuestions.css";
 import D from "metabase/reference/components/Detail.css";
 import L from "metabase/components/List.css";
 
-import QueryButton from "metabase/components/QueryButton.jsx";
+import QueryButton from "metabase/components/QueryButton";
 
 const UsefulQuestions = ({ questions }) => (
   <div className={cx(D.detail)}>
diff --git a/frontend/src/metabase/reference/databases/DatabaseDetail.jsx b/frontend/src/metabase/reference/databases/DatabaseDetail.jsx
index c157576e741..e2cbcfc52c4 100644
--- a/frontend/src/metabase/reference/databases/DatabaseDetail.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseDetail.jsx
@@ -5,12 +5,12 @@ import { connect } from "react-redux";
 import { reduxForm } from "redux-form";
 import { push } from "react-router-redux";
 import { t } from "ttag";
-import List from "metabase/components/List.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import List from "metabase/components/List";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
-import Detail from "metabase/reference/components/Detail.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
+import Detail from "metabase/reference/components/Detail";
 
 import {
   getDatabase,
diff --git a/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx b/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx
index 825e7b5e2e5..28bf3d7d105 100644
--- a/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import DatabaseSidebar from "./DatabaseSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import DatabaseDetail from "metabase/reference/databases/DatabaseDetail.jsx";
+import DatabaseSidebar from "./DatabaseSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import DatabaseDetail from "metabase/reference/databases/DatabaseDetail";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/DatabaseList.jsx b/frontend/src/metabase/reference/databases/DatabaseList.jsx
index 9f3fe64459a..43ac5312e08 100644
--- a/frontend/src/metabase/reference/databases/DatabaseList.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseList.jsx
@@ -7,12 +7,12 @@ import { isQueryable } from "metabase/lib/table";
 
 import S from "metabase/components/List.css";
 
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 import { getDatabases, getError, getLoading } from "../selectors";
 
diff --git a/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx b/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx
index c3e824b00fc..9fe2d1ffac5 100644
--- a/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import BaseSidebar from "metabase/reference/guide/BaseSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import DatabaseList from "metabase/reference/databases/DatabaseList.jsx";
+import BaseSidebar from "metabase/reference/guide/BaseSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import DatabaseList from "metabase/reference/databases/DatabaseList";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/DatabaseSidebar.jsx b/frontend/src/metabase/reference/databases/DatabaseSidebar.jsx
index 62be7da78f8..407d54dfa9a 100644
--- a/frontend/src/metabase/reference/databases/DatabaseSidebar.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseSidebar.jsx
@@ -3,8 +3,8 @@ import React from "react";
 import PropTypes from "prop-types";
 import S from "metabase/components/Sidebar.css";
 import { t } from "ttag";
-import Breadcrumbs from "metabase/components/Breadcrumbs.jsx";
-import SidebarItem from "metabase/components/SidebarItem.jsx";
+import Breadcrumbs from "metabase/components/Breadcrumbs";
+import SidebarItem from "metabase/components/SidebarItem";
 
 import cx from "classnames";
 import pure from "recompose/pure";
diff --git a/frontend/src/metabase/reference/databases/FieldDetail.jsx b/frontend/src/metabase/reference/databases/FieldDetail.jsx
index 965a5bddb12..1bf2814d284 100644
--- a/frontend/src/metabase/reference/databases/FieldDetail.jsx
+++ b/frontend/src/metabase/reference/databases/FieldDetail.jsx
@@ -7,14 +7,14 @@ import { push } from "react-router-redux";
 import { t } from "ttag";
 import S from "metabase/reference/Reference.css";
 
-import List from "metabase/components/List.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import List from "metabase/components/List";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
-import Detail from "metabase/reference/components/Detail.jsx";
-import FieldTypeDetail from "metabase/reference/components/FieldTypeDetail.jsx";
-import UsefulQuestions from "metabase/reference/components/UsefulQuestions.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
+import Detail from "metabase/reference/components/Detail";
+import FieldTypeDetail from "metabase/reference/components/FieldTypeDetail";
+import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx b/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx
index f59a58c42c8..db134c05788 100644
--- a/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx
+++ b/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import FieldSidebar from "./FieldSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import FieldDetail from "metabase/reference/databases/FieldDetail.jsx";
+import FieldSidebar from "./FieldSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import FieldDetail from "metabase/reference/databases/FieldDetail";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/FieldList.jsx b/frontend/src/metabase/reference/databases/FieldList.jsx
index a3578d5a3be..afc32edb8fd 100644
--- a/frontend/src/metabase/reference/databases/FieldList.jsx
+++ b/frontend/src/metabase/reference/databases/FieldList.jsx
@@ -8,13 +8,13 @@ import S from "metabase/components/List.css";
 import R from "metabase/reference/Reference.css";
 import F from "metabase/reference/components/Field.css";
 
-import Field from "metabase/reference/components/Field.jsx";
-import List from "metabase/components/List.jsx";
-import EmptyState from "metabase/components/EmptyState.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import Field from "metabase/reference/components/Field";
+import List from "metabase/components/List";
+import EmptyState from "metabase/components/EmptyState";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/reference/databases/FieldListContainer.jsx b/frontend/src/metabase/reference/databases/FieldListContainer.jsx
index a09c13b90ef..228def21144 100644
--- a/frontend/src/metabase/reference/databases/FieldListContainer.jsx
+++ b/frontend/src/metabase/reference/databases/FieldListContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import TableSidebar from "./TableSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import FieldList from "metabase/reference/databases/FieldList.jsx";
+import TableSidebar from "./TableSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import FieldList from "metabase/reference/databases/FieldList";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/TableDetail.jsx b/frontend/src/metabase/reference/databases/TableDetail.jsx
index 00be797c407..5e8ef06843a 100644
--- a/frontend/src/metabase/reference/databases/TableDetail.jsx
+++ b/frontend/src/metabase/reference/databases/TableDetail.jsx
@@ -7,13 +7,13 @@ import { push } from "react-router-redux";
 import { t } from "ttag";
 import S from "metabase/reference/Reference.css";
 
-import List from "metabase/components/List.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import List from "metabase/components/List";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
-import Detail from "metabase/reference/components/Detail.jsx";
-import UsefulQuestions from "metabase/reference/components/UsefulQuestions.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
+import Detail from "metabase/reference/components/Detail";
+import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/databases/TableDetailContainer.jsx b/frontend/src/metabase/reference/databases/TableDetailContainer.jsx
index 065a2c12593..3bda7bbfa58 100644
--- a/frontend/src/metabase/reference/databases/TableDetailContainer.jsx
+++ b/frontend/src/metabase/reference/databases/TableDetailContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import TableSidebar from "./TableSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import TableDetail from "metabase/reference/databases/TableDetail.jsx";
+import TableSidebar from "./TableSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import TableDetail from "metabase/reference/databases/TableDetail";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/TableList.jsx b/frontend/src/metabase/reference/databases/TableList.jsx
index 0de78fa1d88..2fcd0df144c 100644
--- a/frontend/src/metabase/reference/databases/TableList.jsx
+++ b/frontend/src/metabase/reference/databases/TableList.jsx
@@ -8,13 +8,13 @@ import { isQueryable } from "metabase/lib/table";
 import S from "metabase/components/List.css";
 import R from "metabase/reference/Reference.css";
 
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
-import EmptyState from "metabase/components/EmptyState.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
+import EmptyState from "metabase/components/EmptyState";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 import {
   getDatabase,
diff --git a/frontend/src/metabase/reference/databases/TableListContainer.jsx b/frontend/src/metabase/reference/databases/TableListContainer.jsx
index be38499f2e0..adb9538fed9 100644
--- a/frontend/src/metabase/reference/databases/TableListContainer.jsx
+++ b/frontend/src/metabase/reference/databases/TableListContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import DatabaseSidebar from "./DatabaseSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import TableList from "metabase/reference/databases/TableList.jsx";
+import DatabaseSidebar from "./DatabaseSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import TableList from "metabase/reference/databases/TableList";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/TableQuestions.jsx b/frontend/src/metabase/reference/databases/TableQuestions.jsx
index b38c643f992..14c64cd9a3b 100644
--- a/frontend/src/metabase/reference/databases/TableQuestions.jsx
+++ b/frontend/src/metabase/reference/databases/TableQuestions.jsx
@@ -10,13 +10,13 @@ import * as Urls from "metabase/lib/urls";
 
 import S from "metabase/components/List.css";
 
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
-import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
+import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx b/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx
index 099050c1e89..89658b90a1a 100644
--- a/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx
+++ b/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx
@@ -3,10 +3,10 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import TableSidebar from "./TableSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
+import TableSidebar from "./TableSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
 
-import TableQuestions from "metabase/reference/databases/TableQuestions.jsx";
+import TableQuestions from "metabase/reference/databases/TableQuestions";
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
 
diff --git a/frontend/src/metabase/reference/guide/BaseSidebar.jsx b/frontend/src/metabase/reference/guide/BaseSidebar.jsx
index 9a1d8fb9a70..cea6f06d1b5 100644
--- a/frontend/src/metabase/reference/guide/BaseSidebar.jsx
+++ b/frontend/src/metabase/reference/guide/BaseSidebar.jsx
@@ -3,8 +3,8 @@ import React from "react";
 import PropTypes from "prop-types";
 import S from "metabase/components/Sidebar.css";
 import { t } from "ttag";
-import Breadcrumbs from "metabase/components/Breadcrumbs.jsx";
-import SidebarItem from "metabase/components/SidebarItem.jsx";
+import Breadcrumbs from "metabase/components/Breadcrumbs";
+import SidebarItem from "metabase/components/SidebarItem";
 
 import cx from "classnames";
 import pure from "recompose/pure";
diff --git a/frontend/src/metabase/reference/guide/GettingStartedGuide.jsx b/frontend/src/metabase/reference/guide/GettingStartedGuide.jsx
index 659eaf1937e..5cdc54c6407 100644
--- a/frontend/src/metabase/reference/guide/GettingStartedGuide.jsx
+++ b/frontend/src/metabase/reference/guide/GettingStartedGuide.jsx
@@ -6,10 +6,10 @@ import { connect } from "react-redux";
 import { t, jt } from "ttag";
 import cx from "classnames";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import GuideHeader from "metabase/reference/components/GuideHeader.jsx";
-import GuideDetail from "metabase/reference/components/GuideDetail.jsx";
+import GuideHeader from "metabase/reference/components/GuideHeader";
+import GuideDetail from "metabase/reference/components/GuideDetail";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/guide/GettingStartedGuideContainer.jsx b/frontend/src/metabase/reference/guide/GettingStartedGuideContainer.jsx
index 7bcc473e1e5..da2ed33d2f1 100644
--- a/frontend/src/metabase/reference/guide/GettingStartedGuideContainer.jsx
+++ b/frontend/src/metabase/reference/guide/GettingStartedGuideContainer.jsx
@@ -3,8 +3,8 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import GettingStartedGuide from "metabase/reference/guide/GettingStartedGuide.jsx";
-import GettingStartedGuideEditForm from "metabase/reference/guide/GettingStartedGuideEditForm.jsx";
+import GettingStartedGuide from "metabase/reference/guide/GettingStartedGuide";
+import GettingStartedGuideEditForm from "metabase/reference/guide/GettingStartedGuideEditForm";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/guide/GettingStartedGuideEditForm.jsx b/frontend/src/metabase/reference/guide/GettingStartedGuideEditForm.jsx
index 8f5d6fcff43..0dc8e1e0fb7 100644
--- a/frontend/src/metabase/reference/guide/GettingStartedGuideEditForm.jsx
+++ b/frontend/src/metabase/reference/guide/GettingStartedGuideEditForm.jsx
@@ -6,13 +6,13 @@ import { reduxForm } from "redux-form";
 import { t } from "ttag";
 import cx from "classnames";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
-import CreateDashboardModal from "metabase/components/CreateDashboardModal.jsx";
-import Modal from "metabase/components/Modal.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import CreateDashboardModal from "metabase/components/CreateDashboardModal";
+import Modal from "metabase/components/Modal";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import GuideEditSection from "metabase/reference/components/GuideEditSection.jsx";
-import GuideDetailEditor from "metabase/reference/components/GuideDetailEditor.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import GuideEditSection from "metabase/reference/components/GuideEditSection";
+import GuideDetailEditor from "metabase/reference/components/GuideDetailEditor";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/metrics/MetricDetail.jsx b/frontend/src/metabase/reference/metrics/MetricDetail.jsx
index 6a979528e26..4d10e24b500 100644
--- a/frontend/src/metabase/reference/metrics/MetricDetail.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricDetail.jsx
@@ -5,14 +5,14 @@ import { connect } from "react-redux";
 import { reduxForm } from "redux-form";
 import { push } from "react-router-redux";
 import { t } from "ttag";
-import List from "metabase/components/List.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
-import Detail from "metabase/reference/components/Detail.jsx";
-import FieldsToGroupBy from "metabase/reference/components/FieldsToGroupBy.jsx";
-import Formula from "metabase/reference/components/Formula.jsx";
-import MetricImportantFieldsDetail from "metabase/reference/components/MetricImportantFieldsDetail.jsx";
+import List from "metabase/components/List";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
+import Detail from "metabase/reference/components/Detail";
+import FieldsToGroupBy from "metabase/reference/components/FieldsToGroupBy";
+import Formula from "metabase/reference/components/Formula";
+import MetricImportantFieldsDetail from "metabase/reference/components/MetricImportantFieldsDetail";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/metrics/MetricDetailContainer.jsx b/frontend/src/metabase/reference/metrics/MetricDetailContainer.jsx
index 4b89cabf30a..d2aa2338c49 100644
--- a/frontend/src/metabase/reference/metrics/MetricDetailContainer.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricDetailContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import MetricSidebar from "./MetricSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import MetricDetail from "metabase/reference/metrics/MetricDetail.jsx";
+import MetricSidebar from "./MetricSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import MetricDetail from "metabase/reference/metrics/MetricDetail";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/metrics/MetricList.jsx b/frontend/src/metabase/reference/metrics/MetricList.jsx
index 1eccd30a6c9..12a9e27634f 100644
--- a/frontend/src/metabase/reference/metrics/MetricList.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricList.jsx
@@ -7,13 +7,13 @@ import { isQueryable } from "metabase/lib/table";
 
 import S from "metabase/components/List.css";
 
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
-import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
+import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 import { getMetrics, getError, getLoading } from "../selectors";
 
diff --git a/frontend/src/metabase/reference/metrics/MetricListContainer.jsx b/frontend/src/metabase/reference/metrics/MetricListContainer.jsx
index 8e609929892..c1501280448 100644
--- a/frontend/src/metabase/reference/metrics/MetricListContainer.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricListContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import BaseSidebar from "metabase/reference/guide/BaseSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import MetricList from "metabase/reference/metrics/MetricList.jsx";
+import BaseSidebar from "metabase/reference/guide/BaseSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import MetricList from "metabase/reference/metrics/MetricList";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/metrics/MetricQuestions.jsx b/frontend/src/metabase/reference/metrics/MetricQuestions.jsx
index 9bdf0446f83..7df2de9547c 100644
--- a/frontend/src/metabase/reference/metrics/MetricQuestions.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricQuestions.jsx
@@ -10,13 +10,13 @@ import * as Urls from "metabase/lib/urls";
 
 import S from "metabase/components/List.css";
 
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
-import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
+import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/metrics/MetricQuestionsContainer.jsx b/frontend/src/metabase/reference/metrics/MetricQuestionsContainer.jsx
index 3701953aeb1..66a253964be 100644
--- a/frontend/src/metabase/reference/metrics/MetricQuestionsContainer.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricQuestionsContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import MetricSidebar from "./MetricSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import MetricQuestions from "metabase/reference/metrics/MetricQuestions.jsx";
+import MetricSidebar from "./MetricSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import MetricQuestions from "metabase/reference/metrics/MetricQuestions";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/metrics/MetricRevisions.jsx b/frontend/src/metabase/reference/metrics/MetricRevisions.jsx
index dccb369c2be..dc9e411fd6f 100644
--- a/frontend/src/metabase/reference/metrics/MetricRevisions.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricRevisions.jsx
@@ -20,10 +20,10 @@ import {
   getError,
 } from "../selectors";
 
-import Revision from "metabase/admin/datamodel/components/revisions/Revision.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
-import EmptyState from "metabase/components/EmptyState.jsx";
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import Revision from "metabase/admin/datamodel/components/revisions/Revision";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import EmptyState from "metabase/components/EmptyState";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 const emptyStateData = {
   message: t`There are no revisions for this metric`,
diff --git a/frontend/src/metabase/reference/metrics/MetricRevisionsContainer.jsx b/frontend/src/metabase/reference/metrics/MetricRevisionsContainer.jsx
index a48a83c18ba..c7eb95606bf 100644
--- a/frontend/src/metabase/reference/metrics/MetricRevisionsContainer.jsx
+++ b/frontend/src/metabase/reference/metrics/MetricRevisionsContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import MetricSidebar from "./MetricSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import MetricRevisions from "metabase/reference/metrics/MetricRevisions.jsx";
+import MetricSidebar from "./MetricSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import MetricRevisions from "metabase/reference/metrics/MetricRevisions";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentDetail.jsx b/frontend/src/metabase/reference/segments/SegmentDetail.jsx
index 44a0c3db0f1..ba965a9ed2e 100644
--- a/frontend/src/metabase/reference/segments/SegmentDetail.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentDetail.jsx
@@ -4,14 +4,14 @@ import PropTypes from "prop-types";
 import { connect } from "react-redux";
 import { reduxForm } from "redux-form";
 import { t } from "ttag";
-import List from "metabase/components/List.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import List from "metabase/components/List";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
-import Detail from "metabase/reference/components/Detail.jsx";
-import UsefulQuestions from "metabase/reference/components/UsefulQuestions.jsx";
-import Formula from "metabase/reference/components/Formula.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
+import Detail from "metabase/reference/components/Detail";
+import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
+import Formula from "metabase/reference/components/Formula";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx b/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx
index a1715aacd75..17a95052068 100644
--- a/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import SegmentSidebar from "./SegmentSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import SegmentDetail from "metabase/reference/segments/SegmentDetail.jsx";
+import SegmentSidebar from "./SegmentSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import SegmentDetail from "metabase/reference/segments/SegmentDetail";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx b/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx
index 9b572da9134..5f1f37c64b3 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx
@@ -6,14 +6,14 @@ import { reduxForm } from "redux-form";
 import { t } from "ttag";
 import S from "metabase/reference/Reference.css";
 
-import List from "metabase/components/List.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import List from "metabase/components/List";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
-import Detail from "metabase/reference/components/Detail.jsx";
-import FieldTypeDetail from "metabase/reference/components/FieldTypeDetail.jsx";
-import UsefulQuestions from "metabase/reference/components/UsefulQuestions.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
+import Detail from "metabase/reference/components/Detail";
+import FieldTypeDetail from "metabase/reference/components/FieldTypeDetail";
+import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx b/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx
index 65fefd31738..65fd80979fd 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import SegmentFieldSidebar from "./SegmentFieldSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import SegmentFieldDetail from "metabase/reference/segments/SegmentFieldDetail.jsx";
+import SegmentFieldSidebar from "./SegmentFieldSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import SegmentFieldDetail from "metabase/reference/segments/SegmentFieldDetail";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldList.jsx b/frontend/src/metabase/reference/segments/SegmentFieldList.jsx
index fe292efd564..09d3f9ff789 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldList.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldList.jsx
@@ -8,13 +8,13 @@ import S from "metabase/components/List.css";
 import R from "metabase/reference/Reference.css";
 import F from "metabase/reference/components/Field.css";
 
-import Field from "metabase/reference/components/Field.jsx";
-import List from "metabase/components/List.jsx";
-import EmptyState from "metabase/components/EmptyState.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import Field from "metabase/reference/components/Field";
+import List from "metabase/components/List";
+import EmptyState from "metabase/components/EmptyState";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import EditHeader from "metabase/reference/components/EditHeader.jsx";
-import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader.jsx";
+import EditHeader from "metabase/reference/components/EditHeader";
+import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx b/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx
index 8326c4fd2e6..688aa6fda2a 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import SegmentSidebar from "./SegmentSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import SegmentFieldList from "metabase/reference/segments/SegmentFieldList.jsx";
+import SegmentSidebar from "./SegmentSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import SegmentFieldList from "metabase/reference/segments/SegmentFieldList";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldSidebar.jsx b/frontend/src/metabase/reference/segments/SegmentFieldSidebar.jsx
index 2993382ce1f..8bb1779a568 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldSidebar.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldSidebar.jsx
@@ -3,8 +3,8 @@ import React from "react";
 import PropTypes from "prop-types";
 import S from "metabase/components/Sidebar.css";
 import { t } from "ttag";
-import Breadcrumbs from "metabase/components/Breadcrumbs.jsx";
-import SidebarItem from "metabase/components/SidebarItem.jsx";
+import Breadcrumbs from "metabase/components/Breadcrumbs";
+import SidebarItem from "metabase/components/SidebarItem";
 
 import cx from "classnames";
 import pure from "recompose/pure";
diff --git a/frontend/src/metabase/reference/segments/SegmentList.jsx b/frontend/src/metabase/reference/segments/SegmentList.jsx
index 3c2708ae7f0..4ae815e7067 100644
--- a/frontend/src/metabase/reference/segments/SegmentList.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentList.jsx
@@ -8,13 +8,13 @@ import MetabaseSettings from "metabase/lib/settings";
 
 import S from "metabase/components/List.css";
 
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
-import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
+import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 import { getSegments, getError, getLoading } from "../selectors";
 
diff --git a/frontend/src/metabase/reference/segments/SegmentListContainer.jsx b/frontend/src/metabase/reference/segments/SegmentListContainer.jsx
index d2e66af545e..947133b2f09 100644
--- a/frontend/src/metabase/reference/segments/SegmentListContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentListContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import BaseSidebar from "metabase/reference/guide/BaseSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import SegmentList from "metabase/reference/segments/SegmentList.jsx";
+import BaseSidebar from "metabase/reference/guide/BaseSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import SegmentList from "metabase/reference/segments/SegmentList";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentQuestions.jsx b/frontend/src/metabase/reference/segments/SegmentQuestions.jsx
index 34f38de3709..366736a787d 100644
--- a/frontend/src/metabase/reference/segments/SegmentQuestions.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentQuestions.jsx
@@ -10,13 +10,13 @@ import * as Urls from "metabase/lib/urls";
 
 import S from "metabase/components/List.css";
 
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
-import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
+import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState";
 
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 import { getQuestionUrl } from "../utils";
 
diff --git a/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx b/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx
index 97fd9950077..7f28b0a5e8f 100644
--- a/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import SegmentSidebar from "./SegmentSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import SegmentQuestions from "metabase/reference/segments/SegmentQuestions.jsx";
+import SegmentSidebar from "./SegmentSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import SegmentQuestions from "metabase/reference/segments/SegmentQuestions";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentRevisions.jsx b/frontend/src/metabase/reference/segments/SegmentRevisions.jsx
index b7c12789469..39740657276 100644
--- a/frontend/src/metabase/reference/segments/SegmentRevisions.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentRevisions.jsx
@@ -20,10 +20,10 @@ import {
   getError,
 } from "../selectors";
 
-import Revision from "metabase/admin/datamodel/components/revisions/Revision.jsx";
-import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper.jsx";
-import EmptyState from "metabase/components/EmptyState.jsx";
-import ReferenceHeader from "../components/ReferenceHeader.jsx";
+import Revision from "metabase/admin/datamodel/components/revisions/Revision";
+import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import EmptyState from "metabase/components/EmptyState";
+import ReferenceHeader from "../components/ReferenceHeader";
 
 const emptyStateData = {
   message: t`There are no revisions for this segment`,
diff --git a/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx b/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx
index ccff3d570e1..6a72e0cfd3b 100644
--- a/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { connect } from "react-redux";
 
-import SegmentSidebar from "./SegmentSidebar.jsx";
-import SidebarLayout from "metabase/components/SidebarLayout.jsx";
-import SegmentRevisions from "metabase/reference/segments/SegmentRevisions.jsx";
+import SegmentSidebar from "./SegmentSidebar";
+import SidebarLayout from "metabase/components/SidebarLayout";
+import SegmentRevisions from "metabase/reference/segments/SegmentRevisions";
 
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/utils.js b/frontend/src/metabase/reference/utils.js
index 939c0bfb7e7..18170d2852e 100644
--- a/frontend/src/metabase/reference/utils.js
+++ b/frontend/src/metabase/reference/utils.js
@@ -71,7 +71,7 @@ export const getQuestion = ({
   // http://ramdajs.com/0.21.0/index.html
   const question = chain(newQuestion)
     .updateIn(["dataset_query", "query", "aggregation"], aggregation =>
-      getCount ? ["count"] : aggregation,
+      getCount ? [["count"]] : aggregation,
     )
     .updateIn(["display"], display => visualization || display)
     .updateIn(["dataset_query", "query", "breakout"], oldBreakout => {
@@ -89,7 +89,7 @@ export const getQuestion = ({
     return assocIn(
       question,
       ["dataset_query", "query", "aggregation"],
-      ["metric", metricId],
+      [["metric", metricId]],
     );
   }
 
@@ -97,7 +97,7 @@ export const getQuestion = ({
     return assocIn(
       question,
       ["dataset_query", "query", "filter"],
-      ["and", ["segment", segmentId]],
+      ["segment", segmentId],
     );
   }
 
diff --git a/frontend/src/metabase/routes-embed.jsx b/frontend/src/metabase/routes-embed.jsx
index 0f2628b0a37..1b2a03869e8 100644
--- a/frontend/src/metabase/routes-embed.jsx
+++ b/frontend/src/metabase/routes-embed.jsx
@@ -6,9 +6,9 @@ import { Route } from "react-router";
 
 import PublicNotFound from "metabase/public/components/PublicNotFound";
 
-import PublicApp from "metabase/public/containers/PublicApp.jsx";
-import PublicQuestion from "metabase/public/containers/PublicQuestion.jsx";
-import PublicDashboard from "metabase/public/containers/PublicDashboard.jsx";
+import PublicApp from "metabase/public/containers/PublicApp";
+import PublicQuestion from "metabase/public/containers/PublicQuestion";
+import PublicDashboard from "metabase/public/containers/PublicDashboard";
 
 export const getRoutes = store => (
   <Route>
diff --git a/frontend/src/metabase/routes-public.jsx b/frontend/src/metabase/routes-public.jsx
index 194ed7c61a1..4cee214b380 100644
--- a/frontend/src/metabase/routes-public.jsx
+++ b/frontend/src/metabase/routes-public.jsx
@@ -6,9 +6,9 @@ import { Route } from "react-router";
 
 import PublicNotFound from "metabase/public/components/PublicNotFound";
 
-import PublicApp from "metabase/public/containers/PublicApp.jsx";
-import PublicQuestion from "metabase/public/containers/PublicQuestion.jsx";
-import PublicDashboard from "metabase/public/containers/PublicDashboard.jsx";
+import PublicApp from "metabase/public/containers/PublicApp";
+import PublicQuestion from "metabase/public/containers/PublicQuestion";
+import PublicDashboard from "metabase/public/containers/PublicDashboard";
 
 export const getRoutes = store => (
   <Route>
diff --git a/frontend/src/metabase/routes.jsx b/frontend/src/metabase/routes.jsx
index b48286c7dcf..3f7ca90835a 100644
--- a/frontend/src/metabase/routes.jsx
+++ b/frontend/src/metabase/routes.jsx
@@ -17,11 +17,11 @@ import HomepageApp from "metabase/home/containers/HomepageApp";
 
 // auth containers
 import AuthApp from "metabase/auth/AuthApp";
-import ForgotPasswordApp from "metabase/auth/containers/ForgotPasswordApp.jsx";
-import LoginApp from "metabase/auth/containers/LoginApp.jsx";
-import LogoutApp from "metabase/auth/containers/LogoutApp.jsx";
-import PasswordResetApp from "metabase/auth/containers/PasswordResetApp.jsx";
-import GoogleNoAccount from "metabase/auth/components/GoogleNoAccount.jsx";
+import ForgotPasswordApp from "metabase/auth/containers/ForgotPasswordApp";
+import LoginApp from "metabase/auth/containers/LoginApp";
+import LogoutApp from "metabase/auth/containers/LogoutApp";
+import PasswordResetApp from "metabase/auth/containers/PasswordResetApp";
+import GoogleNoAccount from "metabase/auth/components/GoogleNoAccount";
 
 /* Dashboards */
 import DashboardApp from "metabase/dashboard/containers/DashboardApp";
@@ -34,19 +34,19 @@ import {
   TableBrowser,
 } from "metabase/components/BrowseApp";
 
-import QueryBuilder from "metabase/query_builder/containers/QueryBuilder.jsx";
+import QueryBuilder from "metabase/query_builder/containers/QueryBuilder";
 
-import CollectionEdit from "metabase/collections/containers/CollectionEdit.jsx";
-import CollectionCreate from "metabase/collections/containers/CollectionCreate.jsx";
+import CollectionEdit from "metabase/collections/containers/CollectionEdit";
+import CollectionCreate from "metabase/collections/containers/CollectionCreate";
 import ArchiveCollectionModal from "metabase/components/ArchiveCollectionModal";
 import CollectionPermissionsModal from "metabase/admin/permissions/containers/CollectionPermissionsModal";
 import UserCollectionList from "metabase/containers/UserCollectionList";
 
-import PulseEditApp from "metabase/pulse/containers/PulseEditApp.jsx";
-import SetupApp from "metabase/setup/containers/SetupApp.jsx";
-import PostSetupApp from "metabase/setup/containers/PostSetupApp.jsx";
-import UserSettingsApp from "metabase/user/containers/UserSettingsApp.jsx";
-import EntityPage from "metabase/components/EntityPage.jsx";
+import PulseEditApp from "metabase/pulse/containers/PulseEditApp";
+import SetupApp from "metabase/setup/containers/SetupApp";
+import PostSetupApp from "metabase/setup/containers/PostSetupApp";
+import UserSettingsApp from "metabase/user/containers/UserSettingsApp";
+import EntityPage from "metabase/components/EntityPage";
 // new question
 import NewQueryOptions from "metabase/new_query/containers/NewQueryOptions";
 
@@ -55,32 +55,32 @@ import CreateDashboardModal from "metabase/components/CreateDashboardModal";
 import { NotFound, Unauthorized } from "metabase/containers/ErrorPages";
 
 // Reference Guide
-import GettingStartedGuideContainer from "metabase/reference/guide/GettingStartedGuideContainer.jsx";
+import GettingStartedGuideContainer from "metabase/reference/guide/GettingStartedGuideContainer";
 // Reference Metrics
-import MetricListContainer from "metabase/reference/metrics/MetricListContainer.jsx";
-import MetricDetailContainer from "metabase/reference/metrics/MetricDetailContainer.jsx";
-import MetricQuestionsContainer from "metabase/reference/metrics/MetricQuestionsContainer.jsx";
-import MetricRevisionsContainer from "metabase/reference/metrics/MetricRevisionsContainer.jsx";
+import MetricListContainer from "metabase/reference/metrics/MetricListContainer";
+import MetricDetailContainer from "metabase/reference/metrics/MetricDetailContainer";
+import MetricQuestionsContainer from "metabase/reference/metrics/MetricQuestionsContainer";
+import MetricRevisionsContainer from "metabase/reference/metrics/MetricRevisionsContainer";
 // Reference Segments
-import SegmentListContainer from "metabase/reference/segments/SegmentListContainer.jsx";
-import SegmentDetailContainer from "metabase/reference/segments/SegmentDetailContainer.jsx";
-import SegmentQuestionsContainer from "metabase/reference/segments/SegmentQuestionsContainer.jsx";
-import SegmentRevisionsContainer from "metabase/reference/segments/SegmentRevisionsContainer.jsx";
-import SegmentFieldListContainer from "metabase/reference/segments/SegmentFieldListContainer.jsx";
-import SegmentFieldDetailContainer from "metabase/reference/segments/SegmentFieldDetailContainer.jsx";
+import SegmentListContainer from "metabase/reference/segments/SegmentListContainer";
+import SegmentDetailContainer from "metabase/reference/segments/SegmentDetailContainer";
+import SegmentQuestionsContainer from "metabase/reference/segments/SegmentQuestionsContainer";
+import SegmentRevisionsContainer from "metabase/reference/segments/SegmentRevisionsContainer";
+import SegmentFieldListContainer from "metabase/reference/segments/SegmentFieldListContainer";
+import SegmentFieldDetailContainer from "metabase/reference/segments/SegmentFieldDetailContainer";
 // Reference Databases
-import DatabaseListContainer from "metabase/reference/databases/DatabaseListContainer.jsx";
-import DatabaseDetailContainer from "metabase/reference/databases/DatabaseDetailContainer.jsx";
-import TableListContainer from "metabase/reference/databases/TableListContainer.jsx";
-import TableDetailContainer from "metabase/reference/databases/TableDetailContainer.jsx";
-import TableQuestionsContainer from "metabase/reference/databases/TableQuestionsContainer.jsx";
-import FieldListContainer from "metabase/reference/databases/FieldListContainer.jsx";
-import FieldDetailContainer from "metabase/reference/databases/FieldDetailContainer.jsx";
+import DatabaseListContainer from "metabase/reference/databases/DatabaseListContainer";
+import DatabaseDetailContainer from "metabase/reference/databases/DatabaseDetailContainer";
+import TableListContainer from "metabase/reference/databases/TableListContainer";
+import TableDetailContainer from "metabase/reference/databases/TableDetailContainer";
+import TableQuestionsContainer from "metabase/reference/databases/TableQuestionsContainer";
+import FieldListContainer from "metabase/reference/databases/FieldListContainer";
+import FieldDetailContainer from "metabase/reference/databases/FieldDetailContainer";
 
 import getAdminRoutes from "metabase/admin/routes";
 
-import PublicQuestion from "metabase/public/containers/PublicQuestion.jsx";
-import PublicDashboard from "metabase/public/containers/PublicDashboard.jsx";
+import PublicQuestion from "metabase/public/containers/PublicQuestion";
+import PublicDashboard from "metabase/public/containers/PublicDashboard";
 import DashboardHistoryModal from "metabase/dashboard/components/DashboardHistoryModal";
 import DashboardMoveModal from "metabase/dashboard/components/DashboardMoveModal";
 import DashboardCopyModal from "metabase/dashboard/components/DashboardCopyModal";
@@ -89,7 +89,7 @@ import { ModalRoute } from "metabase/hoc/ModalRoute";
 import CollectionLanding from "metabase/components/CollectionLanding";
 import Overworld from "metabase/containers/Overworld";
 
-import ArchiveApp from "metabase/home/containers/ArchiveApp.jsx";
+import ArchiveApp from "metabase/home/containers/ArchiveApp";
 import SearchApp from "metabase/home/containers/SearchApp";
 
 const MetabaseIsSetup = UserAuthWrapper({
diff --git a/frontend/src/metabase/setup/components/CollapsedStep.jsx b/frontend/src/metabase/setup/components/CollapsedStep.jsx
index bf48e5f91c3..5095e489e3f 100644
--- a/frontend/src/metabase/setup/components/CollapsedStep.jsx
+++ b/frontend/src/metabase/setup/components/CollapsedStep.jsx
@@ -2,7 +2,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import cx from "classnames";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 export default class CollapsedStep extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/setup/components/DatabaseConnectionStep.jsx b/frontend/src/metabase/setup/components/DatabaseConnectionStep.jsx
index 78ffdd009fd..9e5cf46f71c 100644
--- a/frontend/src/metabase/setup/components/DatabaseConnectionStep.jsx
+++ b/frontend/src/metabase/setup/components/DatabaseConnectionStep.jsx
@@ -2,11 +2,11 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import StepTitle from "./StepTitle.jsx";
-import CollapsedStep from "./CollapsedStep.jsx";
+import StepTitle from "./StepTitle";
+import CollapsedStep from "./CollapsedStep";
 
-import DatabaseDetailsForm from "metabase/components/DatabaseDetailsForm.jsx";
-import FormField from "metabase/components/form/FormField.jsx";
+import DatabaseDetailsForm from "metabase/components/DatabaseDetailsForm";
+import FormField from "metabase/components/form/FormField";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseSettings from "metabase/lib/settings";
 
diff --git a/frontend/src/metabase/setup/components/DatabaseSchedulingStep.jsx b/frontend/src/metabase/setup/components/DatabaseSchedulingStep.jsx
index 5721762af41..a75dca29f8c 100644
--- a/frontend/src/metabase/setup/components/DatabaseSchedulingStep.jsx
+++ b/frontend/src/metabase/setup/components/DatabaseSchedulingStep.jsx
@@ -2,8 +2,8 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import StepTitle from "./StepTitle.jsx";
-import CollapsedStep from "./CollapsedStep.jsx";
+import StepTitle from "./StepTitle";
+import CollapsedStep from "./CollapsedStep";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
 
diff --git a/frontend/src/metabase/setup/components/PreferencesStep.jsx b/frontend/src/metabase/setup/components/PreferencesStep.jsx
index 6a0664c134f..4e099ab79f8 100644
--- a/frontend/src/metabase/setup/components/PreferencesStep.jsx
+++ b/frontend/src/metabase/setup/components/PreferencesStep.jsx
@@ -4,10 +4,10 @@ import PropTypes from "prop-types";
 import { t, jt } from "ttag";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseSettings from "metabase/lib/settings";
-import Toggle from "metabase/components/Toggle.jsx";
+import Toggle from "metabase/components/Toggle";
 
-import StepTitle from "./StepTitle.jsx";
-import CollapsedStep from "./CollapsedStep.jsx";
+import StepTitle from "./StepTitle";
+import CollapsedStep from "./CollapsedStep";
 
 export default class PreferencesStep extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/setup/components/Setup.jsx b/frontend/src/metabase/setup/components/Setup.jsx
index a01b90fdfc4..4e4c8777c39 100644
--- a/frontend/src/metabase/setup/components/Setup.jsx
+++ b/frontend/src/metabase/setup/components/Setup.jsx
@@ -4,14 +4,14 @@ import ReactDOM from "react-dom";
 import PropTypes from "prop-types";
 import { Link } from "react-router";
 import { t } from "ttag";
-import LogoIcon from "metabase/components/LogoIcon.jsx";
-import NewsletterForm from "metabase/components/NewsletterForm.jsx";
+import LogoIcon from "metabase/components/LogoIcon";
+import NewsletterForm from "metabase/components/NewsletterForm";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseSettings from "metabase/lib/settings";
 
-import UserStep from "./UserStep.jsx";
-import DatabaseConnectionStep from "./DatabaseConnectionStep.jsx";
-import PreferencesStep from "./PreferencesStep.jsx";
+import UserStep from "./UserStep";
+import DatabaseConnectionStep from "./DatabaseConnectionStep";
+import PreferencesStep from "./PreferencesStep";
 import DatabaseSchedulingStep from "metabase/setup/components/DatabaseSchedulingStep";
 
 const WELCOME_STEP_NUMBER = 0;
diff --git a/frontend/src/metabase/setup/components/StepTitle.jsx b/frontend/src/metabase/setup/components/StepTitle.jsx
index a361db6d2e7..0e104af6576 100644
--- a/frontend/src/metabase/setup/components/StepTitle.jsx
+++ b/frontend/src/metabase/setup/components/StepTitle.jsx
@@ -1,7 +1,7 @@
 /* eslint "react/prop-types": "warn" */
 import React, { Component } from "react";
 import PropTypes from "prop-types";
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 export default class StepTitle extends Component {
   static propTypes = {
diff --git a/frontend/src/metabase/setup/components/UserStep.jsx b/frontend/src/metabase/setup/components/UserStep.jsx
index e1881473911..95a033d63c8 100644
--- a/frontend/src/metabase/setup/components/UserStep.jsx
+++ b/frontend/src/metabase/setup/components/UserStep.jsx
@@ -3,15 +3,15 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Box, Flex } from "grid-styled";
 import { t } from "ttag";
-import FormField from "metabase/components/form/FormField.jsx";
-import FormLabel from "metabase/components/form/FormLabel.jsx";
-import FormMessage from "metabase/components/form/FormMessage.jsx";
+import FormField from "metabase/components/form/FormField";
+import FormLabel from "metabase/components/form/FormLabel";
+import FormMessage from "metabase/components/form/FormMessage";
 import MetabaseAnalytics from "metabase/lib/analytics";
 import MetabaseSettings from "metabase/lib/settings";
 import MetabaseUtils from "metabase/lib/utils";
 
-import StepTitle from "./StepTitle.jsx";
-import CollapsedStep from "./CollapsedStep.jsx";
+import StepTitle from "./StepTitle";
+import CollapsedStep from "./CollapsedStep";
 
 import _ from "underscore";
 import cx from "classnames";
diff --git a/frontend/src/metabase/setup/containers/SetupApp.jsx b/frontend/src/metabase/setup/containers/SetupApp.jsx
index cb913075498..9a006f41853 100644
--- a/frontend/src/metabase/setup/containers/SetupApp.jsx
+++ b/frontend/src/metabase/setup/containers/SetupApp.jsx
@@ -3,7 +3,7 @@ import React, { Component } from "react";
 import { connect } from "react-redux";
 import fitViewport from "metabase/hoc/FitViewPort";
 
-import Setup from "../components/Setup.jsx";
+import Setup from "../components/Setup";
 
 import { setupSelectors } from "../selectors";
 import {
diff --git a/frontend/src/metabase/user/components/SetUserPassword.jsx b/frontend/src/metabase/user/components/SetUserPassword.jsx
index 26efd37211f..61015f1cddd 100644
--- a/frontend/src/metabase/user/components/SetUserPassword.jsx
+++ b/frontend/src/metabase/user/components/SetUserPassword.jsx
@@ -3,9 +3,9 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import ReactDOM from "react-dom";
 import { t } from "ttag";
-import FormField from "metabase/components/form/FormField.jsx";
-import FormLabel from "metabase/components/form/FormLabel.jsx";
-import FormMessage from "metabase/components/form/FormMessage.jsx";
+import FormField from "metabase/components/form/FormField";
+import FormLabel from "metabase/components/form/FormLabel";
+import FormMessage from "metabase/components/form/FormMessage";
 
 import MetabaseUtils from "metabase/lib/utils";
 import MetabaseSettings from "metabase/lib/settings";
diff --git a/frontend/src/metabase/user/containers/UserSettingsApp.jsx b/frontend/src/metabase/user/containers/UserSettingsApp.jsx
index d182f6590b7..f8eb88df569 100644
--- a/frontend/src/metabase/user/containers/UserSettingsApp.jsx
+++ b/frontend/src/metabase/user/containers/UserSettingsApp.jsx
@@ -2,7 +2,7 @@
 import React, { Component } from "react";
 import { connect } from "react-redux";
 
-import UserSettings from "../components/UserSettings.jsx";
+import UserSettings from "../components/UserSettings";
 import { selectors } from "../selectors";
 
 import { setTab, updatePassword, updateUser } from "../actions";
diff --git a/frontend/src/metabase/visualizations/components/CardRenderer.jsx b/frontend/src/metabase/visualizations/components/CardRenderer.jsx
index 327267b7ac8..4a953ed8310 100644
--- a/frontend/src/metabase/visualizations/components/CardRenderer.jsx
+++ b/frontend/src/metabase/visualizations/components/CardRenderer.jsx
@@ -4,7 +4,7 @@ import React, { Component } from "react";
 import PropTypes from "prop-types";
 import ReactDOM from "react-dom";
 
-import ExplicitSize from "metabase/components/ExplicitSize.jsx";
+import ExplicitSize from "metabase/components/ExplicitSize";
 
 import { isSameSeries } from "metabase/visualizations/lib/utils";
 
diff --git a/frontend/src/metabase/visualizations/components/ChartSettings.jsx b/frontend/src/metabase/visualizations/components/ChartSettings.jsx
index 0c2bd90f156..be7b28565a9 100644
--- a/frontend/src/metabase/visualizations/components/ChartSettings.jsx
+++ b/frontend/src/metabase/visualizations/components/ChartSettings.jsx
@@ -3,12 +3,12 @@ import cx from "classnames";
 import { assocIn } from "icepick";
 import _ from "underscore";
 import { t } from "ttag";
-import Warnings from "metabase/query_builder/components/Warnings.jsx";
+import Warnings from "metabase/query_builder/components/Warnings";
 
 import Button from "metabase/components/Button";
 import Radio from "metabase/components/Radio";
 
-import Visualization from "metabase/visualizations/components/Visualization.jsx";
+import Visualization from "metabase/visualizations/components/Visualization";
 import ChartSettingsWidget from "./ChartSettingsWidget";
 
 import { getSettingsWidgetsForSeries } from "metabase/visualizations/lib/settings/visualization";
diff --git a/frontend/src/metabase/visualizations/components/ChartTooltip.jsx b/frontend/src/metabase/visualizations/components/ChartTooltip.jsx
index de470e131f7..bd754cc16f9 100644
--- a/frontend/src/metabase/visualizations/components/ChartTooltip.jsx
+++ b/frontend/src/metabase/visualizations/components/ChartTooltip.jsx
@@ -1,7 +1,7 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 
-import TooltipPopover from "metabase/components/TooltipPopover.jsx";
+import TooltipPopover from "metabase/components/TooltipPopover";
 
 import { getFriendlyName } from "metabase/visualizations/lib/utils";
 import { formatValue } from "metabase/lib/formatting";
diff --git a/frontend/src/metabase/visualizations/components/ChartWithLegend.jsx b/frontend/src/metabase/visualizations/components/ChartWithLegend.jsx
index 4b444a3f2af..2a4e1328ceb 100644
--- a/frontend/src/metabase/visualizations/components/ChartWithLegend.jsx
+++ b/frontend/src/metabase/visualizations/components/ChartWithLegend.jsx
@@ -1,10 +1,10 @@
 import React, { Component } from "react";
 import styles from "./ChartWithLegend.css";
 
-import LegendVertical from "./LegendVertical.jsx";
-import LegendHorizontal from "./LegendHorizontal.jsx";
+import LegendVertical from "./LegendVertical";
+import LegendHorizontal from "./LegendHorizontal";
 
-import ExplicitSize from "metabase/components/ExplicitSize.jsx";
+import ExplicitSize from "metabase/components/ExplicitSize";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx b/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx
index ad01d3562b3..ff8fdcfb3b4 100644
--- a/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx
+++ b/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx
@@ -2,7 +2,7 @@
 
 import React, { Component } from "react";
 import { t } from "ttag";
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
 
 import { isString } from "metabase/lib/schema_metadata";
 import { MinColumnsError } from "metabase/visualizations/lib/errors";
@@ -10,9 +10,9 @@ import MetabaseSettings from "metabase/lib/settings";
 
 import { formatValue } from "metabase/lib/formatting";
 
-import ChartWithLegend from "./ChartWithLegend.jsx";
-import LegacyChoropleth from "./LegacyChoropleth.jsx";
-import LeafletChoropleth from "./LeafletChoropleth.jsx";
+import ChartWithLegend from "./ChartWithLegend";
+import LegacyChoropleth from "./LegacyChoropleth";
+import LeafletChoropleth from "./LeafletChoropleth";
 
 import {
   computeMinimalBounds,
diff --git a/frontend/src/metabase/visualizations/components/FunnelBar.jsx b/frontend/src/metabase/visualizations/components/FunnelBar.jsx
index 1a2d7fa773e..08ba10ab99d 100644
--- a/frontend/src/metabase/visualizations/components/FunnelBar.jsx
+++ b/frontend/src/metabase/visualizations/components/FunnelBar.jsx
@@ -2,7 +2,7 @@
 
 import React, { Component } from "react";
 
-import BarChart from "metabase/visualizations/visualizations/BarChart.jsx";
+import BarChart from "metabase/visualizations/visualizations/BarChart";
 
 import { getComputedSettingsForSeries } from "metabase/visualizations/lib/settings/visualization";
 import { assocIn } from "icepick";
diff --git a/frontend/src/metabase/visualizations/components/FunnelNormal.jsx b/frontend/src/metabase/visualizations/components/FunnelNormal.jsx
index 5593c7ad1f1..d66160acbfa 100644
--- a/frontend/src/metabase/visualizations/components/FunnelNormal.jsx
+++ b/frontend/src/metabase/visualizations/components/FunnelNormal.jsx
@@ -5,7 +5,7 @@ import React, { Component } from "react";
 import cx from "classnames";
 import styles from "./FunnelNormal.css";
 
-import Ellipsified from "metabase/components/Ellipsified.jsx";
+import Ellipsified from "metabase/components/Ellipsified";
 import { formatValue } from "metabase/lib/formatting";
 import { getFriendlyName } from "metabase/visualizations/lib/utils";
 
diff --git a/frontend/src/metabase/visualizations/components/LeafletChoropleth.jsx b/frontend/src/metabase/visualizations/components/LeafletChoropleth.jsx
index a61218f1964..d33a47f1580 100644
--- a/frontend/src/metabase/visualizations/components/LeafletChoropleth.jsx
+++ b/frontend/src/metabase/visualizations/components/LeafletChoropleth.jsx
@@ -1,8 +1,8 @@
 import React from "react";
 
-import { normal } from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
-import CardRenderer from "./CardRenderer.jsx";
+import CardRenderer from "./CardRenderer";
 
 // import L from "leaflet";
 import "leaflet/dist/leaflet.css";
@@ -14,7 +14,7 @@ const LeafletChoropleth = ({
   series,
   geoJson,
   minimalBounds = computeMinimalBounds(geoJson.features),
-  getColor = () => normal.blue,
+  getColor = () => color("brand"),
   onHoverFeature = () => {},
   onClickFeature = () => {},
 }) => (
diff --git a/frontend/src/metabase/visualizations/components/LeafletGridHeatMap.jsx b/frontend/src/metabase/visualizations/components/LeafletGridHeatMap.jsx
index 1d88b8bd9a4..cdf4afb8279 100644
--- a/frontend/src/metabase/visualizations/components/LeafletGridHeatMap.jsx
+++ b/frontend/src/metabase/visualizations/components/LeafletGridHeatMap.jsx
@@ -1,10 +1,10 @@
-import LeafletMap from "./LeafletMap.jsx";
+import LeafletMap from "./LeafletMap";
 import L from "leaflet";
 import { t } from "ttag";
 import d3 from "d3";
 
 import { rangeForValue } from "metabase/lib/dataset";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 export default class LeafletGridHeatMap extends LeafletMap {
   componentDidMount() {
@@ -26,11 +26,11 @@ export default class LeafletGridHeatMap extends LeafletMap {
         throw new Error(t`Grid map requires binned longitude/latitude.`);
       }
 
-      const color = d3.scale
+      const colorScale = d3.scale
         .linear()
         .domain([min, max])
         .interpolate(d3.interpolateHcl)
-        .range([d3.rgb(colors["success"]), d3.rgb(colors["error"])]);
+        .range([d3.rgb(color("success")), d3.rgb(color("error"))]);
 
       const gridSquares = gridLayer.getLayers();
       const totalSquares = Math.max(points.length, gridSquares.length);
@@ -45,7 +45,7 @@ export default class LeafletGridHeatMap extends LeafletMap {
         }
 
         if (i < points.length) {
-          gridSquares[i].setStyle({ color: color(points[i][2]) });
+          gridSquares[i].setStyle({ color: colorScale(points[i][2]) });
           const [latMin, latMax] = rangeForValue(points[i][0], latitudeColumn);
           const [lonMin, lonMax] = rangeForValue(points[i][1], longitudeColumn);
           gridSquares[i].setBounds([[latMin, lonMin], [latMax, lonMax]]);
diff --git a/frontend/src/metabase/visualizations/components/LeafletHeatMap.jsx b/frontend/src/metabase/visualizations/components/LeafletHeatMap.jsx
index 184efccd68a..565e39be580 100644
--- a/frontend/src/metabase/visualizations/components/LeafletHeatMap.jsx
+++ b/frontend/src/metabase/visualizations/components/LeafletHeatMap.jsx
@@ -1,4 +1,4 @@
-import LeafletMap from "./LeafletMap.jsx";
+import LeafletMap from "./LeafletMap";
 
 import L from "leaflet";
 import "leaflet.heat";
diff --git a/frontend/src/metabase/visualizations/components/LeafletMarkerPinMap.jsx b/frontend/src/metabase/visualizations/components/LeafletMarkerPinMap.jsx
index 322e9f63a66..0aa0cc1e6e7 100644
--- a/frontend/src/metabase/visualizations/components/LeafletMarkerPinMap.jsx
+++ b/frontend/src/metabase/visualizations/components/LeafletMarkerPinMap.jsx
@@ -1,4 +1,4 @@
-import LeafletMap from "./LeafletMap.jsx";
+import LeafletMap from "./LeafletMap";
 import L from "leaflet";
 
 import { isPK } from "metabase/lib/schema_metadata";
diff --git a/frontend/src/metabase/visualizations/components/LeafletTilePinMap.jsx b/frontend/src/metabase/visualizations/components/LeafletTilePinMap.jsx
index c4083497f2f..052da6ddd04 100644
--- a/frontend/src/metabase/visualizations/components/LeafletTilePinMap.jsx
+++ b/frontend/src/metabase/visualizations/components/LeafletTilePinMap.jsx
@@ -1,4 +1,4 @@
-import LeafletMap from "./LeafletMap.jsx";
+import LeafletMap from "./LeafletMap";
 import L from "leaflet";
 
 export default class LeafletTilePinMap extends LeafletMap {
diff --git a/frontend/src/metabase/visualizations/components/LegendHorizontal.jsx b/frontend/src/metabase/visualizations/components/LegendHorizontal.jsx
index 2594968b122..31ca1efb977 100644
--- a/frontend/src/metabase/visualizations/components/LegendHorizontal.jsx
+++ b/frontend/src/metabase/visualizations/components/LegendHorizontal.jsx
@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import ReactDOM from "react-dom";
 import styles from "./Legend.css";
 
-import LegendItem from "./LegendItem.jsx";
+import LegendItem from "./LegendItem";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/visualizations/components/LegendItem.jsx b/frontend/src/metabase/visualizations/components/LegendItem.jsx
index d4d136bad3b..a0d18eb5abc 100644
--- a/frontend/src/metabase/visualizations/components/LegendItem.jsx
+++ b/frontend/src/metabase/visualizations/components/LegendItem.jsx
@@ -1,8 +1,8 @@
 import React, { Component } from "react";
 
-import Icon from "metabase/components/Icon.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
-import Ellipsified from "metabase/components/Ellipsified.jsx";
+import Icon from "metabase/components/Icon";
+import Tooltip from "metabase/components/Tooltip";
+import Ellipsified from "metabase/components/Ellipsified";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/visualizations/components/LegendVertical.jsx b/frontend/src/metabase/visualizations/components/LegendVertical.jsx
index 4db223065c3..44642297d9a 100644
--- a/frontend/src/metabase/visualizations/components/LegendVertical.jsx
+++ b/frontend/src/metabase/visualizations/components/LegendVertical.jsx
@@ -2,9 +2,9 @@ import React, { Component } from "react";
 import ReactDOM from "react-dom";
 import styles from "./Legend.css";
 import { t } from "ttag";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import Tooltip from "metabase/components/Tooltip";
 
-import LegendItem from "./LegendItem.jsx";
+import LegendItem from "./LegendItem";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/visualizations/components/LineAreaBarChart.jsx b/frontend/src/metabase/visualizations/components/LineAreaBarChart.jsx
index 3cf11b5dee0..e6e2f2aef18 100644
--- a/frontend/src/metabase/visualizations/components/LineAreaBarChart.jsx
+++ b/frontend/src/metabase/visualizations/components/LineAreaBarChart.jsx
@@ -3,9 +3,9 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { t } from "ttag";
-import CardRenderer from "./CardRenderer.jsx";
-import LegendHeader from "./LegendHeader.jsx";
-import { TitleLegendHeader } from "./TitleLegendHeader.jsx";
+import CardRenderer from "./CardRenderer";
+import LegendHeader from "./LegendHeader";
+import { TitleLegendHeader } from "./TitleLegendHeader";
 
 import "./LineAreaBarChart.css";
 
diff --git a/frontend/src/metabase/visualizations/components/MiniBar.jsx b/frontend/src/metabase/visualizations/components/MiniBar.jsx
index b2a2bc8bbd5..e816755e0d9 100644
--- a/frontend/src/metabase/visualizations/components/MiniBar.jsx
+++ b/frontend/src/metabase/visualizations/components/MiniBar.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import colors, { alpha } from "metabase/lib/colors";
+import { color, alpha } from "metabase/lib/colors";
 import { formatValue } from "metabase/lib/formatting";
 
 const BAR_HEIGHT = 8;
@@ -14,7 +14,7 @@ const MiniBar = ({ value, extent: [min, max], options, cellHeight }) => {
   const isNegative = value < 0;
   const barPercent =
     (Math.abs(value) / Math.max(Math.abs(min), Math.abs(max))) * 100;
-  const barColor = isNegative ? colors["error"] : colors["brand"];
+  const barColor = isNegative ? color("error") : color("brand");
 
   const barStyle = !hasNegative
     ? {
diff --git a/frontend/src/metabase/visualizations/components/TableInteractive.jsx b/frontend/src/metabase/visualizations/components/TableInteractive.jsx
index dc17ab0a62c..7ac16ebd861 100644
--- a/frontend/src/metabase/visualizations/components/TableInteractive.jsx
+++ b/frontend/src/metabase/visualizations/components/TableInteractive.jsx
@@ -5,7 +5,7 @@ import PropTypes from "prop-types";
 import ReactDOM from "react-dom";
 import "./TableInteractive.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 import { formatValue } from "metabase/lib/formatting";
 import { isID, isFK } from "metabase/lib/schema_metadata";
@@ -22,13 +22,13 @@ import Dimension from "metabase-lib/lib/Dimension";
 import _ from "underscore";
 import cx from "classnames";
 
-import ExplicitSize from "metabase/components/ExplicitSize.jsx";
+import ExplicitSize from "metabase/components/ExplicitSize";
 import MiniBar from "./MiniBar";
 
 // $FlowFixMe: had to ignore react-virtualized in flow, probably due to different version
 import { Grid, ScrollSync } from "react-virtualized";
 import Draggable from "react-draggable";
-import Ellipsified from "metabase/components/Ellipsified.jsx";
+import Ellipsified from "metabase/components/Ellipsified";
 
 const HEADER_HEIGHT = 36;
 const ROW_HEIGHT = 36;
diff --git a/frontend/src/metabase/visualizations/components/TableSimple.jsx b/frontend/src/metabase/visualizations/components/TableSimple.jsx
index 74b6b1ab6b4..f962604e0e8 100644
--- a/frontend/src/metabase/visualizations/components/TableSimple.jsx
+++ b/frontend/src/metabase/visualizations/components/TableSimple.jsx
@@ -6,9 +6,9 @@ import ReactDOM from "react-dom";
 
 import styles from "./Table.css";
 
-import ExplicitSize from "metabase/components/ExplicitSize.jsx";
-import Ellipsified from "metabase/components/Ellipsified.jsx";
-import Icon from "metabase/components/Icon.jsx";
+import ExplicitSize from "metabase/components/ExplicitSize";
+import Ellipsified from "metabase/components/Ellipsified";
+import Icon from "metabase/components/Icon";
 import MiniBar from "./MiniBar";
 
 import { formatValue } from "metabase/lib/formatting";
diff --git a/frontend/src/metabase/visualizations/components/TitleLegendHeader.jsx b/frontend/src/metabase/visualizations/components/TitleLegendHeader.jsx
index 83d6b7835b1..706ca63ec8a 100644
--- a/frontend/src/metabase/visualizations/components/TitleLegendHeader.jsx
+++ b/frontend/src/metabase/visualizations/components/TitleLegendHeader.jsx
@@ -1,5 +1,5 @@
 import React from "react";
-import LegendHeader from "./LegendHeader.jsx";
+import LegendHeader from "./LegendHeader";
 import _ from "underscore";
 
 export const TitleLegendHeader = ({
diff --git a/frontend/src/metabase/visualizations/components/Visualization.jsx b/frontend/src/metabase/visualizations/components/Visualization.jsx
index 69350120ece..305dbeebb36 100644
--- a/frontend/src/metabase/visualizations/components/Visualization.jsx
+++ b/frontend/src/metabase/visualizations/components/Visualization.jsx
@@ -2,13 +2,13 @@
 
 import React from "react";
 
-import ExplicitSize from "metabase/components/ExplicitSize.jsx";
-import LegendHeader from "metabase/visualizations/components/LegendHeader.jsx";
-import ChartTooltip from "metabase/visualizations/components/ChartTooltip.jsx";
-import ChartClickActions from "metabase/visualizations/components/ChartClickActions.jsx";
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import Tooltip from "metabase/components/Tooltip.jsx";
+import ExplicitSize from "metabase/components/ExplicitSize";
+import LegendHeader from "metabase/visualizations/components/LegendHeader";
+import ChartTooltip from "metabase/visualizations/components/ChartTooltip";
+import ChartClickActions from "metabase/visualizations/components/ChartClickActions";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
+import Icon from "metabase/components/Icon";
+import Tooltip from "metabase/components/Tooltip";
 import { t, jt } from "ttag";
 import { duration, formatNumber } from "metabase/lib/formatting";
 import MetabaseAnalytics from "metabase/lib/analytics";
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingColorsPicker.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingColorsPicker.jsx
index b518cf2cb4d..885d8401a34 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingColorsPicker.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingColorsPicker.jsx
@@ -1,6 +1,6 @@
 import React, { Component } from "react";
 
-import ChartSettingColorPicker from "./ChartSettingColorPicker.jsx";
+import ChartSettingColorPicker from "./ChartSettingColorPicker";
 
 export default class ChartSettingColorsPicker extends Component {
   render() {
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldPicker.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldPicker.jsx
index d7a60780675..b8b65e08e3f 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldPicker.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldPicker.jsx
@@ -6,7 +6,7 @@ import _ from "underscore";
 
 import Icon from "metabase/components/Icon";
 
-import ChartSettingSelect from "./ChartSettingSelect.jsx";
+import ChartSettingSelect from "./ChartSettingSelect";
 
 import { keyForColumn } from "metabase/lib/dataset";
 
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldsPicker.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldsPicker.jsx
index 6437bfebe2c..cae9a6e25ad 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldsPicker.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingFieldsPicker.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 import { t } from "ttag";
-import ChartSettingFieldPicker from "./ChartSettingFieldPicker.jsx";
+import ChartSettingFieldPicker from "./ChartSettingFieldPicker";
 
 const ChartSettingFieldsPicker = ({
   value = [],
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingGaugeSegments.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingGaugeSegments.jsx
index ed591ed495b..6290c736cc8 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingGaugeSegments.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingGaugeSegments.jsx
@@ -3,7 +3,7 @@ import React from "react";
 import { t } from "ttag";
 import _ from "underscore";
 
-import colors, { normal } from "metabase/lib/colors";
+import { color, normal } from "metabase/lib/colors";
 
 import ColorPicker from "metabase/components/ColorPicker";
 import Button from "metabase/components/Button";
@@ -98,11 +98,11 @@ const ChartSettingGaugeSegments = ({ value: segments, onChange }) => {
 
 function getColorPalette() {
   return [
-    colors["error"],
-    colors["warning"],
-    colors["success"],
+    color("error"),
+    color("warning"),
+    color("success"),
     ...Object.values(normal).slice(0, 9),
-    colors["bg-medium"],
+    color("bg-medium"),
   ];
 }
 
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingInputGroup.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingInputGroup.jsx
index 8cc95fbbfef..ed76486207d 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingInputGroup.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingInputGroup.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import InputBlurChange from "metabase/components/InputBlurChange.jsx";
+import InputBlurChange from "metabase/components/InputBlurChange";
 
 // value is an array of strings. This component provides one input box per string
 export default function ChartSettingInputGroup({ value: values, onChange }) {
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingRadio.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingRadio.jsx
index 4b0d8c79cb4..f238b69ce3d 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingRadio.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingRadio.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Radio from "metabase/components/Radio.jsx";
+import Radio from "metabase/components/Radio";
 
 const ChartSettingRadio = ({ value, onChange, options = [], className }) => (
   <Radio
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingSelect.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingSelect.jsx
index 02af84689dc..79be3df6411 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingSelect.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingSelect.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Select, { Option } from "metabase/components/Select.jsx";
+import Select, { Option } from "metabase/components/Select";
 
 import cx from "classnames";
 
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingToggle.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingToggle.jsx
index 5a69458de75..f167c229641 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingToggle.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingToggle.jsx
@@ -1,6 +1,6 @@
 import React from "react";
 
-import Toggle from "metabase/components/Toggle.jsx";
+import Toggle from "metabase/components/Toggle";
 
 const ChartSettingToggle = ({ value, onChange }) => (
   <Toggle value={value} onChange={onChange} />
diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx
index 77905158768..007240f12cb 100644
--- a/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx
+++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx
@@ -49,16 +49,16 @@ const ALL_OPERATOR_NAMES = {
   ...STRING_OPERATOR_NAMES,
 };
 
-import colors, { desaturated } from "metabase/lib/colors";
+import { color, desaturated } from "metabase/lib/colors";
 
 const COLORS = Object.values(desaturated);
 const COLOR_RANGES = [].concat(
   ...COLORS.map(color => [["white", color], [color, "white"]]),
   [
-    [colors.error, "white", colors.success],
-    [colors.success, "white", colors.error],
-    [colors.error, colors.warning, colors.success],
-    [colors.success, colors.warning, colors.error],
+    [color("error"), "white", color("success")],
+    [color("success"), "white", color("error")],
+    [color("error"), color("warning"), color("success")],
+    [color("success"), color("warning"), color("error")],
   ],
 );
 
diff --git a/frontend/src/metabase/visualizations/index.js b/frontend/src/metabase/visualizations/index.js
index c03751c7c77..01f32feedae 100644
--- a/frontend/src/metabase/visualizations/index.js
+++ b/frontend/src/metabase/visualizations/index.js
@@ -1,21 +1,21 @@
 /* @flow weak */
 
-import Scalar from "./visualizations/Scalar.jsx";
-import SmartScalar from "./visualizations/SmartScalar.jsx";
-import Progress from "./visualizations/Progress.jsx";
-import Table from "./visualizations/Table.jsx";
-import Text from "./visualizations/Text.jsx";
-import LineChart from "./visualizations/LineChart.jsx";
-import BarChart from "./visualizations/BarChart.jsx";
-import RowChart from "./visualizations/RowChart.jsx";
-import PieChart from "./visualizations/PieChart.jsx";
-import AreaChart from "./visualizations/AreaChart.jsx";
-import ComboChart from "./visualizations/ComboChart.jsx";
-import MapViz from "./visualizations/Map.jsx";
-import ScatterPlot from "./visualizations/ScatterPlot.jsx";
-import Funnel from "./visualizations/Funnel.jsx";
-import Gauge from "./visualizations/Gauge.jsx";
-import ObjectDetail from "./visualizations/ObjectDetail.jsx";
+import Scalar from "./visualizations/Scalar";
+import SmartScalar from "./visualizations/SmartScalar";
+import Progress from "./visualizations/Progress";
+import Table from "./visualizations/Table";
+import Text from "./visualizations/Text";
+import LineChart from "./visualizations/LineChart";
+import BarChart from "./visualizations/BarChart";
+import RowChart from "./visualizations/RowChart";
+import PieChart from "./visualizations/PieChart";
+import AreaChart from "./visualizations/AreaChart";
+import ComboChart from "./visualizations/ComboChart";
+import MapViz from "./visualizations/Map";
+import ScatterPlot from "./visualizations/ScatterPlot";
+import Funnel from "./visualizations/Funnel";
+import Gauge from "./visualizations/Gauge";
+import ObjectDetail from "./visualizations/ObjectDetail";
 import { t } from "ttag";
 import _ from "underscore";
 
diff --git a/frontend/src/metabase/visualizations/lib/LineAreaBarPostRender.js b/frontend/src/metabase/visualizations/lib/LineAreaBarPostRender.js
index 0d791099e9c..43bf5d2d083 100644
--- a/frontend/src/metabase/visualizations/lib/LineAreaBarPostRender.js
+++ b/frontend/src/metabase/visualizations/lib/LineAreaBarPostRender.js
@@ -3,7 +3,7 @@
 import d3 from "d3";
 import _ from "underscore";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import { clipPathReference } from "metabase/lib/dom";
 import { adjustYAxisTicksIfNeeded } from "./apply_axis";
 
@@ -284,7 +284,7 @@ function onRenderCleanupGoalAndTrend(chart, onGoalHover, isSplitAxis) {
         y: y - 5,
         "text-anchor": labelOnRight ? "end" : "start",
         "font-weight": "bold",
-        fill: colors["text-medium"],
+        fill: color("text-medium"),
       })
       .on("mouseenter", function() {
         onGoalHover(this);
diff --git a/frontend/src/metabase/visualizations/lib/settings.js b/frontend/src/metabase/visualizations/lib/settings.js
index 9357547ad47..0102d8ab991 100644
--- a/frontend/src/metabase/visualizations/lib/settings.js
+++ b/frontend/src/metabase/visualizations/lib/settings.js
@@ -1,16 +1,16 @@
 /* @flow */
 
-import ChartSettingInput from "metabase/visualizations/components/settings/ChartSettingInput.jsx";
-import ChartSettingInputGroup from "metabase/visualizations/components/settings/ChartSettingInputGroup.jsx";
-import ChartSettingInputNumeric from "metabase/visualizations/components/settings/ChartSettingInputNumeric.jsx";
-import ChartSettingRadio from "metabase/visualizations/components/settings/ChartSettingRadio.jsx";
-import ChartSettingSelect from "metabase/visualizations/components/settings/ChartSettingSelect.jsx";
-import ChartSettingToggle from "metabase/visualizations/components/settings/ChartSettingToggle.jsx";
-import ChartSettingButtonGroup from "metabase/visualizations/components/settings/ChartSettingButtonGroup.jsx";
-import ChartSettingFieldPicker from "metabase/visualizations/components/settings/ChartSettingFieldPicker.jsx";
-import ChartSettingFieldsPicker from "metabase/visualizations/components/settings/ChartSettingFieldsPicker.jsx";
-import ChartSettingColorPicker from "metabase/visualizations/components/settings/ChartSettingColorPicker.jsx";
-import ChartSettingColorsPicker from "metabase/visualizations/components/settings/ChartSettingColorsPicker.jsx";
+import ChartSettingInput from "metabase/visualizations/components/settings/ChartSettingInput";
+import ChartSettingInputGroup from "metabase/visualizations/components/settings/ChartSettingInputGroup";
+import ChartSettingInputNumeric from "metabase/visualizations/components/settings/ChartSettingInputNumeric";
+import ChartSettingRadio from "metabase/visualizations/components/settings/ChartSettingRadio";
+import ChartSettingSelect from "metabase/visualizations/components/settings/ChartSettingSelect";
+import ChartSettingToggle from "metabase/visualizations/components/settings/ChartSettingToggle";
+import ChartSettingButtonGroup from "metabase/visualizations/components/settings/ChartSettingButtonGroup";
+import ChartSettingFieldPicker from "metabase/visualizations/components/settings/ChartSettingFieldPicker";
+import ChartSettingFieldsPicker from "metabase/visualizations/components/settings/ChartSettingFieldsPicker";
+import ChartSettingColorPicker from "metabase/visualizations/components/settings/ChartSettingColorPicker";
+import ChartSettingColorsPicker from "metabase/visualizations/components/settings/ChartSettingColorsPicker";
 
 import MetabaseAnalytics from "metabase/lib/analytics";
 
diff --git a/frontend/src/metabase/visualizations/visualizations/Gauge.jsx b/frontend/src/metabase/visualizations/visualizations/Gauge.jsx
index 71bf7362d1d..a972deef841 100644
--- a/frontend/src/metabase/visualizations/visualizations/Gauge.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/Gauge.jsx
@@ -8,7 +8,7 @@ import cx from "classnames";
 
 import _ from "underscore";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import { formatValue } from "metabase/lib/formatting";
 import { isNumeric } from "metabase/lib/schema_metadata";
 import { columnSettings } from "metabase/visualizations/lib/settings/column";
@@ -30,10 +30,10 @@ const ARROW_BASE = ARROW_HEIGHT / Math.tan((64 / 180) * Math.PI);
 const ARROW_STROKE_THICKNESS = 1.25;
 
 // colors
-const BACKGROUND_ARC_COLOR = colors["bg-medium"];
-const SEGMENT_LABEL_COLOR = colors["text-dark"];
-const CENTER_LABEL_COLOR = colors["text-dark"];
-const ARROW_FILL_COLOR = colors["text-medium"];
+const BACKGROUND_ARC_COLOR = color("bg-medium");
+const SEGMENT_LABEL_COLOR = color("text-dark");
+const CENTER_LABEL_COLOR = color("text-dark");
+const ARROW_FILL_COLOR = color("text-medium");
 const ARROW_STROKE_COLOR = "white";
 
 // in ems, but within the scaled 100px SVG element
@@ -119,9 +119,9 @@ export default class Gauge extends Component {
           value = series[0].data.rows[0][0];
         } catch (e) {}
         return [
-          { min: 0, max: value / 2, color: colors["error"], label: "" },
-          { min: value / 2, max: value, color: colors["warning"], label: "" },
-          { min: value, max: value * 2, color: colors["success"], label: "" },
+          { min: 0, max: value / 2, color: color("error"), label: "" },
+          { min: value / 2, max: value, color: color("warning"), label: "" },
+          { min: value, max: value * 2, color: color("success"), label: "" },
         ];
       },
       widget: ChartSettingGaugeSegments,
@@ -399,7 +399,7 @@ const GaugeSegmentLabel = ({ position: [x, y], style = {}, children }) => (
     x={x}
     y={y}
     style={{
-      fill: colors["text-medium"],
+      fill: color("text-medium"),
       fontSize: `${FONT_SIZE_SEGMENT_LABEL}em`,
       textAnchor: Math.abs(x) < 5 ? "middle" : x > 0 ? "start" : "end",
       // shift text in the lower half down a bit
diff --git a/frontend/src/metabase/visualizations/visualizations/Map.jsx b/frontend/src/metabase/visualizations/visualizations/Map.jsx
index c0887601080..44782555bc9 100644
--- a/frontend/src/metabase/visualizations/visualizations/Map.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/Map.jsx
@@ -4,8 +4,8 @@ import React, { Component } from "react";
 import { t } from "ttag";
 import ChoroplethMap, {
   getColorplethColorScale,
-} from "../components/ChoroplethMap.jsx";
-import PinMap from "../components/PinMap.jsx";
+} from "../components/ChoroplethMap";
+import PinMap from "../components/PinMap";
 
 import { ChartSettingsError } from "metabase/visualizations/lib/errors";
 import {
diff --git a/frontend/src/metabase/visualizations/visualizations/ObjectDetail.jsx b/frontend/src/metabase/visualizations/visualizations/ObjectDetail.jsx
index 89195f93491..ba90ce5e44f 100644
--- a/frontend/src/metabase/visualizations/visualizations/ObjectDetail.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/ObjectDetail.jsx
@@ -4,10 +4,10 @@ import React, { Component } from "react";
 import { connect } from "react-redux";
 import { t, jt } from "ttag";
 import DirectionalButton from "metabase/components/DirectionalButton";
-import ExpandableString from "metabase/query_builder/components/ExpandableString.jsx";
-import Icon from "metabase/components/Icon.jsx";
-import IconBorder from "metabase/components/IconBorder.jsx";
-import LoadingSpinner from "metabase/components/LoadingSpinner.jsx";
+import ExpandableString from "metabase/query_builder/components/ExpandableString";
+import Icon from "metabase/components/Icon";
+import IconBorder from "metabase/components/IconBorder";
+import LoadingSpinner from "metabase/components/LoadingSpinner";
 
 import {
   isID,
diff --git a/frontend/src/metabase/visualizations/visualizations/PieChart.jsx b/frontend/src/metabase/visualizations/visualizations/PieChart.jsx
index b6dd579da7e..85e5c226dc2 100644
--- a/frontend/src/metabase/visualizations/visualizations/PieChart.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/PieChart.jsx
@@ -4,8 +4,8 @@ import React, { Component } from "react";
 import ReactDOM from "react-dom";
 import styles from "./PieChart.css";
 import { t } from "ttag";
-import ChartTooltip from "../components/ChartTooltip.jsx";
-import ChartWithLegend from "../components/ChartWithLegend.jsx";
+import ChartTooltip from "../components/ChartTooltip";
+import ChartWithLegend from "../components/ChartWithLegend";
 
 import {
   ChartSettingsError,
@@ -23,7 +23,7 @@ import { columnSettings } from "metabase/visualizations/lib/settings/column";
 
 import { formatValue } from "metabase/lib/formatting";
 
-import colors, { getColorsForValues } from "metabase/lib/colors";
+import { color, getColorsForValues } from "metabase/lib/colors";
 
 import cx from "classnames";
 
@@ -267,7 +267,7 @@ export default class PieChart extends Component {
             key: "Other",
             value: otherTotal,
             percentage: otherTotal / total,
-            color: colors["text-light"],
+            color: color("text-light"),
           };
     if (otherSlice.value > 0) {
       // increase "other" slice so it's barely visible
@@ -303,7 +303,7 @@ export default class PieChart extends Component {
     if (slices.length === 0) {
       otherSlice = {
         value: 1,
-        color: colors["text-light"],
+        color: color("text-light"),
         noHover: true,
       };
       slices.push(otherSlice);
diff --git a/frontend/src/metabase/visualizations/visualizations/Progress.jsx b/frontend/src/metabase/visualizations/visualizations/Progress.jsx
index d98a3e4c09a..50c1da13348 100644
--- a/frontend/src/metabase/visualizations/visualizations/Progress.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/Progress.jsx
@@ -5,9 +5,9 @@ import ReactDOM from "react-dom";
 import { t } from "ttag";
 import { formatValue } from "metabase/lib/formatting";
 import { isNumeric } from "metabase/lib/schema_metadata";
-import Icon from "metabase/components/Icon.jsx";
-import IconBorder from "metabase/components/IconBorder.jsx";
-import { normal } from "metabase/lib/colors";
+import Icon from "metabase/components/Icon";
+import IconBorder from "metabase/components/IconBorder";
+import { color } from "metabase/lib/colors";
 
 import _ from "underscore";
 
@@ -67,7 +67,7 @@ export default class Progress extends Component {
       section: t`Display`,
       title: t`Color`,
       widget: "color",
-      default: normal.green,
+      default: color("accent1"),
     },
   };
 
diff --git a/frontend/src/metabase/visualizations/visualizations/SmartScalar.jsx b/frontend/src/metabase/visualizations/visualizations/SmartScalar.jsx
index bb01561390b..c1c2f2e61a5 100644
--- a/frontend/src/metabase/visualizations/visualizations/SmartScalar.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/SmartScalar.jsx
@@ -4,7 +4,7 @@ import { t, jt } from "ttag";
 import _ from "underscore";
 
 import { formatNumber, formatValue } from "metabase/lib/formatting";
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 
 import Icon from "metabase/components/Icon";
 
@@ -111,15 +111,14 @@ export default class Smart extends React.Component {
 
     const change = formatNumber(lastChange * 100);
     const isNegative = (change && Math.sign(change) < 0) || false;
-
-    let color = isNegative ? colors["error"] : colors["success"];
+    const isSwapped = settings["scalar.switch_positive_negative"];
 
     // if the number is negative but thats been identified as a good thing (e.g. decreased latency somehow?)
-    if (isNegative && settings["scalar.switch_positive_negative"]) {
-      color = colors["success"];
-    } else if (!isNegative && settings["scalar.switch_positive_negative"]) {
-      color = colors["error"];
-    }
+    const changeColor = (isSwapped
+    ? !isNegative
+    : isNegative)
+      ? color("error")
+      : color("success");
 
     const changeDisplay = (
       <span style={{ fontWeight: 900 }}>{Math.abs(change)}%</span>
@@ -127,7 +126,7 @@ export default class Smart extends React.Component {
     const separator = (
       <span
         style={{
-          color: colors["text-light"],
+          color: color("text-light"),
           fontSize: "0.7rem",
           marginLeft: 4,
           marginRight: 4,
@@ -185,11 +184,11 @@ export default class Smart extends React.Component {
           {!lastChange || !previousValue ? (
             <Box
               className="text-centered text-bold mt1"
-              color={colors["text-medium"]}
+              color={color("text-medium")}
             >{jt`Nothing to compare for the previous ${granularity}.`}</Box>
           ) : (
             <Flex align="center" mt={1} flexWrap="wrap">
-              <Flex align="center" color={color}>
+              <Flex align="center" color={changeColor}>
                 <Icon name={isNegative ? "arrow_down" : "arrow_up"} />
                 {changeDisplay}
               </Flex>
@@ -197,7 +196,7 @@ export default class Smart extends React.Component {
                 id="SmartScalar-PreviousValue"
                 className="flex align-center hide lg-show"
                 style={{
-                  color: colors["text-medium"],
+                  color: color("text-medium"),
                 }}
               >
                 {!isFullscreen &&
diff --git a/frontend/src/metabase/visualizations/visualizations/Table.jsx b/frontend/src/metabase/visualizations/visualizations/Table.jsx
index f8b665a8357..d1d172bc0f8 100644
--- a/frontend/src/metabase/visualizations/visualizations/Table.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/Table.jsx
@@ -3,7 +3,7 @@
 import React, { Component } from "react";
 
 import TableInteractive from "../components/TableInteractive.jsx";
-import TableSimple from "../components/TableSimple.jsx";
+import TableSimple from "../components/TableSimple";
 import { t } from "ttag";
 import * as DataGrid from "metabase/lib/data_grid";
 import { findColumnIndexForColumnSetting } from "metabase/lib/dataset";
@@ -22,10 +22,10 @@ import {
   isImageURL,
   isAvatarURL,
 } from "metabase/lib/schema_metadata";
-import ChartSettingOrderedColumns from "metabase/visualizations/components/settings/ChartSettingOrderedColumns.jsx";
+import ChartSettingOrderedColumns from "metabase/visualizations/components/settings/ChartSettingOrderedColumns";
 import ChartSettingsTableFormatting, {
   isFormattable,
-} from "metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx";
+} from "metabase/visualizations/components/settings/ChartSettingsTableFormatting";
 
 import { makeCellBackgroundGetter } from "metabase/visualizations/lib/table_format";
 import { columnSettings } from "metabase/visualizations/lib/settings/column";
diff --git a/frontend/src/metabase/visualizations/visualizations/Text.jsx b/frontend/src/metabase/visualizations/visualizations/Text.jsx
index 4e0a869adfd..51096b844a5 100644
--- a/frontend/src/metabase/visualizations/visualizations/Text.jsx
+++ b/frontend/src/metabase/visualizations/visualizations/Text.jsx
@@ -4,7 +4,7 @@ import React, { Component } from "react";
 import ReactMarkdown from "react-markdown";
 import styles from "./Text.css";
 
-import Icon from "metabase/components/Icon.jsx";
+import Icon from "metabase/components/Icon";
 
 import cx from "classnames";
 import { t } from "ttag";
diff --git a/frontend/test/__support__/mocks.js b/frontend/test/__support__/mocks.js
index f498fa869e4..f8ce89b75e2 100644
--- a/frontend/test/__support__/mocks.js
+++ b/frontend/test/__support__/mocks.js
@@ -38,7 +38,7 @@ modal.default = modal.TestModal;
 import * as tooltip from "metabase/components/Tooltip";
 tooltip.default = tooltip.TestTooltip;
 
-jest.mock("metabase/components/Popover.jsx");
+jest.mock("metabase/components/Popover");
 
 import * as bodyComponent from "metabase/components/BodyComponent";
 bodyComponent.default = bodyComponent.TestBodyComponent;
diff --git a/frontend/test/metabase-lib/lib/Dimension.unit.spec.js b/frontend/test/metabase-lib/lib/Dimension.unit.spec.js
index 8419ac673ea..7730a00590d 100644
--- a/frontend/test/metabase-lib/lib/Dimension.unit.spec.js
+++ b/frontend/test/metabase-lib/lib/Dimension.unit.spec.js
@@ -106,14 +106,15 @@ describe("Dimension", () => {
           expect(Dimension.parseMBQL(["field-id", 1], metadata).mbql()).toEqual(
             ["field-id", 1],
           );
-          expect(Dimension.parseMBQL(["fk->", 1, 2], metadata).mbql()).toEqual([
-            "fk->",
-            ["field-id", 1],
-            ["field-id", 2],
-          ]);
           expect(
             Dimension.parseMBQL(
-              ["datetime-field", 1, "month"],
+              ["fk->", ["field-id", 1], ["field-id", 2]],
+              metadata,
+            ).mbql(),
+          ).toEqual(["fk->", ["field-id", 1], ["field-id", 2]]);
+          expect(
+            Dimension.parseMBQL(
+              ["datetime-field", ["field-id", 1], "month"],
               metadata,
             ).mbql(),
           ).toEqual(["datetime-field", ["field-id", 1], "month"]);
@@ -149,13 +150,22 @@ describe("Dimension", () => {
           expect(d1.isEqual(1)).toEqual(true);
         });
         it("returns false for different type clauses", () => {
-          const d1 = Dimension.parseMBQL(["fk->", 1, 2], metadata);
+          const d1 = Dimension.parseMBQL(
+            ["fk->", ["field-id", 1], ["field-id", 2]],
+            metadata,
+          );
           const d2 = Dimension.parseMBQL(["field-id", 1], metadata);
           expect(d1.isEqual(d2)).toEqual(false);
         });
         it("returns false for same type clauses with different arguments", () => {
-          const d1 = Dimension.parseMBQL(["fk->", 1, 2], metadata);
-          const d2 = Dimension.parseMBQL(["fk->", 1, 3], metadata);
+          const d1 = Dimension.parseMBQL(
+            ["fk->", ["field-id", 1], ["field-id", 2]],
+            metadata,
+          );
+          const d2 = Dimension.parseMBQL(
+            ["fk->", ["field-id", 1], ["field-id", 3]],
+            metadata,
+          );
           expect(d1.isEqual(d2)).toEqual(false);
         });
       });
diff --git a/frontend/test/metabase-lib/lib/queries/StructuredQuery-nesting.unit.spec.js b/frontend/test/metabase-lib/lib/queries/StructuredQuery-nesting.unit.spec.js
index 9f15af67f2b..297eb2edeb4 100644
--- a/frontend/test/metabase-lib/lib/queries/StructuredQuery-nesting.unit.spec.js
+++ b/frontend/test/metabase-lib/lib/queries/StructuredQuery-nesting.unit.spec.js
@@ -48,7 +48,7 @@ describe("StructuredQuery nesting", () => {
     it("should return a table with correct dimensions", () => {
       const q = makeStructuredQuery({
         "source-table": ORDERS_TABLE_ID,
-        aggregation: ["count"],
+        aggregation: [["count"]],
         breakout: [["field-id", ORDERS_PRODUCT_FK_FIELD_ID]],
       });
       expect(
diff --git a/frontend/test/metabase/admin/people/containers/PeopleListingApp.integ.spec.js b/frontend/test/metabase/admin/people/containers/PeopleListingApp.integ.spec.js
index fbf1a43762d..954fc21c544 100644
--- a/frontend/test/metabase/admin/people/containers/PeopleListingApp.integ.spec.js
+++ b/frontend/test/metabase/admin/people/containers/PeopleListingApp.integ.spec.js
@@ -3,7 +3,7 @@ import mock from "xhr-mock";
 import { mountWithStore } from "__support__/integration_tests";
 import { click } from "__support__/enzyme_utils";
 import { refreshCurrentUser } from "metabase/redux/user";
-import UserAvatar from "metabase/components/UserAvatar.jsx";
+import UserAvatar from "metabase/components/UserAvatar";
 import Radio from "metabase/components/Radio";
 import EntityMenu from "metabase/components/EntityMenu";
 import EntityMenuItem from "metabase/components/EntityMenuItem";
diff --git a/frontend/test/metabase/admin/settings/SettingsAuthenticationOptions.e2e.spec.js b/frontend/test/metabase/admin/settings/SettingsAuthenticationOptions.e2e.spec.js
index 3486d41e1ad..1c5f085da63 100644
--- a/frontend/test/metabase/admin/settings/SettingsAuthenticationOptions.e2e.spec.js
+++ b/frontend/test/metabase/admin/settings/SettingsAuthenticationOptions.e2e.spec.js
@@ -5,8 +5,8 @@ import { mount } from "enzyme";
 
 import SettingsEditorApp from "metabase/admin/settings/containers/SettingsEditorApp";
 import SettingsAuthenticationOptions from "metabase/admin/settings/components/SettingsAuthenticationOptions";
-import SettingsSingleSignOnForm from "metabase/admin/settings/components/SettingsSingleSignOnForm.jsx";
-import SettingsLdapForm from "metabase/admin/settings/components/SettingsLdapForm.jsx";
+import SettingsSingleSignOnForm from "metabase/admin/settings/components/SettingsSingleSignOnForm";
+import SettingsLdapForm from "metabase/admin/settings/components/SettingsLdapForm";
 
 import { INITIALIZE_SETTINGS } from "metabase/admin/settings/settings";
 
diff --git a/frontend/test/metabase/dashboard/DashCard.unit.spec.js b/frontend/test/metabase/dashboard/DashCard.unit.spec.js
index 38231591e0b..a121476e94b 100644
--- a/frontend/test/metabase/dashboard/DashCard.unit.spec.js
+++ b/frontend/test/metabase/dashboard/DashCard.unit.spec.js
@@ -5,7 +5,7 @@ import { assocIn } from "icepick";
 
 import DashCard from "metabase/dashboard/components/DashCard";
 
-jest.mock("metabase/visualizations/components/Visualization.jsx");
+jest.mock("metabase/visualizations/components/Visualization");
 
 const DEFAULT_PROPS = {
   dashcard: {
diff --git a/frontend/test/metabase/dashboard/dashboard.e2e.spec.js b/frontend/test/metabase/dashboard/dashboard.e2e.spec.js
index ddfd442c335..285e9330069 100644
--- a/frontend/test/metabase/dashboard/dashboard.e2e.spec.js
+++ b/frontend/test/metabase/dashboard/dashboard.e2e.spec.js
@@ -71,7 +71,7 @@ const mockPublicDashboardResponse = {
         {
           parameter_id: "598ab323",
           card_id: 25,
-          target: ["dimension", ["fk->", 3, 21]],
+          target: ["dimension", ["fk->", ["field-id", 3], ["field-id", 21]]],
         },
       ],
       card_id: 25,
diff --git a/frontend/test/metabase/lib/dataset.unit.spec.js b/frontend/test/metabase/lib/dataset.unit.spec.js
index eb9a1bcf1ab..4d35f3bf475 100644
--- a/frontend/test/metabase/lib/dataset.unit.spec.js
+++ b/frontend/test/metabase/lib/dataset.unit.spec.js
@@ -21,7 +21,7 @@ describe("metabase/util/dataset", () => {
     it('should return `["field-id", 1]` for a normal column', () => {
       expect(fieldRefForColumn(FIELD_COLUMN)).toEqual(["field-id", 1]);
     });
-    it('should return `["fk->", 2, 1]` for a fk column', () => {
+    it('should return `["fk->", ["field-id", 2], ["field-id", 1]]` for a fk column', () => {
       expect(fieldRefForColumn(FK_COLUMN)).toEqual([
         "fk->",
         ["field-id", 2],
@@ -233,7 +233,7 @@ describe("metabase/util/dataset", () => {
     });
     it("should find column with non-normalized fieldRef", () => {
       const column = findColumnForColumnSetting(columns, {
-        fieldRef: ["fk->", 2, 1],
+        fieldRef: ["fk->", 2, 1], // deprecated
       });
       expect(column).toBe(columns[1]);
     });
diff --git a/frontend/test/metabase/lib/formatting.unit.spec.js b/frontend/test/metabase/lib/formatting.unit.spec.js
index 03e2a3ea099..d125f1294d1 100644
--- a/frontend/test/metabase/lib/formatting.unit.spec.js
+++ b/frontend/test/metabase/lib/formatting.unit.spec.js
@@ -7,7 +7,7 @@ import {
   formatUrl,
   formatDateTimeWithUnit,
 } from "metabase/lib/formatting";
-import ExternalLink from "metabase/components/ExternalLink.jsx";
+import ExternalLink from "metabase/components/ExternalLink";
 import { TYPE } from "metabase/lib/types";
 
 describe("formatting", () => {
diff --git a/frontend/test/metabase/lib/query.unit.spec.js b/frontend/test/metabase/lib/query.unit.spec.js
index c0cc42ca48f..e15514942bf 100644
--- a/frontend/test/metabase/lib/query.unit.spec.js
+++ b/frontend/test/metabase/lib/query.unit.spec.js
@@ -70,20 +70,14 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should not remove complete sort clauses", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["rows"],
-        breakout: [],
-        filter: [],
-        "order-by": [["asc", 1]],
+        "order-by": [["asc", ["field-id", 1]]],
       };
       Q_DEPRECATED.cleanQuery(query);
-      expect(query["order-by"]).toEqual([["asc", 1]]);
+      expect(query["order-by"]).toEqual([["asc", ["field-id", 1]]]);
     });
     it("should remove incomplete sort clauses", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["rows"],
-        breakout: [],
-        filter: [],
         "order-by": [["asc", null]],
       };
       Q_DEPRECATED.cleanQuery(query);
@@ -93,9 +87,8 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should not remove sort clauses on aggregations if that aggregation supports it", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
+        aggregation: [["count"]],
         breakout: [["field-id", 1]],
-        filter: [],
         "order-by": [["asc", ["aggregation", 0]]],
       };
       Q_DEPRECATED.cleanQuery(query);
@@ -104,9 +97,6 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should remove sort clauses on aggregations if that aggregation doesn't support it", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["rows"],
-        breakout: [],
-        filter: [],
         "order-by": [["asc", ["aggregation", 0]]],
       };
       Q_DEPRECATED.cleanQuery(query);
@@ -116,9 +106,8 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should not remove sort clauses on fields appearing in breakout", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
+        aggregation: [["count"]],
         breakout: [["field-id", 1]],
-        filter: [],
         "order-by": [["asc", ["field-id", 1]]],
       };
       Q_DEPRECATED.cleanQuery(query);
@@ -127,10 +116,8 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should remove sort clauses on fields not appearing in breakout", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
-        breakout: [],
-        filter: [],
-        "order-by": [["asc", 1]],
+        aggregation: [["count"]],
+        "order-by": [["asc", ["field-id", 1]]],
       };
       Q_DEPRECATED.cleanQuery(query);
       expect(query["order-by"]).toEqual(undefined);
@@ -139,53 +126,53 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should not remove sort clauses with foreign keys on fields appearing in breakout", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
-        breakout: [["fk->", 1, 2]],
-        filter: [],
-        "order-by": [["asc", ["fk->", 1, 2]]],
+        aggregation: [["count"]],
+        breakout: [["fk->", ["field-id", 1], ["field-id", 2]]],
+        "order-by": [["asc", ["fk->", ["field-id", 1], ["field-id", 2]]]],
       };
       Q_DEPRECATED.cleanQuery(query);
-      expect(query["order-by"]).toEqual([["asc", ["fk->", 1, 2]]]);
+      expect(query["order-by"]).toEqual([
+        ["asc", ["fk->", ["field-id", 1], ["field-id", 2]]],
+      ]);
     });
 
     it("should not remove sort clauses with datetime-fields on fields appearing in breakout", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
-        breakout: [["datetime-field", 1, "as", "week"]],
-        filter: [],
-        "order-by": [["asc", ["datetime-field", 1, "as", "week"]]],
+        aggregation: [["count"]],
+        breakout: [["datetime-field", ["field-id", 1], "week"]],
+        "order-by": [["asc", ["datetime-field", ["field-id", 1], "week"]]],
       };
       Q_DEPRECATED.cleanQuery(query);
       expect(query["order-by"]).toEqual([
-        ["asc", ["datetime-field", 1, "as", "week"]],
+        ["asc", ["datetime-field", ["field-id", 1], "week"]],
       ]);
     });
 
     it("should replace order-by clauses with the exact matching datetime-fields version in the breakout", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
-        breakout: [["datetime-field", 1, "as", "week"]],
-        filter: [],
-        "order-by": [["asc", 1]],
+        aggregation: [["count"]],
+        breakout: [["datetime-field", ["field-id", 1], "week"]],
+        "order-by": [["asc", ["field-id", 1]]],
       };
       Q_DEPRECATED.cleanQuery(query);
       expect(query["order-by"]).toEqual([
-        ["asc", ["datetime-field", 1, "as", "week"]],
+        ["asc", ["datetime-field", ["field-id", 1], "week"]],
       ]);
     });
 
     it("should replace order-by clauses with the exact matching fk-> version in the breakout", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
-        breakout: [["fk->", 1, 2]],
-        filter: [],
-        "order-by": [["asc", 2]],
+        aggregation: [["count"]],
+        breakout: [["fk->", ["field-id", 1], ["field-id", 2]]],
+        "order-by": [["asc", ["field-id", 2]]],
       };
       Q_DEPRECATED.cleanQuery(query);
-      expect(query["order-by"]).toEqual([["asc", ["fk->", 1, 2]]]);
+      expect(query["order-by"]).toEqual([
+        ["asc", ["fk->", ["field-id", 1], ["field-id", 2]]],
+      ]);
     });
   });
 
@@ -193,9 +180,8 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should not mutate the query", () => {
       const query = {
         "source-table": 0,
-        aggregation: ["count"],
+        aggregation: [["count"]],
         breakout: [["field-id", 1]],
-        filter: [],
       };
       Q_DEPRECATED.removeBreakout(query, 0);
       expect(query.breakout).toEqual([["field-id", 1]]);
@@ -203,9 +189,8 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should remove the dimension", () => {
       let query = {
         "source-table": 0,
-        aggregation: ["count"],
+        aggregation: [["count"]],
         breakout: [["field-id", 1]],
-        filter: [],
       };
       query = Q_DEPRECATED.removeBreakout(query, 0);
       expect(query.breakout).toEqual(undefined);
@@ -213,10 +198,9 @@ describe("Legacy Q_DEPRECATED library", () => {
     it("should remove sort clauses for the dimension that was removed", () => {
       let query = {
         "source-table": 0,
-        aggregation: ["count"],
+        aggregation: [["count"]],
         breakout: [["field-id", 1]],
-        filter: [],
-        "order-by": [["asc", 1]],
+        "order-by": [["asc", ["field-id", 1]]],
       };
       query = Q_DEPRECATED.removeBreakout(query, 0);
       expect(query["order-by"]).toEqual(undefined);
@@ -262,7 +246,7 @@ describe("Legacy Q_DEPRECATED library", () => {
     });
     it("should return unit object for old-style datetime-field", () => {
       const target = Q_DEPRECATED.getFieldTarget(
-        ["datetime-field", 1, "as", "day"],
+        ["datetime-field", ["field-id", 1], "day"],
         table1,
       );
       expect(target.table).toEqual(table1);
@@ -272,7 +256,7 @@ describe("Legacy Q_DEPRECATED library", () => {
     });
     it("should return unit object for new-style datetime-field", () => {
       const target = Q_DEPRECATED.getFieldTarget(
-        ["datetime-field", 1, "as", "day"],
+        ["datetime-field", ["field-id", 1], "day"],
         table1,
       );
       expect(target.table).toEqual(table1);
@@ -282,7 +266,10 @@ describe("Legacy Q_DEPRECATED library", () => {
     });
 
     it("should return field object and table for old-style fk field", () => {
-      const target = Q_DEPRECATED.getFieldTarget(["fk->", 1, 2], table1);
+      const target = Q_DEPRECATED.getFieldTarget(
+        ["fk->", ["field-id", 1], ["field-id", 2]],
+        table1,
+      );
       expect(target.table).toEqual(table2);
       expect(target.field).toEqual(field2);
       expect(target.path).toEqual([field1]);
@@ -302,7 +289,7 @@ describe("Legacy Q_DEPRECATED library", () => {
 
     it("should return field object and table and unit for fk + datetime field", () => {
       const target = Q_DEPRECATED.getFieldTarget(
-        ["datetime-field", ["fk->", 1, 2], "day"],
+        ["datetime-field", ["fk->", ["field-id", 1], ["field-id", 2]], "day"],
         table1,
       );
       expect(target.table).toEqual(table2);
@@ -324,7 +311,9 @@ describe("Legacy Q_DEPRECATED library", () => {
 
 describe("isValidField", () => {
   it("should return true for old-style fk", () => {
-    expect(Q_DEPRECATED.isValidField(["fk->", 1, 2])).toBe(true);
+    expect(
+      Q_DEPRECATED.isValidField(["fk->", ["field-id", 1], ["field-id", 2]]),
+    ).toBe(true);
   });
   it("should return true for new-style fk", () => {
     expect(
@@ -373,7 +362,7 @@ describe("AggregationClause", () => {
     it("should succeed on good clauses", () => {
       expect(A_DEPRECATED.isValid(["metric", 123])).toEqual(true);
       // TODO - actually this should be FALSE because rows is not a valid aggregation type!
-      expect(A_DEPRECATED.isValid(["rows"])).toEqual(true);
+      expect(A_DEPRECATED.isValid(["rows"])).toEqual(true); // deprecated
       expect(A_DEPRECATED.isValid(["sum", 456])).toEqual(true);
     });
   });
@@ -392,7 +381,7 @@ describe("AggregationClause", () => {
     });
 
     it("should succeed on good clauses", () => {
-      expect(A_DEPRECATED.isBareRows(["rows"])).toEqual(true);
+      expect(A_DEPRECATED.isBareRows(["rows"])).toEqual(true); // deprecated
     });
   });
 
@@ -409,7 +398,7 @@ describe("AggregationClause", () => {
     });
 
     it("should succeed on good clauses", () => {
-      expect(A_DEPRECATED.isStandard(["rows"])).toEqual(true);
+      expect(A_DEPRECATED.isStandard(["rows"])).toEqual(true); // deprecated
       expect(A_DEPRECATED.isStandard(["sum", 456])).toEqual(true);
     });
   });
@@ -423,7 +412,7 @@ describe("AggregationClause", () => {
       expect(A_DEPRECATED.isMetric("ab")).toEqual(false);
       expect(A_DEPRECATED.isMetric(["foo", null])).toEqual(false);
       expect(A_DEPRECATED.isMetric(["a", "b", "c"])).toEqual(false);
-      expect(A_DEPRECATED.isMetric(["rows"])).toEqual(false);
+      expect(A_DEPRECATED.isMetric(["rows"])).toEqual(false); // deprecated
       expect(A_DEPRECATED.isMetric(["sum", 456])).toEqual(false);
     });
 
@@ -444,7 +433,7 @@ describe("AggregationClause", () => {
 
   describe("getOperator", () => {
     it("should succeed on good clauses", () => {
-      expect(A_DEPRECATED.getOperator(["rows"])).toEqual("rows");
+      expect(A_DEPRECATED.getOperator(["rows"])).toEqual("rows"); // deprecated
       expect(A_DEPRECATED.getOperator(["sum", 123])).toEqual("sum");
     });
 
@@ -459,7 +448,7 @@ describe("AggregationClause", () => {
     });
 
     it("should be null on clauses w/out a field", () => {
-      expect(A_DEPRECATED.getField(["rows"])).toEqual(null);
+      expect(A_DEPRECATED.getField(["rows"])).toEqual(null); // deprecated
     });
 
     it("should be null on metric clauses", () => {
diff --git a/frontend/test/metabase/lib/query/query.unit.spec.js b/frontend/test/metabase/lib/query/query.unit.spec.js
index bb5c2449aa5..d8f41ebe3d4 100644
--- a/frontend/test/metabase/lib/query/query.unit.spec.js
+++ b/frontend/test/metabase/lib/query/query.unit.spec.js
@@ -2,29 +2,36 @@ import * as Query from "metabase/lib/query/query";
 
 describe("Query", () => {
   describe("isBareRowsAggregation", () => {
-    it("should return true for all bare rows variation", () => {
+    it("should return true for no aggregation", () => {
       expect(Query.isBareRows({})).toBe(true);
+    });
+    it("should return true for no aggregation deprecated form", () => {
       expect(Query.isBareRows({ aggregation: null })).toBe(true); // deprecated
       expect(Query.isBareRows({ aggregation: [] })).toBe(true); // deprecated
     });
     it("should return false for other aggregations", () => {
       expect(Query.isBareRows({ aggregation: [["count"]] })).toBe(false);
+    });
+    it("should return false for other aggregations deprecated form", () => {
       expect(Query.isBareRows({ aggregation: ["count"] })).toBe(false); // deprecated
     });
   });
   describe("getAggregations", () => {
     it("should return an empty list for bare rows", () => {
       expect(Query.getAggregations({})).toEqual([]);
-      expect(Query.getAggregations({ aggregation: [["rows"]] })).toEqual([]);
+    });
+    it("should return an empty list for bare rows for deprecated form", () => {
+      expect(Query.getAggregations({ aggregation: [["rows"]] })).toEqual([]); // deprecated
       expect(Query.getAggregations({ aggregation: ["rows"] })).toEqual([]); // deprecated
     });
     it("should return a single aggregation", () => {
       expect(Query.getAggregations({ aggregation: [["count"]] })).toEqual([
         ["count"],
       ]);
-      expect(Query.getAggregations({ aggregation: ["count"] })).toEqual([
-        ["count"],
-      ]); // deprecated
+    });
+    it("should return a single aggregation for deprecated form", () => {
+      expect(Query.getAggregations({ aggregation: ["count"] })) // deprecated
+        .toEqual([["count"]]);
     });
     it("should return multiple aggregations", () => {
       expect(
@@ -80,9 +87,10 @@ describe("Query", () => {
       expect(Query.removeAggregation({ aggregation: [["count"]] }, 0)).toEqual(
         {},
       );
-      expect(Query.removeAggregation({ aggregation: ["count"] }, 0)).toEqual(
-        {},
-      ); // deprecated
+    });
+    it("should remove the last aggregations for deprecated form", () => {
+      expect(Query.removeAggregation({ aggregation: ["count"] }, 0)) // deprecated
+        .toEqual({});
     });
   });
   describe("clearAggregations", () => {
@@ -93,7 +101,10 @@ describe("Query", () => {
           aggregation: [["count"], ["sum", ["field-id", 1]]],
         }),
       ).toEqual({});
-      expect(Query.clearAggregations({ aggregation: ["count"] })).toEqual({}); // deprecated
+    });
+    it("should remove all aggregations for deprecated form", () => {
+      expect(Query.clearAggregations({ aggregation: ["count"] })) // deprecated
+        .toEqual({});
     });
   });
 
diff --git a/frontend/test/metabase/lib/query_time.unit.spec.js b/frontend/test/metabase/lib/query_time.unit.spec.js
index 8047925f08c..f5eae6ae008 100644
--- a/frontend/test/metabase/lib/query_time.unit.spec.js
+++ b/frontend/test/metabase/lib/query_time.unit.spec.js
@@ -21,10 +21,10 @@ describe("query_time", () => {
 
     it("supports the legacy DatetimeField format", () => {
       expect(
-        parseFieldBucketing(["datetime-field", ["field-id", 3], "as", "week"]),
+        parseFieldBucketing(["datetime-field", ["field-id", 3], "as", "week"]), // deprecated
       ).toBe("week");
       expect(
-        parseFieldBucketing(["datetime-field", ["field-id", 3], "day"]),
+        parseFieldBucketing(["datetime-field", ["field-id", 3], "as", "day"]), // deprecated
       ).toBe("day");
     });
     it("returns the default unit for FK reference", () => {
@@ -41,19 +41,29 @@ describe("query_time", () => {
   describe("expandTimeIntervalFilter", () => {
     it('translate ["current" "month"] correctly', () => {
       expect(
-        expandTimeIntervalFilter(["time-interval", 100, "current", "month"]),
+        expandTimeIntervalFilter([
+          "time-interval",
+          ["field-id", 100],
+          "current",
+          "month",
+        ]),
       ).toEqual([
         "=",
-        ["datetime-field", 100, "as", "month"],
+        ["datetime-field", ["field-id", 100], "month"],
         ["relative-datetime", "current"],
       ]);
     });
     it('translate [-30, "day"] correctly', () => {
       expect(
-        expandTimeIntervalFilter(["time-interval", 100, -30, "day"]),
+        expandTimeIntervalFilter([
+          "time-interval",
+          ["field-id", 100],
+          -30,
+          "day",
+        ]),
       ).toEqual([
         "between",
-        ["datetime-field", 100, "as", "day"],
+        ["datetime-field", ["field-id", 100], "day"],
         ["relative-datetime", -31, "day"],
         ["relative-datetime", -1, "day"],
       ]);
@@ -283,7 +293,7 @@ describe("query_time", () => {
         );
       });
       // it ('should handle "last week"', () => {
-      //     let [start, end] = computeFilterTimeRange(["time-interval", 1, "last", "week"]);
+      //     let [start, end] = computeFilterTimeRange(["time-interval", ["field-id", 1], "last", "week"]);
       //     expect(start.format("YYYY-MM-DD HH:mm:ss")).toEqual(moment().subtract(1, "week").startOf("week").format("YYYY-MM-DD 00:00:00"));
       //     expect(end.format("YYYY-MM-DD HH:mm:ss")).toEqual(moment().subtract(1, "week").endOf("week")..format("YYYY-MM-DD 23:59:59"));
       // });
diff --git a/frontend/test/metabase/meta/Card.unit.spec.js b/frontend/test/metabase/meta/Card.unit.spec.js
index 7bdd787326e..c01fa57e0c4 100644
--- a/frontend/test/metabase/meta/Card.unit.spec.js
+++ b/frontend/test/metabase/meta/Card.unit.spec.js
@@ -106,7 +106,7 @@ describe("metabase/meta/Card", () => {
         {
           card_id: 1,
           parameter_id: 4,
-          target: ["dimension", ["fk->", 4, 5]],
+          target: ["dimension", ["fk->", ["field-id", 4], ["field-id", 5]]],
         },
       ];
       it("should return question URL with no parameters", () => {
@@ -215,7 +215,15 @@ describe("metabase/meta/Card", () => {
             ["dataset_query", "query", "filter"],
             [
               "and",
-              ["=", ["datetime-field", ["fk->", 4, 5], "month"], "2017-05-01"],
+              [
+                "=",
+                [
+                  "datetime-field",
+                  ["fk->", ["field-id", 4], ["field-id", 5]],
+                  "month",
+                ],
+                "2017-05-01",
+              ],
             ],
           ),
         });
diff --git a/frontend/test/metabase/modes/components/actions/CountByTimeAction.unit.spec.js b/frontend/test/metabase/modes/components/actions/CountByTimeAction.unit.spec.js
index 160ecebabc3..bbfda65f897 100644
--- a/frontend/test/metabase/modes/components/actions/CountByTimeAction.unit.spec.js
+++ b/frontend/test/metabase/modes/components/actions/CountByTimeAction.unit.spec.js
@@ -21,12 +21,7 @@ describe("CountByTimeAction", () => {
       "source-table": ORDERS_TABLE_ID,
       aggregation: [["count"]],
       breakout: [
-        [
-          "datetime-field",
-          ["field-id", ORDERS_CREATED_DATE_FIELD_ID],
-          "as",
-          "day",
-        ],
+        ["datetime-field", ["field-id", ORDERS_CREATED_DATE_FIELD_ID], "day"],
       ],
     });
     expect(newCard.display).toEqual("bar");
diff --git a/frontend/test/metabase/modes/components/drill/UnderlyingRecordsDrill.unit.spec.js b/frontend/test/metabase/modes/components/drill/UnderlyingRecordsDrill.unit.spec.js
index 039dfead11e..b3b74fd4aa3 100644
--- a/frontend/test/metabase/modes/components/drill/UnderlyingRecordsDrill.unit.spec.js
+++ b/frontend/test/metabase/modes/components/drill/UnderlyingRecordsDrill.unit.spec.js
@@ -21,12 +21,7 @@ function getActionPropsForTimeseriesClick(unit, value) {
         "source-table": ORDERS_TABLE_ID,
         aggregation: [["count"]],
         breakout: [
-          [
-            "datetime-field",
-            ["field-id", ORDERS_CREATED_DATE_FIELD_ID],
-            "as",
-            unit,
-          ],
+          ["datetime-field", ["field-id", ORDERS_CREATED_DATE_FIELD_ID], unit],
         ],
       })
       .question(),
@@ -57,12 +52,7 @@ describe("UnderlyingRecordsDrill", () => {
       "source-table": ORDERS_TABLE_ID,
       filter: [
         "=",
-        [
-          "datetime-field",
-          ["field-id", ORDERS_CREATED_DATE_FIELD_ID],
-          "as",
-          "month",
-        ],
+        ["datetime-field", ["field-id", ORDERS_CREATED_DATE_FIELD_ID], "month"],
         value,
       ],
     });
@@ -93,7 +83,6 @@ describe("UnderlyingRecordsDrill", () => {
         [
           "datetime-field",
           ["field-id", ORDERS_CREATED_DATE_FIELD_ID],
-          "as",
           "day-of-week",
         ],
         null,
diff --git a/frontend/test/metabase/modes/components/drill/ZoomDrill.unit.spec.js b/frontend/test/metabase/modes/components/drill/ZoomDrill.unit.spec.js
index 46156d5c1dd..89c60ac92c7 100644
--- a/frontend/test/metabase/modes/components/drill/ZoomDrill.unit.spec.js
+++ b/frontend/test/metabase/modes/components/drill/ZoomDrill.unit.spec.js
@@ -27,7 +27,6 @@ describe("ZoomDrill", () => {
             [
               "datetime-field",
               ["field-id", ORDERS_CREATED_DATE_FIELD_ID],
-              "as",
               "month",
             ],
           ],
@@ -49,21 +48,11 @@ describe("ZoomDrill", () => {
       aggregation: [["count"]],
       filter: [
         "=",
-        [
-          "datetime-field",
-          ["field-id", ORDERS_CREATED_DATE_FIELD_ID],
-          "as",
-          "month",
-        ],
+        ["datetime-field", ["field-id", ORDERS_CREATED_DATE_FIELD_ID], "month"],
         clickedDateTimeValue.value,
       ],
       breakout: [
-        [
-          "datetime-field",
-          ["field-id", ORDERS_CREATED_DATE_FIELD_ID],
-          // "as",
-          "week",
-        ],
+        ["datetime-field", ["field-id", ORDERS_CREATED_DATE_FIELD_ID], "week"],
       ],
     });
     expect(newCard.display).toEqual("line");
diff --git a/frontend/test/metabase/modes/lib/actions.unit.spec.js b/frontend/test/metabase/modes/lib/actions.unit.spec.js
index 26c7d1862de..0e2cecadd44 100644
--- a/frontend/test/metabase/modes/lib/actions.unit.spec.js
+++ b/frontend/test/metabase/modes/lib/actions.unit.spec.js
@@ -22,7 +22,7 @@ describe("actions", () => {
       expect(newCard.dataset_query.query).toEqual({
         filter: [
           "=",
-          ["datetime-field", ["field-id", 123], "as", "day"],
+          ["datetime-field", ["field-id", 123], "day"],
           "2018-04-27T00:00:00+02:00",
         ],
       });
diff --git a/frontend/test/metabase/public/public.e2e.spec.js b/frontend/test/metabase/public/public.e2e.spec.js
index 1ff48a27193..c856ba03364 100644
--- a/frontend/test/metabase/public/public.e2e.spec.js
+++ b/frontend/test/metabase/public/public.e2e.spec.js
@@ -55,7 +55,7 @@ import Select from "metabase/components/Select";
 import RunButton from "metabase/query_builder/components/RunButton";
 import Scalar from "metabase/visualizations/visualizations/Scalar";
 import ParameterFieldWidget from "metabase/parameters/components/widgets/ParameterFieldWidget";
-import TextWidget from "metabase/parameters/components/widgets/TextWidget.jsx";
+import TextWidget from "metabase/parameters/components/widgets/TextWidget";
 import SaveQuestionModal from "metabase/containers/SaveQuestionModal";
 import SharingPane from "metabase/public/components/widgets/SharingPane";
 import { EmbedTitle } from "metabase/public/components/widgets/EmbedModalContent";
@@ -414,7 +414,7 @@ describe("public/embedded", () => {
           type: "query",
           query: {
             "source-table": PEOPLE_TABLE_ID,
-            aggregation: ["count"],
+            aggregation: [["count"]],
           },
         },
       });
diff --git a/frontend/test/metabase/query_builder/components/FieldName.unit.spec.js b/frontend/test/metabase/query_builder/components/FieldName.unit.spec.js
index d4883e9e116..e067a543eea 100644
--- a/frontend/test/metabase/query_builder/components/FieldName.unit.spec.js
+++ b/frontend/test/metabase/query_builder/components/FieldName.unit.spec.js
@@ -9,7 +9,7 @@ import {
   PRODUCT_CATEGORY_FIELD_ID,
 } from "__support__/sample_dataset_fixture";
 
-import FieldName from "metabase/query_builder/components/FieldName.jsx";
+import FieldName from "metabase/query_builder/components/FieldName";
 
 describe("FieldName", () => {
   it("should render regular field correctly", () => {
@@ -60,7 +60,10 @@ describe("FieldName", () => {
   it("should render nested fk field correctly", () => {
     pending();
     const fieldName = mount(
-      <FieldName field={["fk->", 3, 2]} tableMetadata={ORDERS_TABLE_ID} />,
+      <FieldName
+        field={["fk->", ["field-id", 3], ["field-id", 2]]}
+        tableMetadata={ORDERS_TABLE_ID}
+      />,
     );
     expect(fieldName.text()).toEqual("BarFoo: Baz");
   });
diff --git a/frontend/test/metabase/reference/databases.e2e.spec.js b/frontend/test/metabase/reference/databases.e2e.spec.js
index 9ed63b79dde..b2f7cb72d0b 100644
--- a/frontend/test/metabase/reference/databases.e2e.spec.js
+++ b/frontend/test/metabase/reference/databases.e2e.spec.js
@@ -22,10 +22,10 @@ import FieldListContainer from "metabase/reference/databases/FieldListContainer"
 import FieldDetailContainer from "metabase/reference/databases/FieldDetailContainer";
 
 import DatabaseList from "metabase/reference/databases/DatabaseList";
-import List from "metabase/components/List.jsx";
-import ListItem from "metabase/components/ListItem.jsx";
-import ReferenceHeader from "metabase/reference/components/ReferenceHeader.jsx";
-import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState.jsx";
+import List from "metabase/components/List";
+import ListItem from "metabase/components/ListItem";
+import ReferenceHeader from "metabase/reference/components/ReferenceHeader";
+import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState";
 import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
 import QueryButton from "metabase/components/QueryButton";
 import { INITIALIZE_QB, QUERY_COMPLETED } from "metabase/query_builder/actions";
@@ -39,7 +39,7 @@ describe("The Reference Section", () => {
     dataset_query: {
       database: 1,
       type: "query",
-      query: { "source-table": 1, aggregation: ["count"] },
+      query: { "source-table": 1, aggregation: [["count"]] },
     },
     visualization_settings: {},
   };
diff --git a/frontend/test/metabase/reference/guide.e2e.spec.js b/frontend/test/metabase/reference/guide.e2e.spec.js
index 78e49d80143..002d7fc01da 100644
--- a/frontend/test/metabase/reference/guide.e2e.spec.js
+++ b/frontend/test/metabase/reference/guide.e2e.spec.js
@@ -41,7 +41,7 @@ describe("The Reference Section", () => {
     description: "I did it!",
     table_id: 1,
     show_in_getting_started: true,
-    definition: { database: 1, query: { aggregation: ["count"] } },
+    definition: { database: 1, query: { aggregation: [["count"]] } },
   };
 
   const anotherMetricDef = {
@@ -49,7 +49,7 @@ describe("The Reference Section", () => {
     description: "I did it again!",
     table_id: 1,
     show_in_getting_started: true,
-    definition: { database: 1, query: { aggregation: ["count"] } },
+    definition: { database: 1, query: { aggregation: [["count"]] } },
   };
 
   // Scaffolding
diff --git a/frontend/test/metabase/reference/segments.e2e.spec.js b/frontend/test/metabase/reference/segments.e2e.spec.js
index 94e15fe1783..ef8451ccbe8 100644
--- a/frontend/test/metabase/reference/segments.e2e.spec.js
+++ b/frontend/test/metabase/reference/segments.e2e.spec.js
@@ -56,7 +56,7 @@ describe("The Reference Section", () => {
       type: "query",
       query: {
         "source-table": 1,
-        aggregation: ["count"],
+        aggregation: [["count"]],
         filter: ["segment", 1],
       },
     },
diff --git a/frontend/test/metabase/reference/utils.unit.spec.js b/frontend/test/metabase/reference/utils.unit.spec.js
index 4f81cedb4f6..e34559b829d 100644
--- a/frontend/test/metabase/reference/utils.unit.spec.js
+++ b/frontend/test/metabase/reference/utils.unit.spec.js
@@ -147,7 +147,7 @@ describe("Reference utils.js", () => {
         getNewQuestion({
           database: 3,
           table: 4,
-          aggregation: ["count"],
+          aggregation: [["count"]],
         }),
       );
     });
@@ -183,7 +183,7 @@ describe("Reference utils.js", () => {
           table: 4,
           display: "bar",
           breakout: [["field-id", 5]],
-          aggregation: ["count"],
+          aggregation: [["count"]],
         }),
       );
     });
@@ -203,7 +203,7 @@ describe("Reference utils.js", () => {
           table: 4,
           display: "pie",
           breakout: [["field-id", 5]],
-          aggregation: ["count"],
+          aggregation: [["count"]],
         }),
       );
     });
@@ -217,7 +217,7 @@ describe("Reference utils.js", () => {
 
       expect(question).toEqual(
         getNewQuestion({
-          aggregation: ["metric", 3],
+          aggregation: [["metric", 3]],
         }),
       );
     });
@@ -232,7 +232,7 @@ describe("Reference utils.js", () => {
 
       expect(question).toEqual(
         getNewQuestion({
-          aggregation: ["metric", 3],
+          aggregation: [["metric", 3]],
           breakout: [["field-id", 4]],
         }),
       );
@@ -249,7 +249,7 @@ describe("Reference utils.js", () => {
         getNewQuestion({
           database: 2,
           table: 3,
-          filter: ["and", ["segment", 4]],
+          filter: ["segment", 4],
         }),
       );
     });
@@ -266,8 +266,8 @@ describe("Reference utils.js", () => {
         getNewQuestion({
           database: 2,
           table: 3,
-          aggregation: ["count"],
-          filter: ["and", ["segment", 4]],
+          aggregation: [["count"]],
+          filter: ["segment", 4],
         }),
       );
     });
diff --git a/frontend/test/metabase/visualizations/components/LegendVertical.unit.spec.js b/frontend/test/metabase/visualizations/components/LegendVertical.unit.spec.js
index b7363ef7a3a..34bc40a0662 100644
--- a/frontend/test/metabase/visualizations/components/LegendVertical.unit.spec.js
+++ b/frontend/test/metabase/visualizations/components/LegendVertical.unit.spec.js
@@ -1,5 +1,5 @@
 import React from "react";
-import LegendVertical from "metabase/visualizations/components/LegendVertical.jsx";
+import LegendVertical from "metabase/visualizations/components/LegendVertical";
 import { mount } from "enzyme";
 
 describe("LegendVertical", () => {
diff --git a/frontend/test/metabase/visualizations/components/LineAreaBarChart.unit.spec.js b/frontend/test/metabase/visualizations/components/LineAreaBarChart.unit.spec.js
index 00476766980..ecc7ee867fa 100644
--- a/frontend/test/metabase/visualizations/components/LineAreaBarChart.unit.spec.js
+++ b/frontend/test/metabase/visualizations/components/LineAreaBarChart.unit.spec.js
@@ -3,7 +3,7 @@
 // HACK: Needed because of conflicts caused by circular dependencies
 import "metabase/visualizations/components/Visualization";
 
-import LineAreaBarChart from "metabase/visualizations/components/LineAreaBarChart";
+import LineAreaBarChart from "metabase/visualizations/components/LineAreaBarChart.jsx";
 
 const millisecondCard = {
   card: {
diff --git a/frontend/test/metabase/visualizations/components/Visualization.unit.spec.js b/frontend/test/metabase/visualizations/components/Visualization.unit.spec.js
index b75c5d35a70..f9f455b992e 100644
--- a/frontend/test/metabase/visualizations/components/Visualization.unit.spec.js
+++ b/frontend/test/metabase/visualizations/components/Visualization.unit.spec.js
@@ -8,7 +8,7 @@ import {
   cleanupFixture,
 } from "../__support__/visualizations";
 
-import colors from "metabase/lib/colors";
+import { color } from "metabase/lib/colors";
 import Visualization from "metabase/visualizations/components/Visualization";
 
 describe("Visualization", () => {
@@ -61,8 +61,8 @@ describe("Visualization", () => {
           },
         ]);
         expect(getBarColors()).toEqual([
-          colors.brand, // "count"
-          colors.brand, // "count"
+          color("brand"), // "count"
+          color("brand"), // "count"
         ]);
       });
     });
@@ -82,10 +82,10 @@ describe("Visualization", () => {
           },
         ]);
         expect(getBarColors()).toEqual([
-          colors.brand, // "count"
-          colors.brand, // "count"
-          colors.accent1, // "sum"
-          colors.accent1, // "sum"
+          color("brand"), // "count"
+          color("brand"), // "count"
+          color("accent1"), // "sum"
+          color("accent1"), // "sum"
         ]);
       });
     });
@@ -110,10 +110,10 @@ describe("Visualization", () => {
           },
         ]);
         expect(getBarColors()).toEqual([
-          colors.accent1, // "a"
-          colors.accent1, // "a"
-          colors.accent2, // "b"
-          colors.accent2, // "b"
+          color("accent1"), // "a"
+          color("accent1"), // "a"
+          color("accent2"), // "b"
+          color("accent2"), // "b"
         ]);
       });
     });
@@ -142,10 +142,10 @@ describe("Visualization", () => {
           },
         ]);
         expect(getBarColors()).toEqual([
-          colors.brand, // "count"
-          colors.brand, // "count"
-          colors.accent2, // "Card2"
-          colors.accent2, // "Card2"
+          color("brand"), // "count"
+          color("brand"), // "count"
+          color("accent2"), // "Card2"
+          color("accent2"), // "Card2"
         ]);
       });
     });
diff --git a/frontend/test/metabase/visualizations/lib/utils.unit.spec.js b/frontend/test/metabase/visualizations/lib/utils.unit.spec.js
index 1f53af77e00..9941eaed176 100644
--- a/frontend/test/metabase/visualizations/lib/utils.unit.spec.js
+++ b/frontend/test/metabase/visualizations/lib/utils.unit.spec.js
@@ -33,7 +33,10 @@ const breakoutMultiseriesQuery = {
   ...baseQuery,
   query: {
     ...baseQuery.query,
-    breakout: [...baseQuery.query.breakout, ["fk->", 1, 10]],
+    breakout: [
+      ...baseQuery.query.breakout,
+      ["fk->", ["field-id", 1], ["field-id", 10]],
+    ],
   },
 };
 const derivedBreakoutMultiseriesQuery = {
-- 
GitLab