diff --git a/README.md b/README.md
index af2fbfdb577..5143f7412b1 100644
--- a/README.md
+++ b/README.md
@@ -96,13 +96,9 @@ Then elsewhere in your code:
 var Plotly = require('./path/to/custom-plotly');
 ```
 
-#### Non-ascii characters
+Alternatively you could browserify a custom bundle of desired trace modules e.g. `pie` and `choropleth` using
+`npm run partial-bundle pie choropleth --name=custom`
 
-Important: the plotly.js code base contains some non-ascii characters. Therefore, please make sure to set the `charset` attribute to `"utf-8"` in the script tag that imports your plotly.js bundle. For example:
-
-```html
-<script src="my-plotly-bundle.js" charset="utf-8"></script>
-```
 
 ## Building plotly.js
 
diff --git a/lib/index-basic.js b/lib/index-basic.js
index cb2ed7fd10d..670ce848e90 100644
--- a/lib/index-basic.js
+++ b/lib/index-basic.js
@@ -3,8 +3,18 @@
 var Plotly = require('./core');
 
 Plotly.register([
+    // traces
     require('./bar'),
-    require('./pie')
+    require('./pie'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index-cartesian.js b/lib/index-cartesian.js
index 09d9e693d5c..085283666eb 100644
--- a/lib/index-cartesian.js
+++ b/lib/index-cartesian.js
@@ -3,17 +3,27 @@
 var Plotly = require('./core');
 
 Plotly.register([
+    // traces
     require('./bar'),
     require('./box'),
     require('./heatmap'),
     require('./histogram'),
     require('./histogram2d'),
     require('./histogram2dcontour'),
-    require('./image'),
-    require('./pie'),
     require('./contour'),
     require('./scatterternary'),
-    require('./violin')
+    require('./violin'),
+    require('./image'),
+    require('./pie'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index-finance.js b/lib/index-finance.js
index 58d20c76678..d88c44bb8fc 100644
--- a/lib/index-finance.js
+++ b/lib/index-finance.js
@@ -3,15 +3,25 @@
 var Plotly = require('./core');
 
 Plotly.register([
+    // traces
     require('./bar'),
     require('./histogram'),
+    require('./funnel'),
+    require('./waterfall'),
     require('./pie'),
     require('./funnelarea'),
+    require('./indicator'),
     require('./ohlc'),
     require('./candlestick'),
-    require('./funnel'),
-    require('./waterfall'),
-    require('./indicator')
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index-geo.js b/lib/index-geo.js
index 7317dccf4ea..35302c4e32a 100644
--- a/lib/index-geo.js
+++ b/lib/index-geo.js
@@ -3,8 +3,18 @@
 var Plotly = require('./core');
 
 Plotly.register([
+    // traces
     require('./scattergeo'),
-    require('./choropleth')
+    require('./choropleth'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index-gl2d.js b/lib/index-gl2d.js
index 10825b26f6e..e71369e7019 100644
--- a/lib/index-gl2d.js
+++ b/lib/index-gl2d.js
@@ -3,11 +3,21 @@
 var Plotly = require('./core');
 
 Plotly.register([
+    // traces
     require('./scattergl'),
     require('./splom'),
     require('./pointcloud'),
     require('./heatmapgl'),
-    require('./parcoords')
+    require('./parcoords'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index-gl3d.js b/lib/index-gl3d.js
index 24b471d5a1c..37b556c1b88 100644
--- a/lib/index-gl3d.js
+++ b/lib/index-gl3d.js
@@ -3,13 +3,23 @@
 var Plotly = require('./core');
 
 Plotly.register([
+    // traces
     require('./scatter3d'),
     require('./surface'),
-    require('./mesh3d'),
     require('./isosurface'),
     require('./volume'),
+    require('./mesh3d'),
     require('./cone'),
-    require('./streamtube')
+    require('./streamtube'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index-mapbox.js b/lib/index-mapbox.js
index ef5b04c28da..8d2d99344be 100644
--- a/lib/index-mapbox.js
+++ b/lib/index-mapbox.js
@@ -3,9 +3,19 @@
 var Plotly = require('./core');
 
 Plotly.register([
+    // traces
     require('./scattermapbox'),
     require('./choroplethmapbox'),
-    require('./densitymapbox')
+    require('./densitymapbox'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index-strict.js b/lib/index-strict.js
index 1b8d1d03f6f..93f145adfd1 100644
--- a/lib/index-strict.js
+++ b/lib/index-strict.js
@@ -2,8 +2,8 @@
 
 var Plotly = require('./core');
 
-// traces
 Plotly.register([
+    // traces
     require('./bar'),
     require('./box'),
     require('./heatmap'),
@@ -16,40 +16,39 @@ Plotly.register([
     require('./funnel'),
     require('./waterfall'),
     require('./image'),
-
     require('./pie'),
     require('./sunburst'),
     require('./treemap'),
     require('./funnelarea'),
-
     require('./scattergeo'),
     require('./choropleth'),
-
     require('./scattergl'),
     require('./splom'),
-
     require('./parcoords'),
     require('./parcats'),
-
     require('./scattermapbox'),
     require('./choroplethmapbox'),
     require('./densitymapbox'),
-
     require('./sankey'),
     require('./indicator'),
-
     require('./table'),
-
     require('./carpet'),
     require('./scattercarpet'),
     require('./contourcarpet'),
-
     require('./ohlc'),
     require('./candlestick'),
-
     require('./scatterpolar'),
     require('./scatterpolargl'),
-    require('./barpolar')
+    require('./barpolar'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/index.js b/lib/index.js
index 826c885afbc..97a15b89cbb 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -2,8 +2,8 @@
 
 var Plotly = require('./core');
 
-// traces
 Plotly.register([
+    // traces
     require('./bar'),
     require('./box'),
     require('./heatmap'),
@@ -16,12 +16,10 @@ Plotly.register([
     require('./funnel'),
     require('./waterfall'),
     require('./image'),
-
     require('./pie'),
     require('./sunburst'),
     require('./treemap'),
     require('./funnelarea'),
-
     require('./scatter3d'),
     require('./surface'),
     require('./isosurface'),
@@ -29,39 +27,37 @@ Plotly.register([
     require('./mesh3d'),
     require('./cone'),
     require('./streamtube'),
-
     require('./scattergeo'),
     require('./choropleth'),
-
     require('./scattergl'),
     require('./splom'),
-
     require('./pointcloud'),
     require('./heatmapgl'),
-
     require('./parcoords'),
-
     require('./parcats'),
-
     require('./scattermapbox'),
     require('./choroplethmapbox'),
     require('./densitymapbox'),
-
     require('./sankey'),
     require('./indicator'),
-
     require('./table'),
-
     require('./carpet'),
     require('./scattercarpet'),
     require('./contourcarpet'),
-
     require('./ohlc'),
     require('./candlestick'),
-
     require('./scatterpolar'),
     require('./scatterpolargl'),
-    require('./barpolar')
+    require('./barpolar'),
+
+    // transforms
+    require('./aggregate'),
+    require('./filter'),
+    require('./groupby'),
+    require('./sort'),
+
+    // components
+    require('./calendars')
 ]);
 
-module.exports = require('./register_extra')(Plotly);
+module.exports = Plotly;
diff --git a/lib/register_extra.js b/lib/register_extra.js
deleted file mode 100644
index ba1dedb939c..00000000000
--- a/lib/register_extra.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-module.exports = function registerExtra(Plotly) {
-    // transforms
-    //
-    // Please note that all *transform* methods are executed before
-    // all *calcTransform* methods - which could possibly lead to
-    // unexpected results when applying multiple transforms of different types
-    // to a given trace.
-    //
-    // For more info, see:
-    // https://github.com/plotly/plotly.js/pull/978#pullrequestreview-2403353
-    //
-    Plotly.register([
-        require('./aggregate'),
-        require('./filter'),
-        require('./groupby'),
-        require('./sort')
-    ]);
-
-    // components
-    Plotly.register([
-        require('./calendars')
-    ]);
-
-    return Plotly;
-};
diff --git a/package.json b/package.json
index 43df47eb4f6..b10c8780e85 100644
--- a/package.json
+++ b/package.json
@@ -21,12 +21,13 @@
     "plotly"
   ],
   "scripts": {
+    "partial-bundle": "node tasks/partial_bundle.js",
     "bundle": "node tasks/bundle.js",
-    "header-dist": "node tasks/header_dist.js",
+    "extra-bundles": "node tasks/extra_bundles.js",
     "stats": "node tasks/stats.js",
     "find-strings": "node tasks/find_locale_strings.js",
     "preprocess": "node tasks/preprocess.js",
-    "build": "node tasks/empty_dist.js && npm run preprocess && npm run find-strings && npm run bundle && npm run header-dist && npm run stats",
+    "build": "node tasks/empty_dist.js && npm run preprocess && npm run find-strings && npm run bundle && npm run extra-bundles && npm run stats",
     "cibuild": "node tasks/empty_dist.js && npm run preprocess && node tasks/cibundle.js",
     "watch": "node tasks/watch.js",
     "lint": "eslint --version && eslint .",
@@ -50,7 +51,7 @@
     "start": "npm run start-test_dashboard",
     "baseline": "node tasks/baseline.js",
     "preversion": "check-node-version --node 12 --npm 6.14 && npm-link-check && npm ls --prod",
-    "version": "npm run build && npm run no-bad-char && git add -A dist build src/version.js",
+    "version": "npm run build && npm run no-bad-char && git add -A lib dist build src/version.js",
     "postversion": "node -e \"console.log('Version bumped and committed. If ok, run: git push && git push --tags')\"",
     "postpublish": "node tasks/sync_packages.js",
     "postshrinkwrap": "chttps ."
diff --git a/tasks/bundle.js b/tasks/bundle.js
index 8e8a1c6474d..048c3bf42b7 100644
--- a/tasks/bundle.js
+++ b/tasks/bundle.js
@@ -1,26 +1,24 @@
 var path = require('path');
 var glob = require('glob');
 var runSeries = require('run-series');
+var prependFile = require('prepend-file');
 
 var constants = require('./util/constants');
 var common = require('./util/common');
 var _bundle = require('./util/browserify_wrapper');
 var makeSchema = require('./util/make_schema');
 var wrapLocale = require('./util/wrap_locale');
-/*
- * This script takes one argument
- *
- * Run `npm run build -- dev` or `npm run build -- --dev`
- * to include source map in the plotly.js bundle
- *
- * N.B. This script is meant for dist builds; the output bundles are placed
- *      in plotly.js/dist/.
- *      Use `npm run watch` for dev builds.
- */
-
-var arg = process.argv[2];
-var DEV = (arg === 'dev') || (arg === '--dev');
 
+var header = constants.licenseDist + '\n';
+var pathToLib = constants.pathToLib;
+var pathToDist = constants.pathToDist;
+var pathToSchema = constants.pathToSchema;
+var pathToPlotlyDist = constants.pathToPlotlyDist;
+var pathToPlotlyIndex = constants.pathToPlotlyIndex;
+var pathToPlotlyDistMin = constants.pathToPlotlyDistMin;
+var pathToPlotlyDistWithMeta = constants.pathToPlotlyDistWithMeta;
+var pathToPlotlyGeoAssetsSrc = constants.pathToPlotlyGeoAssetsSrc;
+var pathToPlotlyGeoAssetsDist = constants.pathToPlotlyGeoAssetsDist;
 
 // Check if style build file is there
 var doesFileExist = common.doesFileExist;
@@ -32,11 +30,11 @@ if(!doesFileExist(constants.pathToCSSBuild)) {
 }
 
 // "Browserify" the locales
-var localeGlob = path.join(constants.pathToLib, 'locales', '*.js');
+var localeGlob = path.join(pathToLib, 'locales', '*.js');
 glob(localeGlob, function(err, files) {
     files.forEach(function(file) {
         var outName = 'plotly-locale-' + path.basename(file);
-        var outPath = path.join(constants.pathToDist, outName);
+        var outPath = path.join(pathToDist, outName);
         wrapLocale(file, outPath);
     });
 });
@@ -46,41 +44,39 @@ glob(localeGlob, function(err, files) {
 var tasks = [];
 
 // Browserify plotly.js
-tasks.push(function(cb) {
-    _bundle(constants.pathToPlotlyIndex, constants.pathToPlotlyDist, {
+tasks.push(function(done) {
+    _bundle(pathToPlotlyIndex, pathToPlotlyDist, {
         standalone: 'Plotly',
-        debug: DEV,
-        pathToMinBundle: constants.pathToPlotlyDistMin
-    }, cb);
+        pathToMinBundle: pathToPlotlyDistMin
+    }, function() {
+        prependFile(pathToPlotlyDist, header, common.throwOnError);
+        prependFile(pathToPlotlyDistMin, header, common.throwOnError);
+
+        done();
+    });
 });
 
 // Browserify the geo assets
-tasks.push(function(cb) {
-    _bundle(constants.pathToPlotlyGeoAssetsSrc, constants.pathToPlotlyGeoAssetsDist, {
+tasks.push(function(done) {
+    _bundle(pathToPlotlyGeoAssetsSrc, pathToPlotlyGeoAssetsDist, {
         standalone: 'PlotlyGeoAssets'
-    }, cb);
+    }, function() {
+        prependFile(pathToPlotlyGeoAssetsDist, header, common.throwOnError);
+
+        done();
+    });
 });
 
 // Browserify plotly.js with meta and output plot-schema JSON
-tasks.push(function(cb) {
-    _bundle(constants.pathToPlotlyIndex, constants.pathToPlotlyDistWithMeta, {
+tasks.push(function(done) {
+    _bundle(pathToPlotlyIndex, pathToPlotlyDistWithMeta, {
         standalone: 'Plotly',
-        debug: DEV,
         noCompress: true
     }, function() {
-        makeSchema(constants.pathToPlotlyDistWithMeta, constants.pathToSchema)();
-        cb();
-    });
-});
+        prependFile(pathToPlotlyDistWithMeta, header, common.throwOnError);
 
-// Browserify the plotly.js partial bundles
-constants.partialBundlePaths.forEach(function(pathObj) {
-    tasks.push(function(cb) {
-        _bundle(pathObj.index, pathObj.dist, {
-            standalone: 'Plotly',
-            debug: DEV,
-            pathToMinBundle: pathObj.distMin
-        }, cb);
+        makeSchema(pathToPlotlyDistWithMeta, pathToSchema)();
+        done();
     });
 });
 
diff --git a/tasks/extra_bundles.js b/tasks/extra_bundles.js
new file mode 100644
index 00000000000..958d185a62c
--- /dev/null
+++ b/tasks/extra_bundles.js
@@ -0,0 +1,24 @@
+var runSeries = require('run-series');
+
+var partialBundle = require('./partial_bundle');
+var constants = require('./util/constants');
+var partialBundlePaths = constants.partialBundleNames.map(constants.makePartialBundleOpts);
+
+var tasks = [];
+
+// Browserify the plotly.js partial bundles
+for(var i = 0; i < partialBundlePaths.length; i++) {
+    var opts = partialBundlePaths[i];
+
+    partialBundle(tasks, {
+        name: opts.name,
+        index: opts.index,
+        dist: opts.dist,
+        distMin: opts.distMin,
+        traceList: opts.traceList
+    });
+}
+
+runSeries(tasks, function(err) {
+    if(err) throw err;
+});
diff --git a/tasks/header_dist.js b/tasks/header_dist.js
deleted file mode 100644
index 75d94ef221d..00000000000
--- a/tasks/header_dist.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var prependFile = require('prepend-file');
-var constants = require('./util/constants');
-var common = require('./util/common');
-
-function addHeadersInDistFiles() {
-    function _prepend(path, header) {
-        prependFile(path, header + '\n', common.throwOnError);
-    }
-
-    // add header to main dist bundles
-    var pathsDist = [
-        constants.pathToPlotlyDistMin,
-        constants.pathToPlotlyDist,
-        constants.pathToPlotlyDistWithMeta,
-        constants.pathToPlotlyGeoAssetsDist
-    ];
-    pathsDist.forEach(function(path) {
-        _prepend(path, constants.licenseDist);
-    });
-
-    // add header and bundle name to partial bundle
-    constants.partialBundlePaths.forEach(function(pathObj) {
-        var headerDist = constants.licenseDist
-            .replace('plotly.js', 'plotly.js (' + pathObj.name + ')');
-        _prepend(pathObj.dist, headerDist);
-
-        var headerDistMin = constants.licenseDist
-            .replace('plotly.js', 'plotly.js (' + pathObj.name + ' - minified)');
-        _prepend(pathObj.distMin, headerDistMin);
-    });
-}
-
-addHeadersInDistFiles();
diff --git a/tasks/no_es6_dist.js b/tasks/no_es6_dist.js
index 955dfe975bf..fbb2d6cae93 100644
--- a/tasks/no_es6_dist.js
+++ b/tasks/no_es6_dist.js
@@ -2,6 +2,8 @@ var eslint = require('eslint');
 var constants = require('./util/constants');
 var EXIT_CODE = 0;
 
+var partialBundlePaths = constants.partialBundleNames.map(constants.makePartialBundleOpts);
+
 assertES5();
 
 // Ensure no ES6 has snuck through into the build:
@@ -17,7 +19,7 @@ function assertES5() {
         }
     });
 
-    var files = constants.partialBundlePaths.map(function(f) { return f.dist; });
+    var files = partialBundlePaths.map(function(f) { return f.dist; });
     files.unshift(constants.pathToPlotlyDist);
 
     var report = cli.executeOnFiles(files);
diff --git a/tasks/partial_bundle.js b/tasks/partial_bundle.js
new file mode 100644
index 00000000000..42859b4578a
--- /dev/null
+++ b/tasks/partial_bundle.js
@@ -0,0 +1,101 @@
+var path = require('path');
+var runSeries = require('run-series');
+var prependFile = require('prepend-file');
+
+var constants = require('./util/constants');
+var common = require('./util/common');
+var _bundle = require('./util/browserify_wrapper');
+
+var header = constants.licenseDist + '\n';
+var allTraces = constants.allTraces;
+var mainIndex = constants.mainIndex;
+
+var argv = process.argv;
+
+if(argv.length > 2) {
+    // command line
+
+    var traceList = ['scatter']; // added by default
+    var name;
+    for(var i = 2; i < argv.length; i++) {
+        var a = argv[i];
+
+        if(
+            allTraces.indexOf(a) !== -1 && // requested
+            traceList.indexOf(a) === -1    // not added before
+        ) {
+            traceList.push(a);
+        }
+        if(a.indexOf('--name=') === 0) name = a.replace('--name=', '');
+    }
+    if(!name) name = 'custom';
+    traceList = traceList.sort();
+
+    var opts = {
+        traceList: traceList,
+        name: name,
+
+        index: path.join(constants.pathToBuild, 'index-' + name + '.js'),
+        dist: path.join(constants.pathToDist, 'plotly-' + name + '.js'),
+        distMin: path.join(constants.pathToDist, 'plotly-' + name + '.min.js')
+    };
+
+    console.log(opts);
+
+    var tasks = [];
+
+    partialBundle(tasks, opts);
+
+    runSeries(tasks, function(err) {
+        if(err) throw err;
+    });
+}
+
+// Browserify the plotly.js partial bundles
+function partialBundle(tasks, opts) {
+    var name = opts.name;
+    var index = opts.index;
+    var dist = opts.dist;
+    var distMin = opts.distMin;
+    var traceList = opts.traceList;
+
+    tasks.push(function(done) {
+        var partialIndex = mainIndex;
+        allTraces.forEach(function(trace) {
+            if(traceList.indexOf(trace) === -1) {
+                var WHITESPACE_BEFORE = '\\s*';
+                // remove require
+                var newCode = partialIndex.replace(
+                    new RegExp(
+                        WHITESPACE_BEFORE +
+                        'require\\(\'\\./' + trace + '\'\\),',
+                    'g'), ''
+                );
+
+                // test removal
+                if(newCode === partialIndex) throw 'Unable to find and drop require for trace: "' + trace + '"';
+
+                partialIndex = newCode;
+            }
+        });
+
+        common.writeFile(index, partialIndex, done);
+    });
+
+    tasks.push(function(done) {
+        _bundle(index, dist, {
+            standalone: 'Plotly',
+            pathToMinBundle: distMin
+        }, function() {
+            var headerDist = header.replace('plotly.js', 'plotly.js (' + name + ')');
+            var headerDistMin = header.replace('plotly.js', 'plotly.js (' + name + ' - minified)');
+
+            prependFile(dist, headerDist, common.throwOnError);
+            prependFile(distMin, headerDistMin, common.throwOnError);
+
+            done();
+        });
+    });
+}
+
+module.exports = partialBundle;
diff --git a/tasks/preprocess.js b/tasks/preprocess.js
index f88d9f31cb8..e2716c1ba4c 100644
--- a/tasks/preprocess.js
+++ b/tasks/preprocess.js
@@ -1,4 +1,5 @@
 var fs = require('fs-extra');
+var path = require('path');
 var sass = require('node-sass');
 
 var constants = require('./util/constants');
@@ -8,6 +9,7 @@ var updateVersion = require('./util/update_version');
 
 // main
 makeBuildCSS();
+exposePartsInLib();
 copyTopojsonFiles();
 updateVersion(constants.pathToPlotlyVersion);
 
@@ -24,6 +26,47 @@ function makeBuildCSS() {
     });
 }
 
+function exposePartsInLib() {
+    var obj = {};
+
+    var insert = function(name, folder) {
+        obj[name] = folder + '/' + name;
+    };
+
+    insert('core', 'src');
+
+    insert('calendars', 'src/components');
+
+    [
+        'aggregate',
+        'filter',
+        'groupby',
+        'sort'
+    ].forEach(function(k) {
+        insert(k, 'src/transforms');
+    });
+
+    constants.allTraces.forEach(function(k) {
+        insert(k, 'src/traces');
+    });
+
+    writeLibFiles(obj);
+}
+
+function writeLibFiles(obj) {
+    for(var name in obj) {
+        common.writeFile(
+            path.join(constants.pathToLib, name + '.js'),
+            [
+                '\'use strict\';',
+                '',
+                'module.exports = require(\'../' + obj[name] + '\');',
+                ''
+            ].join('\n')
+        );
+    }
+}
+
 // copy topojson files from sane-topojson to dist/
 function copyTopojsonFiles() {
     fs.copy(
diff --git a/tasks/stats.js b/tasks/stats.js
index 3c61593196f..e971a66f340 100644
--- a/tasks/stats.js
+++ b/tasks/stats.js
@@ -19,6 +19,8 @@ var ENC = 'utf-8';
 var JS = '.js';
 var MINJS = '.min.js';
 
+var partialBundlePaths = constants.partialBundleNames.map(constants.makePartialBundleOpts);
+
 // main
 common.writeFile(pathDistREADME, getReadMeContent());
 
@@ -136,7 +138,7 @@ function getMainBundleInfo() {
         '',
         'Starting in `v1.15.0`, plotly.js also ships with several _partial_ bundles:',
         '',
-        constants.partialBundlePaths.map(makeBundleHeaderInfo).join('\n'),
+        partialBundlePaths.map(makeBundleHeaderInfo).join('\n'),
         '',
         'Starting in `v1.39.0`, each plotly.js partial bundle has a corresponding npm package with no dependencies.',
         '',
@@ -151,7 +153,7 @@ function getMainBundleInfo() {
 
 // info about partial bundles
 function getPartialBundleInfo() {
-    return constants.partialBundlePaths.map(makeBundleInfo);
+    return partialBundlePaths.map(makeBundleInfo);
 }
 
 // footer info
@@ -172,13 +174,13 @@ function makeBundleHeaderInfo(pathObj) {
 function makeBundleInfo(pathObj) {
     var name = pathObj.name;
     var sizes = findSizes(pathObj);
-    var moduleList = common.findModuleList(pathObj.index);
+    var traceList = pathObj.traceList;
     var pkgName = 'plotly.js-' + name + '-dist';
 
     return [
         '### plotly.js ' + name,
         '',
-        'The `' + name + '` partial bundle contains trace modules ' + common.formatEnumeration(moduleList) + '.',
+        'The `' + name + '` partial bundle contains trace modules ' + common.formatEnumeration(traceList) + '.',
         '',
         '#### Stats',
         '',
diff --git a/tasks/sync_packages.js b/tasks/sync_packages.js
index 233ee797af9..791a1e6afd0 100644
--- a/tasks/sync_packages.js
+++ b/tasks/sync_packages.js
@@ -23,8 +23,10 @@ var copyrightAndLicense = [
     ''
 ].join('\n');
 
+var partialBundlePaths = constants.partialBundleNames.map(constants.makePartialBundleOpts);
+
 // sync "partial bundle" packages
-constants.partialBundlePaths
+partialBundlePaths
     .map(function(d) {
         return {
             name: 'plotly.js-' + d.name + '-dist',
@@ -44,7 +46,7 @@ constants.partialBundlePaths
     .forEach(syncPartialBundlePkg);
 
 // sync "minified partial bundle" packages
-constants.partialBundlePaths
+partialBundlePaths
     .map(function(d) {
         return {
             name: 'plotly.js-' + d.name + '-dist-min',
@@ -103,14 +105,14 @@ function syncPartialBundlePkg(d) {
 
 
     function writeREADME(cb) {
-        var moduleList = common.findModuleList(d.index);
+        var traceList = d.traceList;
 
         var cnt = [
             '# ' + d.name,
             '',
             d.desc,
             '',
-            'Contains trace modules ' + common.formatEnumeration(moduleList) + '.',
+            'Contains trace modules ' + common.formatEnumeration(traceList) + '.',
             '',
             'For more info on plotly.js, go to https://github.com/plotly/plotly.js',
             '',
diff --git a/tasks/util/common.js b/tasks/util/common.js
index 51a9a0528ca..e6b648ee86a 100644
--- a/tasks/util/common.js
+++ b/tasks/util/common.js
@@ -1,6 +1,5 @@
 var fs = require('fs');
 var exec = require('child_process').exec;
-var falafel = require('falafel');
 
 function _throw(err) {
     console.log(err);
@@ -71,41 +70,6 @@ exports.throwOnError = function(err) {
     if(err) _throw(err);
 };
 
-exports.findModuleList = function(pathToIndex) {
-    var code = fs.readFileSync(pathToIndex, 'utf-8');
-    // In v1.x, all partial bundles include the 'scatter' module
-    var moduleList = ['scatter'];
-
-    falafel(code, function(node) {
-        if(
-            node.type === 'Literal' &&
-            node.parent &&
-            node.parent.type === 'CallExpression' &&
-            node.parent.callee &&
-            node.parent.callee.type === 'Identifier' &&
-            node.parent.callee.name === 'require' &&
-            node.parent.parent &&
-            node.parent.parent.type === 'ArrayExpression'
-        ) {
-            var moduleName = node.value.replace('./', '');
-            if([
-                // transforms
-                'aggregate',
-                'filter',
-                'groupby',
-                'sort',
-
-                // components
-                'calendars'
-            ].indexOf(moduleName) === -1) {
-                moduleList.push(moduleName);
-            }
-        }
-    });
-
-    return moduleList;
-};
-
 exports.formatEnumeration = function(list) {
     var len = list.length;
 
diff --git a/tasks/util/constants.js b/tasks/util/constants.js
index f1907fed400..1dbaf6fac8c 100644
--- a/tasks/util/constants.js
+++ b/tasks/util/constants.js
@@ -1,3 +1,4 @@
+var fs = require('fs');
 var path = require('path');
 var pkg = require('../../package.json');
 
@@ -10,6 +11,11 @@ var pathToVendor = path.join(pathToRoot, 'vendor/');
 var pathToDist = path.join(pathToRoot, 'dist/');
 var pathToBuild = path.join(pathToRoot, 'build/');
 
+var pathToPlotlyIndex = path.join(pathToLib, 'index.js');
+var mainIndex = fs.readFileSync(pathToPlotlyIndex, 'utf-8');
+var pathToPlotlyTraces = path.join(pathToSrc, 'traces');
+var allTraces = fs.readdirSync(pathToPlotlyTraces);
+
 var pathToTopojsonSrc;
 try {
     pathToTopojsonSrc = path.join(path.dirname(require.resolve('sane-topojson')), 'dist/');
@@ -29,18 +35,123 @@ var partialBundleNames = [
     'basic', 'cartesian', 'geo', 'gl3d', 'gl2d', 'mapbox', 'finance', 'strict'
 ];
 
-var partialBundlePaths = partialBundleNames.map(function(name) {
+var partialBundleTraces = {
+    basic: [
+        'bar',
+        'pie',
+        'scatter'
+    ],
+    cartesian: [
+        'bar',
+        'box',
+        'contour',
+        'heatmap',
+        'histogram',
+        'histogram2d',
+        'histogram2dcontour',
+        'image',
+        'pie',
+        'scatter',
+        'scatterternary',
+        'violin'
+    ],
+    finance: [
+        'bar',
+        'candlestick',
+        'funnel',
+        'funnelarea',
+        'histogram',
+        'indicator',
+        'ohlc',
+        'pie',
+        'scatter',
+        'waterfall'
+    ],
+    geo: [
+        'choropleth',
+        'scatter',
+        'scattergeo'
+    ],
+    gl2d: [
+        'heatmapgl',
+        'parcoords',
+        'pointcloud',
+        'scatter',
+        'scattergl',
+        'splom'
+    ],
+    gl3d: [
+        'cone',
+        'isosurface',
+        'mesh3d',
+        'scatter',
+        'scatter3d',
+        'streamtube',
+        'surface',
+        'volume'
+    ],
+    mapbox: [
+        'choroplethmapbox',
+        'densitymapbox',
+        'scatter',
+        'scattermapbox'
+    ],
+    strict: [
+        'bar',
+        'barpolar',
+        'box',
+        'candlestick',
+        'carpet',
+        'choropleth',
+        'choroplethmapbox',
+        'contour',
+        'contourcarpet',
+        'densitymapbox',
+        'funnel',
+        'funnelarea',
+        'heatmap',
+        'histogram',
+        'histogram2d',
+        'histogram2dcontour',
+        'image',
+        'indicator',
+        'ohlc',
+        'parcats',
+        'parcoords',
+        'pie',
+        'sankey',
+        'scatter',
+        'scattercarpet',
+        'scattergeo',
+        'scattergl',
+        'scattermapbox',
+        'scatterpolar',
+        'scatterpolargl',
+        'scatterternary',
+        'splom',
+        'sunburst',
+        'table',
+        'treemap',
+        'violin',
+        'waterfall'
+    ]
+};
+
+function makePartialBundleOpts(name) {
     return {
         name: name,
+        traceList: partialBundleTraces[name],
         index: path.join(pathToLib, 'index-' + name + '.js'),
         dist: path.join(pathToDist, 'plotly-' + name + '.js'),
         distMin: path.join(pathToDist, 'plotly-' + name + '.min.js')
     };
-});
+}
 
 var year = (new Date()).getFullYear();
 
 module.exports = {
+    makePartialBundleOpts: makePartialBundleOpts,
+
     pathToRoot: pathToRoot,
     pathToSrc: pathToSrc,
     pathToLib: pathToLib,
@@ -48,7 +159,10 @@ module.exports = {
     pathToVendor: pathToVendor,
     pathToDist: pathToDist,
 
-    pathToPlotlyIndex: path.join(pathToLib, 'index.js'),
+    allTraces: allTraces,
+    mainIndex: mainIndex,
+    pathToPlotlyIndex: pathToPlotlyIndex,
+    pathToPlotlyTraces: pathToPlotlyTraces,
     pathToPlotlyCore: path.join(pathToSrc, 'core.js'),
     pathToPlotlyVersion: path.join(pathToSrc, 'version.js'),
     pathToPlotlyBuild: path.join(pathToBuild, 'plotly.js'),
@@ -61,7 +175,6 @@ module.exports = {
     pathToTranslationKeys: path.join(pathToDist, 'translation-keys.txt'),
 
     partialBundleNames: partialBundleNames,
-    partialBundlePaths: partialBundlePaths,
 
     pathToTopojsonSrc: pathToTopojsonSrc,
     pathToTopojsonDist: path.join(pathToDist, 'topojson/'),
diff --git a/test/jasmine/assets/supply_defaults.js b/test/jasmine/assets/supply_defaults.js
index 28bba9b870f..13f9d2bd0c0 100644
--- a/test/jasmine/assets/supply_defaults.js
+++ b/test/jasmine/assets/supply_defaults.js
@@ -4,7 +4,7 @@ var Plots = require('@src/plots/plots');
 
 // The following is used to fill up the Registry module
 /* eslint-disable-next-line */
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 
 /**
  * supplyDefaults that fills in necessary _context
diff --git a/test/jasmine/bundle_tests/no_webgl_test.js b/test/jasmine/bundle_tests/no_webgl_test.js
index 10a22e858c5..851b22b9d23 100644
--- a/test/jasmine/bundle_tests/no_webgl_test.js
+++ b/test/jasmine/bundle_tests/no_webgl_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 
 var createGraphDiv = require('../assets/create_graph_div');
 var destroyGraphDiv = require('../assets/destroy_graph_div');
diff --git a/test/jasmine/bundle_tests/plotschema_test.js b/test/jasmine/bundle_tests/plotschema_test.js
index 59cdf9ca0f1..a8839522a92 100644
--- a/test/jasmine/bundle_tests/plotschema_test.js
+++ b/test/jasmine/bundle_tests/plotschema_test.js
@@ -4,9 +4,9 @@ var Lib = require('@src/lib');
 var Registry = require('@src/registry');
 
 var baseAttrs = require('@src/plots/attributes');
-var scatter = require('@src/traces/scatter');
-var parcoords = require('@src/traces/parcoords');
-var surface = require('@src/traces/surface');
+var scatter = require('@lib/scatter');
+var parcoords = require('@lib/parcoords');
+var surface = require('@lib/surface');
 
 var baseLayoutAttrs = require('@src/plots/layout_attributes');
 var cartesianAttrs = require('@src/plots/cartesian').layoutAttributes;
@@ -444,7 +444,7 @@ describe('getTraceValObject', function() {
             {type: 'groupby'}
         ]};
 
-        var filterAttrs = require('@src/transforms/filter').attributes;
+        var filterAttrs = require('@lib/filter').attributes;
         expect(getTraceValObject(mockTrace, ['transforms', 0, 'operation']))
             .toBe(filterAttrs.operation);
         // check a component-provided attr
@@ -452,7 +452,7 @@ describe('getTraceValObject', function() {
             .toBe(filterAttrs.valuecalendar);
 
         expect(getTraceValObject(mockTrace, ['transforms', 1, 'styles', 13, 'value', 'line', 'color']))
-            .toBe(require('@src/transforms/groupby').attributes.styles.value);
+            .toBe(require('@lib/groupby').attributes.styles.value);
 
         [
             ['transforms', 0],
@@ -498,13 +498,13 @@ describe('getLayoutValObject', function() {
     it('finds trace layout attributes', function() {
         var layoutBar = {_modules: [Registry.modules.bar._module]};
         expect(getLayoutValObject(layoutBar, ['barmode']))
-            .toBe(require('@src/traces/bar').layoutAttributes.barmode);
+            .toBe(require('@lib/bar').layoutAttributes.barmode);
         var layoutBox = {_modules: [Registry.modules.box._module]};
         expect(getLayoutValObject(layoutBox, ['boxgap']))
-            .toBe(require('@src/traces/box').layoutAttributes.boxgap);
+            .toBe(require('@lib/box').layoutAttributes.boxgap);
         var layoutPie = {_modules: [Registry.modules.pie._module]};
         expect(getLayoutValObject(layoutPie, ['hiddenlabels']))
-            .toBe(require('@src/traces/pie').layoutAttributes.hiddenlabels);
+            .toBe(require('@lib/pie').layoutAttributes.hiddenlabels);
 
         // not found when these traces are unused on the plot
         expect(getLayoutValObject(blankLayout, ['barmode'])).toBe(false);
diff --git a/test/jasmine/tests/barpolar_test.js b/test/jasmine/tests/barpolar_test.js
index 705955e453e..a5d93f9b0c8 100644
--- a/test/jasmine/tests/barpolar_test.js
+++ b/test/jasmine/tests/barpolar_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 
 var supplyAllDefaults = require('../assets/supply_defaults');
diff --git a/test/jasmine/tests/box_test.js b/test/jasmine/tests/box_test.js
index d2234f56113..90ea550a3f8 100644
--- a/test/jasmine/tests/box_test.js
+++ b/test/jasmine/tests/box_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var Plots = require('@src/plots/plots');
 
diff --git a/test/jasmine/tests/choropleth_test.js b/test/jasmine/tests/choropleth_test.js
index 7e79160f6d4..c619b66158d 100644
--- a/test/jasmine/tests/choropleth_test.js
+++ b/test/jasmine/tests/choropleth_test.js
@@ -1,6 +1,6 @@
 var Choropleth = require('@src/traces/choropleth');
 
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
 var loggers = require('@src/lib/loggers');
diff --git a/test/jasmine/tests/choroplethmapbox_test.js b/test/jasmine/tests/choroplethmapbox_test.js
index b2eefb84eaf..5d380035190 100644
--- a/test/jasmine/tests/choroplethmapbox_test.js
+++ b/test/jasmine/tests/choroplethmapbox_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
 var loggers = require('@src/lib/loggers');
diff --git a/test/jasmine/tests/colorscale_test.js b/test/jasmine/tests/colorscale_test.js
index 6b13bba80ec..f5f9eda7469 100644
--- a/test/jasmine/tests/colorscale_test.js
+++ b/test/jasmine/tests/colorscale_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 
 var Colorscale = require('@src/components/colorscale');
 
diff --git a/test/jasmine/tests/cone_test.js b/test/jasmine/tests/cone_test.js
index 780d39d0960..c38e857d150 100644
--- a/test/jasmine/tests/cone_test.js
+++ b/test/jasmine/tests/cone_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 
 var supplyAllDefaults = require('../assets/supply_defaults');
diff --git a/test/jasmine/tests/densitymapbox_test.js b/test/jasmine/tests/densitymapbox_test.js
index 0d656adc61c..c77fd4a1923 100644
--- a/test/jasmine/tests/densitymapbox_test.js
+++ b/test/jasmine/tests/densitymapbox_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
 
diff --git a/test/jasmine/tests/domain_ref_interact_test.js b/test/jasmine/tests/domain_ref_interact_test.js
index 83ac2ba7992..46de30a01b1 100644
--- a/test/jasmine/tests/domain_ref_interact_test.js
+++ b/test/jasmine/tests/domain_ref_interact_test.js
@@ -3,10 +3,9 @@
 var domainRefComponents = require('../assets/domain_ref_components');
 var createGraphDiv = require('../assets/create_graph_div');
 var destroyGraphDiv = require('../assets/destroy_graph_div');
-var Plotly = require('../../../lib/index');
-var Lib = require('../../../src/lib');
-var getSVGElemScreenBBox = require(
-    '../assets/get_svg_elem_screen_bbox');
+var Plotly = require('@lib/index');
+var Lib = require('@src/lib');
+var getSVGElemScreenBBox = require('../assets/get_svg_elem_screen_bbox');
 var testMock = require('../assets/domain_refs_editable.json');
 var delay = require('../assets/delay');
 var mouseEvent = require('../assets/mouse_event');
diff --git a/test/jasmine/tests/domain_ref_test.js b/test/jasmine/tests/domain_ref_test.js
index 5d207c63938..86beb0ac92e 100644
--- a/test/jasmine/tests/domain_ref_test.js
+++ b/test/jasmine/tests/domain_ref_test.js
@@ -3,7 +3,7 @@
 var domainRefComponents = require('../assets/domain_ref_components');
 var createGraphDiv = require('../assets/create_graph_div');
 var destroyGraphDiv = require('../assets/destroy_graph_div');
-var Plotly = require('../../../lib/index');
+var Plotly = require('@lib/index');
 // optionally specify a test number to run just a single test
 var testNumber;
 
diff --git a/test/jasmine/tests/isosurface_test.js b/test/jasmine/tests/isosurface_test.js
index 7ca3ab26638..afcb4066f11 100644
--- a/test/jasmine/tests/isosurface_test.js
+++ b/test/jasmine/tests/isosurface_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 
 var supplyAllDefaults = require('../assets/supply_defaults');
diff --git a/test/jasmine/tests/lib_test.js b/test/jasmine/tests/lib_test.js
index 78af4c275b8..647c9c4d5b9 100644
--- a/test/jasmine/tests/lib_test.js
+++ b/test/jasmine/tests/lib_test.js
@@ -5,7 +5,7 @@ var config = require('@src/plot_api/plot_config').dfltConfig;
 
 var d3Select = require('../../strict-d3').select;
 var d3SelectAll = require('../../strict-d3').selectAll;
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Plots = require('@src/plots/plots');
 var createGraphDiv = require('../assets/create_graph_div');
 var destroyGraphDiv = require('../assets/destroy_graph_div');
diff --git a/test/jasmine/tests/localize_test.js b/test/jasmine/tests/localize_test.js
index 1a02a12945f..00b10b51058 100644
--- a/test/jasmine/tests/localize_test.js
+++ b/test/jasmine/tests/localize_test.js
@@ -5,7 +5,7 @@ var Registry = require('@src/registry');
 var d3Select = require('../../strict-d3').select;
 var utcFormat = require('d3-time-format').utcFormat;
 
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var createGraphDiv = require('../assets/create_graph_div');
 var destroyGraphDiv = require('../assets/destroy_graph_div');
 
diff --git a/test/jasmine/tests/mapbox_test.js b/test/jasmine/tests/mapbox_test.js
index 6d3f72982ae..769e127f72f 100644
--- a/test/jasmine/tests/mapbox_test.js
+++ b/test/jasmine/tests/mapbox_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var Fx = require('@src/components/fx');
 
diff --git a/test/jasmine/tests/mesh3d_test.js b/test/jasmine/tests/mesh3d_test.js
index 6ee95569b2b..ee52eb53dbf 100644
--- a/test/jasmine/tests/mesh3d_test.js
+++ b/test/jasmine/tests/mesh3d_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var supplyDefaults = require('@src/traces/mesh3d').supplyDefaults;
 var createGraphDiv = require('../assets/create_graph_div');
diff --git a/test/jasmine/tests/page_test.js b/test/jasmine/tests/page_test.js
index 0b505b04960..185fd0114fb 100644
--- a/test/jasmine/tests/page_test.js
+++ b/test/jasmine/tests/page_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 
 var d3Select = require('../../strict-d3').select;
diff --git a/test/jasmine/tests/polar_test.js b/test/jasmine/tests/polar_test.js
index bda000620a6..38418e6352e 100644
--- a/test/jasmine/tests/polar_test.js
+++ b/test/jasmine/tests/polar_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var Polar = require('@src/plots/polar');
 var constants = require('@src/plots/polar/constants');
diff --git a/test/jasmine/tests/range_selector_test.js b/test/jasmine/tests/range_selector_test.js
index a921f5e2d7b..3a526b302ff 100644
--- a/test/jasmine/tests/range_selector_test.js
+++ b/test/jasmine/tests/range_selector_test.js
@@ -3,7 +3,7 @@ var getUpdateObject = require('@src/components/rangeselector/get_update_object')
 
 var d3Select = require('../../strict-d3').select;
 var d3SelectAll = require('../../strict-d3').selectAll;
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var Color = require('@src/components/color');
 var createGraphDiv = require('../assets/create_graph_div');
diff --git a/test/jasmine/tests/scattergeo_test.js b/test/jasmine/tests/scattergeo_test.js
index 389e4467b26..be408691350 100644
--- a/test/jasmine/tests/scattergeo_test.js
+++ b/test/jasmine/tests/scattergeo_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var BADNUM = require('@src/constants/numerical').BADNUM;
 var loggers = require('@src/lib/loggers');
diff --git a/test/jasmine/tests/scattermapbox_test.js b/test/jasmine/tests/scattermapbox_test.js
index 7bf7c4dcae6..6a8c5dbf661 100644
--- a/test/jasmine/tests/scattermapbox_test.js
+++ b/test/jasmine/tests/scattermapbox_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
 var Axes = require('@src/plots/cartesian/axes');
diff --git a/test/jasmine/tests/scatterpolar_test.js b/test/jasmine/tests/scatterpolar_test.js
index fc8b5959759..a54f1548510 100644
--- a/test/jasmine/tests/scatterpolar_test.js
+++ b/test/jasmine/tests/scatterpolar_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var ScatterPolar = require('@src/traces/scatterpolar');
 
diff --git a/test/jasmine/tests/scatterpolargl_test.js b/test/jasmine/tests/scatterpolargl_test.js
index 14b603018f1..d591ea13740 100644
--- a/test/jasmine/tests/scatterpolargl_test.js
+++ b/test/jasmine/tests/scatterpolargl_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var ScatterPolarGl = require('@src/traces/scatterpolargl');
 
diff --git a/test/jasmine/tests/scatterternary_test.js b/test/jasmine/tests/scatterternary_test.js
index 495d1e33974..3d947a02b8b 100644
--- a/test/jasmine/tests/scatterternary_test.js
+++ b/test/jasmine/tests/scatterternary_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var ScatterTernary = require('@src/traces/scatterternary');
 
diff --git a/test/jasmine/tests/sliders_test.js b/test/jasmine/tests/sliders_test.js
index 3b7f9618fda..85021d3d51d 100644
--- a/test/jasmine/tests/sliders_test.js
+++ b/test/jasmine/tests/sliders_test.js
@@ -3,7 +3,7 @@ var constants = require('@src/components/sliders/constants');
 
 var d3Select = require('../../strict-d3').select;
 var d3SelectAll = require('../../strict-d3').selectAll;
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var createGraphDiv = require('../assets/create_graph_div');
 var destroyGraphDiv = require('../assets/destroy_graph_div');
diff --git a/test/jasmine/tests/splom_test.js b/test/jasmine/tests/splom_test.js
index 7ec1f442c99..06af19794d3 100644
--- a/test/jasmine/tests/splom_test.js
+++ b/test/jasmine/tests/splom_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var Plots = require('@src/plots/plots');
 var Axes = require('@src/plots/cartesian/axes');
diff --git a/test/jasmine/tests/streamtube_test.js b/test/jasmine/tests/streamtube_test.js
index 0209cd25cb4..deb9322b428 100644
--- a/test/jasmine/tests/streamtube_test.js
+++ b/test/jasmine/tests/streamtube_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 
 var supplyAllDefaults = require('../assets/supply_defaults');
diff --git a/test/jasmine/tests/sunburst_test.js b/test/jasmine/tests/sunburst_test.js
index 72d8e26702b..28876802534 100644
--- a/test/jasmine/tests/sunburst_test.js
+++ b/test/jasmine/tests/sunburst_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
 var Drawing = require('@src/components/drawing');
diff --git a/test/jasmine/tests/ternary_test.js b/test/jasmine/tests/ternary_test.js
index 5a648daeba6..27f6136994d 100644
--- a/test/jasmine/tests/ternary_test.js
+++ b/test/jasmine/tests/ternary_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var rgb = require('@src/components/color').rgb;
 
diff --git a/test/jasmine/tests/toimage_test.js b/test/jasmine/tests/toimage_test.js
index 43aa1b724ec..cbaffb56efd 100644
--- a/test/jasmine/tests/toimage_test.js
+++ b/test/jasmine/tests/toimage_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 
 var d3Select = require('../../strict-d3').select;
diff --git a/test/jasmine/tests/transform_filter_test.js b/test/jasmine/tests/transform_filter_test.js
index ebf5d6fa082..3ba5195be95 100644
--- a/test/jasmine/tests/transform_filter_test.js
+++ b/test/jasmine/tests/transform_filter_test.js
@@ -1,5 +1,5 @@
 var Plotly = require('@lib/index');
-var Filter = require('@lib/filter');
+var Filter = require('@src/transforms/filter');
 
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
diff --git a/test/jasmine/tests/transform_multi_test.js b/test/jasmine/tests/transform_multi_test.js
index 2dc8bc491ad..ecb8ec9e087 100644
--- a/test/jasmine/tests/transform_multi_test.js
+++ b/test/jasmine/tests/transform_multi_test.js
@@ -1,5 +1,5 @@
 var Plotly = require('@lib/index');
-var Filter = require('@lib/filter');
+var Filter = require('@src/transforms/filter');
 
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
diff --git a/test/jasmine/tests/treemap_test.js b/test/jasmine/tests/treemap_test.js
index a435b3eb163..425a9fd528e 100644
--- a/test/jasmine/tests/treemap_test.js
+++ b/test/jasmine/tests/treemap_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Plots = require('@src/plots/plots');
 var Lib = require('@src/lib');
 var Drawing = require('@src/components/drawing');
diff --git a/test/jasmine/tests/updatemenus_test.js b/test/jasmine/tests/updatemenus_test.js
index c2d02328df2..35eb0aa30a7 100644
--- a/test/jasmine/tests/updatemenus_test.js
+++ b/test/jasmine/tests/updatemenus_test.js
@@ -3,7 +3,7 @@ var constants = require('@src/components/updatemenus/constants');
 
 var d3Select = require('../../strict-d3').select;
 var d3SelectAll = require('../../strict-d3').selectAll;
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var Events = require('@src/lib/events');
 var Drawing = require('@src/components/drawing');
diff --git a/test/jasmine/tests/violin_test.js b/test/jasmine/tests/violin_test.js
index a977f61d37a..54298aaba03 100644
--- a/test/jasmine/tests/violin_test.js
+++ b/test/jasmine/tests/violin_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 var Plots = require('@src/plots/plots');
 
diff --git a/test/jasmine/tests/volume_test.js b/test/jasmine/tests/volume_test.js
index b44251c511d..9c55cddfad9 100644
--- a/test/jasmine/tests/volume_test.js
+++ b/test/jasmine/tests/volume_test.js
@@ -1,4 +1,4 @@
-var Plotly = require('@lib');
+var Plotly = require('@lib/index');
 var Lib = require('@src/lib');
 
 var supplyAllDefaults = require('../assets/supply_defaults');