diff --git a/objects/pcie_slot_present_obj.c b/objects/pcie_slot_present_obj.c
new file mode 100644
index 0000000..8105f6f
--- /dev/null
+++ b/objects/pcie_slot_present_obj.c
@@ -0,0 +1,168 @@
+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+#include "gpio.h"
+#define NUM_SLOTS 8
+GPIO slots[NUM_SLOTS] = {
+	{ "SLOT0_RISER_PRESENT" },
+	{ "SLOT1_RISER_PRESENT" },
+	{ "SLOT2_RISER_PRESENT" },
+	{ "SLOT0_PRESENT" },
+	{ "SLOT1_PRESENT" },
+	{ "SLOT2_PRESENT" },
+	{ "MEZZ0_PRESENT" },
+	{ "MEZZ1_PRESENT" },
+};
+
+typedef struct {
+	const char* bus_name;
+	const char* path;
+} object_info;
+	
+
+
+/* ---------------------------------------------------------------------------------------------------- */
+int get_object(GDBusProxy *proxy, GPIO* gpio, object_info* obj_info)
+{
+	g_print("Here: %s\n",gpio->name);
+ 	GError *error;
+	GVariant *parm;
+	GVariant *result;
+
+	error = NULL;
+	parm = g_variant_new("(ss)","GPIO_PRESENT",gpio->name);
+	result = g_dbus_proxy_call_sync (proxy,
+                                   "getObjectFromId",
+				   parm,
+                                   G_DBUS_CALL_FLAGS_NONE,
+                                   -1,
+                                   NULL,
+                                   &error);
+	g_assert_no_error (error);
+	const gchar* bus_name;
+	const gchar* obj_path;
+	gsize bus_name_size;
+	gsize obj_path_size;
+	GVariantIter *iter = g_variant_iter_new(result);
+	GVariant* dict = g_variant_iter_next_value(iter);
+
+	GVariant* b = g_variant_lookup_value(dict,"bus_name",(const GVariantType *) "s");
+	bus_name = g_variant_get_string(b,&bus_name_size);
+	GVariant* o = g_variant_lookup_value(dict,"obj_path",(const GVariantType *) "s");
+	obj_path = g_variant_get_string(o,&obj_path_size);
+
+	int rc = 0;
+	if (bus_name_size ==  0 || obj_path_size == 0) {
+		g_print("ERROR: gpio %s not found in lookup\n",gpio->name);
+		rc = 1;
+
+	} else {
+		obj_info->bus_name = bus_name;
+		obj_info->path = obj_path;
+	}
+	g_variant_unref(b);
+	g_variant_unref(o);
+	g_variant_unref(dict);
+	g_variant_unref(result);
+
+	return rc;
+}
+
+int get_presence(GDBusConnection* connection, GPIO* gpio, uint8_t* present)
+{
+	int rc = GPIO_OK;
+	do {
+		rc = gpio_init(connection,gpio);
+		if (rc != GPIO_OK) { break; }
+		uint8_t gpio_val;
+		rc = gpio_open(gpio);
+		if (rc != GPIO_OK) { break; }
+		rc = gpio_read(gpio,&gpio_val);
+		if (rc != GPIO_OK) { gpio_close(gpio); break; }
+		gpio_close(gpio);
+		*present = gpio_val;	
+	} while(0);
+	if (rc != GPIO_OK)
+	{
+		g_print("ERROR: gpio error %s\n",gpio->name);
+	}
+	return rc; 
+}
+
+void update_fru_obj(GDBusConnection* connection, object_info* obj_info, uint8_t state)
+{
+	GDBusProxy *proxy;
+ 	GError *error;
+	GVariant *parm;
+	GVariant *result;
+
+	error = NULL;
+	proxy = g_dbus_proxy_new_sync (connection,
+                             G_DBUS_PROXY_FLAGS_NONE,
+                             NULL,                      /* GDBusInterfaceInfo* */
+                             obj_info->bus_name, /* name */
+                             obj_info->path, /* object path */
+                             "org.openbmc.SensorValue",        /* interface name */
+                             NULL,                      /* GCancellable */
+                             &error);
+	g_assert_no_error (error);
+
+	error = NULL;
+	parm = g_variant_new("(y)",state);
+	
+	result = g_dbus_proxy_call_sync (proxy,
+                                   "setValue",
+				   parm,
+                                   G_DBUS_CALL_FLAGS_NONE,
+                                   -1,
+                                   NULL,
+                                   &error);
+
+	g_assert_no_error (error);
+}
+
+gint
+main (gint argc, gchar *argv[])
+{
+	GMainLoop *loop;
+	GDBusConnection *c;
+	GDBusProxy *sys_proxy;
+ 	GError *error;
+	GVariant *parm;
+	GVariant *result;
+
+	loop = g_main_loop_new (NULL, FALSE);
+
+	error = NULL;
+	c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+
+	error = NULL;
+	sys_proxy = g_dbus_proxy_new_sync (c,
+                             G_DBUS_PROXY_FLAGS_NONE,
+                             NULL,                      /* GDBusInterfaceInfo* */
+                             "org.openbmc.managers.System", /* name */
+                             "/org/openbmc/managers/System", /* object path */
+                             "org.openbmc.managers.System",        /* interface name */
+                             NULL,                      /* GCancellable */
+                             &error);
+	g_assert_no_error (error);
+
+	int i = 0;
+	int rc = 0;	
+	for (i=0;i<NUM_SLOTS;i++)
+	{
+		object_info obj_info;
+		uint8_t present;
+		do {
+			rc = get_object(sys_proxy,&slots[i],&obj_info);
+			if (rc) { break; }
+			rc = get_presence(c,&slots[i],&present);
+			if (rc) { break; }
+			// TODO: send correct state
+			update_fru_obj(c,&obj_info,present);
+		} while(0);
+	}
+
+	g_object_unref(c);
+ 	g_main_loop_unref (loop);
+ 	return 0;
+}
