diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 57539077fac941136eeb84b4fa5a6ce770a4bac8..8048f4eb2f16bbc81f0c233e0b44f0dd4e114d45 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -308,6 +308,8 @@ def test_msvcrt_and_copy_action(self, src, dst):
         # This is used to test a dll manifest.
         # It is used as a temporary override during the construct method
         from test_win32_manifest import test_assembly_binding
+        # TODO: This is redundant with LLManifest.copy_action(). Why aren't we
+        # calling copy_action() in conjunction with test_assembly_binding()?
         if src and (os.path.exists(src) or os.path.islink(src)):
             # ensure that destination path exists
             self.cmakedirs(os.path.dirname(dst))
@@ -328,6 +330,8 @@ def test_for_no_msvcrt_manifest_and_copy_action(self, src, dst):
         # It is used as a temporary override during the construct method
         from test_win32_manifest import test_assembly_binding
         from test_win32_manifest import NoManifestException, NoMatchingAssemblyException
+        # TODO: This is redundant with LLManifest.copy_action(). Why aren't we
+        # calling copy_action() in conjunction with test_assembly_binding()?
         if src and (os.path.exists(src) or os.path.islink(src)):
             # ensure that destination path exists
             self.cmakedirs(os.path.dirname(dst))
@@ -356,18 +360,16 @@ def construct(self):
         pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
         relpkgdir = os.path.join(pkgdir, "lib", "release")
         debpkgdir = os.path.join(pkgdir, "lib", "debug")
-        vmpdir = os.path.join(pkgdir, "VMP")
-        llbasedir = os.path.join(pkgdir, "lib", "python", "llbase")
 
         if self.is_packaging_viewer():
             # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
             self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
 
-            # include the compiled launcher scripts so that it gets included in the file_list
-            self.path(src='%s/SL_Launcher.exe' % vmpdir, dst="SL_Launcher.exe")
-
-            #IUM is not normally executed directly, just imported.  No exe needed.
-            self.path2basename(vmpdir,"InstallerUserMessage.py")
+            with self.prefix(src=os.path.join(pkgdir, "VMP"), dst=""):
+                # include the compiled launcher scripts so that it gets included in the file_list
+                self.path('SL_Launcher.exe')
+                #IUM is not normally executed directly, just imported.  No exe needed.
+                self.path("InstallerUserMessage.py")
 
             with self.prefix(src=self.icon_path(), dst="vmp_icons"):
                 self.path("secondlife.ico")
@@ -378,12 +380,9 @@ def construct(self):
                 self.path("*.gif")
 
             #before, we only needed llbase at build time.  With VMP, we need it at run time.
