diff --git a/lib/spack/spack/hooks/__init__.py b/lib/spack/spack/hooks/__init__.py
index 98b7f2323f2a0d9fdd3714c10b5589aa3070a01e..1c44e8abaaaceaffcaed945ef5b891441dff9138 100644
--- a/lib/spack/spack/hooks/__init__.py
+++ b/lib/spack/spack/hooks/__init__.py
@@ -31,7 +31,9 @@
 
    Currently the following hooks are supported:
 
+      * pre_install()
       * post_install()
+      * pre_uninstall()
       * post_uninstall()
 
    This can be used to implement support for things like module
@@ -70,5 +72,8 @@ def __call__(self, pkg):
 #
 # Define some functions that can be called to fire off hooks.
 #
-post_install = HookRunner('post_install')
+pre_install    = HookRunner('pre_install')
+post_install   = HookRunner('post_install')
+
+pre_uninstall  = HookRunner('pre_uninstall')
 post_uninstall = HookRunner('post_uninstall')
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index c256ea479f052d90a5624c1dfe9746ec8fe70dec..aa79721266c1812218d0baccdc142e132be79876 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -768,6 +768,10 @@ def do_install(self, **kwargs):
                 # package naming scheme it likes.
                 spack.install_layout.make_path_for_spec(self.spec)
 
+                # Run the pre-install hook in the child process after
+                # the directory is created.
+                spack.hooks.pre_install(self)
+
                 # Set up process's build environment before running install.
                 self.stage.chdir_to_source()
                 build_env.setup_package(self)
@@ -862,6 +866,10 @@ def do_uninstall(self, **kwargs):
                 "The following installed packages depend on it: %s" %
                 ' '.join(formatted_deps))
 
+        # Pre-uninstall hook runs first.
+        spack.hooks.pre_uninstall(self)
+
+        # Uninstalling in Spack only requires removing the prefix.
         self.remove_prefix()
         tty.msg("Successfully uninstalled %s." % self.spec.short_spec)