diff --git a/core/init.c b/core/init.c
index e5952535806a..79f70e28e7dd 100644
--- a/core/init.c
+++ b/core/init.c
@@ -44,6 +44,7 @@
 #include <timer.h>
 #include <ipmi.h>
 #include <sensor.h>
+#include <nest.h>
 
 /*
  * Boot semaphore, incremented by each CPU calling in
@@ -555,6 +556,8 @@ static void do_ctors(void)
 
 void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 {
+	int loaded;
+
 	/*
 	 * WARNING: At this point. the timebases have
 	 * *not* been synchronized yet. Do not use any timebase
@@ -714,6 +717,9 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 	if (platform.init)
 		platform.init();
 
+	/* Start Nest pmu catalog lid loading */
+	loaded = preload_catalog_lid();
+
 	/* Setup dummy console nodes if it's enabled */
 	if (dummy_console_enabled())
 		dummy_console_add_nodes();
@@ -721,6 +727,9 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 	/* Init SLW related stuff, including fastsleep */
 	slw_init();
 
+	/* Init Nest PMU unit */
+	nest_pmu_init(loaded);
+
 	op_display(OP_LOG, OP_MOD_INIT, 0x0002);
 
 	/* Read in NVRAM and set it up */
diff --git a/hw/Makefile.inc b/hw/Makefile.inc
index 034947c0f86f..80978867eb33 100644
--- a/hw/Makefile.inc
+++ b/hw/Makefile.inc
@@ -2,7 +2,7 @@
 
 SUBDIRS += hw
 HW_OBJS  = xscom.o chiptod.o gx.o cec.o lpc.o lpc-uart.o psi.o
-HW_OBJS += homer.o slw.o occ.o fsi-master.o centaur.o
+HW_OBJS += homer.o slw.o occ.o fsi-master.o centaur.o nest.o
 HW_OBJS += nx.o nx-rng.o nx-crypto.o nx-842.o
 HW_OBJS += p7ioc.o p7ioc-inits.o p7ioc-phb.o p5ioc2.o p5ioc2-phb.o
 HW_OBJS += phb3.o sfc-ctrl.o fake-rtc.o bt.o p8-i2c.o prd.o
diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c
index c80fff721700..922dd911ad0d 100644
--- a/hw/fsp/fsp.c
+++ b/hw/fsp/fsp.c
@@ -106,6 +106,7 @@ static u64 fsp_hir_timeout;
 #define KERNEL_LID_PHYP			0x80a00701
 #define KERNEL_LID_OPAL			0x80f00101
 #define INITRAMFS_LID_OPAL		0x80f00102
