Merge pull request #425 from williamspatrick/increase-oldest-kernel

Force OLDEST_KERNEL to 4.4.0
diff --git a/classes/config-in-skeleton.bbclass b/classes/config-in-skeleton.bbclass
index 72249ff..907f226 100644
--- a/classes/config-in-skeleton.bbclass
+++ b/classes/config-in-skeleton.bbclass
@@ -4,9 +4,13 @@
 inherit allarch
 inherit setuptools
 inherit pythonnative
+inherit skeleton-rev
+inherit obmc-phosphor-license
+
+HOMEPAGE = "http://github.com/openbmc/skeleton"
 
 DEPENDS += "python"
-SRC_URI += "git://github.com/openbmc/skeleton;subpath=configs"
+SRC_URI += "${SKELETON_URI};subpath=configs"
 S = "${WORKDIR}/configs"
 
 python() {
diff --git a/classes/obmc-phosphor-image_types_uboot.bbclass b/classes/obmc-phosphor-image_types_uboot.bbclass
index c44139e..23903d8 100644
--- a/classes/obmc-phosphor-image_types_uboot.bbclass
+++ b/classes/obmc-phosphor-image_types_uboot.bbclass
@@ -52,6 +52,8 @@
        uinitrd="${initrd}.u-boot"
        rootfs="${IMAGE_LINK_NAME}.${IMAGE_BASETYPE}"
        rwfs="rwfs.${OVERLAY_BASETYPE}"
+       rofsimg=rofs.${IMAGE_BASETYPE}.cpio
+       netimg=initramfs-netboot.cpio
 
        if [ ! -f $ddir/$kernel ]; then
               bbfatal "Kernel file ${ddir}/${kernel} does not exist"
@@ -77,11 +79,11 @@
        dst="${ddir}/${FLASH_IMAGE_NAME}"
        rm -rf $dst
        mk_nor_image ${dst} ${FLASH_SIZE}
-       dd if=${ddir}/${uboot} of=${dst} bs=1k seek=${FLASH_UBOOT_OFFSET}
-       dd if=${ddir}/${kernel} of=${dst} bs=1k seek=${FLASH_KERNEL_OFFSET}
-       dd if=${ddir}/${uinitrd} of=${dst} bs=1k seek=${FLASH_INITRD_OFFSET}
-       dd if=${ddir}/${rootfs} of=${dst} bs=1k seek=${FLASH_ROFS_OFFSET}
-       dd if=${ddir}/${rwfs} of=${dst} bs=1k seek=${FLASH_RWFS_OFFSET}
+       dd if=${ddir}/${uboot} of=${dst} bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET}
+       dd if=${ddir}/${kernel} of=${dst} bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET}
+       dd if=${ddir}/${uinitrd} of=${dst} bs=1k conv=notrunc seek=${FLASH_INITRD_OFFSET}
+       dd if=${ddir}/${rootfs} of=${dst} bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET}
+       dd if=${ddir}/${rwfs} of=${dst} bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET}
        dstlink="${ddir}/${FLASH_IMAGE_LINK}"
        rm -rf $dstlink
        ln -sf ${FLASH_IMAGE_NAME} $dstlink
@@ -95,5 +97,13 @@
 
        tar -h -cvf ${ddir}/${MACHINE}-${DATETIME}.all.tar -C ${ddir} image-bmc
        tar -h -cvf ${ddir}/${MACHINE}-${DATETIME}.tar -C ${ddir} image-u-boot image-kernel image-initramfs image-rofs image-rwfs
+
+       # Package the root image (rofs layer) with the initramfs for net booting.
+       # Uses the symlink above to get the desired name in the cpio
+       ( cd $ddir && echo image-rofs | cpio -oHnewc -L > ${rofsimg} )
+       # Prepend the rofs cpio -- being uncompressed it must be 4-byte aligned
+       cat ${ddir}/${rofsimg} ${ddir}/${initrd} > ${ddir}/${netimg}
+       oe_mkimage  "${netimg}" "${INITRD_CTYPE}"
+
 }
 do_generate_flash[vardepsexclude] = "DATETIME"
diff --git a/classes/obmc-phosphor-initfs.bbclass b/classes/obmc-phosphor-initfs.bbclass
deleted file mode 100644
index de7923e..0000000
--- a/classes/obmc-phosphor-initfs.bbclass
+++ /dev/null
@@ -1,4 +0,0 @@
-# Common code for recipes that implement Phosphor OpenBMC filesystem
-
-RPROVIDES_${PN} += "obmc-phosphor-initfs"
-PROVIDES += "obmc-phosphor-initfs"
diff --git a/classes/obmc-phosphor-systemd.bbclass b/classes/obmc-phosphor-systemd.bbclass
index b07174f..f882bfc 100644
--- a/classes/obmc-phosphor-systemd.bbclass
+++ b/classes/obmc-phosphor-systemd.bbclass
@@ -7,32 +7,31 @@
 # and these files will be added to the main package if they exist.
 #
 # Alternatively this class can just be inherited and
-# ${BPN}.service will be added to the main package.
+# ${PN}.service will be added to the main package.
 inherit systemd
 
 
 python() {
-    bpn = d.getVar('BPN', True)
+    pn = d.getVar('PN', True)
     searchpaths = d.getVar('FILESPATH', True)
 
-    services = d.getVar('SYSTEMD_SERVICE_' + bpn, True)
+    services = d.getVar('SYSTEMD_SERVICE_' + pn, True)
 
     if services:
         services = services.split()
     else:
-        services = [bpn + '.service']
+        services = [pn + '.service']
 
     for s in services:
         file = s
         path = bb.utils.which(searchpaths, file)
         if os.path.isfile(path):
             d.appendVar('SRC_URI', ' file://' + file)
-            d.appendVar(
-                'FILES_' + bpn, ' ' +
-                d.getVar('systemd_system_unitdir', True) + file)
+            d.appendVar("FILES_%s" %(pn), " %s/%s" \
+                % (d.getVar('systemd_system_unitdir', True), file))
             d.appendVar('OBMC_SYSTEMD_SERVICES', ' ' + file)
-            if file not in (d.getVar('SYSTEMD_SERVICE_' + bpn, True) or "").split():
-                d.appendVar('SYSTEMD_SERVICE_' + bpn, ' ' + file)
+            if file not in (d.getVar('SYSTEMD_SERVICE_' + pn, True) or "").split():
+                d.appendVar('SYSTEMD_SERVICE_' + pn, ' ' + file)
         else:
             bb.error("Could not find service file: %s" % file)
 }
