Expose importlib.util.set___package__.
diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
index dc015c7..4a0ff0e 100644
--- a/Doc/library/importlib.rst
+++ b/Doc/library/importlib.rst
@@ -167,20 +167,28 @@
     A :term:`decorator` for a :term:`loader` which handles selecting the proper
     module object to load with. The decorated method is expected to have a call
     signature of ``method(self, module_object)`` for which the second argument
-    will be the module object to be used (note that the decorator will not work
-    on static methods because of the assumption of two arguments).
+    will be the module object to be used by the loader (note that the decorator
+    will not work on static methods because of the assumption of two
+    arguments).
 
     The decorated method will take in the name of the module to be loaded as
-    normal. If the module is not found in :data:`sys.modules` then a new one is
-    constructed with its :attr:`__name__` attribute set. Otherwise the module
-    found in :data:`sys.modules` will be passed into the method. If an
+    expected for a :term:`loader`. If the module is not found in
+    :data:`sys.modules` then a new one is constructed with its
+    :attr:`__name__` attribute set. Otherwise the module found in
+    :data:`sys.modules` will be passed into the method. If an
     exception is raised by the decorated method and a module was added to
     :data:`sys.modules` it will be removed to prevent a partially initialized
-    module from being in left in :data:`sys.modules` If an exception is raised
-    by the decorated method and a module was added to :data:`sys.modules` it
-    will be removed to prevent a partially initialized module from being in
-    left in :data:`sys.modules`. If the module was already in
-    :data:`sys.modules` then it is left alone.
+    module from being in left in :data:`sys.modules`. If the module was already
+    in :data:`sys.modules` then it is left alone.
 
-    Use of this decorator handles all the details of what module a loader
-    should use as specified by :pep:`302`.
+    Use of this decorator handles all the details of what module object a
+    loader should initialize as specified by :pep:`302`.
+
+
+.. function:: set___package__(method)
+
+    A :term:`decorator` for a :term:`loader` to set the :attr:`__package__`
+    attribute on the module returned by the loader. If :attr:`__package__` is
+    set and has a value other than :keyword:`None` it will not be changed.
+    Note that the module returned by the loader is what has the attribute
+    set on and not the module found in :data:`sys.modules`.
diff --git a/Lib/importlib/NOTES b/Lib/importlib/NOTES
index 22103a1..72b7da8 100644
--- a/Lib/importlib/NOTES
+++ b/Lib/importlib/NOTES
@@ -1,10 +1,6 @@
 to do
 /////
 
-* Implement PEP 302 protocol for loaders (should just be a matter of testing).
-
-    + Source/bytecode.
-
 * Public API left to expose (w/ docs!)
 
     + abc
@@ -27,27 +23,15 @@
             * get_code
             * get_source
 
-        - (?) SourceLoader(ResourceLoader)
+        - PyLoader(ResourceLoader)
 
             * source_path
+
+        - PyPycLoader(PyLoader)
+
+            * source_mtime
             * bytecode_path
-            * write_bytecode (not abstract)
-
-    + util
-
-        - set___package__ decorator
-
-    + machinery
-
-        - Extensions importers
-
-            * ExtensionFinder
-            * (?) Loader
-
-        - Source/bytecode importers
-
-            * SourceFinder
-            * (?) Loader
+            * write_bytecode
 
     + test (Really want to worry about compatibility with future versions?)
 
diff --git a/Lib/importlib/test/test_util.py b/Lib/importlib/test/test_util.py
index 476b43f..8bd35f1 100644
--- a/Lib/importlib/test/test_util.py
+++ b/Lib/importlib/test/test_util.py
@@ -60,9 +60,58 @@
             self.assert_(sys.modules[name] is module)
 
 
+class SetPackageTests(unittest.TestCase):
+
+
+    """Tests for importlib.util.set___package__."""
+
+    def verify(self, module, expect):
+        """Verify the module has the expected value for __package__ after
+        passing through set___package__."""
+        fxn = lambda: module
+        wrapped = util.set___package__(fxn)
+        wrapped()
+        self.assert_(hasattr(module, '__package__'))
+        self.assertEqual(expect, module.__package__)
+
+    def test_top_level(self):
+        # __package__ should be set to the empty string if a top-level module.
+        # Implicitly tests when package is set to None.
+        module = imp.new_module('module')
+        module.__package__ = None
+        self.verify(module, '')
+
+    def test_package(self):
+        # Test setting __package__ for a package.
+        module = imp.new_module('pkg')
+        module.__path__ = ['<path>']
+        module.__package__ = None
+        self.verify(module, 'pkg')
+
+    def test_submodule(self):
+        # Test __package__ for a module in a package.
+        module = imp.new_module('pkg.mod')
+        module.__package__ = None
+        self.verify(module, 'pkg')
+
+    def test_setting_if_missing(self):
+        # __package__ should be set if it is missing.
+        module = imp.new_module('mod')
+        if hasattr(module, '__package__'):
+            delattr(module, '__package__')
+        self.verify(module, '')
+
+    def test_leaving_alone(self):
+        # If __package__ is set and not None then leave it alone.
+        for value in (True, False):
+            module = imp.new_module('mod')
+            module.__package__ = value
+            self.verify(module, value)
+
+
 def test_main():
     from test import support
-    support.run_unittest(ModuleForLoaderTests)
+    support.run_unittest(ModuleForLoaderTests, SetPackageTests)
 
 
 if __name__ == '__main__':
diff --git a/Lib/importlib/util.py b/Lib/importlib/util.py
index 6250d5b..2b6154b 100644
--- a/Lib/importlib/util.py
+++ b/Lib/importlib/util.py
@@ -1,2 +1,3 @@
 """Utility code for constructing importers, etc."""
 from ._bootstrap import module_for_loader
+from ._bootstrap import set___package__