+#define NEST_CATALOG_LID		0x81e00610
 
 /*
  * We keep track on last logged values for some things to print only on
@@ -2224,6 +2225,7 @@ static struct {
 	{ RESOURCE_ID_CAPP,	CAPP_IDX_MURANO_DD21,	0x80a02001 },
 	{ RESOURCE_ID_CAPP,	CAPP_IDX_VENICE_DD10,	0x80a02003 },
 	{ RESOURCE_ID_CAPP,	CAPP_IDX_VENICE_DD20,	0x80a02004 },
+	{ RESOURCE_ID_CATALOG,	RESOURCE_SUBID_NONE,	NEST_CATALOG_LID},
 };
 
 static void fsp_start_fetching_next_lid(void);
diff --git a/hw/nest.c b/hw/nest.c
new file mode 100644
index 000000000000..3c08eb58ad57
--- /dev/null
+++ b/hw/nest.c
@@ -0,0 +1,124 @@
+/* Copyright 2015 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * Locking notes:
+ */
+
+#include <skiboot.h>
+#include <device.h>
+#include <nest.h>
+#include <chip.h>
+#include <cpu.h>
+#include <xscom.h>
+#include <timebase.h>
+#include <opal-api.h>
+#include <opal-internal.h>
+#include <io.h>
+#include <platform.h>
+
+/*
+ * Pointer holding the Catalog file in memory
+ */
+struct nest_catalog_desc *catalog_desc;
+
+/*
+ * Catalog Page-0 (each page is 4K bytes long) contains
+ * information about event, group, formula structure offsets
+ * in the catalog. Cache these offsets in struct nest_catalog_page_0
+ * to help the search later.
+ */
+struct nest_catalog_page_0 *page0_desc;
+
+int preload_catalog_lid()
+{
+	size_t size = NEST_CATALOG_SIZE;
+	int loaded;
+
+        catalog_desc = malloc(sizeof(struct nest_catalog_desc));
+	if (!catalog_desc) {
+		prerror("nest-counters: No mem for nest_catalog_desc structure\n");
+		return OPAL_NO_MEM;
+	}
+
+	catalog_desc->catalog = malloc(NEST_CATALOG_SIZE);
+	if (!catalog_desc->catalog) {
+		prerror("nest-counters: No mem for catalog lid \n");
+		free(catalog_desc);
+		return OPAL_NO_MEM;
+	}
+
+	loaded = start_preload_resource(RESOURCE_ID_CATALOG,
+						RESOURCE_SUBID_NONE,
+						catalog_desc->catalog, &size);
+
+	return loaded;
+}
+
+int load_catalog_lid(int loaded)
+{
+	if (loaded == OPAL_SUCCESS)
+		loaded = wait_for_resource_loaded(RESOURCE_ID_CATALOG,
+							RESOURCE_SUBID_NONE);
+
+	if (loaded != OPAL_SUCCESS) {
+		prerror("nest-counters: Error loading catalog lid\n");
+		return OPAL_RESOURCE;
+	}
+
+	/*
+	 * Now that we have loaded the catalog, check for the
+	 * catalog magic.
+	 */
+	page0_desc = (struct nest_catalog_page_0 *)CATALOG(catalog_desc);
+	if (page0_desc->magic != CATALOG_MAGIC) {
+		prerror("nest-counters: Error catalog magic number mismatch\n");
+		return OPAL_RESOURCE;
+	}
+
+	/*
+	 * Check for Chip event support in this catalog.
+	 */
+	if (page0_desc->chip_group_offset == 0) {
+		prerror("nest-counters: Not Supported \n");
+		return OPAL_UNSUPPORTED;
+	}
+
+	/*
+	 * Lets save some entry points to help out search
+	 */
+	GROUP_ENTRY(catalog_desc) = CATALOG(catalog_desc) +
+					(page0_desc->group_data_offs * 4096);
+	EVENT_ENTRY(catalog_desc) = CATALOG(catalog_desc) +
+					(page0_desc->event_data_offs * 4096);
+	CHIP_EVENT_ENTRY(catalog_desc) = EVENT_ENTRY(catalog_desc) +
+					(page0_desc->chip_event_offset);
+	CHIP_GROUP_ENTRY(catalog_desc) = GROUP_ENTRY(catalog_desc) +
+					(page0_desc->chip_group_offset);
+	CORE_EVENT_ENTRY(catalog_desc) = EVENT_ENTRY(catalog_desc) +
+					(page0_desc->core_event_offset);
+	CORE_GROUP_ENTRY(catalog_desc) = GROUP_ENTRY(catalog_desc) +
+					(page0_desc->core_group_offset);
+
+	return OPAL_SUCCESS;
+}
+
+void nest_pmu_init(int loaded)
+{
+
+	if (load_catalog_lid(loaded) != OPAL_SUCCESS) {
+		prerror("nest-counters: Catalog failed to load\n");
+		return;
+	}
+
+}
diff --git a/include/platform.h b/include/platform.h
index 80aa8babbe43..355ab3f1c03d 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -26,6 +26,7 @@ enum resource_id {
 	RESOURCE_ID_KERNEL,
 	RESOURCE_ID_INITRAMFS,
 	RESOURCE_ID_CAPP,
+	RESOURCE_ID_CATALOG,
 };
 #define RESOURCE_SUBID_NONE 0
 #define RESOURCE_SUBID_SUPPORTED 1
