diff --git a/include/feeds.mk b/include/feeds.mk
index 4f71b399408fa2e27fa63ef83ca00185e4d2e7fe..ef7a09f4cd272ded4da736a37c516b77d8e1ada2 100644
--- a/include/feeds.mk
+++ b/include/feeds.mk
@@ -1,5 +1,6 @@
 #
 # Copyright (C) 2014 OpenWrt.org
+# Copyright (C) 2016 LEDE Project
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -12,6 +13,16 @@ FEEDS_INSTALLED:=$(notdir $(wildcard $(TOPDIR)/package/feeds/*))
 FEEDS_ENABLED:=$(foreach feed,$(FEEDS_INSTALLED),$(if $(CONFIG_FEED_$(feed)),$(feed)))
 FEEDS_DISABLED:=$(filter-out $(FEEDS_ENABLED),$(FEEDS_AVAILABLE))
 
+PACKAGE_SUBDIRS=$(PACKAGE_DIR)
+ifneq ($(CONFIG_PER_FEED_REPO),)
+	PACKAGE_SUBDIRS += $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/base
+	ifneq ($(CONFIG_PER_FEED_REPO_ADD_DISABLED),)
+		PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_AVAILABLE),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED))
+	else
+		PACKAGE_SUBDIRS += $(foreach FEED,$(FEEDS_ENABLED),$(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(FEED))
+	endif
+endif
+
 PKG_CONFIG_DEPENDS += \
 	CONFIG_PER_FEED_REPO \
 	CONFIG_PER_FEED_REPO_ADD_DISABLED \
@@ -19,9 +30,13 @@ PKG_CONFIG_DEPENDS += \
 	$(foreach feed,$(FEEDS_INSTALLED),CONFIG_FEED_$(feed))
 
 # 1: package name
+# 2: flags
+# 3: section
 define FeedPackageDir
 $(strip $(if $(CONFIG_PER_FEED_REPO), \
-  $(abspath $(PACKAGE_DIR)/$(if $(Package/$(1)/subdir),$(Package/$(1)/subdir),base)), \
+  $(if $(Package/$(1)/subdir), \
+    $(abspath $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES)/$(Package/$(1)/subdir)), \
+    $(PACKAGE_DIR)), \
   $(PACKAGE_DIR)))
 endef
 
diff --git a/include/package-ipkg.mk b/include/package-ipkg.mk
index eb4c874047e8a9e24a4d77b13f7ba66e1221cbb5..a86f401805b33927b1ae14781d932812e597e4a9 100644
--- a/include/package-ipkg.mk
+++ b/include/package-ipkg.mk
@@ -88,7 +88,7 @@ _endef=endef
 
 ifeq ($(DUMP),)
   define BuildTarget/ipkg
-    PDIR_$(1):=$(call FeedPackageDir,$(1))
+    PDIR_$(1):=$(call FeedPackageDir,$(1),$(PKG_FLAGS),$(SECTION))
     IPKG_$(1):=$$(PDIR_$(1))/$(1)_$(VERSION)_$(PKGARCH).ipk
     IDIR_$(1):=$(PKG_BUILD_DIR)/ipkg-$(PKGARCH)/$(1)
     KEEP_$(1):=$(strip $(call Package/$(1)/conffiles))
diff --git a/include/package.mk b/include/package.mk
index ca315b59acee8e1c729fe9ae3080603796f61800..ff9a5df9e6698512479d4f5add1410b34588afb0 100644
--- a/include/package.mk
+++ b/include/package.mk
@@ -294,7 +294,7 @@ Build/DistCheck=$(call Build/DistCheck/Default,)
 prepare-package-install:
 	@mkdir -p $(PKG_INFO_DIR)
 	@touch $(PKG_INSTALL_STAMP).clean
-	@echo "$(filter-out essential,$(PKG_FLAGS))" > $(PKG_INSTALL_STAMP).flags
+	@echo "$(filter-out essential nonshared,$(PKG_FLAGS))" > $(PKG_INSTALL_STAMP).flags
 
 $(PACKAGE_DIR):
 	mkdir -p $@
diff --git a/package/Makefile b/package/Makefile
index e0bd75ba7f6bfc72e6740552b52cce438c6cbee9..c8f12d8a44018b3b6f2f32cae346926653929835 100644
--- a/package/Makefile
+++ b/package/Makefile
@@ -98,7 +98,7 @@ $(curdir)/install: $(TMP_DIR)/.build $(curdir)/system/opkg/host/install
 	- find $(STAGING_DIR_ROOT) -type d | $(XARGS) chmod 0755
 	rm -rf $(TARGET_DIR)
 	[ -d $(TARGET_DIR)/tmp ] || mkdir -p $(TARGET_DIR)/tmp
-	@$(FIND) `sed -e 's|.*|$(PACKAGE_DIR)$(if $(CONFIG_PER_FEED_REPO),/*)/&_*.ipk|' $(PACKAGE_INSTALL_FILES)` | sort -u | $(OPKG) install
+	@echo $(wildcard $(foreach dir,$(PACKAGE_SUBDIRS),$(foreach pkg,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null),$(dir)/$(pkg)_*.ipk))) | $(OPKG) install
 	@for file in $(PACKAGE_INSTALL_FILES); do \
 		[ -s $$file.flags ] || continue; \
 		for flag in `cat $$file.flags`; do \
@@ -139,28 +139,19 @@ ifndef CONFIG_OPKGSMIME_PASSPHRASE
   endif
 endif
 
-PACKAGE_SUBDIRS=.
-ifneq ($(CONFIG_PER_FEED_REPO),)
-  ifneq ($(CONFIG_PER_FEED_REPO_ADD_DISABLED),)
-    PACKAGE_SUBDIRS=base kernel $(FEEDS_AVAILABLE)
-  else
-    PACKAGE_SUBDIRS=base kernel $(FEEDS_ENABLED)
-  endif
-endif
-
 $(curdir)/index: FORCE
 	@echo Generating package index...
 	@for d in $(PACKAGE_SUBDIRS); do ( \
-		mkdir -p $(PACKAGE_DIR)/$$d; \
-		cd $(PACKAGE_DIR)/$$d || continue; \
+		mkdir -p $$d; \
+		cd $$d || continue; \
 		$(SCRIPT_DIR)/ipkg-make-index.sh . 2>&1 > Packages && \
 			gzip -9nc Packages > Packages.gz; \
 	); done
 ifdef CONFIG_SIGNED_PACKAGES
 	@echo Signing package index...
 	@for d in $(PACKAGE_SUBDIRS); do ( \
-		[ -d $(PACKAGE_DIR)/$$d ] && \
-			cd $(PACKAGE_DIR)/$$d || continue; \
+		[ -d $$d ] && \
+			cd $$d || continue; \
 		$(STAGING_DIR_HOST)/bin/usign -S -m Packages -s $(BUILD_KEY); \
 	); done
 else
@@ -172,8 +163,8 @@ ifeq ($(call qstrip,$(CONFIG_OPKGSMIME_CERT)),)
 else
 	@echo Signing package index...
 	@for d in $(PACKAGE_SUBDIRS); do ( \
-		[ -d $(PACKAGE_DIR)/$$d ] && \
-			cd $(PACKAGE_DIR)/$$d || continue; \
+		[ -d $$d ] && \
+			cd $$d || continue; \
 		openssl smime -binary -in Packages.gz \
 			-out Packages.sig -outform PEM -sign \
 			-signer $(CONFIG_OPKGSMIME_CERT) \