-            llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
-            if not os.path.exists(llbase_path):
-                os.makedirs(llbase_path)
-            with self.prefix(dst="llbase"):
-                self.path2basename(llbasedir,"*.py")
-                self.path2basename(llbasedir,"_cllsd.so")
+            with self.prefix(src=os.path.join(pkgdir, "lib", "python", "llbase"), dst="llbase"):
+                self.path("*.py")
+                self.path("_cllsd.so")
 
         # Plugin host application
         self.path2basename(os.path.join(os.pardir,
@@ -771,59 +770,31 @@ def construct(self):
         pkgdir = os.path.join(self.args['build'], os.pardir, 'packages')
         relpkgdir = os.path.join(pkgdir, "lib", "release")
         debpkgdir = os.path.join(pkgdir, "lib", "debug")
-        vmpdir = os.path.join(pkgdir, "VMP")
-        llbasedir = os.path.join(pkgdir, "lib", "python", "llbase")
-        requestsdir = os.path.join(pkgdir, "lib", "python", "requests")
-        urllib3dir = os.path.join(pkgdir, "lib", "python", "urllib3")
-        chardetdir = os.path.join(pkgdir, "lib", "python", "chardet")
-        idnadir = os.path.join(pkgdir, "lib", "python", "idna")
 
         with self.prefix(src="", dst="Contents"):  # everything goes in Contents
-            self.path("Info.plist", dst="Info.plist")
+            self.path("Info.plist")
 
-            # copy additional libs in <bundle>/Contents/MacOS/
-            self.path(os.path.join(relpkgdir, "libndofdev.dylib"), dst="Resources/libndofdev.dylib")
-            self.path(os.path.join(relpkgdir, "libhunspell-1.3.0.dylib"), dst="Resources/libhunspell-1.3.0.dylib")   
+            with self.prefix(src=relpkgdir, dst="Resources"):
+                self.path("libndofdev.dylib")
+                self.path("libhunspell-1.3.0.dylib")   
 
+            # copy additional libs in <bundle>/Contents/MacOS/
             with self.prefix(dst="MacOS"):              
                 #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322, SL-323
-                self.path2basename(vmpdir,"SL_Launcher")
-                self.path2basename(vmpdir,"*.py")
-                # certifi will be imported by requests; this is our custom version to get our ca-bundle.crt 
-                certifi_path = os.path.join(self.get_dst_prefix(),'certifi')
-                if not os.path.exists(certifi_path):
-                    os.makedirs(certifi_path)
-                with self.prefix(dst="certifi"):
-                    self.path2basename(os.path.join(vmpdir,"certifi"),"*")
-                # llbase provides our llrest service layer and llsd decoding
-                llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
-                if not os.path.exists(llbase_path):
-                    os.makedirs(llbase_path)
-                with self.prefix(dst="llbase"):
-                    self.path2basename(llbasedir,"*.py")
-                    self.path2basename(llbasedir,"_cllsd.so")
-                #requests module needed by llbase/llrest.py
-                #this is only needed on POSIX, because in Windows we compile it into the EXE
-                requests_path = os.path.join(self.get_dst_prefix(),'requests')
-                if not os.path.exists(requests_path):
-                    os.makedirs(requests_path)
-                with self.prefix(dst="requests"):
-                    self.path2basename(requestsdir,"*")
-                urllib3_path = os.path.join(self.get_dst_prefix(),'urllib3')
-                if not os.path.exists(urllib3_path):
-                    os.makedirs(urllib3_path)
-                with self.prefix(dst="urllib3"):
-                    self.path2basename(urllib3dir,"*")
-                chardet_path = os.path.join(self.get_dst_prefix(),'chardet')
-                if not os.path.exists(chardet_path):
-                    os.makedirs(chardet_path)
-                with self.prefix(dst="chardet"):
-                    self.path2basename(chardetdir,"*")
-                idna_path = os.path.join(self.get_dst_prefix(),'idna')
-                if not os.path.exists(idna_path):
-                    os.makedirs(idna_path)
-                with self.prefix(dst="idna"):
-                    self.path2basename(idnadir,"*")
+                with self.prefix(src=os.path.join(pkgdir, "VMP"), dst=""):
+                    self.path("SL_Launcher")
+                    self.path("*.py")
+                    # certifi will be imported by requests; this is our custom version to get our ca-bundle.crt 
+                    self.path("certifi")
+                with self.prefix(src=os.path.join(pkgdir, "lib", "python"), dst=""):
+                    # llbase provides our llrest service layer and llsd decoding
+                    with self.prefix("llbase"):
+                        self.path("*.py")
+                        self.path("_cllsd.so")
+                    #requests module needed by llbase/llrest.py
+                    #this is only needed on POSIX, because in Windows we compile it into the EXE
+                    for pypkg in "chardet", "idna", "requests", "urllib3":
+                        self.path(pypkg)
 
             # most everything goes in the Resources directory
             with self.prefix(src="", dst="Resources"):
@@ -1273,18 +1244,15 @@ def construct(self):
             self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin")
             self.path2basename("../llplugin/slplugin", "SLPlugin") 
             #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323
-            self.path2basename("../viewer_components/manager","SL_Launcher")
-            self.path2basename("../viewer_components/manager","*.py")
-            llbase_path = os.path.join(self.get_dst_prefix(),'llbase')
-            if not os.path.exists(llbase_path):
-                os.makedirs(llbase_path)
-            with self.prefix(dst="llbase"):
-                self.path2basename("../packages/lib/python/llbase","*.py")
-                self.path2basename("../packages/lib/python/llbase","_cllsd.so")         
-
-        with self.prefix("res-sdl"):
-            self.path("*")
-            # recurse
+            with self.prefix(src="../viewer_components/manager", dst=""):
+                self.path("SL_Launcher")
+                self.path("*.py")
+            with self.prefix(src=os.path.join("lib", "python", "llbase"), dst="llbase"):
+                self.path("*.py")
+                self.path("_cllsd.so")         
+
+        # recurses, packaged again
+        self.path("res-sdl")
 
         # Get the icons based on the channel type
         icon_path = self.icon_path()
@@ -1295,9 +1263,10 @@ def construct(self):
                 self.path("secondlife_256.BMP","ll_icon.BMP")
 
         # plugins
-        with self.prefix(src="", dst="bin/llplugin"):
-            self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so")
-            self.path("../media_plugins/libvlc/libmedia_plugin_libvlc.so", "libmedia_plugin_libvlc.so")
+        with self.prefix(src="../media_plugins", dst="bin/llplugin"):
+            self.path("gstreamer010/libmedia_plugin_gstreamer010.so",
+                      "libmedia_plugin_gstreamer.so")
+            self.path2basename("libvlc", "libmedia_plugin_libvlc.so")
 
         with self.prefix(src=os.path.join(os.pardir, 'packages', 'lib', 'vlc', 'plugins'), dst="bin/llplugin/vlc/plugins"):
             self.path( "plugins.dat" )