diff --git a/tools/tests/apps/app-using-stylus/.meteor/.gitignore b/tools/tests/apps/app-using-stylus/.meteor/.gitignore
new file mode 100644
index 0000000000..4083037423
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/.meteor/.gitignore
@@ -0,0 +1 @@
+local
diff --git a/tools/tests/apps/app-using-stylus/.meteor/.id b/tools/tests/apps/app-using-stylus/.meteor/.id
new file mode 100644
index 0000000000..c4e9c530a1
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/.meteor/.id
@@ -0,0 +1 @@
+1da9lx3m24vwv1kt1w0a
\ No newline at end of file
diff --git a/tools/tests/apps/app-using-stylus/.meteor/packages b/tools/tests/apps/app-using-stylus/.meteor/packages
new file mode 100644
index 0000000000..b7360f6938
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/.meteor/packages
@@ -0,0 +1,8 @@
+# Meteor packages used by this project, one per line.
+#
+# 'meteor add' and 'meteor remove' will edit this file for you,
+# but you can also edit it by hand.
+
+meteor-platform
+my-package
+stylus
diff --git a/tools/tests/apps/app-using-stylus/.meteor/platforms b/tools/tests/apps/app-using-stylus/.meteor/platforms
new file mode 100644
index 0000000000..8a3a35f9f6
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/.meteor/platforms
@@ -0,0 +1,2 @@
+browser
+server
diff --git a/tools/tests/apps/app-using-stylus/.meteor/release b/tools/tests/apps/app-using-stylus/.meteor/release
new file mode 100644
index 0000000000..621e94f0ec
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/.meteor/release
@@ -0,0 +1 @@
+none
diff --git a/tools/tests/apps/app-using-stylus/.meteor/versions b/tools/tests/apps/app-using-stylus/.meteor/versions
new file mode 100644
index 0000000000..97685fd3a5
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/.meteor/versions
@@ -0,0 +1,53 @@
+autoupdate@1.2.2
+base64@1.0.3
+binary-heap@1.0.3
+blaze@2.1.2
+blaze-tools@1.0.3
+boilerplate-generator@1.0.3
+callback-hook@1.0.3
+check@1.0.5
+compiler-plugin@1.0.0
+ddp@1.2.0
+ddp-client@1.2.0
+ddp-common@1.2.0
+ddp-server@1.2.0
+deps@1.0.7
+ejson@1.0.6
+fastclick@1.0.6
+geojson-utils@1.0.3
+html-tools@1.0.4
+htmljs@1.0.4
+http@1.1.0
+id-map@1.0.3
+jquery@1.11.3_2
+json@1.0.3
+launch-screen@1.0.3
+livedata@1.0.13
+logging@1.0.8
+meteor@1.1.6
+meteor-platform@1.2.2
+minifiers@1.1.5
+minimongo@1.0.8
+mobile-status-bar@1.0.4
+mongo@1.1.0
+my-package@0.0.0
+npm-mongo@1.4.32_1
+observe-sequence@1.0.6
+ordered-dict@1.0.3
+random@1.0.3
+reactive-dict@1.1.0
+reactive-var@1.0.5
+reload@1.1.3
+retry@1.0.3
+routepolicy@1.0.5
+session@1.1.0
+spacebars@1.0.6
+spacebars-compiler@1.0.6
+stylus@2.0.0_511
+templating@1.1.1
+tracker@1.0.7
+ui@1.0.6
+underscore@1.0.3
+url@1.0.4
+webapp@1.2.1
+webapp-hashing@1.0.3
diff --git a/tools/tests/apps/app-using-stylus/body.html b/tools/tests/apps/app-using-stylus/body.html
new file mode 100644
index 0000000000..26cc630d66
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/body.html
@@ -0,0 +1,8 @@
+
+ package-level
+ package-level-local-export
+ package-level-imported-to-app
+ app-level
+ app-level-export
+
+
diff --git a/tools/tests/apps/app-using-stylus/client/app-export.styl b/tools/tests/apps/app-using-stylus/client/app-export.styl
new file mode 100644
index 0000000000..2c2d1878a5
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/client/app-export.styl
@@ -0,0 +1,4 @@
+.app-level-export {
+ background-color: aqua
+}
+
diff --git a/tools/tests/apps/app-using-stylus/client/app.main.styl b/tools/tests/apps/app-using-stylus/client/app.main.styl
new file mode 100644
index 0000000000..2c320b346d
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/client/app.main.styl
@@ -0,0 +1,7 @@
+@import '{my-package}/package-export.styl'
+@import '{}/client/app-export.styl'
+
+.app-level {
+ background-color: chocolate
+}
+
diff --git a/tools/tests/apps/app-using-stylus/main.js b/tools/tests/apps/app-using-stylus/main.js
new file mode 100644
index 0000000000..8396737c40
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/main.js
@@ -0,0 +1,26 @@
+if (Meteor.isClient) {
+ Meteor.startup(function () {
+ var classes = ['app-level', 'app-level-export', 'package-level', 'package-level-local-export', 'package-level-imported-to-app'];
+ var colors = ['chocolate', 'cyan', 'salmon', 'red', 'blue'];
+ for (var i in classes) {
+ var selector = '.' + classes[i];
+ Meteor.call('print', getComputedStyle(document.querySelector(selector))['background-color'] === colorToRGBString(colors[i]));
+ }
+ });
+
+ function colorToRGBString(color) {
+ d = document.createElement("div");
+ d.style.color = color;
+ document.body.appendChild(d);
+ var str = getComputedStyle(d).color;
+ document.body.removeChild(d);
+ return str;
+ }
+} else {
+ Meteor.methods({
+ print: function (str) {
+ console.log(str);
+ }
+ });
+}
+
diff --git a/tools/tests/apps/app-using-stylus/packages/my-package/package-export.styl b/tools/tests/apps/app-using-stylus/packages/my-package/package-export.styl
new file mode 100644
index 0000000000..990c3868c8
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/packages/my-package/package-export.styl
@@ -0,0 +1,4 @@
+.package-level-imported-to-app {
+ background-color: blue
+}
+
diff --git a/tools/tests/apps/app-using-stylus/packages/my-package/package-file.main.styl b/tools/tests/apps/app-using-stylus/packages/my-package/package-file.main.styl
new file mode 100644
index 0000000000..6d24b25f21
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/packages/my-package/package-file.main.styl
@@ -0,0 +1,6 @@
+.package-level {
+ background-color: salmon
+}
+
+@import 'package-local-export.styl'
+
diff --git a/tools/tests/apps/app-using-stylus/packages/my-package/package-local-export.styl b/tools/tests/apps/app-using-stylus/packages/my-package/package-local-export.styl
new file mode 100644
index 0000000000..16a6736e7b
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/packages/my-package/package-local-export.styl
@@ -0,0 +1,4 @@
+.package-level-local-export {
+ background-color: red
+}
+
diff --git a/tools/tests/apps/app-using-stylus/packages/my-package/package.js b/tools/tests/apps/app-using-stylus/packages/my-package/package.js
new file mode 100644
index 0000000000..98a7054275
--- /dev/null
+++ b/tools/tests/apps/app-using-stylus/packages/my-package/package.js
@@ -0,0 +1,11 @@
+Package.describe({
+ summary: "test local package for using stylus"
+});
+
+Package.onUse(function (api) {
+ api.addFiles('package-file.main.styl', 'client');
+ api.addFiles('package-local-export.styl', 'client');
+ api.addFiles('package-export.styl', 'client');
+
+ api.use('stylus');
+});
diff --git a/tools/tests/stylus-cross-packages.js b/tools/tests/stylus-cross-packages.js
new file mode 100644
index 0000000000..352fb8fb2f
--- /dev/null
+++ b/tools/tests/stylus-cross-packages.js
@@ -0,0 +1,30 @@
+var selftest = require('../selftest.js');
+var Sandbox = selftest.Sandbox;
+var utils = require('../utils.js');
+
+selftest.define("can import stylus across packages", function (options) {
+ var s = new Sandbox({
+ clients: options.clients
+ });
+
+ s.createApp("myapp", "app-using-stylus");
+ s.cd("myapp");
+ s.testWithAllClients(function (run) {
+ run.match("myapp");
+ run.match("proxy");
+ run.match("MongoDB");
+ run.match("running at");
+ run.match("localhost");
+
+ run.connectClient();
+ run.waitSecs(40);
+
+ run.match("true");
+ run.match("true");
+ run.match("true");
+ run.match("true");
+ run.match("true");
+
+ run.stop();
+ });
+});