deprecate getHandler in favor of createStaticHandler
diff --git a/example/example_server.dart b/example/example_server.dart
index 948c397..3331b64 100644
--- a/example/example_server.dart
+++ b/example/example_server.dart
@@ -11,7 +11,7 @@
         'root of the project.');
   }
   var handler = const shelf.Pipeline().addMiddleware(shelf.logRequests())
-      .addHandler(getHandler('example/files'));
+      .addHandler(createStaticHandler('example/files'));
 
   io.serve(handler, 'localhost', 8080).then((server) {
     print('Serving at http://${server.address.host}:${server.port}');
diff --git a/lib/shelf_static.dart b/lib/shelf_static.dart
index 18815ee..52cbc23 100644
--- a/lib/shelf_static.dart
+++ b/lib/shelf_static.dart
@@ -10,10 +10,13 @@
 // directory listing
 // default document
 // sym links
-// mime type handling
 // hidden files
 
-Handler getHandler(String fileSystemPath) {
+// TODO: {bool serveFilesOutsidePath}
+
+/// Creates a Shelf [Handler] that serves files from the provided
+/// [fileSystemPath].
+Handler createStaticHandler(String fileSystemPath) {
   var rootDir = new Directory(fileSystemPath);
   if (!rootDir.existsSync()) {
     throw new ArgumentError('A directory corresponding to fileSystemPath '
@@ -42,9 +45,7 @@
 
     // Do not serve a file outside of the original fileSystemPath
     if (!p.isWithin(fileSystemPath, resolvedPath)) {
-      // TODO(kevmoo) throw a real error here. Perhaps a new error type?
-      throw 'Requested path ${request.url.path} resolved to $resolvedPath '
-          'is not under $fileSystemPath.';
+      return new Response.notFound('Not Found');
     }
 
     var fileStat = file.statSync();
@@ -69,3 +70,8 @@
     return new Response.ok(file.openRead(), headers: headers);
   };
 }
+
+/// Use [createStaticHandler] instead.
+@deprecated
+Handler getHandler(String fileSystemPath) =>
+    createStaticHandler(fileSystemPath);
diff --git a/test/alternative_root_test.dart b/test/alternative_root_test.dart
index 3acf750..091de1a 100644
--- a/test/alternative_root_test.dart
+++ b/test/alternative_root_test.dart
@@ -31,7 +31,7 @@
 
   test('access root file', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/static/root.txt', scriptName: '/static')
           .then((response) {
@@ -44,7 +44,7 @@
 
   test('access root file with space', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/static/files/with%20space.txt',
           scriptName: '/static').then((response) {
@@ -57,7 +57,7 @@
 
   test('access root file with unencoded space', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/static/files/with space.txt',
           scriptName: '/static').then((response) {
@@ -68,7 +68,7 @@
 
   test('access file under directory', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/static/files/test.txt',
           scriptName: '/static').then((response) {
@@ -81,7 +81,7 @@
 
   test('file not found', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/static/not_here.txt',
           scriptName: '/static').then((response) {
diff --git a/test/basic_file_test.dart b/test/basic_file_test.dart
index 5da3771..6497889 100644
--- a/test/basic_file_test.dart
+++ b/test/basic_file_test.dart
@@ -35,7 +35,7 @@
 
   test('access root file', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/root.txt').then((response) {
         expect(response.statusCode, HttpStatus.OK);
@@ -47,7 +47,7 @@
 
   test('access root file with space', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/files/with%20space.txt').then((response) {
         expect(response.statusCode, HttpStatus.OK);
@@ -59,7 +59,7 @@
 
   test('access root file with unencoded space', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/files/with space.txt').then((response) {
         expect(response.statusCode, HttpStatus.FORBIDDEN);
@@ -69,7 +69,7 @@
 
   test('access file under directory', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/files/test.txt').then((response) {
         expect(response.statusCode, HttpStatus.OK);
@@ -81,7 +81,7 @@
 
   test('file not found', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       return makeRequest(handler, '/not_here.txt').then((response) {
         expect(response.statusCode, HttpStatus.NOT_FOUND);
@@ -91,7 +91,7 @@
 
   test('last modified', () {
     schedule(() {
-      var handler = getHandler(d.defaultRoot);
+      var handler = createStaticHandler(d.defaultRoot);
 
       var rootPath = p.join(d.defaultRoot, 'root.txt');
       var modified = new File(rootPath).statSync().changed.toUtc();
@@ -105,7 +105,7 @@
   group('if modified since', () {
     test('same as last modified', () {
       schedule(() {
-        var handler = getHandler(d.defaultRoot);
+        var handler = createStaticHandler(d.defaultRoot);
 
         var rootPath = p.join(d.defaultRoot, 'root.txt');
         var modified = new File(rootPath).statSync().changed.toUtc();
@@ -124,7 +124,7 @@
 
     test('before last modified', () {
       schedule(() {
-        var handler = getHandler(d.defaultRoot);
+        var handler = createStaticHandler(d.defaultRoot);
 
         var rootPath = p.join(d.defaultRoot, 'root.txt');
         var modified = new File(rootPath).statSync().changed.toUtc();
@@ -144,7 +144,7 @@
 
     test('after last modified', () {
       schedule(() {
-        var handler = getHandler(d.defaultRoot);
+        var handler = createStaticHandler(d.defaultRoot);
 
         var rootPath = p.join(d.defaultRoot, 'root.txt');
         var modified = new File(rootPath).statSync().changed.toUtc();
@@ -166,7 +166,7 @@
   group('content type', () {
     test('root.txt should be text/plain', () {
       schedule(() {
-        var handler = getHandler(d.defaultRoot);
+        var handler = createStaticHandler(d.defaultRoot);
 
         return makeRequest(handler, '/root.txt').then((response) {
           expect(response.mimeType, 'text/plain');
@@ -176,7 +176,7 @@
 
     test('index.html should be text/html', () {
       schedule(() {
-        var handler = getHandler(d.defaultRoot);
+        var handler = createStaticHandler(d.defaultRoot);
 
         return makeRequest(handler, '/index.html').then((response) {
           expect(response.mimeType, 'text/html');
@@ -186,7 +186,7 @@
 
     test('random.unknown should be null', () {
       schedule(() {
-        var handler = getHandler(d.defaultRoot);
+        var handler = createStaticHandler(d.defaultRoot);
 
         return makeRequest(handler, '/random.unknown').then((response) {
           expect(response.mimeType, isNull);
@@ -200,4 +200,7 @@
   // hosted via other path: success, fail
 
   // no sym links
+
+  // sym link within provided root
+  // sym link outside provided root
 }
diff --git a/test/get_handler_test.dart b/test/get_handler_test.dart
index 87b1205..b88b013 100644
--- a/test/get_handler_test.dart
+++ b/test/get_handler_test.dart
@@ -31,27 +31,27 @@
 
   test('non-existent relative path', () {
     schedule(() {
-      expect(() => getHandler('random/relative'), throwsArgumentError);
+      expect(() => createStaticHandler('random/relative'), throwsArgumentError);
     });
   });
 
   test('existing relative path', () {
     schedule(() {
       var existingRelative = p.relative(d.defaultRoot);
-      expect(() => getHandler(existingRelative), returnsNormally);
+      expect(() => createStaticHandler(existingRelative), returnsNormally);
     });
   });
 
   test('non-existent absolute path', () {
     schedule(() {
       var nonExistingAbsolute = p.join(d.defaultRoot, 'not_here');
-      expect(() => getHandler(nonExistingAbsolute), throwsArgumentError);
+      expect(() => createStaticHandler(nonExistingAbsolute), throwsArgumentError);
     });
   });
 
   test('existing absolute path', () {
     schedule(() {
-      expect(() => getHandler(d.defaultRoot), returnsNormally);
+      expect(() => createStaticHandler(d.defaultRoot), returnsNormally);
     });
   });
 }
diff --git a/test/sample_test.dart b/test/sample_test.dart
index 114e509..fb229b1 100644
--- a/test/sample_test.dart
+++ b/test/sample_test.dart
@@ -62,7 +62,7 @@
 }
 
 Future<Response> _request(Request request) {
-  var handler = getHandler(_samplePath);
+  var handler = createStaticHandler(_samplePath);
 
   return syncFuture(() => handler(request));
 }