diff --git a/classes/obmc-phosphor-utils.bbclass b/classes/obmc-phosphor-utils.bbclass
index 4f55629..44ca7ad 100644
--- a/classes/obmc-phosphor-utils.bbclass
+++ b/classes/obmc-phosphor-utils.bbclass
@@ -2,13 +2,16 @@
 
 inherit utils
 
+
 def df_enabled(feature, value, d):
-        return base_contains("DISTRO_FEATURES", feature, value, "", d)
+    return base_contains("DISTRO_FEATURES", feature, value, "", d)
+
 
 def mf_enabled(feature, value, d):
-        return base_contains("MACHINE_FEATURES", feature, value, "", d)
+    return base_contains("MACHINE_FEATURES", feature, value, "", d)
+
 
 def cf_enabled(feature, value, d):
-        return value if df_enabled(feature, value, d) \
-                and mf_enabled(feature, value, d) \
-                        else ""
+    return value if df_enabled(feature, value, d) \
+        and mf_enabled(feature, value, d) \
+            else ""
diff --git a/classes/skeleton-gdbus.bbclass b/classes/skeleton-gdbus.bbclass
new file mode 100644
index 0000000..58df398
--- /dev/null
+++ b/classes/skeleton-gdbus.bbclass
@@ -0,0 +1,7 @@
+inherit skeleton
+
+DEPENDS += "glib-2.0 obmc-libobmc-intf"
+
+do_install_append() {
+        oe_runmake install DESTDIR=${D}
+}
diff --git a/classes/skeleton-python.bbclass b/classes/skeleton-python.bbclass
new file mode 100644
index 0000000..5464e2d
--- /dev/null
+++ b/classes/skeleton-python.bbclass
@@ -0,0 +1,5 @@
+inherit skeleton
+inherit allarch
+inherit setuptools
+
+DEPENDS += "python"
diff --git a/classes/skeleton-rev.bbclass b/classes/skeleton-rev.bbclass
new file mode 100644
index 0000000..93544de
--- /dev/null
+++ b/classes/skeleton-rev.bbclass
@@ -0,0 +1,2 @@
+SRCREV ?= "b4140b888f586c98c5d03893166c5074a98cf951"
+SKELETON_URI ?= "git://github.com/openbmc/skeleton"
diff --git a/classes/skeleton-sdbus.bbclass b/classes/skeleton-sdbus.bbclass
new file mode 100644
index 0000000..627ce76
--- /dev/null
+++ b/classes/skeleton-sdbus.bbclass
@@ -0,0 +1,7 @@
+inherit skeleton
+
+DEPENDS += "systemd"
+
+do_install_append() {
+        oe_runmake install DESTDIR=${D}
+}
diff --git a/classes/skeleton.bbclass b/classes/skeleton.bbclass
new file mode 100644
index 0000000..1f67333
--- /dev/null
+++ b/classes/skeleton.bbclass
@@ -0,0 +1,7 @@
+inherit obmc-phosphor-license
+inherit skeleton-rev
+
+HOMEPAGE = "http://github.com/openbmc/skeleton"
+
+SRC_URI += "${SKELETON_URI}"
+S = "${WORKDIR}/git/${SKELETON_DIR}"
diff --git a/common/recipes-core/os-release/os-release.bbappend b/common/recipes-core/os-release/os-release.bbappend
index 3dd203b..f9befa6 100644
--- a/common/recipes-core/os-release/os-release.bbappend
+++ b/common/recipes-core/os-release/os-release.bbappend
@@ -17,3 +17,4 @@
 
 OS_RELEASE_FIELDS_append = " BUILD_ID"
 do_compile[nostamp] = "1"
+do_compile_remove[vardeps] = "BUILD_ID"
diff --git a/common/recipes-core/systemd/systemd/obmc-standby.target b/common/recipes-core/systemd/systemd/obmc-standby.target
new file mode 100644
index 0000000..d8cd72f
--- /dev/null
+++ b/common/recipes-core/systemd/systemd/obmc-standby.target
@@ -0,0 +1,2 @@
+[Unit]
+Description=OpenBMC System
diff --git a/common/recipes-core/systemd/systemd_%.bbappend b/common/recipes-core/systemd/systemd_%.bbappend
index 9ad6a40..e2995dc 100644
--- a/common/recipes-core/systemd/systemd_%.bbappend
+++ b/common/recipes-core/systemd/systemd_%.bbappend
@@ -2,11 +2,16 @@
 PACKAGECONFIG_remove = "machined hibernate ldconfig binfmt backlight quotacheck localed kdbus ima smack polkit"
 FILESEXTRAPATHS_append := "${THISDIR}/${PN}:"
 SRC_URI += "file://default.network"
+SRC_URI += "file://obmc-standby.target"
 
 FILES_${PN} += "${libdir}/systemd/network/default.network"
+FILES_${PN} += "${systemd_system_unitdir}/obmc-standby.target"
 
 do_install_append() {
         install -m 644 ${WORKDIR}/default.network ${D}${libdir}/systemd/network/
+        install -m 644 ${WORKDIR}/obmc-standby.target ${D}${systemd_system_unitdir}
+        ln -sf ../obmc-standby.target \
+                ${D}${systemd_system_unitdir}/multi-user.target.wants/obmc-standby.target
 
         #TODO Remove after this issue is resolved
         #https://github.com/openbmc/openbmc/issues/152
diff --git a/common/recipes-phosphor/dbus/obmc-mapper/obmc-mapper.service b/common/recipes-phosphor/dbus/obmc-mapper/obmc-mapper.service
index 05d1e80..ff863ea 100644
--- a/common/recipes-phosphor/dbus/obmc-mapper/obmc-mapper.service
+++ b/common/recipes-phosphor/dbus/obmc-mapper/obmc-mapper.service
@@ -7,6 +7,7 @@
 ExecStart=/usr/sbin/phosphor-mapper
 BusName=org.openbmc.ObjectMapper
 TimeoutStartSec=300
+Environment="PYTHONUNBUFFERED=1"
 
 [Install]
 WantedBy=multi-user.target
diff --git a/common/recipes-phosphor/dbus/obmc-rest/obmc-rest.service b/common/recipes-phosphor/dbus/obmc-rest/obmc-rest.service
index a78c86b..8612b98 100644
--- a/common/recipes-phosphor/dbus/obmc-rest/obmc-rest.service
+++ b/common/recipes-phosphor/dbus/obmc-rest/obmc-rest.service
@@ -6,6 +6,7 @@
 [Service]
 Restart=always
 ExecStart=/usr/sbin/obmc-rest
+Environment="PYTHONUNBUFFERED=1"
 
 [Install]
 WantedBy=multi-user.target
diff --git a/common/recipes-phosphor/host-ipmid/host-ipmi-hw-example.bb b/common/recipes-phosphor/host-ipmid/host-ipmi-hw-example.bb
index 13b07ad..3c4766e 100644
--- a/common/recipes-phosphor/host-ipmid/host-ipmi-hw-example.bb
+++ b/common/recipes-phosphor/host-ipmid/host-ipmi-hw-example.bb
@@ -2,16 +2,11 @@
 DESCRIPTION = "Phosphor OpenBMC host IPMI to DBUS example implementation."
 PR = "r1"
 
-RDEPENDS_${PN} += "python-subprocess"
+RDEPENDS_${PN} += "python-subprocess python-dbus python-pygobject"
 
 SYSTEMD_SERVICE_${PN} = "host-ipmi-hw.service"
 
-inherit obmc-phosphor-pydbus-service
 inherit obmc-phosphor-host-ipmi-hw
+inherit skeleton-python
 
-S = "${WORKDIR}/git"
-SRC_URI += "git://github.com/openbmc/skeleton.git;subpath=bin;destsuffix=git"
-SRCREV="2f9ee83356fba3f6f843bf2584f3e7e95763ec98"
-
-SCRIPT_NAME = "ipmi_debug.py"
-INSTALL_NAME = "host-ipmi-hw"
+SKELETON_DIR = "pyipmitest"
diff --git a/common/recipes-phosphor/host-ipmid/host-ipmid.bb b/common/recipes-phosphor/host-ipmid/host-ipmid.bb
index 2a761de..a891df6 100644
--- a/common/recipes-phosphor/host-ipmid/host-ipmid.bb
+++ b/common/recipes-phosphor/host-ipmid/host-ipmid.bb
@@ -19,7 +19,7 @@
 RDEPENDS_${PN} += "network"
 SRC_URI += "git://github.com/openbmc/phosphor-host-ipmid"
 
-SRCREV = "b7bcda57ee39616e8937194d281e2476e6ea8df2"
+SRCREV = "87e080b537aff3fd22ec56ef72660937bed38422"
 
 S = "${WORKDIR}/git"
 INSTALL_NAME = "ipmid"
diff --git a/common/recipes-phosphor/network/network/network.service b/common/recipes-phosphor/network/network/network.service
index 6d0aad7..70df7c5 100644
--- a/common/recipes-phosphor/network/network/network.service
+++ b/common/recipes-phosphor/network/network/network.service
@@ -3,6 +3,7 @@
 
 [Service]
 ExecStart=/usr/sbin/netman.py
+Environment="PYTHONUNBUFFERED=1"
 
 [Install]
 WantedBy=multi-user.target
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-button-power.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-button-power.bb
new file mode 100644
index 0000000..7adda51
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-button-power.bb
@@ -0,0 +1,7 @@
+SUMMARY = "OpenBMC org.openbmc.Button example implementation"
+DESCRIPTION = "A sample implementation for a button controlling a power domain."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "pwrbutton"
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-button-reset.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-button-reset.bb
new file mode 100644
index 0000000..ba83a26
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-button-reset.bb
@@ -0,0 +1,6 @@
+SUMMARY = "OpenBMC org.openbmc.Button example implementation"
+DESCRIPTION = "A sample implementation for a reset button."
+PR = "r1"
+
+inherit skeleton-gdbus
+SKELETON_DIR = "rstbutton"
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-control-chassis.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-control-chassis.bb
new file mode 100644
index 0000000..ca80715
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-control-chassis.bb
@@ -0,0 +1,14 @@
+SUMMARY = "OpenBMC org.openbmc.control.Chassis example implementation"
+DESCRIPTION = "An example implementation of the org.openbmc.control.Chassis DBUS API."
+PR = "r1"
+
+inherit skeleton-python
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-pygobject \
+        python-netclient \
+        pyphosphor \
+        "
+
+SKELETON_DIR = "pychassisctl"
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-hostcheckstop.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-hostcheckstop.bb
new file mode 100644
index 0000000..d054694
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-hostcheckstop.bb
@@ -0,0 +1,8 @@
+SUMMARY = "OpenBMC checkstop monitor."
+DESCRIPTION = "The checkstop monitor watches a GPIO for a checkstop signal \
+and reboots a server."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "hostcheckstop"
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-mgr-inventory.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-mgr-inventory.bb
new file mode 100644
index 0000000..8c1a309
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-mgr-inventory.bb
@@ -0,0 +1,18 @@
+SUMMARY = "OpenBMC inventory manager"
+DESCRIPTION = "OpenBMC inventory manager."
+PR = "r1"
+
+inherit skeleton-python
+
+VIRTUAL-RUNTIME_skeleton_workbook ?= ""
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-json \
+        python-pickle \
+        python-pygobject \
+        pyphosphor \
+        ${VIRTUAL-RUNTIME_skeleton_workbook} \
+        "
+
+SKELETON_DIR = "pyinventorymgr"
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-op-control-power.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-op-control-power.bb
new file mode 100644
index 0000000..e724472
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-op-control-power.bb
@@ -0,0 +1,7 @@
+SUMMARY = "org.openbmc.control.Power implemention for OpenPOWER"
+DESCRIPTION = "A power control implementation suitable for OpenPOWER systems."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "op-pwrctl"
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-pcie-detect.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-pcie-detect.bb
new file mode 100644
index 0000000..e134cf0
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-pcie-detect.bb
@@ -0,0 +1,7 @@
+SUMMARY = "OpenBMC PCIE slot detection utility"
+DESCRIPTION = "OpenBMC PCIE slot detection utility."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "pciedetect"
diff --git a/common/recipes-phosphor/obmc-phosphor-chassis/obmc-watchdog.bb b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-watchdog.bb
new file mode 100644
index 0000000..821b7f0
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-chassis/obmc-watchdog.bb
@@ -0,0 +1,7 @@
+SUMMARY = "OpenBMC org.openbmc.Watchdog example implementation"
+DESCRIPTION = "A sample implementation for the org.openbmc.Watchdog DBUS API."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "hostwatchdog"
diff --git a/common/recipes-phosphor/obmc-phosphor-devtools/obmc-pydevtools.bb b/common/recipes-phosphor/obmc-phosphor-devtools/obmc-pydevtools.bb
new file mode 100644
index 0000000..296a399
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-devtools/obmc-pydevtools.bb
@@ -0,0 +1,17 @@
+SUMMARY = "OpenBMC python devtools"
+DESCRIPTION = "Shortcut scripts for developers."
+PR = "r1"
+
+inherit skeleton-python
+
+VIRTUAL-RUNTIME_skeleton_workbook ?= ""
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-json \
+        python-xml \
+        python-pygobject \
+        ${VIRTUAL-RUNTIME_skeleton_workbook} \
+	"
+
+SKELETON_DIR = "pytools"
diff --git a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.py b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.py
index 2b59b58..1f4ce90 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.py
+++ b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.py
@@ -86,8 +86,7 @@
 	bus = dbus.SystemBus()
 
 	services = []
-	services.append(dbus.service.BusName(SERVICE_PREFIX + '.PythonService0', bus))
-	services.append(dbus.service.BusName(SERVICE_PREFIX + '.PythonService1', bus))
+	services.append(dbus.service.BusName(SERVICE_PREFIX + '.PythonService', bus))
 
 	objs = []
 	objs.append(SampleObjectOne(bus, BASE_OBJ_PATH + 'path0/PythonObj'))
diff --git a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.service b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.service
index fbc50d3..27d9bfe 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.service
+++ b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/obmc-phosphor-example-pydbus.service
@@ -4,6 +4,7 @@
 [Service]
 Restart=always
 ExecStart=/usr/sbin/obmc-phosphor-example-pydbus
+Environment="PYTHONUNBUFFERED=1"
 
 [Install]
 WantedBy=multi-user.target
diff --git a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService0.conf b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService.conf
similarity index 63%
rename from common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService0.conf
rename to common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService.conf
index 45af4f4..6c4a713 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService0.conf
+++ b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService.conf
@@ -2,7 +2,7 @@
  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
 <busconfig>
   <policy user="root">
-    <allow own="org.openbmc.examples.SDBusService0"/>
-    <allow send_destination="org.openbmc.examples.SDBusService0"/>
+    <allow own="org.openbmc.examples.PythonService"/>
+    <allow send_destination="org.openbmc.examples.PythonService"/>
   </policy>
 </busconfig>
diff --git a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService0.conf b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService0.conf
deleted file mode 100644
index fad0b81..0000000
--- a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService0.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
-  <policy user="root">
-    <allow own="org.openbmc.examples.PythonService0"/>
-    <allow send_destination="org.openbmc.examples.PythonService0"/>
-  </policy>
-</busconfig>
diff --git a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService1.conf b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService1.conf
deleted file mode 100644
index 0f7114e..0000000
--- a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/org.openbmc.examples.PythonService1.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
-  <policy user="root">
-    <allow own="org.openbmc.examples.PythonService1"/>
-    <allow send_destination="org.openbmc.examples.PythonService1"/>
-  </policy>
-</busconfig>
diff --git a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/pyclient-sample.py b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/pyclient-sample.py
index e1010a5..138865d 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/pyclient-sample.py
+++ b/common/recipes-phosphor/obmc-phosphor-example-pydbus/files/pyclient-sample.py
@@ -36,9 +36,9 @@
 
 	bus = dbus.SystemBus()
 
-	obj0 = bus.get_object(SERVICE_PREFIX + '.PythonService0',
+	obj0 = bus.get_object(SERVICE_PREFIX + '.PythonService',
 		                      BASE_OBJ_PATH + 'path0/PythonObj')
-	obj1 = bus.get_object(SERVICE_PREFIX + '.PythonService1',
+	obj1 = bus.get_object(SERVICE_PREFIX + '.PythonService',
 		                      BASE_OBJ_PATH + 'path1/PythonObj')
 	echo0= dbus.Interface(obj0,
 		    dbus_interface=IFACE_PREFIX + '.Echo')
diff --git a/common/recipes-phosphor/obmc-phosphor-example-pydbus/obmc-phosphor-example-pydbus.bb b/common/recipes-phosphor/obmc-phosphor-example-pydbus/obmc-phosphor-example-pydbus.bb
index 1446a73..57e27cf 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-pydbus/obmc-phosphor-example-pydbus.bb
+++ b/common/recipes-phosphor/obmc-phosphor-example-pydbus/obmc-phosphor-example-pydbus.bb
@@ -3,8 +3,7 @@
 PR = "r1"
 
 DBUS_SERVICES = " \
-        org.openbmc.examples.PythonService0 \
-        org.openbmc.examples.PythonService1 \
+        org.openbmc.examples.PythonService \
         "
 
 inherit obmc-phosphor-pydbus-service
diff --git a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/obmc-phosphor-example-sdbus.c b/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/obmc-phosphor-example-sdbus.c
index a66bb55..769a208 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/obmc-phosphor-example-sdbus.c
+++ b/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/obmc-phosphor-example-sdbus.c
@@ -79,13 +79,7 @@
 	}
 
 	/* Take a well-known service name so that clients can find us */
-	r = sd_bus_request_name(bus, "org.openbmc.examples.SDBusService0", 0);
-	if (r < 0) {
-		fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
-		goto finish;
-	}
-
-	r = sd_bus_request_name(bus, "org.openbmc.examples.SDBusService1", 0);
+	r = sd_bus_request_name(bus, "org.openbmc.examples.SDBusService", 0);
 	if (r < 0) {
 		fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
 		goto finish;
diff --git a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService0.conf b/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService.conf
similarity index 62%
copy from common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService0.conf
copy to common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService.conf
index 45af4f4..86e2a53 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService0.conf
+++ b/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService.conf
@@ -2,7 +2,7 @@
  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
 <busconfig>
   <policy user="root">
-    <allow own="org.openbmc.examples.SDBusService0"/>
-    <allow send_destination="org.openbmc.examples.SDBusService0"/>
+    <allow own="org.openbmc.examples.SDBusService"/>
+    <allow send_destination="org.openbmc.examples.SDBusService"/>
   </policy>
 </busconfig>
diff --git a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService1.conf b/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService1.conf
deleted file mode 100644
index 5a7bfb8..0000000
--- a/common/recipes-phosphor/obmc-phosphor-example-sdbus/files/org.openbmc.examples.SDBusService1.conf
+++ /dev/null
@@ -1,8 +0,0 @@
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
-  <policy user="root">
-    <allow own="org.openbmc.examples.SDBusService1"/>
-    <allow send_destination="org.openbmc.examples.SDBusService1"/>
-  </policy>
-</busconfig>
diff --git a/common/recipes-phosphor/obmc-phosphor-example-sdbus/obmc-phosphor-example-sdbus.bb b/common/recipes-phosphor/obmc-phosphor-example-sdbus/obmc-phosphor-example-sdbus.bb
index f1a9eb9..9a3018d 100644
--- a/common/recipes-phosphor/obmc-phosphor-example-sdbus/obmc-phosphor-example-sdbus.bb
+++ b/common/recipes-phosphor/obmc-phosphor-example-sdbus/obmc-phosphor-example-sdbus.bb
@@ -3,8 +3,7 @@
 PR = "r1"
 
 DBUS_SERVICES = " \
-        org.openbmc.examples.SDBusService0 \
-        org.openbmc.examples.SDBusService1 \
+        org.openbmc.examples.SDBusService \
         "
 
 S = "${WORKDIR}"
diff --git a/common/recipes-phosphor/obmc-phosphor-fan/obmc-control-fan.bb b/common/recipes-phosphor/obmc-phosphor-fan/obmc-control-fan.bb
new file mode 100644
index 0000000..a4bd005
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-fan/obmc-control-fan.bb
@@ -0,0 +1,12 @@
+SUMMARY = "OpenBMC fan control"
+DESCRIPTION = "OpenBMC fan control."
+PR = "r1"
+
+inherit skeleton-python
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-pygobject \
+        pyphosphor \
+        "
+SKELETON_DIR = "pyfanctl"
diff --git a/common/recipes-phosphor/obmc-phosphor-flash/obmc-flash-bios.bb b/common/recipes-phosphor/obmc-phosphor-flash/obmc-flash-bios.bb
new file mode 100644
index 0000000..8f7b766
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-flash/obmc-flash-bios.bb
@@ -0,0 +1,9 @@
+SUMMARY = "OpenBMC org.openbmc.Flash example implementation"
+DESCRIPTION = "A sample implementation for the org.openbmc.Flash DBUS API. \
+org.openbmc.Flash provides APIs for functions like BIOS flash access control \
+and updating."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "flashbios"
diff --git a/common/recipes-phosphor/obmc-phosphor-flash/obmc-flash-bmc.bb b/common/recipes-phosphor/obmc-phosphor-flash/obmc-flash-bmc.bb
new file mode 100644
index 0000000..3c41220
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-flash/obmc-flash-bmc.bb
@@ -0,0 +1,17 @@
+SUMMARY = "OpenBMC BMC update utility"
+DESCRIPTION = "OpenBMC BMC update utility."
+PR = "r1"
+
+inherit skeleton-python
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-compression \
+        python-shell \
+        python-pygobject \
+        python-subprocess \
+        python-io \
+        pyphosphor \
+        "
+
+SKELETON_DIR = "pyflashbmc"
diff --git a/common/recipes-phosphor/obmc-phosphor-flash/obmc-mgr-download.bb b/common/recipes-phosphor/obmc-phosphor-flash/obmc-mgr-download.bb
new file mode 100644
index 0000000..d3a5ecd
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-flash/obmc-mgr-download.bb
@@ -0,0 +1,17 @@
+SUMMARY = "OpenBMC org.openbmc.managers.Download example implementation"
+DESCRIPTION = "An example implementation for the org.openbmc.managers.Download DBUS API."
+PR = "r1"
+
+inherit skeleton-python
+
+VIRTUAL-RUNTIME_skeleton_workbook ?= ""
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-pygobject \
+        python-subprocess \
+        pyphosphor \
+        ${VIRTUAL-RUNTIME_skeleton_workbook} \
+        "
+
+SKELETON_DIR = "pydownloadmgr"
diff --git a/common/recipes-phosphor/obmc-phosphor-flash/obmc-op-flasher.bb b/common/recipes-phosphor/obmc-phosphor-flash/obmc-op-flasher.bb
new file mode 100644
index 0000000..9908500
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-flash/obmc-op-flasher.bb
@@ -0,0 +1,11 @@
+SUMMARY = "OpenPOWER flashing utility."
+DESCRIPTION = "A BMC/BIOS flashing utility for use on OpenPOWER system."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+# DEPEND,RDEPEND on pflash if the openpower-pflash machine feature is set.
+PACKAGECONFIG ??= "${@bb.utils.contains('MACHINE_FEATURES', 'openpower-pflash', 'openpower-pflash', '', d)}"
+PACKAGECONFIG[openpower-pflash] = ",,pflash,pflash"
+
+SKELETON_DIR = "op-flasher"
diff --git a/common/recipes-phosphor/obmc-phosphor-host/obmc-op-control-host.bb b/common/recipes-phosphor/obmc-phosphor-host/obmc-op-control-host.bb
new file mode 100644
index 0000000..b301101
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-host/obmc-op-control-host.bb
@@ -0,0 +1,7 @@
+SUMMARY = "org.openbmc.control.Host implementation for OpenPOWER"
+DESCRIPTION = "A host control implementation suitable for OpenPOWER systems."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "op-hostctl"
diff --git a/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh b/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh
index c37b3d5..70af93d 100644
--- a/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh
+++ b/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-init.sh
@@ -184,6 +184,7 @@
 fsck=$fsckbase$rwfst
 fsckopts=-a
 optfile=/run/initramfs/init-options
+optbase=/run/initramfs/init-options-base
 urlfile=/run/initramfs/init-download-url
 update=/run/initramfs/update
 
@@ -192,9 +193,16 @@
 	cp /${optfile##*/} $optfile
 fi
 
+if test -e /${optbase##*/}
+then
+	cp /${optbase##*/} $optbase
+else
+	touch $optbase
+fi
+
 if test ! -f $optfile
 then
-	cat /proc/cmdline > $optfile
+	cat /proc/cmdline $optbase > $optfile
 	get_fw_env_var openbmcinit >> $optfile
 	get_fw_env_var openbmconce >> $optfile
 fi
diff --git a/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-shutdown.sh b/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-shutdown.sh
index 8d5d0c9..8d5c672 100644
--- a/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-shutdown.sh
+++ b/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-shutdown.sh
@@ -44,6 +44,14 @@
 	if test -x $update
 	then
 		$update --clean-saved-files
+		remaining=$(ls $image*)
+		if test -n "$remaining"
+		then
+			echo 1>&2 "Flash update failed to flash these images:"
+			echo 1>&2 "$remaining"
+		else
+			echo "Flash update completed."
+		fi
 	else
 		echo 1>&2 "Flash update requested but $update program missing!"
 	fi
diff --git a/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh b/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
index aa8fd89..f0c41a7 100755
--- a/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
+++ b/common/recipes-phosphor/obmc-phosphor-initfs/files/obmc-update.sh
@@ -2,8 +2,9 @@
 
 echo update: "$@"
 
-export PS1=update-sh#\ 
-# exec /bin/sh
+echoerr() {
+	echo 1>&2 "ERROR: $@"
+}
 
 cd /
 if ! test -r /proc/mounts || ! test -f /proc/mounts
@@ -21,12 +22,43 @@
 	mkdir -p /dev
 	mount -t devtmpfs dev dev
 fi
-while grep mtd /proc/mounts
-do
-	echo 1>&2 "Error: A mtd device is mounted."
-	sulogin
-	# exec /bin/sh
-done
+
+# mtd number N with mtd name Name can be mounted via mtdN, or mtd:Name
+# (with a mtd aware fs) or by /dev/mtdblockN (with a mtd or block fs).
+mtdismounted() {
+	m=${1##mtd}
+	if grep -s "mtdblock$m " /proc/mounts || grep -s "mtd$m " /proc/mounts
+	then
+		return 0
+	fi
+	n=$(cat /sys/class/mtd/mtd$m/name)
+	if test -n "$n" && grep -s "mtd:$n " /proc/mounts
+	then
+		return 0
+	fi
+	return 1
+}
+
+# Detect child partitions when the whole flash is to be updated.
+# Ignore mtdNro and mtdblockN names in the class subsystem directory.
+childmtds() {
+	for m in /sys/class/mtd/$1/mtd*
+	do
+		m=${m##*/}
+		if test "${m%ro}" = "${m#mtdblock}"
+		then
+			echo $m
+		fi
+	done
+}
+
+toobig() {
+	if test $(stat -L -c "%s" "$1") -gt $(cat /sys/class/mtd/"$2"/size)
+	then
+		return 0
+	fi
+	return 1
+}
 
 findmtd() {
 	m=$(grep -xl "$1" /sys/class/mtd/*/name)
@@ -60,17 +92,39 @@
 save=/run/save/${upper##*/}
 
 mounted=
+doflash=y
 doclean=
 dosave=y
 dorestore=y
 toram=
+checksize=y
+checkmount=y
 
 whitelist=/run/initramfs/whitelist
 image=/run/initramfs/image-
+imglist=
 
 while test "$1" != "${1#-}"
 do
 	case "$1" in
+	--help)
+		cat <<HERE
+Usage: $0 [options] -- Write images in /run/initramfs to flash (/dev/mtd*)
+    --help                    Show this message
+    --no-flash                Don't attempt to write images to flash
+    --ignore-size             Don't compare image size to mtd device size
+    --ignore-mount            Don't check if destination is mounted
+    --save-files              Copy whitelisted files to save directory in RAM
+    --no-save-files           Don't copy whitelisted files to save directory
+    --copy-files              Copy files from save directory to rwfs mountpoint
+    --restore-files           Restore files from save directory to rwfs layer
+    --no-restore-files        Don't restore saved files from ram to rwfs layer
+    --clean-saved-files       Delete saved whitelisted files from RAM
+    --no-clean-saved-files    Retain saved whitelisted files in RAM
+HERE
+
+	    exit 0 ;;
+
 	--no-clean-saved-files)
 		doclean=
 		shift ;;
@@ -89,11 +143,21 @@
 	--restore-files)
 		dorestore=y
 		shift ;;
+	--no-flash)
+		doflash=
+		shift ;;
+	--ignore-size)
+		checksize=
+		shift ;;
+	--ignore-mount)
+		checkmount=
+		doflash=
+		shift ;;
 	--copy-files)
 		toram=y
 		shift ;;
 	*)
-		echo 2>&1 "Unknown option $1"
+		echoerr "Unknown option $1.  Try $0 --help."
 		exit 1 ;;
 	esac
 done
@@ -109,13 +173,24 @@
 
 	while read f
 	do
-		if ! test -e $upper/$f
+		# Entries shall start with /, no trailing /.. or embedded /../
+		if test "/${f#/}" != "$f" -o "${f%/..}" != "${f#*/../}"
+		then
+			echo 1>&2 "WARNING: Skipping bad whitelist entry $f."
+			continue
+		fi
+		if ! test -e "$upper/$f"
 		then
 			continue
 		fi
 		d="$save/$f"
+		while test "${d%/}" != "${d%/.}"
+		do
+			d="${d%/.}"
+			d="${d%/}"
+		done
 		mkdir -p "${d%/*}"
-		cp -rp $upper/$f "${d%/*}/"
+		cp -rp "$upper/$f" "${d%/*}/"
 	done < $whitelist
 
 	if test -n "$mounted"
@@ -124,30 +199,54 @@
 	fi
 fi
 
-for f in $image*
+imglist=$(echo $image*)
+if test "$imglist" = "$image*" -a ! -e "$imglist"
+then
+	# shell didn't expand the wildcard, so no files exist
+	echo "No images found to update."
+	imglist=
+fi
+
+for f in $imglist
 do
 	m=$(findmtd ${f#$image})
 	if test -z "$m"
 	then
-		echo 1>&2  "Unable to find mtd partiton for ${f##*/}."
-		exec /bin/sh
+		echoerr "Unable to find mtd partiton for ${f##*/}."
+		exit 1
 	fi
-done
-
-for f in $image*
-do
-	if test ! -s $f
+	if test -n "$checksize" && toobig "$f" "$m"
 	then
-		echo "Skipping empty update of ${f#$image}."
-		rm $f
-		continue
+		echoerr "Image ${f##*/} too big for $m."
+		exit 1
 	fi
-	m=$(findmtd ${f#$image})
-	echo "Updating ${f#$image}..."
-	flashcp -v $f /dev/$m && rm $f
+	for s in $m $(childmtds $m)
+	do
+		if test -n "$checkmount" && mtdismounted $s
+		then
+			echoerr "Device $s is mounted, ${f##*/} is busy."
+			exit 1
+		fi
+	done
 done
 
-if test "x$toram" = xy
+if test -n "$doflash"
+then
+	for f in $imglist
+	do
+		if test ! -s $f
+		then
+			echo "Skipping empty update of ${f#$image}."
+			rm $f
+			continue
+		fi
+		m=$(findmtd ${f#$image})
+		echo "Updating ${f#$image}..."
+		flashcp -v $f /dev/$m && rm $f
+	done
+fi
+
+if test -d $save -a "x$toram" = xy
 then
 	mkdir -p $upper
 	cp -rp $save/. $upper/
@@ -173,11 +272,3 @@
 fi
 
 exit
-
-# NOT REACHED without edit
-# NOT REACHED without edit
-
-echo "Flash completed.  Inspect, cleanup and reboot -f to continue."
-
-export PS1=update-sh#\ 
-exec /bin/sh
diff --git a/common/recipes-phosphor/obmc-phosphor-initfs/files/whitelist b/common/recipes-phosphor/obmc-phosphor-initfs/files/whitelist
index 603cec7..c35a552 100644
--- a/common/recipes-phosphor/obmc-phosphor-initfs/files/whitelist
+++ b/common/recipes-phosphor/obmc-phosphor-initfs/files/whitelist
@@ -6,4 +6,4 @@
 /etc/group
 /etc/shadow
 /etc/gshadow
-/var/lib/obmc/events/
+/var/lib/obmc/events
diff --git a/common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-init.bb b/common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-initfs.bb
similarity index 96%
rename from common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-init.bb
rename to common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-initfs.bb
index 3fa88c9..f81e21d 100644
--- a/common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-init.bb
+++ b/common/recipes-phosphor/obmc-phosphor-initfs/obmc-phosphor-initfs.bb
@@ -3,7 +3,6 @@
 PR = "r1"
 
 inherit obmc-phosphor-license
-inherit obmc-phosphor-initfs
 
 S = "${WORKDIR}"
 SRC_URI += "file://obmc-init.sh"
diff --git a/common/recipes-phosphor/obmc-phosphor-led/obmc-control-led.bb b/common/recipes-phosphor/obmc-phosphor-led/obmc-control-led.bb
new file mode 100644
index 0000000..94fa7cb
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-led/obmc-control-led.bb
@@ -0,0 +1,10 @@
+SUMMARY = "OpenBMC org.openbmc.Led example implementation"
+DESCRIPTION = "A sample implementation for the org.openbmc.Led DBUS API. \
+The org.openbmc.Led provides APIs for controlling LEDs."
+PR = "r1"
+
+inherit skeleton-sdbus
+
+RDEPENDS_${PN} += "libsystemd"
+
+SKELETON_DIR = "ledctl"
diff --git a/common/recipes-phosphor/obmc-phosphor-libobmc/obmc-libobmc-intf.bb b/common/recipes-phosphor/obmc-phosphor-libobmc/obmc-libobmc-intf.bb
new file mode 100644
index 0000000..a53deba
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-libobmc/obmc-libobmc-intf.bb
@@ -0,0 +1,16 @@
+SUMMARY = "OpenBMC gdbus library"
+DESCRIPTION = "libopenbmc_intf provides a set of gpio access \
+methods and the GDBUS skeleton code for the org.openbmc DBUS API."
+PR = "r1"
+
+inherit skeleton
+
+DEPENDS += "glib-2.0"
+
+SKELETON_DIR = "libopenbmc_intf"
+
+do_install() {
+        oe_runmake install DESTDIR=${D}
+}
+
+BBCLASSEXTEND = "nativesdk"
diff --git a/common/recipes-phosphor/obmc-phosphor-sensor/obmc-hwmon.bb b/common/recipes-phosphor/obmc-phosphor-sensor/obmc-hwmon.bb
new file mode 100644
index 0000000..78442b8
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-sensor/obmc-hwmon.bb
@@ -0,0 +1,18 @@
+SUMMARY = "OpenBMC hwmon poller"
+DESCRIPTION = "OpenBMC hwmon poller."
+PR = "r1"
+
+inherit skeleton-python
+
+VIRTUAL-RUNTIME_skeleton_workbook ?= ""
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-json \
+        python-shell \
+        python-pygobject \
+        pyphosphor \
+        ${VIRTUAL-RUNTIME_skeleton_workbook} \
+        "
+
+SKELETON_DIR = "pyhwmon"
diff --git a/common/recipes-phosphor/obmc-phosphor-sensor/obmc-mgr-sensor.bb b/common/recipes-phosphor/obmc-phosphor-sensor/obmc-mgr-sensor.bb
new file mode 100644
index 0000000..ca90c43
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-sensor/obmc-mgr-sensor.bb
@@ -0,0 +1,17 @@
+SUMMARY = "OpenBMC sensor manager"
+DESCRIPTION = "OpenBMC sensor manager."
+PR = "r1"
+
+inherit skeleton-python
+
+VIRTUAL-RUNTIME_skeleton_workbook ?= ""
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-json \
+        python-pygobject\
+        pyphosphor \
+        ${VIRTUAL-RUNTIME_skeleton_workbook} \
+        "
+
+SKELETON_DIR = "pysensormgr"
diff --git a/common/recipes-phosphor/obmc-phosphor-sys/obmc-control-bmc.bb b/common/recipes-phosphor/obmc-phosphor-sys/obmc-control-bmc.bb
new file mode 100644
index 0000000..bfc3326
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-sys/obmc-control-bmc.bb
@@ -0,0 +1,8 @@
+SUMMARY = "OpenBMC org.openbmc.control.Bmc example implementation"
+DESCRIPTION = "A sample implementation for the org.openbmc.control.Bmc DBUS API. \
+org.openbmc.control.Bmc provides APIs for functions like resetting the BMC."
+PR = "r1"
+
+inherit skeleton-gdbus
+
+SKELETON_DIR = "bmcctl"
diff --git a/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-state.bb b/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-state.bb
new file mode 100644
index 0000000..125fd65
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-state.bb
@@ -0,0 +1,16 @@
+SUMMARY = "OpenBMC state manager"
+DESCRIPTION = "OpenBMC state manager."
+PR = "r1"
+
+inherit skeleton-python
+
+VIRTUAL-RUNTIME_skeleton_workbook ?= ""
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-json \
+        python-subprocess \
+        python-pygobject \
+        "
+
+SKELETON_DIR = "pystatemgr"
diff --git a/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-system.bb b/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-system.bb
new file mode 100644
index 0000000..accd7da
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-system.bb
@@ -0,0 +1,27 @@
+SUMMARY = "OpenBMC system manager"
+DESCRIPTION = "OpenBMC system manager."
+PR = "r1"
+
+inherit skeleton-python
+inherit obmc-phosphor-systemd
+
+VIRTUAL-RUNTIME_skeleton_workbook ?= ""
+
+RDEPENDS_${PN} += "\
+        python-dbus \
+        python-json \
+        python-subprocess \
+        python-pygobject \
+        pyphosphor \
+        ${VIRTUAL-RUNTIME_skeleton_workbook} \
+        "
+
+SKELETON_DIR = "pysystemmgr"
+
+do_compile_append() {
+	oe_runmake -C ../hacks
+}
+
+do_install_append() {
+	oe_runmake -C ../hacks install DESTDIR=${D}
+}
diff --git a/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-system/obmc-mgr-system.service b/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-system/obmc-mgr-system.service
new file mode 100644
index 0000000..9cb04cf
--- /dev/null
+++ b/common/recipes-phosphor/obmc-phosphor-sys/obmc-mgr-system/obmc-mgr-system.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=OpenBMC system manager
+Requires=obmc-mapper.service
+After=obmc-mapper.service
+
+[Service]
+Restart=always
+ExecStart=/usr/sbin/system_manager.py
+
+[Install]
+WantedBy=multi-user.target
diff --git a/common/recipes-phosphor/obmc-phosphor-user/files/obmc-phosphor-user.service b/common/recipes-phosphor/obmc-phosphor-user/files/obmc-phosphor-user.service
index fecf835..fc436c1 100644
--- a/common/recipes-phosphor/obmc-phosphor-user/files/obmc-phosphor-user.service
+++ b/common/recipes-phosphor/obmc-phosphor-user/files/obmc-phosphor-user.service
@@ -3,6 +3,7 @@
 
 [Service]
 ExecStart=/usr/sbin/obmc-phosphor-userd
+Environment="PYTHONUNBUFFERED=1"
 
 [Install]
 WantedBy=multi-user.target
diff --git a/common/recipes-phosphor/rest-dbus/files/rest-dbus.service b/common/recipes-phosphor/rest-dbus/files/rest-dbus.service
index 5ad582f..d3bddab 100644
--- a/common/recipes-phosphor/rest-dbus/files/rest-dbus.service
+++ b/common/recipes-phosphor/rest-dbus/files/rest-dbus.service
@@ -4,3 +4,4 @@
 [Service]
 Restart=always
 ExecStart=/usr/sbin/rest-dbus
+Environment="PYTHONUNBUFFERED=1"
diff --git a/common/recipes-phosphor/settings/settings/settings.service b/common/recipes-phosphor/settings/settings/settings.service
index deed98f..816ebea 100755
--- a/common/recipes-phosphor/settings/settings/settings.service
+++ b/common/recipes-phosphor/settings/settings/settings.service
@@ -3,6 +3,7 @@
 
 [Service]
 ExecStart=/usr/sbin/settings_manager.py
+Environment="PYTHONUNBUFFERED=1"
 
 [Install]
 WantedBy=multi-user.target
diff --git a/common/recipes-phosphor/skeleton/skeleton.bb b/common/recipes-phosphor/skeleton/skeleton.bb
index 77a2980..f5c5fbf 100644
--- a/common/recipes-phosphor/skeleton/skeleton.bb
+++ b/common/recipes-phosphor/skeleton/skeleton.bb
@@ -3,47 +3,36 @@
 HOMEPAGE = "http://github.com/openbmc/skeleton"
 PR = "r1"
 
+inherit packagegroup
 inherit obmc-phosphor-license
-inherit obmc-phosphor-systemd
+
 inherit obmc-phosphor-chassis-mgmt
 inherit obmc-phosphor-fan-mgmt
 inherit obmc-phosphor-flash-mgmt
 inherit obmc-phosphor-policy-mgmt
 inherit obmc-phosphor-sensor-mgmt
 inherit obmc-phosphor-system-mgmt
-inherit pythonnative
-inherit python-dir
 
-VIRTUAL-RUNTIME_skeleton_workbook ?= ""
-
-DEPENDS += "glib-2.0 systemd python"
-RDEPENDS_${PN} += "python-json python-subprocess python-compression libsystemd ${VIRTUAL-RUNTIME_skeleton_workbook}"
-SRC_URI += "git://github.com/openbmc/skeleton"
-
-FILES_${PN} += "${PYTHON_SITEPACKAGES_DIR}/*"
-
-# RDEPEND on pflash if the openpower-pflash machine feature is set.
-PACKAGECONFIG ??= "${@bb.utils.contains('MACHINE_FEATURES', 'openpower-pflash', 'openpower-pflash', '', d)}"
-PACKAGECONFIG[openpower-pflash] = ",,,pflash"
-
-SRCREV = "fa8f6166a05410472e8a3ef6a2f2e3b9b5f8d8e4"
-
-S = "${WORKDIR}"
-
-# needed to invoke setuptools
-export STAGING_INCDIR
-export STAGING_LIBDIR
-export BUILD_SYS
-export HOST_SYS
-export PYTHON_SITEPACKAGES_DIR
-
-do_compile() {
-        oe_runmake -C git PYTHON=${PYTHON}
-}
-
-do_install() {
-        oe_runmake -C git install \
-                PYTHON=${PYTHON} \
-                DESTDIR=${D} \
-                PREFIX=/usr
-}
+RDEPENDS_${PN} += " \
+        obmc-button-power \
+        obmc-button-reset \
+        obmc-control-chassis \
+        obmc-hostcheckstop \
+        obmc-mgr-inventory \
+        obmc-op-control-power \
+        obmc-pcie-detect \
+        obmc-watchdog \
+        obmc-pydevtools \
+        obmc-control-fan \
+        obmc-flash-bios \
+        obmc-flash-bmc \
+        obmc-mgr-download \
+        obmc-op-flasher \
+        obmc-op-control-host \
+        obmc-control-led \
+        obmc-hwmon \
+        obmc-mgr-sensor \
+        obmc-control-bmc \
+        obmc-mgr-state \
+        obmc-mgr-system \
+        "
diff --git a/common/recipes-phosphor/skeleton/skeleton/skeleton.service b/common/recipes-phosphor/skeleton/skeleton/skeleton.service
deleted file mode 100755
index 35b6e6c..0000000
--- a/common/recipes-phosphor/skeleton/skeleton/skeleton.service
+++ /dev/null
@@ -1,9 +0,0 @@
-[Unit]
-Description=Temp placeholder for skeleton function
-
-[Service]
-Restart=always
-ExecStart=/usr/sbin/system_manager.py
-
-[Install]
-WantedBy=multi-user.target