[Likwid-commit] [likwid] 01/03: New upstream version 4.3.1+dfsg1

Christoph Martin chrism at debian.org
Fri Feb 2 09:20:58 UTC 2018


This is an automated email from the git hooks/post-receive script.

chrism pushed a commit to branch master
in repository likwid.

commit 1170c18b843869aba7f94ccce80133cc604a81eb
Author: Christoph Martin <martin at uni-mainz.de>
Date:   Mon Jan 22 14:30:50 2018 +0100

    New upstream version 4.3.1+dfsg1
---
 .gitattributes                                     |    1 +
 CHANGELOG                                          |   24 +
 INSTALL                                            |    2 +
 Makefile                                           |   83 +-
 README.md                                          |   55 +-
 bench/includes/allocator.h                         |    6 +-
 bench/includes/allocator_types.h                   |    6 +-
 bench/includes/barrier.h                           |    6 +-
 bench/includes/barrier_types.h                     |    6 +-
 bench/includes/strUtil.h                           |    6 +-
 bench/includes/test_types.h                        |    6 +-
 bench/includes/threads.h                           |    6 +-
 bench/includes/threads_types.h                     |    6 +-
 bench/likwid-bench.c                               |   13 +-
 bench/src/allocator.c                              |    6 +-
 bench/src/barrier.c                                |    6 +-
 bench/src/bench.c                                  |    6 +-
 bench/src/strUtil.c                                |   24 +-
 bench/src/threads.c                                |    6 +-
 bench/x86-64/sum_avx512.ptt                        |    2 +-
 config.mk                                          |  128 +-
 doc/likwid-pin.1                                   |    3 +-
 doc/lua-doxygen.md                                 |   49 -
 examples/C-likwidAPI.c                             |    6 +-
 examples/C-markerAPI.c                             |    6 +-
 examples/F-markerAPI.F90                           |    6 +-
 examples/Lua-likwidAPI.lua                         |    6 +-
 examples/Makefile                                  |    1 -
 ext/hwloc/hwloc/topology-linux.c                   |   58 +-
 ext/hwloc/include/private/autogen/config.h         |    8 +-
 groups/haswell/UOPS_EXEC.txt                       |    2 +-
 groups/haswell/UOPS_ISSUE.txt                      |    2 +-
 groups/haswell/UOPS_RETIRE.txt                     |    2 +-
 groups/haswellEP/CBOX.txt                          |    2 +-
 groups/haswellEP/UOPS_EXEC.txt                     |    2 +-
 groups/haswellEP/UOPS_ISSUE.txt                    |    2 +-
 groups/haswellEP/UOPS_RETIRE.txt                   |    2 +-
 groups/ivybridge/UOPS_EXEC.txt                     |    2 +-
 groups/ivybridge/UOPS_ISSUE.txt                    |    2 +-
 groups/ivybridge/UOPS_RETIRE.txt                   |    2 +-
 groups/ivybridgeEP/CACHES.txt                      |    8 +-
 groups/ivybridgeEP/CBOX.txt                        |    4 +-
 groups/ivybridgeEP/UOPS_EXEC.txt                   |    2 +-
 groups/ivybridgeEP/UOPS_ISSUE.txt                  |    2 +-
 groups/ivybridgeEP/UOPS_RETIRE.txt                 |    2 +-
 groups/knl/HBM_CACHE.txt                           |   87 +
 groups/knl/HBM_OFFCORE.txt                         |   25 +-
 groups/knl/L2.txt                                  |   36 +
 groups/knl/MEM.txt                                 |   16 +-
 groups/sandybridge/L3CACHE.txt                     |    6 +-
 groups/sandybridge/UOPS_EXEC.txt                   |    2 +-
 groups/sandybridge/UOPS_ISSUE.txt                  |    2 +-
 groups/sandybridge/UOPS_RETIRE.txt                 |    2 +-
 groups/sandybridgeEP/CACHES.txt                    |    8 +-
 groups/sandybridgeEP/L3CACHE.txt                   |    6 +-
 groups/sandybridgeEP/UOPS_EXEC.txt                 |    2 +-
 groups/sandybridgeEP/UOPS_ISSUE.txt                |    2 +-
 groups/sandybridgeEP/UOPS_RETIRE.txt               |    2 +-
 groups/skylake/UOPS_EXEC.txt                       |    2 +-
 groups/skylake/UOPS_ISSUE.txt                      |    2 +-
 groups/skylake/UOPS_RETIRE.txt                     |    2 +-
 groups/skylakeX/BRANCH.txt                         |   31 +
 groups/{ivybridgeEP => skylakeX}/CACHES.txt        |   97 +-
 groups/skylakeX/CLOCK.txt                          |   26 +
 groups/skylakeX/DATA.txt                           |   22 +
 groups/skylakeX/ENERGY.txt                         |   35 +
 groups/skylakeX/FLOPS_AVX.txt                      |   26 +
 groups/skylakeX/FLOPS_DP.txt                       |   33 +
 groups/skylakeX/FLOPS_SP.txt                       |   33 +
 groups/skylakeX/L2.txt                             |   38 +
 groups/skylakeX/L2CACHE.txt                        |   34 +
 groups/skylakeX/L3.txt                             |   36 +
 groups/skylakeX/L3CACHE.txt                        |   35 +
 groups/skylakeX/MEM.txt                            |   48 +
 groups/skylakeX/MEM_DP.txt                         |   74 +
 groups/skylakeX/MEM_SP.txt                         |   70 +
 groups/skylakeX/TLB_DATA.txt                       |   35 +
 groups/skylakeX/TLB_INSTR.txt                      |   28 +
 groups/{ivybridge => skylakeX}/UOPS_EXEC.txt       |    2 +-
 groups/{haswell => skylakeX}/UOPS_ISSUE.txt        |    2 +-
 groups/{haswellEP => skylakeX}/UOPS_RETIRE.txt     |    2 +-
 groups/zen/BRANCH.txt                              |   32 +
 groups/zen/CACHE.txt                               |   38 +
 groups/zen/CPI.txt                                 |   35 +
 groups/zen/DATA.txt                                |   22 +
 groups/zen/ENERGY.txt                              |   31 +
 groups/zen/FLOPS_DP.txt                            |   32 +
 groups/zen/FLOPS_SP.txt                            |   33 +
 groups/zen/FPU_EXCEPTION.txt                       |   27 +
 groups/zen/ICACHE.txt                              |   29 +
 groups/zen/TLB.txt                                 |   40 +
 make/config_checks.mk                              |   26 +-
 make/config_defines.mk                             |   88 +-
 make/config_git.mk                                 |    3 +
 make/likwid-config.cmake                           |    4 +
 monitoring/likwid-agent.conf                       |    3 +
 perl/set_license.pl                                |    8 +-
 src/access-daemon/Makefile                         |   10 +-
 src/access-daemon/accessDaemon.c                   |  518 ++-
 src/access-daemon/setFreq.c                        |  302 +-
 src/{includes/cpuid.h => access-daemon/setFreq.h}  |   24 +-
 src/access-daemon/setFreq_cpufreq.c                |  551 ++++
 src/access-daemon/setFreq_pstate.c                 |  498 +++
 src/access.c                                       |   19 +-
 src/access_client.c                                |   56 +-
 src/access_x86.c                                   |   20 +-
 src/access_x86_msr.c                               |   40 +-
 src/access_x86_pci.c                               |   11 +-
 src/affinity.c                                     |  201 +-
 src/applications/likwid-agent.lua                  |  558 ----
 src/applications/likwid-features.lua               |   27 +-
 src/applications/likwid-genTopoCfg.lua             |    8 +-
 src/applications/likwid-memsweeper.lua             |    8 +-
 src/applications/likwid-mpirun.lua                 |  544 ++--
 src/applications/likwid-perfctr.lua                |  251 +-
 src/applications/likwid-perfscope.lua              |   44 +-
 src/applications/likwid-pin.lua                    |   97 +-
 src/applications/likwid-powermeter.lua             |   27 +-
 src/applications/likwid-setFrequencies.lua         |  352 +-
 src/applications/likwid-topology.lua               |    9 +-
 src/applications/likwid.lua                        |   77 +-
 src/bitUtil.c                                      |    6 +-
 src/calculator.c                                   | 1093 -------
 src/calculator_stack.c                             |   81 -
 src/configuration.c                                |   15 +-
 src/cpuFeatures.c                                  |   83 +-
 src/cpustring.c                                    |  464 ++-
 src/frequency.c                                    |  914 +++++-
 src/frequency_acpi.c                               |  104 +
 src/frequency_pstate.c                             |  274 ++
 src/hashTable.c                                    |   21 +-
 src/includes/access.h                              |    6 +-
 src/includes/access_client.h                       |    6 +-
 src/includes/access_client_types.h                 |    6 +-
 src/includes/access_x86.h                          |    6 +-
 src/includes/access_x86_msr.h                      |    6 +-
 src/includes/access_x86_pci.h                      |    6 +-
 src/includes/affinity.h                            |   16 +-
 src/includes/bitUtil.h                             |    6 +-
 src/includes/calculator.h                          |   36 -
 src/includes/calculator_stack.h                    |   52 -
 src/includes/configuration.h                       |    8 +-
 src/includes/cpuFeatures.h                         |    6 +-
 src/includes/cpuFeatures_types.h                   |    6 +-
 src/includes/cpuid.h                               |    6 +-
 src/includes/error.h                               |    6 +-
 src/includes/frequency.h                           |    8 +-
 src/includes/{pci_hwloc.h => frequency_acpi.h}     |   20 +-
 src/includes/{pci_hwloc.h => frequency_pstate.h}   |   20 +-
 src/includes/hashTable.h                           |    7 +-
 src/includes/libperfctr_types.h                    |   13 +-
 src/includes/likwid.h                              |   77 +-
 src/includes/lock.h                                |    6 +-
 src/includes/memsweep.h                            |    6 +-
 src/includes/numa.h                                |    6 +-
 src/includes/numa_hwloc.h                          |    6 +-
 src/includes/numa_proc.h                           |    6 +-
 src/includes/pci_hwloc.h                           |    7 +-
 src/includes/pci_proc.h                            |    6 +-
 src/includes/pci_types.h                           |    6 +-
 src/includes/perfgroup.h                           |   35 +-
 src/includes/perfmon.h                             |    8 +-
 src/includes/perfmon_atom.h                        |    6 +-
 src/includes/perfmon_atom_events.txt               |    6 +-
 src/includes/perfmon_broadwell.h                   |   58 +-
 src/includes/perfmon_broadwellEP_counters.h        |   59 +-
 src/includes/perfmon_broadwellEP_events.txt        |   34 +-
 src/includes/perfmon_broadwell_counters.h          |    6 +-
 src/includes/perfmon_broadwell_events.txt          |   14 +-
 src/includes/perfmon_broadwelld_counters.h         |    6 +-
 src/includes/perfmon_broadwelld_events.txt         |   14 +-
 src/includes/perfmon_core2.h                       |    6 +-
 src/includes/perfmon_core2_counters.h              |    6 +-
 src/includes/perfmon_core2_events.txt              |    6 +-
 src/includes/perfmon_goldmont.h                    |   22 +-
 src/includes/perfmon_goldmont_counters.h           |    6 +-
 src/includes/perfmon_goldmont_events.txt           |   14 +-
 src/includes/perfmon_haswell.h                     |   52 +-
 src/includes/perfmon_haswellEP_counters.h          |   71 +-
 src/includes/perfmon_haswellEP_events.txt          |   14 +-
 src/includes/perfmon_haswell_counters.h            |    6 +-
 src/includes/perfmon_haswell_events.txt            |   14 +-
 src/includes/perfmon_interlagos.h                  |   20 +-
 src/includes/perfmon_interlagos_counters.h         |    6 +-
 src/includes/perfmon_interlagos_events.txt         |    6 +-
 src/includes/perfmon_ivybridge.h                   |   81 +-
 src/includes/perfmon_ivybridgeEP_counters.h        |   49 +-
 src/includes/perfmon_ivybridgeEP_events.txt        |   16 +-
 src/includes/perfmon_ivybridge_counters.h          |    6 +-
 src/includes/perfmon_ivybridge_events.txt          |   14 +-
 src/includes/perfmon_k10.h                         |    6 +-
 src/includes/perfmon_k10_counters.h                |    6 +-
 src/includes/perfmon_k10_events.txt                |    6 +-
 src/includes/perfmon_k8.h                          |    6 +-
 src/includes/perfmon_k8_events.txt                 |    6 +-
 src/includes/perfmon_kabini.h                      |   30 +-
 src/includes/perfmon_kabini_counters.h             |    6 +-
 src/includes/perfmon_kabini_events.txt             |    7 +-
 src/includes/perfmon_knl.h                         |   34 +-
 src/includes/perfmon_knl_counters.h                |  130 +-
 src/includes/perfmon_knl_events.txt                |   17 +-
 src/includes/perfmon_nehalem.h                     |   24 +-
 src/includes/perfmon_nehalemEX.h                   |   36 +-
 src/includes/perfmon_nehalemEX_counters.h          |    6 +-
 src/includes/perfmon_nehalemEX_events.txt          |    6 +-
 src/includes/perfmon_nehalemEX_westmereEX_common.h |    6 +-
 src/includes/perfmon_nehalem_counters.h            |    6 +-
 src/includes/perfmon_nehalem_events.txt            |    6 +-
 src/includes/perfmon_p6_events.txt                 |    6 +-
 src/includes/perfmon_perf.h                        |   60 -
 src/includes/perfmon_perfevent.h                   |  215 +-
 src/includes/perfmon_phi.h                         |    6 +-
 src/includes/perfmon_phi_counters.h                |    6 +-
 src/includes/perfmon_phi_events.txt                |    6 +-
 src/includes/perfmon_pm.h                          |    6 +-
 src/includes/perfmon_pm_counters.h                 |    6 +-
 src/includes/perfmon_pm_events.txt                 |    6 +-
 src/includes/perfmon_sandybridge.h                 |   58 +-
 src/includes/perfmon_sandybridgeEP_counters.h      |   36 +-
 src/includes/perfmon_sandybridgeEP_events.txt      |   14 +-
 src/includes/perfmon_sandybridge_counters.h        |    6 +-
 src/includes/perfmon_sandybridge_events.txt        |   14 +-
 src/includes/perfmon_silvermont.h                  |   22 +-
 src/includes/perfmon_silvermont_counters.h         |    6 +-
 src/includes/perfmon_silvermont_events.txt         |   16 +-
 src/includes/perfmon_skylake.h                     | 1037 +++++-
 src/includes/perfmon_skylakeX_counters.h           |  561 ++++
 src/includes/perfmon_skylakeX_events.txt           | 3392 ++++++++++++++++++++
 src/includes/perfmon_skylake_counters.h            |    6 +-
 src/includes/perfmon_skylake_events.txt            |   32 +-
 src/includes/perfmon_types.h                       |   10 +-
 src/includes/perfmon_westmere.h                    |    6 +-
 src/includes/perfmon_westmereEX.h                  |   40 +-
 src/includes/perfmon_westmereEX_counters.h         |    6 +-
 src/includes/perfmon_westmereEX_events.txt         |    6 +-
 src/includes/perfmon_westmere_events.txt           |    6 +-
 src/includes/perfmon_zen.h                         |  509 +++
 src/includes/perfmon_zen_counters.h                |  107 +
 src/includes/perfmon_zen_events.txt                |  332 ++
 src/includes/power.h                               |   46 +-
 src/includes/power_types.h                         |    6 +-
 src/includes/registers.h                           |  404 ++-
 src/includes/registers_types.h                     |   26 +-
 src/includes/textcolor.h                           |    6 +-
 src/includes/thermal.h                             |    6 +-
 src/includes/thermal_types.h                       |    6 +-
 src/includes/timer.h                               |    6 +-
 src/includes/timer_types.h                         |    6 +-
 src/includes/tlb-info.h                            |    6 +-
 src/includes/topology.h                            |   18 +-
 src/includes/topology_cpuid.h                      |    6 +-
 src/includes/topology_hwloc.h                      |    6 +-
 src/includes/topology_proc.h                       |    6 +-
 src/includes/topology_types.h                      |    7 +-
 src/includes/tree.h                                |    6 +-
 src/includes/tree_types.h                          |    6 +-
 src/includes/types.h                               |    6 +-
 src/libperfctr.c                                   |  154 +-
 src/likwid.f90                                     |    6 +-
 src/likwid_f90_interface.c                         |    6 +-
 src/luawid.c                                       |  203 +-
 src/memsweep.c                                     |    6 +-
 src/numa.c                                         |    6 +-
 src/numa_hwloc.c                                   |   16 +-
 src/numa_proc.c                                    |   12 +-
 src/pci_hwloc.c                                    |   89 +-
 src/pci_proc.c                                     |    6 +-
 src/perfgroup.c                                    |  438 ++-
 src/perfmon.c                                      |  512 ++-
 src/perfmon_perf.c                                 |  286 --
 src/power.c                                        |  279 +-
 src/pthread-overload/Makefile                      |    6 +-
 src/pthread-overload/pthread-overload.c            |  140 +-
 src/thermal.c                                      |    6 +-
 src/timer.c                                        |    9 +-
 src/topology.c                                     |   75 +-
 src/topology_cpuid.c                               |    6 +-
 src/topology_hwloc.c                               |   71 +-
 src/topology_proc.c                                |   13 +-
 src/tree.c                                         |    6 +-
 test/Makefile                                      |   12 +-
 test/check_Event_Counters.py                       |  156 +
 test/executable_tests/Makefile                     |   22 +-
 test/executable_tests/likwid-perfctr.txt           |   10 +-
 test/executable_tests/likwid-pin.txt               |    8 +-
 test/executable_tests/likwid-setFrequencies.txt    |    2 +-
 test/executable_tests/tester.sh                    |   14 +-
 test/jacobi-2D-5pt.c                               |  116 +
 test/serial.c                                      |    8 +-
 test/test-likwidAPI.c                              |   71 +-
 test/testmarker-cnt.c                              |    8 +-
 test/testmarker-nested.c                           |   58 +-
 test/testmarker-omp.c                              |    9 +-
 293 files changed, 15413 insertions(+), 5179 deletions(-)

diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..6c01b84
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+make/config_git.mk ident
diff --git a/CHANGELOG b/CHANGELOG
index 3907744..79bc5d3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,27 @@
+# Changelog 4.3.1
+- Fix for setting/getting turbo mode in frequency module
+- Exchanged two events in perf. groups of Intel Skylake X
+
+# Changelog 4.3.0
+- Support for Intel Skylake SP architecture (core, uncore, energy)
+- Support for AMD Zen architecture (core, l2, energy)
+- Pinning strategy 'balanced'
+
+# Changelog 4.2.1
+- Fix for logical selection strings
+- likwid-agent: general update
+- likwid-mpirun: Improved SLURM support
+- likwid-mpirun: Print metrics sorted as they are listen in perf. group
+- likwid-perfctr: Print metrics/events as header in timeline mode
+- likwid-setFrequency: Commandline options to set min, max and current frequency
+- Pinning-Library: Automatically detect and skip shepard threads
+- Intel Broadwell: Added support for E3 (like Desktop), Fix for L3 group
+- Intel IvyBridge: Fix for PCU fixed-purpose counters
+- Intel Skylake: Fix for events CYCLE_ACTIVITY, new event L2_LINES_OUT
+- Intel Xeon Phi (KNL): Fix for overflow register, Update for ENERGY group
+- Intel SandyBridge: Fix for L3CACHE group
+- Event/Counter list contains only usable counters and events
+
 # Changelog 4.2.0
 - Support for Intel Xeon Phi (Knights Landing): Core, Uncore, RAPL
 - Support for Uncore counters of some desktop chips (SandyBridge, IvyBridge,
diff --git a/INSTALL b/INSTALL
index 80c874e..4eee6ae 100644
--- a/INSTALL
+++ b/INSTALL
@@ -25,6 +25,8 @@ If you debug your likwid-bench benchmarks you can look at all
 intermediate build files and also the final assembly code.
 
 == Build on Xeon Phi (Knights Corner) ==
+This section is _only_ for Knights Corner, for Knights Landing use default
+installation method!
 For builds for the Xeon Phi (Knights Corner) coprocessor, the accessDaemon and
 the frequency daemon are disabled. Moreover, the access mode is set to 'direct'.
 This was made because it is important to run as few processes as possible on the
diff --git a/Makefile b/Makefile
index aa08122..223a317 100644
--- a/Makefile
+++ b/Makefile
@@ -4,13 +4,13 @@
 #
 #      Description:  Central Makefile
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:  Jan Treibig (jt), jan.treibig at gmail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -43,6 +43,7 @@ Q         ?= @
 
 include ./config.mk
 include $(MAKE_DIR)/include_$(COMPILER).mk
+include $(MAKE_DIR)/config_git.mk
 include $(MAKE_DIR)/config_checks.mk
 include $(MAKE_DIR)/config_defines.mk
 
@@ -81,7 +82,6 @@ L_APPS      =   likwid-perfctr \
 				likwid-powermeter \
 				likwid-topology \
 				likwid-memsweeper \
-				likwid-agent \
 				likwid-mpirun \
 				likwid-features \
 				likwid-perfscope \
@@ -104,8 +104,8 @@ docs:
 	@echo "===>  GENERATE DOXYGEN DOCS"
 	@cp doc/lua-doxygen.md doc/lua-doxygen.md.safe
 	@cp doc/likwid-doxygen.md doc/likwid-doxygen.md.safe
-	@sed -i -e s+'<PREFIX>'+$(PREFIX)+g -e s+'<VERSION>'+$(VERSION)+g -e s+'<DATE>'+'$(DATE)'+g -e s+'<RELEASE>'+$(RELEASE)+g doc/lua-doxygen.md
-	@sed -i -e s+'<PREFIX>'+$(PREFIX)+g -e s+'<VERSION>'+$(VERSION)+g -e s+'<DATE>'+'$(DATE)'+g -e s+'<RELEASE>'+$(RELEASE)+g doc/likwid-doxygen.md
+	@sed -i -e s+'<PREFIX>'+$(PREFIX)+g -e s+'<VERSION>'+$(VERSION)+g -e s+'<DATE>'+'$(DATE)'+g -e s+'<RELEASE>'+$(RELEASE)+g -e s+'<MINOR>'+$(MINOR)+g -e s+'<GITCOMMIT>'+$(GITCOMMIT)+g doc/lua-doxygen.md
+	@sed -i -e s+'<PREFIX>'+$(PREFIX)+g -e s+'<VERSION>'+$(VERSION)+g -e s+'<DATE>'+'$(DATE)'+g -e s+'<RELEASE>'+$(RELEASE)+g -e s+'<MINOR>'+$(MINOR)+g -e s+'<GITCOMMIT>'+$(GITCOMMIT)+g doc/likwid-doxygen.md
 	$(Q)doxygen doc/Doxyfile
 	@mv doc/lua-doxygen.md.safe doc/lua-doxygen.md
 	@mv doc/likwid-doxygen.md.safe doc/likwid-doxygen.md
@@ -115,8 +115,11 @@ $(L_APPS):  $(addprefix $(SRC_DIR)/applications/,$(addsuffix  .lua,$(L_APPS)))
 	@if [ "$(ACCESSMODE)" = "direct" ]; then sed -i -e s/"access_mode = 1"/"access_mode = 0"/g $(SRC_DIR)/applications/$@.lua;fi
 	@sed -e s/'<INSTALLED_BINPREFIX>'/$(subst /,\\/,$(INSTALLED_BINPREFIX))/g \
 		-e s/'<INSTALLED_PREFIX>'/$(subst /,\\/,$(INSTALLED_PREFIX))/g \
-		-e s/'<VERSION>'/$(VERSION).$(RELEASE)/g \
+		-e s/'<VERSION>'/$(VERSION).$(RELEASE).$(MINOR)/g \
 		-e s/'<DATE>'/$(DATE)/g \
+		-e s/'<RELEASE>'/$(RELEASE)/g \
+		-e s/'<MINOR>'/$(MINOR)/g \
+		-e s/'<GITCOMMIT>'/$(GITCOMMIT)/g \
 		$(addprefix $(SRC_DIR)/applications/,$(addsuffix  .lua,$@)) > $@
 	@if [ "$(LUA_INTERNAL)" = "false" ]; then \
 		sed -i -e s+"$(subst /,\\/,$(INSTALLED_BINPREFIX))/likwid-lua"+"$(LUA_BIN)/$(LUA_LIB_NAME)"+ $@; \
@@ -132,6 +135,8 @@ $(L_HELPER):
 		-e s/'<LIBLIKWIDPIN>'/$(subst /,\\/,$(LIBLIKWIDPIN))/g \
 		-e s/'<VERSION>'/$(VERSION)/g \
 		-e s/'<RELEASE>'/$(RELEASE)/g \
+		-e s/'<MINOR>'/$(MINOR)/g \
+		-e s/'<GITCOMMIT>'/$(GITCOMMIT)/g \
 		$(SRC_DIR)/applications/$@ > $@
 
 $(STATIC_TARGET_LIB): $(BUILD_DIR) $(PERFMONHEADERS) $(OBJ) $(TARGET_HWLOC_LIB) $(TARGET_LUA_LIB)
@@ -141,6 +146,8 @@ $(STATIC_TARGET_LIB): $(BUILD_DIR) $(PERFMONHEADERS) $(OBJ) $(TARGET_HWLOC_LIB)
 $(DYNAMIC_TARGET_LIB): $(BUILD_DIR) $(PERFMONHEADERS) $(OBJ) $(TARGET_HWLOC_LIB) $(TARGET_LUA_LIB)
 	@echo "===>  CREATE SHARED LIB  $(TARGET_LIB)"
 	$(Q)${CC} $(DEBUG_FLAGS) $(SHARED_LFLAGS) -Wl,-soname,$(TARGET_LIB).$(VERSION).$(RELEASE) $(SHARED_CFLAGS) -o $(DYNAMIC_TARGET_LIB) $(OBJ) $(LIBS) $(TARGET_HWLOC_LIB) $(TARGET_LUA_LIB) $(RPATHS)
+	@ln -sf $(TARGET_LIB) $(TARGET_LIB).$(VERSION).$(RELEASE)
+	@sed -e s+'@PREFIX@'+$(PREFIX)+g make/likwid-config.cmake > likwid-config.cmake
 
 $(DAEMON_TARGET): $(SRC_DIR)/access-daemon/accessDaemon.c
 	@echo "===>  BUILD access daemon likwid-accessD"
@@ -156,6 +163,7 @@ $(BUILD_DIR):
 $(PINLIB):
 	@echo "===>  CREATE LIB  $(PINLIB)"
 	$(Q)$(MAKE) -C src/pthread-overload/ $(PINLIB)
+	@ln -sf $(PINLIB) $(PINLIB).$(VERSION).$(RELEASE)
 
 $(GENGROUPLOCK): $(foreach directory,$(shell ls $(GROUP_DIR)), $(wildcard $(GROUP_DIR)/$(directory)/*.txt))
 	@echo "===>  GENERATE GROUP HEADERS"
@@ -171,6 +179,7 @@ ifeq ($(LUA_INTERNAL),true)
 $(TARGET_LUA_LIB):
 	@echo "===>  ENTER  $(LUA_FOLDER)"
 	$(Q)$(MAKE) --no-print-directory -C $(LUA_FOLDER) $(MAKECMDGOALS)
+	@ln -sf $(LUA_FOLDER)/liblikwid-lua.so liblikwid-lua.so.$(VERSION).$(RELEASE)
 else
 $(TARGET_LUA_LIB):
 	@echo "===>  EXTERNAL LUA"
@@ -179,6 +188,7 @@ endif
 $(TARGET_HWLOC_LIB):
 	@echo "===>  ENTER  $(HWLOC_FOLDER)"
 	$(Q)$(MAKE) --no-print-directory -C $(HWLOC_FOLDER) $(MAKECMDGOALS)
+	@ln -sf $(HWLOC_FOLDER)/liblikwid-hwloc.so liblikwid-hwloc.so.$(VERSION).$(RELEASE)
 
 $(BENCH_TARGET):
 	@echo "===>  ENTER  $(BENCH_FOLDER)"
@@ -358,21 +368,20 @@ install: install_daemon install_freq
 	@echo "===> INSTALL man pages to $(MANPREFIX)/man1"
 	@mkdir -p $(MANPREFIX)/man1
 	@chmod 755 $(MANPREFIX)/man1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-topology.1 > $(MANPREFIX)/man1/likwid-topology.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s+<PREFIX>+$(PREFIX)+g" < $(DOC_DIR)/likwid-perfctr.1 > $(MANPREFIX)/man1/likwid-perfctr.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-powermeter.1 > $(MANPREFIX)/man1/likwid-powermeter.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-pin.1 > $(MANPREFIX)/man1/likwid-pin.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/feedGnuplot.1 > $(MANPREFIX)/man1/feedGnuplot.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-accessD.1 > $(MANPREFIX)/man1/likwid-accessD.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-genTopoCfg.1 > $(MANPREFIX)/man1/likwid-genTopoCfg.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-memsweeper.1 > $(MANPREFIX)/man1/likwid-memsweeper.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-mpirun.1 > $(MANPREFIX)/man1/likwid-mpirun.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-perfscope.1 > $(MANPREFIX)/man1/likwid-perfscope.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-setFreq.1 > $(MANPREFIX)/man1/likwid-setFreq.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-features.1 > $(MANPREFIX)/man1/likwid-features.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-bench.1 > $(MANPREFIX)/man1/likwid-bench.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-agent.1 > $(MANPREFIX)/man1/likwid-agent.1
-	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" < $(DOC_DIR)/likwid-setFrequencies.1 > $(MANPREFIX)/man1/likwid-setFrequencies.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-topology.1 > $(MANPREFIX)/man1/likwid-topology.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" -e "s+<PREFIX>+$(PREFIX)+g" < $(DOC_DIR)/likwid-perfctr.1 > $(MANPREFIX)/man1/likwid-perfctr.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-powermeter.1 > $(MANPREFIX)/man1/likwid-powermeter.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-pin.1 > $(MANPREFIX)/man1/likwid-pin.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/feedGnuplot.1 > $(MANPREFIX)/man1/feedGnuplot.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-accessD.1 > $(MANPREFIX)/man1/likwid-accessD.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-genTopoCfg.1 > $(MANPREFIX)/man1/likwid-genTopoCfg.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-memsweeper.1 > $(MANPREFIX)/man1/likwid-memsweeper.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-mpirun.1 > $(MANPREFIX)/man1/likwid-mpirun.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-perfscope.1 > $(MANPREFIX)/man1/likwid-perfscope.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-setFreq.1 > $(MANPREFIX)/man1/likwid-setFreq.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-features.1 > $(MANPREFIX)/man1/likwid-features.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-bench.1 > $(MANPREFIX)/man1/likwid-bench.1
+	@sed -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" < $(DOC_DIR)/likwid-setFrequencies.1 > $(MANPREFIX)/man1/likwid-setFrequencies.1
 	@sed -e "s/.TH LUA/.TH LIKWID-LUA/g" -e "s/lua - Lua interpreter/likwid-lua - Lua interpreter included in LIKWID/g" -e "s/.B lua/.B likwid-lua/g" -e "s/.BR luac (1)//g" $(DOC_DIR)/likwid-lua.1 > $(MANPREFIX)/man1/likwid-lua.1
 	@chmod 644 $(MANPREFIX)/man1/likwid-*
 	@echo "===> INSTALL headers to $(PREFIX)/include"
@@ -388,27 +397,20 @@ install: install_daemon install_freq
 	@cp -rf groups/* $(PREFIX)/share/likwid/perfgroups
 	@chmod 755 $(PREFIX)/share/likwid/perfgroups/*
 	@find $(PREFIX)/share/likwid/perfgroups -name "*.txt" -exec chmod 644 {} \;
-	@echo "===> INSTALL monitoring groups to $(PREFIX)/share/likwid/mongroups"
-	@mkdir -p $(PREFIX)/share/likwid/mongroups
-	@chmod 755 $(PREFIX)/share/likwid/mongroups
-	@cp -rf monitoring/groups/* $(PREFIX)/share/likwid/mongroups
-	@chmod 755 $(PREFIX)/share/likwid/mongroups/*
-	@find $(PREFIX)/share/likwid/mongroups -name "*.txt" -exec chmod 644 {} \;
+	@echo "===> INSTALL docs and examples to $(PREFIX)/share/likwid/docs"
 	@mkdir -p $(PREFIX)/share/likwid/docs
 	@chmod 755 $(PREFIX)/share/likwid/docs
 	@install -m 644 doc/bstrlib.txt $(PREFIX)/share/likwid/docs
 	@mkdir -p $(PREFIX)/share/likwid/examples
 	@chmod 755 $(PREFIX)/share/likwid/examples
 	@install -m 644 examples/* $(PREFIX)/share/likwid/examples
-	@echo "===> INSTALL default likwid-agent.conf to $(PREFIX)/share/likwid/mongroups"
-	@sed -e "s+<PREFIX>+$(PREFIX)+g" monitoring/likwid-agent.conf > $(PREFIX)/share/likwid/mongroups/likwid-agent.conf
-	@chmod 644 $(PREFIX)/share/likwid/mongroups/likwid-agent.conf
 	@echo "===> INSTALL filters to $(abspath $(PREFIX)/share/likwid/filter)"
 	@mkdir -p $(abspath $(PREFIX)/share/likwid/filter)
 	@chmod 755 $(abspath $(PREFIX)/share/likwid/filter)
 	@for F in $(FILTERS); do \
 		install -m 755 $$F  $(abspath $(PREFIX)/share/likwid/filter); \
 	done
+	@install -m 644 likwid-config.cmake $(LIBPREFIX)
 
 move: move_daemon move_freq
 	@echo "===> MOVE applications from $(BINPREFIX) to $(INSTALLED_BINPREFIX)"
@@ -459,26 +461,18 @@ move: move_daemon move_freq
 	@cp -rf $(PREFIX)/share/likwid/perfgroups/* $(INSTALLED_PREFIX)/share/likwid/perfgroups
 	@chmod 755 $(INSTALLED_PREFIX)/share/likwid/perfgroups/*
 	@find $(INSTALLED_PREFIX)/share/likwid/perfgroups -name "*.txt" -exec chmod 644 {} \;
-	@echo "===> MOVE monitoring groups from $(PREFIX)/share/likwid/mongroups to $(INSTALLED_PREFIX)/share/likwid/mongroups"
-	@mkdir -p $(INSTALLED_PREFIX)/share/likwid/mongroups
-	@chmod 755 $(INSTALLED_PREFIX)/share/likwid/mongroups
-	@cp -rf $(PREFIX)/share/likwid/mongroups/* $(INSTALLED_PREFIX)/share/likwid/mongroups
-	@chmod 755 $(INSTALLED_PREFIX)/share/likwid/mongroups/*
-	@find $(INSTALLED_PREFIX)/share/likwid/mongroups -name "*.txt" -exec chmod 644 {} \;
 	@mkdir -p $(INSTALLED_PREFIX)/share/likwid/docs
 	@chmod 755 $(INSTALLED_PREFIX)/share/likwid/docs
 	@install -m 644 $(PREFIX)/share/likwid/docs/bstrlib.txt $(INSTALLED_PREFIX)/share/likwid/docs
 	@mkdir -p $(INSTALLED_PREFIX)/share/likwid/examples
 	@chmod 755 $(INSTALLED_PREFIX)/share/likwid/examples
 	@install -m 644 examples/* $(INSTALLED_PREFIX)/share/likwid/examples
-	@echo "===> MOVE default likwid-agent.conf from $(PREFIX)/share/likwid/mongroups to $(INSTALLED_PREFIX)/share/likwid/mongroups"
-	@install $(PREFIX)/share/likwid/mongroups/likwid-agent.conf $(INSTALLED_PREFIX)/share/likwid/mongroups/likwid-agent.conf
-	@chmod 644 $(INSTALLED_PREFIX)/share/likwid/mongroups/likwid-agent.conf
 	@echo "===> MOVE filters from $(abspath $(PREFIX)/share/likwid/filter) to $(LIKWIDFILTERPATH)"
 	@mkdir -p $(LIKWIDFILTERPATH)
 	@chmod 755 $(LIKWIDFILTERPATH)
 	@cp -f $(abspath $(PREFIX)/share/likwid/filter)/* $(LIKWIDFILTERPATH)
 	@chmod 755 $(LIKWIDFILTERPATH)/*
+	@install -m 644 $(LIBPREFIX)/likwid-config.cmake $(INSTALLED_LIBPREFIX)
 
 uninstall: uninstall_daemon uninstall_freq
 	@echo "===> REMOVING applications from $(PREFIX)/bin"
@@ -509,11 +503,11 @@ uninstall: uninstall_daemon uninstall_freq
 	$(FORTRAN_REMOVE)
 	@echo "===> REMOVING filter, groups and default configs from $(PREFIX)/share/likwid"
 	@rm -rf $(abspath $(PREFIX)/share/likwid/filter)
-	@rm -rf $(PREFIX)/share/likwid/mongroups
 	@rm -rf $(PREFIX)/share/likwid/perfgroups
 	@rm -rf $(PREFIX)/share/likwid/docs
 	@rm -rf $(PREFIX)/share/likwid/examples
 	@rm -rf $(PREFIX)/share/likwid
+	@rm -rf $(LIBPREFIX)/likwid-config.cmake
 
 uninstall_moved: uninstall_daemon_moved uninstall_freq_moved
 	@echo "===> REMOVING applications from $(INSTALLED_PREFIX)/bin"
@@ -544,21 +538,20 @@ uninstall_moved: uninstall_daemon_moved uninstall_freq_moved
 	$(FORTRAN_REMOVE)
 	@echo "===> REMOVING filter, groups and default configs from $(INSTALLED_PREFIX)/share/likwid"
 	@rm -rf $(LIKWIDFILTERPATH)
-	@rm -rf $(INSTALLED_PREFIX)/share/likwid/mongroups
 	@rm -rf $(INSTALLED_PREFIX)/share/likwid/perfgroups
 	@rm -rf $(INSTALLED_PREFIX)/share/likwid/docs
 	@rm -rf $(INSTALLED_PREFIX)/share/likwid/examples
 	@rm -rf $(INSTALLED_PREFIX)/share/likwid
+	@rm -rf $(INSTALLED_LIBPREFIX)/likwid-config.cmake
 
 local: $(L_APPS) likwid.lua
 	@echo "===> Setting Lua scripts to run from current directory"
 	@PWD=$(shell pwd)
 	@for APP in $(L_APPS); do \
-		sed -i -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<RELEASE>/$(RELEASE)/g" -e "s+$(PREFIX)/bin/likwid-lua+$(PWD)/ext/lua/lua+" -e "s+$(PREFIX)/share/lua/?.lua+$(PWD)/?.lua+" -e "s+$(PREFIX)/bin/likwid-pin+$(PWD)/likwid-pin+" -e "s+$(PREFIX)/bin/likwid-perfctr+$(PWD)/likwid-perfctr+" $$APP; \
+		sed -i -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<RELEASE>/$(RELEASE)/g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" -e "s+$(PREFIX)/bin/likwid-lua+$(PWD)/ext/lua/lua+" -e "s+$(PREFIX)/share/lua/?.lua+$(PWD)/?.lua+" -e "s+$(PREFIX)/bin/likwid-pin+$(PWD)/likwid-pin+" -e "s+$(PREFIX)/bin/likwid-perfctr+$(PWD)/likwid-perfctr+" $$APP; \
 		chmod +x $$APP; \
 	done
-	@sed -i -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<RELEASE>/$(RELEASE)/g" -e "s+$(PREFIX)/lib+$(PWD)+g" -e "s+$(PREFIX)/share/likwid/perfgroups+$(PWD)/groups+g" likwid.lua;
-	@sed -i -e "s+$(PREFIX)/share/likwid/mongroups+$(PWD)/monitoring/groups+g" likwid-agent
+	@sed -i -e "s/<VERSION>/$(VERSION)/g" -e "s/<DATE>/$(DATE)/g" -e "s/<RELEASE>/$(RELEASE)/g" -e "s+$(PREFIX)/lib+$(PWD)+g" -e "s+$(PREFIX)/share/likwid/perfgroups+$(PWD)/groups+g" -e "s/<GITCOMMIT>/$(GITCOMMIT)/g" -e "s/<MINOR>/$(MINOR)/g" likwid.lua;
 	@ln -sf liblikwid.so liblikwid.so.$(VERSION)
 	@ln -sf ext/hwloc/liblikwid-hwloc.so liblikwid-hwloc.so.$(VERSION)
 	@ln -sf ext/lua/liblikwid-lua.so liblikwid-lua.so.$(VERSION)
diff --git a/README.md b/README.md
index ed8c7a5..cb45268 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
 --------------------------------------------------------------------------------
 Introduction
 --------------------------------------------------------------------------------
+
 Likwid is a simple to install and use toolsuite of command line applications
 for performance oriented programmers. It works for Intel and AMD processors
 on the Linux operating system.
@@ -22,6 +23,42 @@ It consists of:
 - likwid-memsweeper: Sweep memory of NUMA domains and evict cachelines from the last level cache
 - likwid-setFrequencies: Tool to control the CPU frequency
 
+For further information please take a look at the [Wiki](https://github.com/RRZE-HPC/likwid/wiki).
+
+--------------------------------------------------------------------------------
+Supported architectures
+--------------------------------------------------------------------------------
+Intel
+- Intel Atom
+- Intel Pentium M
+- Intel Core2
+- Intel Nehalem
+- Intel NehalemEX
+- Intel Westmere
+- Intel WestmereEX
+- Intel Xeon Phi (KNC)
+- Intel Silvermont & Airmont
+- Intel Goldmont
+- Intel SandyBridge
+- Intel SandyBridge EP/EN
+- Intel IvyBridge
+- Intel IvyBridge EP/EN/EX
+- Intel Haswell
+- Intel Haswell EP/EN/EX
+- Intel Broadwell
+- Intel Broadwell D
+- Intel Broadwell EP
+- Intel Skylake
+- Intel Skylake SP
+- Intel Xeon Phi (KNL)
+
+AMD
+- AMD K8
+- AMD K10
+- AMD Interlagos
+- AMD Kabini
+- AMD Zen
+
 --------------------------------------------------------------------------------
 Download, Build and Install
 --------------------------------------------------------------------------------
@@ -31,6 +68,14 @@ http://ftp.fau.de/pub/likwid/
 For build and installation hints see INSTALL file or check the build instructions
 page in the wiki https://github.com/RRZE-HPC/likwid/wiki/Build
 
+For quick install:
+```
+$ tar -xjf likwid-<VERSION>.tar.bz2
+$ cd likwid-<VERSION>
+$ vi config.mk (configure build, e.g. change installation prefix)
+$ make
+$ sudo make install (sudo required to install the access daemon with proper permissions)
+```
 --------------------------------------------------------------------------------
 Documentation
 --------------------------------------------------------------------------------
@@ -56,7 +101,7 @@ Extras
 - If you want to use the Marker API with Java, you can find the Java module here:
 https://github.com/jlewandowski/likwid-java-api
 - For Python you can find an interface to the LIKWID API here:
-https://github.com/TomTheBear/likwid-python-api
+https://github.com/RRZE-HPC/pylikwid
 
 --------------------------------------------------------------------------------
 Survey
@@ -65,3 +110,11 @@ We opened a survey at the user mailing list to get a feeling who uses LIKWID and
 Moreover we would be interested if you are missing a feature or what annoys you when using LIKWID.
 Link to the survey:
 https://groups.google.com/forum/#!topic/likwid-users/F7TDho3k7ps
+
+--------------------------------------------------------------------------------
+Funding
+--------------------------------------------------------------------------------
+
+LIKWID development was funded by BMBF Germany under the FEPA project, grant 01IH13009. Since 2017 the development is further funded by BMBF Germany under the SeASiTe project, grant 01IH16012A.
+
+<div align=center><img src="https://raw.githubusercontent.com/wiki/RRZE-HPC/likwid/images/BMBF.png" alt="BMBF logo"/></div>
diff --git a/bench/includes/allocator.h b/bench/includes/allocator.h
index 09f359b..b02ae2d 100644
--- a/bench/includes/allocator.h
+++ b/bench/includes/allocator.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File allocator Module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  none
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/includes/allocator_types.h b/bench/includes/allocator_types.h
index 76a6eb7..3774e67 100644
--- a/bench/includes/allocator_types.h
+++ b/bench/includes/allocator_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File types of allocator Module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  none
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/includes/barrier.h b/bench/includes/barrier.h
index 9832ece..6dc7ecc 100644
--- a/bench/includes/barrier.h
+++ b/bench/includes/barrier.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File barrier Module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/includes/barrier_types.h b/bench/includes/barrier_types.h
index d5b92d0..e0b64cb 100644
--- a/bench/includes/barrier_types.h
+++ b/bench/includes/barrier_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Type Definitions for barrier Module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/includes/strUtil.h b/bench/includes/strUtil.h
index 0b1e502..93abdcd 100644
--- a/bench/includes/strUtil.h
+++ b/bench/includes/strUtil.h
@@ -4,13 +4,13 @@
  *
  *      Description:  Some sting functions
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/includes/test_types.h b/bench/includes/test_types.h
index ffb11bc..9da1c58 100644
--- a/bench/includes/test_types.h
+++ b/bench/includes/test_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Type definitions for benchmarking framework
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/includes/threads.h b/bench/includes/threads.h
index bca27af..593a4df 100644
--- a/bench/includes/threads.h
+++ b/bench/includes/threads.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file of pthread interface module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/includes/threads_types.h b/bench/includes/threads_types.h
index 65c951d..8a9459b 100644
--- a/bench/includes/threads_types.h
+++ b/bench/includes/threads_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Types file for threads module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/likwid-bench.c b/bench/likwid-bench.c
index 3d66203..90e9ec4 100644
--- a/bench/likwid-bench.c
+++ b/bench/likwid-bench.c
@@ -5,13 +5,13 @@
  *
  *      Description:  A flexible and extensible benchmarking toolbox
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -50,6 +50,9 @@
 
 #include <likwid.h>
 
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+
 extern void* runTest(void* arg);
 extern void* getIterSingle(void* arg);
 
@@ -80,7 +83,7 @@ extern void* getIterSingle(void* arg);
     printf("likwid-bench -t copy -w S0:100MB:1-0:S0,1:S1\n"); \
 
 #define VERSION_MSG \
-    printf("likwid-bench   %d.%d \n\n",VERSION,RELEASE)
+    printf("likwid-bench -- Version %d.%d.%d\n",VERSION,RELEASE,MINORVERSION); \
 
 /* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE  ############ */
 
@@ -518,6 +521,7 @@ int main(int argc, char** argv)
     ownprintf("MByte/s:\t\t%.2f\n",
             1.0E-06 * ( (double) threads_data[0].data.iter * realSize *  test->bytes/ time));
 
+
     size_t destsize = 0;
     size_t datasize = 0;
     double perUpFactor = 0.0;
@@ -542,7 +546,6 @@ int main(int argc, char** argv)
     cycPerCL = (double) maxCycles/(threads_data[0].data.iter*realSize*destsize/64);
     ownprintf("Cycles per update:\t%f\n", cycPerCL/perUpFactor);
     ownprintf("Cycles per cacheline:\t%f\n", cycPerCL);
-
     ownprintf("Loads per update:\t%ld\n", test->loads );
     ownprintf("Stores per update:\t%ld\n", test->stores );
     if (test->loads > 0 && test->stores > 0)
diff --git a/bench/src/allocator.c b/bench/src/allocator.c
index f730b60..b5baf5f 100644
--- a/bench/src/allocator.c
+++ b/bench/src/allocator.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Implementation of allocator module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/src/barrier.c b/bench/src/barrier.c
index c7bf6d6..f0476a8 100644
--- a/bench/src/barrier.c
+++ b/bench/src/barrier.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Implementation of threaded spin loop barrier
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/src/bench.c b/bench/src/bench.c
index a6a9212..3330f75 100644
--- a/bench/src/bench.c
+++ b/bench/src/bench.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Benchmarking framework for likwid-bench
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *               Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/src/strUtil.c b/bench/src/strUtil.c
index 0f6074e..97bfe96 100644
--- a/bench/src/strUtil.c
+++ b/bench/src/strUtil.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Utility string routines building upon bstrlib
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com.
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -68,8 +68,11 @@ bstr_to_doubleSize(const_bstring str, DataType type)
 {
     int ret;
     bstring unit = bmidstr(str, blength(str)-2, 2);
+    bstring single_unit = bmidstr(str, blength(str)-1, 1);
     bstring sizeStr = bmidstr(str, 0, blength(str)-2);
+    bstring single_sizeStr = bmidstr(str, 0, blength(str)-1);
     uint64_t sizeU = 0;
+    uint64_t single_sizeU = 0;
     uint64_t junk = 0;
     uint64_t bytesize = 0;
     if (blength(sizeStr) == 0)
@@ -85,6 +88,15 @@ bstr_to_doubleSize(const_bstring str, DataType type)
     {
         return 0;
     }
+    ret = str2int(bdata(single_sizeStr));
+    if (ret >= 0)
+    {
+        single_sizeU = str2int(bdata(single_sizeStr));
+    }
+    else
+    {
+        return 0;
+    }
 
     bytesize = allocator_dataTypeLength(type);
 
@@ -100,12 +112,14 @@ bstr_to_doubleSize(const_bstring str, DataType type)
     {
         junk = (sizeU *1000000000)/bytesize;
     }
-    else if (biseqcstr(unit, "B"))
+    else if (biseqcstr(single_unit, "B"))
     {
-        junk = (sizeU)/bytesize;
+        junk = (single_sizeU)/bytesize;
     }
     bdestroy(unit);
+    bdestroy(single_unit);
     bdestroy(sizeStr);
+    bdestroy(single_sizeStr);
     return junk;
 }
 
diff --git a/bench/src/threads.c b/bench/src/threads.c
index 76225b7..6673fe2 100644
--- a/bench/src/threads.c
+++ b/bench/src/threads.c
@@ -5,13 +5,13 @@
  *
  *      Description:  High level interface to pthreads
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/bench/x86-64/sum_avx512.ptt b/bench/x86-64/sum_avx512.ptt
index c01ecf5..2e82a4e 100644
--- a/bench/x86-64/sum_avx512.ptt
+++ b/bench/x86-64/sum_avx512.ptt
@@ -8,7 +8,7 @@ STORES 0
 INSTR_CONST 24
 INSTR_LOOP 11
 UOPS 18
-vpxorq  zmm1, zmm1, zmm1
+vpxorq zmm1, zmm1, zmm1
 vmovapd zmm2, zmm1
 vmovapd zmm3, zmm1
 vmovapd zmm4, zmm1
diff --git a/config.mk b/config.mk
index ead3571..2042835 100644
--- a/config.mk
+++ b/config.mk
@@ -1,27 +1,43 @@
+#################################################################
+#################################################################
+# Configuration options                                         #
+#################################################################
+#################################################################
+
 # Please have a look in INSTALL and the WIKI for details on
 # configuration options setup steps.
 # supported: GCC, CLANG, ICC, MIC (ICC), GCCX86 (for 32bit systems)
 COMPILER = GCC#NO SPACE
 
-# Define the color of the likwid-pin output
-# Can be NONE, BLACK, RED, GREEN, YELLOW, BLUE,
-# MAGENTA, CYAN or WHITE
-COLOR = BLUE#NO SPACE
-
 # Path were to install likwid
-PREFIX = /usr/local#NO SPACE
+PREFIX = /usr/local
 
-# uncomment to optionally set external lua at 5.3:
-# default is use internally provide lua
-#LUA_INCLUDE_DIR = /usr/include/lua5.2#NO SPACE
-#LUA_LIB_DIR = /usr/lib/x86_64-linux-gnu#NO SPACE
-#LUA_LIB_NAME = lua5.2#NO SPACE, executable is assumed to have the same name
-#LUA_BIN = /usr/bin#NO SPACE
+# Set the default mode for MSR access.
+# This can usually be overriden on the commandline.
+# Valid values are: direct, accessdaemon and perf_event
+ACCESSMODE = accessdaemon#NO SPACE
+
+# Build Fortran90 module interface for Marker API. Adopt Fortran compiler
+# in ./make/include_<COMPILER>.mk if necessary. Default: ifort (even for
+# COMPILER=GCC)
+FORTRAN_INTERFACE = false#NO SPACE
+
+# Instrument likwid-bench with Marker API calls for use with likwid-perfctr
+INSTRUMENT_BENCH = true#NO SPACE
 
 #################################################################
-# Common users do not need to change values below this comment! #
 #################################################################
+# Advanced configuration options                                #
+# Most users do not need to change values below this comment!   #
+#################################################################
+#################################################################
+
+# Define the color of the likwid-pin output
+# Can be NONE, BLACK, RED, GREEN, YELLOW, BLUE,
+# MAGENTA, CYAN or WHITE
+COLOR = BLUE#NO SPACE
 
+# Some path definitions
 MANPREFIX = $(PREFIX)/man#NO SPACE
 BINPREFIX = $(PREFIX)/bin#NO SPACE
 LIBPREFIX = $(PREFIX)/lib#NO SPACE
@@ -37,62 +53,86 @@ INSTALLED_PREFIX = $(PREFIX)#NO SPACE
 INSTALLED_BINPREFIX = $(INSTALLED_PREFIX)/bin#NO SPACE
 INSTALLED_LIBPREFIX = $(INSTALLED_PREFIX)/lib#NO SPACE
 
-# chown installed tools to this user/group
-# if you change anything here, make sure that the user/group can access
-# the MSR devices and (on Intel) the PCI devices.
-INSTALL_CHOWN = -g root -o root
-
 # For the daemon based secure msr/pci access configure
 # the absolute path to the msr daemon executable.
-# $(INSTALLED_PREFIX)/bin/likwid-accessD
 ACCESSDAEMON = $(PREFIX)/sbin/likwid-accessD#NO SPACE
 INSTALLED_ACCESSDAEMON = $(INSTALLED_PREFIX)/sbin/likwid-accessD#NO SPACE
 
 # Build the accessDaemon. Have a look in the WIKI for details.
 BUILDDAEMON = true#NO SPACE
-#Build the setFrequencies tool
+# Build the setFrequencies daemon to allow users setting the CPU and Uncore
+# frequency
 BUILDFREQ = true#NO SPACE
 
-# Set the default mode for MSR access.
-# This can usually be overriden on the commandline.
-# Valid values are: direct, accessdaemon
-ACCESSMODE = accessdaemon#NO SPACE
+# chown installed tools to this user/group
+# if you change anything here, make sure that the user/group can access
+# the MSR devices and (on Intel) the PCI devices.
+INSTALL_CHOWN = -g root -o root#NO SPACE
+
+# uncomment to optionally set external lua at 5.2 or lua at 5.3:
+# default is use internally provide lua
+#LUA_INCLUDE_DIR = /usr/include/lua5.2#NO SPACE
+#LUA_LIB_DIR = /usr/lib/x86_64-linux-gnu#NO SPACE
+#LUA_LIB_NAME = lua5.2#NO SPACE, executable is assumed to have the same name
+#LUA_BIN = /usr/bin#NO SPACE
 
 # Change to true to a build shared library instead of a static one
+# It is NOT recommended to switch to static libraries as some features don't
+# work when compiled statically
 SHARED_LIBRARY = true#NO SPACE
 
-# Build Fortran90 module interface for marker API. Adopt Fortran compiler
-# in ./make/include_<COMPILER>.mk if necessary. Default: ifort .
-FORTRAN_INTERFACE = false#NO SPACE
-
-# Instrument likwid-bench for use with likwid-perfctr
-INSTRUMENT_BENCH = false#NO SPACE
-
-# Use recommended Portable Hardware Locality (hwloc) instead of CPUID
-USE_HWLOC = true#NO SPACE
-
-# Use Linux perf_event interface for measurements. Does not support thermal or
-# energy (RAPL) readings.
-USE_PERF_EVENT = false#NO SPACE
-
 # Build LIKWID with debug flags
-DEBUG = false#NO SPACE
+DEBUG = true#NO SPACE
 
-# Basic configuration (compiled into library, can be changed by creating
-# a proper config file at CFG_FILE_PATH)
+# Basic configuration for some internal arrays.
+# Maximal number of hardware threads
 MAX_NUM_THREADS = 263
+# Maximal number of sockets
 MAX_NUM_NODES = 64
+
+# Paths to some configuration files that can be used to overwrite some
+# array lengths defined at compilation
 CFG_FILE_PATH = /etc/likwid.cfg
+# With the likwid-genTopoCfg it is possible to store the topology of a system
+# in a file to avoid re-reading all topology informations again
 TOPO_FILE_PATH = /etc/likwid_topo.cfg
 
 # Versioning Information
+# The libraries are named liblikwid.<VERSION>.<RELEASE>
 VERSION = 4
-RELEASE = 2
-DATE    = 22.12.2016
-
+RELEASE = 3
+MINOR = 0
+# Date when the release is published
+DATE    = 22.12.2017
+
+# In come cases it is important to set the rpaths for the LIKWID library. One
+# example is the use of sudo because it resets environment variables like
+# LD_LIBRARY_PATH
 RPATHS = -Wl,-rpath=$(INSTALLED_LIBPREFIX)
+
+# LIKWID uses a lock to avoid simultaneous usage by multiple users. The user
+# owning this file has access to the LIKWID library and can use LIKWID
+# simultaneously.
 LIKWIDLOCKPATH = /var/run/likwid.lock
+
+# The access daemon creates sockets under this path to communicate with the
+# LIKWID library.
 LIKWIDSOCKETBASE = /tmp/likwid  # -%d will be added automatically to the socket name
+
+# The pinning library is put in LD_PRELOAD when using LIKIWD for thread/process
+# pinning. The library overloads the pthread_create function to pin threads
+# directly after their creation
 LIBLIKWIDPIN = $(abspath $(INSTALLED_LIBPREFIX)/liblikwidpin.so.$(VERSION).$(RELEASE))
+
+# Some tools (likwid-perfctr and likwid-topology) provide the export of their
+# output to a file. LIKWID tries to format the file based on the file suffix.
+# The folder contains scripts named as the file suffix, like xml, which read
+# the CSV output of the tools and perform the conversation to the desired file
+# format
 LIKWIDFILTERPATH = $(abspath $(INSTALLED_PREFIX)/share/likwid/filter)
+
+# LIKWID uses txt-files as input for the performance groups. The configured
+# folder contains folders for each architecture with the architecture-specific
+# performance group files. Despite this folder, LIKWID also checks
+# $HOME/.likwid/groups
 LIKWIDGROUPPATH = $(abspath $(INSTALLED_PREFIX)/share/likwid/perfgroups)
diff --git a/doc/likwid-pin.1 b/doc/likwid-pin.1
index a2ccf0e..f264e3d 100644
--- a/doc/likwid-pin.1
+++ b/doc/likwid-pin.1
@@ -176,12 +176,11 @@ This command schedules one thread per physical CPU core for
 .B ./myApp.
 
 .SH IMPORTANT NOTICE
-The detection of shepard threads works for Intel's/LLVM OpenMP runtime (>=12.0), for GCC's OpenMP untime as well as for PGI's OpenMP runtime. If you encounter problems with pinning,
+The detection of shepard threads works for Intel's/LLVM OpenMP runtime (>=12.0), for GCC's OpenMP runtime as well as for PGI's OpenMP runtime. If you encounter problems with pinning,
 please set a proper skip mask to skip the not-detected shepard threads.
 Intel OpenMP runtime 11.0/11.1 requires to set a skip mask of
 .B 0x1.
 
-
 .SH AUTHOR
 Written by Thomas Roehl <thomas.roehl at googlemail.com>.
 .SH BUGS
diff --git a/doc/lua-doxygen.md b/doc/lua-doxygen.md
index ad4881f..5c3b2fb 100644
--- a/doc/lua-doxygen.md
+++ b/doc/lua-doxygen.md
@@ -3040,32 +3040,6 @@ or<BR>
 </TR>
 </TABLE>
 
-\anchor setCpuClockCurrent
-<H2>setCpuClockCurrent(cpuID, freq)</H2>
-<P>Set the current CPU clock frequency</P>
-<TABLE>
-<TR>
-  <TH>Direction</TH>
-  <TH>Data type(s)</TH>
-</TR>
-<TR>
-  <TD>Input Parameter</TD>
-  <TD><TABLE>
-    <TR>
-      <TD>\a cpuID</TD>
-      <TD>CPU to set clock speed</TD>
-    </TR>
-    <TR>
-      <TD>\a freq</TD>
-      <TD>CPU frequency in kHz</TD>
-    </TR>
-  </TABLE></TD>
-</TR>
-<TR>
-  <TD>Returns</TD>
-  <TD>Frequency for success, 0 in case of errors.</TD>
-</TR>
-</TABLE>
 
 \anchor getCpuClockMin
 <H2>getCpuClockMin(cpuID)</H2>
@@ -3217,29 +3191,6 @@ or<BR>
 </TR>
 </TABLE>
 
-\anchor getDriver
-<H2>getDriver(cpuID)</H2>
-<P>Get the current cpufreq driver</P>
-<TABLE>
-<TR>
-  <TH>Direction</TH>
-  <TH>Data type(s)</TH>
-</TR>
-<TR>
-  <TD>Input Parameter</TD>
-  <TD><TABLE>
-    <TR>
-      <TD>\a cpuID</TD>
-      <TD>CPU to get the current cpufreq driver</TD>
-    </TR>
-  </TABLE></TD>
-</TR>
-<TR>
-  <TD>Returns</TD>
-  <TD>Driver for success, nil in case of errors.</TD>
-</TR>
-</TABLE>
-
 \anchor getAvailFreq
 <H2>getAvailFreq(cpuID)</H2>
 <P>Get all available CPU frequency settings</P>
diff --git a/examples/C-likwidAPI.c b/examples/C-likwidAPI.c
index 5faa752..0b67242 100644
--- a/examples/C-likwidAPI.c
+++ b/examples/C-likwidAPI.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Example how to use the LIKWID API in C/C++ applications
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/examples/C-markerAPI.c b/examples/C-markerAPI.c
index 3a722c1..4a64305 100644
--- a/examples/C-markerAPI.c
+++ b/examples/C-markerAPI.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Example how to use the C/C++ Marker API
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/examples/F-markerAPI.F90 b/examples/F-markerAPI.F90
index c1eb5e7..577e244 100644
--- a/examples/F-markerAPI.F90
+++ b/examples/F-markerAPI.F90
@@ -4,13 +4,13 @@
 !
 !      Description:  Example how to use the Fortran90 Marker API
 !
-!      Version:   4.2
-!      Released:  22.12.2016
+!      Version:   4.3.1
+!      Released:  04.01.2018
 !
 !      Author:  Thomas Roehl (tr), thomas.roehl at googlemail.com
 !      Project:  likwid
 !
-!      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+!      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 !
 !      This program is free software: you can redistribute it and/or modify it under
 !      the terms of the GNU General Public License as published by the Free Software
diff --git a/examples/Lua-likwidAPI.lua b/examples/Lua-likwidAPI.lua
index 3ad8729..90c6fe4 100644
--- a/examples/Lua-likwidAPI.lua
+++ b/examples/Lua-likwidAPI.lua
@@ -7,13 +7,13 @@
  *
  *      Description:  Example how to use the LIKWID API in Lua scripts
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/examples/Makefile b/examples/Makefile
index c271574..cdf50d8 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -65,4 +65,3 @@ clean:
 	rm -f C-markerAPI C-likwidAPI F-markerAPI Lua-likwidAPI monitoring C-internalMarkerAPI
 
 .PHONY: clean C-markerAPI C-likwidAPI F-markerAPI Lua-likwidAPI monitoring C-internalMarkerAPI
-
diff --git a/ext/hwloc/hwloc/topology-linux.c b/ext/hwloc/hwloc/topology-linux.c
index 82423ff..7b3f8e1 100644
--- a/ext/hwloc/hwloc/topology-linux.c
+++ b/ext/hwloc/hwloc/topology-linux.c
@@ -47,7 +47,15 @@ struct hwloc_linux_backend_data_s {
 #ifdef HAVE_LIBUDEV_H
   struct udev *udev; /* Global udev context */
 #endif
-
+  int is_amd_with_CU;
+  int is_knl;
+  enum {
+    HWLOC_LINUX_ARCH_X86, /* x86 32 or 64bits, including k1om (KNC) */
+    HWLOC_LINUX_ARCH_IA64,
+    HWLOC_LINUX_ARCH_ARM,
+    HWLOC_LINUX_ARCH_POWER,
+    HWLOC_LINUX_ARCH_UNKNOWN
+} arch;
   struct utsname utsname; /* fields contain \0 when unknown */
 
   int deprecated_classlinks_model; /* -2 if never tried, -1 if unknown, 0 if new (device contains class/name), 1 if old (device contains class:name) */
@@ -2980,7 +2988,8 @@ look_sysfscpu(struct hwloc_topology *topology,
     {
       hwloc_bitmap_t packageset, coreset, bookset, threadset, savedcoreset;
       unsigned mypackageid, mycoreid, mybookid;
-      int threadwithcoreid = 0;
+      //int threadwithcoreid = 0;
+      int threadwithcoreid = data->is_amd_with_CU ? -1 : 0;
 
       /* look at the package */
       mypackageid = 0; /* shut-up the compiler */
@@ -3076,7 +3085,7 @@ package_done:
 	siblingcoreid = mycoreid;
 	sprintf(str, "%s/cpu%d/topology/core_id", path, siblingid);
 	hwloc_parse_sysfs_unsigned(str, &siblingcoreid, data->root_fd);
-	threadwithcoreid = (siblingcoreid != mycoreid);
+	//threadwithcoreid = (siblingcoreid != mycoreid);
 	hwloc_bitmap_free(set);
        }
        if (hwloc_bitmap_first(coreset) == i || threadwithcoreid) {
@@ -3846,6 +3855,24 @@ hwloc_gather_system_info(struct hwloc_topology *topology,
       fclose(file);
     }
   }
+
+#if (defined HWLOC_X86_32_ARCH) || (defined HWLOC_X86_64_ARCH) /* does not cover KNC */
+  if (topology->is_thissystem)
+    data->arch = HWLOC_LINUX_ARCH_X86;
+#endif
+  if (data->arch == HWLOC_LINUX_ARCH_UNKNOWN && *data->utsname.machine) {
+    if (!strcmp(data->utsname.machine, "x86_64")
+	|| (data->utsname.machine[0] == 'i' && !strcmp(data->utsname.machine+2, "86"))
+	|| !strcmp(data->utsname.machine, "k1om"))
+      data->arch = HWLOC_LINUX_ARCH_X86;
+    else if (!strncmp(data->utsname.machine, "arm", 3))
+      data->arch = HWLOC_LINUX_ARCH_ARM;
+    else if (!strncmp(data->utsname.machine, "ppc", 3)
+	     || !strncmp(data->utsname.machine, "power", 5))
+      data->arch = HWLOC_LINUX_ARCH_POWER;
+    else if (!strcmp(data->utsname.machine, "ia64"))
+      data->arch = HWLOC_LINUX_ARCH_IA64;
+  }
 }
 
 static int
@@ -3910,6 +3937,29 @@ hwloc_look_linuxfs(struct hwloc_backend *backend)
       struct hwloc_obj_info_s *global_infos = NULL;
       unsigned global_infos_count = 0;
       int numprocs = hwloc_linux_parse_cpuinfo(data, "/proc/cpuinfo", &Lprocs, &global_infos, &global_infos_count);
+      if (data->arch == HWLOC_LINUX_ARCH_X86 && numprocs > 0) {
+      unsigned i;
+      const char *cpuvendor = NULL, *cpufamilynumber = NULL, *cpumodelnumber = NULL;
+      for(i=0; i<Lprocs[0].infos_count; i++) {
+	if (!strcmp(Lprocs[0].infos[i].name, "CPUVendor")) {
+	  cpuvendor = Lprocs[0].infos[i].value;
+	} else if (!strcmp(Lprocs[0].infos[i].name, "CPUFamilyNumber")) {
+	  cpufamilynumber = Lprocs[0].infos[i].value;
+	} else if (!strcmp(Lprocs[0].infos[i].name, "CPUModelNumber")) {
+	  cpumodelnumber = Lprocs[0].infos[i].value;
+	}
+      }
+      if (cpuvendor && !strcmp(cpuvendor, "GenuineIntel")
+	  && cpufamilynumber && !strcmp(cpufamilynumber, "6")
+	  && cpumodelnumber && (!strcmp(cpumodelnumber, "87")
+	  || !strcmp(cpumodelnumber, "133")))
+	data->is_knl = 1;
+      if (cpuvendor && !strcmp(cpuvendor, "AuthenticAMD")
+	  && cpufamilynumber
+	  && (!strcmp(cpufamilynumber, "21")
+	      || !strcmp(cpufamilynumber, "22")))
+	data->is_amd_with_CU = 1;
+}
       if (numprocs <= 0)
 	Lprocs = NULL;
       if (look_sysfscpu(topology, data, "/sys/bus/cpu/devices", Lprocs, numprocs) < 0)
@@ -4829,6 +4879,8 @@ hwloc_linux_component_instantiate(struct hwloc_disc_component *component,
   backend->disable = hwloc_linux_backend_disable;
 
   /* default values */
+  data->is_amd_with_CU = 0;
+  data->is_knl = 0;
   data->is_real_fsroot = 1;
   if (!fsroot_path)
     fsroot_path = "/";
diff --git a/ext/hwloc/include/private/autogen/config.h b/ext/hwloc/include/private/autogen/config.h
index e220d4f..a6c4666 100644
--- a/ext/hwloc/include/private/autogen/config.h
+++ b/ext/hwloc/include/private/autogen/config.h
@@ -386,16 +386,16 @@
 #define HAVE_WCHAR_T 1
 
 /* Define to 1 if you have the <X11/keysym.h> header file. */
-#define HAVE_X11_KEYSYM_H 1
+//#define HAVE_X11_KEYSYM_H 1
 
 /* Define to 1 if you have the <X11/Xlib.h> header file. */
-#define HAVE_X11_XLIB_H 1
+//#define HAVE_X11_XLIB_H 1
 
 /* Define to 1 if you have the <X11/Xutil.h> header file. */
-#define HAVE_X11_XUTIL_H 1
+//#define HAVE_X11_XUTIL_H 1
 
 /* Define to 1 if you have the <xlocale.h> header file. */
-#define HAVE_XLOCALE_H 1
+//#define HAVE_XLOCALE_H 1
 
 /* Define to '1' if __progname is present and usable */
 #define HAVE___PROGNAME 1
diff --git a/groups/haswell/UOPS_EXEC.txt b/groups/haswell/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/haswell/UOPS_EXEC.txt
+++ b/groups/haswell/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/haswell/UOPS_ISSUE.txt b/groups/haswell/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/haswell/UOPS_ISSUE.txt
+++ b/groups/haswell/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/haswell/UOPS_RETIRE.txt b/groups/haswell/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/haswell/UOPS_RETIRE.txt
+++ b/groups/haswell/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/haswellEP/CBOX.txt b/groups/haswellEP/CBOX.txt
index d9cc13c..94b6ff7 100644
--- a/groups/haswellEP/CBOX.txt
+++ b/groups/haswellEP/CBOX.txt
@@ -47,7 +47,7 @@ Runtime unhalted [s] FIXC1*inverseClock
 Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 LLC misses per instruction (CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0+CBOX15C0+CBOX16C0+CBOX17C0)/FIXC0
-LL2 data written to MEM [MBytes] 1E-6*(CBOX0C1:STATE=0x1+CBOX1C1:STATE=0x1+CBOX2C1:STATE=0x1+CBOX3C1:STATE=0x1+CBOX4C1:STATE=0x1+CBOX5C1:STATE=0x1+CBOX6C1:STATE=0x1+CBOX7C1:STATE=0x1+CBOX8C1:STATE=0x1+CBOX9C1:STATE=0x1+CBOX10C1:STATE=0x1+CBOX11C1:STATE=0x1+CBOX12C1:STATE=0x1+CBOX13C1:STATE=0x1+CBOX14C1:STATE=0x1+CBOX15C1:STATE=0x1+CBOX16C1:STATE=0x1+CBOX17C1:STATE=0x1)*64
+LL2 data written to MEM [MBytes] 1E-6*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1+CBOX15C1+CBOX16C1+CBOX17C1)*64
 
 
 LONG
diff --git a/groups/haswellEP/UOPS_EXEC.txt b/groups/haswellEP/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/haswellEP/UOPS_EXEC.txt
+++ b/groups/haswellEP/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/haswellEP/UOPS_ISSUE.txt b/groups/haswellEP/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/haswellEP/UOPS_ISSUE.txt
+++ b/groups/haswellEP/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/haswellEP/UOPS_RETIRE.txt b/groups/haswellEP/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/haswellEP/UOPS_RETIRE.txt
+++ b/groups/haswellEP/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/ivybridge/UOPS_EXEC.txt b/groups/ivybridge/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/ivybridge/UOPS_EXEC.txt
+++ b/groups/ivybridge/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/ivybridge/UOPS_ISSUE.txt b/groups/ivybridge/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/ivybridge/UOPS_ISSUE.txt
+++ b/groups/ivybridge/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/ivybridge/UOPS_RETIRE.txt b/groups/ivybridge/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/ivybridge/UOPS_RETIRE.txt
+++ b/groups/ivybridge/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/ivybridgeEP/CACHES.txt b/groups/ivybridgeEP/CACHES.txt
index c31b38c..dee9a66 100644
--- a/groups/ivybridgeEP/CACHES.txt
+++ b/groups/ivybridgeEP/CACHES.txt
@@ -74,12 +74,12 @@ L2 to L3 evict bandwidth [MBytes/s]  1.0E-06*PMC3*64.0/time
 L2 to L3 evict data volume [GBytes]  1.0E-09*PMC3*64.0
 L2 to/from L3 bandwidth [MBytes/s] 1.0E-06*(PMC2+PMC3)*64.0/time
 L2 to/from L3 data volume [GBytes] 1.0E-09*(PMC2+PMC3)*64.0
-System to L3 bandwidth [MBytes/s] 1.0E-06*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F)*64.0/time
-System to L3 data volume [GBytes] 1.0E-09*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F)*64.0
+System to L3 bandwidth [MBytes/s] 1.0E-06*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0)*64.0/time
+System to L3 data volume [GBytes] 1.0E-09*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0)*64.0
 L3 to memory bandwidth [MBytes/s] 1.0E-06*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64/time
 L3 to memory data volume [GBytes] 1.0E-09*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64
-L3 to/from system bandwidth [MBytes/s] 1.0E-06*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64.0/time
-L3 to/from system data volume [GBytes] 1.0E-09*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64.0
+L3 to/from system bandwidth [MBytes/s] 1.0E-06*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64.0/time
+L3 to/from system data volume [GBytes] 1.0E-09*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64.0
 Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0)*64.0/time
 Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0)*64.0
 Memory write bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0/time
diff --git a/groups/ivybridgeEP/CBOX.txt b/groups/ivybridgeEP/CBOX.txt
index ca6c6d5..6450a2e 100644
--- a/groups/ivybridgeEP/CBOX.txt
+++ b/groups/ivybridgeEP/CBOX.txt
@@ -41,13 +41,13 @@ Runtime unhalted [s] FIXC1*inverseClock
 Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 LLC misses per instruction (CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0)/FIXC0
-LLC data written to MEM [MBytes] 1E-6*(CBOX0C1:STATE=0x1+CBOX1C1:STATE=0x1+CBOX2C1:STATE=0x1+CBOX3C1:STATE=0x1+CBOX4C1:STATE=0x1+CBOX5C1:STATE=0x1+CBOX6C1:STATE=0x1+CBOX7C1:STATE=0x1+CBOX8C1:STATE=0x1+CBOX9C1:STATE=0x1+CBOX10C1:STATE=0x1+CBOX11C1:STATE=0x1+CBOX12C1:STATE=0x1+CBOX13C1:STATE=0x1+CBOX14C1:STATE=0x1)*64
+LLC data written to MEM [MBytes] 1E-6*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64
 
 
 LONG
 Formulas:
 LLC misses per instruction sum(LLC_VICTIMS_M_STATE)/INSTR_RETIRED_ANY
-LLC data written to MEM [MBytes] sum(LLC_LOOKUP_ANY)*64*1E-6
+LLC data written to MEM [MBytes] sum(LLC_LOOKUP_ANY:STATE=0x1)*64*1E-6
 --
 The CBOXes mediate the traffic from the L2 cache to the segmented L3 cache. Each
 CBOX is responsible for one segment (2.5 MByte). The boxes maintain the coherence between all
diff --git a/groups/ivybridgeEP/UOPS_EXEC.txt b/groups/ivybridgeEP/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/ivybridgeEP/UOPS_EXEC.txt
+++ b/groups/ivybridgeEP/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/ivybridgeEP/UOPS_ISSUE.txt b/groups/ivybridgeEP/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/ivybridgeEP/UOPS_ISSUE.txt
+++ b/groups/ivybridgeEP/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/ivybridgeEP/UOPS_RETIRE.txt b/groups/ivybridgeEP/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/ivybridgeEP/UOPS_RETIRE.txt
+++ b/groups/ivybridgeEP/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/knl/HBM_CACHE.txt b/groups/knl/HBM_CACHE.txt
new file mode 100644
index 0000000..f89af5d
--- /dev/null
+++ b/groups/knl/HBM_CACHE.txt
@@ -0,0 +1,87 @@
+SHORT Memory bandwidth in MBytes/s for High Bandwidth Memory (HBM)
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+EDBOX0C0 EDC_RPQ_INSERTS
+EDBOX1C0 EDC_RPQ_INSERTS
+EDBOX2C0 EDC_RPQ_INSERTS
+EDBOX3C0 EDC_RPQ_INSERTS
+EDBOX4C0 EDC_RPQ_INSERTS
+EDBOX5C0 EDC_RPQ_INSERTS
+EDBOX6C0 EDC_RPQ_INSERTS
+EDBOX7C0 EDC_RPQ_INSERTS
+EDBOX0C1 EDC_WPQ_INSERTS
+EDBOX1C1 EDC_WPQ_INSERTS
+EDBOX2C1 EDC_WPQ_INSERTS
+EDBOX3C1 EDC_WPQ_INSERTS
+EDBOX4C1 EDC_WPQ_INSERTS
+EDBOX5C1 EDC_WPQ_INSERTS
+EDBOX6C1 EDC_WPQ_INSERTS
+EDBOX7C1 EDC_WPQ_INSERTS
+EUBOX0C0 EDC_MISS_CLEAN
+EUBOX1C0 EDC_MISS_CLEAN
+EUBOX2C0 EDC_MISS_CLEAN
+EUBOX3C0 EDC_MISS_CLEAN
+EUBOX4C0 EDC_MISS_CLEAN
+EUBOX5C0 EDC_MISS_CLEAN
+EUBOX6C0 EDC_MISS_CLEAN
+EUBOX7C0 EDC_MISS_CLEAN
+EUBOX0C1 EDC_MISS_DIRTY
+EUBOX1C1 EDC_MISS_DIRTY
+EUBOX2C1 EDC_MISS_DIRTY
+EUBOX3C1 EDC_MISS_DIRTY
+EUBOX4C1 EDC_MISS_DIRTY
+EUBOX5C1 EDC_MISS_DIRTY
+EUBOX6C1 EDC_MISS_DIRTY
+EUBOX7C1 EDC_MISS_DIRTY
+MBOX0C0 MC_CAS_READS
+MBOX0C1 MC_CAS_WRITES
+MBOX1C0 MC_CAS_READS
+MBOX1C1 MC_CAS_WRITES
+MBOX2C0 MC_CAS_READS
+MBOX2C1 MC_CAS_WRITES
+MBOX4C0 MC_CAS_READS
+MBOX4C1 MC_CAS_WRITES
+MBOX5C0 MC_CAS_READS
+MBOX5C1 MC_CAS_WRITES
+MBOX6C0 MC_CAS_READS
+MBOX6C1 MC_CAS_WRITES
+
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+MCDRAM Memory read bandwidth [MBytes/s] 1.0E-06*((EDBOX0C0+EDBOX1C0+EDBOX2C0+EDBOX3C0+EDBOX4C0+EDBOX5C0+EDBOX6C0+EDBOX7C0)-(EUBOX0C0+EUBOX1C0+EUBOX2C0+EUBOX3C0+EUBOX4C0+EUBOX5C0+EUBOX6C0+EUBOX7C0)-(EUBOX0C1+EUBOX1C1+EUBOX2C1+EUBOX3C1+EUBOX4C1+EUBOX5C1+EUBOX6C1+EUBOX7C1))*64.0/time
+MCDRAM Memory read data volume [GBytes] 1.0E-09*((EDBOX0C0+EDBOX1C0+EDBOX2C0+EDBOX3C0+EDBOX4C0+EDBOX5C0+EDBOX6C0+EDBOX7C0)-(EUBOX0C0+EUBOX1C0+EUBOX2C0+EUBOX3C0+EUBOX4C0+EUBOX5C0+EUBOX6C0+EUBOX7C0)-(EUBOX0C1+EUBOX1C1+EUBOX2C1+EUBOX3C1+EUBOX4C1+EUBOX5C1+EUBOX6C1+EUBOX7C1))*64.0
+MCDRAM Memory writeback bandwidth [MBytes/s] 1.0E-06*((EDBOX0C1+EDBOX1C1+EDBOX2C1+EDBOX3C1+EDBOX4C1+EDBOX5C1+EDBOX6C1+EDBOX7C1)-(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0))*64.0/time
+MCDRAM Memory writeback data volume [GBytes] 1.0E-09*((EDBOX0C1+EDBOX1C1+EDBOX2C1+EDBOX3C1+EDBOX4C1+EDBOX5C1+EDBOX6C1+EDBOX7C1)-(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0))*64.0
+MCDRAM Memory bandwidth [MBytes/s] 1.0E-06*(((EDBOX0C0+EDBOX1C0+EDBOX2C0+EDBOX3C0+EDBOX4C0+EDBOX5C0+EDBOX6C0+EDBOX7C0)-(EUBOX0C0+EUBOX1C0+EUBOX2C0+EUBOX3C0+EUBOX4C0+EUBOX5C0+EUBOX6C0+EUBOX7C0)-(EUBOX0C1+EUBOX1C1+EUBOX2C1+EUBOX3C1+EUBOX4C1+EUBOX5C1+EUBOX6C1+EUBOX7C1))+((EDBOX0C1+EDBOX1C1+EDBOX2C1+EDBOX3C1+EDBOX4C1+EDBOX5C1+EDBOX6C1+EDBOX7C1)-(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0)))*64.0/time
+MCDRAM Memory data volume [GBytes] 1.0E-09*(((EDBOX0C0+EDBOX1C0+EDBOX2C0+EDBOX3C0+EDBOX4C0+EDBOX5C0+EDBOX6C0+EDBOX7C0)-(EUBOX0C0+EUBOX1C0+EUBOX2C0+EUBOX3C0+EUBOX4C0+EUBOX5C0+EUBOX6C0+EUBOX7C0)-(EUBOX0C1+EUBOX1C1+EUBOX2C1+EUBOX3C1+EUBOX4C1+EUBOX5C1+EUBOX6C1+EUBOX7C1))+((EDBOX0C1+EDBOX1C1+EDBOX2C1+EDBOX3C1+EDBOX4C1+EDBOX5C1+EDBOX6C1+EDBOX7C1)-(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0)))*64.0
+DDR Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0)*64.0/time
+DDR Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0)*64.0
+DDR Memory writeback bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0/time
+DDR Memory writeback data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0
+DDR Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0/time
+DDR Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0
+
+
+LONG
+Formulas:
+MCDRAM Memory read bandwidth [MBytes/s] = 1.0E-06*(sum(EDC_RPQ_INSERTS))*64/time
+MCDRAM Memory read data volume [GBytes] = 1.0E-09*(sum(EDC_RPQ_INSERTS))*64
+MCDRAM Memory writeback bandwidth [MBytes/s] = 1.0E-06*(sum(EDC_WPQ_INSERTS))*64/time
+MCDRAM Memory writeback data volume [GBytes] = 1.0E-09*(sum(EDC_WPQ_INSERTS))*64
+MCDRAM Memory bandwidth [MBytes/s] = 1.0E-06*(sum(EDC_RPQ_INSERTS)+sum(EDC_WPQ_INSERTS))*64/time
+MCDRAM Memory data volume [GBytes] = 1.0E-09*(sum(EDC_RPQ_INSERTS)+sum(EDC_WPQ_INSERTS))*64
+DDR Memory read bandwidth [MBytes/s] = 1.0E-06*(sum(MC_CAS_READS))*64/time
+DDR Memory read data volume [GBytes] = 1.0E-09*(sum(MC_CAS_READS))*64
+DDR Memory writeback bandwidth [MBytes/s] = 1.0E-06*(sum(MC_CAS_WRITES))*64/time
+DDR Memory writeback data volume [GBytes] = 1.0E-09*(sum(MC_CAS_WRITES))*64
+DDR Memory bandwidth [MBytes/s] = 1.0E-06*(sum(MC_CAS_READS)+sum(MC_CAS_WRITES))*64/time
+DDR Memory data volume [GBytes] = 1.0E-09*(sum(MC_CAS_READS)+sum(MC_CAS_WRITES))*64
+-
+Profiling group to measure data transfers from and to the high bandwidth memory (HBM).
diff --git a/groups/knl/HBM_OFFCORE.txt b/groups/knl/HBM_OFFCORE.txt
index 268344d..87769f0 100644
--- a/groups/knl/HBM_OFFCORE.txt
+++ b/groups/knl/HBM_OFFCORE.txt
@@ -12,21 +12,22 @@ Runtime (RDTSC) [s] time
 Runtime unhalted [s] FIXC1*inverseClock
 Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
-Memory read bandwidth [MBytes/s] 1.0E-06*(PMC1:MATCH0=0x32F7:MATCH1=0x3F8060)*64.0/time
-Memory read data volume [GBytes] 1.0E-09*(PMC1:MATCH0=0x32F7:MATCH1=0x3F8060)*64.0
-Memory writeback bandwidth [MBytes/s] 1.0E-06*(PMC0:MATCH0=0x4908:MATCH1=0x3F8060)*64.0/time
-Memory writeback data volume [GBytes] 1.0E-09*(PMC0:MATCH0=0x4908:MATCH1=0x3F8060)*64.0
-Memory bandwidth [MBytes/s] 1.0E-06*(PMC0:MATCH0=0x4908:MATCH1=0x3F8060+PMC1:MATCH0=0x32F7:MATCH1=0x3F8060)*64.0/time
-Memory data volume [GBytes] 1.0E-09*(PMC0:MATCH0=0x4908:MATCH1=0x3F8060+PMC1:MATCH0=0x32F7:MATCH1=0x3F8060)*64.0
+Memory read bandwidth [MBytes/s] 1.0E-06*(PMC1)*64.0/time
+Memory read data volume [GBytes] 1.0E-09*(PMC1)*64.0
+Memory writeback bandwidth [MBytes/s] 1.0E-06*(PMC0)*64.0/time
+Memory writeback data volume [GBytes] 1.0E-09*(PMC0)*64.0
+Memory bandwidth [MBytes/s] 1.0E-06*(PMC0+PMC1)*64.0/time
+Memory data volume [GBytes] 1.0E-09*(PMC0+PMC1)*64.0
 
 LONG
 Formulas:
-Memory read bandwidth [MBytes/s] = 1.0E-06*(sum(EDC_RPQ_INSERTS))*64/time
-Memory read data volume [GBytes] = 1.0E-09*(sum(EDC_RPQ_INSERTS))*64
-Memory writeback bandwidth [MBytes/s] = 1.0E-06*(sum(EDC_WPQ_INSERTS))*64/time
-Memory writeback data volume [GBytes] = 1.0E-09*(sum(EDC_WPQ_INSERTS))*64
-Memory bandwidth [MBytes/s] = 1.0E-06*(sum(EDC_RPQ_INSERTS)+sum(EDC_WPQ_INSERTS))*64/time
-Memory data volume [GBytes] = 1.0E-09*(sum(EDC_RPQ_INSERTS)+sum(EDC_WPQ_INSERTS))*64
+Memory read bandwidth [MBytes/s] = 1.0E-06*(sum(OFFCORE_RESPONSE_1_OPTIONS:MATCH0=0x32F7:MATCH1=0x3F8060))*64/time
+Memory read data volume [GBytes] = 1.0E-09*(sum(OFFCORE_RESPONSE_1_OPTIONS:MATCH0=0x32F7:MATCH1=0x3F8060))*64
+Memory writeback bandwidth [MBytes/s] = 1.0E-06*(sum(OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x4908:MATCH1=0x3F8060))*64/time
+Memory writeback data volume [GBytes] = 1.0E-09*(sum(OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x4908:MATCH1=0x3F8060))*64
+Memory bandwidth [MBytes/s] = 1.0E-06*(sum(OFFCORE_RESPONSE_1_OPTIONS:MATCH0=0x32F7:MATCH1=0x3F8060)+sum(OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x4908:MATCH1=0x3F8060))*64/time
+Memory data volume [GBytes] = 1.0E-09*(sum(OFFCORE_RESPONSE_1_OPTIONS:MATCH0=0x32F7:MATCH1=0x3F8060)+sum(OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x4908:MATCH1=0x3F8060))*64
 -
 Profiling group to measure data transfers from and to the high bandwidth memory (HBM).
+If possible, use the HBM or HBM_CACHE group because they provide more accurate counts.
 
diff --git a/groups/knl/L2.txt b/groups/knl/L2.txt
new file mode 100644
index 0000000..267b090
--- /dev/null
+++ b/groups/knl/L2.txt
@@ -0,0 +1,36 @@
+SHORT L2 cache bandwidth in MBytes/s
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  L2_REQUESTS_REFERENCE
+PMC1:MATCH0=0x0002:MATCH1=0x1 OFFCORE_RESPONSE_0_OPTIONS
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+L2 non-RFO bandwidth [MBytes/s] 1.E-06*(PMC0)*64.0/time
+L2 non-RFO data volume [GByte] 1.E-09*PMC0*64.0
+L2 RFO bandwidth [MBytes/s] 1.E-06*(PMC1)*64.0/time
+L2 RFO data volume [GByte] 1.E-09*(PMC1)*64.0
+L2 bandwidth [MBytes/s] 1.E-06*(PMC0+PMC1)*64.0/time
+L2 data volume [GByte] 1.E-06*(PMC0+PMC1)*64.0
+
+LONG
+Formula:
+L2 non-RFO bandwidth [MBytes/s] = 1.E-06*L2_REQUESTS_REFERENCE*64.0/time
+L2 non-RFO data volume [GByte] = 1.E-09*L2_REQUESTS_REFERENCE*64.0
+L2 RFO bandwidth [MBytes/s] = 1.E-06*(OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x0002:MATCH1=0x1)*64.0/time
+L2 RFO data volume [GByte] = 1.E-09*(OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x0002:MATCH1=0x1)*64.0
+L2 bandwidth [MBytes/s] = 1.E-06*(L2_REQUESTS_REFERENCE+OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x0002:MATCH1=0x1)*64.0/time
+L2 data volume [GByte] = 1.E-09*(L2_REQUESTS_REFERENCE+OFFCORE_RESPONSE_0_OPTIONS:MATCH0=0x0002:MATCH1=0x1)*64.0
+--
+The L2 bandwidth and data volume does not contain RFOs (also called
+write-allocates). The RFO bandwidth and data volume is only accurate when all
+used data fits in the L2 cache. As soon as the data exceeds the L2 cache size,
+the RFO metrics are too high.
+Moreover, with increasing count of measured cores, the non-RFO metrics overcount
+but commonly stay withing 10% error.
diff --git a/groups/knl/MEM.txt b/groups/knl/MEM.txt
index dc7188d..0e53431 100644
--- a/groups/knl/MEM.txt
+++ b/groups/knl/MEM.txt
@@ -10,28 +10,24 @@ MBOX1C0 MC_CAS_READS
 MBOX1C1 MC_CAS_WRITES
 MBOX2C0 MC_CAS_READS
 MBOX2C1 MC_CAS_WRITES
-MBOX3C0 MC_CAS_READS
-MBOX3C1 MC_CAS_WRITES
 MBOX4C0 MC_CAS_READS
 MBOX4C1 MC_CAS_WRITES
 MBOX5C0 MC_CAS_READS
 MBOX5C1 MC_CAS_WRITES
 MBOX6C0 MC_CAS_READS
 MBOX6C1 MC_CAS_WRITES
-MBOX7C0 MC_CAS_READS
-MBOX7C1 MC_CAS_WRITES
 
 METRICS
 Runtime (RDTSC) [s] time
 Runtime unhalted [s] FIXC1*inverseClock
 Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
-Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0)*64.0/time
-Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0)*64.0
-Memory writeback bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0/time
-Memory writeback data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0
-Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0/time
-Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0
+Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0)*64.0/time
+Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0)*64.0
+Memory writeback bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0/time
+Memory writeback data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0
+Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0/time
+Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX4C1+MBOX5C1+MBOX6C1)*64.0
 
 LONG
 Formulas:
diff --git a/groups/sandybridge/L3CACHE.txt b/groups/sandybridge/L3CACHE.txt
index 3926518..3dbb6cc 100644
--- a/groups/sandybridge/L3CACHE.txt
+++ b/groups/sandybridge/L3CACHE.txt
@@ -13,9 +13,9 @@ Runtime (RDTSC) [s] time
 Runtime unhalted [s] FIXC1*inverseClock
 Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
-L3 request rate PMC1:MATCH0=0x0081:MATCH1=0x1/FIXC0
-L3 miss rate PMC0:MATCH0=0x0081:MATCH1=0x3fffc0/FIXC0
-L3 miss ratio PMC0:MATCH0=0x0081:MATCH1=0x3fffc0/PMC1:MATCH0=0x0081:MATCH1=0x1
+L3 request rate PMC1/FIXC0
+L3 miss rate PMC0/FIXC0
+L3 miss ratio PMC0/PMC1
 
 LONG
 Formulas:
diff --git a/groups/sandybridge/UOPS_EXEC.txt b/groups/sandybridge/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/sandybridge/UOPS_EXEC.txt
+++ b/groups/sandybridge/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/sandybridge/UOPS_ISSUE.txt b/groups/sandybridge/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/sandybridge/UOPS_ISSUE.txt
+++ b/groups/sandybridge/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/sandybridge/UOPS_RETIRE.txt b/groups/sandybridge/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/sandybridge/UOPS_RETIRE.txt
+++ b/groups/sandybridge/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/sandybridgeEP/CACHES.txt b/groups/sandybridgeEP/CACHES.txt
index 60ecce5..b7ca833 100644
--- a/groups/sandybridgeEP/CACHES.txt
+++ b/groups/sandybridgeEP/CACHES.txt
@@ -50,12 +50,12 @@ L2 to L3 evict bandwidth [MBytes/s]  1.0E-06*PMC3*64.0/time
 L2 to L3 evict data volume [GBytes]  1.0E-09*PMC3*64.0
 L2 to/from L3 bandwidth [MBytes/s] 1.0E-06*(PMC2+PMC3)*64.0/time
 L2 to/from L3 data volume [GBytes] 1.0E-09*(PMC2+PMC3)*64.0
-System to L3 bandwidth [MBytes/s] 1.0E-06*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F)*64.0/time
-System to L3 data volume [GBytes] 1.0E-09*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F)*64.0
+System to L3 bandwidth [MBytes/s] 1.0E-06*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0)*64.0/time
+System to L3 data volume [GBytes] 1.0E-09*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0)*64.0
 L3 to system bandwidth [MBytes/s] 1.0E-06*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1)*64.0/time
 L3 to system data volume [GBytes] 1.0E-09*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1)*64.0
-L3 to/from system bandwidth [MBytes/s] 1.0E-06*(CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1)*64.0/time
-L3 to/from system data volume [GBytes] 1.0E-09*(CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C0:STATE=0x3F+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1)*64.0
+L3 to/from system bandwidth [MBytes/s] 1.0E-06*(CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1)*64.0/time
+L3 to/from system data volume [GBytes] 1.0E-09*(CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C0+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1)*64.0
 Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0)*64.0/time
 Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0)*64.0
 Memory write bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1)*64.0/time
diff --git a/groups/sandybridgeEP/L3CACHE.txt b/groups/sandybridgeEP/L3CACHE.txt
index 3926518..3dbb6cc 100644
--- a/groups/sandybridgeEP/L3CACHE.txt
+++ b/groups/sandybridgeEP/L3CACHE.txt
@@ -13,9 +13,9 @@ Runtime (RDTSC) [s] time
 Runtime unhalted [s] FIXC1*inverseClock
 Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
-L3 request rate PMC1:MATCH0=0x0081:MATCH1=0x1/FIXC0
-L3 miss rate PMC0:MATCH0=0x0081:MATCH1=0x3fffc0/FIXC0
-L3 miss ratio PMC0:MATCH0=0x0081:MATCH1=0x3fffc0/PMC1:MATCH0=0x0081:MATCH1=0x1
+L3 request rate PMC1/FIXC0
+L3 miss rate PMC0/FIXC0
+L3 miss ratio PMC0/PMC1
 
 LONG
 Formulas:
diff --git a/groups/sandybridgeEP/UOPS_EXEC.txt b/groups/sandybridgeEP/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/sandybridgeEP/UOPS_EXEC.txt
+++ b/groups/sandybridgeEP/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/sandybridgeEP/UOPS_ISSUE.txt b/groups/sandybridgeEP/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/sandybridgeEP/UOPS_ISSUE.txt
+++ b/groups/sandybridgeEP/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/sandybridgeEP/UOPS_RETIRE.txt b/groups/sandybridgeEP/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/sandybridgeEP/UOPS_RETIRE.txt
+++ b/groups/sandybridgeEP/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/skylake/UOPS_EXEC.txt b/groups/skylake/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/skylake/UOPS_EXEC.txt
+++ b/groups/skylake/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/skylake/UOPS_ISSUE.txt b/groups/skylake/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/skylake/UOPS_ISSUE.txt
+++ b/groups/skylake/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/skylake/UOPS_RETIRE.txt b/groups/skylake/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/skylake/UOPS_RETIRE.txt
+++ b/groups/skylake/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/skylakeX/BRANCH.txt b/groups/skylakeX/BRANCH.txt
new file mode 100644
index 0000000..b8d41b2
--- /dev/null
+++ b/groups/skylakeX/BRANCH.txt
@@ -0,0 +1,31 @@
+SHORT Branch prediction miss rate/ratio
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  BR_INST_RETIRED_ALL_BRANCHES
+PMC1  BR_MISP_RETIRED_ALL_BRANCHES
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+Branch rate   PMC0/FIXC0
+Branch misprediction rate  PMC1/FIXC0
+Branch misprediction ratio  PMC1/PMC0
+Instructions per branch  FIXC0/PMC0
+
+LONG
+Formulas:
+Branch rate = BR_INST_RETIRED_ALL_BRANCHES/INSTR_RETIRED_ANY
+Branch misprediction rate =  BR_MISP_RETIRED_ALL_BRANCHES/INSTR_RETIRED_ANY
+Branch misprediction ratio = BR_MISP_RETIRED_ALL_BRANCHES/BR_INST_RETIRED_ALL_BRANCHES
+Instructions per branch = INSTR_RETIRED_ANY/BR_INST_RETIRED_ALL_BRANCHES
+-
+The rates state how often on average a branch or a mispredicted branch occurred
+per instruction retired in total. The branch misprediction ratio sets directly
+into relation what ratio of all branch instruction where mispredicted.
+Instructions per branch is 1/branch rate.
+
diff --git a/groups/ivybridgeEP/CACHES.txt b/groups/skylakeX/CACHES.txt
similarity index 51%
copy from groups/ivybridgeEP/CACHES.txt
copy to groups/skylakeX/CACHES.txt
index c31b38c..28db726 100644
--- a/groups/ivybridgeEP/CACHES.txt
+++ b/groups/skylakeX/CACHES.txt
@@ -7,22 +7,7 @@ FIXC2 CPU_CLK_UNHALTED_REF
 PMC0  L1D_REPLACEMENT
 PMC1  L1D_M_EVICT
 PMC2  L2_LINES_IN_ALL
-PMC3  L2_LINES_OUT_DIRTY_ALL
-CBOX0C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX1C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX2C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX3C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX4C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX5C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX6C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX7C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX8C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX9C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX10C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX11C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX12C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX13C0:STATE=0x3F LLC_LOOKUP_DATA_READ
-CBOX14C0:STATE=0x3F LLC_LOOKUP_DATA_READ
+PMC3  L2_TRANS_L2_WB
 CBOX0C1 LLC_VICTIMS_M_STATE
 CBOX1C1 LLC_VICTIMS_M_STATE
 CBOX2C1 LLC_VICTIMS_M_STATE
@@ -38,6 +23,48 @@ CBOX11C1 LLC_VICTIMS_M_STATE
 CBOX12C1 LLC_VICTIMS_M_STATE
 CBOX13C1 LLC_VICTIMS_M_STATE
 CBOX14C1 LLC_VICTIMS_M_STATE
+CBOX15C1 LLC_VICTIMS_M_STATE
+CBOX16C1 LLC_VICTIMS_M_STATE
+CBOX17C1 LLC_VICTIMS_M_STATE
+CBOX18C1 LLC_VICTIMS_M_STATE
+CBOX19C1 LLC_VICTIMS_M_STATE
+CBOX20C1 LLC_VICTIMS_M_STATE
+CBOX21C1 LLC_VICTIMS_M_STATE
+CBOX22C1 LLC_VICTIMS_M_STATE
+CBOX23C1 LLC_VICTIMS_M_STATE
+CBOX24C1 LLC_VICTIMS_M_STATE
+CBOX25C1 LLC_VICTIMS_M_STATE
+CBOX26C1 LLC_VICTIMS_M_STATE
+CBOX27C1 LLC_VICTIMS_M_STATE
+CBOX0C0 LLC_LOOKUP_DATA_READ
+CBOX1C0 LLC_LOOKUP_DATA_READ
+CBOX2C0 LLC_LOOKUP_DATA_READ
+CBOX3C0 LLC_LOOKUP_DATA_READ
+CBOX4C0 LLC_LOOKUP_DATA_READ
+CBOX5C0 LLC_LOOKUP_DATA_READ
+CBOX6C0 LLC_LOOKUP_DATA_READ
+CBOX7C0 LLC_LOOKUP_DATA_READ
+CBOX8C0 LLC_LOOKUP_DATA_READ
+CBOX9C0 LLC_LOOKUP_DATA_READ
+CBOX10C0 LLC_LOOKUP_DATA_READ
+CBOX11C0 LLC_LOOKUP_DATA_READ
+CBOX12C0 LLC_LOOKUP_DATA_READ
+CBOX13C0 LLC_LOOKUP_DATA_READ
+CBOX14C0 LLC_LOOKUP_DATA_READ
+CBOX15C0 LLC_LOOKUP_DATA_READ
+CBOX16C0 LLC_LOOKUP_DATA_READ
+CBOX17C0 LLC_LOOKUP_DATA_READ
+CBOX18C0 LLC_LOOKUP_DATA_READ
+CBOX19C0 LLC_LOOKUP_DATA_READ
+CBOX20C0 LLC_LOOKUP_DATA_READ
+CBOX21C0 LLC_LOOKUP_DATA_READ
+CBOX22C0 LLC_LOOKUP_DATA_READ
+CBOX23C0 LLC_LOOKUP_DATA_READ
+CBOX24C0 LLC_LOOKUP_DATA_READ
+CBOX25C0 LLC_LOOKUP_DATA_READ
+CBOX26C0 LLC_LOOKUP_DATA_READ
+CBOX27C0 LLC_LOOKUP_DATA_READ
+CBOX28C0 LLC_LOOKUP_DATA_READ
 MBOX0C0 CAS_COUNT_RD
 MBOX0C1 CAS_COUNT_WR
 MBOX1C0 CAS_COUNT_RD
@@ -50,10 +77,6 @@ MBOX4C0 CAS_COUNT_RD
 MBOX4C1 CAS_COUNT_WR
 MBOX5C0 CAS_COUNT_RD
 MBOX5C1 CAS_COUNT_WR
-MBOX6C0 CAS_COUNT_RD
-MBOX6C1 CAS_COUNT_WR
-MBOX7C0 CAS_COUNT_RD
-MBOX7C1 CAS_COUNT_WR
 
 
 
@@ -74,18 +97,18 @@ L2 to L3 evict bandwidth [MBytes/s]  1.0E-06*PMC3*64.0/time
 L2 to L3 evict data volume [GBytes]  1.0E-09*PMC3*64.0
 L2 to/from L3 bandwidth [MBytes/s] 1.0E-06*(PMC2+PMC3)*64.0/time
 L2 to/from L3 data volume [GBytes] 1.0E-09*(PMC2+PMC3)*64.0
-System to L3 bandwidth [MBytes/s] 1.0E-06*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F)*64.0/time
-System to L3 data volume [GBytes] 1.0E-09*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F)*64.0
-L3 to memory bandwidth [MBytes/s] 1.0E-06*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64/time
-L3 to memory data volume [GBytes] 1.0E-09*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64
-L3 to/from system bandwidth [MBytes/s] 1.0E-06*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64.0/time
-L3 to/from system data volume [GBytes] 1.0E-09*(CBOX0C0:STATE=0x3F+CBOX1C0:STATE=0x3F+CBOX2C0:STATE=0x3F+CBOX3C0:STATE=0x3F+CBOX4C0:STATE=0x3F+CBOX5C0:STATE=0x3F+CBOX6C0:STATE=0x3F+CBOX7C0:STATE=0x3F+CBOX8C0:STATE=0x3F+CBOX9C0:STATE=0x3F+CBOX10C0:STATE=0x3F+CBOX11C0:STATE=0x3F+CBOX12C0:STATE=0x3F+CBOX13C0:STATE=0x3F+CBOX14C0:STATE=0x3F+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1)*64.0
-Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0)*64.0/time
-Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0)*64.0
-Memory write bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0/time
-Memory write data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0
-Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0/time
-Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX6C0+MBOX7C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1+MBOX6C1+MBOX7C1)*64.0
+System to L3 bandwidth [MBytes/s] 1.0E-06*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0+CBOX15C0+CBOX16C0+CBOX17C0+CBOX18C0+CBOX19C0+CBOX20C0+CBOX21C0+CBOX22C0+CBOX23C0+CBOX24C0+CBOX25C0+CBOX26C0+CBOX27C0)*64.0/time
+System to L3 data volume [GBytes] 1.0E-09*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0+CBOX15C0+CBOX16C0+CBOX17C0+CBOX18C0+CBOX19C0+CBOX20C0+CBOX21C0+CBOX22C0+CBOX23C0+CBOX24C0+CBOX25C0+CBOX26C0+CBOX27C0)*64.0
+L3 to system bandwidth [MBytes/s] 1.0E-06*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1+CBOX15C1+CBOX16C1+CBOX17C1+CBOX18C1+CBOX19C1+CBOX20C1+CBOX21C1+CBOX22C1+CBOX23C1+CBOX24C1+CBOX25C1+CBOX26C1+CBOX27C1)*64/time
+L3 to system data volume [GBytes] 1.0E-09*(CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1+CBOX15C1+CBOX16C1+CBOX17C1+CBOX18C1+CBOX19C1+CBOX20C1+CBOX21C1+CBOX22C1+CBOX23C1+CBOX24C1+CBOX25C1+CBOX26C1+CBOX27C1)*64
+L3 to/from system bandwidth [MBytes/s] 1.0E-06*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0+CBOX15C0+CBOX16C0+CBOX17C0+CBOX18C0+CBOX19C0+CBOX20C0+CBOX21C0+CBOX22C0+CBOX23C0+CBOX24C0+CBOX25C0+CBOX26C0+CBOX27C0+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1+CBOX15C1+CBOX16C1+CBOX17C1+CBOX18C1+CBOX19C1+CBOX20C1+CBOX21C1+CBOX22C1+CBOX2 [...]
+L3 to/from system data volume [GBytes] 1.0E-09*(CBOX0C0+CBOX1C0+CBOX2C0+CBOX3C0+CBOX4C0+CBOX5C0+CBOX6C0+CBOX7C0+CBOX8C0+CBOX9C0+CBOX10C0+CBOX11C0+CBOX12C0+CBOX13C0+CBOX14C0+CBOX15C0+CBOX16C0+CBOX17C0+CBOX18C0+CBOX19C0+CBOX20C0+CBOX21C0+CBOX22C0+CBOX23C0+CBOX24C0+CBOX25C0+CBOX26C0+CBOX27C0+CBOX0C1+CBOX1C1+CBOX2C1+CBOX3C1+CBOX4C1+CBOX5C1+CBOX6C1+CBOX7C1+CBOX8C1+CBOX9C1+CBOX10C1+CBOX11C1+CBOX12C1+CBOX13C1+CBOX14C1+CBOX15C1+CBOX16C1+CBOX17C1+CBOX18C1+CBOX19C1+CBOX20C1+CBOX21C1+CBOX22C1+CBOX2 [...]
+Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0/time
+Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0
+Memory write bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory write data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
+Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
 
 LONG
 Formulas:
@@ -101,15 +124,15 @@ L2 to L3 evict bandwidth [MBytes/s] = 1.0E-06*L2_TRANS_L2_WB*64/time
 L2 to L3 evict data volume [GBytes] = 1.0E-09*L2_TRANS_L2_WB*64
 L2 to/from L3 bandwidth [MBytes/s] = 1.0E-06*(L2_LINES_IN_ALL+L2_TRANS_L2_WB)*64/time
 L2 to/from L3 data volume [GBytes] = 1.0E-09*(L2_LINES_IN_ALL+L2_TRANS_L2_WB)*64
-System to L3 bandwidth [MBytes/s] = 1.0E-06*(SUM(LLC_LOOKUP_DATA_READ:STATE=0x3F))*64/time
-System to L3 data volume [GBytes] = 1.0E-09*(SUM(LLC_LOOKUP_DATA_READ:STATE=0x3F))*64
+System to L3 bandwidth [MBytes/s] = 1.0E-06*(SUM(LLC_LOOKUP_DATA_READ))*64/time
+System to L3 data volume [GBytes] = 1.0E-09*(SUM(LLC_LOOKUP_DATA_READ))*64
 L3 to system bandwidth [MBytes/s] = 1.0E-06*(SUM(LLC_VICTIMS_M_STATE))*64/time
 L3 to system data volume [GBytes] = 1.0E-09*(SUM(LLC_VICTIMS_M_STATE))*64
-L3 to/from system bandwidth [MBytes/s] = 1.0E-06*(SUM(LLC_LOOKUP_DATA_READ:STATE=0x3F)+SUM(LLC_VICTIMS_M_STATE))*64/time
-L3 to/from system data volume [GBytes] = 1.0E-09*(SUM(LLC_LOOKUP_DATA_READ:STATE=0x3F)+SUM(LLC_VICTIMS_M_STATE))*64
+L3 to/from system bandwidth [MBytes/s] = 1.0E-06*(SUM(LLC_LOOKUP_DATA_READ)+SUM(LLC_VICTIMS_M_STATE))*64/time
+L3 to/from system data volume [GBytes] = 1.0E-09*(SUM(LLC_LOOKUP_DATA_READ)+SUM(LLC_VICTIMS_M_STATE))*64
 Memory read bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_RD))*64.0/time
 Memory read data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_RD))*64.0
-Memory write bandwidth [MBytes/s] 1.0E-06*(SUM(CAS_COUNT_WR))*64.0/time
+Memory write bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_WR))*64.0/time
 Memory write data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_WR))*64.0
 Memory bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0/time
 Memory data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0
diff --git a/groups/skylakeX/CLOCK.txt b/groups/skylakeX/CLOCK.txt
new file mode 100644
index 0000000..5ff9f69
--- /dev/null
+++ b/groups/skylakeX/CLOCK.txt
@@ -0,0 +1,26 @@
+SHORT Power and Energy consumption
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PWR0  PWR_PKG_ENERGY
+UBOXFIX UNCORE_CLOCK
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+Uncore Clock [MHz] 1.E-06*UBOXFIX/time
+CPI  FIXC1/FIXC0
+Energy [J]  PWR0
+Power [W] PWR0/time
+
+LONG
+Formula:
+Power =  PWR_PKG_ENERGY / time
+Uncore Clock [MHz] = 1.E-06 * UNCORE_CLOCK / time
+-
+Broadwell implements the new RAPL interface. This interface enables to
+monitor the consumed energy on the package (socket) level.
+
diff --git a/groups/skylakeX/DATA.txt b/groups/skylakeX/DATA.txt
new file mode 100644
index 0000000..6955eb7
--- /dev/null
+++ b/groups/skylakeX/DATA.txt
@@ -0,0 +1,22 @@
+SHORT Load to store ratio
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  MEM_UOPS_RETIRED_LOADS_ALL
+PMC1  MEM_UOPS_RETIRED_STORES_ALL
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+Load to store ratio PMC0/PMC1
+
+LONG
+Formulas:
+Load to store ratio = MEM_UOPS_RETIRED_LOADS_ALL/MEM_UOPS_RETIRED_STORES_ALL
+-
+This is a metric to determine your load to store ratio.
+
diff --git a/groups/skylakeX/ENERGY.txt b/groups/skylakeX/ENERGY.txt
new file mode 100644
index 0000000..28f0256
--- /dev/null
+++ b/groups/skylakeX/ENERGY.txt
@@ -0,0 +1,35 @@
+SHORT Power and Energy consumption
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+TMP0  TEMP_CORE
+PWR0  PWR_PKG_ENERGY
+PWR1  PWR_PP0_ENERGY
+PWR3  PWR_DRAM_ENERGY
+
+
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+Temperature [C]  TMP0
+Energy [J]  PWR0
+Power [W] PWR0/time
+Energy PP0 [J]  PWR1
+Power PP0 [W] PWR1/time
+Energy DRAM [J]  PWR3
+Power DRAM [W] PWR3/time
+
+LONG
+Formula:
+Power = PWR_PKG_ENERGY / time
+Power PP0 = PWR_PP0_ENERGY / time
+Power DRAM = PWR_DRAM_ENERGY / time
+-
+Broadwell implements the new RAPL interface. This interface enables to
+monitor the consumed energy on the package (socket)  and DRAM level.
+
diff --git a/groups/skylakeX/FLOPS_AVX.txt b/groups/skylakeX/FLOPS_AVX.txt
new file mode 100644
index 0000000..d3ea800
--- /dev/null
+++ b/groups/skylakeX/FLOPS_AVX.txt
@@ -0,0 +1,26 @@
+SHORT Packed AVX MFLOP/s
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE
+PMC1  FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE
+PMC2  FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE
+PMC3  FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+Packed SP MFLOP/s  1.0E-06*(PMC0*8.0+PMC2*16.0)/time
+Packed DP MFLOP/s  1.0E-06*(PMC1*4.0+PMC3*8.0)/time
+
+LONG
+Formula:
+Packed SP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE*8+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE*16)/runtime
+Packed DP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE*4+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE*16)/runtime
+-
+Packed 32b AVX FLOPs rates.
+
diff --git a/groups/skylakeX/FLOPS_DP.txt b/groups/skylakeX/FLOPS_DP.txt
new file mode 100644
index 0000000..65eaed5
--- /dev/null
+++ b/groups/skylakeX/FLOPS_DP.txt
@@ -0,0 +1,33 @@
+SHORT Double Precision MFLOP/s
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE
+PMC1  FP_ARITH_INST_RETIRED_SCALAR_DOUBLE
+PMC2  FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE
+PMC3  FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+DP MFLOP/s  1.0E-06*(PMC0*2.0+PMC1+PMC2*4.0+PMC3*8.0)/time
+AVX DP MFLOP/s  1.0E-06*(PMC2*4.0+PMC3*8.0)/time
+AVX512 DP MFLOP/s  1.0E-06*(PMC3*8.0)/time
+Packed MUOPS/s   1.0E-06*(PMC0+PMC2+PMC3)/time
+Scalar MUOPS/s 1.0E-06*PMC1/time
+
+LONG
+Formula:
+DP MFLOP/s =
+1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE*2+FP_ARITH_INST_RETIRED_SCALAR_DOUBLE+FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE*4+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE*8)/runtime
+AVX DP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE*4+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE*8)/runtime
+AVX512 DP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE*8)/runtime
+Packed MUOPS/s = 1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE+FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE)/runtime
+Scalar MUOPS/s = 1.0E-06*FP_ARITH_INST_RETIRED_SCALAR_DOUBLE/runtime
+-
+SSE scalar and packed double precision FLOP rates.
+
diff --git a/groups/skylakeX/FLOPS_SP.txt b/groups/skylakeX/FLOPS_SP.txt
new file mode 100644
index 0000000..125e830
--- /dev/null
+++ b/groups/skylakeX/FLOPS_SP.txt
@@ -0,0 +1,33 @@
+SHORT Single Precision MFLOP/s
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE
+PMC1  FP_ARITH_INST_RETIRED_SCALAR_SINGLE
+PMC2  FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE
+PMC2  FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+SP MFLOP/s  1.0E-06*(PMC0*4.0+PMC1+PMC2*8.0+PMC3*16.0)/time
+AVX SP MFLOP/s  1.0E-06*(PMC2*8.0+PMC3*16.0)/time
+AVX512 SP MFLOP/s  1.0E-06*(PMC3*16.0)/time
+Packed MUOPS/s   1.0E-06*(PMC0+PMC2+PMC3)/time
+Scalar MUOPS/s 1.0E-06*PMC1/time
+
+LONG
+Formula:
+SP MFLOP/s =
+1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE*4+FP_ARITH_INST_RETIRED_SCALAR_SINGLE+FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE*8+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE*16)/runtime
+AVX SP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE*8+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE*16)/runtime
+AVX512 SP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE*16)/runtime
+Packed MUOPS/s = 1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE+FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE)/runtime
+Scalar MUOPS/s = 1.0E-06*FP_ARITH_INST_RETIRED_SCALAR_SINGLE/runtime
+-
+SSE scalar and packed single precision FLOP rates.
+
diff --git a/groups/skylakeX/L2.txt b/groups/skylakeX/L2.txt
new file mode 100644
index 0000000..1a92a95
--- /dev/null
+++ b/groups/skylakeX/L2.txt
@@ -0,0 +1,38 @@
+SHORT L2 cache bandwidth in MBytes/s
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  L1D_REPLACEMENT
+PMC1  L1D_M_EVICT
+PMC2  ICACHE_64B_IFTAG_MISS
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+L2D load bandwidth [MBytes/s]  1.0E-06*PMC0*64.0/time
+L2D load data volume [GBytes]  1.0E-09*PMC0*64.0
+L2D evict bandwidth [MBytes/s]  1.0E-06*PMC1*64.0/time
+L2D evict data volume [GBytes]  1.0E-09*PMC1*64.0
+L2 bandwidth [MBytes/s] 1.0E-06*(PMC0+PMC1+PMC2)*64.0/time
+L2 data volume [GBytes] 1.0E-09*(PMC0+PMC1+PMC2)*64.0
+
+LONG
+Formulas:
+L2D load bandwidth [MBytes/s] = 1.0E-06*L1D_REPLACEMENT*64.0/time
+L2D load data volume [GBytes] = 1.0E-09*L1D_REPLACEMENT*64.0
+L2D evict bandwidth [MBytes/s] = 1.0E-06*L1D_M_EVICT*64.0/time
+L2D evict data volume [GBytes] = 1.0E-09*L1D_M_EVICT*64.0
+L2 bandwidth [MBytes/s] = 1.0E-06*(L1D_REPLACEMENT+L1D_M_EVICT+ICACHE_64B_IFTAG_MISS)*64/time
+L2 data volume [GBytes] = 1.0E-09*(L1D_REPLACEMENT+L1D_M_EVICT+ICACHE_64B_IFTAG_MISS)*64
+-
+Profiling group to measure L2 cache bandwidth. The bandwidth is computed by the
+number of cache line allocated in the L1 and the number of modified cache lines
+evicted from the L1. The group also output total data volume transferred between
+L2 and L1. Note that this bandwidth also includes data transfers due to a write
+allocate load on a store miss in L1 and traffic caused by misses in the
+L1 instruction cache.
+
diff --git a/groups/skylakeX/L2CACHE.txt b/groups/skylakeX/L2CACHE.txt
new file mode 100644
index 0000000..9b5dd4b
--- /dev/null
+++ b/groups/skylakeX/L2CACHE.txt
@@ -0,0 +1,34 @@
+SHORT L2 cache miss rate/ratio
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  L2_TRANS_ALL_REQUESTS
+PMC1  L2_RQSTS_MISS
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+L2 request rate PMC0/FIXC0
+L2 miss rate PMC1/FIXC0
+L2 miss ratio PMC1/PMC0
+
+LONG
+Formulas:
+L2 request rate = L2_TRANS_ALL_REQUESTS/INSTR_RETIRED_ANY
+L2 miss rate = L2_RQSTS_MISS/INSTR_RETIRED_ANY
+L2 miss ratio = L2_RQSTS_MISS/L2_TRANS_ALL_REQUESTS
+-
+This group measures the locality of your data accesses with regard to the
+L2 cache. L2 request rate tells you how data intensive your code is
+or how many data accesses you have on average per instruction.
+The L2 miss rate gives a measure how often it was necessary to get
+cache lines from memory. And finally L2 miss ratio tells you how many of your
+memory references required a cache line to be loaded from a higher level.
+While the# data cache miss rate might be given by your algorithm you should
+try to get data cache miss ratio as low as possible by increasing your cache reuse.
+
+
diff --git a/groups/skylakeX/L3.txt b/groups/skylakeX/L3.txt
new file mode 100644
index 0000000..98d1d9e
--- /dev/null
+++ b/groups/skylakeX/L3.txt
@@ -0,0 +1,36 @@
+SHORT  L3 cache bandwidth in MBytes/s
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  L2_LINES_IN_ALL
+PMC1  L2_TRANS_L2_WB
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+L3 load bandwidth [MBytes/s]  1.0E-06*PMC0*64.0/time
+L3 load data volume [GBytes]  1.0E-09*PMC0*64.0
+L3 evict bandwidth [MBytes/s]  1.0E-06*PMC1*64.0/time
+L3 evict data volume [GBytes]  1.0E-09*PMC1*64.0
+L3 bandwidth [MBytes/s] 1.0E-06*(PMC0+PMC1)*64.0/time
+L3 data volume [GBytes] 1.0E-09*(PMC0+PMC1)*64.0
+
+LONG
+Formulas:
+L3 load bandwidth [MBytes/s] = 1.0E-06*L2_LINES_IN_ALL*64.0/time
+L3 load data volume [GBytes] = 1.0E-09*L2_LINES_IN_ALL*64.0
+L3 evict bandwidth [MBytes/s] = 1.0E-06*L2_TRANS_L2_WB*64.0/time
+L3 evict data volume [GBytes] = 1.0E-09*L2_TRANS_L2_WB*64.0
+L3 bandwidth [MBytes/s] = 1.0E-06*(L2_LINES_IN_ALL+L2_TRANS_L2_WB)*64/time
+L3 data volume [GBytes] = 1.0E-09*(L2_LINES_IN_ALL+L2_TRANS_L2_WB)*64
+-
+Profiling group to measure L3 cache bandwidth. The bandwidth is computed by the
+number of cache line allocated in the L2 and the number of modified cache lines
+evicted from the L2. This group also output data volume transferred between the
+L3 and measured cores L2 caches. Note that this bandwidth also includes data
+transfers due to a write allocate load on a store miss in L2.
+
diff --git a/groups/skylakeX/L3CACHE.txt b/groups/skylakeX/L3CACHE.txt
new file mode 100644
index 0000000..f863daa
--- /dev/null
+++ b/groups/skylakeX/L3CACHE.txt
@@ -0,0 +1,35 @@
+SHORT L3 cache miss rate/ratio
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  MEM_LOAD_UOPS_RETIRED_L3_ALL
+PMC1  MEM_LOAD_UOPS_RETIRED_L3_MISS
+PMC2  UOPS_RETIRED_ALL
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+L3 request rate PMC0/PMC2
+L3 miss rate PMC1/PMC2
+L3 miss ratio PMC1/PMC0
+
+LONG
+Formulas:
+L3 request rate = MEM_LOAD_UOPS_RETIRED_L3_ALL/UOPS_RETIRED_ALL
+L3 miss rate = MEM_LOAD_UOPS_RETIRED_L3_MISS/UOPS_RETIRED_ALL
+L3 miss ratio = MEM_LOAD_UOPS_RETIRED_L3_MISS/MEM_LOAD_UOPS_RETIRED_L3_ALL
+-
+This group measures the locality of your data accesses with regard to the
+L3 cache. L3 request rate tells you how data intensive your code is
+or how many data accesses you have on average per instruction.
+The L3 miss rate gives a measure how often it was necessary to get
+cache lines from memory. And finally L3 miss ratio tells you how many of your
+memory references required a cache line to be loaded from a higher level.
+While the# data cache miss rate might be given by your algorithm you should
+try to get data cache miss ratio as low as possible by increasing your cache reuse.
+
+
diff --git a/groups/skylakeX/MEM.txt b/groups/skylakeX/MEM.txt
new file mode 100644
index 0000000..3d50ecb
--- /dev/null
+++ b/groups/skylakeX/MEM.txt
@@ -0,0 +1,48 @@
+SHORT Main memory bandwidth in MBytes/s
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+MBOX0C0 CAS_COUNT_RD
+MBOX0C1 CAS_COUNT_WR
+MBOX1C0 CAS_COUNT_RD
+MBOX1C1 CAS_COUNT_WR
+MBOX2C0 CAS_COUNT_RD
+MBOX2C1 CAS_COUNT_WR
+MBOX3C0 CAS_COUNT_RD
+MBOX3C1 CAS_COUNT_WR
+MBOX4C0 CAS_COUNT_RD
+MBOX4C1 CAS_COUNT_WR
+MBOX5C0 CAS_COUNT_RD
+MBOX5C1 CAS_COUNT_WR
+
+
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0/time
+Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0
+Memory write bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory write data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
+Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
+
+LONG
+Formulas:
+Memory read bandwidth [MBytes/s] = 1.0E-06*(SUM(MBOXxC0))*64.0/runtime
+Memory read data volume [GBytes] = 1.0E-09*(SUM(MBOXxC0))*64.0
+Memory write bandwidth [MBytes/s] = 1.0E-06*(SUM(MBOXxC1))*64.0/runtime
+Memory write data volume [GBytes] = 1.0E-09*(SUM(MBOXxC1))*64.0
+Memory bandwidth [MBytes/s] = 1.0E-06*(SUM(MBOXxC0)+SUM(MBOXxC1))*64.0/runtime
+Memory data volume [GBytes] = 1.0E-09*(SUM(MBOXxC0)+SUM(MBOXxC1))*64.0
+-
+Profiling group to measure memory bandwidth drawn by all cores of a socket.
+Since this group is based on Uncore events it is only possible to measure on a
+per socket base. Some of the counters may not be available on your system.
+Also outputs total data volume transferred from main memory.
+The same metrics are provided by the HA group.
+
diff --git a/groups/skylakeX/MEM_DP.txt b/groups/skylakeX/MEM_DP.txt
new file mode 100644
index 0000000..6b97565
--- /dev/null
+++ b/groups/skylakeX/MEM_DP.txt
@@ -0,0 +1,74 @@
+SHORT Overview of arithmetic and main memory performance
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PWR0  PWR_PKG_ENERGY
+PWR3  PWR_DRAM_ENERGY
+PMC0  FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE
+PMC1  FP_ARITH_INST_RETIRED_SCALAR_DOUBLE
+PMC2  FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE
+PMC3  FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE
+MBOX0C0 CAS_COUNT_RD
+MBOX0C1 CAS_COUNT_WR
+MBOX1C0 CAS_COUNT_RD
+MBOX1C1 CAS_COUNT_WR
+MBOX2C0 CAS_COUNT_RD
+MBOX2C1 CAS_COUNT_WR
+MBOX3C0 CAS_COUNT_RD
+MBOX3C1 CAS_COUNT_WR
+MBOX4C0 CAS_COUNT_RD
+MBOX4C1 CAS_COUNT_WR
+MBOX5C0 CAS_COUNT_RD
+MBOX5C1 CAS_COUNT_WR
+MBOX6C0 CAS_COUNT_RD
+MBOX6C1 CAS_COUNT_WR
+MBOX7C0 CAS_COUNT_RD
+MBOX7C1 CAS_COUNT_WR
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+Energy [J]  PWR0
+Power [W] PWR0/time
+Energy DRAM [J]  PWR3
+Power DRAM [W] PWR3/time
+DP MFLOP/s  1.0E-06*(PMC0*2.0+PMC1+PMC2*4.0+PMC3*8.0)/time
+AVX DP MFLOP/s  1.0E-06*(PMC2*4.0+PMC3*8.0)/time
+Packed MUOPS/s   1.0E-06*(PMC0+PMC2+PMC3)/time
+Scalar MUOPS/s 1.0E-06*PMC1/time
+Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0/time
+Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0
+Memory write bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory write data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
+Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
+Operational intensity (PMC0*2.0+PMC1+PMC2*4.0+PMC3*8.0)/((MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0)
+
+LONG
+Formula:
+Power [W] = PWR_PKG_ENERGY/runtime
+Power DRAM [W] = PWR_DRAM_ENERGY/runtime
+DP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE*2+FP_ARITH_INST_RETIRED_SCALAR_DOUBLE+FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE*4+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE*8)/runtime
+AVX DP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE*4+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE*8)/runtime
+Packed MUOPS/s = 1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE+FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE)/runtime
+Scalar MUOPS/s = 1.0E-06*FP_ARITH_INST_RETIRED_SCALAR_DOUBLE/runtime
+Memory read bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_RD))*64.0/runtime
+Memory read data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_RD))*64.0
+Memory write bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_WR))*64.0/runtime
+Memory write data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_WR))*64.0
+Memory bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0/runtime
+Memory data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0
+Operational intensity = (FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE*2+FP_ARITH_INST_RETIRED_SCALAR_DOUBLE+FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE*4+FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE*8)/(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0)
+--
+Profiling group to measure memory bandwidth drawn by all cores of a socket.
+Since this group is based on Uncore events it is only possible to measure on
+a per socket base. Also outputs total data volume transferred from main memory.
+SSE scalar and packed double precision FLOP rates. Also reports on packed AVX
+32b instructions.
+The operational intensity is calculated using the FP values of the cores and the
+memory data volume of the whole socket. The actual operational intensity for
+multiple CPUs can be found in the statistics table in the Sum column.
diff --git a/groups/skylakeX/MEM_SP.txt b/groups/skylakeX/MEM_SP.txt
new file mode 100644
index 0000000..79dabcc
--- /dev/null
+++ b/groups/skylakeX/MEM_SP.txt
@@ -0,0 +1,70 @@
+SHORT Overview of arithmetic and main memory performance
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PWR0  PWR_PKG_ENERGY
+PWR3  PWR_DRAM_ENERGY
+PMC0  FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE
+PMC1  FP_ARITH_INST_RETIRED_SCALAR_SINGLE
+PMC2  FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE
+PMC3  FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE
+MBOX0C0 CAS_COUNT_RD
+MBOX0C1 CAS_COUNT_WR
+MBOX1C0 CAS_COUNT_RD
+MBOX1C1 CAS_COUNT_WR
+MBOX2C0 CAS_COUNT_RD
+MBOX2C1 CAS_COUNT_WR
+MBOX3C0 CAS_COUNT_RD
+MBOX3C1 CAS_COUNT_WR
+MBOX4C0 CAS_COUNT_RD
+MBOX4C1 CAS_COUNT_WR
+MBOX5C0 CAS_COUNT_RD
+MBOX5C1 CAS_COUNT_WR
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+Energy [J]  PWR0
+Power [W] PWR0/time
+Energy DRAM [J]  PWR3
+Power DRAM [W] PWR3/time
+SP MFLOP/s  1.0E-06*(PMC0*4.0+PMC1+PMC2*8.0+PMC3*16.0)/time
+AVX SP MFLOP/s  1.0E-06*(PMC2*8.0+PMC3*16.0)/time
+Packed MUOPS/s   1.0E-06*(PMC0+PMC2+PMC3)/time
+Scalar MUOPS/s 1.0E-06*PMC1/time
+Memory read bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0/time
+Memory read data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0)*64.0
+Memory write bandwidth [MBytes/s] 1.0E-06*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory write data volume [GBytes] 1.0E-09*(MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
+Memory bandwidth [MBytes/s] 1.0E-06*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0/time
+Memory data volume [GBytes] 1.0E-09*(MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0
+Operational intensity (PMC0*4.0+PMC1+PMC2*8.0+PMC3*16.0)/((MBOX0C0+MBOX1C0+MBOX2C0+MBOX3C0+MBOX4C0+MBOX5C0+MBOX0C1+MBOX1C1+MBOX2C1+MBOX3C1+MBOX4C1+MBOX5C1)*64.0)
+
+LONG
+Formula:
+Power [W] = PWR_PKG_ENERGY/runtime
+Power DRAM [W] = PWR_DRAM_ENERGY/runtime
+SP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE*4+FP_ARITH_INST_RETIRED_SCALAR_SINGLE+FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE*8+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE*16)/runtime
+AVX SP MFLOP/s = 1.0E-06*(FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE*8+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE*16)/runtime
+Packed MUOPS/s = 1.0E-06*(FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE+FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE)/runtime
+Scalar MUOPS/s = 1.0E-06*FP_ARITH_INST_RETIRED_SCALAR_SINGLE/runtime
+Memory read bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_RD))*64.0/runtime
+Memory read data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_RD))*64.0
+Memory write bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_WR))*64.0/runtime
+Memory write data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_WR))*64.0
+Memory bandwidth [MBytes/s] = 1.0E-06*(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0/runtime
+Memory data volume [GBytes] = 1.0E-09*(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0
+Operational intensity = (FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE*4+FP_ARITH_INST_RETIRED_SCALAR_SINGLE+FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE*8+FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE*16)/(SUM(CAS_COUNT_RD)+SUM(CAS_COUNT_WR))*64.0)
+--
+Profiling group to measure memory bandwidth drawn by all cores of a socket.
+Since this group is based on Uncore events it is only possible to measure on
+a per socket base. Also outputs total data volume transferred from main memory.
+SSE scalar and packed single precision FLOP rates. Also reports on packed AVX
+32b instructions.
+The operational intensity is calculated using the FP values of the cores and the
+memory data volume of the whole socket. The actual operational intensity for
+multiple CPUs can be found in the statistics table in the Sum column.
diff --git a/groups/skylakeX/TLB_DATA.txt b/groups/skylakeX/TLB_DATA.txt
new file mode 100644
index 0000000..89841d5
--- /dev/null
+++ b/groups/skylakeX/TLB_DATA.txt
@@ -0,0 +1,35 @@
+SHORT  L2 data TLB miss rate/ratio
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  DTLB_LOAD_MISSES_CAUSES_A_WALK
+PMC1  DTLB_STORE_MISSES_CAUSES_A_WALK
+PMC2  DTLB_LOAD_MISSES_WALK_DURATION
+PMC3  DTLB_STORE_MISSES_WALK_DURATION
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+L1 DTLB load misses     PMC0
+L1 DTLB load miss rate  PMC0/FIXC0
+L1 DTLB load miss duration PMC2
+L1 DTLB store misses     PMC1
+L1 DTLB store miss rate  PMC1/FIXC0
+L1 DTLB store miss duration PMC3
+
+LONG
+Formulas:
+L1 DTLB load misses     DTLB_LOAD_MISSES_CAUSES_A_WALK
+L1 DTLB load miss rate  DTLB_LOAD_MISSES_CAUSES_A_WALK / INSTR_RETIRED_ANY
+L1 DTLB load miss duration DTLB_LOAD_MISSES_WALK_DURATION
+L1 DTLB store misses     DTLB_STORE_MISSES_CAUSES_A_WALK
+L1 DTLB store miss rate  DTLB_STORE_MISSES_CAUSES_A_WALK / INSTR_RETIRED_ANY
+L1 DTLB store miss duration DTLB_STORE_MISSES_WALK_DURATION
+-
+The DTLB load and store miss rates gives a measure how often a TLB miss occurred
+per instruction. The duration measures the time in cycles how long a walk did take.
+
diff --git a/groups/skylakeX/TLB_INSTR.txt b/groups/skylakeX/TLB_INSTR.txt
new file mode 100644
index 0000000..b195452
--- /dev/null
+++ b/groups/skylakeX/TLB_INSTR.txt
@@ -0,0 +1,28 @@
+SHORT  L1 Instruction TLB miss rate/ratio
+
+EVENTSET
+FIXC0 INSTR_RETIRED_ANY
+FIXC1 CPU_CLK_UNHALTED_CORE
+FIXC2 CPU_CLK_UNHALTED_REF
+PMC0  ITLB_MISSES_CAUSES_A_WALK
+PMC1  ITLB_MISSES_WALK_DURATION
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s] FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI  FIXC1/FIXC0
+L1 ITLB misses     PMC0
+L1 ITLB miss rate  PMC0/FIXC0
+L1 ITLB miss duration PMC1
+
+
+LONG
+Formulas:
+L1 ITLB misses     ITLB_MISSES_CAUSES_A_WALK
+L1 ITLB miss rate  ITLB_MISSES_CAUSES_A_WALK / INSTR_RETIRED_ANY
+L1 ITLB miss duration ITLB_MISSES_WALK_DURATION
+-
+The ITLB miss rates gives a measure how often a TLB miss occurred
+per instruction. The duration measures the time in cycles how long a walk did take.
+
diff --git a/groups/ivybridge/UOPS_EXEC.txt b/groups/skylakeX/UOPS_EXEC.txt
similarity index 95%
copy from groups/ivybridge/UOPS_EXEC.txt
copy to groups/skylakeX/UOPS_EXEC.txt
index 7042df7..a56a0b7 100644
--- a/groups/ivybridge/UOPS_EXEC.txt
+++ b/groups/skylakeX/UOPS_EXEC.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/haswell/UOPS_ISSUE.txt b/groups/skylakeX/UOPS_ISSUE.txt
similarity index 95%
copy from groups/haswell/UOPS_ISSUE.txt
copy to groups/skylakeX/UOPS_ISSUE.txt
index 9aac923..be992d5 100644
--- a/groups/haswell/UOPS_ISSUE.txt
+++ b/groups/skylakeX/UOPS_ISSUE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/haswellEP/UOPS_RETIRE.txt b/groups/skylakeX/UOPS_RETIRE.txt
similarity index 95%
copy from groups/haswellEP/UOPS_RETIRE.txt
copy to groups/skylakeX/UOPS_RETIRE.txt
index 0f37585..a050fcf 100644
--- a/groups/haswellEP/UOPS_RETIRE.txt
+++ b/groups/skylakeX/UOPS_RETIRE.txt
@@ -16,7 +16,7 @@ Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
 CPI  FIXC1/FIXC0
 Used cycles ratio [%] 100*PMC0/PMC2
 Unused cycles ratio [%] 100*PMC1/PMC2
-Avg stall duration [cycles] PMC1/PMC3:EDGEDETECT
+Avg stall duration [cycles] PMC1/PMC3
 
 
 LONG
diff --git a/groups/zen/BRANCH.txt b/groups/zen/BRANCH.txt
new file mode 100644
index 0000000..8350c7c
--- /dev/null
+++ b/groups/zen/BRANCH.txt
@@ -0,0 +1,32 @@
+SHORT Branch prediction miss rate/ratio
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  RETIRED_INSTRUCTIONS
+PMC1  RETIRED_BRANCH_INSTR
+PMC2  RETIRED_MISP_BRANCH_INSTR
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+Branch rate   PMC1/PMC0
+Branch misprediction rate  PMC2/PMC0
+Branch misprediction ratio  PMC2/PMC1
+Instructions per branch  PMC0/PMC1
+
+LONG
+Formulas:
+Branch rate = RETIRED_BRANCH_INSTR/RETIRED_INSTRUCTIONS
+Branch misprediction rate = RETIRED_MISP_BRANCH_INSTR/RETIRED_INSTRUCTIONS
+Branch misprediction ratio = RETIRED_MISP_BRANCH_INSTR/RETIRED_BRANCH_INSTR
+Instructions per branch = RETIRED_INSTRUCTIONS/RETIRED_BRANCH_INSTR
+-
+The rates state how often on average a branch or a mispredicted branch occurred
+per instruction retired in total. The branch misprediction ratio sets directly
+into relation what ratio of all branch instruction where mispredicted.
+Instructions per branch is 1/branch rate.
+
diff --git a/groups/zen/CACHE.txt b/groups/zen/CACHE.txt
new file mode 100644
index 0000000..0a63152
--- /dev/null
+++ b/groups/zen/CACHE.txt
@@ -0,0 +1,38 @@
+SHORT Data cache miss rate/ratio
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  RETIRED_INSTRUCTIONS
+PMC1  DATA_CACHE_ACCESSES
+PMC2  DATA_CACHE_REFILLS_ALL
+PMC3  DATA_CACHE_REFILLS_NB_ALL
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+data cache misses PMC2+PMC3
+data cache request rate PMC1/PMC0
+data cache miss rate (PMC2+PMC3)/PMC0
+data cache miss ratio (PMC2+PMC3)/PMC1
+
+LONG
+Formulas:
+data cache misses = DATA_CACHE_REFILLS_ALL + DATA_CACHE_REFILLS_NB_ALL
+data cache request rate = DATA_CACHE_ACCESSES / RETIRED_INSTRUCTIONS
+data cache miss rate = (DATA_CACHE_REFILLS_ALL + DATA_CACHE_REFILLS_NB_ALL)/RETIRED_INSTRUCTIONS
+data cache miss ratio = (DATA_CACHE_REFILLS_ALL + DATA_CACHE_REFILLS_NB_ALL)/DATA_CACHE_ACCESSES
+-
+This group measures the locality of your data accesses with regard to the
+L1 cache. Data cache request rate tells you how data intensive your code is
+or how many data accesses you have on average per instruction.
+The data cache miss rate gives a measure how often it was necessary to get
+cache lines from higher levels of the memory hierarchy. And finally
+data cache miss ratio tells you how many of your memory references required
+a cache line to be loaded from a higher level. While the# data cache miss rate
+might be given by your algorithm you should try to get data cache miss ratio
+as low as possible by increasing your cache reuse.
+
diff --git a/groups/zen/CPI.txt b/groups/zen/CPI.txt
new file mode 100644
index 0000000..0f72285
--- /dev/null
+++ b/groups/zen/CPI.txt
@@ -0,0 +1,35 @@
+SHORT  Cycles per instruction
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  RETIRED_INSTRUCTIONS
+PMC1  CPU_CLOCKS_UNHALTED
+PMC2  RETIRED_UOPS
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI (fixed)   FIXC1/FIXC0
+CPI (PMC)  PMC1/PMC0
+CPI (based on uops)   PMC1/PMC2
+IPC (fixed)   FIXC0/FIXC1
+IPC (PMC)  PMC0/PMC1
+
+
+LONG
+Formulas:
+CPI (fixed) = ACTUAL_CPU_CLOCK/INST_RETIRED_ANY
+CPI (PMC) = CPU_CLOCKS_UNHALTED/RETIRED_INSTRUCTIONS
+CPI (based on uops) = CPU_CLOCKS_UNHALTED/RETIRED_UOPS
+IPC (PMC) = RETIRED_INSTRUCTIONS/CPU_CLOCKS_UNHALTED
+IPC (fixed) = INST_RETIRED_ANY/ACTUAL_CPU_CLOCK
+-
+This group measures how efficient the processor works with
+regard to instruction throughput. Also important as a standalone
+metric is RETIRED_INSTRUCTIONS as it tells you how many instruction
+you need to execute for a task. An optimization might show very
+low CPI values but execute many more instruction for it.
+
diff --git a/groups/zen/DATA.txt b/groups/zen/DATA.txt
new file mode 100644
index 0000000..7906835
--- /dev/null
+++ b/groups/zen/DATA.txt
@@ -0,0 +1,22 @@
+SHORT Load to store ratio
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  LS_DISPATCH_LOADS
+PMC1  LS_DISPATCH_STORES
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+Load to store ratio PMC0/PMC1
+
+LONG
+Formulas:
+Load to store ratio = LS_DISPATCH_LOADS/LS_DISPATCH_STORES
+-
+This is a simple metric to determine your load to store ratio.
+
diff --git a/groups/zen/ENERGY.txt b/groups/zen/ENERGY.txt
new file mode 100644
index 0000000..7fb89f6
--- /dev/null
+++ b/groups/zen/ENERGY.txt
@@ -0,0 +1,31 @@
+SHORT Power and Energy consumption
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PWR0  RAPL_CORE_ENERGY
+PWR1  RAPL_PKG_ENERGY
+
+
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+Energy Core [J]  PWR0
+Power Core [W] PWR0/time
+Energy PKG [J]  PWR1
+Power PKG [W] PWR1/time
+
+LONG
+Formula:
+Power Core [W] RAPL_CORE_ENERGY/time
+Power PKG [W] RAPL_PKG_ENERGY/time
+-
+Ryzen implements the RAPL interface previously introduced by Intel.
+This interface enables to monitor the consumed energy on the core and package
+domain.
+It is not documented by AMD which parts of the CPU are in which domain.
+
diff --git a/groups/zen/FLOPS_DP.txt b/groups/zen/FLOPS_DP.txt
new file mode 100644
index 0000000..36fbb2d
--- /dev/null
+++ b/groups/zen/FLOPS_DP.txt
@@ -0,0 +1,32 @@
+SHORT Double Precision MFLOP/s
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  RETIRED_SSE_AVX_FLOPS_DOUBLE_FMA
+PMC2  RETIRED_MMX_FP_INSTR_ALL
+PMC3  RETIRED_SSE_AVX_FLOPS_DOUBLE_ADD_MULT_DIV
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC0/FIXC1
+DP MFLOP/s (scalar assumed)   1.0E-06*(PMC3+(PMC2/2)+(PMC0*2))/time
+DP MFLOP/s (SSE assumed)   1.0E-06*(PMC3+PMC2+(PMC0*2))/time
+DP MFLOP/s (AVX assumed)   1.0E-06*(PMC3+(PMC2*2)+(PMC0*2))/time
+
+LONG
+Formulas:
+CPI = INST_RETIRED_ANY/ACTUAL_CPU_CLOCK
+DP MFLOP/s (scalar assumed) = 1.0E-06*(RETIRED_SSE_AVX_FLOPS_DOUBLE_ADD_MULT_DIV + (RETIRED_MMX_FP_INSTR_ALL/2)+(RETIRED_SSE_AVX_FLOPS_DOUBLE_FMA*2))/time
+DP MFLOP/s (SSE assumed) = 1.0E-06*(RETIRED_SSE_AVX_FLOPS_DOUBLE_ADD_MULT_DIV + RETIRED_MMX_FP_INSTR_ALL+(RETIRED_SSE_AVX_FLOPS_DOUBLE_FMA*2))/time
+DP MFLOP/s (AVX assumed) = 1.0E-06*(RETIRED_SSE_AVX_FLOPS_DOUBLE_ADD_MULT_DIV + (RETIRED_MMX_FP_INSTR_ALL*2)+(RETIRED_SSE_AVX_FLOPS_DOUBLE_FMA*2))/time
+-
+Profiling group to measure double precisision FLOP rate. The Zen architecture
+does not provide distinct events for SSE and AVX FLOPs. Moreover, scalar FP
+instructions are counted as SSE instruction in RETIRED_MMX_FP_INSTR_ALL.
+Therefore, you have to select the DP MFLOP/s metric based on the measured code.
+
+
diff --git a/groups/zen/FLOPS_SP.txt b/groups/zen/FLOPS_SP.txt
new file mode 100644
index 0000000..676817e
--- /dev/null
+++ b/groups/zen/FLOPS_SP.txt
@@ -0,0 +1,33 @@
+SHORT Single Precision MFLOP/s
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  RETIRED_SSE_AVX_FLOPS_SINGLE_FMA
+PMC2  RETIRED_MMX_FP_INSTR_ALL
+PMC3  RETIRED_SSE_AVX_FLOPS_SINGLE_ADD_MULT_DIV
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+SP MFLOP/s (scalar assumed)   1.0E-06*(PMC3+(PMC2/2)+(PMC0*4))/time
+SP MFLOP/s (SSE assumed)   1.0E-06*(PMC3+(PMC2*2)+(PMC0*4))/time
+SP MFLOP/s (AVX assumed)   1.0E-06*(PMC3+(PMC2*4)+(PMC0*4))/time
+
+
+LONG
+Formulas:
+CPI = INST_RETIRED_ANY/ACTUAL_CPU_CLOCK
+SP MFLOP/s (scalar assumed) = 1.0E-06*(RETIRED_SSE_AVX_FLOPS_SINGLE_ADD_MULT_DIV + (RETIRED_MMX_FP_INSTR_ALL/2)+(RETIRED_SSE_AVX_FLOPS_SINGLE_FMA*4))/time
+SP MFLOP/s (SSE assumed) = 1.0E-06*(RETIRED_SSE_AVX_FLOPS_SINGLE_ADD_MULT_DIV + (RETIRED_MMX_FP_INSTR_ALL*2)+(RETIRED_SSE_AVX_FLOPS_SINGLE_FMA*4))/time
+SP MFLOP/s (AVX assumed) = 1.0E-06*(RETIRED_SSE_AVX_FLOPS_SINGLE_ADD_MULT_DIV + (RETIRED_MMX_FP_INSTR_ALL*4)+(RETIRED_SSE_AVX_FLOPS_SINGLE_FMA*4))/time
+-
+Profiling group to measure single precisision FLOP rate. The Zen architecture
+does not provide distinct events for SSE and AVX FLOPs. Moreover, scalar FP
+instructions are counted as SSE instruction in RETIRED_MMX_FP_INSTR_ALL.
+Therefore, you have to select the SP MFLOP/s metric based on the measured code.
+
+
diff --git a/groups/zen/FPU_EXCEPTION.txt b/groups/zen/FPU_EXCEPTION.txt
new file mode 100644
index 0000000..6a8dfb2
--- /dev/null
+++ b/groups/zen/FPU_EXCEPTION.txt
@@ -0,0 +1,27 @@
+SHORT   Floating point exceptions
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  RETIRED_INSTRUCTIONS
+PMC1  RETIRED_FP_INSTRUCTIONS_ALL
+PMC2  FPU_EXCEPTION_ALL
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+Overall FP exception rate  PMC2/PMC0
+FP exception rate    PMC2/PMC1
+
+LONG
+Formulas:
+Overall FP exception rate = FPU_EXCEPTIONS_ALL / RETIRED_INSTRUCTIONS
+FP exception rate = FPU_EXCEPTIONS_ALL / FP_INSTRUCTIONS_RETIRED_ALL
+-
+Floating point exceptions occur e.g. on the treatment of denormal numbers.
+There might be a large penalty if there are too many floating point
+exceptions.
+
diff --git a/groups/zen/ICACHE.txt b/groups/zen/ICACHE.txt
new file mode 100644
index 0000000..5bdfae1
--- /dev/null
+++ b/groups/zen/ICACHE.txt
@@ -0,0 +1,29 @@
+SHORT Instruction cache miss rate/ratio
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  ICACHE_FETCHES
+PMC1  ICACHE_L2_REFILLS
+PMC2  ICACHE_SYSTEM_REFILLS
+PMC3  RETIRED_INSTRUCTIONS
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+L1I request rate   PMC0/PMC3
+L1I miss rate    (PMC1+PMC2)/PMC3
+L1I miss ratio   (PMC1+PMC2)/PMC0
+
+LONG
+Formulas:
+L1I request rate = ICACHE_FETCHES / RETIRED_INSTRUCTIONS
+L1I miss rate = (ICACHE_L2_REFILLS + ICACHE_SYSTEM_REFILLS)/RETIRED_INSTRUCTIONS
+L1I miss ratio = (ICACHE_L2_REFILLS + ICACHE_SYSTEM_REFILLS)/ICACHE_FETCHES
+-
+This group measures the locality of your instruction code with regard to the
+L1 I-Cache.
+
diff --git a/groups/zen/TLB.txt b/groups/zen/TLB.txt
new file mode 100644
index 0000000..c71a0b3
--- /dev/null
+++ b/groups/zen/TLB.txt
@@ -0,0 +1,40 @@
+SHORT  TLB miss rate/ratio
+
+EVENTSET
+FIXC0 INST_RETIRED_ANY
+FIXC1 ACTUAL_CPU_CLOCK
+FIXC2 MAX_CPU_CLOCK
+PMC0  RETIRED_INSTRUCTIONS
+PMC1  DATA_CACHE_ACCESSES
+PMC2  L1_DTLB_MISS_ANY_L2_HIT
+PMC3  L1_DTLB_MISS_ANY_L2_MISS
+
+METRICS
+Runtime (RDTSC) [s] time
+Runtime unhalted [s]   FIXC1*inverseClock
+Clock [MHz]  1.E-06*(FIXC1/FIXC2)/inverseClock
+CPI   FIXC1/FIXC0
+L1 DTLB request rate  PMC1/PMC0
+L1 DTLB miss rate   (PMC2+PMC3)/PMC0
+L1 DTLB miss ratio   (PMC2+PMC3)/PMC1
+L2 DTLB request rate   (PMC2+PMC3)/PMC0
+L2 DTLB miss rate    PMC3/PMC0
+L2 DTLB miss ratio    PMC3/(PMC2+PMC3)
+
+
+LONG
+Formulas:
+L1 DTLB request rate  DATA_CACHE_ACCESSES / RETIRED_INSTRUCTIONS
+L1 DTLB miss rate  (L1_DTLB_MISS_ANY_L2_HIT+L1_DTLB_MISS_ANY_L2_MISS)/RETIRED_INSTRUCTIONS
+L1 DTLB miss ratio  (L1_DTLB_MISS_ANY_L2_HIT+L1_DTLB_MISS_ANY_L2_MISS)/DATA_CACHE_ACCESSES
+L2 DTLB request rate  (L1_DTLB_MISS_ANY_L2_HIT+L1_DTLB_MISS_ANY_L2_MISS)/RETIRED_INSTRUCTIONS
+L2 DTLB miss rate  L1_DTLB_MISS_ANY_L2_MISS / RETIRED_INSTRUCTIONS
+L2 DTLB miss ratio L1_DTLB_MISS_ANY_L2_MISS / (L1_DTLB_MISS_ANY_L2_HIT+L1_DTLB_MISS_ANY_L2_MISS)
+-
+L1 DTLB request  rate tells you how data intensive your code is
+or how many data accesses you have on average per instruction.
+The DTLB miss  rate gives a measure how often a TLB miss occurred
+per instruction. And finally L1 DTLB  miss ratio tells you how many
+of your memory references required caused a TLB miss on average.
+NOTE: The L2 metrics are only relevant if L2 DTLB request rate is
+equal to the L1 DTLB miss rate!
diff --git a/make/config_checks.mk b/make/config_checks.mk
index 8403570..ea2d83f 100644
--- a/make/config_checks.mk
+++ b/make/config_checks.mk
@@ -1,5 +1,5 @@
 
-ifneq ($(MAKECMDGOALS),docs)
+ifneq ($(strip $(MAKECMDGOALS)),docs)
 # determine kernel Version
 KERNEL_VERSION_MAJOR := $(shell uname -r | awk '{split($$1,a,"."); print a[1]}' | cut -d '-' -f1)
 KERNEL_VERSION := $(shell uname -r | awk  '{split($$1,a,"."); print a[2]}' | cut -d '-' -f1)
@@ -18,32 +18,36 @@ HAS_SCHEDAFFINITY = $(shell if [ $(GLIBC_VERSION) -lt 4 ]; then \
 			   fi; )
 ENOUGH_CPUS = $(shell [ $(shell grep processor /proc/cpuinfo | wc -l) -le $(MAX_NUM_THREADS) ] && echo True )
 
-ifneq ($(ENOUGH_CPUS), True)
+ifneq ($(strip $(ENOUGH_CPUS)), True)
 $(info Warning: $(ENOUGH_CPUS) The MAX_NUM_THREADS variable must be larger or equal to the available CPUs. Currently, LIKWID is configured for $(MAX_NUM_THREADS) CPUs, but there are $(INSTALLED_CPUS) CPUs in the systen)
 endif
 
-INST_PREFIX := $(INSTALLED_PREFIX)
-ifneq "$(PREFIX)" "$(INST_PREFIX)"
-$(info Info: PREFIX and INSTALLED_PREFIX differ, be aware that you have to move stuff after make install from $(PREFIX) to $(INSTALLED_PREFIX). You can use make move for this.)
+INST_PREFIX := $(strip $(INSTALLED_PREFIX))
+ifneq "$(strip $(PREFIX))" "$(strip $(INST_PREFIX))"
+$(info Info: PREFIX and INSTALLED_PREFIX differ, be aware that you have to move stuff after make install from $(strip $(PREFIX)) to $(strip $(INSTALLED_PREFIX)). You can use make move for this.)
+endif
+
+ifneq ($(strip $(SHARED_LIBRARY)),true)
+$(info Warning: When building as static library, you cannot use the Lua scripts as they require a shared library. You can still link your application to the library.)
 endif
 
 FORTRAN_IF_NAME := likwid.mod
-ifneq ($(FORTRAN_INTERFACE),false)
+ifneq ($(strip $(FORTRAN_INTERFACE)),false)
 HAS_FORTRAN_COMPILER := $(shell $(FC) --version 2>/dev/null || echo 'NOFORTRAN' )
-ifeq ($(HAS_FORTRAN_COMPILER),NOFORTRAN)
+ifeq ($(strip $(HAS_FORTRAN_COMPILER)),NOFORTRAN)
 FORTRAN_IF=
 $(info Warning: You have selected the fortran interface in config.mk, but there seems to be no fortran compiler $(FC) - not compiling it!)
 FORTRAN_INSTALL =
 FORTRAN_REMOVE =
 FORTRAN_REMOVE_MOVED =
 else
-FORTRAN_IF := $(FORTRAN_IF_NAME)
+FORTRAN_IF := $(strip $(FORTRAN_IF_NAME))
 FORTRAN_INSTALL = @echo "===> INSTALL fortran interface to $(PREFIX)/include/"; \
-                  cp -f likwid.mod  $(PREFIX)/include/$(FORTRAN_IF_NAME)
+                  cp -f likwid.mod  $(strip $(PREFIX))/include/$(strip $(FORTRAN_IF_NAME))
 FORTRAN_REMOVE = @echo "===> REMOVING fortran interface from $(PREFIX)/include/"; \
-                 rm -f $(PREFIX)/include/$(FORTRAN_IF_NAME)
+                 rm -f $(strip $(PREFIX))/include/$(strip $(FORTRAN_IF_NAME))
 FORTRAN_REMOVE_MOVED = @echo "===> REMOVING fortran interface from $(INSTALLED_PREFIX)/include/"; \
-                 rm -f $(INSTALLED_PREFIX)/include/$(FORTRAN_IF_NAME)
+                 rm -f $(strip $(INSTALLED_PREFIX))/include/$(strip $(FORTRAN_IF_NAME))
 endif
 else
 FORTRAN_IF =
diff --git a/make/config_defines.mk b/make/config_defines.mk
index e277d53..54c7816 100644
--- a/make/config_defines.mk
+++ b/make/config_defines.mk
@@ -1,5 +1,6 @@
 DEFINES   += -DVERSION=$(VERSION)         \
 		 -DRELEASE=$(RELEASE)                 \
+		 -DMINORVERSION=$(MINOR)                 \
 		 -DCFGFILE=$(CFG_FILE_PATH)           \
 		 -DTOPOFILE=$(TOPO_FILE_PATH)           \
 		 -DINSTALL_PREFIX=$(INSTALLED_PREFIX) \
@@ -9,8 +10,12 @@ DEFINES   += -DVERSION=$(VERSION)         \
 		 -DGROUPPATH=$(LIKWIDGROUPPATH) \
 		 -DLIKWIDLOCK=$(LIKWIDLOCKPATH) \
 		 -DLIKWIDSOCKETBASE=$(LIKWIDSOCKETBASE) \
+		 -DGITCOMMIT=$(GITCOMMIT) \
 		 -D_GNU_SOURCE
 
+COMPILER := $(strip $(COMPILER))
+
+
 DYNAMIC_TARGET_LIB := liblikwid.so
 STATIC_TARGET_LIB := liblikwid.a
 PWD ?= $(shell pwd)
@@ -27,7 +32,7 @@ endif
 SHARED_LIBLUA := lib$(LUA_LIB_NAME).so
 STATIC_LIBLUA := lib$(LUA_LIB_NAME).a
 # HWLOC:
-HWLOC_FOLDER := ext/hwloc
+HWLOC_FOLDER := $(PWD)/ext/hwloc
 STATIC_LIBHWLOC := liblikwid-hwloc.a
 SHARED_LIBHWLOC := liblikwid-hwloc.so
 
@@ -35,12 +40,12 @@ BENCH_FOLDER := bench
 BENCH_NAME := likwid-bench
 BENCH_TARGET := $(BENCH_FOLDER)/$(BENCH_NAME)
 
-ifneq ($(COLOR),NONE)
+ifneq ($(strip $(COLOR)),NONE)
 DEFINES += -DCOLOR=$(COLOR)
 endif
 
-ifeq ($(BUILDDAEMON),true)
-ifneq ($(COMPILER),MIC)
+ifeq ($(strip $(BUILDDAEMON)),true)
+ifneq ($(strip $(COMPILER)),MIC)
     DAEMON_TARGET = likwid-accessD
 else
     $(info Info: Compiling for Xeon Phi. Disabling build of likwid-accessD.);
@@ -48,22 +53,22 @@ else
 endif
 endif
 
-ifeq ($(BUILDFREQ),true)
-ifneq ($(COMPILER),MIC)
+ifeq ($(strip $(BUILDFREQ)),true)
+ifneq ($(strip $(COMPILER)),MIC)
     FREQ_TARGET = likwid-setFreq
 else
     $(info Info: Compiling for Xeon Phi. Disabling build of likwid-setFreq.);
 endif
 endif
 
-ifeq ($(HAS_MEMPOLICY),1)
+ifeq ($(strip $(HAS_MEMPOLICY)),1)
 DEFINES += -DHAS_MEMPOLICY
 else
 $(info Kernel 2.6.$(KERNEL_VERSION) has no mempolicy support!);
 endif
 
 
-ifeq ($(SHARED_LIBRARY),true)
+ifeq ($(strip $(SHARED_LIBRARY)),true)
 CFLAGS += $(SHARED_CFLAGS)
 LIBS += -L. -pthread -lm -ldl
 TARGET_LIB := $(DYNAMIC_TARGET_LIB)
@@ -75,7 +80,7 @@ TARGET_HWLOC_LIB=$(HWLOC_FOLDER)/$(STATIC_LIBHWLOC)
 TARGET_LUA_LIB=$(LUA_LIB_DIR)/$(STATIC_LIBLUA)
 endif
 
-ifeq ($(HAS_SCHEDAFFINITY),1)
+ifeq ($(strip $(HAS_SCHEDAFFINITY)),1)
 DEFINES += -DHAS_SCHEDAFFINITY
 PINLIB  = liblikwidpin.so
 else
@@ -85,43 +90,55 @@ endif
 
 FILTER_HWLOC_OBJ = yes
 LIBHWLOC =
-ifeq ($(USE_HWLOC),true)
 DEFINES += -DLIKWID_USE_HWLOC
 LIBHWLOC_SHARED = -Lext/hwloc/ -lliblikwid-hwloc
 LIBHWLOC_STATIC = ext/hwloc/liblikwid-hwloc.a
 EXT_TARGETS += ./ext/hwloc
 FILTER_HWLOC_OBJ =
-endif
 
 #DEFINES += -DACCESSDAEMON=$(ACCESSDAEMON)
 
-ifeq ($(ACCESSMODE),sysdaemon)
-ifneq ($(COMPILER),MIC)
-DEFINES += -DACCESSMODE=2
-else
-$(info Info: Compiling for Xeon Phi. Changing accessmode to direct.);
-ACCESSMODE = direct
-DEFINES += -DACCESSMODE=0
-endif
-else
-ifeq ($(ACCESSMODE),accessdaemon)
-ifneq ($(COMPILER),MIC)
-ifneq ($(BUILDDAEMON),true)
-$(info Info: Compiling with accessdaemon access mode but without building the access daemon.);
-$(info Info: Make sure an accessdaemon is installed and the paths ACCESSDAEMON and INSTALLED_ACCESSDAEMON point to it);
-endif
-DEFINES += -DACCESSMODE=1
-else
-$(info Info: Compiling for Xeon Phi. Changing accessmode to direct.);
-DEFINES += -DACCESSMODE=0
-ACCESSMODE = direct
+ifeq ($(strip $(COMPILER)),MIC)
+    ifeq ($(strip $(ACCESSMODE)),sysdaemon)
+        $(info Info: Compiling for Xeon Phi. Changing accessmode to direct.)
+        ACCESSMODE = direct
+    endif
+    ifeq ($(strip $(ACCESSMODE)),accessdaemon)
+        $(info Info: Compiling for Xeon Phi. Changing accessmode to direct.)
+        ACCESSMODE = direct
+    endif
 endif
+
+
+ifeq ($(strip $(ACCESSMODE)),sysdaemon)
+    DEFINES += -DACCESSMODE=2
 else
-DEFINES += -DACCESSMODE=0
+    ifeq ($(strip $(ACCESSMODE)),accessdaemon)
+        DEFINES += -DACCESSMODE=1
+    else
+        ifeq ($(strip $(ACCESSMODE)),direct)
+            DEFINES += -DACCESSMODE=0
+        else
+            ifeq ($(strip $(ACCESSMODE)),perf_event)
+                DEFINES += -DLIKWID_USE_PERFEVENT
+                BUILDDAEMON = false
+                $(info Info: Compiling for perf_event interface. Measurements of thermal information is disabled);
+            else
+                $(info Error: Unknown access mode $(ACCESSMODE))
+            endif
+        endif
+    endif
 endif
+
+ifeq ($(strip $(ACCESSMODE)),accessdaemon)
+    ifneq ($(strip $(BUILDDAEMON)),true)
+        $(info Info: Compiling with accessdaemon access mode but without building the access daemon.);
+        $(info Info: Make sure an accessdaemon is installed and the paths ACCESSDAEMON and INSTALLED_ACCESSDAEMON point to it);
+    endif
 endif
 
-ifeq ($(DEBUG),true)
+
+ifeq ($(strip $(DEBUG)),true)
 DEBUG_FLAGS = -g
 DEBUG_CFLAGS := $(filter-out -O0, $(CFLAGS))
 DEBUG_CFLAGS := $(filter-out -O1, $(DEBUG_CFLAGS))
@@ -133,9 +150,4 @@ else
 DEBUG_FLAGS =
 endif
 
-ifeq ($(USE_PERF_EVENT),true)
-$(info Info: Compiling for perf_event interface. Features like power consumption or thermal stuff is disabled);
-$(info Info: Currently Uncore support is experimental);
-DEFINES += -DLIKWID_USE_PERFEVENT
-endif
 
diff --git a/make/config_git.mk b/make/config_git.mk
new file mode 100644
index 0000000..233ab94
--- /dev/null
+++ b/make/config_git.mk
@@ -0,0 +1,3 @@
+GITCOMMITRAW=$Id$
+
+GITCOMMIT := $(shell echo $(GITCOMMITRAW) | cut -d ' ' -f 2)
diff --git a/make/likwid-config.cmake b/make/likwid-config.cmake
new file mode 100644
index 0000000..6018478
--- /dev/null
+++ b/make/likwid-config.cmake
@@ -0,0 +1,4 @@
+set(LIKWID_INCLUDES @PREFIX@/include)
+set(LIKWID_LIBRARIES @PREFIX@/lib/liblikwid.so -llikwid)
+
+
diff --git a/monitoring/likwid-agent.conf b/monitoring/likwid-agent.conf
index 7aadbda..2af8c82 100644
--- a/monitoring/likwid-agent.conf
+++ b/monitoring/likwid-agent.conf
@@ -50,3 +50,6 @@
 #GMETRICPATH <path_to_gmetric>
 # In some environments they need to hand over a special config file for gmetric.
 #GMETRICCONFIG <path_to_gmetric_config>
+# If you want to send a specific group with gmetric. If nothing is set but gmetric
+# has a --group option, the name of the monitoring groups is used.
+#GMETRICGROUP <groupname>
diff --git a/perl/set_license.pl b/perl/set_license.pl
index 0935c4f..9826add 100755
--- a/perl/set_license.pl
+++ b/perl/set_license.pl
@@ -12,13 +12,13 @@ my $lc = ' *';
 
 #my $VERSION   = '<VERSION>';
 #my $DATE   = '<DATE>';
-my $VERSION   = '4.2';
-my $DATE   = '22.12.2016';
-my $YEAR  = '2016';
+my $VERSION   = '4.3.1';
+my $DATE   = '04.01.2018';
+my $YEAR  = '2018';
 my $AUTHOR = 'RRZE, University Erlangen-Nuremberg';
 my $LICENSE = 'gpl';
 
-my @SKIPLIST = ('ghash.c','ghash.h','loadData.S','bstrlib.c','bstrlib.h', 'calculator_stack.h', 'calculator_stack.c');
+my @SKIPLIST = ('ghash.c','ghash.h','loadData.S','bstrlib.c','bstrlib.h');
 
 sub print_copyright
 {
diff --git a/src/access-daemon/Makefile b/src/access-daemon/Makefile
index fa09830..8bbe689 100644
--- a/src/access-daemon/Makefile
+++ b/src/access-daemon/Makefile
@@ -4,13 +4,13 @@
 #
 #      Description:  accessDaemon Makefile
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:  Jan Treibig (jt), jan.treibig at gmail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -46,6 +46,6 @@ all: $(DAEMON_TARGET) $(SETFREQ_TARGET)
 $(DAEMON_TARGET): accessDaemon.c
 	$(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -o ../../$(DAEMON_TARGET) accessDaemon.c
 
-$(SETFREQ_TARGET): setFreq.c
-	$(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -o ../../$(SETFREQ_TARGET) setFreq.c
+$(SETFREQ_TARGET): setFreq.c setFreq_cpufreq.c setFreq_pstate.c
+	$(Q)$(CC) $(CFLAGS) $(CPPFLAGS) -I. -o ../../$(SETFREQ_TARGET) setFreq.c setFreq_cpufreq.c setFreq_pstate.c
 
diff --git a/src/access-daemon/accessDaemon.c b/src/access-daemon/accessDaemon.c
index 855f2ca..80c2846 100644
--- a/src/access-daemon/accessDaemon.c
+++ b/src/access-daemon/accessDaemon.c
@@ -5,15 +5,15 @@
  *
  *      Description:  Implementation of access daemon.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Michael Meier, michael.meier at rrze.fau.de
  *                Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -48,6 +48,7 @@
 #include <unistd.h>
 #include <sys/fsuid.h>
 #include <getopt.h>
+#include <dirent.h>
 
 #include <types.h>
 #include <registers.h>
@@ -57,6 +58,7 @@
 #include <perfmon_broadwelld_counters.h>
 #include <perfmon_broadwellEP_counters.h>
 #include <perfmon_knl_counters.h>
+#include <perfmon_skylakeX_counters.h>
 #include <topology.h>
 #include <cpuid.h>
 #include <lock.h>
@@ -96,9 +98,12 @@ static char* filepath;
 static const char* ident = "accessD";
 static AllowedPrototype allowed = NULL;
 static AllowedPciPrototype allowedPci = NULL;
-static int FD_MSR[MAX_NUM_THREADS];
-static int FD_PCI[MAX_NUM_NODES][MAX_NUM_PCI_DEVICES];
+/*static int FD_MSR[MAX_NUM_THREADS];*/
+/*static int FD_PCI[MAX_NUM_NODES][MAX_NUM_PCI_DEVICES];*/
+static int* FD_MSR = NULL;
+static int** FD_PCI = NULL;
 static int isPCIUncore = 0;
+static int isPCI64 = 0;
 static PciDevice* pci_devices_daemon = NULL;
 static char pci_filepath[MAX_PATH_LENGTH];
 static int num_pmc_counters = 0;
@@ -111,7 +116,68 @@ static int num_pmc_counters = 0;
  *   2                  0xbf
  *   3                  0xff
  */
-static char* socket_bus[MAX_NUM_NODES] = { [0 ... (MAX_NUM_NODES-1)] = NULL};
+//static char* socket_bus[MAX_NUM_NODES] = { [0 ... (MAX_NUM_NODES-1)] = NULL};
+static char** socket_bus = NULL;
+static int avail_sockets = 0;
+static int avail_cpus = 0;
+
+void __attribute__((constructor (101))) init_accessdaemon(void)
+{
+    FILE *fpipe = NULL;
+    char *ptr = NULL;
+    char cmd_cpu[] = "cat /proc/cpuinfo  | grep 'processor' | sort -u | wc -l";
+    char cmd_sock[] = "cat /proc/cpuinfo  | grep 'physical id' | sort -u | wc -l";
+    //static long avail_sockets = 0;
+    char buff[256];
+    //avail_cpus = sysconf(_SC_NPROCESSORS_CONF);
+
+    if ( !(fpipe = (FILE*)popen(cmd_cpu,"r")) )
+    {  // If fpipe is NULL
+        return;
+    }
+    ptr = fgets(buff, 256, fpipe);
+    if (pclose(fpipe))
+        return;
+    avail_cpus = atoi(buff);
+
+    if ( !(fpipe = (FILE*)popen(cmd_sock,"r")) )
+    {  // If fpipe is NULL
+        return;
+    }
+    ptr = fgets(buff, 256, fpipe);
+    if (pclose(fpipe))
+        return;
+    avail_sockets = atoi(buff);
+
+    FD_MSR = malloc(avail_cpus * sizeof(int));
+    //memset(FD_MSR, 0, avail_cpus * sizeof(int));
+
+    socket_bus = malloc(avail_sockets * sizeof(char*));
+    //memset(socket_bus, 0, avail_sockets * sizeof(char*));
+
+    FD_PCI = malloc(avail_sockets * sizeof(int*));
+    //memset(FD_PCI, 0, avail_sockets * sizeof(int*));
+    for (int i = 0; i < avail_sockets; i++)
+    {
+        FD_PCI[i] = malloc(MAX_NUM_PCI_DEVICES * sizeof(int));
+        //memset(FD_PCI[i], 0, MAX_NUM_PCI_DEVICES * sizeof(int));
+    }
+}
+
+void __attribute__((destructor (101))) close_accessdaemon(void)
+{
+    for (int i = 0; i < avail_sockets; i++)
+    {
+        free(FD_PCI[i]);
+        FD_PCI[i] = NULL;
+    }
+    free(FD_PCI);
+    FD_PCI = NULL;
+    free(socket_bus);
+    socket_bus = NULL;
+    free(FD_MSR);
+    FD_MSR = NULL;
+}
 
 /* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
 
@@ -480,7 +546,8 @@ static int allowed_knl(uint32_t reg)
     {
         if (((reg & 0xF00U) == 0x700U) ||
             ((reg & 0xF00U) == 0xE00U) ||
-            ((reg & 0xF00U) == 0xF00U))
+            ((reg & 0xF00U) == 0xF00U) ||
+            (reg == MSR_PREFETCH_ENABLE))
             return 1;
     }
     return 0;
@@ -605,6 +672,84 @@ static int allowed_pci_knl(PciDeviceType type, uint32_t reg)
     return 0;
 }
 
+static int allowed_skx(uint32_t reg)
+{
+    if (allowed_sandybridge(reg))
+        return 1;
+    else
+    {
+        syslog(LOG_ERR, "Testing 0x%X %d %d\n", reg, (reg & 0xF00U), (reg & 0xA00U));
+        if (((reg & 0xF00U) == 0x700U) ||
+            ((reg & 0xF00U) == 0xE00U) ||
+            ((reg & 0xF00U) == 0xF00U) ||
+            (reg == MSR_PREFETCH_ENABLE) ||
+            ((reg & 0xA00U) == 0xA00U))
+            return 1;
+    }   
+    return 0;
+}
+
+
+static int allowed_pci_skx(PciDeviceType type, uint32_t reg)
+{
+    switch(type)
+    {
+        case HA:
+            if ((reg == MSR_UNC_SKX_M2M_PMON_CTL0)||
+                (reg == MSR_UNC_SKX_M2M_PMON_CTL1)||
+                (reg == MSR_UNC_SKX_M2M_PMON_CTL2)||
+                (reg == MSR_UNC_SKX_M2M_PMON_CTL3)||
+                (reg == MSR_UNC_SKX_M2M_PMON_CTR0) ||
+                (reg == MSR_UNC_SKX_M2M_PMON_CTR1) ||
+                (reg == MSR_UNC_SKX_M2M_PMON_CTR2) ||
+                (reg == MSR_UNC_SKX_M2M_PMON_CTR3) ||
+                (reg == MSR_UNC_SKX_M2M_PMON_BOX_CTL) ||
+                (reg == MSR_UNC_SKX_M2M_PMON_BOX_STATUS))
+                return 1;
+            break;
+        case IMC:
+            if ((reg == PCI_UNC_SKX_MC_PMON_CTL0) ||
+                (reg == PCI_UNC_SKX_MC_PMON_CTL1) ||
+                (reg == PCI_UNC_SKX_MC_PMON_CTL2) ||
+                (reg == PCI_UNC_SKX_MC_PMON_CTL3) ||
+                (reg == PCI_UNC_SKX_MC_PMON_CTR0) ||
+                (reg == PCI_UNC_SKX_MC_PMON_CTR1) ||
+                (reg == PCI_UNC_SKX_MC_PMON_CTR2) ||
+                (reg == PCI_UNC_SKX_MC_PMON_CTR3) ||
+                (reg == PCI_UNC_SKX_MC_PMON_FIXED_CTL) ||
+                (reg == PCI_UNC_SKX_MC_PMON_FIXED_CTR) ||
+                (reg == PCI_UNC_SKX_MC_PMON_BOX_CTL) ||
+                (reg == PCI_UNC_SKX_MC_PMON_BOX_STATUS))
+                return 1;
+            break;
+        case QPI:
+            if ((reg == MSR_UNC_SKX_UPI_PMON_CTL0) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_CTL1) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_CTL2) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_CTL3) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_CTR0) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_CTR1) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_CTR2) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_CTR3) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_BOX_CTL) ||
+                (reg == MSR_UNC_SKX_UPI_PMON_BOX_STATUS))
+                return 1;
+            break;
+        case R3QPI:
+            if ((reg == MSR_UNC_SKX_M3UPI_PMON_CTL0) ||
+                (reg == MSR_UNC_SKX_M3UPI_PMON_CTL1) ||
+                (reg == MSR_UNC_SKX_M3UPI_PMON_CTL2) ||
+                (reg == MSR_UNC_SKX_M3UPI_PMON_CTR0) ||
+                (reg == MSR_UNC_SKX_M3UPI_PMON_CTR1) ||
+                (reg == MSR_UNC_SKX_M3UPI_PMON_CTR2) ||
+                (reg == MSR_UNC_SKX_M3UPI_PMON_BOX_CTL) ||
+                (reg == MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS))
+                return 1;
+            break;
+    }
+    return 0;
+}
+
 static int allowed_amd(uint32_t reg)
 {
     if ( (reg & 0xFFFFFFF0U) == 0xC0010000U)
@@ -646,6 +791,26 @@ allowed_amd16(uint32_t reg)
     }
 }
 
+static int
+allowed_amd17(uint32_t reg)
+{
+    if ((reg >= 0xC0010200 && reg <= 0xC0010207) ||
+        (reg >= 0xC0010230 && reg <= 0xC001023B) ||
+        (reg >= 0xC0010299 && reg <= 0xC001029B) ||
+        (reg >= 0xC00000E7 && reg <= 0xC00000E9) ||
+        (reg >= 0xC0010240 && reg <= 0xC0010247) ||
+        (reg == 0xC0010015) ||
+        (reg == 0xC0010010) ||
+        (reg == 0xC0000080))
+    {
+        return 1;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
 static void
 msr_read(AccessDataRecord * dRecord)
 {
@@ -742,6 +907,59 @@ msr_check(AccessDataRecord * dRecord)
     return;
 }
 
+static int
+getBusFromSocket(PciDevice* dev, int socket, char** filepath)
+{
+    int cur_bus = 0;
+    uint32_t cur_socket = socket;
+    char pci_filepath[1024];
+    int fp;
+    int ret = 0;
+    while(socket >= 0)
+    {
+        while (cur_bus <= 255)
+        {
+            snprintf(pci_filepath, 1023, "/proc/bus/pci/%02x/%s", cur_bus, dev->path);
+            fp = open(pci_filepath, O_RDONLY);
+            if (fp < 0)
+            {
+                cur_bus++;
+                continue;
+            }
+            if (fp > 0)
+            {
+                uint32_t indev = 0;
+                ret = pread(fp, &indev, sizeof(uint32_t), 0x0);
+                indev = (indev >> 16);
+                if (indev != dev->devid)
+                {
+                    cur_bus++;
+                    continue;
+                }
+            }
+            if (fp > 0 && socket > 0)
+            {
+                cur_bus++;
+                socket--;
+                close(fp);
+                continue;
+            }
+            
+            break;
+        }
+        socket--;
+    }
+    if (fp > 0)
+    {
+        if (filepath)
+            strncpy(*filepath, pci_filepath, strlen(pci_filepath));
+        close(fp);
+        return cur_socket;
+    }
+    return -1;
+}
+
+
 static void
 pci_read(AccessDataRecord* dRecord)
 {
@@ -749,6 +967,8 @@ pci_read(AccessDataRecord* dRecord)
     uint32_t reg = dRecord->reg;
     uint32_t device = dRecord->device;
     uint32_t data;
+    uint64_t data64;
+    char* pcipath = NULL;
 
     dRecord->errorcode = ERR_NOERROR;
     dRecord->data = 0;
@@ -770,37 +990,65 @@ pci_read(AccessDataRecord* dRecord)
     {
         if (!allowedPci(pci_devices_daemon[device].type, reg))
         {
-        dRecord->errorcode = ERR_RESTREG;
-        return;
+            dRecord->errorcode = ERR_RESTREG;
+            return;
         }
     }
     if ( !FD_PCI[socketId][device] )
     {
-        snprintf(pci_filepath, MAX_PATH_LENGTH-1, "%s%s%s", PCI_ROOT_PATH, socket_bus[socketId], pci_devices_daemon[device].path);
-        FD_PCI[socketId][device] = open( pci_filepath, O_RDWR);
-
-        if ( FD_PCI[socketId][device] < 0)
+        //snprintf(pci_filepath, MAX_PATH_LENGTH-1, "%s%s%s", PCI_ROOT_PATH, socket_bus[socketId], pci_devices_daemon[device].path);
+        pcipath = malloc(1024 * sizeof(char));
+        memset(pcipath, '\0', 1024 * sizeof(char));
+        int sid = getBusFromSocket(&(pci_devices_daemon[device]), socketId, &pcipath);
+        if (sid == socketId)
         {
-            syslog(LOG_ERR, "Failed to open device file %s for device %s (%s) on socket %u", pci_filepath,
-                    pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
-            dRecord->errorcode = ERR_OPENFAIL;
-            return;
-        }
 #ifdef DEBUG_LIKWID
-        syslog(LOG_ERR, "Open device file %s for device %s (%s) on socket %u", pci_filepath,
-                    pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+            syslog(LOG_ERR, "Open device file %s for device %s (%s) on socket %u", pcipath,
+                        pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
 #endif
+            FD_PCI[socketId][device] = open( pcipath, O_RDWR);
+
+            if ( FD_PCI[socketId][device] < 0)
+            {
+                syslog(LOG_ERR, "Failed to open device file %s for device %s (%s) on socket %u", pcipath, pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+                dRecord->errorcode = ERR_OPENFAIL;
+                if (pcipath)
+                    free(pcipath);
+                return;
+            }
+        }
     }
 
-    if (FD_PCI[socketId][device] > 0 && pread(FD_PCI[socketId][device], &data, sizeof(data), reg) != sizeof(data))
+    if (!isPCI64)
     {
-        syslog(LOG_ERR, "Failed to read data from pci device file %s for device %s (%s) on socket %u",
-                pci_filepath,pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name,socketId);
-        dRecord->errorcode = ERR_RWFAIL;
-        return;
+        if (FD_PCI[socketId][device] > 0 && pread(FD_PCI[socketId][device], &data, sizeof(data), reg) != sizeof(data))
+        {
+            syslog(LOG_ERR, "Failed to read data from pci device file %s for device %s (%s) on socket %u",
+                    pcipath,pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+            dRecord->errorcode = ERR_RWFAIL;
+            if (pcipath)
+                free(pcipath);
+            return;
+        }
+
+        dRecord->data = (uint64_t) data;
     }
+    else
+    {
+        if (FD_PCI[socketId][device] > 0 && pread(FD_PCI[socketId][device], &data64, sizeof(data64), reg) != sizeof(data64))
+        {
+            syslog(LOG_ERR, "Failed to read data from pci device file %s for device %s (%s) on socket %u",
+                    pcipath,pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+            dRecord->errorcode = ERR_RWFAIL;
+            if (pcipath)
+                free(pcipath);
+            return;
+        }
 
-    dRecord->data = (uint64_t) data;
+        dRecord->data = data64;
+    }
+    if (pcipath)
+        free(pcipath);
 }
 
 static void
@@ -809,7 +1057,9 @@ pci_write(AccessDataRecord* dRecord)
     uint32_t socketId = dRecord->cpu;
     uint32_t reg = dRecord->reg;
     uint32_t device = dRecord->device;
-    uint32_t data = (uint32_t) dRecord->data;
+    uint32_t data = (uint32_t)dRecord->data;
+    uint64_t data64 = dRecord->data;
+    char* pcipath = NULL;
 
     dRecord->errorcode = ERR_NOERROR;
 
@@ -837,30 +1087,56 @@ pci_write(AccessDataRecord* dRecord)
 
     if ( !FD_PCI[socketId][device] )
     {
-        snprintf(pci_filepath, MAX_PATH_LENGTH-1, "%s%s%s", PCI_ROOT_PATH, socket_bus[socketId], pci_devices_daemon[device].path);
+        //snprintf(pci_filepath, MAX_PATH_LENGTH-1, "%s%s%s", PCI_ROOT_PATH, socket_bus[socketId], pci_devices_daemon[device].path);
+        pcipath = malloc(1024 * sizeof(char));
+        memset(pcipath, '\0', 1024 * sizeof(char));
+        int sid = getBusFromSocket(&(pci_devices_daemon[device]), socketId, &pcipath);
+        if (sid == socketId)
+        {
+#ifdef DEBUG_LIKWID
+            syslog(LOG_ERR, "Open device file %s for device %s (%s) on socket %u", pcipath,
+                        pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+#endif
+            FD_PCI[socketId][device] = open( pcipath, O_RDWR);
 
-        FD_PCI[socketId][device] = open( pci_filepath, O_RDWR);
+            if ( FD_PCI[socketId][device] < 0)
+            {
+                syslog(LOG_ERR, "Failed to open device file %s for device %s (%s) on socket %u", pcipath, pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+                dRecord->errorcode = ERR_OPENFAIL;
+                if (pcipath)
+                    free(pcipath);
+                return;
+            }
+        }
+        
+    }
 
-        if ( FD_PCI[socketId][device] < 0)
+    if (!isPCI64)
+    {
+        if (FD_PCI[socketId][device] > 0 && pwrite(FD_PCI[socketId][device], &data, sizeof data, reg) != sizeof data)
         {
-            syslog(LOG_ERR, "Failed to open device file %s for device %s (%s) on socket %u", pci_filepath,
-                        pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
-            dRecord->errorcode = ERR_OPENFAIL;
+            syslog(LOG_ERR, "Failed to write data to pci device file %s for device %s (%s) on socket %u",pci_filepath,
+                    pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+            dRecord->errorcode = ERR_RWFAIL;
+            if (pcipath)
+                free(pcipath);
             return;
         }
-#ifdef DEBUG_LIKWID
-        syslog(LOG_ERR, "Open device file %s for device %s (%s) on socket %u", pci_filepath,
-                    pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
-#endif
     }
-
-    if (FD_PCI[socketId][device] > 0 && pwrite(FD_PCI[socketId][device], &data, sizeof data, reg) != sizeof data)
+    else
     {
-        syslog(LOG_ERR, "Failed to write data to pci device file %s for device %s (%s) on socket %u",pci_filepath,
-                pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
-        dRecord->errorcode = ERR_RWFAIL;
-        return;
+        if (FD_PCI[socketId][device] > 0 && pwrite(FD_PCI[socketId][device], &data64, sizeof data64, reg) != sizeof data64)
+        {
+            syslog(LOG_ERR, "Failed to write data to pci device file %s for device %s (%s) on socket %u",pci_filepath,
+                    pci_types[pci_devices_daemon[device].type].name, pci_devices_daemon[device].name, socketId);
+            dRecord->errorcode = ERR_RWFAIL;
+            if (pcipath)
+                free(pcipath);
+            return;
+        }
     }
+    if (pcipath)
+        free(pcipath);
 }
 
 static void
@@ -912,7 +1188,7 @@ stop_daemon(void)
 }
 
 static int
-getBusFromSocket(const uint32_t socket)
+getBusFromSocketOld(const uint32_t socket, const char* name, const uint32_t in_dev_id)
 {
     int cur_bus = 0;
     uint32_t cur_socket = 0;
@@ -921,7 +1197,7 @@ getBusFromSocket(const uint32_t socket)
     int ret = 0;
     while(cur_socket <= socket)
     {
-        snprintf(pci_filepath, MAX_PATH_LENGTH-1, "%s%02x/05.0", PCI_ROOT_PATH, cur_bus);
+        snprintf(pci_filepath, MAX_PATH_LENGTH-1, "%s%02x/%s", PCI_ROOT_PATH, cur_bus, name);
         fp = open(pci_filepath, O_RDONLY);
         if (fp < 0)
         {
@@ -947,6 +1223,93 @@ getBusFromSocket(const uint32_t socket)
     return -1;
 }
 
+#define SKYLAKE_SERVER_SOCKETID_MBOX_DID 0x2042
+static int getBusFromSocketSysFS(const uint32_t socket, const char* name, const uint32_t in_dev_id)
+{
+    struct dirent *pDirent, *pDirentInner;
+    DIR *pDir, *pDirInner;
+    pDir = opendir ("/sys/devices");
+    FILE* fp = NULL;
+    char iPath[200], iiPath[200], buff[100];
+    char testDev[50];
+    size_t ret = 0;
+    int bus_id = -1;
+    int numa_ctr = 0;
+    if (pDir == NULL)
+    {
+        syslog(LOG_ERR, "Failed open directory /sys/devices");
+        return -1;
+    }
+    
+    while ((pDirent = readdir(pDir)) != NULL)
+    {
+        if (strncmp(pDirent->d_name, "pci0", 4) == 0)
+        {
+            sprintf(iPath, "/sys/devices/%s", pDirent->d_name);
+            char bus[4];
+            strncpy(bus, &(pDirent->d_name[strlen(pDirent->d_name)-2]), 2);
+            bus[2] = '\0';
+            
+            pDirInner = opendir (iPath);
+            if (pDir == NULL)
+            {
+                syslog(LOG_ERR, "Failed read file %s", iPath);
+                return -1;
+            }
+            while ((pDirentInner = readdir(pDirInner)) != NULL)
+            {
+                if (strncmp(pDirentInner->d_name, "0000", 4) == 0)
+                {
+                    uint32_t dev_id = 0x0;
+                    int numa_node = 0;
+                    sprintf(iiPath, "/sys/devices/%s/%s/device", pDirent->d_name, pDirentInner->d_name);
+                    fp = fopen(iiPath,"r");
+                    if( fp == NULL )
+                    {
+                        continue;
+                    }
+                    ret = fread(buff, sizeof(char), 99, fp);
+                    dev_id = strtoul(buff, NULL, 16);
+                    if (dev_id == in_dev_id)
+                    {
+                        fclose(fp);
+                        iiPath[0] = '\0';
+                        sprintf(iiPath, "/sys/devices/%s/%s/numa_node", pDirent->d_name, pDirentInner->d_name);
+                        fp = fopen(iiPath,"r");
+                        if( fp == NULL )
+                        {
+                            continue;
+                        }
+                        ret = fread(buff, sizeof(char), 99, fp);
+                        numa_node = atoi(buff);
+                        if (numa_node < 0)
+                        {
+                            numa_node = numa_ctr;
+                            numa_ctr++;
+                        }
+                        if (numa_node == socket)
+                        {
+                            bus_id = strtoul(bus, NULL, 16);
+                        }
+                    }
+                    fclose(fp);
+                    iiPath[0] = '\0';
+                    buff[0] = '\0';
+                    if (bus_id != -1)
+                        break;
+                }
+            }
+            closedir (pDirInner);
+            iPath[0] = '\0';
+            if (bus_id != -1)
+                break;
+        }
+    }
+    closedir (pDir);
+    return bus_id;
+}
+
+
 static void
 Signal_Handler(int sig)
 {
@@ -1027,7 +1390,7 @@ int main(void)
     mode_t oldumask;
     uint32_t numHWThreads = sysconf(_SC_NPROCESSORS_CONF);
     uint32_t model;
-    for (int i=0;i<MAX_NUM_THREADS;i++)
+    for (int i=0;i<avail_cpus;i++)
     {
         FD_MSR[i] = -1;
     }
@@ -1039,6 +1402,11 @@ int main(void)
         syslog(LOG_ERR,"Access to performance counters is locked.\n");
         stop_daemon();
     }
+    if (!FD_MSR || !FD_PCI || !socket_bus)
+    {
+        syslog(LOG_ERR,"Failed to allocate FD space.\n");
+        stop_daemon();
+    }
 
     daemonize(&pid);
     syslog(LOG_INFO, "AccessDaemon runs with UID %d, eUID %d\n", getuid(), geteuid());
@@ -1108,6 +1476,13 @@ int main(void)
                     allowed = allowed_sandybridge;
                     allowedPci = allowed_pci_haswell;
                 }
+                else if (model == SKYLAKEX)
+                {
+                    isPCIUncore = 1;
+                    allowed = allowed_skx;
+                    allowedPci = allowed_pci_skx;
+                    isPCI64 = 1;
+                }
                 else if ((model == ATOM_SILVERMONT_C) ||
                          (model == ATOM_SILVERMONT_E) ||
                          (model == ATOM_SILVERMONT_Z1) ||
@@ -1133,7 +1508,10 @@ int main(void)
                 break;
             case K16_FAMILY:
                 allowed = allowed_amd16;
-            break;
+                break;
+            case ZEN_FAMILY:
+                allowed = allowed_amd17;
+                break;
             default:
                 syslog(LOG_ERR, "ERROR - [%s:%d] - Unsupported processor. Exiting!  \n",
                         __FILE__, __LINE__);
@@ -1204,7 +1582,7 @@ int main(void)
 
         /* Open MSR device files for less overhead.
          * NOTICE: This assumes consecutive processor Ids! */
-        for ( uint32_t i=0; i < numHWThreads; i++ )
+        for ( uint32_t i=0; i < avail_cpus; i++ )
         {
             sprintf(msr_file_name,"/dev/cpu/%d/msr",i);
             FD_MSR[i] = open(msr_file_name, O_RDWR);
@@ -1251,6 +1629,11 @@ int main(void)
                 //testDevice = 0x80862f30;
                 pci_devices_daemon = broadwellEP_pci_devices;
             }
+            else if (model == SKYLAKEX)
+            {
+                //testDevice = 0x80862f30;
+                pci_devices_daemon = skylakeX_pci_devices;
+            }
             else if (model == XEON_PHI_KNL)
             {
                 pci_devices_daemon = knl_pci_devices;
@@ -1262,25 +1645,48 @@ int main(void)
                 goto LOOP;
             }
 
-            for (int j=0; j<MAX_NUM_NODES; j++)
+            for (int j=0; j<avail_sockets; j++)
             {
-                socket_bus[j] = (char*)malloc(4);
-                sprintf(socket_bus[j], "N-A");
+                //socket_bus[j] = (char*)malloc(4);
+                //sprintf(socket_bus[j], "N-A");
                 for (int i=0; i<MAX_NUM_PCI_DEVICES; i++)
                 {
                     FD_PCI[j][i] = -2;
                 }
             }
+            
+            for (int i=1; i<MAX_NUM_PCI_DEVICES; i++)
+            {
+                if (pci_devices_daemon[i].path && strlen(pci_devices_daemon[i].path) > 0)
+                {
+                    int socket_id = getBusFromSocket(&(pci_devices_daemon[i]), 0, NULL);
+                    if (socket_id == 0)
+                    {
+                        for (int j=0; j<avail_sockets; j++)
+                        {
+                            FD_PCI[j][i] = 0;
+                        }
+                        pci_devices_daemon[i].online = 1;
+                    }
+                    else
+                    {
+                        syslog(LOG_ERR, "Device %s for socket %d, excluded it from device list: %s\n",pci_devices_daemon[i].name, 0, strerror(errno));
+                    }
+                }
+            }
 
             /* determine PCI-BUSID mapping ... */
+            /*syslog(LOG_ERR, "Determine PCI-BUSID mapping");
             int sbus = -1;
             cntr = 0;
-            sbus = getBusFromSocket(cntr);
-            while (sbus != -1)
+            sbus = getSocketBus(cntr);
+            syslog(LOG_ERR, "Socket %d Bus %02x", cntr, sbus);
+            while (sbus != -1 && sbus < 0xFF)
             {
                 sprintf(socket_bus[cntr], "%02x/", sbus);
                 cntr++;
-                sbus = getBusFromSocket(cntr);
+                sbus = getSocketBus(cntr);
+                syslog(LOG_ERR, "Socket %d Bus %02x", cntr, sbus);
             }
 
             if ( cntr == 0 )
@@ -1308,13 +1714,13 @@ int main(void)
 #ifdef DEBUG_LIKWID
                             else if (j==0)
                             {
-                                syslog(LOG_NOTICE, "Device %s for socket %d not found at path %s, excluded it from device list: %s\n",pci_devices_daemon[i].name,j, pci_filepath, strerror(errno));
+                                syslog(LOG_ERR, "Device %s for socket %d not found at path %s, excluded it from device list: %s\n",pci_devices_daemon[i].name,j, pci_filepath, strerror(errno));
                             }
 #endif
                         }
                     }
                 }
-            }
+            }*/
         }
     }
 LOOP:
diff --git a/src/access-daemon/setFreq.c b/src/access-daemon/setFreq.c
index 600d827..48edc3a 100644
--- a/src/access-daemon/setFreq.c
+++ b/src/access-daemon/setFreq.c
@@ -3,16 +3,16 @@
  *
  *      Filename:  setFreq.c
  *
- *      Description:  Implementation of frequency daemon
+ *      Description:  Entry point of frequency daemon
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Authors:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *
- *      Authors:  Jan Treibig (jt), jan.treibig at gmail.com,
- *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -29,293 +29,35 @@
  * =======================================================================================
  */
 
-/* #####   HEADER FILE INCLUDES   ######################################### */
-
 #include <stdlib.h>
 #include <stdio.h>
-#include <string.h>
-
-char setfiles[3][100] = {"scaling_min_freq", "scaling_max_freq", "scaling_setspeed"};
-char getfiles[3][100] = {"cpuinfo_min_freq", "cpuinfo_max_freq", "cpuinfo_cur_freq"};
-
-enum cmds {
-    SET_MIN = 0,
-    SET_MAX = 1,
-    SET_CURRENT = 2,
-    SET_GOV
-};
+#include <dirent.h>
+#include <errno.h>
+#include <setFreq.h>
 
-/* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
-
-static void
-help(char *execname)
-{
-    fprintf(stderr, "Usage: %s <processorID> <cmd> <frequency|governor> \n",execname);
-    fprintf(stderr, "       Valid values for <cmd>:\n");
-    fprintf(stderr, "       - cur: change current frequency\n");
-    fprintf(stderr, "       - min: change minimal frequency\n");
-    fprintf(stderr, "       - max: change maximal frequency\n");
-    fprintf(stderr, "       - gov: change governor\n");
-}
 
-static int
-get_numCPUs()
+static int is_pstate()
 {
-    int cpucount = 0;
-    char line[1024];
-    FILE* fp = fopen("/proc/cpuinfo","r");
-    if (fp != NULL)
+    int ret = 1;
+    DIR* dir = opendir("/sys/devices/system/cpu/intel_pstate");
+    if (ENOENT == errno)
     {
-        while( fgets(line, 1024, fp) )
-        {
-            if (strncmp(line, "processor", 9) == 0)
-            {
-                cpucount++;
-            }
-        }
-        fclose(fp);
+        //fprintf(stderr, "\tEXIT WITH ERROR:  intel_pstate is not present!\n");
+        ret = 0;
     }
-    return cpucount;
-}
 
-static unsigned long
-read_freq(char* fstr)
-{
-    unsigned long freq = strtoul(fstr, NULL, 10);
-    if (freq <= 0)
-    {
-        fprintf(stderr, "Frequency must be greater than 0.\n");
-        exit(EXIT_FAILURE);
-    }
-    return freq;
+    closedir(dir);
+    return ret;
 }
 
-static int
-valid_freq(unsigned long freq)
-{
-    FILE *f = NULL;
-    const char fname[] = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies";
-    char delimiter[] = " ";
-    char buff[1024];
-    char freqstr[25];
-    char *ptr = NULL, *eptr = NULL;
-    
-    snprintf(freqstr, 24, "%lu", freq);
-    f = fopen(fname, "r");
-    if (f == NULL)
-    {
-        fprintf(stderr, "Cannot open file %s for reading!\n", fname);
-        return 0;
-    }
-    eptr = fgets(buff, 1024, f);
-    if (eptr == NULL)
-    {
-        fprintf(stderr, "Cannot read content of file %s!\n", fname);
-        fclose(f);
-        return 0;
-    }
-    ptr = strtok(buff, delimiter);
-    while (ptr != NULL)
-    {
-        if (strncmp(ptr, freqstr, strlen(ptr)) == 0)
-        {
-            fclose(f);
-            return 1;
-        }
-        ptr = strtok(NULL, delimiter);
-    }
-    fclose(f);
-    return 0;
-}
 
-static int
-valid_gov(char* gov)
+int main(int argc, char** argv)
 {
-    FILE *f = NULL;
-    const char fname[] = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors";
-    char delimiter[] = " ";
-    char buff[1024];
-    char *ptr = NULL, *eptr = NULL;
-    
-    f = fopen(fname, "r");
-    if (f == NULL)
-    {
-        fprintf(stderr, "Cannot open file %s for reading!\n", fname);
-        return 0;
-    }
-    eptr = fgets(buff, 1024, f);
-    if (eptr == NULL)
+    if (is_pstate())
     {
-        fprintf(stderr, "Cannot read content of file %s!\n", fname);
-        fclose(f);
-        return 0;
-    }
-    ptr = strtok(buff, delimiter);
-    while (ptr != NULL)
-    {
-        if (strncmp(ptr, gov, strlen(ptr)) == 0)
-        {
-            fclose(f);
-            return 1;
-        }
-        ptr = strtok(NULL, delimiter);
-    }
-    fclose(f);
-    return 0;
-}
-
-/* #####  MAIN FUNCTION DEFINITION   ################## */
-
-int
-main (int argn, char** argv)
-{
-    int i = 0;
-    int cpuid = 0;
-    int set_id = -1;
-    unsigned long freq = 0;
-    int numCPUs = 0;
-    enum cmds cmd;
-    char* gov = NULL;
-    char* fpath = NULL;
-    FILE* f = NULL;
-
-    if (argn < 3 || argn > 4)
-    {
-        help(argv[0]);
-        exit(EXIT_FAILURE);
-    }
-
-    /* Check for valid CPU */
-    cpuid = atoi(argv[1]);
-    numCPUs = get_numCPUs();
-    if (cpuid < 0 || cpuid > numCPUs)
-    {
-        fprintf(stderr, "CPU %d not a valid CPU ID. Range from 0 to %d.\n", cpuid, numCPUs);
-        exit(EXIT_FAILURE);
-    }
-
-    /* Read in command and argument */
-    if (strncmp(argv[2], "cur", 3) == 0)
-    {
-        cmd = SET_CURRENT;
-        freq = read_freq(argv[3]);
-        if (!valid_freq(freq))
-        {
-            fprintf(stderr, "Invalid frequency %lu!\n\n",freq);
-            help(argv[0]);
-            exit(EXIT_FAILURE);
-        }
-    }
-    else if (strncmp(argv[2], "min", 3) == 0)
-    {
-        cmd = SET_MIN;
-        freq = read_freq(argv[3]);
-        if (!valid_freq(freq))
-        {
-            fprintf(stderr, "Invalid frequency %lu!\n\n",freq);
-            help(argv[0]);
-            exit(EXIT_FAILURE);
-        }
-    }
-    else if (strncmp(argv[2], "max", 3) == 0)
-    {
-        cmd = SET_MAX;
-        freq = read_freq(argv[3]);
-        if (!valid_freq(freq))
-        {
-            fprintf(stderr, "Invalid frequency %lu!\n\n",freq);
-            help(argv[0]);
-            exit(EXIT_FAILURE);
-        }
-    }
-    else if (strncmp(argv[2], "gov", 3) == 0)
-    {
-        cmd = SET_GOV;
-        gov = argv[3];
-        /* Only allow specific governors */
-        if (!valid_gov(gov))
-        {
-            fprintf(stderr, "Invalid governor %s!\n\n",gov);
-            help(argv[0]);
-            exit(EXIT_FAILURE);
-        }
+        printf("Pstate driver\n");
+        return do_pstate(argc, argv);
     }
     else
-    {
-        fprintf(stderr, "Unknown command %s!\n\n", argv[2]);
-        help(argv[0]);
-        exit(EXIT_FAILURE);
-    }
-
-    fpath = malloc(100 * sizeof(char));
-    if (!fpath)
-    {
-        fprintf(stderr, "Unable to allocate space!\n\n");
-        exit(EXIT_FAILURE);
-    }
-
-    /* If the current frequency should be set we have to make sure that the governor is
-     * 'userspace'. Minimal and maximal frequency are possible for other governors but
-     * they dynamically adjust the current clock speed.
-     */
-    if (cmd == SET_CURRENT)
-    {
-        int tmp = 0;
-        char testgov[1024];
-        snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpuid);
-        f = fopen(fpath, "r");
-        if (f == NULL) {
-            fprintf(stderr, "Unable to open path %s for reading\n",fpath);
-            free(fpath);
-            return (EXIT_FAILURE);
-        }
-        tmp = fread(testgov, 100, sizeof(char), f);
-        if (strncmp(testgov, "userspace", 9) != 0)
-        {
-            fclose(f);
-            snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpuid);
-            f = fopen(fpath, "w");
-            if (f == NULL) {
-                fprintf(stderr, "Unable to open path %s for writing\n", fpath);
-                free(fpath);
-                return (EXIT_FAILURE);
-            }
-            fprintf(f,"userspace");
-        }
-        fclose(f);
-    }
-
-    switch(cmd)
-    {
-        case SET_CURRENT:
-        case SET_MIN:
-        case SET_MAX:
-            /* The cmd is also used as index in the setfiles array */
-            snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/%s", cpuid, setfiles[cmd]);
-            f = fopen(fpath, "w");
-            if (f == NULL) {
-                fprintf(stderr, "Unable to open path %s for writing\n",fpath);
-                free(fpath);
-                return (EXIT_FAILURE);
-            }
-            fprintf(f,"%d",freq);
-            fclose(f);
-            break;
-        case SET_GOV:
-            snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpuid);
-            f = fopen(fpath, "w");
-            if (f == NULL) {
-                fprintf(stderr, "Unable to open path %s for writing\n", fpath);
-                free(fpath);
-                return (EXIT_FAILURE);
-            }
-            fprintf(f,"%s",gov);
-            fclose(f);
-            break;
-    }
-    
-    free(fpath);
-    return EXIT_SUCCESS;
-
+        return do_cpufreq(argc, argv);
 }
-
diff --git a/src/includes/cpuid.h b/src/access-daemon/setFreq.h
similarity index 79%
copy from src/includes/cpuid.h
copy to src/access-daemon/setFreq.h
index 273e179..01e1aa1 100644
--- a/src/includes/cpuid.h
+++ b/src/access-daemon/setFreq.h
@@ -1,17 +1,18 @@
 /*
  * =======================================================================================
  *
- *      Filename:  cpuid.h
+ *      Filename:  setFreq.h
  *
- *      Description:  Common macro definition for CPUID instruction
+ *      Description:  Header for frequency daemon
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Authors:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *
- *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -27,13 +28,9 @@
  *
  * =======================================================================================
  */
-#ifndef LIKWID_CPUID_H
-#define LIKWID_CPUID_H
 
-/* This was taken from the linux kernel
- * Kernel version 3.19
- * File: arch/x86/boot/cpuflags.c
-*/
+#ifndef SETFREQ_DAEMON
+#define SETFREQ_DAEMON
 
 #if defined(__i386__) && defined(__PIC__)
 # define EBX_REG "=r"
@@ -54,4 +51,7 @@
     __asm__ volatile("cpuid" : "=a" (eax), "=c" (ecx), "=d" (edx), EBX_REG (ebx) : "a" (eax), "c" (ecx) );
 #endif
 
+extern int do_pstate (int argn, char** argv);
+extern int do_cpufreq (int argn, char** argv);
+
 #endif
diff --git a/src/access-daemon/setFreq_cpufreq.c b/src/access-daemon/setFreq_cpufreq.c
new file mode 100644
index 0000000..f85d951
--- /dev/null
+++ b/src/access-daemon/setFreq_cpufreq.c
@@ -0,0 +1,551 @@
+/*
+ * =======================================================================================
+ *
+ *      Filename:  setFreq_cpufreq.c
+ *
+ *      Description:  Implementation of frequency daemon with ACPI-CPUFreq backend
+ *
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Authors:  Jan Treibig (jt), jan.treibig at gmail.com,
+ *                Thomas Roehl (tr), thomas.roehl at googlemail.com
+ *      Project:  likwid
+ *
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+ *
+ *      This program is free software: you can redistribute it and/or modify it under
+ *      the terms of the GNU General Public License as published by the Free Software
+ *      Foundation, either version 3 of the License, or (at your option) any later
+ *      version.
+ *
+ *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License along with
+ *      this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * =======================================================================================
+ */
+
+/* #####   HEADER FILE INCLUDES   ######################################### */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <setFreq.h>
+
+#define AMD_TURBO_MSR 0xC0010015
+
+static char setfiles[3][100] = {"scaling_min_freq", "scaling_max_freq", "scaling_setspeed"};
+static char getfiles[3][100] = {"cpuinfo_min_freq", "cpuinfo_max_freq", "cpuinfo_cur_freq"};
+
+static char turbo_step[20];
+static char steps[30][20];
+static int num_steps = 0;
+
+static char governors[20][30];
+static int num_govs = 0;
+
+enum command {
+    MINIMUM = 0,
+    MAXIMUM = 1,
+    TURBO = 2,
+    GOVERNER
+};
+
+/* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
+
+static int isTurbo(const int cpu_id)
+{
+    FILE *f = NULL;
+    char buff[256];
+    char *rptr = NULL, *sptr = NULL;
+
+    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu_id);
+    f = fopen(buff, "r");
+    if (f == NULL)
+    {
+        fprintf(stderr, "Unable to open path %s for reading\n", buff);
+        return 0;
+    }
+    rptr = fgets(buff, 256, f);
+    if (strlen(turbo_step) > 0 && strncmp(turbo_step, rptr, strlen(turbo_step)) == 0)
+    {
+        return 1;
+    }
+    return 0;
+}
+
+static int isAMD()
+{
+    unsigned int eax,ebx,ecx,edx;
+    eax = 0x0;
+    CPUID(eax,ebx,ecx,edx);
+    if (ecx == 0x444d4163)
+        return 1;
+    return 0;
+}
+
+static int setAMDTurbo(const int cpu_id, const int turbo)
+{
+    int ret = 0;
+    int fd = 0;
+    unsigned long int data = 0x0ULL;
+    char buff[256];
+    sprintf(buff, "/dev/cpu/%d/msr", cpu_id);
+    fd = open(buff, O_RDWR);
+    ret = pread(fd, &data, sizeof(unsigned long int), AMD_TURBO_MSR);
+
+    if (turbo)
+    {
+        data &= ~(1ULL << 25);
+    }
+    else
+    {
+        data |= (1ULL << 25);
+    }
+    ret = pwrite(fd, &data, sizeof(unsigned long int), AMD_TURBO_MSR);
+    if (ret != sizeof(unsigned long int))
+        return EXIT_FAILURE;
+    return EXIT_SUCCESS;
+}
+
+
+static int getAvailFreq(const int cpu_id )
+{
+    int i, j, k;
+    FILE *f = NULL;
+    char buff[256];
+    char tmp[10];
+    char *rptr = NULL, *sptr = NULL;
+    unsigned int d = 0;
+
+    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_available_frequencies", cpu_id);
+    f = fopen(buff, "r");
+    if (f == NULL)
+    {
+        fprintf(stderr, "Unable to open path %s for reading\n", buff);
+        return 0;
+    }
+    rptr = fgets(buff, 256, f);
+    if (rptr != NULL)
+    {
+        sptr = strtok(buff, " ");
+        if (sptr != NULL)
+        {
+            d = strtoul(sptr, NULL, 10);
+            snprintf(turbo_step, 19, "%u", d);
+        }
+        while (sptr != NULL)
+        {
+            if (sptr != NULL)
+            {
+                d = strtoul(sptr, NULL, 10);
+                if (d == 0)
+                    break;
+                if (num_steps < 30)
+                {
+                    snprintf(steps[num_steps], 19, "%u", d);
+                    num_steps++;
+                }
+            }
+            sptr = strtok(NULL, " ");
+        }
+    }
+    fclose(f);
+    return num_steps;
+}
+
+static int getAvailGovs(const int cpu_id )
+{
+    int i, j, k;
+    FILE *f = NULL;
+    char cmd[256];
+    char buff[256];
+    char tmp[10];
+    char* eptr = NULL, *rptr = NULL;
+
+    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_available_governors", cpu_id);
+    f = fopen(buff, "r");
+    if (f == NULL)
+    {
+        fprintf(stderr, "Unable to open path %s for reading\n", buff);
+        return 0;
+    }
+    rptr = fgets(buff, 256, f);
+    if (rptr != NULL)
+    {
+        eptr = strtok(buff, " ");
+        snprintf(governors[num_govs], 19, "%s", eptr);
+        num_govs++;
+        while (eptr != NULL)
+        {
+            eptr = strtok(NULL, " ");
+            if (eptr != NULL && num_govs < 20 && strlen(eptr) > 1)
+            {
+                snprintf(governors[num_govs], 19, "%s", eptr);
+                num_govs++;
+            }
+        }
+    }
+/*    if (num_govs > 0 && strlen(turbo_step) > 0 && num_govs < 20)*/
+/*    {*/
+/*        snprintf(governors[num_govs], 19, "turbo");*/
+/*        num_govs++;*/
+/*    }*/
+    fclose(f);
+    return num_govs;
+}
+
+static void
+help(char *execname)
+{
+    int nsteps = num_steps, ngovs = num_govs;
+    int stepstart = 0;
+    fprintf(stderr, "Usage: %s <processorID> <cmd> <frequency|governor> \n",execname);
+    fprintf(stderr, "       Valid values for <cmd>:\n");
+    fprintf(stderr, "       - min: change minimum ratio limit of frequency\n");
+    fprintf(stderr, "       - max: change maximum ratio limit of frequency\n");
+    fprintf(stderr, "       - tur: Turn turbo \"on\" or \"off\"\n");
+    fprintf(stderr, "       - gov: change governor\n");
+    printf("Frequency steps: (Freqs. in kHz)\n");
+    if (num_steps == 0)
+        nsteps = getAvailFreq(0);
+
+    if ((!isTurbo(0)) && (!isAMD()))
+        stepstart = 1;
+    for (int s=nsteps-1; s>=stepstart; s--)
+        printf("%s ", steps[s]);
+    printf("\n");
+    printf("Governors:\n");
+    if (num_govs == 0)
+        ngovs = getAvailGovs(0);
+    for (int s=0; s<ngovs; s++)
+        printf("%s ", governors[s]);
+    printf("\n");
+    //printf("%s\n", eptr);
+}
+
+static int
+get_numCPUs()
+{
+    int cpucount = 0;
+    char line[1024];
+    FILE* fp = fopen("/proc/cpuinfo","r");
+    if (fp != NULL)
+    {
+        while( fgets(line, 1024, fp) )
+        {
+            if (strncmp(line, "processor", 9) == 0)
+            {
+                cpucount++;
+            }
+        }
+        fclose(fp);
+    }
+    return cpucount;
+}
+
+static unsigned int
+read_freq(char* fstr)
+{
+    unsigned int freq = strtoul(fstr, NULL, 10);
+    printf("%u\n", freq);
+    if (freq == 0)
+    {
+        fprintf(stderr, "Frequency must be greater than 0.\n");
+        exit(EXIT_FAILURE);
+    }
+    return freq;
+}
+
+static int
+valid_freq(unsigned long freq)
+{
+    FILE *f = NULL;
+    const char fname[] = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies";
+    char delimiter[] = " ";
+    char buff[1024];
+    char freqstr[25];
+    char *ptr = NULL, *eptr = NULL;
+    
+    snprintf(freqstr, 24, "%lu", freq);
+    f = fopen(fname, "r");
+    if (f == NULL)
+    {
+        fprintf(stderr, "Cannot open file %s for reading!\n", fname);
+        return 0;
+    }
+    eptr = fgets(buff, 1024, f);
+    if (eptr == NULL)
+    {
+        fprintf(stderr, "Cannot read content of file %s!\n", fname);
+        fclose(f);
+        return 0;
+    }
+    ptr = strtok(buff, delimiter);
+    while (ptr != NULL)
+    {
+        if (strncmp(ptr, freqstr, strlen(ptr)) == 0)
+        {
+            fclose(f);
+            return 1;
+        }
+        ptr = strtok(NULL, delimiter);
+    }
+    fclose(f);
+    return 0;
+}
+
+static int
+valid_gov(char* gov)
+{
+    FILE *f = NULL;
+    const char fname[] = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors";
+    char delimiter[] = " ";
+    char buff[1024];
+    char *ptr = NULL, *eptr = NULL;
+
+    f = fopen(fname, "r");
+    if (f == NULL)
+    {
+        fprintf(stderr, "Cannot open file %s for reading!\n", fname);
+        return 0;
+    }
+    eptr = fgets(buff, 1024, f);
+    if (eptr == NULL)
+    {
+        fprintf(stderr, "Cannot read content of file %s!\n", fname);
+        fclose(f);
+        return 0;
+    }
+    ptr = strtok(buff, delimiter);
+    while (ptr != NULL)
+    {
+        if (strncmp(ptr, gov, strlen(ptr)) == 0)
+        {
+            fclose(f);
+            return 1;
+        }
+        ptr = strtok(NULL, delimiter);
+    }
+    fclose(f);
+    return 0;
+}
+
+/* #####  MAIN FUNCTION DEFINITION   ################## */
+
+int
+do_cpufreq (int argn, char** argv)
+{
+    int i = 0;
+    int cpuid = 0;
+    int set_id = -1;
+    unsigned int freq = 0;
+    int turbo = -1;
+    int numCPUs = 0;
+    enum command cmd;
+    char* gov = NULL;
+    char* fpath = NULL;
+    FILE* f = NULL;
+    int num_steps = 0, num_govs = 0;
+
+    if (argn < 3 || argn > 4)
+    {
+        help(argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    /* Check for valid CPU */
+    cpuid = atoi(argv[1]);
+    num_steps = getAvailFreq(cpuid);
+    num_govs = getAvailGovs(cpuid);
+    numCPUs = get_numCPUs();
+    if (cpuid < 0 || cpuid > numCPUs)
+    {
+        fprintf(stderr, "CPU %d not a valid CPU ID. Range from 0 to %d.\n", cpuid, numCPUs);
+        exit(EXIT_FAILURE);
+    }
+
+    /* Read in command and argument */
+    if (strncmp(argv[2], "tur", 3) == 0)
+    {
+        cmd = TURBO;
+        if (strncmp(argv[3], "0", 1) != 0 && strncmp(argv[3], "1", 1) != 0)
+        {
+            fprintf(stderr, "Invalid turbo setting %s! Only 0 (off) and 1 (on) allowed\n\n",argv[3]);
+            help(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+        turbo = atoi(argv[3]);
+        if (turbo < 0 || turbo > 1)
+        {
+            fprintf(stderr, "Invalid turbo setting %d! Only 0 (off) and 1(on) allowed\n\n",turbo);
+            help(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+    }
+    else if (strncmp(argv[2], "min", 3) == 0)
+    {
+        cmd = MINIMUM;
+        freq = read_freq(argv[3]);
+        if (!valid_freq(freq))
+        {
+            fprintf(stderr, "Invalid frequency %lu!\n",freq);
+            if (freq == read_freq(turbo_step))
+            {
+                fprintf(stderr, "In order to set the turbo frequency, use tur(bo) option\n");
+            }
+            fprintf(stderr, "\n\n");
+            help(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+    }
+    else if (strncmp(argv[2], "max", 3) == 0)
+    {
+        cmd = MAXIMUM;
+        freq = read_freq(argv[3]);
+        if (!valid_freq(freq))
+        {
+            fprintf(stderr, "Invalid frequency %lu!\n",freq);
+            if (freq == read_freq(turbo_step))
+            {
+                fprintf(stderr, "In order to set the turbo frequency, use tur(bo) option\n");
+            }
+            fprintf(stderr, "\n\n");
+            help(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+    }
+    else if (strncmp(argv[2], "gov", 3) == 0)
+    {
+        cmd = GOVERNER;
+        gov = argv[3];
+        /* Only allow specific governors */
+        if (!valid_gov(gov))
+        {
+            fprintf(stderr, "Invalid governor %s!\n\n",gov);
+            help(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+    }
+    else
+    {
+        fprintf(stderr, "Unknown command %s!\n\n", argv[2]);
+        help(argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    fpath = malloc(100 * sizeof(char));
+    if (!fpath)
+    {
+        fprintf(stderr, "Unable to allocate space!\n\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* If the current frequency should be set we have to make sure that the governor is
+     * 'userspace'. Minimal and maximal frequency are possible for other governors but
+     * they dynamically adjust the current clock speed.
+     */
+    if (cmd == MINIMUM || cmd == MAXIMUM)
+    {
+        int tmp = 0;
+        char testgov[1024];
+        snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpuid);
+        f = fopen(fpath, "r");
+        if (f == NULL) {
+            fprintf(stderr, "Unable to open path %s for reading\n",fpath);
+            free(fpath);
+            return (EXIT_FAILURE);
+        }
+        tmp = fread(testgov, 100, sizeof(char), f);
+/*        if (strncmp(testgov, "userspace", 9) != 0)*/
+/*        {*/
+/*            fclose(f);*/
+/*            snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpuid);*/
+/*            f = fopen(fpath, "w");*/
+/*            if (f == NULL) {*/
+/*                fprintf(stderr, "Unable to open path %s for writing\n", fpath);*/
+/*                free(fpath);*/
+/*                return (EXIT_FAILURE);*/
+/*            }*/
+/*            fprintf(f,"userspace");*/
+/*        }*/
+        fclose(f);
+    }
+
+    switch(cmd)
+    {
+        //case SET_CURRENT:
+        case MINIMUM:
+        case MAXIMUM:
+            /* The cmd is also used as index in the setfiles array */
+            snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/%s", cpuid, setfiles[cmd]);
+            f = fopen(fpath, "w");
+            if (f == NULL) {
+                fprintf(stderr, "Unable to open path %s for writing\n",fpath);
+                free(fpath);
+                return (EXIT_FAILURE);
+            }
+            fprintf(f,"%u",freq);
+            fclose(f);
+            break;
+        case TURBO:
+            if (!isAMD())
+            {
+                if (turbo == 0)
+                {
+                    double fr = 0;
+                    snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/%s", cpuid, setfiles[MAXIMUM]);
+                    f = fopen(fpath, "w");
+                    if (f == NULL) {
+                        fprintf(stderr, "Unable to open path %s for writing\n",fpath);
+                        free(fpath);
+                        return (EXIT_FAILURE);
+                    }
+                    fprintf(f,"%s",steps[1]);
+                    fclose(f);
+                }
+                else
+                {
+                    snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/%s", cpuid, setfiles[MAXIMUM]);
+                    f = fopen(fpath, "w");
+                    if (f == NULL) {
+                        fprintf(stderr, "Unable to open path %s for writing\n",fpath);
+                        free(fpath);
+                        return (EXIT_FAILURE);
+                    }
+                    fprintf(f,"%s", turbo_step);
+                    fclose(f);
+                }
+            }
+            else
+            {
+                return setAMDTurbo(cpuid, turbo);
+            }
+            break;
+        case GOVERNER:
+            snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor", cpuid);
+            f = fopen(fpath, "w");
+            if (f == NULL) {
+                fprintf(stderr, "Unable to open path %s for writing\n", fpath);
+                free(fpath);
+                return (EXIT_FAILURE);
+            }
+            fprintf(f,"%s",gov);
+            fclose(f);
+            break;
+    }
+    
+    free(fpath);
+    return EXIT_SUCCESS;
+
+}
+
diff --git a/src/access-daemon/setFreq_pstate.c b/src/access-daemon/setFreq_pstate.c
new file mode 100644
index 0000000..acad0ba
--- /dev/null
+++ b/src/access-daemon/setFreq_pstate.c
@@ -0,0 +1,498 @@
+/*
+ * =======================================================================================
+ *
+ *      Filename:  setFreq_pstate.c
+ *
+ *      Description:  Implementation of frequency daemon with Intel PState backend
+ *
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Authors:  Thomas Roehl (tr), thomas.roehl at googlemail.com
+ *
+ *      Project:  likwid
+ *
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+ *
+ *      This program is free software: you can redistribute it and/or modify it under
+ *      the terms of the GNU General Public License as published by the Free Software
+ *      Foundation, either version 3 of the License, or (at your option) any later
+ *      version.
+ *
+ *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License along with
+ *      this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * =======================================================================================
+ */
+
+/* #####   HEADER FILE INCLUDES   ######################################### */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <dirent.h>
+#include <errno.h>
+#include <setFreq.h>
+
+static char setfiles[3][100] = {"min_perf_pct", "max_perf_pct","no_turbo"};
+static char getfiles[3][100] = {"cpuinfo_min_freq", "cpuinfo_max_freq", "cpuinfo_cur_freq"};
+static char governers[20][100];
+static unsigned int freqs[100];
+static unsigned int percent[100];
+
+enum command {
+    MINIMUM = 0,
+    MAXIMUM = 1,
+    TURBO = 2,
+    GOVERNOR
+};
+
+/* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
+
+static void help(char *execname)
+{
+    fprintf(stderr, "Usage: %s <processorID> <cmd> <frequency|governor> \n",execname);
+    fprintf(stderr, "       Valid values for <cmd>:\n");
+    fprintf(stderr, "       - min: change minimum ratio limit of frequency\n");
+    fprintf(stderr, "       - max: change maximum ratio limit of frequency\n");
+    fprintf(stderr, "       - tur: Turn turbo \"on\" or \"off\"\n");
+    fprintf(stderr, "       - gov: change governor\n");
+}
+
+static int check_driver()
+{
+    int ret = 1;
+    DIR* dir = opendir("/sys/devices/system/cpu/intel_pstate");
+    if (ENOENT == errno)
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  intel_pstate is not present!\n");
+        ret = 0;
+    }
+
+    closedir(dir);
+    return ret;
+}
+
+static unsigned int getMax()
+{
+    char line[1024];
+    unsigned int maxFreq = 0;
+    char* eptr;
+    FILE* fp = fopen("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq", "r");
+    if(fp != NULL)
+    {
+        eptr = fgets(line, 1024, fp);
+        maxFreq = strtoul(line, NULL, 10);
+        fclose(fp);
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+
+    return maxFreq;
+}
+
+static unsigned int getCurMax()
+{
+    char line[1024];
+    unsigned int maxFreq = 0;
+    char* eptr;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/max_perf_pct", "r");
+    if(fp != NULL)
+    {
+        eptr = fgets(line, 1024, fp);
+        maxFreq = strtoul(line, NULL, 10);
+        fclose(fp);
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+
+    return maxFreq;
+}
+
+
+static unsigned int getMin()
+{
+    char line[1024];
+    unsigned int minFreq = 0;
+    char* eptr;
+    FILE* fp = fopen("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq", "r");
+    if(fp != NULL)
+    {
+        eptr = fgets(line, 1024, fp);
+        minFreq = strtoul(line, NULL, 10);
+        fclose(fp);
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+
+    return minFreq;
+}
+
+static unsigned int getCurMin()
+{
+    char line[1024];
+    unsigned int minFreq = 0;
+    char* eptr;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/min_perf_pct", "r");
+    if(fp != NULL)
+    {
+        eptr = fgets(line, 1024, fp);
+        minFreq = strtoul(line, NULL, 10);
+        fclose(fp);
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+
+    return minFreq;
+}
+
+static unsigned int turbo_pct()
+{
+    char readval[4];
+    unsigned int turbo_pct;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/turbo_pct","r");
+    if (fp != NULL)
+    {
+        while( fgets(readval, 4, fp) )
+        {
+            turbo_pct = strtoul(readval,NULL,10);
+        }
+        fclose(fp);
+    }
+    return turbo_pct;
+}
+
+static unsigned int num_pstates()
+{
+    char readval[4];
+    unsigned int num;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/num_pstates","r");
+    if (fp != NULL)
+    {
+        while( fgets(readval, 4, fp) )
+        {
+            num = strtoul(readval,NULL,10);
+        }
+        fclose(fp);
+    }
+    else
+    {
+        exit(1);
+    }
+    return num;
+}
+
+static int mode()
+{
+    char readval[5];
+    char tmode;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/no_turbo","r");
+    if (fp != NULL)
+    {
+        while( fgets(readval, 5, fp) )
+        {
+            tmode = atoi(readval);
+        }
+        fclose(fp);
+    }
+    return tmode;
+}
+
+
+static int getGov()
+{
+    FILE *f = NULL;
+    const char fname[] = "/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors";
+    char delimiter[] = " ";
+    char buff[1024];
+    char *ptr = NULL, *eptr = NULL;
+    unsigned int count = 0;
+
+    f = fopen(fname, "r");
+    if (f == NULL)
+    {
+        fprintf(stderr, "Cannot open file %s for reading!\n", fname);
+        return 0;
+    }
+    eptr = fgets(buff, 1024, f);
+
+    if (eptr == NULL)
+    {
+        fprintf(stderr, "Cannot read content of file %s!\n", fname);
+        fclose(f);
+        return 0;
+    }
+    ptr = strtok(buff, delimiter);
+    while (ptr != NULL)
+    {
+        strcpy(governers[count],ptr);
+        ptr = strtok(NULL, delimiter);
+        ptr = strtok(ptr, "\n");
+        count= count + 1;
+    }
+    fclose(f);
+    return 0;
+}
+
+static void steps()
+{
+    unsigned int minFreq = getMin();
+    unsigned int trb = turbo_pct();
+    unsigned int maxFreq = getMax();
+    unsigned int step = num_pstates();
+    int range = 0;
+
+    if(maxFreq != 0)
+    {
+        int t = mode();
+        if (t != 0)
+        {
+            maxFreq = getMax()/(1+0.01*trb);
+        }
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+    if(step != 0)
+    {
+        range = (maxFreq-minFreq)/step;
+        freqs[0] = minFreq;
+        freqs[step-1]= maxFreq;
+        percent[0] = (minFreq/(float)maxFreq) * 100;
+        percent[step-1] = 100;
+
+        for(size_t i=1; i < step-1; i++)
+        {
+            freqs[i] = minFreq+ i* range;
+            percent[i] = (freqs[i]/(float)maxFreq) * 100;
+        }
+    }
+    else
+    {
+        fprintf(stderr,"\tEXIT WITH ERROR:  # of pstates could not be read");
+    }
+}
+
+static void throw(char* arg)
+{
+    unsigned int step = num_pstates();
+    unsigned int count = 0;
+    help(arg);
+    printf("Frequency steps: (Freqs. in kHz)\n");
+    for(unsigned int i=0; i < step; i++)
+    {
+        //printf("\t%.1f\t%u %s\n",1E-6*((double)freqs[i]),percent[i],"%");
+        unsigned int t = (freqs[i]/10000)*10000;
+        
+        printf("%lu ", t);
+    }
+    printf("\n");
+    printf("Governors:\n");
+    while (strcmp(governers[count],"") != 0)
+    {
+        printf("%s ",governers[count]);
+        count+=1;
+    }
+    printf("\n");
+}
+
+static int valid_gov(char* gov)
+{
+    unsigned int count = 0;
+    while (strcmp(governers[count],"") != 0)
+    {
+        if (strncmp(governers[count], gov, strlen(governers[count])) == 0)
+        {
+            return 1;
+        }
+        count = count + 1;
+    }
+    return 0;
+}
+
+static int valid_freq(char* freq)
+{
+    int idx = -1;
+    int ret = 0;
+    unsigned int step = num_pstates();
+    char fstep[20];
+    unsigned int f = (unsigned int)(atof(freq)*1000000);
+    for (int s=0;s<step;s++)
+    {
+        if ((freqs[s] >= f-10000) && ((freqs[s] <= f+10000)))
+        {
+            idx = s;
+            break;
+        }
+/*        memset(fstep, 0, 20*sizeof(char));*/
+/*        ret = sprintf(fstep, "%.1f", 1E-6*((double)freqs[s]));*/
+/*        fstep[ret] = '\0';*/
+/*        if (strcmp(fstep, freq) == 0)*/
+/*        {*/
+/*            idx = s;*/
+/*            break;*/
+/*        }*/
+    }
+    return idx;
+}
+
+
+int
+do_pstate (int argn, char** argv)
+{
+    check_driver();
+    steps();
+    getGov();
+    unsigned int step = num_pstates();
+    unsigned int minFreq = freqs[0];
+    unsigned int maxFreq = freqs[step-1];
+    int frq_pct = -1;
+    int idx = -1;
+    char* gov = NULL;
+    char* freq = NULL;
+    FILE *f = NULL;
+    enum command key;
+    char* fpath = NULL;
+
+    if (argn != 4)
+    {
+        throw(argv[0]);
+        exit(EXIT_FAILURE);
+    }
+    freq = argv[3];
+
+    if (strncmp(argv[2], "min", 3) == 0)
+    {
+        key = MINIMUM;
+        idx = valid_freq(freq);
+        if (idx < 0)
+        {
+            fprintf(stderr, "Invalid frequency %s!\n\n",freq);
+            throw(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+        frq_pct = percent[idx];
+    }
+    else if (strncmp(argv[2], "max", 3) == 0)
+    {
+        key = MAXIMUM;
+        idx = valid_freq(freq);
+
+        if (idx < 0)
+        {
+            fprintf(stderr, "Invalid frequency %s!\n\n",freq);
+            throw(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+        frq_pct = percent[idx];
+    }
+
+    else if (strncmp(argv[2], "gov", 3) == 0)
+    {
+        key = GOVERNOR;
+        gov = argv[3];
+        if (!valid_gov(gov))
+        {
+            fprintf(stderr, "Invalid governor %s!\n\n",gov);
+            throw(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+    }
+    else if (strncmp(argv[2], "tur", 3) == 0)
+    {
+        key = TURBO;
+        frq_pct = atoi(argv[3]);
+        if (frq_pct != 0 && frq_pct != 1)
+        {
+            fprintf(stderr, "Invalid value for trubo mode: \"%u\"!, the value must be either 0 or 1 \n\n",frq_pct);
+            throw(argv[0]);
+            exit(EXIT_FAILURE);
+        }
+        frq_pct = (frq_pct == 1 ? 0 : 1);
+    }
+    else
+    {
+        fprintf(stderr, "Unknown command %s!\n\n", argv[1]);
+        throw(argv[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    fpath = malloc(100 * sizeof(char));
+    if (!fpath)
+    {
+        fprintf(stderr, "Unable to allocate space!\n\n");
+        exit(EXIT_FAILURE);
+    }
+
+redo:
+    switch(key)
+    {
+        case MINIMUM:
+        case MAXIMUM:
+            snprintf(fpath, 99, "/sys/devices/system/cpu/intel_pstate/%s", setfiles[key]);
+            printf("File %s\n", fpath);
+            f = fopen(fpath, "w+");
+            if (f == NULL) {
+                fprintf(stderr, "Unable to open path \"%s\" for writing\n",fpath);
+                free(fpath);
+                return (EXIT_FAILURE);
+            }
+            printf("Write percentage %lu\n", frq_pct);
+            fprintf(f,"%u",frq_pct);
+            fclose(f);
+            break;
+
+        case GOVERNOR:
+            snprintf(fpath, 99, "/sys/devices/system/cpu/cpu%s/cpufreq/scaling_governor", argv[1]);
+            unsigned int bturbo = mode();
+            f = fopen(fpath, "w");
+            if (f == NULL) {
+                fprintf(stderr, "Unable to open path \"%s\" for writing\n", fpath);
+                free(fpath);
+                return (EXIT_FAILURE);
+            }
+            fprintf(f,"%s",gov);
+            fclose(f);
+            unsigned int aturbo = mode();
+            if (bturbo != aturbo)
+            {
+                frq_pct = bturbo;
+                key = TURBO;
+                goto redo;
+            }
+            break;
+
+        case TURBO:
+            snprintf(fpath, 99, "/sys/devices/system/cpu/intel_pstate/%s", setfiles[key]);
+            f = fopen(fpath, "w+");
+            if (f == NULL) {
+                fprintf(stderr, "Unable to open path \"%s\" for writing\n",fpath);
+                free(fpath);
+                return (EXIT_FAILURE);
+            }
+            fprintf(f,"%u",frq_pct);
+            fclose(f);
+            break;
+    }
+
+    return 0;
+}
+
diff --git a/src/access.c b/src/access.c
index 3bf67d1..89602a3 100644
--- a/src/access.c
+++ b/src/access.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Interface for the different register access modules.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -57,7 +57,7 @@
 /* #####   VARIABLES  -  LOCAL TO THIS SOURCE FILE   ###################### */
 
 static int registeredCpus = 0;
-static int registeredCpuList[MAX_NUM_THREADS] = { [0 ... (MAX_NUM_THREADS-1)] = 0 };
+static int *registeredCpuList = NULL;
 static int (*access_read)(PciDeviceIndex dev, const int cpu, uint32_t reg, uint64_t *data) = NULL;
 static int (*access_write)(PciDeviceIndex dev, const int cpu, uint32_t reg, uint64_t data) = NULL;
 static int (*access_init) (int cpu_id) = NULL;
@@ -79,6 +79,12 @@ int
 HPMinit(void)
 {
     int ret = 0;
+    if (registeredCpuList == NULL)
+    {
+        registeredCpuList = malloc(cpuid_topology.numHWThreads* sizeof(int));
+        memset(registeredCpuList, 0, cpuid_topology.numHWThreads* sizeof(int));
+        registeredCpus = 0;
+    }
     if (access_init == NULL)
     {
 #if defined(__x86_64__) || defined(__i386__)
@@ -162,6 +168,11 @@ HPMfinalize()
                 registeredCpuList[i] = 0;
             }
         }
+        if (registeredCpuList && registeredCpus == 0)
+        {
+            free(registeredCpuList);
+            registeredCpuList = NULL;
+        }
     }
     if (access_init != NULL)
         access_init = NULL;
diff --git a/src/access_client.c b/src/access_client.c
index a178811..d2f29a0 100644
--- a/src/access_client.c
+++ b/src/access_client.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Interface to the access daemon for the access module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -59,9 +59,9 @@
 static int globalSocket = -1;
 static pid_t masterPid = 0;
 static int cpuSockets_open = 0;
-static int cpuSockets[MAX_NUM_THREADS] = { [0 ... MAX_NUM_THREADS-1] = -1};
+static int *cpuSockets = NULL;
 static pthread_mutex_t globalLock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t cpuLocks[MAX_NUM_THREADS] = { [0 ... MAX_NUM_THREADS-1] = PTHREAD_MUTEX_INITIALIZER };
+static pthread_mutex_t *cpuLocks = NULL;
 
 /* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
 
@@ -102,6 +102,7 @@ static int
 access_client_startDaemon(int cpu_id)
 {
     /* Check the function of the daemon here */
+    int res = 0;
     char* filepath;
     char *newargv[] = { NULL };
     char *newenv[] = { NULL };
@@ -113,6 +114,7 @@ access_client_startDaemon(int cpu_id)
     pid_t pid;
     int timeout = 1000;
     int socket_fd = -1;
+    int print_once = 0;
 
     if (config.daemonPath != NULL)
     {
@@ -162,10 +164,10 @@ access_client_startDaemon(int cpu_id)
     snprintf(address.sun_path, sizeof(address.sun_path), TOSTRING(LIKWIDSOCKETBASE) "-%d", pid);
     filepath = strdup(address.sun_path);
 
-    while (timeout > 0)
+    res = connect(socket_fd, (struct sockaddr *) &address, address_length);
+    while (res && timeout > 0)
     {
-        int res;
-        usleep(1000);
+        usleep(2500);
         res = connect(socket_fd, (struct sockaddr *) &address, address_length);
 
         if (res == 0)
@@ -197,10 +199,26 @@ access_client_startDaemon(int cpu_id)
 int
 access_client_init(int cpu_id)
 {
+    topology_init();
+    numa_init();
+    affinity_init();
     if (masterPid != 0 && gettid() == masterPid)
     {
         return 0;
     }
+    if (!cpuSockets)
+    {
+        cpuSockets = malloc(cpuid_topology.numHWThreads * sizeof(int));
+        memset(cpuSockets, -1, cpuid_topology.numHWThreads * sizeof(int));
+    }
+    if (!cpuLocks)
+    {
+        cpuLocks = malloc(cpuid_topology.numHWThreads * sizeof(pthread_mutex_t));
+        for (int i = 0; i < cpuid_topology.numHWThreads; i++)
+        {
+            pthread_mutex_init(&cpuLocks[i], NULL);
+        }
+    }
     if (cpuSockets[cpu_id] < 0)
     {
         pthread_mutex_lock(&cpuLocks[cpu_id]);
@@ -257,7 +275,7 @@ access_client_read(PciDeviceIndex dev, const int cpu_id, uint32_t reg, uint64_t
 
     if (dev != MSR_DEV)
     {
-        record.cpu = affinity_core2node_lookup[cpu_id];
+        record.cpu = affinity_thread2socket_lookup[cpu_id];
         record.device = dev;
     }
     if (socket != -1)
@@ -328,7 +346,7 @@ access_client_write(PciDeviceIndex dev, const int cpu_id, uint32_t reg, uint64_t
 
     if (dev != MSR_DEV)
     {
-        record.cpu = affinity_core2node_lookup[cpu_id];
+        record.cpu = affinity_thread2socket_lookup[cpu_id];
         record.device = dev;
     }
     if (socket != -1)
@@ -368,7 +386,7 @@ void
 access_client_finalize(int cpu_id)
 {
     AccessDataRecord record;
-    if (cpuSockets[cpu_id] > 0)
+    if (cpuSockets && cpuSockets[cpu_id] > 0)
     {
         record.type = DAEMON_EXIT;
         CHECK_ERROR(write(cpuSockets[cpu_id], &record, sizeof(AccessDataRecord)),socket write failed);
@@ -396,7 +414,7 @@ access_client_check(PciDeviceIndex dev, int cpu_id)
     record.errorcode = ERR_OPENFAIL;
     if (dev != MSR_DEV)
     {
-        record.cpu = affinity_core2node_lookup[cpu_id];
+        record.cpu = affinity_thread2socket_lookup[cpu_id];
     }
     if ((cpuSockets[cpu_id] > 0) && (cpuSockets[cpu_id] != globalSocket))
     {
@@ -417,3 +435,17 @@ access_client_check(PciDeviceIndex dev, int cpu_id)
     return 0;
 }
 
+void __attribute__((destructor (104))) close_access_client(void)
+{
+    if (cpuSockets)
+    {
+        free(cpuSockets);
+        cpuSockets = NULL;
+    }
+    if (cpuLocks)
+    {
+        free(cpuLocks);
+        cpuLocks = NULL;
+    }
+}
+
diff --git a/src/access_x86.c b/src/access_x86.c
index bc50ecc..bf2bfbf 100644
--- a/src/access_x86.c
+++ b/src/access_x86.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Interface to x86 related functions for the access module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -57,7 +57,7 @@ access_x86_init(int cpu_id)
     {
         if (cpuid_info.supportUncore)
         {
-            ret = access_x86_pci_init(affinity_core2node_lookup[cpu_id]);
+            ret = access_x86_pci_init(affinity_thread2socket_lookup[cpu_id]);
         }
     }
     return ret;
@@ -75,9 +75,9 @@ access_x86_read(PciDeviceIndex dev, const int cpu_id, uint32_t reg, uint64_t *da
     }
     else
     {
-        if (access_x86_pci_check(dev, affinity_core2node_lookup[cpu_id]))
+        if (access_x86_pci_check(dev, affinity_thread2socket_lookup[cpu_id]))
         {
-            err = access_x86_pci_read(dev, affinity_core2node_lookup[cpu_id], reg, &tmp);
+            err = access_x86_pci_read(dev, affinity_thread2socket_lookup[cpu_id], reg, &tmp);
             *data = tmp;
         }
     }
@@ -94,9 +94,9 @@ access_x86_write(PciDeviceIndex dev, const int cpu_id, uint32_t reg, uint64_t da
     }
     else
     {
-        if (access_x86_pci_check(dev, affinity_core2node_lookup[cpu_id]))
+        if (access_x86_pci_check(dev, affinity_thread2socket_lookup[cpu_id]))
         {
-            err = access_x86_pci_write(dev, affinity_core2node_lookup[cpu_id], reg, data);
+            err = access_x86_pci_write(dev, affinity_thread2socket_lookup[cpu_id], reg, data);
         }
     }
     return err;
@@ -108,7 +108,7 @@ access_x86_finalize(int cpu_id)
     access_x86_msr_finalize(cpu_id);
     if (cpuid_info.supportUncore)
     {
-        access_x86_pci_finalize(affinity_core2node_lookup[cpu_id]);
+        access_x86_pci_finalize(affinity_thread2socket_lookup[cpu_id]);
     }
 }
 
@@ -121,7 +121,7 @@ access_x86_check(PciDeviceIndex dev, int cpu_id)
     }
     else
     {
-        return access_x86_pci_check(dev, affinity_core2node_lookup[cpu_id]);
+        return access_x86_pci_check(dev, affinity_thread2socket_lookup[cpu_id]);
     }
     return 0;
 }
diff --git a/src/access_x86_msr.c b/src/access_x86_msr.c
index 16a3aaa..3ae29b4 100644
--- a/src/access_x86_msr.c
+++ b/src/access_x86_msr.c
@@ -9,14 +9,14 @@
  *                   sys interface of the Linux 2.6 kernel. This module
  *                   is based on the msr-util tools.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com.
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -59,13 +59,13 @@
 
 /* #####   MACROS  -  LOCAL TO THIS SOURCE FILE   ######################### */
 
-#define MAX_LENGTH_MSR_DEV_NAME  20
+#define MAX_LENGTH_MSR_DEV_NAME  24
 #define STRINGIFY(x) #x
 #define TOSTRING(x) STRINGIFY(x)
 
 /* #####   VARIABLES  -  LOCAL TO THIS SOURCE FILE   ###################### */
 
-static int FD[MAX_NUM_THREADS] = { [0 ... MAX_NUM_THREADS-1] = -1 };
+static int *FD = NULL;
 static int rdpmc_works_pmc = -1;
 static int rdpmc_works_fixed = -1;
 
@@ -147,6 +147,11 @@ access_x86_msr_init(const int cpu_id)
     int i = 0;
 
     char* msr_file_name;
+    if (!FD)
+    {
+        FD = malloc(cpuid_topology.numHWThreads * sizeof(int));
+        memset(FD, -1, cpuid_topology.numHWThreads * sizeof(int));
+    }
     if (FD[cpu_id] > 0)
     {
         return 0;
@@ -169,6 +174,12 @@ access_x86_msr_init(const int cpu_id)
         }
         else
         {
+            if(geteuid() != 0 && cpuid_info.supportUncore)
+            {
+                fprintf(stdout, "Using msr_safe kernel module. Currently, this deactivates the\n");
+                fprintf(stdout, "PCI-based Uncore monitoring.\n");
+                cpuid_info.supportUncore = 0;
+            }
             close(fd);
         }
     }
@@ -204,7 +215,17 @@ access_x86_msr_init(const int cpu_id)
     fd = open(msr_file_name, O_RDWR);
     if (fd < 0)
     {
-        sprintf(msr_file_name,"/dev/cpu/%d/msr",cpu_id);
+        sprintf(msr_file_name,"/dev/cpu/%d/msr_safe", cpu_id);
+        fd = open(msr_file_name, O_RDWR);
+        if (fd < 0)
+        {
+            sprintf(msr_file_name,"/dev/cpu/%d/msr", cpu_id);
+            printf("%s\n", msr_file_name);
+        }
+        else
+        {
+            close(fd);
+        }
     }
     else
     {
@@ -228,11 +249,16 @@ access_x86_msr_finalize(const int cpu_id)
 {
     int i = 0;
 
-    if (FD[cpu_id] > 0)
+    if (FD && FD[cpu_id] > 0)
     {
         close(FD[cpu_id]);
         FD[cpu_id] = 0;
     }
+    if (FD)
+    {
+        free(FD);
+        FD = NULL;
+    }
 }
 
 int
diff --git a/src/access_x86_pci.c b/src/access_x86_pci.c
index 2e1b731..e30c3ed 100644
--- a/src/access_x86_pci.c
+++ b/src/access_x86_pci.c
@@ -8,14 +8,14 @@
  *                   performance monitoring registers in PCI Cfg space
  *                   for Intel Sandy Bridge Processors.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -129,6 +129,9 @@ access_x86_pci_init(const int socket)
             case XEON_PHI_KNL:
                 testDevice = 0x7843;
                 break;
+            case SKYLAKEX:
+                testDevice = 0x2042;
+                break;
             default:
                 DEBUG_PRINT(DEBUGLEV_INFO,CPU model %s does not support PCI based Uncore performance monitoring, cpuid_info.name);
                 return -ENODEV;
@@ -308,7 +311,7 @@ access_x86_pci_check(PciDeviceIndex dev, int socket)
     {
         return 1;
     }
-    else if ((pci_devices[dev].online == 1) || (FD[socket][dev] >= 0))
+    else if ((pci_devices[dev].online == 1) || (FD[socket][dev] > 0))
     {
         return 1;
     }
diff --git a/src/affinity.c b/src/affinity.c
index b7baaaa..067a0aa 100644
--- a/src/affinity.c
+++ b/src/affinity.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Implementation of affinity module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -49,13 +49,17 @@
 #include <likwid.h>
 #include <numa.h>
 #include <affinity.h>
+#include <lock.h>
 #include <tree.h>
 #include <topology.h>
+#include <topology_hwloc.h>
 
 /* #####   EXPORTED VARIABLES   ########################################### */
 
-int affinity_core2node_lookup[MAX_NUM_THREADS];
-int affinity_thread2core_lookup[MAX_NUM_THREADS];
+int *affinity_thread2core_lookup = NULL;
+int *affinity_thread2socket_lookup = NULL;
+int *affinity_thread2numa_lookup = NULL;
+int *affinity_thread2sharedl3_lookup = NULL;
 
 /* #####   MACROS  -  LOCAL TO THIS SOURCE FILE   ######################### */
 
@@ -75,8 +79,9 @@ static int
 getProcessorID(cpu_set_t* cpu_set)
 {
     int processorId;
+    topology_init();
 
-    for ( processorId = 0; processorId < MAX_NUM_THREADS; processorId++ )
+    for ( processorId = 0; processorId < cpuid_topology.numHWThreads; processorId++ )
     {
         if ( CPU_ISSET(processorId,cpu_set) )
         {
@@ -150,6 +155,126 @@ treeFillNextEntries(
     }
     return numberOfEntries-counter;
 }
+
+static int get_id_of_type(hwloc_obj_t base, hwloc_obj_type_t type)
+{
+    hwloc_obj_t walker = base->parent;
+    while (walker && walker->type != type)
+        walker = walker->parent;
+    if (walker && walker->type == type)
+        return walker->os_index;
+    return -1;
+}
+
+static int create_lookups()
+{
+    topology_init();
+    if (!affinity_thread2core_lookup)
+    {
+        affinity_thread2core_lookup = malloc(cpuid_topology.numHWThreads * sizeof(int));
+        memset(affinity_thread2core_lookup, -1, cpuid_topology.numHWThreads*sizeof(int));
+    }
+    if (!affinity_thread2socket_lookup)
+    {
+        affinity_thread2socket_lookup = malloc(cpuid_topology.numHWThreads * sizeof(int));
+        memset(affinity_thread2socket_lookup, -1, cpuid_topology.numHWThreads*sizeof(int));
+    }
+    if (!affinity_thread2sharedl3_lookup)
+    {
+        affinity_thread2sharedl3_lookup = malloc(cpuid_topology.numHWThreads * sizeof(int));
+        memset(affinity_thread2sharedl3_lookup, -1, cpuid_topology.numHWThreads*sizeof(int));
+    }
+    if (!affinity_thread2numa_lookup)
+    {
+        affinity_thread2numa_lookup = malloc(cpuid_topology.numHWThreads * sizeof(int));
+        memset(affinity_thread2numa_lookup, -1, cpuid_topology.numHWThreads*sizeof(int));
+    }
+
+    int num_pu = likwid_hwloc_get_nbobjs_by_type(hwloc_topology, HWLOC_OBJ_PU);
+    for (int pu_idx = 0; pu_idx < num_pu; pu_idx++)
+    {
+        hwloc_obj_t pu = likwid_hwloc_get_obj_by_type(hwloc_topology, HWLOC_OBJ_PU, pu_idx);
+        int hwthreadid = pu->os_index;
+        int coreid = get_id_of_type(pu, HWLOC_OBJ_CORE);
+        int sockid = get_id_of_type(pu, HWLOC_OBJ_PACKAGE);
+        int memid = get_id_of_type(pu, HWLOC_OBJ_NUMANODE);
+        affinity_thread2core_lookup[hwthreadid] = coreid;
+        DEBUG_PRINT(DEBUGLEV_DEVELOP, affinity_thread2core_lookup[%d] = %d, hwthreadid, coreid);
+        affinity_thread2socket_lookup[hwthreadid] = sockid;
+        DEBUG_PRINT(DEBUGLEV_DEVELOP, affinity_thread2socket_lookup[%d] = %d, hwthreadid, sockid);
+        affinity_thread2numa_lookup[hwthreadid] = memid;
+        DEBUG_PRINT(DEBUGLEV_DEVELOP, affinity_thread2numa_lookup[%d] = %d, hwthreadid, memid);
+    }
+    int maxNumLevels = 0;
+    int depth = likwid_hwloc_topology_get_depth(hwloc_topology);
+    for (int d = 1; d <= depth; d++)
+    {
+        if (likwid_hwloc_get_depth_type(hwloc_topology, d) == HWLOC_OBJ_CACHE)
+            maxNumLevels++;
+    }
+    for(int d=depth-1;d >= 1; d--)
+    {
+        if (likwid_hwloc_get_depth_type(hwloc_topology, d) == HWLOC_OBJ_CACHE)
+        {
+            hwloc_obj_t cobj = likwid_hwloc_get_obj_by_depth(hwloc_topology, d, 0);
+            if (cobj->attr->cache.depth != 3)
+            {
+                continue;
+            }
+            int num_caches = likwid_hwloc_get_nbobjs_by_depth(hwloc_topology, d);
+            for (int c = 0; c < num_caches; c++)
+            {
+                cobj = likwid_hwloc_get_obj_by_depth(hwloc_topology, d, c);
+                for (int i = 0; i < num_pu; i++)
+                {
+                    if (likwid_hwloc_bitmap_isset(cobj->cpuset, i))
+                    {
+                        affinity_thread2sharedl3_lookup[i] = c;
+                        DEBUG_PRINT(DEBUGLEV_DEVELOP, affinity_thread2sharedl3_lookup[%d] = %d, i, c);
+                    }
+                }
+            }
+        }
+    }
+    return 0;
+}
+
+/*static int create_locks()*/
+/*{*/
+/*    numa_init();*/
+/*    if (!socket_lock)*/
+/*    {*/
+/*        socket_lock = malloc(cpuid_topology.numSockets * sizeof(int));*/
+/*        memset(socket_lock, LOCK_INIT, cpuid_topology.numSockets*sizeof(int));*/
+/*    }*/
+/*    if (!tile_lock)*/
+/*    {*/
+/*        tile_lock = malloc(cpuid_topology.numHWThreads * sizeof(int));*/
+/*        memset(tile_lock, LOCK_INIT, cpuid_topology.numHWThreads*sizeof(int));*/
+/*    }*/
+/*    if (!numa_lock)*/
+/*    {*/
+/*        numa_lock = malloc(numa_info.numberOfNodes * sizeof(int));*/
+/*        memset(numa_lock, LOCK_INIT, numa_info.numberOfNodes*sizeof(int));*/
+/*    }*/
+/*    if (!core_lock)*/
+/*    {*/
+/*        int cores = (cpuid_topology.numHWThreads/cpuid_topology.numThreadsPerCore);*/
+/*        core_lock = malloc(cores * sizeof(int));*/
+/*        memset(core_lock, LOCK_INIT, cores*sizeof(int));*/
+/*    }*/
+/*    if (!sharedl2_lock)*/
+/*    {*/
+/*        sharedl2_lock = malloc(cpuid_topology.numHWThreads * sizeof(int));*/
+/*        memset(sharedl2_lock, LOCK_INIT, cpuid_topology.numHWThreads*sizeof(int));*/
+/*    }*/
+/*    if (!sharedl3_lock)*/
+/*    {*/
+/*        sharedl3_lock = malloc(cpuid_topology.numHWThreads * sizeof(int));*/
+/*        memset(sharedl3_lock, LOCK_INIT, cpuid_topology.numHWThreads*sizeof(int));*/
+/*    }*/
+/*}*/
+
 /* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
 
 void
@@ -165,7 +290,11 @@ affinity_init()
         return;
     }
     topology_init();
+
+    create_lookups();
+    //create_locks();
     int numberOfSocketDomains = cpuid_topology.numSockets;
+
     DEBUG_PRINT(DEBUGLEV_DEVELOP, Affinity: Socket domains %d, numberOfSocketDomains);
     numa_init();
     int numberOfNumaDomains = numa_info.numberOfNodes;
@@ -193,6 +322,7 @@ affinity_init()
     /* determine total number of domains */
     numberOfDomains += numberOfSocketDomains + numberOfCacheDomains + numberOfNumaDomains;
     DEBUG_PRINT(DEBUGLEV_DEVELOP, Affinity: All domains %d, numberOfDomains);
+
     domains = (AffinityDomain*) malloc(numberOfDomains * sizeof(AffinityDomain));
     if (!domains)
     {
@@ -200,6 +330,7 @@ affinity_init()
         return;
     }
 
+
     /* Node domain */
     domains[0].numberOfProcessors = cpuid_topology.activeHWThreads;
     domains[0].numberOfCores = cpuid_topology.numSockets * cpuid_topology.numCoresPerSocket;
@@ -209,12 +340,11 @@ affinity_init()
     if (!domains[0].processorList)
     {
         fprintf(stderr,"No more memory for %ld bytes for processor list of affinity domain %s\n",
-                cpuid_topology.numHWThreads*sizeof(int), 
+                cpuid_topology.numHWThreads*sizeof(int),
                 bdata(domains[0].tag));
         return;
     }
     offset = 0;
-
     if (numberOfSocketDomains > 1)
     {
         for (int i=0; i<numberOfSocketDomains; i++)
@@ -222,8 +352,7 @@ affinity_init()
           tmp = treeFillNextEntries(cpuid_topology.topologyTree,
                                     domains[0].processorList, offset,
                                     i, 0,
-                                    cpuid_topology.numCoresPerSocket,
-                                    numberOfProcessorsPerSocket);
+                                    cpuid_topology.numCoresPerSocket, numberOfProcessorsPerSocket);
           offset += tmp;
         }
     }
@@ -232,13 +361,13 @@ affinity_init()
         tmp = treeFillNextEntries(cpuid_topology.topologyTree,
                                   domains[0].processorList, 0,
                                   0, 0,
-                                  domains[0].numberOfCores,
-                                  domains[0].numberOfProcessors);
+                                  domains[0].numberOfCores, domains[0].numberOfProcessors);
         domains[0].numberOfProcessors = tmp;
     }
 
     /* Socket domains */
     currentDomain = 1;
+    tmp = 0;
     for (int i=0; i < numberOfSocketDomains; i++ )
     {
         domains[currentDomain + i].numberOfProcessors = numberOfProcessorsPerSocket;
@@ -246,6 +375,7 @@ affinity_init()
         domains[currentDomain + i].tag = bformat("S%d", i);
         DEBUG_PRINT(DEBUGLEV_DEVELOP, Affinity domain S%d: %d HW threads on %d cores, i, domains[currentDomain + i].numberOfProcessors, domains[currentDomain + i].numberOfCores);
         domains[currentDomain + i].processorList = (int*) malloc( domains[currentDomain + i].numberOfProcessors * sizeof(int));
+        memset(domains[currentDomain + i].processorList, 0, domains[currentDomain + i].numberOfProcessors * sizeof(int));
         if (!domains[currentDomain + i].processorList)
         {
             fprintf(stderr,"No more memory for %ld bytes for processor list of affinity domain %s\n",
@@ -253,16 +383,11 @@ affinity_init()
                     bdata(domains[currentDomain + i].tag));
             return;
         }
-
         tmp = treeFillNextEntries(cpuid_topology.topologyTree,
                                   domains[currentDomain + i].processorList, 0,
                                   i, 0, cpuid_topology.numCoresPerSocket,
                                   domains[currentDomain + i].numberOfProcessors);
         tmp = MIN(tmp, domains[currentDomain + i].numberOfProcessors);
-        for ( int j = 0; j < tmp; j++ )
-        {
-            affinity_core2node_lookup[domains[currentDomain + i].processorList[j]] = i;
-        }
         domains[currentDomain + i].numberOfProcessors = tmp;
     }
 
@@ -280,14 +405,13 @@ affinity_init()
             domains[currentDomain + subCounter].tag = bformat("C%d", subCounter);
             DEBUG_PRINT(DEBUGLEV_DEVELOP, Affinity domain C%d: %d HW threads on %d cores, subCounter, domains[currentDomain + subCounter].numberOfProcessors, domains[currentDomain + subCounter].numberOfCores);
             domains[currentDomain + subCounter].processorList = (int*) malloc(numberOfProcessorsPerCache*sizeof(int));
-            if (!domains[currentDomain + subCounter].processorList)   
+            if (!domains[currentDomain + subCounter].processorList)
             {
                 fprintf(stderr,"No more memory for %ld bytes for processor list of affinity domain %s\n",
                         numberOfProcessorsPerCache*sizeof(int),
                         bdata(domains[currentDomain + subCounter].tag));
                 return;
             }
-
             tmp = treeFillNextEntries(cpuid_topology.topologyTree,
                                       domains[currentDomain + subCounter].processorList, 0,
                                       i, offset, numberOfCoresPerCache,
@@ -331,14 +455,10 @@ affinity_init()
                             bdata(domains[currentDomain + subCounter].tag));
                     return;
                 }
-                // Skip memory domain if all CPUs are already attached to others
-                // This happens for example on Intel Xeon Phi (KNL) where the
-                // NUMA domains of the MCDRAM don't have CPUs attached.
                 if (offset >= cpuid_topology.numCoresPerSocket*cpuid_topology.numSockets)
                 {
                     continue;
                 }
-
                 tmp = treeFillNextEntries(cpuid_topology.topologyTree,
                                           domains[currentDomain + subCounter].processorList, 0,
                                           i, offset, domains[currentDomain + subCounter].numberOfCores,
@@ -363,7 +483,6 @@ affinity_init()
                 domains[currentDomain + subCounter].numberOfCores);
 
         domains[currentDomain + subCounter].processorList = (int*) malloc(NUMAthreads*sizeof(int));
-
         if (!domains[currentDomain + subCounter].processorList)
         {
             fprintf(stderr,"No more memory for %ld bytes for processor list of affinity domain %s\n",
@@ -419,7 +538,41 @@ affinity_finalize()
     if (affinityDomains.domains != NULL)
     {
         free(affinityDomains.domains);
+        affinityDomains.domains = NULL;
     }
+    if (affinity_thread2core_lookup)
+    {
+        free(affinity_thread2core_lookup);
+        affinity_thread2core_lookup = NULL;
+    }
+    if (affinity_thread2socket_lookup)
+    {
+        free(affinity_thread2socket_lookup);
+        affinity_thread2socket_lookup = NULL;
+    }
+    if (affinity_thread2sharedl3_lookup)
+    {
+        free(affinity_thread2sharedl3_lookup);
+        affinity_thread2sharedl3_lookup = NULL;
+    }
+    if (affinity_thread2numa_lookup)
+    {
+        free(affinity_thread2numa_lookup);
+        affinity_thread2numa_lookup = NULL;
+    }
+/*    if (socket_lock)*/
+/*        free(socket_lock);*/
+/*    if (core_lock)*/
+/*        free(core_lock);*/
+/*    if (tile_lock)*/
+/*        free(tile_lock);*/
+/*    if (numa_lock)*/
+/*        free(numa_lock);*/
+/*    if (sharedl2_lock)*/
+/*        free(sharedl2_lock);*/
+/*    if (sharedl3_lock)*/
+/*        free(sharedl3_lock);*/
+
     affinityDomains.domains = NULL;
     affinity_numberOfDomains = 0;
     affinityDomains.numberOfAffinityDomains = 0;
diff --git a/src/applications/likwid-agent.lua b/src/applications/likwid-agent.lua
deleted file mode 100644
index 15db59d..0000000
--- a/src/applications/likwid-agent.lua
+++ /dev/null
@@ -1,558 +0,0 @@
-#!<INSTALLED_BINPREFIX>/likwid-lua
---[[
- * =======================================================================================
- *
- *      Filename:  likwid-agent.lua
- *
- *      Description:  A monitoring daemon for hardware performance counters.
- *
- *      Version:   4.2
- *      Released:  22.12.2016
- *
- *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
- *      Project:  likwid
- *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
- *
- *      This program is free software: you can redistribute it and/or modify it under
- *      the terms of the GNU General Public License as published by the Free Software
- *      Foundation, either version 3 of the License, or (at your option) any later
- *      version.
- *
- *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- *      You should have received a copy of the GNU General Public License along with
- *      this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * =======================================================================================
-]]
-
-package.path = '<INSTALLED_PREFIX>/share/lua/?.lua;' .. package.path
-local likwid = require("likwid")
-
-local base_groupPath = "<INSTALLED_PREFIX>/share/likwid/mongroups"
-dconfig = {}
-dconfig["groupStrings"] ={}
-dconfig["groupData"] ={}
-dconfig["accessmode"] = 1
-dconfig["duration"] = 1
-dconfig["groupPath"] = ""
-dconfig["logPath"] = nil
-dconfig["logStyle"] = "log"
-dconfig["gmetric"] = false
-dconfig["gmetricPath"] = "gmetric"
-dconfig["gmetricConfig"] = nil
-dconfig["gmetricHasUnit"] = false
-dconfig["gmetricHasGroup"] = false
-dconfig["rrd"] = false
-dconfig["rrdPath"] = "."
-dconfig["syslog"] = false
-dconfig["syslogPrio"] = "local0.notice"
-dconfig["stdout"] = false
-
-rrdconfig = {}
-
-
-local function read_daemon_config(filename)
-    if filename == nil or filename == "" then
-        print("Not a valid config filename")
-        os.exit(1)
-    end
-    local f = io.open(filename, "r")
-    if f == nil then
-        print("Cannot open config file "..filename)
-        os.exit(1)
-    end
-    local t = f:read("*all")
-    f:close()
-
-    for i, line in pairs(likwid.stringsplit(t,"\n")) do
-
-        if not line:match("^#") then
-            if line:match("^GROUPPATH%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["groupPath"] = linelist[1]
-            end
-
-            if line:match("^EVENTSET%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                for i=#linelist,0,-1 do
-                    if linelist[i] == "" then
-                        table.remove(linelist, i)
-                    else
-                        table.insert(dconfig["groupStrings"], linelist[i])
-                    end
-                end
-            end
-
-            if line:match("^DURATION%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["duration"] = tonumber(linelist[1])
-            end
-
-            if line:match("^ACCESSMODE%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["accessmode"] = tonumber(linelist[1])
-            end
-
-            if line:match("^LOGPATH%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["logPath"] = linelist[1]
-            end
-
-            if line:match("^LOGSTYLE%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                if linelist[1] ~= "log" and linelist[1] ~= "update" then
-                    print("LOGSTYLE argument not valid, available are log and update. Fallback to log.")
-                else
-                    dconfig["logStyle"] = linelist[1]
-                end
-            end
-
-            if line:match("^GMETRIC%s%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                if linelist[1] == "True" then
-                    dconfig["gmetric"] = true
-                end
-            end
-
-            if line:match("^GMETRICPATH%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["gmetricPath"] = linelist[1]
-            end
-
-            if line:match("^GMETRICCONFIG%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["gmetricConfig"] = linelist[1]
-            end
-
-            if line:match("^RRD%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                if linelist[1] == "True" then
-                    dconfig["rrd"] = true
-                end
-            end
-
-            if line:match("^RRDPATH%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["rrdPath"] = linelist[1]
-            end
-
-            if line:match("^SYSLOG%s%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                if linelist[1] == "True" then
-                    dconfig["syslog"] = true
-                end
-            end
-
-            if line:match("^SYSLOGPRIO%a*") ~= nil then
-                local linelist = likwid.stringsplit(line, "%s+", nil, "%s+")
-                table.remove(linelist, 1)
-                dconfig["syslogPrio"] = linelist[1]
-            end
-        end
-    end
-end
-
-local function calc_sum(key, results)
-    local sum = 0.0
-    local numThreads = likwid.getNumberOfThreads()
-    for thread=1, numThreads do
-        sum = sum + results[thread][key]
-    end
-    return sum
-end
-
-local function calc_avg(key, results)
-    local sum = 0.0
-    local numThreads = likwid.getNumberOfThreads()
-    for thread=1, numThreads do
-        sum = sum + results[thread][key]
-    end
-    return sum/numThreads
-end
-
-local function calc_min(key, results)
-    local min = math.huge
-    local numThreads = likwid.getNumberOfThreads()
-    for thread=1, numThreads do
-        if results[thread][key] < min then
-            min = results[thread][key]
-        end
-    end
-    return min
-end
-
-local function calc_max(key, results)
-    local max = 0
-    local numThreads = likwid.getNumberOfThreads()
-    for thread=1, numThreads do
-        if results[thread][key] > max then
-            max = results[thread][key]
-        end
-    end
-    return max
-end
-
-local function check_logfile()
-    local g = os.execute("cd "..dconfig["logPath"], "r")
-    if g == false then
-        print("Logfile path".. dconfig["logPath"].. " does not exist.")
-        return false
-    end
-    return true
-end
-
-local function logfile(groupID, results)
-    open_function = "a"
-    if dconfig["logStyle"] == "update" then
-        open_function = "w"
-    end
-    filename = "likwid."..tostring(groupID)..".log"
-    local s,e = dconfig["groupData"][groupID]["GroupString"]:find(":")
-    if not s then
-        filename = "likwid."..dconfig["groupData"][groupID]["GroupString"]..".log"
-    end
-    local f = io.open(dconfig["logPath"].."/"..filename, open_function)
-    if f == nil then
-        print("Cannot open logfile ".. dconfig["logPath"].."/"..filename)
-        return
-    end
-    local timestamp = results["Timestamp"]
-    for k,v in pairs(results) do
-        if k ~= "Timestamp" then
-            f:write(timestamp..","..k:gsub("%(",""):gsub("%)","").. ","..v.."\n")
-        end
-    end
-    f:close()
-end
-
-local function check_logger()
-    cmd = "which logger"
-    local f = io.popen(cmd)
-    if f == nil then
-        return false
-    end
-    f:close()
-    return true
-end
-
-local function logger(results)
-    cmd = "logger -t LIKWID "
-    if dconfig["syslogPrio"] ~= nil then
-        cm = cmd .."-p "..dconfig["syslogPrio"].." "
-    end
-    local timestamp = results["Timestamp"]
-    for k,v in pairs(results) do
-        if k ~= "Timestamp" then
-            local resultcmd = cmd .. k:gsub("%(",""):gsub("%)","") .. " " ..v
-            local f = io.popen(resultcmd)
-            if f == nil then
-                print("Cannot use logger, maybe not in $PATH")
-                return
-            end
-            f:close()
-        end
-    end
-end
-
-local function check_gmetric()
-    if dconfig["gmetricPath"] == nil then
-        return false
-    end
-    local f = io.popen(dconfig["gmetricPath"].." -h","r")
-    if f == nil then
-        return false
-    end
-    local msg = f:read("*a")
-    if msg:match("units=") then
-        dconfig["gmetricHasUnit"] = true
-    end
-    if msg:match("group=") then
-        dconfig["gmetricHasGroup"] = true
-    end
-    f:close()
-    return true
-end
-
-local function gmetric(gdata, results)
-    execList = {}
-    if dconfig["gmetricPath"] == nil then
-        return
-    end
-    table.insert(execList, dconfig["gmetricPath"])
-    if dconfig["gmetricConfig"] ~= nil then
-        table.insert(execList, "-c")
-        table.insert(execList, dconfig["gmetricConfig"])
-    end
-    if dconfig["gmetricHasGroup"] and gdata["GroupString"] ~= gdata["EventString"] then
-        table.insert(execList, "-g")
-        table.insert(execList, gdata["GroupString"])
-    end
-    for k,v in pairs(results) do
-        local execStr = table.concat(execList, " ")
-        if k ~= "Timestamp" then
-            execStr = execStr .. " -t double "
-
-            local name = k
-            local unit = nil
-            local s,e = k:find("%[")
-            if s ~= nil then
-                name = k:sub(0,s-2):gsub("^%s*(.-)%s*$", "%1")
-                unit = k:sub(s+1,k:len()-1):gsub("^%s*(.-)%s*$", "%1")
-            end
-            execStr = execStr .. " --name=\"" .. name .."\""
-            if dconfig["gmetricHasUnit"] and unit ~= nil then
-                execStr = execStr .. " --units=\"" .. unit .."\""
-            end
-            local value = tonumber(v)
-            if v ~= nil and value ~= nil then
-                execStr = execStr .. " --value=\"" .. string.format("%f", value) .."\""
-            elseif v ~= nil then
-                execStr = execStr .. " --value=\"" .. tostring(v) .."\""
-            else
-                execStr = execStr .. " --value=\"0\""
-            end
-            os.execute(execStr)
-        end
-    end
-end
-
-local function normalize_rrd_string(str)
-    str = str:gsub(" ","_")
-    str = str:gsub("%(","")
-    str = str:gsub("%)","")
-    str = str:gsub("%[","")
-    str = str:gsub("%]","")
-    str = str:gsub("%/","")
-    str = str:sub(1,19)
-    return str
-end
-
-local function check_rrd()
-    local f = io.popen("rrdtool")
-    if f == nil then
-        return false
-    end
-    f:close()
-    return true
-end
-
-local function create_rrd(numGroups, duration, groupData)
-    local rrdname = dconfig["rrdPath"].."/".. groupData["GroupString"] .. ".rrd"
-    local rrdstring = "rrdtool create "..rrdname.." --step ".. tostring(numGroups*duration)
-    if rrdconfig[groupData["GroupString"]] == nil then
-        rrdconfig[groupData["GroupString"]] = {}
-    end
-    for i, metric in pairs(groupdata["Metrics"]) do
-        rrdstring = rrdstring .. " DS"..":" .. normalize_rrd_string(metric["description"]) ..":GAUGE:"
-        rrdstring = rrdstring ..tostring(numGroups*duration) ..":0:U"
-        table.insert(rrdconfig[groupData["GroupString"]], metric["description"])
-    end
-    rrdstring = rrdstring .." RRA:AVERAGE:0.5:" .. tostring(60/duration)..":10"
-    rrdstring = rrdstring .." RRA:MIN:0.5:" .. tostring(60/duration)..":10"
-    rrdstring = rrdstring .." RRA:MAX:0.5:" .. tostring(60/duration)..":10"
-    --Average, min and max of hours of last day
-    rrdstring = rrdstring .." RRA:AVERAGE:0.5:" .. tostring(3600/duration)..":24"
-    rrdstring = rrdstring .." RRA:MIN:0.5:" .. tostring(3600/duration)..":24"
-    rrdstring = rrdstring .." RRA:MAX:0.5:" .. tostring(3600/duration)..":24"
-    --Average, min and max of day of last month
-    rrdstring = rrdstring .." RRA:AVERAGE:0.5:" .. tostring(86400/duration)..":31"
-    rrdstring = rrdstring .." RRA:MIN:0.5:" .. tostring(86400/duration)..":31"
-    rrdstring = rrdstring .." RRA:MAX:0.5:" .. tostring(86400/duration)..":31"
-    os.execute(rrdstring)
-end
-
-local function rrd(groupData, results)
-    local rrdname = dconfig["rrdPath"].."/".. groupData["GroupString"] .. ".rrd"
-    local rrdstring = "rrdtool update "..rrdname.." N"
-    for i, id in pairs(rrdconfig[groupData["GroupString"]]) do
-        rrdstring = rrdstring .. ":" .. tostring(results[id])
-    end
-    os.execute(rrdstring)
-end
-
--- Read commandline arguments
-if #arg ~= 1 then
-    print("Usage:")
-    print(arg[0] .. " <configFile>")
-    os.exit(1)
-end
-
--- Get architectural information for the current system
-local cpuinfo = likwid.getCpuInfo()
-local cputopo = likwid.getCpuTopology()
-local affinity = likwid.getAffinityInfo()
--- Read LIKWID configuration file, mainly to avoid topology lookup
-local config = likwid.getConfiguration()
--- Read LIKWID daemon configuration file
-read_daemon_config(arg[1])
-
--- Set force mode, we are monitoring exclusively
-likwid.setenv("LIKWID_FORCE","1")
-
-if dconfig["groupPath"] ~= "" then
-    likwid.setGroupPath(dconfig["groupPath"])
-else
-    dconfig["groupPath"] = base_groupPath
-end
-
-if #dconfig["groupStrings"] == 0 then
-    print("No monitoring groups defined, exiting...")
-    os.exit(1)
-end
-if dconfig["duration"] == 0 then
-    print("Invalid value 0 for duration. Sanitizing to 1 second.")
-    dconfig["duration"] = 1
-end
-
-if dconfig["syslog"] then
-    if check_logger() == false then
-        print("Cannot find tool logger, disabling syslog output.")
-        dconfig["syslog"] = false
-    end
-end
-if dconfig["logPath"] then
-    if check_logfile() == false then
-        print("Cannot create logfile path "..dconfig["logPath"]..". Deactivating logfile output.")
-        dconfig["logPath"] = nil
-    end
-end
-if dconfig["gmetric"] then
-    if check_gmetric() == false then
-        print("Cannot find gmetric using path "..dconfig["gmetricPath"]..". Deactivating gmetric output.")
-        dconfig["gmetric"] = false
-    end
-end
-if dconfig["rrd"] then
-    if check_rrd() == false then
-        print("Cannot find rrdtool. Deactivating rrd output.")
-        dconfig["rrd"] = false
-    end
-end
-
--- Activate output to stdout only if no other backend is set
-if dconfig["logPath"] == nil and dconfig["rrd"] == false and dconfig["gmetric"] == false and dconfig["syslog"] == false then
-    dconfig["stdout"] = true
-end
-
--- Add all cpus to the cpulist
-local cpulist = {}
-for i=0, cputopo["numHWThreads"]-1 do
-    table.insert(cpulist, cputopo["threadPool"][i]["apicId"])
-end
-
--- Select access mode to msr devices, try configuration file first
-access_mode = dconfig["accessmode"]
-if access_mode < 0 or access_mode > 1 then
-    access_mode = 1
-end
-if likwid.setAccessClientMode(access_mode) ~= 0 then
-    os.exit(1)
-end
-
--- Select group directory for monitoring
-likwid.groupfolder = dconfig["groupPath"]
-
-power = likwid.getPowerInfo()
--- Initialize likwid perfctr
-likwid.init(cputopo["numHWThreads"], cpulist)
-for k,v in pairs(dconfig["groupStrings"]) do
-    local groupID = likwid.addEventSet(v)
-    table.insert(dconfig["groupData"], groupID, v)
-    if dconfig["rrd"] then
-        create_rrd(#dconfig["groupStrings"], dconfig["duration"], v)
-    end
-end
-
-likwid.catchSignal()
-while likwid.getSignalState() == 0 do
-
-    for groupID,gname in pairs(dconfig["groupData"]) do
-        local old_mtime = likwid_getRuntimeOfGroup(groupID)
-        local cur_time = os.time()
-        likwid.setupCounters(groupID)
-
-        -- Perform the measurement
-        likwid.startCounters()
-        likwid.sleep(dconfig["duration"] * 1E6)
-        likwid.stopCounters()
-
-
-        if likwid.getNumberOfMetrics(groupID) > 0 then
-            local threadOutput = {}
-            for i=1, likwid.getNumberOfMetrics(groupID) do
-                local metricdesc = likwid.getNameOfMetric(groupID, i)
-                for thread=1, likwid.getNumberOfThreads() do
-                    if threadOutput[thread] == nil then
-                        threadOutput[thread] = {}
-                    end
-                    --local result = likwid.calculate_metric(metric["formula"], threadResults[thread])
-                    threadOutput[thread][metricdesc] = likwid.getLastMetric(groupID, i, thread)
-                end
-            end
-            output = {}
-            output["Timestamp"] = os.date("%m/%d/%Y_%X",cur_time)
-            for i=1, likwid.getNumberOfMetrics(groupID) do
-                local metricdesc = likwid.getNameOfMetric(groupID, i)
-                itemlist = likwid.stringsplit(metricdesc, "%s+", nil, "%s+")
-                func = itemlist[1]
-                table.remove(itemlist, 1)
-                desc = table.concat(itemlist," ")
-                if func == "AVG" then
-                    output[metricdesc:gsub(" ","_")] = calc_avg(metricdesc, threadOutput)
-                elseif func == "SUM" then
-                    output[metricdesc:gsub(" ","_")] = calc_sum(metricdesc, threadOutput)
-                elseif func == "MIN" then
-                    output[metricdesc:gsub(" ","_")] = calc_min(metricdesc, threadOutput)
-                elseif func == "MAX" then
-                    output[metricdesc:gsub(" ","_")] = calc_max(metricdesc, threadOutput)
-                elseif func == "ONCE" then
-                    output[metricdesc:gsub(" ","_")] = threadOutput[1][metricdesc]
-                else
-                    for thread=1, likwid.getNumberOfThreads() do
-                        output["T"..cpulist[thread] .. "_" .. metricdesc] = threadOutput[thread][metricdesc]
-                    end
-                end
-            end
-            if dconfig["logPath"] ~= nil then
-                logfile(groupID, output)
-            end
-            if dconfig["syslog"] then
-                logger(output)
-            end
-            if dconfig["gmetric"] then
-                gmetric(gdata, output)
-            end
-            if dconfig["rrd"] then
-                rrd(gdata, output)
-            end
-            if dconfig["stdout"] then
-                for i,o in pairs(output) do
-                    print(i,o)
-                end
-                print(likwid.hline)
-            end
-        end
-    end
-end
-
--- Finalize likwid perfctr
-likwid.catchSignal()
-likwid.finalize()
-likwid.putConfiguration()
-likwid.putTopology()
diff --git a/src/applications/likwid-features.lua b/src/applications/likwid-features.lua
index 2b20825..c79d02e 100644
--- a/src/applications/likwid-features.lua
+++ b/src/applications/likwid-features.lua
@@ -6,13 +6,13 @@
  *
  *      Description:  A application to retrieve and manipulate CPU features.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -31,12 +31,20 @@
 package.path = '<INSTALLED_PREFIX>/share/lua/?.lua;' .. package.path
 
 local likwid = require("likwid")
+local cpuinfo = likwid.getCpuInfo()
 
 print_stdout = print
 print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n") end end
 
+GENERAL_FEATURES = {"HW_PREFETCHER", "CL_PREFETCHER", "DCU_PREFETCHER", "IP_PREFETCHER"}
+KNL_FEATURES = {"HW_PREFETCHER", "DCU_PREFETCHER"}
+FEATURES = GENERAL_FEATURES
+if cpuinfo["short_name"] == "knl" then
+    FEATURES = KNL_FEATURES
+end
+
 function version()
-    print_stdout(string.format("likwid-features --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-features -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 function usage()
@@ -52,7 +60,7 @@ function usage()
     print_stdout("-d, --disable <list>\t List of features that should be disabled")
     print_stdout()
     print_stdout("Currently modifiable features:")
-    print_stdout("HW_PREFETCHER, CL_PREFETCHER, DCU_PREFETCHER, IP_PREFETCHER")
+    print_stdout(table.concat(FEATURES, ", "))
 end
 
 if #arg == 0 then
@@ -89,7 +97,14 @@ for opt,arg in likwid.getopt(arg, {"h","v","l","c:","e:","d:","a","help","versio
     elseif opt == "a" or opt == "all" then
         print_stdout("Available features:")
         for i=0,likwid.tablelength(likwid.cpuFeatures)-1 do
-            if likwid.cpuFeatures[i]:match("PREFETCHER") then
+            local found = false
+            for j, f in pairs(FEATURES) do
+                if likwid.cpuFeatures[i] == f then
+                    found = true
+                    break
+                end
+            end
+            if found then
                 print_stdout(string.format("\t%s*",likwid.cpuFeatures[i]))
             else
                 print_stdout(string.format("\t%s",likwid.cpuFeatures[i]))
diff --git a/src/applications/likwid-genTopoCfg.lua b/src/applications/likwid-genTopoCfg.lua
index ff71b8c..0c98aed 100644
--- a/src/applications/likwid-genTopoCfg.lua
+++ b/src/applications/likwid-genTopoCfg.lua
@@ -8,13 +8,13 @@
  *                    that is used by likwid to avoid reading the systems architecture at
  *                    each start.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -40,7 +40,7 @@ print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n
 local filename = "<INSTALLED_PREFIX>/etc/likwid_topo.cfg"
 
 function version()
-    print_stdout(string.format("likwid-genTopoCfg --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-genTopoCfg -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 function usage()
diff --git a/src/applications/likwid-memsweeper.lua b/src/applications/likwid-memsweeper.lua
index dc81822..8c21c01 100644
--- a/src/applications/likwid-memsweeper.lua
+++ b/src/applications/likwid-memsweeper.lua
@@ -6,13 +6,13 @@
  *
  *      Description:  An application to clean up NUMA memory domains.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -35,7 +35,7 @@ print_stdout = print
 print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n") end end
 
 local function version()
-    print_stdout(string.format("likwid-memsweeper --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-memsweeper -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 local function examples()
diff --git a/src/applications/likwid-mpirun.lua b/src/applications/likwid-mpirun.lua
index 3da0191..2c9f1c0 100644
--- a/src/applications/likwid-mpirun.lua
+++ b/src/applications/likwid-mpirun.lua
@@ -7,13 +7,13 @@
  *      Description: A wrapper script to pin threads spawned by MPI processes and
  *                   measure hardware performance counters
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -37,7 +37,7 @@ print_stdout = print
 print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n") end end
 
 local function version()
-    print_stdout(string.format("likwid-mpirun --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-mpirun -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 local function examples()
@@ -80,6 +80,7 @@ local function usage()
     print_stdout("-m/-marker\t\t Activate marker API mode")
     print_stdout("-O\t\t\t Output easily parseable CSV instead of fancy tables")
     print_stdout("-f\t\t\t Force overwrite of registers if they are in use. You can also use environment variable LIKWID_FORCE")
+    print_stdout("-e, --env <key>=<value>\t Set environment variables for MPI processes")
     print_stdout("")
     print_stdout("Processes are pinned to physical CPU cores first. For syntax questions see likwid-pin")
     print_stdout("")
@@ -92,6 +93,7 @@ end
 
 local np = 0
 local ppn = 0
+local tpp = 1
 local nperdomain = nil
 local npernode = 0
 local cpuexprs = {}
@@ -103,8 +105,10 @@ local mpitype = nil
 local omptype = nil
 local skipStr = ""
 local executable = {}
+local envsettings = {}
 local mpiopts = {}
 local debug = false
+local likwiddebug = false
 local use_marker = false
 local use_csv = false
 local force = false
@@ -174,8 +178,14 @@ local function readHostfileOpenMPI(filename)
         if host["maxslots"] == nil or host["maxslots"] == 0 then
             host["maxslots"] = topo.numHWThreads
         end
-        if debug then
-            print_stdout(string.format("DEBUG: Read host %s with %d slots and %d slots maximally", host["hostname"], host["slots"], host["maxslots"]))
+    end
+    if debug then
+        print_stdout("Available hosts for scheduling:")
+        s = string.format("%-20s\t%s\t%s\t%s", "Host", "Slots", "MaxSlots", "Interface")
+        print_stdout(s)
+        for i, host in pairs(hostlist) do
+            s = string.format("%-20s\t%s\t%s\t%s", host["hostname"], host["slots"], host["maxslots"],"")
+            print_stdout (s)
         end
     end
     return hostlist
@@ -214,18 +224,16 @@ local function executeOpenMPI(wrapperscript, hostfile, env, nrNodes)
         wrapperscript = os.getenv("PWD").."/"..wrapperscript
     end
 
-    local f = io.popen(string.format("%s -V 2>&1", mpiexecutable), "r")
-    if f ~= nil then
-        local input = f:read("*a")
-        ver1,ver2,ver3 = input:match("(%d+)%.(%d+)%.(%d+)")
-        if ver1 == "1" then
-            if tonumber(ver2) >= 7 then
-                bindstr = "--bind-to none"
-            elseif ver2 == "6" then
-                bindstr = "--bind-to-none"
-            end
+
+    ver1,ver2 = getMpiVersion()
+    if ver1 == 1 then
+        if ver2 >= 7 then
+            bindstr = "--bind-to none"
+        elseif ver2 == "6" then
+            bindstr = "--bind-to-none"
         end
-        f:close()
+    elseif ver1 == 2 then
+        bindstr = "--bind-to none"
     end
 
     local cmd = string.format("%s -hostfile %s %s -np %d -npernode %d %s %s",
@@ -265,8 +273,12 @@ local function readHostfileIntelMPI(filename)
         end
     end
     if debug then
+        print_stdout("Available hosts for scheduling:")
+        s = string.format("%-20s\t%s\t%s\t%s", "Host", "Slots", "MaxSlots", "Interface")
+        print_stdout(s)
         for i, host in pairs(hostlist) do
-            print_stdout(string.format("DEBUG: Read host %s with %d slots and %d slots maximally", host["hostname"], host["slots"], host["maxslots"]))
+            s = string.format("%-20s\t%s\t%s\t%s", host["hostname"], host["slots"], host["maxslots"],"")
+            print_stdout (s)
         end
     end
     return hostlist
@@ -394,8 +406,14 @@ local function readHostfileMvapich2(filename)
         end
     end
     if debug then
-        for i, host in pairs(hostlist) do
-            print_stdout(string.format("DEBUG: Read host %s with %d slots and %d slots maximally", host["hostname"], host["slots"], host["maxslots"]))
+        if debug then
+            print_stdout("Available hosts for scheduling:")
+            s = string.format("%-20s\t%s\t%s\t%s", "Host", "Slots", "MaxSlots", "Interface")
+            print_stdout(s)
+            for i, host in pairs(hostlist) do
+                s = string.format("%-20s\t%s\t%s\t%s", host["hostname"], host["slots"], host["maxslots"],"")
+                print_stdout (s)
+            end
         end
     end
     return hostlist
@@ -487,8 +505,12 @@ local function readHostfilePBS(filename)
         end
     end
     if debug then
+        print_stdout("Available hosts for scheduling:")
+        s = string.format("%-20s\t%s\t%s\t%s", "Host", "Slots", "MaxSlots", "Interface")
+        print_stdout(s)
         for i, host in pairs(hostlist) do
-            print_stdout(string.format("DEBUG: Read host %s with %d slots and %d slots maximally", host["hostname"], host["slots"], host["maxslots"]))
+            s = string.format("%-20s\t%s\t%s\t%s", host["hostname"], host["slots"], host["maxslots"],"")
+            print_stdout (s)
         end
     end
     return hostlist
@@ -499,6 +521,15 @@ local function readHostfileSlurm(hostlist)
     if hostlist and nperhost then
         hostfile = write_hostlist_to_file(hostlist, nperhost)
         hosts = readHostfilePBS(hostfile)
+        if debug then
+            print_stdout("Available hosts for scheduling:")
+            s = string.format("%-20s\t%s\t%s\t%s", "Host", "Slots", "MaxSlots", "Interface")
+            print_stdout(s)
+            for i, host in pairs(hosts) do
+                s = string.format("%-20s\t%s\t%s\t%s", host["hostname"], host["slots"], host["maxslots"],"")
+                print_stdout (s)
+            end
+        end
         os.remove(hostfile)
     end
     return hosts
@@ -509,44 +540,28 @@ function write_hostlist_to_file(hostlist, nperhost)
         return {}
     end
     outlist = {}
-    list = likwid.stringsplit(hostlist, ",")
-    for i, item in pairs(list) do
-        if not item:match("%[") then
-            table.insert(outlist, item)
-        else
-            prefixzeros = 0
-            host, start, ende,remain = item:match("(%a+)%[(%d+)-(%d+)%]([%w%d%[%]-]*)")
-            if host and start and ende then
-                if tonumber(start) ~= 0 then
-                    for j=1,#start do
-                        if start:sub(j,j+1) == '0' then
-                            prefixzeros = prefixzeros + 1
-                        end
-                    end
-                end
-                if start and ende then
-                    for j=start,ende do
-                        newh = host..string.rep("0", prefixzeros)..tostring(math.tointeger(j))
-                        if remain then
-                            newh = newh .. remain
-                        end
-                        table.insert(outlist, newh)
-                    end
-                end
-            end
-        end
-    end
-    fname = string.format("/tmp/hostlist.%d", likwid.getpid())
-    f = io.open(fname, "w")
+    cmd = string.format("scontrol show hostname %s", hostlist)
+    f = io.popen(cmd, 'r')
     if f ~= nil then
-        for i=1,#outlist do
-            for j=1, nperhost do
-                f:write(outlist[i].."\n")
+        local s = assert(f:read('*a'))
+        f:close()
+        for i,line in pairs(likwid.stringsplit(s, "\n")) do
+            table.insert(outlist, line)
+        end
+        fname = string.format("/tmp/hostlist.%d", likwid.getpid())
+        f = io.open(fname, "w")
+        if f ~= nil then
+            for i=1,#outlist do
+                for j=1, nperhost do
+                    f:write(outlist[i].."\n")
+                end
             end
+            f:close()
         end
-        f:close()
+        return fname
+    else
+        print_stderr("ERROR: Cannot transform SLURM hostlist to list of hosts")
     end
-    return fname
 end
 
 local function writeHostfileSlurm(hostlist, filename)
@@ -554,7 +569,14 @@ local function writeHostfileSlurm(hostlist, filename)
     for i, h in pairs(hostlist) do
         table.insert(l, h["hostname"])
     end
-    likwid.setenv("SLURM_NODELIST", table.concat(l,","))
+    cmd = string.format("scontrol show hostlist %s", table.concat(l,","))
+    f = io.popen(cmd, 'r')
+    if f ~= nil then
+        likwid.setenv("SLURM_NODELIST", f:read('*a'))
+        f:close()
+    else
+        print_stderr("ERROR: Cannot transform list of hosts to SLURM hostlist format")
+    end
 end
 
 local function getEnvironmentSlurm()
@@ -660,6 +682,40 @@ local function getMpiType()
     return mpitype
 end
 
+function getMpiVersion()
+    maj = nil
+    min = nil
+    intel_match = "Version (%d+) Update (%d+)"
+    openmpi_match = "(%d+)%.(%d+)%.%d+"
+    for i, exec in pairs({"mpiexec.hydra", "mpiexec", "mpirun"}) do
+        f = io.popen(string.format("which %s 2>/dev/null", exec), 'r')
+        if f ~= nil then
+            mpiexec = f:read("*line")
+            if mpiexec then
+                cmd = mpiexec .. " --version"
+                f:close()
+                f = io.popen(cmd, 'r')
+                if f ~= nil then
+                    local t = f:read("*all")
+                    f:close()
+                    for l in t:gmatch("[^\r\n]+") do
+                        if l:match(intel_match) then
+                            maj, min = l:match(intel_match)
+                            maj = tonumber(maj)
+                            min = tonumber(min)
+                        elseif l:match(openmpi_match) then
+                            maj, min = l:match(openmpi_match)
+                            maj = tonumber(maj)
+                            min = tonumber(min)
+                        end
+                    end
+                end
+            end
+        end
+    end
+    return maj, min
+end
+
 local function getMpiExec(mpitype)
     testing = {}
     if mpitype == "intelmpi" then
@@ -755,23 +811,18 @@ local function getOmpType()
     return omptype
 end
 
-local function assignHosts(hosts, np, ppn)
+local function assignHosts(hosts, np, ppn, tpp)
     tmp = np
     newhosts = {}
     current = 0
     if debug then
-        print_stdout(string.format("Assign %d processes with %d per node to %d hosts", np, ppn, #hosts))
-        print_stdout("Available hosts for scheduling:")
-        print_stdout("Host", "Slots", "MaxSlots", "Interface")
-        for i, h in pairs(hosts) do
-            print_stdout (h["hostname"], h["slots"], h["maxslots"],"", h["interface"])
-        end
+        print_stdout(string.format("DEBUG: Assign %d processes with %d per node and %d threads per process to %d hosts", np, ppn, tpp, #hosts))
     end
     local break_while = false
     while tmp > 0 and #hosts > 0 do
         for i, host in pairs(hosts) do
-            if host["slots"] and host["slots"] >= ppn then
-                if host["maxslots"] and host["maxslots"] < ppn then
+            if host["slots"] and host["slots"] >= ppn*tpp then
+                if host["maxslots"] and host["maxslots"] < ppn*tpp then
                     table.insert(newhosts, {hostname=host["hostname"],
                                             slots=host["maxslots"],
                                             maxslots=host["maxslots"],
@@ -783,17 +834,17 @@ local function assignHosts(hosts, np, ppn)
                     hosts[i] = nil
                 else
                     table.insert(newhosts, {hostname=host["hostname"],
-                                            slots=ppn,
+                                            slots=ppn*tpp,
                                             maxslots=host["slots"],
                                             interface=host["interface"]})
                     if debug then
-                        print_stdout(string.format("DEBUG: Add Host %s with %d slots to host list", host["hostname"], ppn))
+                        print_stdout(string.format("DEBUG: Add Host %s with %d slots to host list", host["hostname"], ppn*tpp))
                     end
-                    current = ppn
+                    current = ppn*tpp
                     hosts[i] = nil
                 end
             elseif host["slots"] then
-                --[[if host["maxslots"] then
+                --[[if host["maxslotsno"] then
                     if host["maxslots"] < ppn then
                         print_stderr(string.format("WARN: Oversubscription for host %s needed, but max-slots set to %d.",
                                                 host["hostname"], host["maxslots"]))
@@ -824,19 +875,19 @@ local function assignHosts(hosts, np, ppn)
                 os.exit(1)
             else
                 table.insert(newhosts, {hostname=host["hostname"],
-                                        slots=ppn,
+                                        slots=ppn*tpp,
                                         maxslots=host["slots"],
                                         interface=host["interface"]})
                 if debug then
-                    print_stdout(string.format("DEBUG: Add Host %s with %d slots to host list", host["hostname"], ppn))
+                    print_stdout(string.format("DEBUG: Add Host %s with %d slots to host list", host["hostname"], ppn*tpp))
                 end
-                current = ppn
+                current = ppn*tpp
             end
             tmp = tmp - current
             if tmp < 1 then
                 break_while = true
                 break
-            elseif tmp < ppn then
+            elseif tmp < ppn*tpp then
                 ppn = tmp
             end
         end
@@ -888,7 +939,7 @@ local function calculatePinExpr(cpuexprs)
         for _, c in pairs(list) do
             table.insert(strList, c)
         end
-        table.insert(newexprs, table.concat(strList,","))
+        table.insert(newexprs, strList)
     end
     return newexprs
 end
@@ -898,7 +949,10 @@ local function calculateCpuExprs(nperdomain, cpuexprs)
     local affinity = likwid.getAffinityInfo()
     local domainlist = {}
     local newexprs = {}
-    domainname, count = nperdomain:match("[E:]*(%g*):(%d+)")
+    domainname, count, threads = nperdomain:match("[E]*[:]*([NSCM]*):(%d+)[:]*(%d*)")
+    count = math.tointeger(count)
+    threads = math.tointeger(threads)
+    if threads == nil then threads = 1 end
 
     for i, domain in pairs(affinity["domains"]) do
         if domain["tag"]:match(domainname.."%d*") then
@@ -922,14 +976,18 @@ local function calculateCpuExprs(nperdomain, cpuexprs)
         end
         local tmplist = {}
         for j=1,count do
-            table.insert(newexprs, tostring(sortedlist[1]))
-            table.remove(sortedlist, 1)
+            local tmplist = {}
+            for t=1,threads do
+                table.insert(tmplist, tostring(sortedlist[1]))
+                table.remove(sortedlist, 1)
+            end
+            table.insert(newexprs, tmplist)
         end
     end
     if debug then
         local str = "DEBUG: Resolved NperDomain string "..nperdomain.." to CPUs: "
         for i, expr in pairs(newexprs) do
-            str = str .. expr .. " "
+            str = str .. "[" .. table.concat(expr,",") .. "]" .. " "
         end
         print_stdout(str)
     end
@@ -953,6 +1011,53 @@ local function createEventString(eventlist)
     return str
 end
 
+local function splitUncoreEvents(groupdata)
+    local core = {}
+    local uncore = {}
+    for i, e in pairs(groupdata["Events"]) do
+        if  not e["Counter"]:match("FIXC%d") and
+            not e["Counter"]:match("^PMC%d") and
+            not e["Counter"]:match("TMP%d") then
+            local event = e["Event"]..":"..e["Counter"]
+            table.insert(uncore, event)
+        else
+            local event = e["Event"]..":"..e["Counter"]
+            table.insert(core, event)
+        end
+    end
+    cevents = table.concat(core, ",")
+    uevents = table.concat(core, ",")
+    if #uncore > 0 then
+        uevents = uevents..","..table.concat(uncore,",")
+    end
+    return cevents, uevents
+end
+
+local function inList(value, list)
+    for _,l in pairs(list) do
+        if value == l then
+            return true
+        end
+    end
+    return false
+end
+
+local function uniqueList(list)
+    local newl = {}
+    for _,l in pairs(list) do
+        found = false
+        for _,k in pairs(newl) do
+            if l == k then
+                found = true
+            end
+        end
+        if not found then
+            table.insert(newl, l)
+        end
+    end
+    return newl
+end
+
 local function setPerfStrings(perflist, cpuexprs)
     local uncore = false
     local perfexprs = {}
@@ -973,11 +1078,9 @@ local function setPerfStrings(perflist, cpuexprs)
     end
 
     for k, perfStr in pairs(perflist) do
-        local coreevents = {}
-        local uncoreevents = {}
         local gdata = nil
         gdata = likwid.get_groupdata(perfStr)
-        if gdata == nil then
+        if gdata == nil or gdata["EventString"]:len() == 0 then
             print_stderr("Cannot get data for group "..perfStr..". Skipping...")
         else
             table.insert(grouplist, gdata)
@@ -985,47 +1088,38 @@ local function setPerfStrings(perflist, cpuexprs)
                 perfexprs[k] = {}
             end
 
-            for i, e in pairs(gdata["Events"]) do
-                if  not e["Counter"]:match("FIXC%d") and
-                    not e["Counter"]:match("^PMC%d") and
-                    not e["Counter"]:match("TMP%d") then
-                    table.insert(uncoreevents, e)
-                else
-                    table.insert(coreevents, e)
-                end
-            end
+            local coreevents = ""
+            local uncoreevents = ""
+            coreevents, uncoreevents = splitUncoreEvents(gdata)
+
             local tmpSocketFlags = {}
             for _,e in pairs(socketListFlags) do
                 table.insert(tmpSocketFlags, e)
             end
 
             for i,cpuexpr in pairs(cpuexprs) do
-                for j, cpu in pairs(likwid.stringsplit(cpuexpr,",")) do
-                    local uncore = false
-                    for sidx, socket in pairs(socketList) do
-                        local switchedFlag = false
-                        for _,c in pairs(socket) do
-                            if c == tonumber(cpu) then
-                                if tmpSocketFlags[sidx] == 1 then
-                                    local eventStr = createEventString(coreevents)
-                                    if #uncoreevents > 0 then
-                                        eventStr = eventStr .. ","..createEventString(uncoreevents)
-                                    end
-                                    table.insert(perfexprs[k], eventStr)
-                                    tmpSocketFlags[sidx] = 0
-                                    switchedFlag = true
-                                    uncore = true
-                                    break
-                                else
-                                    table.insert(perfexprs[k], createEventString(coreevents))
-                                    switchedFlag = true
-                                    uncore = true
-                                end
-                            end
+                local slist = {}
+                for j, cpu in pairs(cpuexpr) do
+                    for l, socklist in pairs(socketList) do
+                        if inList(cpu, socklist) then
+                            table.insert(slist, l)
                         end
-                        if switchedFlag then break end
                     end
-                    if uncore then break end
+                end
+                slist = uniqueList(slist)
+                local uncore = false
+                for _, s in pairs(slist) do
+                    if tmpSocketFlags[s] == 1 then
+                        tmpSocketFlags[s] = 0
+                        uncore = true
+                    end
+                end
+                if perfexprs[k][i] == nil then
+                    if uncore then
+                        perfexprs[k][i] = uncoreevents
+                    else
+                        perfexprs[k][i] = coreevents
+                    end
                 end
             end
 
@@ -1036,6 +1130,10 @@ local function setPerfStrings(perflist, cpuexprs)
             end
         end
     end
+    if #grouplist == 0 then
+        print_stderr("No group can be configured for measurments, exiting.")
+        os.exit(1)
+    end
     return perfexprs, grouplist
 end
 
@@ -1058,7 +1156,7 @@ local function checkLikwid()
     end
 end
 
-local function writeWrapperScript(scriptname, execStr, hosts, outputname)
+local function writeWrapperScript(scriptname, execStr, hosts, envsettings, outputname)
     if scriptname == nil or scriptname == "" then
         return
     end
@@ -1088,7 +1186,7 @@ local function writeWrapperScript(scriptname, execStr, hosts, outputname)
     elseif mpitype == "slurm" then
         glrank_var = "${PMI_RANK:-$(($GLOBALSIZE * 2))}"
         glsize_var = tostring(math.tointeger(np))
-        losize_var = "$MPI_LOCALNRANKS"
+        losize_var = "${MPI_LOCALNRANKS:-$SLURM_NTASKS_PER_NODE}"
     else
         print_stderr("Invalid MPI vendor "..mpitype)
         return
@@ -1128,9 +1226,12 @@ local function writeWrapperScript(scriptname, execStr, hosts, outputname)
         if force and #perf > 0 then
             table.insert(cmd,"-f")
         end
+        if likwiddebug then
+            table.insert(cmd,"-V 3")
+        end
         table.insert(cmd,skipStr)
         table.insert(cmd,cpuexpr_opt)
-        table.insert(cmd,cpuexprs[i])
+        table.insert(cmd,table.concat(cpuexprs[i], ","))
         if #perf > 0 then
             for j, expr in pairs(perfexprs) do
                 table.insert(cmd,"-g")
@@ -1154,12 +1255,18 @@ local function writeWrapperScript(scriptname, execStr, hosts, outputname)
     if mpitype == "intelmpi" then
         f:write("export I_MPI_PIN=disable\n")
     end
+    for i, e in pairs(envsettings) do
+        if debug then
+            print_stdout(string.format("DEBUG: Environment variable %s", e))
+        end
+        f:write(string.format("export %s\n", e))
+    end
     f:write("LOCALSIZE="..losize_var.."\n\n")
 
     if mpitype == "openmpi" then
         f:write("LOCALRANK=$OMPI_COMM_WORLD_LOCAL_RANK\n\n")
     elseif mpitype  == "slurm" then
-        f:write("LOCALRANK=$MPI_LOCALRANKID\n\n")
+        f:write("LOCALRANK=${MPI_LOCALRANKID:-$SLURM_LOCALID}\n\n")
     else
         local full = tostring(math.tointeger(np - (np % ppn)))
         f:write("if [ \"$GLOBALRANK\" -lt "..tostring(math.tointeger(full)).." ]; then\n")
@@ -1180,14 +1287,14 @@ local function writeWrapperScript(scriptname, execStr, hosts, outputname)
 
     f:write("if [ \"$LOCALRANK\" -eq 0 ]; then\n")
     if debug then
-        print_stdout("NODE_EXEC: "..commands[1])
+        print_stdout(string.format("EXEC (Rank 0): %s",commands[1]))
     end
     f:write("\t"..commands[1].."\n")
 
     for i=2,#commands do
         f:write("elif [ \"$LOCALRANK\" -eq "..tostring(i-1).." ]; then\n")
         if debug then
-            print_stdout("NODE_EXEC: "..commands[i])
+            print_stdout(string.format("EXEC (Rank %d): %s", i-1,commands[i]))
         end
         f:write("\t"..commands[i].."\n")
     end
@@ -1307,6 +1414,7 @@ local function parseMarkerOutputFile(filename)
     local cpulist = {}
     local eventlist = {}
     local counterlist = {}
+    local regionlist = {}
     local idx = 1
     local results = {}
     local f = io.open(filename, "r")
@@ -1353,6 +1461,7 @@ local function parseMarkerOutputFile(filename)
                     results[current_region][gidx]["time"] = {}
                     results[current_region][gidx]["calls"] = {}
                 end
+                table.insert(regionlist, current_region)
             elseif parse_reg_info and line:match("^Region Info") then
                 linelist = likwid.stringsplit(line,",")
                 table.remove(linelist,1)
@@ -1403,7 +1512,12 @@ local function parseMarkerOutputFile(filename)
                         results[current_region][gidx][counter] = {}
                     end
                     for j, value in pairs(linelist) do
-                        results[current_region][gidx][counter][cpulist[j]] = tonumber(value)
+                        v = tonumber(value)
+                        if v then
+                            results[current_region][gidx][counter][cpulist[j]] = v
+                        else
+                            results[current_region][gidx][counter][cpulist[j]] = 0/0
+                        end
                     end
                     idx = idx + 1
                 end
@@ -1414,7 +1528,7 @@ local function parseMarkerOutputFile(filename)
         results[region]["clock"] = clock
     end
 
-    return host, tonumber(rank), results, cpulist
+    return host, tonumber(rank), results, cpulist, regionlist
 end
 
 
@@ -1547,7 +1661,8 @@ function printMpiOutput(group_list, all_results, regionname)
                     counterlist["inverseClock"] = 1.0/all_results[rank]["results"]["clock"]
                     tmpList = {all_results[rank]["hostname"]..":"..tostring(rank)..":"..tostring(cpu)}
                     for j=1,#groupdata["Metrics"] do
-                        local tmp = likwid.num2str(likwid.calculate_metric(gdata["Metrics"][j]["formula"], counterlist))
+                        local f = gdata["Metrics"][j]["formula"]
+                        local tmp = likwid.num2str(likwid.calculate_metric(f, counterlist))
                         table.insert(tmpList, tmp)
                     end
                     table.insert(secondtab,tmpList)
@@ -1605,7 +1720,20 @@ if #arg == 0 then
     os.exit(0)
 end
 
-for opt,arg in likwid.getopt(arg, {"n:","np:", "nperdomain:","pin:","hostfile:","h","help","v","g:","group:","mpi:","omp:","d","m","O","debug","marker","version","s:","skip:","f"}) do
+local cmd_options = {"h","help", -- default options for help message
+                     "v","version", -- default options for version message
+                     "d", "debug", -- activate debugging output
+                     "n:","np:", -- default options for number of MPI processes
+                     "t:","tpp:", -- default options for number of threads per process
+                     "mpi:","omp:", -- options to overwrite detection
+                     "s:","skip:", -- options to specify custom skip mask for threads
+                     "g:","group:", -- options to set group for performance measurements using likwid
+                     "m","marker", -- options to activate MarkerAPI
+                     "e:", "env:", -- options to forward environment variables
+                     "ld",         -- option to activate debugging in likwid-perfctr
+                     "nperdomain:","pin:","hostfile:","O","f"} -- other options
+
+for opt,arg in likwid.getopt(arg,  cmd_options) do
     if (type(arg) == "string") then
         local s,e = arg:find("-")
         if s == 1 then
@@ -1635,13 +1763,38 @@ for opt,arg in likwid.getopt(arg, {"n:","np:", "nperdomain:","pin:","hostfile:",
             print_stderr("Argument for -n/-np must be a number")
             os.exit(1)
         end
+    elseif opt == "t" or opt == "tpp" then
+        tpp = tonumber(arg)
+        if tpp == nil then
+            print_stderr("Argument for -t/-tpp must be a number")
+            os.exit(1)
+        end
+        if tpp == 0 then
+            print_stderr("Cannot run with 0 threads, at least 1 is required, sanitizing tpp to 1")
+            tpp = 1
+        end
     elseif opt == "nperdomain" then
-        nperdomain = arg
-        local domain, count = nperdomain:match("([NSCM]%d*):(%d+)")
-        if domain == nil then
+        local domain, count, threads = arg:match("([NSCM]):(%d+)[:]*(%d*)")
+        if domain == nil or count == nil then
             print_stderr("Invalid option to -nperdomain")
             os.exit(1)
         end
+        nperdomain = string.format("%s:%s", domain, count)
+        if threads ~= nil then
+            nperdomain = nperdomain .. ":" ..threads
+        end
+    elseif opt == "e" or opt == "env" then
+        name, val = arg:match("([%a%d_]+)[=]*([%a%d_\"\"']*)")
+        if name == nil and (val == nil or tostring(val):len() == 0) then
+            print_stderr("Invalid argument for -e/-env, must be varname=varvalue")
+        else
+            if (val == nil or tostring(val):len() == 0) then
+                val = os.getenv(name) or ''
+            end
+            if name:len() > 0 and val:len() > 0 then
+                table.insert(envsettings, string.format("%s=%s", name, val))
+            end
+        end
     elseif opt == "hostfile" then
         hostfile = arg
     elseif opt == "pin" then
@@ -1652,6 +1805,8 @@ for opt,arg in likwid.getopt(arg, {"n:","np:", "nperdomain:","pin:","hostfile:",
         mpitype = arg
     elseif opt == "omp" then
         omptype = arg
+    elseif opt == "ld" then
+        likwiddebug = true
     elseif opt == "s" or opt == "skip" then
         skipStr = "-s "..arg
     elseif opt == "?" then
@@ -1721,6 +1876,10 @@ end
 
 if mpitype == nil then
     mpitype = getMpiType()
+    if mpitype == nil then
+        print_stderr("ERROR: Cannot find MPI implementation")
+        os.exit(1)
+    end
     if debug then
         print_stdout("DEBUG: Using MPI implementation "..mpitype)
     end
@@ -1802,12 +1961,14 @@ if #cpuexprs > 0 then
     if debug then
         str = "["
         for i, expr in pairs(cpuexprs) do
-            str = str .. "["..expr.."], "
+            str = str .. "["..table.concat(expr,",").."], "
         end
         str = str:sub(1,str:len()-2) .. "]"
         print_stdout("DEBUG: Evaluated CPU expressions: ".. str)
     end
     ppn = #cpuexprs
+    tpp = #cpuexprs[1]
+
     if np == 0 then
         if debug then
             print_stdout(string.format("DEBUG: No -np given , setting according to pin expression and number of available hosts"))
@@ -1827,14 +1988,38 @@ if #cpuexprs > 0 then
         np = #cpuexprs*givenNrNodes
         ppn = #cpuexprs
     end
-    newhosts = assignHosts(hosts, np, ppn)
+    newhosts, ppn = assignHosts(hosts, np, ppn, tpp)
     if np > #cpuexprs*#newhosts and #perf > 0 then
         print_stderr("ERROR: Oversubsribing not allowed.")
         print_stderr(string.format("ERROR: You want %d processes but the pinning expression has only expressions for %d processes. There are only %d hosts in the host list.", np, #cpuexprs*#newhosts, #newhosts))
         os.exit(1)
     end
-elseif nperdomain ~= nil then
+else 
+    ppn = math.tointeger(np / givenNrNodes)
+    if nperdomain == nil then
+        nperdomain = "N:"..tostring(ppn)
+        if tpp > 0 then
+            nperdomain = nperdomain..":"..tostring(tpp)
+        end
+    end
+    domainname, count, threads = nperdomain:match("[E]*[:]*([NSCM]*):(%d+)[:]*(%d*)")
+    if math.tointeger(threads) == nil then
+        if tpp > 1 then
+            nperdomain = string.format("E:%s:%d:%d", domainname, count, tpp)
+        else
+            tpp = 1
+            nperdomain = string.format("E:%s:%d:%d", domainname, count, tpp)
+        end
+    else
+        tpp = math.tointeger(threads)
+        nperdomain = string.format("E:%s:%d:%d", domainname, count, tpp)
+    end
     cpuexprs = calculateCpuExprs(nperdomain, cpuexprs)
+    if debug then
+        for p, ex in pairs(cpuexprs) do
+            print_stdout(string.format("DEBUG: Process %d runs on CPUs %s", p, table.concat(ex, ",")))
+        end
+    end
     ppn = #cpuexprs
     if np == 0 then
         np = givenNrNodes * ppn
@@ -1855,73 +2040,10 @@ elseif nperdomain ~= nil then
         print_stderr(string.format("ERROR: You want %d processes with %d on each of the %d hosts", np, ppn, givenNrNodes))
         os.exit(1)
     end
-    newhosts, ppn = assignHosts(hosts, np, ppn)
-elseif ppn == 0 and np > 0 then
-    maxnp = 0
-    maxppn = 0
-    for i, host in pairs(hosts) do
-        maxnp = maxnp + host["slots"]
-        if host["slots"] > maxppn then
-            maxppn = host["slots"]
-        end
-    end
-    if ppn == 0 then
-        ppn = 1
-    end
-    if ppn > maxppn and np > maxppn then
-        ppn = maxppn
-    elseif np < maxppn then
-        ppn = np
-    elseif maxppn == np then
-        ppn = maxppn
-    end
-    if (ppn * givenNrNodes) < np then
-        if #perf == 0 then
-            print_stderr("ERROR: Processes cannot be equally distributed")
-            print_stderr(string.format("WARN: You want %d processes on %d hosts.", np, givenNrNodes))
-            ppn = np/givenNrNodes
-            print_stderr(string.format("WARN: Sanitizing number of processes per node to %d", ppn))
-        else
-            ppn = 0
-            os.exit(1)
-        end
-    end
-    local newexprs = calculateCpuExprs("E:N:"..tostring(ppn), cpuexprs)
-    local copynp = np
-    while copynp > 0 do
-        for i, expr in pairs(newexprs) do
-            local exprlist = likwid.stringsplit(expr, ",")
-            local seclength = math.ceil(#exprlist/ppn)
-            local offset = 0
-            for p=1, ppn do
-                local str = ""
-                for j=1, seclength do
-                    if exprlist[((p-1)*seclength) + j] then
-                        str = str .. exprlist[((p-1)*seclength) + j] ..","
-                    end
-                end
-                if str ~= "" then
-                    str = str:sub(1,#str-1)
-                    table.insert(cpuexprs, str)
-                    copynp = copynp - seclength
-                else
-                    break
-                end
-            end
-        end
-    end
-    newhosts, ppn = assignHosts(hosts, np, ppn)
-    if np < ppn*#newhosts then
-        np = 0
-        for i, host in pairs(newhosts) do
-            np = np + host["slots"]
-        end
-    end
-else
-    print_stderr("ERROR: Commandline settings are not supported.")
-    os.exit(1)
+    newhosts, ppn = assignHosts(hosts, np, ppn, tpp)
 end
 
+
 local grouplist = {}
 if #perf > 0 then
     perfexprs, grouplist = setPerfStrings(perf, cpuexprs)
@@ -1939,14 +2061,19 @@ end
 
 if skipStr == "" then
     if mpitype == "intelmpi" then
-        if omptype == "intel" and nrNodes > 1 then
-            skipStr = '-s 0x3'
-        elseif omptype == "intel" and nrNodes == 1 then
-            skipStr = '-s 0x3'
-        elseif omptype == "gnu" and nrNodes > 1 then
-            skipStr = '-s 0x1'
-        elseif omptype == "gnu" and nrNodes == 1 then
-            skipStr = '-s 0x0'
+        maj, min = getMpiVersion()
+        if maj < 2017 and min <= 1 then
+            if omptype == "intel" and nrNodes > 1 then
+                skipStr = '-s 0x3'
+            elseif omptype == "intel" and nrNodes == 1 then
+                skipStr = '-s 0x3'
+            elseif omptype == "gnu" and nrNodes > 1 then
+                skipStr = '-s 0x1'
+            elseif omptype == "gnu" and nrNodes == 1 then
+                skipStr = '-s 0x0'
+            end
+        else
+            skipStr = "-s 0x0"
         end
     elseif mpitype == "mvapich2" then
         if omptype == "intel" and nrNodes > 1 then
@@ -1981,7 +2108,7 @@ if writeHostfile == nil or getEnvironment == nil or executeCommand == nil then
 end
 
 writeHostfile(newhosts, hostfilename)
-writeWrapperScript(scriptfilename, table.concat(executable, " "), newhosts, outfilename)
+writeWrapperScript(scriptfilename, table.concat(executable, " "), newhosts, envsettings, outfilename)
 local env = getEnvironment()
 local exitvalue = executeCommand(scriptfilename, hostfilename, env, nrNodes)
 
@@ -2010,21 +2137,26 @@ if not use_marker then
 else
     local tmpList = {}
     local cpuCount = 0
+    local regionlist = {}
     for i, file in pairs(filelist) do
-        host, rank, results, cpulist = parseMarkerOutputFile(file)
+        host, rank, results, cpulist, rlist = parseMarkerOutputFile(file)
         if host ~= nil and rank ~= nil then
             if all_results[rank] == nil then
                 all_results[rank] = {}
             end
             all_results[rank]["hostname"] = host
             all_results[rank]["cpus"] = cpulist
+            for _, r in pairs(rlist) do
+                table.insert(regionlist, r)
+            end
             cpuCount = cpuCount + #cpulist
             tmpList[rank] = results
             os.remove(file)
         end
     end
+    regionlist = uniqueList(regionlist)
     if likwid.tablelength(all_results) > 0 then
-        for region, _ in pairs(tmpList[0]) do
+        for _,region in pairs(regionlist) do
             for rank,_ in pairs(all_results) do
                 all_results[rank]["results"] = tmpList[rank][region]
             end
diff --git a/src/applications/likwid-perfctr.lua b/src/applications/likwid-perfctr.lua
index f8d5106..4555d71 100644
--- a/src/applications/likwid-perfctr.lua
+++ b/src/applications/likwid-perfctr.lua
@@ -7,13 +7,13 @@
  *      Description:  An application to read out performance counter registers
  *                    on x86 processors
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -38,7 +38,7 @@ print_stdout = print
 print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n") end io.stderr:flush() end
 
 local function version()
-    print_stdout(string.format("likwid-perfctr --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-perfctr -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 local function examples()
@@ -136,6 +136,9 @@ forceOverwrite = 0
 gotC = false
 markerFile = string.format("/tmp/likwid_%d.txt",likwid.getpid())
 cpuClock = 1
+execpid = false
+perfflags = nil
+perfpid = nil
 likwid.catchSignal()
 
 if #arg == 0 then
@@ -143,7 +146,7 @@ if #arg == 0 then
     os.exit(0)
 end
 
-for opt,arg in likwid.getopt(arg, {"a", "c:", "C:", "e", "E:", "g:", "h", "H", "i", "m", "M:", "o:", "O", "P", "s:", "S:", "t:", "v", "V:", "T:", "f", "group:", "help", "info", "version", "verbose:", "output:", "skip:", "marker", "force", "stats"}) do
+for opt,arg in likwid.getopt(arg, {"a", "c:", "C:", "e", "E:", "g:", "h", "H", "i", "m", "M:", "o:", "O", "P", "s:", "S:", "t:", "v", "V:", "T:", "f", "group:", "help", "info", "version", "verbose:", "output:", "skip:", "marker", "force", "stats", "execpid", "perfflags:", "perfpid:"}) do
     if (type(arg) == "string") then
         local s,e = arg:find("-");
         if s == 1 then
@@ -202,6 +205,12 @@ for opt,arg in likwid.getopt(arg, {"a", "c:", "C:", "e", "E:", "g:", "h", "H", "
         print_groups = true
     elseif (opt == "e") then
         print_events = true
+    elseif (opt == "execpid") then
+        execpid = true
+    elseif (opt == "perfflags") then
+        perfflags = arg
+    elseif (opt == "perfpid") then
+        perfpid = arg
     elseif (opt == "E") then
         if arg ~= nil then
             print_event = arg
@@ -314,6 +323,10 @@ for opt,arg in likwid.getopt(arg, {"a", "c:", "C:", "e", "E:", "g:", "h", "H", "
         os.exit(1)
     end
 end
+local execList = {}
+for i=1, likwid.tablelength(arg)-2 do
+    table.insert(execList, arg[i])
+end
 
 io.stdout:setvbuf("no")
 cpuinfo = likwid.getCpuInfo()
@@ -327,12 +340,14 @@ if num_cpus == 0 and
    not print_groups and
    not print_group_help and
    not print_info then
-    print_stderr("Option -c <list> or -C <list> must be given on commandline")
-    usage()
-    if outfile and likwid.access(outfile..".tmp", "e") == 0 then
-        os.remove(outfile..".tmp")
+    cpulist = {}
+    pin_cpus = false
+    for cntr=0,cputopo["numHWThreads"]-1 do
+        if cputopo["threadPool"][cntr]["inCpuSet"] == 1 then
+            num_cpus = num_cpus + 1
+            table.insert(cpulist, cputopo["threadPool"][cntr]["apicId"])
+        end
     end
-    os.exit(1)
 elseif num_cpus == 0 and
        gotC and
        not print_events and
@@ -617,7 +632,15 @@ if pin_cpus then
     end
 end
 
-
+if use_marker == true then
+    likwid.setenv("LIKWID_FILEPATH", markerFile)
+    likwid.setenv("LIKWID_MODE", tostring(access_mode))
+    likwid.setenv("LIKWID_DEBUG", tostring(verbose))
+    local str = table.concat(event_string_list, "|")
+    likwid.setenv("LIKWID_EVENTS", str)
+    likwid.setenv("LIKWID_THREADS", table.concat(cpulist,","))
+    likwid.setenv("LIKWID_FORCE", "-1")
+end
 
 --[[for i, event_string in pairs(event_string_list) do
     local groupdata = likwid.get_groupdata(event_string)
@@ -647,11 +670,54 @@ if likwid.init(num_cpus, cpulist) < 0 then
     os.exit(1)
 end
 
+
+if verbose > 0 then
+    print_stdout(string.format("Executing: %s",table.concat(execList," ")))
+end
+local ldpath = os.getenv("LD_LIBRARY_PATH")
+local libpath = string.match(likwid.pinlibpath, "([/%a%d]+)/[%a%s%d]*")
+if ldpath == nil then
+    likwid.setenv("LD_LIBRARY_PATH", libpath)
+elseif not ldpath:match(libpath) then
+    likwid.setenv("LD_LIBRARY_PATH", libpath..":"..ldpath)
+end
+
+
+
+local pid = nil
+if #execList > 0 then
+    local execString = table.concat(execList," ")
+    if pin_cpus then
+        pid = likwid.startProgram(execString, #cpulist, cpulist)
+    else
+        pid = likwid.startProgram(execString, 0, cpulist)
+    end
+    if execpid then
+        perfpid = pid
+    end
+end
+if not pid and #execList > 0 then
+    print_stderr(string.format("Failed to execute command: %s", table.concat(execList," ")))
+    likwid.putTopology()
+    likwid.putNumaInfo()
+    likwid.putConfiguration()
+    os.exit(1)
+elseif #execList > 0 then
+    likwid.sendSignal(pid, 19)
+end
+
+
 if os.getenv("LIKWID_FORCE") == nil or (forceOverwrite == 1 and os.getenv("LIKWID_FORCE") ~= tostring(forceOverwrite)) then
     likwid.setenv("LIKWID_FORCE", tostring(forceOverwrite))
 end
 for i, event_string in pairs(event_string_list) do
     if event_string:len() > 0 then
+        if perfpid ~= nil then
+            likwid.setenv("LIKWID_PERF_PID", tostring(perfpid))
+        end
+        if perfpid ~= nil and perfflags ~= nil then
+            likwid.setenv("LIKWID_PERF_FLAGS", tostring(perfflags))
+        end
         local gid = likwid.addEventSet(event_string)
         if gid < 0 then
             likwid.putTopology()
@@ -671,32 +737,18 @@ if #group_ids == 0 then
 end
 
 activeGroup = group_ids[1]
-likwid.setupCounters(activeGroup)
+ret = likwid.setupCounters(activeGroup)
+if ret < 0 then
+    likwid.killProgram(pid)
+    os.exit(1)
+end
 if outfile == nil then
     print_stdout(likwid.hline)
 end
 
-if use_marker == true then
-    likwid.setenv("LIKWID_FILEPATH", markerFile)
-    likwid.setenv("LIKWID_MODE", tostring(access_mode))
-    likwid.setenv("LIKWID_DEBUG", tostring(verbose))
-    local str = table.concat(event_string_list, "|")
-    likwid.setenv("LIKWID_EVENTS", str)
-    likwid.setenv("LIKWID_THREADS", table.concat(cpulist,","))
-    likwid.setenv("LIKWID_FORCE", "-1")
-end
 
-execString = table.concat(arg," ",1, likwid.tablelength(arg)-2)
-if verbose == true then
-    print_stdout(string.format("Executing: %s",execString))
-end
-local ldpath = os.getenv("LD_LIBRARY_PATH")
-local libpath = string.match(likwid.pinlibpath, "([/%a%d]+)/[%a%s%d]*")
-if ldpath == nil then
-    likwid.setenv("LD_LIBRARY_PATH", libpath)
-elseif not ldpath:match(libpath) then
-    likwid.setenv("LD_LIBRARY_PATH", libpath..":"..ldpath)
-end
+
+
 
 
 if use_timeline == true then
@@ -704,7 +756,7 @@ if use_timeline == true then
     for i, cpu in pairs(cpulist) do
         cores_string = cores_string .. tostring(cpu) .. "|"
     end
-    print_stderr("# "..cores_string:sub(1,cores_string:len()-1))
+    print("# "..cores_string:sub(1,cores_string:len()-1))
     for i, gid in pairs(group_ids) do
         local strlist = {}
         if likwid.getNumberOfMetrics(gid) == 0 then
@@ -716,7 +768,7 @@ if use_timeline == true then
                 table.insert(strlist, likwid.getNameOfMetric(gid, m))
             end
         end
-        print_stderr("# "..table.concat(strlist, "|").."\n")
+        print("# "..table.concat(strlist, "|"))
     end
 end
 
@@ -725,6 +777,7 @@ end
 io.stdout:flush()
 local groupTime = {}
 local exitvalue = 0
+local twork = 0
 if use_wrapper or use_timeline then
     local start = likwid.startClock()
     local stop = 0
@@ -743,81 +796,70 @@ if use_wrapper or use_timeline then
         os.exit(1)
     end
 
-    local pid = nil
-    if execString:len() > 0 then
-        if pin_cpus then
-            pid = likwid.startProgram(execString, #cpulist, cpulist)
-        else
-            pid = likwid.startProgram(execString, 0, cpulist)
-        end
-    else
-        pid = likwid.getpid()
-    end
+    likwid.sendSignal(pid, 18)
 
-    if not pid then
-        print_stderr("Failed to execute command: ".. execString)
-        likwid.putTopology()
-        likwid.putNumaInfo()
-        likwid.putConfiguration()
-        os.exit(1)
-    else
-        start = likwid.startClock()
-        groupTime[activeGroup] = 0
-        timeline_delim = " "
-        if use_csv then
-            timeline_delim = ","
-        end
-        while true do
-            if likwid.getSignalState() ~= 0 then
-                if execString:len() > 0 then
-                    likwid.killProgram()
-                end
-                break
+    start = likwid.startClock()
+    groupTime[activeGroup] = 0
+    timeline_delim = " "
+    if use_csv then
+        timeline_delim = ","
+    end
+    while true do
+        if likwid.getSignalState() ~= 0 then
+            if #execList > 0 then
+                likwid.killProgram(pid)
             end
-            local remain = likwid.sleep(duration)
-            exitvalue = likwid.checkProgram(pid)
-            if remain > 0 or exitvalue >= 0 then
-                io.stdout:flush()
-                if execString:len() > 0 then
-                    break
-                end
+            break
+        end
+        local remain = likwid.sleep(math.floor(duration-(twork*1E6)))
+        exitvalue = likwid.checkProgram(pid)
+        if remain > 0 or exitvalue >= 0 then
+            io.stdout:flush()
+            if #execList > 0 then
+                break
             end
-            if use_timeline == true then
-                stop = likwid.stopClock()
-                likwid.readCounters()
-                local time = likwid.getClock(start, stop)
-                if likwid.getNumberOfMetrics(activeGroup) == 0 then
-                    results = likwid.getLastResults()
-                else
-                    results = likwid.getLastMetrics()
-                end
-                --str = tostring(math.tointeger(activeGroup)) .. " "..tostring(#results[activeGroup]).." "..tostring(#cpulist).." "..tostring(time)
-                local outList = {}
-                table.insert(outList, tostring(math.tointeger(activeGroup)))
-                table.insert(outList, tostring(#results[activeGroup]))
-                table.insert(outList, tostring(#cpulist))
-                table.insert(outList, tostring(time))
-                for i,l1 in pairs(results[activeGroup]) do
-                    for j, value in pairs(l1) do
-                        --str = str .. " " .. tostring(value)
-                        table.insert(outList, tostring(value))
-                    end
-                end
-                --io.stderr:write(str.."\n")
-                io.stderr:write(table.concat(outList, timeline_delim).."\n")
-                groupTime[activeGroup] = time
+        end
+
+        if use_timeline == true then
+            stop = likwid.stopClock()
+            xstart = likwid.startClock()
+            likwid.readCounters()
+
+            local time = likwid.getClock(start, stop)
+            if likwid.getNumberOfMetrics(activeGroup) == 0 then
+                results = likwid.getLastResults()
             else
-                likwid.readCounters()
+                results = likwid.getLastMetrics()
             end
-            if #group_ids > 1 then
-                likwid.switchGroup(activeGroup + 1)
-                activeGroup = likwid.getIdOfActiveGroup()
-                if groupTime[activeGroup] == nil then
-                    groupTime[activeGroup] = 0
+            local outList = {}
+            table.insert(outList, tostring(math.tointeger(activeGroup)))
+            table.insert(outList, tostring(#results[activeGroup]))
+            table.insert(outList, tostring(#cpulist))
+            table.insert(outList, tostring(time))
+            for i,l1 in pairs(results[activeGroup]) do
+                for j, value in pairs(l1) do
+                    table.insert(outList, tostring(value))
                 end
-                nr_events = likwid.getNumberOfEvents(activeGroup)
             end
+            print_stderr(table.concat(outList, timeline_delim))
+            groupTime[activeGroup] = time
+            xstop = likwid.stopClock()
+            twork = likwid.getClock(xstart, xstop)
+        else
+            xstart = likwid.startClock()
+            likwid.readCounters()
+            xstop = likwid.stopClock()
+            twork = likwid.getClock(xstart, xstop)
+        end
+        if #group_ids > 1 then
+            likwid.switchGroup(activeGroup + 1)
+            activeGroup = likwid.getIdOfActiveGroup()
+            if groupTime[activeGroup] == nil then
+                groupTime[activeGroup] = 0
+            end
+            nr_events = likwid.getNumberOfEvents(activeGroup)
         end
+
         stop = likwid.stopClock()
     end
 elseif use_stethoscope then
@@ -828,11 +870,8 @@ elseif use_stethoscope then
     end
     likwid.sleep(duration)
 elseif use_marker then
-    local ret = os.execute(execString)
-    if ret == nil then
-        print_stderr("Failed to execute command: ".. execString)
-        exitvalue = 1
-    end
+    likwid.sendSignal(pid, 18)
+    exitvalue = likwid.waitpid(pid)
 end
 
 if not use_marker then
diff --git a/src/applications/likwid-perfscope.lua b/src/applications/likwid-perfscope.lua
index 0f645fb..5a7c49e 100644
--- a/src/applications/likwid-perfscope.lua
+++ b/src/applications/likwid-perfscope.lua
@@ -7,13 +7,13 @@
  *      Description:  An application to use the timeline mode of likwid-perfctr to generate
  *                    realtime plots using feedGnuplot
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -121,7 +121,7 @@ local predefined_plots = {
 }
 
 local function version()
-    print_stdout(string.format("likwid-perfscope --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-perfscope -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 local function examples()
@@ -220,6 +220,10 @@ for opt,arg in likwid.getopt(arg, {"h","v","g:","C:","c:","t:","r:","a","d","p",
         os.exit(1)
     end
 end
+local execList = {}
+for i=1, likwid.tablelength(arg)-2 do
+    table.insert(execList, arg[i])
+end
 
 if print_configs then
     local num_groups, all_groups = likwid.get_groups()
@@ -258,7 +262,7 @@ if num_cpus == 0 then
     os.exit(1)
 end
 
-if #arg == 0 then
+if #execList == 0 then
     print_stderr("ERROR: Executable must be given on commandline")
     os.exit(1)
 end
@@ -424,18 +428,21 @@ cmd = cmd .. string.format(" -t %s", timeline)
 for i, group in pairs(group_list) do
     cmd = cmd .. " -g "..group["eventstring"]
 end
-cmd = cmd .. " ".. table.concat(arg, " ")
+cmd = cmd .. " ".. table.concat(execList, " ")
 -- since io.popen can only read stdout we swap stdout and stderr
 -- application output is written to stderr, we catch stdout
 cmd = cmd .. " 3>&1 1>&2 2>&3 3>&-"
 if host ~= nil then
     cmd = cmd .. " \\\" \" "
 end
-perfctr = assert (io.popen (cmd))
+
 
 
 for i, group in pairs(group_list) do
     gnucmd = string.format("%s --stream %f --with linespoints --domain --nodataid", FEEDGNUPLOT, mfreq/#group_list)
+    extracmds = {'set xtics font \",10\"', 'set ytics font \",10\"', 'set y2tics font \",10\"',
+                 'set bmargin 10', 'set key font \",12\"' }
+    gnucmd =  gnucmd .. " --geometry \"1280,1024\""
     if plotrange > 0 then
         gnucmd = gnucmd .. string.format(" --xlen %d", plotrange)
     else
@@ -443,21 +450,27 @@ for i, group in pairs(group_list) do
     end
     if group["title"] ~= nil then
         if #group_list > 1 then
-            gnucmd = gnucmd .. string.format(" --title %q", "Group "..i..": "..group["title"])
+            --gnucmd = gnucmd .. string.format(" --title %q", "Group "..i..": "..group["title"])
+            table.insert(extracmds, string.format("set title 'Group %d: %s' font \",12\"", i, group["title"]))
         else
-            gnucmd = gnucmd .. string.format(" --title %q", group["title"])
+            --gnucmd = gnucmd .. string.format(" --title %q", group["title"])
+            table.insert(extracmds, string.format("set title %q font \",12\"", group["title"]))
         end
     end
     if group["xtitle"] ~= nil then
-        gnucmd = gnucmd .. string.format(" --xlabel %q", group["xtitle"])
+        --gnucmd = gnucmd .. string.format(" --xlabel %q", group["xtitle"])
+        table.insert(extracmds, string.format("set xlabel %q font \",12\"", group["xtitle"]))
     else
-        gnucmd = gnucmd .. string.format(" --xlabel %q", "Time")
+        --gnucmd = gnucmd .. string.format(" --xlabel %q", "Time")
+        table.insert(extracmds, "set xlabel 'Time' font \",12\"")
     end
     if group["ytitle"] ~= nil then
-        gnucmd = gnucmd .. string.format(" --ylabel %q", group["ytitle"])
+        --gnucmd = gnucmd .. string.format(" --ylabel %q", group["ytitle"])
+        table.insert(extracmds, string.format("set ylabel %q font \",12\"", group["ytitle"]))
     end
     if group["y2title"] ~= nil then
-        gnucmd = gnucmd .. string.format(" --y2 %d --y2label %q", group["y2funcindex"], group["y2title"])
+        gnucmd = gnucmd .. string.format(" --y2 %d", group["y2funcindex"])
+        table.insert(extracmds, string.format("set y2label %q font \",12\"", group["y2title"]))
     end
     if group["formulas"] then
         if #cpulist == 1 then
@@ -475,6 +488,7 @@ for i, group in pairs(group_list) do
         end
     end
     gnucmd = gnucmd .. " --set 'key outside bmargin bottom'"
+    gnucmd = gnucmd .. string.format(" --extracmds '%s'", table.concat(extracmds, ";"))
     if plotdump then
         gnucmd = gnucmd .. " --dump"
     else
@@ -501,7 +515,7 @@ for i,g in pairs(group_list) do
     end
 end
 
-
+perfctr = assert (io.popen (cmd))
 olddata = {}
 oldmetric = {}
 local perfctr_exited = false
@@ -509,7 +523,7 @@ local oldtime = 0
 local clock = likwid.getCpuClock()
 while true do
     local l = perfctr:read("*line")
-    if l == nil or l:match("^%s*$") then
+    if l == nil then
         break
     end
     if l:match("^%d+ %d+ %d+ [%d.]+ %d+") then
diff --git a/src/applications/likwid-pin.lua b/src/applications/likwid-pin.lua
index 5bafe2a..8a7e3f3 100644
--- a/src/applications/likwid-pin.lua
+++ b/src/applications/likwid-pin.lua
@@ -6,13 +6,13 @@
  *
  *      Description:  An application to pin a program including threads
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -36,7 +36,7 @@ print_stdout = print
 print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n") end end
 
 local function version()
-    print_stdout(string.format("likwid-pin.lua --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-pin -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 local function examples()
@@ -79,7 +79,7 @@ local function usage()
     print_stdout("-V, --verbose <level>\t Verbose output, 0 (only errors), 1 (info), 2 (details), 3 (developer)")
     print_stdout("-i\t\t\t Set numa interleave policy with all involved numa nodes")
     print_stdout("-S, --sweep\t\t Sweep memory and LLC of involved NUMA nodes")
-    print_stdout("-c <list>\t\t Comma separated processor IDs or expression")
+    print_stdout("-c/-C <list>\t\t Comma separated processor IDs or expression")
     print_stdout("-s, --skip <hex>\t Bitmask with threads to skip")
     print_stdout("-p\t\t\t Print available domains with mapping on physical IDs")
     print_stdout("\t\t\t If used together with -p option outputs a physical processor IDs.")
@@ -93,6 +93,7 @@ local function close_and_exit(code)
     likwid.putTopology()
     likwid.putAffinityInfo()
     likwid.putConfiguration()
+    likwid.unsetenv("LIKWID_NO_ACCESS")
     os.exit(code)
 end
 
@@ -105,19 +106,16 @@ cpu_list = {}
 skip_mask = nil
 affinity = nil
 num_threads = 0
+cpustr = nil
+verbose = 0
 
 
-likwid.setenv("LIKWID_NO_ACCESS", "1")
-config = likwid.getConfiguration()
-cputopo = likwid.getCpuTopology()
-affinity = likwid.getAffinityInfo()
-
 if (#arg == 0) then
     usage()
     os.exit(0)
 end
 
-for opt,arg in likwid.getopt(arg, {"c:", "d:", "h", "i", "p", "q", "s:", "S", "t:", "v", "V:", "verbose:", "help", "version", "skip","sweep", "quiet"}) do
+for opt,arg in likwid.getopt(arg, {"c:", "C:", "d:", "h", "i", "p", "q", "s:", "S", "t:", "v", "V:", "verbose:", "help", "version", "skip","sweep", "quiet"}) do
     if opt == "h" or opt == "help" then
         usage()
         close_and_exit(0)
@@ -127,23 +125,11 @@ for opt,arg in likwid.getopt(arg, {"c:", "d:", "h", "i", "p", "q", "s:", "S", "t
     elseif opt == "V" or opt == "verbose" then
         verbose = tonumber(arg)
         likwid.setVerbosity(verbose)
-    elseif (opt == "c") then
-        if (affinity ~= nil) then
-            num_threads,cpu_list = likwid.cpustr_to_cpulist(arg)
-        else
-            num_threads,cpu_list = likwid.cpustr_to_cpulist_physical(arg)
-        end
-        if (num_threads == 0) then
-            print_stderr("Failed to parse cpulist " .. arg)
-            close_and_exit(1)
-        end
+    elseif (opt == "c") or (opt == "C") then
+        cpustr = arg
     elseif (opt == "d") then
         delimiter = arg
     elseif opt == "S" or opt == "sweep" then
-        if (affinity == nil) then
-            print_stderr("Option -S is not supported for unknown processor!")
-            close_and_exit(1)
-        end
         sweep_sockets = true
     elseif (opt == "i") then
         interleaved_policy = true
@@ -167,6 +153,33 @@ for opt,arg in likwid.getopt(arg, {"c:", "d:", "h", "i", "p", "q", "s:", "S", "t
         close_and_exit(1)
     end
 end
+local execList = {}
+for i=1, likwid.tablelength(arg)-2 do
+    table.insert(execList, arg[i])
+end
+
+likwid.setenv("LIKWID_NO_ACCESS", "1")
+config = likwid.getConfiguration()
+cputopo = likwid.getCpuTopology()
+numainfo = likwid.getNumaInfo()
+affinity = likwid.getAffinityInfo()
+
+if cpustr ~= nil then
+    if not (cpustr:match(",$") or cpustr:match("-$") or cpustr:match("^-") or cpustr:match("^,")) then
+        if (affinity ~= nil) then
+            num_threads,cpu_list = likwid.cpustr_to_cpulist(cpustr)
+        else
+            num_threads,cpu_list = likwid.cpustr_to_cpulist_physical(cpustr)
+        end
+    end
+    if (num_threads <= 0) then
+        print_stderr("Failed to parse cpulist " .. cpustr)
+        close_and_exit(1)
+    end
+    if verbose > 0 and quiet == 0 then
+        print_stdout("Evaluated CPU string to CPUs: ")
+    end
+end
 
 
 if print_domains and num_threads > 0 then
@@ -179,14 +192,14 @@ if print_domains and num_threads > 0 then
 elseif print_domains then
     for k,v in pairs(affinity["domains"]) do
         print_stdout(string.format("Domain %s:", v["tag"]))
-        print_stdout("\t" .. table.concat(v["processorList"], ","))
+        print_stdout("\t" .. table.concat(v["processorList"], delimiter))
         print_stdout("")
     end
     close_and_exit(0)
 end
 
 if num_threads == 0 then
-    num_threads, cpu_list = likwid.cpustr_to_cpulist("N:0-"..cputopo["numHWThreads"]-1)
+    num_threads, cpu_list = likwid.cpustr_to_cpulist("N")
 end
 if (#arg == 0) then
     print_stderr("Executable must be given on commandline")
@@ -194,14 +207,18 @@ if (#arg == 0) then
 end
 
 if interleaved_policy then
-    if quiet == 0 then
-        print_stdout("Set mem_policy to interleaved")
+    if numainfo["numberOfNodes"] > 1 then
+        if verbose > 0 and quiet == 0 then
+            print_stdout("Set mem_policy to interleaved")
+        end
+        likwid.setMemInterleaved(num_threads, cpu_list)
+    else
+        print_stdout("No need to set mem_policy to interleaved, only one NUMA node available")
     end
-    likwid.setMemInterleaved(num_threads, cpu_list)
 end
 
 if sweep_sockets then
-    if quiet == 0 then
+    if verbose > 0 and quiet == 0 then
         print_stdout("Sweeping memory")
     end
     likwid.memSweep(num_threads, cpu_list)
@@ -210,7 +227,7 @@ end
 local omp_threads = os.getenv("OMP_NUM_THREADS")
 if omp_threads == nil then
     likwid.setenv("OMP_NUM_THREADS",tostring(math.tointeger(num_threads)))
-elseif num_threads > tonumber(omp_threads) and quiet == 0 then
+elseif num_threads > tonumber(omp_threads) and (quiet == 0 and verbose > 0) then
     print_stdout(string.format("Environment variable OMP_NUM_THREADS already set to %s but %d cpus required", omp_threads,num_threads))
 end
 if omp_threads and tonumber(omp_threads) < num_threads then
@@ -252,12 +269,24 @@ else
     likwid.pinProcess(cpu_list[1], quiet)
 end
 
-local exec = table.concat(arg," ",1, likwid.tablelength(arg)-2)
+local exec = table.concat(execList," ")
+if verbose > 0 and quiet == 0 then
+    print_stdout("Running: " .. exec)
+    mask = 0
+    for _, c in pairs(cpu_list) do
+        mask = mask | (1<<c)
+    end
+    print_stdout(string.format("Using %d thread(s) (cpuset: 0x%x)", num_threads, mask))
+end
 local pid = likwid.startProgram(exec, num_threads, cpu_list)
 if (pid == nil) then
-    print_stderr("Failed to execute command: ".. exec)
+    print_stderr("Failed to execute command: ".. table.concat(execList," "))
     close_and_exit(1)
 end
 
 local exitvalue = likwid.waitpid(pid)
+
+likwid.putAffinityInfo()
+likwid.putTopology()
+likwid.putConfiguration()
 close_and_exit(exitvalue)
diff --git a/src/applications/likwid-powermeter.lua b/src/applications/likwid-powermeter.lua
index 99862d8..92ba2f6 100644
--- a/src/applications/likwid-powermeter.lua
+++ b/src/applications/likwid-powermeter.lua
@@ -7,13 +7,13 @@
  *      Description:  An application to get information about power
  *      consumption on architectures implementing the RAPL interface.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -37,7 +37,7 @@ print_stdout = print
 print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n") end end
 
 local function version()
-    print_stdout(string.format("likwid-powermeter --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-powermeter -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 local function examples()
@@ -84,7 +84,7 @@ time_interval = 2.E06
 time_orig = "2s"
 read_interval = 30.E06
 sockets = {}
-domainList = {"PKG", "PP0", "PP1", "DRAM"}
+domainList = {"PKG", "PP0", "PP1", "DRAM", "PLATFORM"}
 
 cpuinfo = likwid.getCpuInfo()
 cputopo = likwid.getCpuTopology()
@@ -226,7 +226,7 @@ end
 if (print_info) then
     for i, dname in pairs(domainList) do
         local domain = power["domains"][dname]
-        if domain["supportInfo"] then
+        if domain and domain["supportInfo"] then
             print_stdout(string.format("Info for RAPL domain %s:", dname));
             print_stdout(string.format("Thermal Spec Power: %g Watt",domain["tdp"]*1E-6))
             print_stdout(string.format("Minimum Power: %g Watt",domain["minPower"]*1E-6))
@@ -266,7 +266,7 @@ if use_perfctr then
     execString = string.format("<INSTALLED_PREFIX>/bin/likwid-perfctr -C %s -f -g CLOCK ",argString)
 end
 
-
+local execList = {}
 if #arg == 0 then
     if use_perfctr then
         execString = execString .. string.format(" -S %s ", time_orig)
@@ -275,10 +275,13 @@ if #arg == 0 then
         stethoscope = true
     end
 else
+    for i=1, likwid.tablelength(arg)-2 do
+        table.insert(execList, arg[i])
+    end
     if use_perfctr then
-        execString = execString .. table.concat(arg," ",1, likwid.tablelength(arg)-2)
+        execString = execString .. table.concat(execList," ")
     else
-        execString = table.concat(arg," ",1, likwid.tablelength(arg)-2)
+        execString = table.concat(execList," ")
     end
 end
 
@@ -312,9 +315,9 @@ if not print_info and not print_temp then
                 likwid.sleep(time_interval)
             end
         else
-            local pid = likwid.startProgram(execString, 0, {})
+            local pid = likwid.startProgram(table.concat(execList," "), 0, {})
             if not pid then
-                print_stderr(string.format("Failed to execute %s!",execString))
+                print_stderr(string.format("Failed to execute %s!",table.concat(execList," ")))
                 likwid.finalize()
                 os.exit(1)
             end
@@ -367,7 +370,7 @@ if not print_info and not print_temp then
     else
         err = os.execute(execString)
         if err == false then
-            print_stderr(string.format("Failed to execute %s!",execString))
+            print_stderr(string.format("Failed to execute %s!", execString))
             likwid.putPowerInfo()
             likwid.finalize()
             os.exit(1)
diff --git a/src/applications/likwid-setFrequencies.lua b/src/applications/likwid-setFrequencies.lua
index d2f3ff0..af31b0f 100644
--- a/src/applications/likwid-setFrequencies.lua
+++ b/src/applications/likwid-setFrequencies.lua
@@ -6,13 +6,13 @@
  *
  *      Description:  A application to set the CPU frequency of CPU cores and domains.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -41,41 +41,80 @@ set_command = "<INSTALLED_PREFIX>/sbin/likwid-setFreq"
 
 
 function version()
-    print_stdout(string.format("likwid-setFrequencies --  Version %d.%d",likwid.version,likwid.release))
+    print_stdout(string.format("likwid-setFrequencies -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 function usage()
     version()
     print_stdout("A tool to adjust frequencies and governors on x86 CPUs.\n")
     print_stdout("Options:")
-    print_stdout("-h\t Help message")
-    print_stdout("-v\t Version information")
-    print_stdout("-c dom\t Likwid thread domain which to apply settings (default are all CPUs)")
-    print_stdout("\t See likwid-pin -h for details")
-    print_stdout("-g gov\t Set governor (" .. table.concat(likwid.getAvailGovs(nil), ", ") .. ") (set to ondemand if omitted)")
-    print_stdout("-f/--freq freq\t Set current frequency, implicitly sets userspace governor")
-    print_stdout("-x/--min freq\t Set minimal frequency")
-    print_stdout("-y/--max freq\t Set maximal frequency")
-    print_stdout("-F\t Pin CPU to frequency (sets min, max and cur frequency)")
-    print_stdout("-p\t Print current frequencies")
-    print_stdout("-l\t List available frequencies")
-    print_stdout("-m\t List available governors")
+    print_stdout("-h\t\t Help message")
+    print_stdout("-v\t\t Version information")
+    print_stdout("-V <0-3>\t Verbosity (0=only_error, 3=developer)")
+    print_stdout("-c dom\t\t Likwid thread domain which to apply settings (default are all CPUs)")
+    print_stdout("\t\t See likwid-pin -h for details")
+    print_stdout("-g gov\t\t Set governor (" .. table.concat(likwid.getAvailGovs(0), ", ") .. ")")
+    print_stdout("-f/--freq freq\t Set minimal and maximal CPU frequency")
+    print_stdout("-p\t\t Print current frequencies (CPUs + Uncore)")
+    print_stdout("-l\t\t List available CPU frequencies")
+    print_stdout("-m\t\t List available CPU governors")
+    print_stdout("-t/--turbo <0|1> De/Activate turbo mode")
     print_stdout("")
-    print_stdout("In order to set the highest frequency, use the governor 'turbo'. This sets the")
-    print_stdout("minimal frequency to the available minimum, the maximal and current frequency")
-    print_stdout("to the turbo related frequency. The governor is set to 'performance'.")
+    print_stdout("-x/--min freq\t Set minimal CPU frequency")
+    print_stdout("-y/--max freq\t Set maximal CPU frequency")
+    print_stdout("--umin freq\t Set minimal Uncore frequency")
+    print_stdout("--umax freq\t Set maximal Uncore frequency")
+    print_stdout("")
+    print_stdout("For the options -f, -x and -y:")
+    print_stdout("\t acpi-cpufreq driver: set the userspace governor implicitly")
+    print_stdout("\t intel_pstate driver: keep current governor")
+    print_stdout("")
+    print_stdout("The min/max frequencies can be slightly off with the intel_pstate driver as")
+    print_stdout("the value is calculated while the current frequency is read from sysfs.")
+    print_stdout("")
+    print_stdout("The min/max Uncore frequency can be set freely, even to 0 or 1E20 but the hardware")
+    print_stdout("stays inside its limits. To check whether the set Uncore frequency is really set")
+    print_stdout("and fixed, use likwid-perfctr -g UNCORE_CLOCK:UBOXFIX -C 0 -S 1s")
+    print_stdout("")
+    print_stdout("If you switch governors with the intel_pstate driver, it might be that the driver")
+    print_stdout("changes the frequency settings, please check afterwards and re-set frequencies if")
+    print_stdout("needed.")
 end
 
+function round(x)
+    if (type(x) ~= "number") then
+        x = tonumber(x)
+    end
+
+    s = string.format("%f", x)
+    if not s:match("%d+%.%d+") then
+        s = s.. ".0"
+    end
+    slen = s:len()
+    while slen > 3 do
+        if s:sub(slen,slen) ~= "0" then break end
+        slen = slen - 1
+    end
+    if slen > 5 then
+        slen = 5
+    end
+    return s:sub(1, slen)
+end
 
 verbosity = 0
 governor = nil
 frequency = nil
 min_freq = nil
 max_freq = nil
+min_u_freq = nil
+max_u_freq = nil
 domain = nil
 printCurFreq = false
 printAvailFreq = false
 printAvailGovs = false
+do_reset = false
+set_turbo = false
+turbo = 0
 
 if #arg == 0 then
     usage()
@@ -83,7 +122,7 @@ if #arg == 0 then
 end
 
 
-for opt,arg in likwid.getopt(arg, {"g:", "c:", "f:", "l", "p", "h", "v", "m", "x:", "y:", "help","version","freq:", "min:", "max:", "F:"}) do
+for opt,arg in likwid.getopt(arg, {"V:", "g:", "c:", "f:", "l", "p", "h", "v", "m", "x:", "y:", "t:", "help","version","freq:", "min:", "max:", "umin:", "umax:", "reset", "turbo:"}) do
     if opt == "h" or opt == "help" then
         usage()
         os.exit(0)
@@ -96,14 +135,33 @@ for opt,arg in likwid.getopt(arg, {"g:", "c:", "f:", "l", "p", "h", "v", "m", "x
         governor = arg
     elseif opt == "f" or opt == "freq" then
         frequency = arg
-    elseif opt == "x" or opt == "min" then
         min_freq = arg
-    elseif opt == "y" or opt == "max" then
         max_freq = arg
-    elseif opt == "F" then
-        frequency = arg
+    elseif opt == "x" or opt == "min" then
         min_freq = arg
+    elseif opt == "y" or opt == "max" then
         max_freq = arg
+    elseif opt == "t" or opt == "turbo" then
+        set_turbo = true
+        local t = tonumber(arg)
+        if (t >= 0 and t <= 1) then
+            turbo = t
+        else
+            print_stderr(string.format("ERROR: Value %s for turbo not valid: 1=active turbo, 0=disabled turbo", arg))
+        end
+    elseif opt == "V" then
+        local s = tonumber(arg)
+        if (s >= 0 and s <= 3) then
+            verbosity = s
+        else
+            print_stderr(string.format("ERROR: Value %s for verbosity not valid", arg))
+        end
+    elseif opt == "reset" then
+        do_reset = true
+    elseif opt == "umin" then
+        min_u_freq = arg
+    elseif opt == "umax" then
+        max_u_freq = arg
     elseif (opt == "p") then
         printCurFreq = true
     elseif (opt == "l") then
@@ -118,10 +176,6 @@ for opt,arg in likwid.getopt(arg, {"g:", "c:", "f:", "l", "p", "h", "v", "m", "x
         os.exit(1)
     end
 end
-if likwid.getDriver() ~= "acpi-cpufreq" then
-    print_stderr("The system does not use the acpi-cpufreq driver, other drivers are not usable with likwid-setFrequencies.")
-    os.exit(1)
-end
 
 topo = likwid.getCpuTopology()
 affinity = likwid.getAffinityInfo()
@@ -136,37 +190,82 @@ if domain:match("[SCM]%d") then
     end
 end
 cpulist = {}
+socklist = {}
 numthreads, cpulist = likwid.cpustr_to_cpulist(domain)
+for i, dom in pairs(affinity["domains"]) do
+    if dom["tag"]:match("S%d") then
+        for k, d in pairs(dom["processorList"]) do
+            local found = false
+            for j, c in pairs(cpulist) do
+                if c == d then
+                    
+                    found = true
+                    break
+                end
+            end
+            if found then
+                s = tonumber(dom["tag"]:match("S(%d)"))
+                found = false
+                for j, c in pairs(socklist) do
+                    if c == s then found = true end
+                end
+                if not found then
+                    table.insert(socklist, s)
+                end
+            end
+        end
+    end
+end
+
 if verbosity == 3 then
-    print_stdout(string.format("Given CPU expression expands to %d CPU cores:", numthreads))
-    local str = tostring(cpulist[1])
+    print_stdout(string.format("DEBUG: Given CPU expression expands to %d CPU cores:", numthreads))
+    local str = "DEBUG: " .. tostring(cpulist[1])
     for i=2, numthreads  do
         str = str .. "," .. tostring(cpulist[i])
     end
     print_stdout(str)
+    print_stdout(string.format("DEBUG: Given CPU expression expands to %d CPU sockets:", #socklist))
+    str = "DEBUG: " .. tostring(socklist[1])
+    for i=2, #socklist do
+        str = str .. "," .. tostring(socklist[i])
+    end
+    print_stdout(str)
 end
 
 
 if printAvailGovs then
     local govs = likwid.getAvailGovs(0)
     print_stdout("Available governors:")
-    print_stdout(string.format("%s %s", table.concat(govs, " "), "turbo"))
+    print_stdout(string.format("%s", table.concat(govs, " ")))
 end
 
 if printAvailFreq then
-    local freqs, turbo = likwid.getAvailFreq(0)
+    local freqs = likwid.getAvailFreq(0)
     print_stdout("Available frequencies:")
-    print_stdout(string.format("%s %s", turbo, table.concat(freqs, " ")))
+    print_stdout(string.format("%s", table.concat(freqs, " ")))
 end
 
 if printCurFreq then
-    print_stdout("Current frequencies:")
+    print_stdout("Current CPU frequencies:")
     for i=1,#cpulist do
         gov = likwid.getGovernor(cpulist[i])
         freq = tonumber(likwid.getCpuClockCurrent(cpulist[i]))/1E9
         min = tonumber(likwid.getCpuClockMin(cpulist[i]))/1E9
         max = tonumber(likwid.getCpuClockMax(cpulist[i]))/1E9
-        print_stdout(string.format("CPU %d: governor %12s min/cur/max %s/%s/%s GHz",cpulist[i], gov, min, freq, max))
+        t = tonumber(likwid.getTurbo(cpulist[i]));
+        print_stdout(string.format("CPU %d: governor %12s min/cur/max %s/%s/%s GHz Turbo %d",cpulist[i], gov, round(min), round(freq), round(max), t))
+    end
+    print_stdout("")
+    test = likwid.getUncoreFreqMin(socklist[i])
+    if test ~= 0 then
+        print_stdout("Current Uncore frequencies:")
+        for i=1,#socklist do
+            min = tonumber(likwid.getUncoreFreqMin(socklist[i]))/1000.0
+            max = tonumber(likwid.getUncoreFreqMax(socklist[i]))/1000.0
+            print_stdout(string.format("Socket %d: min/max %s/%s GHz", socklist[i], round(min), round(max)))
+        end
+    else
+        print("No support for Uncore frequencies")
     end
 end
 
@@ -174,99 +273,156 @@ if printAvailGovs or printAvailFreq or printCurFreq then
     os.exit(0)
 end
 
-if numthreads > 0 and not (frequency or min_freq or max_freq or governor) then
+if do_reset then
+    local f = likwid.setTurbo(cpulist[1], 0)
+    local availfreqs = likwid.getAvailFreq(cpulist[1])
+    local availgovs = likwid.getAvailGovs(cpulist[1])
+    if not min_freq then
+        min_freq = availfreqs[1]
+    end
+    if not (set_turbo or max_freq) then
+        set_turbo = true
+        turbo = 0
+        max_freq = availfreqs[#availfreqs]
+    end
+    if not governor then
+        governor = availgovs[#availgovs]
+    end
+    print_stdout(string.format("Reset to governor %s with min freq. %g GHz and deactivate turbo mode", governor, min_freq))
+end
+
+if numthreads > 0 and not (frequency or min_freq or max_freq or governor or min_u_freq or max_u_freq or set_turbo) then
     print_stderr("ERROR: You need to set either a frequency or governor for the selected CPUs on commandline")
     os.exit(1)
 end
 
 if min_freq and max_freq and min_freq > max_freq then
-    print_stderr("ERROR: Minimal frequency higher than maximal frequency.")
+    print_stderr("ERROR: Minimal CPU frequency higher than maximal frequency.")
     os.exit(1)
 end
 if min_freq and max_freq and max_freq < min_freq then
-    print_stderr("ERROR: Maximal frequency below than minimal frequency.")
+    print_stderr("ERROR: Maximal CPU frequency lower than minimal frequency.")
+    os.exit(1)
+end
+if min_u_freq and max_u_freq and max_u_freq < min_u_freq then
+    print_stderr("ERROR: Maximal Uncore frequency lower than minimal frequency.")
     os.exit(1)
 end
 
 
-
-local availfreqs, availturbo = likwid.getAvailFreq(cpulist[i])
-if governor == "turbo" then
-    if not min_freq then
-        min_freq = availfreqs[#availfreqs]
-    end
-    if not max_freq or max_freq < availturbo then
-        max_freq = availturbo
-    end
-    frequency = availturbo
+local availfreqs = likwid.getAvailFreq(cpulist[i])
+local savailfreqs = {}
+for i,f in pairs(availfreqs) do
+    savailfreqs[i] = round(f)
+end
+if verbosity == 3 then
+    print_stdout("DEBUG Available freq.: "..table.concat(availfreqs, ", "))
 end
 
-if min_freq then
-    for i=1,#cpulist do
-        local valid_freq = false
-        for k,v in pairs(availfreqs) do
-            if (min_freq == v) then
+
+for x=1,2 do
+    if min_freq then
+        for i=1,#cpulist do
+            local valid_freq = false
+            for k,v in pairs(savailfreqs) do
+                if (min_freq == v) then
+                    if verbosity == 3 then
+                        print_stdout(string.format("DEBUG: Min frequency %g valid", min_freq))
+                    end
+                    valid_freq = true
+                    break
+                end
+            end
+            if min_freq == availturbo then
                 valid_freq = true
-                break
             end
+            if not valid_freq then
+                print_stderr(string.format("ERROR: Selected min. frequency %s not available for CPU %d! Please select one of\n%s", min_freq, cpulist[i], table.concat(savailfreqs, ", ")))
+                os.exit(1)
+            end
+            if verbosity == 3 then
+                print_stdout(string.format("DEBUG: Set min. frequency for CPU %d to %d", cpulist[i], tonumber(min_freq)*1E6))
+            end
+            local f = likwid.setCpuClockMin(cpulist[i], tonumber(min_freq)*1E6)
         end
-        if min_freq == availturbo then
-            valid_freq = true
-        end
-        if not valid_freq then
-            print_stderr(string.format("ERROR: Selected min. frequency %s not available for CPU %d! Please select one of\n%s", min_freq, cpulist[i], table.concat(availfreqs, ", ")))
-            os.exit(1)
-        end
-        local f = likwid.setCpuClockMin(cpulist[i], tonumber(min_freq)*1E6)
     end
-end
 
-if max_freq then
-    for i=1,#cpulist do
-        local valid_freq = false
-        for k,v in pairs(availfreqs) do
-            if (max_freq == v) then
+
+    if set_turbo then
+        for i=1,#cpulist do
+            if verbosity == 3 then
+                print_stdout(string.format("DEBUG: Set turbo mode for CPU %d to %d", cpulist[i], turbo))
+            end
+            local f = likwid.setTurbo(cpulist[i], turbo)
+        end
+    end
+    if max_freq then
+        for i=1,#cpulist do
+            local valid_freq = false
+            for k,v in pairs(savailfreqs) do
+                if (max_freq == v) then
+                    if verbosity == 3 then
+                        print_stdout(string.format("DEBUG: Max frequency %g valid", max_freq))
+                    end
+                    valid_freq = true
+                    break
+                end
+            end
+            if max_freq == availturbo then
                 valid_freq = true
-                break
             end
+            if not valid_freq then
+                print_stderr(string.format("ERROR: Selected max. frequency %s not available for CPU %d! Please select one of\n%s", max_freq, cpulist[i], table.concat(savailfreqs, ", ")))
+                os.exit(1)
+            end
+            if verbosity == 3 then
+                print_stdout(string.format("DEBUG: Set max. frequency for CPU %d to %d", cpulist[i], tonumber(max_freq)*1E6))
+            end
+            local f = likwid.setCpuClockMax(cpulist[i], tonumber(max_freq)*1E6)
         end
-        if max_freq == availturbo then
-            valid_freq = true
+    end
+end
+
+if min_u_freq then
+    for s=1,#socklist do
+        socket = socklist[s]
+        if verbosity == 3 then
+            print_stdout(string.format("DEBUG: Set min. uncore frequency for socket %d to %d MHz", socket, min_u_freq*1000))
         end
-        if not valid_freq then
-            print_stderr(string.format("ERROR: Selected max. frequency %s not available for CPU %d! Please select one of\n%s", max_freq, cpulist[i], table.concat(availfreqs, ", ")))
+        local err = likwid.setUncoreFreqMin(socket, min_u_freq*1000);
+        if err ~= 0 then
+            print_stderr(string.format("Setting of minimal Uncore frequency %f failed on socket %d\n", min_u_freq, socket))
             os.exit(1)
         end
-        local f = likwid.setCpuClockMax(cpulist[i], tonumber(max_freq)*1E6)
     end
 end
 
-if frequency then
-    for i=1,#cpulist do
-        
-        local valid_freq = false
-        for k,v in pairs(availfreqs) do
-            if (frequency == v) then
-                valid_freq = true
-                break
-            end
+if max_u_freq then
+    for s=1,#socklist do
+        socket = socklist[s]
+        if verbosity == 3 then
+            print_stdout(string.format("DEBUG: Set max. uncore frequency for socket %d to %d MHz", socket, max_u_freq*1000))
         end
-        if frequency == availturbo then
-            valid_freq = true
-        end
-        if not valid_freq then
-            print_stderr(string.format("ERROR: Selected frequency %s not available for CPU %d! Please select one of\n%s", frequency, cpulist[i], table.concat(availfreqs, ", ")))
+        local err = likwid.setUncoreFreqMax(socket, max_u_freq*1000);
+        if err ~= 0 then
+            print_stderr(string.format("Setting of maximal Uncore frequency %d failed on socket %d\n", max_u_freq, socket))
             os.exit(1)
         end
-        local f = likwid.setCpuClockCurrent(cpulist[i], tonumber(frequency)*1E6)
     end
 end
 
 if governor then
+    if verbosity == 3 then
+        print_stdout(string.format("DEBUG: Set governor %s", governor))
+    end
     local govs = likwid.getAvailGovs(cpulist[1])
     local cur_govs = {}
+    local cur_min = {}
+    local cur_max = {}
     for i,c in pairs(cpulist) do
-        table.insert(cur_govs, likwid.getGovernor(cpulist[1]))
+        cur_govs[i] = likwid.getGovernor(c)
+        cur_min[i] = likwid.getCpuClockMin(c)
+        cur_max[i] = likwid.getCpuClockMax(c)
     end
     
     local valid_gov = false
@@ -277,20 +433,18 @@ if governor then
         end
     end
     local cur_freqs = {}
-    if governor == "turbo" and availturbo ~= "0" then
-        valid_gov = true
-        governor = "performance"
-        for i=1,#cpulist do
-            cur_freqs[cpulist[i]] = availturbo
-        end
-    end
     if not valid_gov then
         print_stderr(string.format("ERROR: Governor %s not available! Please select one of\n%s", governor, table.concat(govs, ", ")))
         os.exit(1)
     end
     for i=1,#cpulist do
-        if governor ~= cur_govs[i] then
-            local f = likwid.setGovernor(cpulist[i], governor)
+        if verbosity == 3 then
+            print_stdout(string.format("DEBUG: Set governor for CPU %d to %s", cpulist[i], governor))
+        end
+        local f = likwid.setGovernor(cpulist[i], governor)
+        if do_reset then
+            likwid.setCpuClockMin(cpulist[i], cur_min[i])
+            likwid.setCpuClockMax(cpulist[i], cur_max[i])
         end
     end
 end
diff --git a/src/applications/likwid-topology.lua b/src/applications/likwid-topology.lua
index 65f6ba0..0af60e6 100644
--- a/src/applications/likwid-topology.lua
+++ b/src/applications/likwid-topology.lua
@@ -7,13 +7,13 @@
  *      Description:  A application to determine the thread and cache topology
  *                    on x86 processors.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -37,7 +37,7 @@ print_stdout = print
 print_stderr = function(...) for k,v in pairs({...}) do io.stderr:write(v .. "\n") end end
 
 function version()
-    io.stdout:write(string.format("likwid-topology --  Version %d.%d\n",likwid.version,likwid.release))
+    io.stdout:write(string.format("likwid-topology -- Version %d.%d.%d (commit: %s)",likwid.version,likwid.release,likwid.minor,likwid.commit))
 end
 
 function usage()
@@ -399,4 +399,5 @@ likwid.putAffinityInfo()
 likwid.putNumaInfo()
 likwid.putTopology()
 likwid.putConfiguration()
+likwid.unsetenv("LIKWID_NO_ACCESS")
 os.exit(0)
diff --git a/src/applications/likwid.lua b/src/applications/likwid.lua
index 92ad30a..78ffc07 100644
--- a/src/applications/likwid.lua
+++ b/src/applications/likwid.lua
@@ -5,13 +5,13 @@
  *
  *      Description:  Lua LIKWID interface library
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -39,6 +39,8 @@ likwid.groupfolder = "<LIKWIDGROUPPATH>"
 
 likwid.version = <VERSION>
 likwid.release = <RELEASE>
+likwid.minor = <MINOR>
+likwid.commit = "<GITCOMMIT>"
 likwid.pinlibpath = "<LIBLIKWIDPIN>"
 likwid.dline = string.rep("=",80)
 likwid.hline =  string.rep("-",80)
@@ -107,7 +109,9 @@ likwid.readTemp = likwid_readTemp
 likwid.memSweep = likwid_memSweep
 likwid.memSweepDomain = likwid_memSweepDomain
 likwid.pinProcess = likwid_pinProcess
+likwid.pinThread = likwid_pinThread
 likwid.setenv = likwid_setenv
+likwid.unsetenv = likwid_unsetenv
 likwid.getpid = likwid_getpid
 likwid.setVerbosity = likwid_setVerbosity
 likwid.access = likwid_access
@@ -117,6 +121,7 @@ likwid.killProgram = likwid_killProgram
 likwid.catchSignal = likwid_catchSignal
 likwid.getSignalState = likwid_getSignalState
 likwid.waitpid = likwid_waitpid
+likwid.sendSignal = likwid_sendSignal
 likwid.cpustr_to_cpulist = likwid_cpustr_to_cpulist
 likwid.nodestr_to_nodelist = likwid_nodestr_to_nodelist
 likwid.sockstr_to_socklist = likwid_sockstr_to_socklist
@@ -145,14 +150,18 @@ likwid.markerRegionCount = likwid_markerRegionCount
 likwid.markerRegionResult = likwid_markerRegionResult
 likwid.markerRegionMetric = likwid_markerRegionMetric
 likwid.getCpuClockCurrent = likwid_getCpuClockCurrent
-likwid.setCpuClockCurrent = likwid_setCpuClockCurrent
 likwid.getCpuClockMin = likwid_getCpuClockMin
 likwid.setCpuClockMin = likwid_setCpuClockMin
 likwid.getCpuClockMax = likwid_getCpuClockMax
 likwid.setCpuClockMax = likwid_setCpuClockMax
 likwid.getGovernor = likwid_getGovernor
 likwid.setGovernor = likwid_setGovernor
-likwid.getDriver = likwid_getDriver
+likwid.setTurbo = likwid_setTurbo
+likwid.getTurbo = likwid_getTurbo
+likwid.setUncoreFreqMin = likwid_setUncoreFreqMin
+likwid.getUncoreFreqMin = likwid_getUncoreFreqMin
+likwid.setUncoreFreqMax = likwid_setUncoreFreqMax
+likwid.getUncoreFreqMax = likwid_getUncoreFreqMax
 likwid.getuid = likwid_getuid
 likwid.geteuid = likwid_geteuid
 likwid.setuid = likwid_setuid
@@ -166,6 +175,13 @@ likwid.cpuFeatures = { [0]="HW_PREFETCHER", [1]="CL_PREFETCHER", [2]="DCU_PREFET
                         [12]="MONITOR", [13]="SPEEDSTEP_LOCK", [14]="CPUID_MAX_VAL", [15]="XD_BIT",
                         [16]="DYN_ACCEL", [17]="TURBO_MODE", [18]="TM2" }
 
+likwid.signals = { [1] = "SIGHUP", [2] = "SIGINT", [3] = "SIGQUIT", [4] = "SIGILL",
+                   [5] = "SIGTRAP", [6] = "SIGABRT", [7] = "SIGBUS", [8] = "SIGFPE",
+                   [9] = "SIGKILL", [10] = "SIGUSR1", [11] = "SIGSEGV", [12] = "SIGUSR2",
+                   [13] = "SIGPIPE", [14] = "SIGALRM", [15] = "SIGTERM", [16] = "SIGSTKFLT",
+                   [17] = "SIGCHLD", [18] = "SIGCONT", [19] = "SIGSTOP", [20] = "SIGTSTP",
+                   [21] = "SIGTTIN", [22] = "SIGTTOU"}
+
 infinity = math.huge
 
 
@@ -295,8 +311,8 @@ local function get_spaces(str, min_space, max_space)
     local front = 0
     if tonumber(str) == nil then
         back = math.ceil((max_space-str:len()) /2)
-    else
-        back = 0
+--    else
+--        back = 0
     end
     front = max_space - back - str:len()
     if (front < back) then
@@ -312,7 +328,7 @@ local function calculate_metric(formula, counters_to_values)
         if a:len() > b:len() then return true end
         return false
     end
-    local result = "Nan"
+    local result = "nan"
     local err = false
     local clist = {}
     for counter,value in pairs(counters_to_values) do
@@ -320,7 +336,11 @@ local function calculate_metric(formula, counters_to_values)
     end
     table.sort(clist, cmp)
     for _,counter in pairs(clist) do
-        formula = string.gsub(formula, tostring(counter), tostring(counters_to_values[counter]))
+        if tostring(counters_to_values[counter]) ~= "-nan" then
+            formula = string.gsub(formula, tostring(counter), tostring(counters_to_values[counter]))
+        else
+            formula = string.gsub(formula, tostring(counter), tostring(0))
+        end
     end
     for c in formula:gmatch"." do
         if c ~= "+" and c ~= "-" and  c ~= "*" and  c ~= "/" and c ~= "(" and c ~= ")" and c ~= "." and c:lower() ~= "e" then
@@ -443,6 +463,8 @@ local function stringsplit(astr, sSeparator, nMax, bRegexp)
     assert(sSeparator ~= '')
     assert(nMax == nil or nMax >= 1)
     if astr == nil then return {} end
+    astr = tostring(astr)
+    local astrlen = astr:len() or 0
     local aRecord = {}
 
     if astr:len() > 0 then
@@ -457,7 +479,7 @@ local function stringsplit(astr, sSeparator, nMax, bRegexp)
             nStart = nLast+1
             nFirst,nLast = astr:find(sSeparator, nStart, bPlain)
             nMax = nMax-1
-            end
+        end
         aRecord[nField] = astr:sub(nStart)
     end
 
@@ -651,7 +673,9 @@ likwid.parse_time = parse_time
 
 local function num2str(value)
     local tmp = "0"
-    if value ~= 0 then
+    if value ~= value then
+        return "nan"
+    elseif type(value) == "number" and value ~= 0 then
         if tostring(value):match("%.0$") or value == math.tointeger(value) then
             tmp = tostring(math.tointeger(value))
         elseif string.format("%.4f", value):len() < 12 and
@@ -660,6 +684,8 @@ local function num2str(value)
         else
             tmp = string.format("%e", value)
         end
+    elseif type(value) == "string" then
+        tmp = value
     end
     return tmp
 end
@@ -705,16 +731,23 @@ local function tableMinMaxAvgSum(inputtable, skip_cols, skip_lines)
     for j=skip_cols+1,nr_columns do
         for i=skip_lines+1, nr_lines do
             local res = tonumber(inputtable[j][i])
-            if res ~= nil then
-                minOfLine[i-skip_lines+1] = math.min(res, minOfLine[i-skip_lines+1])
-                maxOfLine[i-skip_lines+1] = math.max(res, maxOfLine[i-skip_lines+1])
-                sumOfLine[i-skip_lines+1] = sumOfLine[i-skip_lines+1] + res
+            if inputtable[j][i] ~= "nan" then
+                if res ~= nil then
+                    minOfLine[i-skip_lines+1] = math.min(res, minOfLine[i-skip_lines+1])
+                    maxOfLine[i-skip_lines+1] = math.max(res, maxOfLine[i-skip_lines+1])
+                    sumOfLine[i-skip_lines+1] = sumOfLine[i-skip_lines+1] + res
+                else
+                    minOfLine[i-skip_lines+1] = 0
+                    maxOfLine[i-skip_lines+1] = 0
+                    sumOfLine[i-skip_lines+1] = 0
+                end
+                avgOfLine[i-skip_lines+1] = sumOfLine[i-skip_lines+1]/(nr_columns-skip_cols)
             else
-                minOfLine[i-skip_lines+1] = 0
-                maxOfLine[i-skip_lines+1] = 0
-                sumOfLine[i-skip_lines+1] = 0
+                minOfLine[i-skip_lines+1] = 0/0
+                maxOfLine[i-skip_lines+1] = 0/0
+                sumOfLine[i-skip_lines+1] = 0/0
+                avgOfLine[i-skip_lines+1] = 0/0
             end
-            avgOfLine[i-skip_lines+1] = sumOfLine[i-skip_lines+1]/(nr_columns-skip_cols)
         end
     end
     for i=2,#minOfLine do
@@ -1154,14 +1187,12 @@ local function llikwid_getAvailFreq(cpu)
     local freq_str = likwid_getAvailFreq(cpu)
     local freqs = {}
     if not freq_str then
-        return freqs, 0
+        return freqs
     end
     for item in freq_str:gmatch("[%d%.]+") do
         table.insert(freqs, item)
     end
-    local turbo = freqs[1]
-    table.remove(freqs, 1)
-    return freqs, turbo
+    return freqs
 end
 
 likwid.getAvailFreq = llikwid_getAvailFreq
diff --git a/src/bitUtil.c b/src/bitUtil.c
index f4b7691..1460922 100644
--- a/src/bitUtil.c
+++ b/src/bitUtil.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Utility routines manipulating bit arrays.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/calculator.c b/src/calculator.c
deleted file mode 100644
index 2ca1126..0000000
--- a/src/calculator.c
+++ /dev/null
@@ -1,1093 +0,0 @@
-/*
- * =======================================================================================
- *
- *      Filename:  calculator.c
- *
- *      Description:  Infix calculator
- *
- *      Version:   4.2
- *      Released:  22.12.2016
- *
- *      Author:   Brandon Mills (bm), mills.brandont at gmail.com
- *      Project:  likwid
- *
- *      Copyright (C) Brandon Mills
- *
- *      Permission is hereby granted, free of charge, to any person obtaining a copy of this
- *      software and associated documentation files (the "Software"), to deal in the
- *      Softwarewithout restriction, including without limitation the rights to use, copy,
- *      modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
- *      and to permit persons to whom the Software is furnished to do so, subject to the
- *      following conditions:
- *
- *      The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
- *
- *      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- *      INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- *      PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *      HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- *      OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- *      SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * =======================================================================================
- */
-/*
- * =======================================================================================
- *
- *      Some changes done for the integration in LIKWID, see inline comments
- *
- *      Version:   4.2
- *      Released:  22.12.2016
- *
- *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
- *                Thomas Roehl (tr), thomas.roehl at gmail.com
- *      Project:  likwid
- *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
- *
- *      This program is free software: you can redistribute it and/or modify it under
- *      the terms of the GNU General Public License as published by the Free Software
- *      Foundation, either version 3 of the License, or (at your option) any later
- *      version.
- *
- *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- *      You should have received a copy of the GNU General Public License along with
- *      this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * =======================================================================================
- */
-
-/* #####   HEADER FILE INCLUDES   ######################################### */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h> // Temporary
-#include <getopt.h>
-#include <calculator_stack.h>
-
-/* #####   MACROS  -  LOCAL TO THIS SOURCE FILE   ######################### */
-
-#define bool char
-#define true 1
-#define false 0
-#define PI 3.141592653589793
-
-/* Added by Thomas Roehl (Thomas.Roehl at fau.de) to reduce reallocs by allocating a temporary
- * token for parsing as well as for transforming a number to a string.
- */
-#define MAXTOKENLENGTH 512
-#define MAXPRECISION 20
-#define DEFAULTPRECISION 5
-#define AUTOPRECISION -1
-#define FUNCTIONSEPARATOR "|"
-/* #####   VARIABLES  -  LOCAL TO THIS SOURCE FILE   ###################### */
-
-typedef enum
-{
-    addop,
-    multop,
-    expop,
-    lparen,
-    rparen,
-    digit,
-    value,
-    decimal,
-    space,
-    text,
-    function,
-    identifier,
-    argsep,
-    invalid
-} Symbol;
-
-struct Preferences
-{
-    struct Display
-    {
-        bool tokens;
-        bool postfix;
-    } display;
-    struct Mode
-    {
-        bool degrees;
-    } mode;
-    int precision;
-    int maxtokenlength;
-} prefs;
-
-typedef enum
-{
-    divZero,
-    overflow,
-    parenMismatch,
-    inputMissing,
-} Error;
-
-typedef char* token;
-
-typedef double number;
-
-/* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
-
-void raise(Error err)
-{
-    char* msg;
-    switch(err)
-    {
-        case divZero:
-            msg = "Divide by zero";
-            break;
-        case overflow:
-            msg = "Overflow";
-            break;
-        case parenMismatch:
-            msg = "Mismatched parentheses";
-            break;
-        case inputMissing:
-            msg = "Function input missing";
-            break;
-    }
-    //printf("\tError: %s\n", msg);
-}
-
-inline unsigned int
-toDigit(char ch)
-{
-    return ch - '0';
-}
-
-number buildNumber(token str)
-{
-    number result = 0;
-    /*while(*str && *str != '.')
-    {
-        result = result * 10 + toDigit(*str++);
-    }*/
-    result = strtod(str, NULL);
-    return result;
-}
-
-token num2Str(number num)
-{
-    int len = 0;
-    int precision = MAXPRECISION;
-    if (prefs.precision >= 0 && prefs.precision < precision)
-        precision = prefs.precision;
-    token str = (token)malloc(prefs.maxtokenlength*sizeof(char));
-    len = snprintf(str, prefs.maxtokenlength-1, "%.*f", precision, num);
-    if (prefs.precision == AUTOPRECISION)
-    {
-        while (str[len-1] == '0')
-        {
-            len = snprintf(str, prefs.maxtokenlength-1, "%.*f", --precision, num);
-        }
-    }
-
-    return str;
-}
-
-number
-toRadians(number degrees)
-{
-    return degrees * PI / 180.0;
-}
-
-number
-toDegrees(number radians)
-{
-    return radians * 180.0 / PI;
-}
-
-token doFunc(Stack *s, token function)
-{
-    if (stackSize(s) == 0)
-    {
-        raise(inputMissing);
-        return "NaN";
-    }
-    else if (stackSize(s) == 1 && strcmp(stackTop(s), FUNCTIONSEPARATOR) == 0)
-    {
-        stackPop(s);
-        raise(inputMissing);
-        return "NaN";
-    }
-    token input = (token)stackPop(s);
-    number num = buildNumber(input);
-    number result = num;
-    number counter = 0;
-
-    if(strncmp(function, "abs", 3) == 0)
-        result = fabs(num);
-    else if(strncmp(function, "floor", 5) == 0)
-        result = floor(num);
-    else if(strncmp(function, "ceil", 4) == 0)
-        result = ceil(num);
-    else if(strncmp(function, "sin", 3) == 0)
-        result = !prefs.mode.degrees ? sin(num) : sin(toRadians(num));
-    else if(strncmp(function, "cos", 3) == 0)
-        result = !prefs.mode.degrees ? cos(num) : cos(toRadians(num));
-    else if(strncmp(function, "tan", 3) == 0)
-        result = !prefs.mode.degrees ? tan(num) : tan(toRadians(num));
-    else if(strncmp(function, "arcsin", 6) == 0
-         || strncmp(function, "asin", 4) == 0)
-        result = !prefs.mode.degrees ? asin(num) : toDegrees(asin(num));
-    else if(strncmp(function, "arccos", 6) == 0
-         || strncmp(function, "acos", 4) == 0)
-        result = !prefs.mode.degrees ? acos(num) : toDegrees(acos(num));
-    else if(strncmp(function, "arctan", 6) == 0
-         || strncmp(function, "atan", 4) == 0)
-        result = !prefs.mode.degrees ? atan(num) : toDegrees(atan(num));
-    else if(strncmp(function, "sqrt", 4) == 0)
-        result = sqrt(num);
-    else if(strncmp(function, "cbrt", 4) == 0)
-        result = cbrt(num);
-    else if(strncmp(function, "log", 3) == 0)
-        result = log(num);
-    else if(strncmp(function, "exp", 3) == 0)
-        result = exp(num);
-    else if(strncmp(function, "min", 3) == 0)
-    {
-        while (stackSize(s) > 0 && strcmp(stackTop(s), FUNCTIONSEPARATOR) != 0)
-        {
-            input = (token)stackPop(s);
-            num = buildNumber(input);
-            if (num < result)
-                result = num;
-        }
-    }
-    else if(strncmp(function, "max", 3) == 0)
-    {
-        while (stackSize(s) > 0 && strcmp(stackTop(s), FUNCTIONSEPARATOR) != 0)
-        {
-            input = (token)stackPop(s);
-            num = buildNumber(input);
-            if (num > result)
-                result = num;
-        }
-    }
-    else if(strncmp(function, "sum", 3) == 0)
-    {
-        while (stackSize(s) > 0  && strcmp(stackTop(s), FUNCTIONSEPARATOR) != 0)
-        {
-            input = (token)stackPop(s);
-            num = buildNumber(input);
-            result += num;
-        }
-    }
-    else if(strncmp(function, "avg", 3) == 0 ||
-            strncmp(function, "mean", 4) == 0)
-    {
-        // Result already initialized with first number
-        counter = 1;
-        while (stackSize(s) > 0  && strcmp(stackTop(s), FUNCTIONSEPARATOR) != 0)
-        {
-            input = (token)stackPop(s);
-            num = buildNumber(input);
-            result += num;
-            counter++;
-        }
-        result /= counter;
-    }
-    else if(strncmp(function, "median", 6) == 0)
-    {
-        // needed for sorting
-        Stack tmp, safe;
-        // Result already initialized with first number
-        counter = 1;
-        stackInit(&tmp, (stackSize(s) > 0 ? stackSize(s) : 1));
-        stackInit(&safe, (stackSize(s) > 0 ? stackSize(s) : 1));
-        // add first value to the later sorted stack
-        stackPush(&tmp, input);
-        while (stackSize(s) > 0  && strcmp(stackTop(s), FUNCTIONSEPARATOR) != 0)
-        {
-            input = (token)stackPop(s);
-            num = buildNumber(input);
-            // save all numbers larger as the stack value
-            while (stackSize(&tmp) > 0 && buildNumber(stackTop(&tmp)) < num)
-            {
-                stackPush(&safe, stackPop(&tmp));
-            }
-            // push value on the sorted stack
-            stackPush(&tmp, input);
-            // push all saved numbers back on the sorted stack
-            while (stackSize(&safe) > 0)
-            {
-                stackPush(&tmp, stackPop(&safe));
-            }
-            counter++;
-        }
-        stackFree(&safe);
-        // calculate the median index
-        counter = (number)(((int)counter+1)/2);
-        // pop all numbers until median index
-        while (counter > 1)
-        {
-            stackPop(&tmp);
-            counter--;
-        }
-        result = buildNumber(stackPop(&tmp));
-        // pop the remaining sorted stack
-        while (stackSize(&tmp) > 0)
-        {
-            stackPop(&tmp);
-        }
-        stackFree(&tmp);
-    }
-    else if(strncmp(function, "var", 3) == 0)
-    {
-        Stack tmp;
-        counter = 1;
-        // second stack to store values during calculation of mean
-        stackInit(&tmp, (stackSize(s) > 0 ? stackSize(s) : 1));
-        // push first value to temporary stack
-        stackPush(&tmp, input);
-        number mean = result;
-        while (stackSize(s) > 0  && strcmp(stackTop(s), FUNCTIONSEPARATOR) != 0)
-        {
-            input = (token)stackPop(s);
-            // push value to temporary stack
-            stackPush(&tmp, input);
-            num = buildNumber(input);
-            mean += num;
-            counter++;
-        }
-        // calculate mean
-        mean /= counter;
-        result = 0;
-        // calculate sum of squared differences
-        while (stackSize(&tmp) > 0)
-        {
-            input = (token)stackPop(&tmp);
-            num = buildNumber(input)-mean;
-            result += pow(num,2);
-        }
-        // determine variance
-        result /= counter;
-        stackFree(&tmp);
-    }
-    if (strcmp(stackTop(s), FUNCTIONSEPARATOR) == 0)
-        stackPop(s);
-    stackPush(s, num2Str(result));
-    return 0;
-}
-
-int doOp(Stack *s, token op)
-{
-    token roperand = (token)stackPop(s);
-    token loperand = (token)stackPop(s);
-    number lside = buildNumber(loperand);
-    number rside = buildNumber(roperand);
-    number ret;
-    switch(*op)
-    {
-        case '^':
-            {
-                ret = pow(lside, rside);
-            }
-            break;
-        case '*':
-            {
-                ret = lside * rside;
-            }
-            break;
-        case '/':
-            {
-                if(rside == 0)
-                {
-                    raise(divZero);
-                    return -1;
-                }
-                else
-                    ret = lside / rside;
-            }
-            break;
-        case '%':
-            {
-                if(rside == 0)
-                {
-                    raise(divZero);
-                    return -1;
-                }
-                else
-                {
-                    ret = (int)(lside / rside);
-                    ret = lside - (ret * rside);
-                }
-            }
-            break;
-        case '+':
-            {
-                ret = lside + rside;
-            }
-            break;
-        case '-':
-            {
-                ret = lside - rside;
-            }
-            break;
-    }
-    stackPush(s, num2Str(ret));
-    return 0;
-}
-
-Symbol type(char ch)
-{
-    Symbol result;
-    switch(ch)
-    {
-        case '+':
-        case '-':
-            result = addop;
-            break;
-        case '*':
-        case '/':
-        case '%':
-            result = multop;
-            break;
-        case '^':
-            result = expop;
-            break;
-        case '(':
-            result = lparen;
-            break;
-        case ')':
-            result = rparen;
-            break;
-        case '.':
-            result = decimal;
-            break;
-        case ' ':
-            result = space;
-            break;
-        case ',':
-            result = argsep;
-            break;
-        case '0':
-        case '1':
-        case '2':
-        case '3':
-        case '4':
-        case '5':
-        case '6':
-        case '7':
-        case '8':
-        case '9':
-            result = digit;
-            break;
-        case 'A':
-        case 'B':
-        case 'C':
-        case 'D':
-        case 'E':
-        case 'F':
-        case 'G':
-        case 'H':
-        case 'I':
-        case 'J':
-        case 'K':
-        case 'L':
-        case 'M':
-        case 'N':
-        case 'O':
-        case 'P':
-        case 'Q':
-        case 'R':
-        case 'S':
-        case 'T':
-        case 'U':
-        case 'V':
-        case 'W':
-        case 'X':
-        case 'Y':
-        case 'Z':
-        case 'a':
-        case 'b':
-        case 'c':
-        case 'd':
-        case 'e':
-        case 'f':
-        case 'g':
-        case 'h':
-        case 'i':
-        case 'j':
-        case 'k':
-        case 'l':
-        case 'm':
-        case 'n':
-        case 'o':
-        case 'p':
-        case 'q':
-        case 'r':
-        case 's':
-        case 't':
-        case 'u':
-        case 'v':
-        case 'w':
-        case 'x':
-        case 'y':
-        case 'z':
-            result = text;
-            break;
-        default:
-            result = invalid;
-            break;
-    }
-    return result;
-}
-
-bool isFunction(token tk)
-{
-    return (strncmp(tk, "abs", 3) == 0
-        || strncmp(tk, "floor", 5) == 0
-        || strncmp(tk, "ceil", 4) == 0
-        || strncmp(tk, "sin", 3) == 0
-        || strncmp(tk, "cos", 3) == 0
-        || strncmp(tk, "tan", 3) == 0
-        || strncmp(tk, "arcsin", 6) == 0
-        || strncmp(tk, "arccos", 6) == 0
-        || strncmp(tk, "arctan", 6) == 0
-        || strncmp(tk, "asin", 4) == 0
-        || strncmp(tk, "acos", 4) == 0
-        || strncmp(tk, "atan", 4) == 0
-        || strncmp(tk, "sqrt", 4) == 0
-        || strncmp(tk, "cbrt", 4) == 0
-        || strncmp(tk, "log", 3) == 0
-        || strncmp(tk, "min", 3) == 0
-        || strncmp(tk, "max", 3) == 0
-        || strncmp(tk, "sum", 3) == 0
-        || strncmp(tk, "avg", 3) == 0
-        || strncmp(tk, "mean", 4) == 0
-        || strncmp(tk, "median", 6) == 0
-        || strncmp(tk, "var", 3) == 0
-        || strncmp(tk, "exp", 3) == 0);
-}
-
-Symbol tokenType(token tk)
-{
-    if (!tk)
-        return invalid;
-    Symbol ret = type(*tk);
-    switch(ret)
-    {
-        case text:
-            if(isFunction(tk))
-                ret = function;
-            else
-                ret = identifier;
-            break;
-        case addop:
-            if(*tk == '-' && strlen(tk) > 1)
-                ret = tokenType(tk+1);
-            break;
-        case decimal:
-        case digit:
-            ret = value;
-            break;
-        default:
-            break;
-    }
-    return ret;
-}
-
-int tokenize(char *str, char *(**tokensRef))
-{
-    int i = 0;
-    char** tokens = NULL;
-    char** tmp = NULL;
-    char* ptr = str;
-    char ch = '\0';
-    int numTokens = 0;
-    char* tmpToken = malloc((prefs.maxtokenlength+1) * sizeof(char));
-    if (!tmpToken)
-    {
-        fprintf(stderr, "Malloc of temporary buffer failed\n");
-        return 0;
-    }
-    while((ch = *ptr++))
-    {
-        if(type(ch) == invalid) // Stop tokenizing when we encounter an invalid character
-            break;
-
-        token newToken = NULL;
-        tmpToken[0] = '\0';
-        switch(type(ch))
-        {
-            case addop:
-                {
-                    // Check if this is a negative
-                    if(ch == '-'
-                        && (numTokens == 0
-                            || (tokenType(tokens[numTokens-1]) == addop
-                                || tokenType(tokens[numTokens-1]) == multop
-                                || tokenType(tokens[numTokens-1]) == expop
-                                || tokenType(tokens[numTokens-1]) == lparen
-                                || tokenType(tokens[numTokens-1]) == argsep)))
-                    {
-                        // Assemble an n-character (plus null-terminator) number token
-                        {
-                            int len = 1;
-                            bool hasDecimal = false;
-                            bool hasExponent = false;
-
-                            if(type(ch) == decimal) // Allow numbers to start with decimal
-                            {
-                                //printf("Decimal\n");
-                                hasDecimal = true;
-                                len++;
-                                tmpToken[0] = '0';
-                                tmpToken[1] = '.';
-                            }
-                            else // Numbers that do not start with decimal
-                            {
-                                tmpToken[len-1] = ch;
-                            }
-
-                            // Assemble rest of number
-                            for(; // Don't change len
-                                *ptr // There is a next character and it is not null
-                                && len <= prefs.maxtokenlength
-                                && (type(*ptr) == digit // The next character is a digit
-                                     || ((type(*ptr) == decimal // Or the next character is a decimal
-                                         && hasDecimal == 0)) // But we have not added a decimal
-                                     || ((*ptr == 'E' || *ptr == 'e') // Or the next character is an exponent
-                                         && hasExponent == false) // But we have not added an exponent yet
-                                || ((*ptr == '+' || *ptr == '-') && hasExponent == true)); // Exponent with sign
-                                ++len)
-                            {
-                                if(type(*ptr) == decimal)
-                                    hasDecimal = true;
-                                else if(*ptr == 'E' || *ptr == 'e')
-                                    hasExponent = true;
-                                tmpToken[len] = *ptr++;
-                            }
-
-                            // Append null-terminator
-                            tmpToken[len] = '\0';
-                        }
-                        break;
-                    }
-                    // If it's not part of a number, it's an op - fall through
-                }
-            case multop:
-            case expop:
-            case lparen:
-            case rparen:
-            case argsep:
-                // Assemble a single-character (plus null-terminator) operation token
-                {
-                    tmpToken[0] = ch;
-                    tmpToken[1] = '\0';
-                }
-                break;
-            case digit:
-            case decimal:
-                // Assemble an n-character (plus null-terminator) number token
-                {
-                    int len = 1;
-                    bool hasDecimal = false;
-                    bool hasExponent = false;
-
-                    if(type(ch) == decimal) // Allow numbers to start with decimal
-                    {
-                        //printf("Decimal\n");
-                        hasDecimal = true;
-                        len++;
-                        tmpToken[0] = '0';
-                        tmpToken[1] = '.';
-                    }
-                    else // Numbers that do not start with decimal
-                    {
-                        tmpToken[len-1] = ch;
-                    }
-
-                    // Assemble rest of number
-                    for(; // Don't change len
-                        *ptr // There is a next character and it is not null
-                        && len <= prefs.maxtokenlength
-                        && (type(*ptr) == digit // The next character is a digit
-                             || ((type(*ptr) == decimal // Or the next character is a decimal
-                                 && hasDecimal == 0)) // But we have not added a decimal
-                             || ((*ptr == 'E' || *ptr == 'e') // Or the next character is an exponent
-                                 && hasExponent == false) // But we have not added an exponent yet
-                             || ((*ptr == '+' || *ptr == '-') && hasExponent == true)); // Exponent with sign
-                        ++len)
-                    {
-                        if(type(*ptr) == decimal)
-                            hasDecimal = true;
-                        else if(*ptr == 'E' || *ptr == 'e')
-                            hasExponent = true;
-                        tmpToken[len] = *ptr++;
-                    }
-
-                    // Append null-terminator
-                    tmpToken[len] = '\0';
-                }
-                break;
-            case text:
-                // Assemble an n-character (plus null-terminator) text token
-                {
-                    int len = 1;
-                    tmpToken[0] = ch;
-                    for(len = 1; *ptr && type(*ptr) == text && len <= prefs.maxtokenlength; ++len)
-                    {
-                        tmpToken[len] = *ptr++;
-                    }
-                    tmpToken[len] = '\0';
-                }
-                break;
-            default:
-                break;
-        }
-        // Add to list of tokens
-        if(tmpToken[0] != '\0' && strlen(tmpToken) > 0)
-        {
-            numTokens++;
-            /*if(tokens == NULL) // First allocation
-                tokens = (char**)malloc(numTokens * sizeof(char*));
-            else*/
-
-            newToken = malloc((strlen(tmpToken)+1) * sizeof(char));
-            if (!newToken)
-            {
-                numTokens--;
-                break;
-            }
-            strcpy(newToken, tmpToken);
-            newToken[strlen(tmpToken)] = '\0';
-            tmp = (char**)realloc(tokens, numTokens * sizeof(char*));
-            if (tmp == NULL)
-            {
-                free(newToken);
-                if (tokens != NULL)
-                {
-                    for(i=0;i<numTokens-1;i++)
-                    {
-                        if (tokens[i] != NULL)
-                            free(tokens[i]);
-                    }
-                    free(tokens);
-                }
-                *tokensRef = NULL;
-                free(newToken);
-                free(tmpToken);
-                return 0;
-            }
-            tokens = tmp;
-            tmp = NULL;
-            tokens[numTokens - 1] = newToken;
-        }
-    }
-    *tokensRef = tokens; // Send back out
-    free(tmpToken);
-    tmpToken = NULL;
-    return numTokens;
-}
-
-bool leftAssoc(token op)
-{
-    bool ret = false;
-    switch(tokenType(op))
-    {
-        case addop:
-        case multop:
-
-            ret = true;
-            break;
-        case function:
-        case expop:
-            ret = false;
-            break;
-        default:
-            break;
-    }
-    return ret;
-}
-
-int precedence(token op1, token op2)
-{
-    int ret = 0;
-
-    if (op2 == NULL)
-        ret = 1;
-    else if(tokenType(op1) == tokenType(op2)) // Equal precedence
-        ret = 0;
-    else if(tokenType(op1) == addop
-            && (tokenType(op2) == multop || tokenType(op2) == expop)) // op1 has lower precedence
-        ret = -1;
-    else if(tokenType(op2) == addop
-            && (tokenType(op1) == multop || tokenType(op1) == expop)) // op1 has higher precedence
-        ret = 1;
-    else if(tokenType(op1) == multop
-            && tokenType(op2) == expop) // op1 has lower precedence
-        ret = -1;
-    else if(tokenType(op1) == expop
-            && tokenType(op2) == multop) // op1 has higher precedence
-        ret = 1;
-    else if (tokenType(op1) == function
-            && (tokenType(op2) == addop || tokenType(op2) == multop || tokenType(op2) == expop || tokenType(op2) == lparen))
-        ret = 1;
-    else if ((tokenType(op1) == addop || tokenType(op1) == multop || tokenType(op1) == expop)
-            && tokenType(op2) == function)
-        ret = -1;
-    return ret;
-}
-
-void evalStackPush(Stack *s, token val)
-{
-    if(prefs.display.postfix)
-        printf("\t%s\n", val);
-
-    switch(tokenType(val))
-    {
-        case function:
-            {
-                //token res;
-                //operand = (token)stackPop(s);
-                if (doFunc(s, val) < 0)
-                    return;
-                //stackPush(s, res);
-            }
-            break;
-        case expop:
-        case multop:
-        case addop:
-            {
-                if(stackSize(s) >= 2)
-                {
-                    // Pop two operands
-
-                    // Evaluate
-                    if (doOp(s, val) < 0)
-                        return;
-
-                    // Push result
-                    //stackPush(s, res);
-                }
-                else
-                {
-                    stackPush(s, val);
-                }
-            }
-            break;
-        case value:
-            {
-                stackPush(s, val);
-            }
-            break;
-        default:
-            break;
-    }
-}
-
-bool postfix(token *tokens, int numTokens, Stack *output)
-{
-    Stack operators, intermediate;
-    int i;
-    bool err = false;
-    stackInit(&operators, numTokens);
-    stackInit(&intermediate, numTokens);
-    for(i = 0; i < numTokens; i++)
-    {
-        // From Wikipedia/Shunting-yard_algorithm:
-        switch(tokenType(tokens[i]))
-        {
-            case value:
-                {
-                    // If the token is a number, then add it to the output queue.
-                    //printf("Adding number %s to output stack\n", tokens[i]);
-                    evalStackPush(output, tokens[i]);
-                }
-                break;
-            case function:
-                {
-                    while(stackSize(&operators) > 0
-                        && (tokenType(tokens[i]) != lparen)
-                        && ((precedence(tokens[i], (char*)stackTop(&operators)) <= 0)))
-                    {
-                        //printf("Moving operator %s from operator stack to output stack\n", (char*)stackTop(&operators));
-                        evalStackPush(output, stackPop(&operators));
-                        stackPush(&intermediate, stackTop(output));
-                    }
-
-                    // If the token is a function token, then push it onto the stack.
-                    //printf("Adding operator %s to operator stack\n", tokens[i]);
-                    stackPush(&operators, tokens[i]);
-                }
-                break;
-            case argsep:
-                {
-                    /*
-                     * If the token is a function argument separator (e.g., a comma):
-                     *     Until the token at the top of the stack is a left
-                     *     paren, pop operators off the stack onto the output
-                     *     queue. If no left paren encountered, either separator
-                     *     was misplaced or parens mismatched.
-                     */
-                    while(stackSize(&operators) > 0
-                        && tokenType((token)stackTop(&operators)) != lparen
-                        && stackSize(&operators) > 1)
-                    {
-                        //printf("Moving operator from operator stack to output stack\n");
-                        evalStackPush(output, stackPop(&operators));
-                        stackPush(&intermediate, stackTop(output));
-                    }
-                }
-                break;
-            case addop:
-            case multop:
-            case expop:
-                {
-                    /*
-                     * If the token is an operator, op1, then:
-                     *     while there is an operator token, op2, at the top of the stack, and
-                     *             either op1 is left-associative and its precedence is less than or equal to that of op2,
-                     *             or op1 is right-associative and its precedence is less than that of op2,
-                     *         pop op2 off the stack, onto the output queue
-                     *     push op1 onto the stack
-                     */
-                    while(stackSize(&operators) > 0
-                        && (tokenType((char*)stackTop(&operators)) == addop || tokenType((char*)stackTop(&operators)) == multop || tokenType((char*)stackTop(&operators)) == expop)
-                        && ((leftAssoc(tokens[i]) && precedence(tokens[i], (char*)stackTop(&operators)) <= 0)
-                            || (!leftAssoc(tokens[i]) && precedence(tokens[i], (char*)stackTop(&operators)) < 0)))
-                    {
-                        //printf("Moving operator %s from operator stack to output stack\n", (char*)stackTop(&operators));
-                        evalStackPush(output, stackPop(&operators));
-                        stackPush(&intermediate, stackTop(output));
-                    }
-                    //printf("Adding operator %s to operator stack\n", tokens[i]);
-                    stackPush(&operators, tokens[i]);
-                }
-                break;
-            case lparen:
-                {
-                    // If the token is a left paren, then push it onto the stack
-                    //printf("Adding left paren to operator stack\n");
-                    if (tokenType(stackTop(&operators)) == function)
-                        stackPush(output, FUNCTIONSEPARATOR);
-                    stackPush(&operators, tokens[i]);
-                }
-                break;
-            case rparen:
-                {
-                    /*
-                     * If the token is a right paren:
-                     *     Until the token at the top of the stack is a left paren, pop operators off the stack onto the output queue
-                     *     Pop the left paren from the stack, but not onto the output queue
-                     *     If the stack runs out without finding a left paren, then there are mismatched parens
-                     */
-                    while(stackSize(&operators) > 0
-                        && tokenType((token)stackTop(&operators)) != lparen
-                        && stackSize(&operators) > 1)
-                    {
-                        //printf("Moving operator %s from operator stack to output stack\n", (char*)stackTop(&operators));
-                        evalStackPush(output, stackPop(&operators));
-                        stackPush(&intermediate, stackTop(output));
-                    }
-                    if(stackSize(&operators) > 0
-                        && tokenType((token)stackTop(&operators)) != lparen)
-                    {
-                        err = true;
-                        raise(parenMismatch);
-                    }
-                    //printf("Removing left paren from operator stack\n");
-                    stackPop(&operators); // Discard lparen
-                    while (stackSize(&operators) > 0 && tokenType((token)stackTop(&operators)) == function)
-                    {
-                        //printf("Removing function from operator stack to output stack\n");
-                        evalStackPush(output, stackPop(&operators));
-                        stackPush(&intermediate, stackTop(output));
-                    }
-                }
-                break;
-            default:
-                break;
-        }
-    }
-    /*
-     * When there are no more tokens to read:
-     *     While there are still operator tokens on the stack:
-     *         If the operator token on the top of the stack is a paren, then there are mismatched parens
-     *         Pop the operator onto the output queue
-     */
-    while(stackSize(&operators) > 0)
-    {
-        if(tokenType((token)stackTop(&operators)) == lparen)
-        {
-            raise(parenMismatch);
-            err = true;
-        }
-        //printf("Moving operator from operator stack to output stack\n");
-        evalStackPush(output, stackPop(&operators));
-        stackPush(&intermediate, stackTop(output));
-    }
-    // pop result from intermediate stack
-    stackPop(&intermediate);
-    // free remaining intermediate results
-    while (stackSize(&intermediate) > 0)
-    {
-        stackPop(&intermediate);
-    }
-    if (err == true)
-    {
-        while (stackSize(&operators) > 0)
-        {
-            token s = stackPop(&operators);
-            //printf("Freeing %s from operators stack\n", s);
-            free(s);
-        }
-    }
-    stackFree(&intermediate);
-    stackFree(&operators);
-    return err;
-}
-/* Added by Thomas Roehl (Thomas.Roehl at fau.de) as interface for LIKWID */
-int
-calculate_infix(char* finfix, double *result)
-{
-    int i;
-    int ret = 0;
-    *result = 0;
-    token* tokens = NULL;
-    Stack expr;
-    prefs.maxtokenlength = MAXTOKENLENGTH;
-    prefs.precision = MAXPRECISION;
-    int numTokens = tokenize(finfix, &tokens);
-    stackInit(&expr, numTokens);
-    ret = postfix(tokens, numTokens, &expr);
-    if ((stackSize(&expr) != 1) || (ret == true))
-    {
-        *result = NAN;
-        goto calcerror;
-    }
-    else
-    {
-        for (i=0; i< numTokens; i++)
-        {
-            if (tokens[i] == stackTop(&expr))
-                tokens[i] = NULL;
-        }
-        *result = strtod((char*)stackTop(&expr), NULL);
-    }
-    ret = 0;
-calcerror:
-    for (i=0;i<numTokens;i++)
-    {
-        if (tokens[i])
-        {
-            free(tokens[i]);
-        }
-    }
-    if (tokens)
-    {
-        free(tokens);
-        tokens = NULL;
-        numTokens = 0;
-    }
-    stackFree(&expr);
-    return ret;
-}
-
diff --git a/src/calculator_stack.c b/src/calculator_stack.c
deleted file mode 100644
index f8f35ca..0000000
--- a/src/calculator_stack.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * =======================================================================================
- *
- *      Filename:  calculator_stack.c
- *
- *      Description:  Stack implementation for infix calculator
- *
- *      Version:   <VERSION>
- *      Released:  <DATE>
- *
- *      Author:   Brandon Mills (bm), mills.brandont at gmail.com
- *      Project:  likwid
- *
- *      Copyright (C) Brandon Mills
- *
- *      Permission is hereby granted, free of charge, to any person obtaining a copy of this
- *      software and associated documentation files (the "Software"), to deal in the
- *      Softwarewithout restriction, including without limitation the rights to use, copy,
- *      modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
- *      and to permit persons to whom the Software is furnished to do so, subject to the
- *      following conditions:
- *
- *      The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
- *
- *      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- *      INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- *      PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *      HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- *      OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- *      SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * =======================================================================================
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <calculator_stack.h>
-
-void stackInit(Stack *s, int size)
-{
-    s->content = malloc(size * sizeof(void*));
-    s->size = size;
-    s->top = -1;
-}
-
-void stackPush(Stack *s, void* val)
-{
-    (s->top)++;
-    s->content[s->top] = val;
-}
-
-void* stackTop(Stack *s)
-{
-    void *ret = NULL;
-    if(s->top >= 0 && s->content != NULL)
-        ret = s->content[s->top];
-    return ret;
-}
-
-void* stackPop(Stack *s)
-{
-    void *ret = NULL;
-    if(s->top >= 0 && s->content != NULL)
-        ret = s->content[(s->top)--];
-    return ret;
-}
-
-int stackSize(Stack *s)
-{
-    return s->top + 1;
-}
-
-void stackFree(Stack *s)
-{
-    if (s->content)
-        free(s->content);
-    s->content = NULL;
-    s->size = 0;
-    s->top = -1;
-}
-
diff --git a/src/configuration.c b/src/configuration.c
index 382bc3a..f174259 100644
--- a/src/configuration.c
+++ b/src/configuration.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Configuration file module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -43,7 +43,7 @@
 
 /* #####   EXPORTED VARIABLES   ########################################### */
 
-Configuration config = {NULL,NULL,NULL,NULL,-1,MAX_NUM_THREADS,MAX_NUM_NODES};
+Likwid_Configuration config = {NULL,NULL,NULL,NULL,-1,MAX_NUM_THREADS,MAX_NUM_NODES};
 int init_config = 0;
 
 /* #####   VARIABLES  -  LOCAL TO THIS SOURCE FILE   ###################### */
@@ -299,22 +299,29 @@ destroy_configuration(void)
     if (config.configFileName != NULL)
     {
         free(config.configFileName);
+        config.configFileName = NULL;
     }
     if (config.groupPath != NULL)
     {
         free(config.groupPath);
+        config.groupPath = NULL;
     }
     if (config.topologyCfgFileName != NULL)
     {
         free(config.topologyCfgFileName);
+        config.topologyCfgFileName = NULL;
     }
     if (config.daemonMode != ACCESSMODE_DIRECT)
     {
         if (config.daemonPath != NULL)
         {
             free(config.daemonPath);
+            config.daemonPath = NULL;
         }
     }
+    config.daemonMode = -1;
+    config.maxNumThreads = MAX_NUM_THREADS;
+    config.maxNumNodes = MAX_NUM_NODES;
     init_config = 0;
     return 0;
 }
diff --git a/src/cpuFeatures.c b/src/cpuFeatures.c
index 27e10ba..cd4e8d3 100644
--- a/src/cpuFeatures.c
+++ b/src/cpuFeatures.c
@@ -9,13 +9,13 @@
  *                  Allows to turn on and off the Hardware prefetcher
  *                  available.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -47,7 +47,7 @@
 
 /* #####   EXPORTED VARIABLES   ########################################### */
 
-static uint64_t cpuFeatureMask[MAX_NUM_THREADS] = {0x0ULL};
+static uint64_t *cpuFeatureMask = NULL;
 static int features_initialized = 0;
 
 /* #####   MACROS  -  LOCAL TO THIS SOURCE FILE   ######################### */
@@ -161,6 +161,7 @@ cpuFeatures_update(int cpu)
              (cpuid_info.model == BROADWELL_E) ||
              (cpuid_info.model == SKYLAKE1) ||
              (cpuid_info.model == SKYLAKE2) ||
+             (cpuid_info.model == SKYLAKEX) ||
              (cpuid_info.model == KABYLAKE1) ||
              (cpuid_info.model == KABYLAKE2))
     {
@@ -188,6 +189,7 @@ cpuFeatures_update(int cpu)
             (cpuid_info.model == BROADWELL_E) ||
             (cpuid_info.model == SKYLAKE1) ||
             (cpuid_info.model == SKYLAKE2) ||
+            (cpuid_info.model == SKYLAKEX) ||
             (cpuid_info.model == KABYLAKE1) ||
             (cpuid_info.model == KABYLAKE2) ||
             (cpuid_info.model == ATOM_SILVERMONT_GOLD))
@@ -204,6 +206,19 @@ cpuFeatures_update(int cpu)
         TEST_FLAG_INV(FEAT_CL_PREFETCHER,1);
         TEST_FLAG_INV(FEAT_HW_PREFETCHER,0);
     }
+
+    if (cpuid_info.model == XEON_PHI_KNL)
+    {
+        ret = HPMread(cpu, MSR_DEV, MSR_PREFETCH_ENABLE, &flags);
+        if (ret != 0)
+        {
+            fprintf(stderr,
+                    "Cannot read register 0x%X on cpu %d: err %d\n",
+                    MSR_PREFETCH_ENABLE, cpu, ret);
+        }
+        TEST_FLAG_INV(FEAT_DCU_PREFETCHER,0);
+        TEST_FLAG_INV(FEAT_HW_PREFETCHER,1);
+    }
 }
 
 static char*
@@ -229,6 +244,9 @@ cpuFeatureNames[CPUFEATURES_MAX] = {
     [FEAT_SPEEDSTEP_LOCK] = "Enhanced Intel SpeedStep Technology Select Lock",
 };
 
+static char*
+cpuFeatureNamesFixed[CPUFEATURES_MAX] = {};
+
 /* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
 
 void
@@ -240,6 +258,12 @@ cpuFeatures_init()
     }
 
     topology_init();
+    if (!cpuFeatureMask)
+    {
+        cpuFeatureMask = malloc(cpuid_topology.numHWThreads*sizeof(uint64_t));
+        memset(cpuFeatureMask, 0, cpuid_topology.numHWThreads*sizeof(uint64_t));
+    }
+
     if (!HPMinitialized())
     {
         HPMinit();
@@ -301,6 +325,7 @@ cpuFeatures_enable(int cpu, CpuFeature type, int print)
     uint64_t flags;
     uint32_t reg = MSR_IA32_MISC_ENABLE;
     int newOffsets = 0;
+    int knlOffsets = 0;
     if (IF_FLAG(type))
     {
         return 0;
@@ -326,6 +351,7 @@ cpuFeatures_enable(int cpu, CpuFeature type, int print)
             (cpuid_info.model == BROADWELL_E) ||
             (cpuid_info.model == SKYLAKE1) ||
             (cpuid_info.model == SKYLAKE2) ||
+            (cpuid_info.model == SKYLAKEX) ||
             (cpuid_info.model == KABYLAKE1) ||
             (cpuid_info.model == KABYLAKE2) ||
             (cpuid_info.model == ATOM_SILVERMONT_GOLD))
@@ -333,6 +359,17 @@ cpuFeatures_enable(int cpu, CpuFeature type, int print)
         reg = MSR_PREFETCH_ENABLE;
         newOffsets = 1;
     }
+    if (cpuid_info.model == XEON_PHI_KNL)
+    {
+        reg = MSR_PREFETCH_ENABLE;
+        knlOffsets = 1;
+        if (type == FEAT_CL_PREFETCHER ||
+            type == FEAT_IP_PREFETCHER)
+        {
+            fprintf(stderr, "CL_PREFETCHER and IP_PREFETCHER not available on Intel Xeon Phi (KNL)");
+            return 0;
+        }
+    }
 
     ret = HPMread(cpu, MSR_DEV, reg, &flags);
     if (ret != 0)
@@ -350,6 +387,10 @@ cpuFeatures_enable(int cpu, CpuFeature type, int print)
             {
                 flags &= ~(1ULL<<0);
             }
+            else if (knlOffsets)
+            {
+                flags &= ~(1ULL<<1);
+            }
             else
             {
                 flags &= ~(1ULL<<9);
@@ -376,6 +417,10 @@ cpuFeatures_enable(int cpu, CpuFeature type, int print)
             {
                 flags &= ~(1ULL<<2);
             }
+            else if (knlOffsets)
+            {
+                flags &= ~(1ULL<<0);
+            }
             else
             {
                 flags &= ~(1ULL<<37);
@@ -431,6 +476,7 @@ cpuFeatures_disable(int cpu, CpuFeature type, int print)
     uint64_t flags;
     uint32_t reg = MSR_IA32_MISC_ENABLE;
     int newOffsets = 0;
+    int knlOffsets = 1;
     if (!IF_FLAG(type))
     {
         return 0;
@@ -456,6 +502,7 @@ cpuFeatures_disable(int cpu, CpuFeature type, int print)
             (cpuid_info.model == BROADWELL_E) ||
             (cpuid_info.model == SKYLAKE1) ||
             (cpuid_info.model == SKYLAKE2) ||
+            (cpuid_info.model == SKYLAKEX) ||
             (cpuid_info.model == KABYLAKE1) ||
             (cpuid_info.model == KABYLAKE2) ||
             (cpuid_info.model == ATOM_SILVERMONT_GOLD))
@@ -463,6 +510,17 @@ cpuFeatures_disable(int cpu, CpuFeature type, int print)
         reg = MSR_PREFETCH_ENABLE;
         newOffsets = 1;
     }
+    if (cpuid_info.model == XEON_PHI_KNL)
+    {
+        reg = MSR_PREFETCH_ENABLE;
+        knlOffsets = 1;
+        if (type == FEAT_CL_PREFETCHER ||
+            type == FEAT_IP_PREFETCHER)
+        {
+            fprintf(stderr, "CL_PREFETCHER and IP_PREFETCHER not available on Intel Xeon Phi (KNL)");
+            return 0;
+        }
+    }
     ret = HPMread(cpu, MSR_DEV, reg, &flags);
     if (ret != 0)
     {
@@ -479,6 +537,10 @@ cpuFeatures_disable(int cpu, CpuFeature type, int print)
             {
                 flags |= (1ULL<<0);
             }
+            else if (knlOffsets)
+            {
+                flags |= (1ULL<<1);
+            }
             else
             {
                 flags |= (1ULL<<9);
@@ -505,6 +567,10 @@ cpuFeatures_disable(int cpu, CpuFeature type, int print)
             {
                 flags |= (1ULL<<2);
             }
+            else if (knlOffsets)
+            {
+                flags |= (1ULL<<0);
+            }
             else
             {
                 flags |= (1ULL<<37);
@@ -582,3 +648,12 @@ cpuFeatures_name(CpuFeature type)
     return NULL;
 }
 
+
+void __attribute__((destructor (104))) cpuFeatures_finalizeDestruct(void)
+{
+    if (cpuFeatureMask)
+    {
+        free(cpuFeatureMask);
+        cpuFeatureMask = NULL;
+    }
+}
diff --git a/src/cpustring.c b/src/cpustring.c
index cb36a81..8aa8794 100644
--- a/src/cpustring.c
+++ b/src/cpustring.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Parser for CPU selection strings
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -36,9 +36,26 @@
 
 #include <likwid.h>
 
+#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
+#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
+
+
 /* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
 
 static int
+check_and_atoi(char* s)
+{
+    int i = 0;
+    int len = strlen(s);
+    for (i = 0; i < len ; i++)
+    {
+        if (s[i] < '0' || s[i] > '9')
+            return -1;
+    }
+    return atoi(s);
+}
+
+static int
 cpulist_sort(int* incpus, int* outcpus, int length)
 {
     int insert = 0;
@@ -94,6 +111,21 @@ cpu_in_domain(int domainidx, int cpu)
 }
 
 static int
+get_domain_idx(bstring bdomain)
+{
+    affinity_init();
+    AffinityDomains_t affinity = get_affinityDomains();
+    for (int i=0;i<affinity->numberOfAffinityDomains; i++)
+    {
+        if (bstrcmp(affinity->domains[i].tag, bdomain) == BSTR_OK)
+        {
+            return i;
+        }
+    }
+    return -1;
+}
+
+static int
 cpuexpr_to_list(bstring bcpustr, bstring prefix, int* list, int length)
 {
     topology_init();
@@ -104,6 +136,7 @@ cpuexpr_to_list(bstring bcpustr, bstring prefix, int* list, int length)
     strlist = bsplit(bcpustr, ',');
     int oldinsert = 0;
     int insert = 0;
+    int tmp = 0;
     for (int i=0;i < strlist->qty; i++)
     {
         bstring newstr = bstrcpy(prefix);
@@ -113,8 +146,12 @@ cpuexpr_to_list(bstring bcpustr, bstring prefix, int* list, int length)
         {
             if (bstrcmp(affinity->domains[j].tag, newstr) == 0)
             {
-                list[insert] = atoi(bdata(strlist->entry[i]));
-                insert++;
+                tmp = check_and_atoi(bdata(strlist->entry[i]));
+                if (tmp >= 0)
+                {
+                    list[insert] = tmp;
+                    insert++;
+                }
                 if (insert == length)
                     goto list_done;
                 break;
@@ -131,19 +168,32 @@ list_done:
     return insert;
 }
 
+
 static int
-cpustr_to_cpulist_scatter(bstring bcpustr, int* cpulist, int length)
+cpustr_to_cpulist_method(bstring bcpustr, int* cpulist, int length)
 {
     int max_procs = 0;
+    int given_procs = 0;
     topology_init();
     CpuTopology_t cpuid_topology = get_cpuTopology();
     affinity_init();
     AffinityDomains_t affinity = get_affinityDomains();
+    bstring scattercheck = bformat("scatter");
+    bstring balancedcheck = bformat("balanced");
+    bstring cbalancedcheck = bformat("cbalanced");
     char* cpustring = bstr2cstr(bcpustr, '\0');
     if (bstrchrp(bcpustr, ':', 0) != BSTR_ERR)
     {
         int insert = 0;
         int suitidx = 0;
+        struct bstrList* parts = bstrListCreate();
+        parts = bsplit(bcpustr, ':');
+        if (parts->qty == 3)
+        {
+            int tmp = check_and_atoi(bdata(parts->entry[2]));
+            if (tmp > 0)
+                given_procs = tmp;
+        }
         int* suitable = (int*)malloc(affinity->numberOfAffinityDomains*sizeof(int));
         if (!suitable)
         {
@@ -152,7 +202,7 @@ cpustr_to_cpulist_scatter(bstring bcpustr, int* cpulist, int length)
         }
         for (int i=0; i<affinity->numberOfAffinityDomains; i++)
         {
-            if (bstrchrp(affinity->domains[i].tag, cpustring[0], 0) != BSTR_ERR &&
+            if (binstr(affinity->domains[i].tag, 0, parts->entry[0]) != BSTR_ERR &&
                 affinity->domains[i].numberOfProcessors > 0)
             {
                 suitable[suitidx] = i;
@@ -174,7 +224,7 @@ cpustr_to_cpulist_scatter(bstring bcpustr, int* cpulist, int length)
             if (!sLists[i])
             {
                 free(suitable);
-                for (int j=0; i<i; j++)
+                for (int j=0; j<i; j++)
                 {
                     free(sLists[j]);
                 }
@@ -183,17 +233,125 @@ cpustr_to_cpulist_scatter(bstring bcpustr, int* cpulist, int length)
             }
             cpulist_sort(affinity->domains[suitable[i]].processorList, sLists[i], affinity->domains[suitable[i]].numberOfProcessors);
         }
-        for (int off=0;off<max_procs;off++)
+        if (binstr(bcpustr, 0, scattercheck) != BSTR_ERR)
         {
+            if (given_procs > 0)
+                length = given_procs;
+            for (int off=0;off<max_procs;off++)
+            {
+                for(int i=0;i < suitidx; i++)
+                {
+                    cpulist[insert] = sLists[i][off];
+                    insert++;
+                    if (insert == length)
+                        goto method_done;
+                }
+            }
+        }
+        else if (binstr(bcpustr, 0, cbalancedcheck) != BSTR_ERR)
+        {
+            if (given_procs > 0)
+                length = given_procs;
+            else
+                length = max_procs * suitidx;
+            int per_domain = length/suitidx;
+            int remain = length % suitidx;
+            int coresAllDomains = (max_procs*suitidx)/cpuid_topology->numThreadsPerCore;
+            int coresPerDomain = coresAllDomains/suitidx;
+            int threadsPerCore = cpuid_topology->numThreadsPerCore;
+            if ((per_domain+remain) > coresPerDomain)
+            {
+                for(int i=0;i < suitidx; i++)
+                {
+                    int with_ht = ((per_domain+remain)-coresPerDomain)*threadsPerCore;
+                    for (int j = 0; j < with_ht; j++)
+                    {
+                        int cpu = affinity->domains[suitable[i]].processorList[j];
+                        cpulist[insert] = cpu;
+                        insert++;
+                        for (int k=0; k< max_procs;k++)
+                        {
+                            if (sLists[i][k] == cpu)
+                            {
+                                sLists[i][k] = -1;
+                                break;
+                            }
+                        }
+                    }
+                    int wo_ht = (per_domain+remain) - with_ht;
+                    for (int j = 0; j < wo_ht; j++)
+                    {
+                        if (sLists[i][j] >= 0)
+                        {
+                            if (remain > 0)
+                            {
+                                remain--;
+                            }
+                            int cpu = sLists[i][j];
+                            cpulist[insert] = cpu;
+                            insert++;
+                            for (int k=0; k< max_procs;k++)
+                            {
+                                if (sLists[i][k] == cpu)
+                                {
+                                    sLists[i][k] = -1;
+                                    break;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            wo_ht++;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                for(int i=0;i < suitidx; i++)
+                {
+                    int new_domain = per_domain;
+                    if (remain > 0)
+                    {
+                        new_domain++;
+                        remain--;
+                    }
+                    for (int j = 0; j < new_domain; j++)
+                    {
+                        cpulist[insert] = sLists[i][j];
+                        insert++;
+                        if (insert == length)
+                            goto method_done;
+                    }
+                }
+            }
+        }
+        else if (binstr(bcpustr, 0, balancedcheck) != BSTR_ERR)
+        {
+            if (given_procs > 0)
+                length = given_procs;
+            else
+                length = max_procs * suitidx;
+            int per_domain = length/suitidx;
+            int remain = length % suitidx;
             for(int i=0;i < suitidx; i++)
             {
-                cpulist[insert] = sLists[i][off];
-                insert++;
-                if (insert == length)
-                    goto scatter_done;
+                int new_domain = per_domain;
+                if (remain > 0)
+                {
+                    new_domain++;
+                    remain--;
+                }
+                for (int j = 0; j < new_domain; j++)
+                {
+                    cpulist[insert] = affinity->domains[suitable[i]].processorList[j];
+                    insert++;
+                    if (insert == length)
+                        goto method_done;
+                }
             }
         }
-scatter_done:
+method_done:
         bcstrfree(cpustring);
         for (int i = 0; i< suitidx; i++)
         {
@@ -203,6 +361,10 @@ scatter_done:
         free(suitable);
         return insert;
     }
+    else
+    {
+        fprintf(stderr, "Not a valid CPU expression\n");
+    }
     bcstrfree(cpustring);
     return 0;
 }
@@ -219,6 +381,7 @@ cpustr_to_cpulist_expression(bstring bcpustr, int* cpulist, int length)
     int count = 0;
     int stride = 0;
     int chunk = 0;
+    int off = 0;
     if (bstrchrp(bcpustr, 'E', 0) != 0)
     {
         fprintf(stderr, "Not a valid CPU expression\n");
@@ -226,28 +389,43 @@ cpustr_to_cpulist_expression(bstring bcpustr, int* cpulist, int length)
     }
     struct bstrList* strlist;
     strlist = bsplit(bcpustr, ':');
-    if (strlist->qty == 3)
+    if (strlist->qty == 2)
+    {
+        bdomain = bstrcpy(strlist->entry[1]);
+        count = cpuid_topology->activeHWThreads;
+        stride = 1;
+        chunk = 1;
+    }
+    else if (strlist->qty == 3)
     {
         bdomain = bstrcpy(strlist->entry[1]);
-        count = atoi(bdata(strlist->entry[2]));
+        count = check_and_atoi(bdata(strlist->entry[2]));
         stride = 1;
         chunk = 1;
     }
     else if (strlist->qty == 5)
     {
         bdomain = bstrcpy(strlist->entry[1]);
-        count = atoi(bdata(strlist->entry[2]));
-        chunk = atoi(bdata(strlist->entry[3]));
-        stride = atoi(bdata(strlist->entry[4]));
+        count = check_and_atoi(bdata(strlist->entry[2]));
+        chunk = check_and_atoi(bdata(strlist->entry[3]));
+        stride = check_and_atoi(bdata(strlist->entry[4]));
     }
-    for (int i=0; i<affinity->numberOfAffinityDomains; i++)
+    else if (strlist->qty == 6)
     {
-        if (bstrcmp(bdomain, affinity->domains[i].tag) == 0)
-        {
-            domainidx = i;
-            break;
-        }
+        bdomain = bstrcpy(strlist->entry[1]);
+        count = check_and_atoi(bdata(strlist->entry[2]));
+        chunk = check_and_atoi(bdata(strlist->entry[3]));
+        stride = check_and_atoi(bdata(strlist->entry[4]));
+        off = check_and_atoi(bdata(strlist->entry[5]));
+    }
+    if (count < 0 || chunk < 0 || stride < 0 || off < 0)
+    {
+        fprintf(stderr, "CPU expression contains non-numerical characters\n");
+        bdestroy(bdomain);
+        bstrListDestroy(strlist);
+        return 0;
     }
+    domainidx = get_domain_idx(bdomain);
     if (domainidx < 0)
     {
         fprintf(stderr, "Cannot find domain %s\n", bdata(bdomain));
@@ -261,13 +439,13 @@ cpustr_to_cpulist_expression(bstring bcpustr, int* cpulist, int length)
     {
         for (int j=0; j<chunk && offset+j<affinity->domains[domainidx].numberOfProcessors;j++)
         {
-            cpulist[insert] = affinity->domains[domainidx].processorList[offset + j];
+            cpulist[insert] = affinity->domains[domainidx].processorList[off + offset + j];
             insert++;
             if (insert == length || insert == count)
                 goto expression_done;
         }
         offset += stride;
-        if (offset >= affinity->domains[domainidx].numberOfProcessors)
+        if (off+offset >= affinity->domains[domainidx].numberOfProcessors)
         {
             offset = 0;
         }
@@ -303,21 +481,20 @@ cpustr_to_cpulist_logical(bstring bcpustr, int* cpulist, int length)
     strlist = bsplit(bcpustr, ':');
     if (strlist->qty != 3)
     {
-        fprintf(stderr, "ERROR: Invalid expression, should look like L:<domain>:<indexlist> or be in a cpuset\n");
+        fprintf(stderr, "ERROR: Invalid expression, should look like <domain>:<indexlist> or L:<domain>:<indexlist>\n");
+        bstrListDestroy(strlist);
+        return 0;
+    }
+    if (blength(strlist->entry[2]) == 0)
+    {
+        fprintf(stderr, "ERROR: Invalid expression, should look like <domain>:<indexlist> or L:<domain>:<indexlist>\n");
         bstrListDestroy(strlist);
         return 0;
     }
     bdomain = bstrcpy(strlist->entry[1]);
     blist = bstrcpy(strlist->entry[2]);
     bstrListDestroy(strlist);
-    for (int i=0; i<affinity->numberOfAffinityDomains; i++)
-    {
-        if (bstrcmp(bdomain, affinity->domains[i].tag) == 0)
-        {
-            domainidx = i;
-            break;
-        }
-    }
+    domainidx = get_domain_idx(bdomain);
     if (domainidx < 0)
     {
         fprintf(stderr, "ERROR: Cannot find domain %s\n", bdata(bdomain));
@@ -349,14 +526,24 @@ cpustr_to_cpulist_logical(bstring bcpustr, int* cpulist, int length)
         {
             struct bstrList* indexlist;
             indexlist = bsplit(strlist->entry[i], '-');
-            if (atoi(bdata(indexlist->entry[0])) <= atoi(bdata(indexlist->entry[1])))
+            int start = check_and_atoi(bdata(indexlist->entry[0]));
+            int end = check_and_atoi(bdata(indexlist->entry[1]));
+            if (start < 0 || end < 0)
+            {
+                fprintf(stderr, "CPU expression %s contains non-numerical characters\n",
+                                 bdata(strlist->entry[i]));
+                bstrListDestroy(indexlist);
+                continue;
+            }
+            if (start <= end)
             {
-                require += atoi(bdata(indexlist->entry[1])) - atoi(bdata(indexlist->entry[0])) + 1;
+                require += end - start + 1;
             }
             else
             {
-                require += atoi(bdata(indexlist->entry[0])) - atoi(bdata(indexlist->entry[1])) + 1;
+                require += start - end + 1;
             }
+            bstrListDestroy(indexlist);
         }
         else
         {
@@ -368,7 +555,7 @@ cpustr_to_cpulist_logical(bstring bcpustr, int* cpulist, int length)
         fprintf(stderr,
                 "WARN: Selected affinity domain %s has only %d hardware threads, but selection string evaluates to %d threads.\n",
                 bdata(affinity->domains[domainidx].tag), ret, require);
-        fprintf(stderr, "      This results in multiple threads on the same hardware thread.\n");
+        fprintf(stderr, "     This results in multiple threads on the same hardware thread.\n");
     }
 logical_redo:
     for (int i=0; i< strlist->qty; i++)
@@ -377,9 +564,18 @@ logical_redo:
         {
             struct bstrList* indexlist;
             indexlist = bsplit(strlist->entry[i], '-');
-            if (atoi(bdata(indexlist->entry[0])) <= atoi(bdata(indexlist->entry[1])))
+            int start = check_and_atoi(bdata(indexlist->entry[0]));
+            int end = check_and_atoi(bdata(indexlist->entry[1]));
+            if (start < 0 || end < 0)
             {
-                for (int j=atoi(bdata(indexlist->entry[0])); j<=atoi(bdata(indexlist->entry[1])) && (insert_offset+insert < require);j++)
+                fprintf(stderr, "CPU expression %s contains non-numerical characters\n",
+                                 bdata(strlist->entry[i]));
+                bstrListDestroy(indexlist);
+                continue;
+            }
+            if (start <= end)
+            {
+                for (int j=start; j<=end && (insert_offset+insert < require); j++)
                 {
                     inlist_idx = j;
                     cpulist[insert_offset + insert] = inlist[inlist_idx % ret];
@@ -396,8 +592,16 @@ logical_redo:
             }
             else
             {
-                for (int j=atoi(bdata(indexlist->entry[0]));
-                        j>=atoi(bdata(indexlist->entry[1])) && (insert_offset+insert < require); j--)
+                int start = check_and_atoi(bdata(indexlist->entry[0]));
+                int end = check_and_atoi(bdata(indexlist->entry[1]));
+                if (start < 0 || end < 0)
+                {
+                    fprintf(stderr, "CPU expression %s contains non-numerical characters\n",
+                                     bdata(strlist->entry[i]));
+                    bstrListDestroy(indexlist);
+                    continue;
+                }
+                for (int j=start; j>=end && (insert_offset+insert < require); j--)
                 {
                     inlist_idx = j;
                     cpulist[insert_offset + insert] = inlist[inlist_idx % ret];
@@ -416,7 +620,13 @@ logical_redo:
         }
         else
         {
-            cpulist[insert_offset + insert] = inlist[atoi(bdata(strlist->entry[i])) % ret];
+            int cpu = check_and_atoi(bdata(strlist->entry[i]));
+            if (cpu < 0)
+            {
+                fprintf(stderr, "CPU expression %s contains non-numerical characters\n",
+                                 bdata(strlist->entry[i]));
+            }
+            cpulist[insert_offset + insert] = inlist[cpu % ret];
             insert++;
             if (insert == ret)
             {
@@ -458,14 +668,7 @@ cpustr_to_cpulist_physical(bstring bcpustr, int* cpulist, int length)
         bdomain = bformat("N");
         blist = bstrcpy(bcpustr);
     }
-    for (int i=0; i<affinity->numberOfAffinityDomains; i++)
-    {
-        if (bstrcmp(bdomain, affinity->domains[i].tag) == 0)
-        {
-            domainidx = i;
-            break;
-        }
-    }
+    domainidx = get_domain_idx(bdomain);
     if (domainidx < 0)
     {
         fprintf(stderr, "Cannot find domain %s\n", bdata(bdomain));
@@ -473,6 +676,7 @@ cpustr_to_cpulist_physical(bstring bcpustr, int* cpulist, int length)
         bdestroy(blist);
         return 0;
     }
+    bstring domtag = affinity->domains[domainidx].tag;
 
     strlist = bsplit(blist, ',');
     int insert = 0;
@@ -482,9 +686,18 @@ cpustr_to_cpulist_physical(bstring bcpustr, int* cpulist, int length)
         {
             struct bstrList* indexlist;
             indexlist = bsplit(strlist->entry[i], '-');
-            if (atoi(bdata(indexlist->entry[0])) <= atoi(bdata(indexlist->entry[1])))
+            int start = check_and_atoi(bdata(indexlist->entry[0]));
+            int end = check_and_atoi(bdata(indexlist->entry[1]));
+            if (start < 0 || end < 0)
+            {
+                fprintf(stderr, "CPU expression %s contains non-numerical characters\n",
+                                 bdata(strlist->entry[i]));
+                bstrListDestroy(indexlist);
+                continue;
+            }
+            if (start <= end)
             {
-                for (int j=atoi(bdata(indexlist->entry[0])); j<=atoi(bdata(indexlist->entry[1]));j++)
+                for (int j = start; j <= end; j++)
                 {
                     if (cpu_in_domain(domainidx, j))
                     {
@@ -498,13 +711,29 @@ cpustr_to_cpulist_physical(bstring bcpustr, int* cpulist, int length)
                     }
                     else
                     {
-                        fprintf(stderr, "CPU %d not in domain %s\n", j, bdata(affinity->domains[domainidx].tag));
+                        int notInCpuSet = 0;
+                        for (int k=0;k<cpuid_topology->numHWThreads;k++)
+                        {
+                            if (cpuid_topology->threadPool[k].apicId == j && !cpuid_topology->threadPool[k].inCpuSet)
+                            {
+                                notInCpuSet = 1;
+                            }
+                        }
+                        fprintf(stderr, "CPU %d not in domain %s.", j, bdata(domtag));
+                        if (notInCpuSet)
+                        {
+                            fprintf(stderr, " It is not in the given cpuset\n");
+                        }
+                        else
+                        {
+                            fprintf(stderr, "\n");
+                        }
                     }
                 }
             }
             else
             {
-                for (int j=atoi(bdata(indexlist->entry[0])); j>=atoi(bdata(indexlist->entry[1]));j--)
+                for (int j = start; j >= end; j--)
                 {
                     if (cpu_in_domain(domainidx, j))
                     {
@@ -518,7 +747,23 @@ cpustr_to_cpulist_physical(bstring bcpustr, int* cpulist, int length)
                     }
                     else
                     {
-                        fprintf(stderr, "CPU %d not in domain %s\n", j, bdata(affinity->domains[domainidx].tag));
+                        int notInCpuSet = 0;
+                        for (int k=0;k<cpuid_topology->numHWThreads;k++)
+                        {
+                            if (cpuid_topology->threadPool[k].apicId == j && !cpuid_topology->threadPool[k].inCpuSet)
+                            {
+                                notInCpuSet = 1;
+                            }
+                        }
+                        fprintf(stderr, "CPU %d not in domain %s.", j, bdata(domtag));
+                        if (notInCpuSet)
+                        {
+                            fprintf(stderr, " It is not in the given cpuset\n");
+                        }
+                        else
+                        {
+                            fprintf(stderr, "\n");
+                        }
                     }
                 }
             }
@@ -526,8 +771,13 @@ cpustr_to_cpulist_physical(bstring bcpustr, int* cpulist, int length)
         }
         else
         {
-            int cpu = atoi(bdata(strlist->entry[i]));
-            if (cpu_in_domain(domainidx, cpu))
+            int cpu = check_and_atoi(bdata(strlist->entry[i]));
+            if (cpu < 0)
+            {
+                fprintf(stderr, "CPU expression %s contains non-numerical characters\n",
+                                 bdata(strlist->entry[i]));
+            }
+            else if (cpu_in_domain(domainidx, cpu))
             {
                 cpulist[insert] = cpu;
                 insert++;
@@ -538,7 +788,23 @@ cpustr_to_cpulist_physical(bstring bcpustr, int* cpulist, int length)
             }
             else
             {
-                fprintf(stderr, "CPU %d not in domain %s\n", cpu, bdata(affinity->domains[domainidx].tag));
+                int notInCpuSet = 0;
+                for (int k=0;k<cpuid_topology->numHWThreads;k++)
+                {
+                    if (cpuid_topology->threadPool[k].apicId == cpu && !cpuid_topology->threadPool[k].inCpuSet)
+                    {
+                        notInCpuSet = 1;
+                    }
+                }
+                fprintf(stderr, "CPU %d not in domain %s.", cpu, bdata(domtag));
+                if (notInCpuSet)
+                {
+                    fprintf(stderr, " It is not in the given cpuset\n");
+                }
+                else
+                {
+                    fprintf(stderr, "\n");
+                }
             }
         }
     }
@@ -560,6 +826,7 @@ cpustr_to_cpulist(const char* cpustring, int* cpulist, int length)
     bstring bcpustr = bfromcstr(cpustring);
     struct bstrList* strlist;
     bstring scattercheck = bformat("scatter");
+    bstring balancedcheck = bformat("balanced");
     topology_init();
     CpuTopology_t cpuid_topology = get_cpuTopology();
     strlist = bsplit(bcpustr, '@');
@@ -569,14 +836,17 @@ cpustr_to_cpulist(const char* cpustring, int* cpulist, int length)
     {
         bstrListDestroy(strlist);
         bdestroy(scattercheck);
+        bdestroy(balancedcheck);
         bdestroy(bcpustr);
         return -ENOMEM;
     }
+    memset(tmpList, 0, length * sizeof(int));
     for (int i=0; i< strlist->qty; i++)
     {
-        if (binstr(strlist->entry[i], 0, scattercheck) != BSTR_ERR)
+        if (binstr(strlist->entry[i], 0, scattercheck) != BSTR_ERR ||
+            binstr(strlist->entry[i], 0, balancedcheck) != BSTR_ERR)
         {
-            ret = cpustr_to_cpulist_scatter(strlist->entry[i], tmpList, length);
+            ret = cpustr_to_cpulist_method(strlist->entry[i], tmpList, length);
             insert += cpulist_concat(cpulist, insert, tmpList, ret);
         }
         else if (bstrchrp(strlist->entry[i], 'E', 0) == 0)
@@ -589,16 +859,13 @@ cpustr_to_cpulist(const char* cpustring, int* cpulist, int length)
             ret = cpustr_to_cpulist_logical(strlist->entry[i], tmpList, length);
             insert += cpulist_concat(cpulist, insert, tmpList, ret);
         }
-        else if (cpuid_topology->activeHWThreads < cpuid_topology->numHWThreads)
+
+        else if ((bstrchrp(strlist->entry[i], 'N', 0) == 0) ||
+                 (bstrchrp(strlist->entry[i], 'S', 0) == 0) ||
+                 (bstrchrp(strlist->entry[i], 'C', 0) == 0) ||
+                 (bstrchrp(strlist->entry[i], 'M', 0) == 0))
         {
-            fprintf(stdout,
-                    "INFO: You are running LIKWID in a cpuset with %d CPUs, only logical numbering allowed\n",
-                    cpuid_topology->activeHWThreads);
-            if (((bstrchrp(strlist->entry[i], 'N', 0) == 0) ||
-                (bstrchrp(strlist->entry[i], 'S', 0) == 0) ||
-                (bstrchrp(strlist->entry[i], 'C', 0) == 0) ||
-                (bstrchrp(strlist->entry[i], 'M', 0) == 0)) &&
-                (bstrchrp(strlist->entry[i], ':', 0) != BSTR_ERR))
+            if (bstrchrp(strlist->entry[i], ':', 0) != BSTR_ERR)
             {
                 bstring newstr = bformat("L:");
                 bconcat(newstr, strlist->entry[i]);
@@ -608,34 +875,50 @@ cpustr_to_cpulist(const char* cpustring, int* cpulist, int length)
             }
             else
             {
+                int dom = get_domain_idx(strlist->entry[i]);
+                if (dom >= 0)
+                {
+                    AffinityDomains_t affinity = get_affinityDomains();
+                    bstring newstr = bformat("E:");
+                    bconcat(newstr, strlist->entry[i]);
+                    length = MIN(length, affinity->domains[dom].numberOfProcessors);
+                    ret = cpustr_to_cpulist_expression(newstr, tmpList, length);
+                    insert += cpulist_concat(cpulist, insert, tmpList, ret);
+                    bdestroy(newstr);
+                }
+                else
+                {
+                    fprintf(stderr, "Cannot find domain %s\n", bdata(strlist->entry[i]));
+                    continue;
+                }
+            }
+        }
+        else
+        {
+            if (cpuid_topology->activeHWThreads < cpuid_topology->numHWThreads)
+            {
+                if (getenv("LIKWID_SILENT") == NULL)
+                {
+                    fprintf(stdout,
+                        "INFO: You are running LIKWID in a cpuset with %d CPUs. Taking given IDs as logical ID in cpuset\n",
+                        cpuid_topology->activeHWThreads);
+                }
                 bstring newstr = bformat("L:N:");
                 bconcat(newstr, strlist->entry[i]);
                 ret = cpustr_to_cpulist_logical(newstr, tmpList, length);
                 insert += cpulist_concat(cpulist, insert, tmpList, ret);
                 bdestroy(newstr);
             }
-        }
-        else if (((bstrchrp(strlist->entry[i], 'N', 0) == 0) ||
-            (bstrchrp(strlist->entry[i], 'S', 0) == 0) ||
-            (bstrchrp(strlist->entry[i], 'C', 0) == 0) ||
-            (bstrchrp(strlist->entry[i], 'M', 0) == 0)) &&
-            (bstrchrp(strlist->entry[i], ':', 0) != BSTR_ERR))
-        {
-            bstring newstr = bformat("L:");
-            bconcat(newstr, strlist->entry[i]);
-            ret = cpustr_to_cpulist_logical(newstr, tmpList, length);
-            insert += cpulist_concat(cpulist, insert, tmpList, ret);
-            bdestroy(newstr);
-        }
-
-        else
-        {
-            ret = cpustr_to_cpulist_physical(strlist->entry[i], tmpList, length);
-            insert += cpulist_concat(cpulist, insert, tmpList, ret);
+            else
+            {
+                ret = cpustr_to_cpulist_physical(strlist->entry[i], tmpList, length);
+                insert += cpulist_concat(cpulist, insert, tmpList, ret);
+            }
         }
     }
     free(tmpList);
     bdestroy(bcpustr);
+    bdestroy(balancedcheck);
     bdestroy(scattercheck);
     bstrListDestroy(strlist);
     return insert;
@@ -665,3 +948,4 @@ sockstr_to_socklist(const char* sockstr, int* sockets, int length)
     return ret;
 }
 
+
diff --git a/src/frequency.c b/src/frequency.c
index 9ef4516..a488416 100644
--- a/src/frequency.c
+++ b/src/frequency.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Module implementing an interface for frequency manipulation
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *                Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -40,92 +40,190 @@
 
 #include <bstrlib.h>
 #include <likwid.h>
+#include <types.h>
 #include <error.h>
+#include <topology.h>
+#include <access.h>
+#include <registers.h>
+#include <cpuid.h>
 
 #include <frequency.h>
+#include <frequency_acpi.h>
+#include <frequency_pstate.h>
 
 char* daemon_path = TOSTRING(INSTALL_PREFIX) "/sbin/likwid-setFreq";
 
 
-enum  {
+typedef enum  {
+    NOT_DETECTED = 0,
     ACPICPUFREQ,
     INTELPSTATE,
     PPCCPUFREQ,
-} freq_driver;
+} likwid_freq_driver;
 
+likwid_freq_driver drv = NOT_DETECTED;
 
-
-uint64_t freq_getCpuClockCurrent(const int cpu_id )
+static int freq_getDriver(const int cpu_id )
 {
     FILE *f = NULL;
-    char cmd[256];
     char buff[256];
-    char* eptr = NULL;
-    uint64_t clock = 0x0ULL;
+    char* rptr = NULL;
+    bstring bbuff;
 
-    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", cpu_id);
+    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_driver", cpu_id);
     f = fopen(buff, "r");
-    if (f == NULL) {
+    if (f == NULL)
+    {
         fprintf(stderr, "Unable to open path %s for reading\n", buff);
-        return 0;
+        return -errno;
     }
-    eptr = fgets(cmd, 256, f);
-    if (eptr != NULL)
+    rptr = fgets(buff, 256, f);
+    if (rptr != NULL)
     {
-        clock = strtoull(cmd, NULL, 10);
+        bbuff = bfromcstr(buff);
+        btrimws(bbuff);
+        if (strncmp(bdata(bbuff), "acpi-cpufreq", blength(bbuff)) == 0)
+        {
+            drv = ACPICPUFREQ;
+        }
+        else if (strncmp(bdata(bbuff), "intel_pstate", blength(bbuff)) == 0)
+        {
+            drv = INTELPSTATE;
+        }
+        bdestroy(bbuff);
     }
     fclose(f);
-    return clock * 1E3;
+    return 0;
 }
 
-uint64_t freq_setCpuClockCurrent(const int cpu_id, const uint64_t freq)
+static int _freq_getUncoreMinMax(const int socket_id, int *cpuId, double* min, double* max)
 {
-    FILE *fpipe = NULL;
-    char cmd[256];
-    char buff[256];
-    uint64_t cur = 0x0ULL;
-    char* drv = freq_getDriver(cpu_id);
-    if (strcmp(drv, "intel_pstate") == 0)
+    int cpu = -1;
+    *cpuId = -1;
+    *min = 0;
+    *max = 0;
+    for (int i=0; i<cpuid_topology.numHWThreads; i++)
     {
-        fprintf(stderr, "CPUfreq driver intel_pstate not supported\n");
-        free(drv);
-        return 0x0ULL;
+        if (cpuid_topology.threadPool[i].packageId == socket_id)
+        {
+            cpu = cpuid_topology.threadPool[i].apicId;
+            break;
+        }
     }
-    free(drv);
-    cur = freq_getCpuClockCurrent(cpu_id);
-    if (cur == freq)
+    if (cpu < 0)
     {
-        return cur;
+        fprintf(stderr, "Unknown socket ID %d\n", socket_id);
+        return -ENODEV;
     }
 
-    sprintf(buff, "%s", daemon_path);
-    if (access(buff, X_OK))
+    char* avail = freq_getAvailFreq(cpu);
+    if (!avail)
     {
-        fprintf(stderr, "Daemon %s not executable", buff);
-        return 0;
+        fprintf(stderr, "Failed to get available frequencies\n");
+        return -EINVAL;
     }
 
-    sprintf(cmd, "%s %d cur %lu", daemon_path, cpu_id, freq);
-    if ( !(fpipe = (FILE*)popen(cmd,"r")) )
-    {  // If fpipe is NULL
-        fprintf(stderr, "Problems setting cpu frequency of CPU %d", cpu_id);
-        return 0;
+    double dmin = 0.0;
+    double dmax = 0.0;
+    bstring bavail = bfromcstr(avail);
+    free(avail);
+    struct bstrList* bavail_list;
+    bavail_list = bsplit(bavail, ' ');
+    bdestroy(bavail);
+    if (bavail_list->qty < 2)
+    {
+        fprintf(stderr, "Failed to read minimal and maximal frequencies\n");
+        bstrListDestroy(bavail_list);
+        return -EINVAL;
     }
-    if (pclose(fpipe))
-        return 0;
+    if (blength(bavail_list->entry[0]) > 0)
+    {
+        char* tptr = NULL;
+        dmin = strtod(bdata(bavail_list->entry[0]), &tptr);
+        if (bdata(bavail_list->entry[0]) != tptr)
+        {
+            dmin *= 1000;
+        }
+        else
+        {
+            fprintf(stderr, "Problem converting %s to double for comparison with given freq.\n", bdata(bavail_list->entry[0]));
+            return -EINVAL;
+        }
+    }
+    if (blength(bavail_list->entry[bavail_list->qty-1]) > 0)
+    {
+        char* tptr = NULL;
+        dmax = strtod(bdata(bavail_list->entry[bavail_list->qty-1]), &tptr);
+        if (bdata(bavail_list->entry[bavail_list->qty-1]) != tptr)
+        {
+            dmax *= 1000;
+        }
+        else
+        {
+            fprintf(stderr, "Problem converting %s to double for comparison with given freq.\n", bdata(bavail_list->entry[bavail_list->qty-1]));
+            return -EINVAL;
+        }
+    }
+    bstrListDestroy(bavail_list);
 
-    return freq;
+    *cpuId = cpu;
+    if (dmin < dmax)
+    {
+        *min = dmin;
+        *max = dmax;
+    }
+    else
+    {
+        *max = dmin;
+        *min = dmax;
+    }
+    return 0;
 }
 
 uint64_t freq_getCpuClockMax(const int cpu_id )
 {
+    if (drv == NOT_DETECTED)
+    {
+        freq_getDriver(cpu_id);
+    }
+    if (drv == ACPICPUFREQ)
+    {
+        return freq_acpi_getCpuClockMax(cpu_id);
+    }
+    else if (drv == INTELPSTATE)
+    {
+        return freq_pstate_getCpuClockMax(cpu_id);
+    }
+    return 0;
+}
+
+uint64_t freq_getCpuClockMin(const int cpu_id )
+{
+    if (drv == NOT_DETECTED)
+    {
+        freq_getDriver(cpu_id);
+    }
+    if (drv == ACPICPUFREQ)
+    {
+        return freq_acpi_getCpuClockMin(cpu_id);
+    }
+    else if (drv == INTELPSTATE)
+    {
+        return freq_pstate_getCpuClockMin(cpu_id);
+    }
+    return 0;
+}
+
+
+uint64_t freq_getCpuClockCurrent(const int cpu_id )
+{
     FILE *f = NULL;
     char cmd[256];
     char buff[256];
     char* eptr = NULL;
     uint64_t clock = 0x0ULL;
 
-    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu_id);
+    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", cpu_id);
     f = fopen(buff, "r");
     if (f == NULL) {
         fprintf(stderr, "Unable to open path %s for reading\n", buff);
@@ -137,23 +235,17 @@ uint64_t freq_getCpuClockMax(const int cpu_id )
         clock = strtoull(cmd, NULL, 10);
     }
     fclose(f);
-    return clock *1E3;
+    return clock * 1E3;
 }
 
+
 uint64_t freq_setCpuClockMax(const int cpu_id, const uint64_t freq)
 {
     FILE *fpipe = NULL;
     char cmd[256];
     char buff[256];
     uint64_t cur = 0x0ULL;
-    char* drv = freq_getDriver(cpu_id);
-    if (strcmp(drv, "intel_pstate") == 0)
-    {
-        fprintf(stderr, "CPUfreq driver intel_pstate not supported\n");
-        free(drv);
-        return 0x0ULL;
-    }
-    free(drv);
+
     cur = freq_getCpuClockMax(cpu_id);
     if (cur == freq)
     {
@@ -167,7 +259,15 @@ uint64_t freq_setCpuClockMax(const int cpu_id, const uint64_t freq)
         return 0;
     }
 
-    sprintf(cmd, "%s %d max %lu", daemon_path, cpu_id, freq);
+    if (drv == ACPICPUFREQ)
+    {
+        sprintf(cmd, "%s %d max %lu", daemon_path, cpu_id, freq);
+    }
+    else if (drv == INTELPSTATE)
+    {
+        double f = (double)freq;
+        sprintf(cmd, "%s %d max %g", daemon_path, cpu_id, f/1000000);
+    }
     if ( !(fpipe = (FILE*)popen(cmd,"r")) )
     {  // If fpipe is NULL
         fprintf(stderr, "Problems setting cpu frequency of CPU %d", cpu_id);
@@ -179,29 +279,29 @@ uint64_t freq_setCpuClockMax(const int cpu_id, const uint64_t freq)
     return freq;
 }
 
-uint64_t freq_getCpuClockMin(const int cpu_id )
-{
-
-    uint64_t clock = 0x0ULL;
-    FILE *f = NULL;
-    char cmd[256];
-    char buff[256];
-    char* eptr = NULL;
-
-    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu_id);
-    f = fopen(buff, "r");
-    if (f == NULL) {
-        fprintf(stderr, "Unable to open path %s for reading\n", buff);
-        return 0;
-    }
-    eptr = fgets(cmd, 256, f);
-    if (eptr != NULL)
-    {
-        clock = strtoull(cmd, NULL, 10);
-    }
-    fclose(f);
-    return clock *1E3;
-}
+/*uint64_t freq_getCpuClockMin(const int cpu_id )*/
+/*{*/
+
+/*    uint64_t clock = 0x0ULL;*/
+/*    FILE *f = NULL;*/
+/*    char cmd[256];*/
+/*    char buff[256];*/
+/*    char* eptr = NULL;*/
+
+/*    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu_id);*/
+/*    f = fopen(buff, "r");*/
+/*    if (f == NULL) {*/
+/*        fprintf(stderr, "Unable to open path %s for reading\n", buff);*/
+/*        return 0;*/
+/*    }*/
+/*    eptr = fgets(cmd, 256, f);*/
+/*    if (eptr != NULL)*/
+/*    {*/
+/*        clock = strtoull(cmd, NULL, 10);*/
+/*    }*/
+/*    fclose(f);*/
+/*    return clock *1E3;*/
+/*}*/
 
 uint64_t freq_setCpuClockMin(const int cpu_id, const uint64_t freq)
 {
@@ -209,14 +309,7 @@ uint64_t freq_setCpuClockMin(const int cpu_id, const uint64_t freq)
     char cmd[256];
     char buff[256];
     uint64_t cur = 0x0ULL;
-    char* drv = freq_getDriver(cpu_id);
-    if (strcmp(drv, "intel_pstate") == 0)
-    {
-        fprintf(stderr, "CPUfreq driver intel_pstate not supported\n");
-        free(drv);
-        return 0x0ULL;
-    }
-    free(drv);
+
     cur = freq_getCpuClockMin(cpu_id);
     if (cur == freq)
     {
@@ -230,7 +323,16 @@ uint64_t freq_setCpuClockMin(const int cpu_id, const uint64_t freq)
         return 0;
     }
 
-    sprintf(cmd, "%s %d min %lu", daemon_path, cpu_id, freq);
+    //sprintf(cmd, "%s %d min %lu", daemon_path, cpu_id, freq);
+    if (drv == ACPICPUFREQ)
+    {
+        sprintf(cmd, "%s %d min %lu", daemon_path, cpu_id, freq);
+    }
+    else if (drv == INTELPSTATE)
+    {
+        double f = (double)freq;
+        sprintf(cmd, "%s %d min %g", daemon_path, cpu_id, f/1000000);
+    }
     if ( !(fpipe = (FILE*)popen(cmd,"r")) )
     {  // If fpipe is NULL
         fprintf(stderr, "Problems setting cpu frequency of CPU %d", cpu_id);
@@ -273,30 +375,236 @@ char * freq_getGovernor(const int cpu_id )
     return NULL;
 }
 
-int freq_setGovernor(const int cpu_id, const char* gov)
+/*int freq_setTurbo(const int cpu_id, int turbo)
 {
     FILE *fpipe = NULL;
     char cmd[256];
-    char buff[256];
-    char* drv = freq_getDriver(cpu_id);
-    if (strcmp(drv, "intel_pstate") == 0)
+
+    sprintf(cmd, "%s %d tur %d", daemon_path, cpu_id, turbo);
+    if ( !(fpipe = (FILE*)popen(cmd,"r")) )
+    {  // If fpipe is NULL
+        fprintf(stderr, "Problems setting turbo mode of CPU %d", cpu_id);
+        return 0;
+    }
+    if (pclose(fpipe))
+        return 0;
+    return 1;
+}*/
+
+static int getAMDTurbo(const int cpu_id)
+{
+    int err = 0;
+    int own_hpm = 0;
+
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        
+        err = HPMaddThread(cpu_id);
+        if (err != 0)
+        {
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return err;
+        }
+    }
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpu_id, MSR_DEV, 0xC0010015, &tmp);
+    if (err)
+    {
+        ERROR_PLAIN_PRINT(Cannot read register 0xC0010015);
+        return err;
+    }
+    if (own_hpm)
+        HPMfinalize();
+    err = ((tmp >> 25) & 0x1);
+    return err == 0;
+}
+
+static int setAMDTurbo(const int cpu_id, const int turbo)
+{
+    int err = 0;
+    int own_hpm = 0;
+
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        
+        err = HPMaddThread(cpu_id);
+        if (err != 0)
+        {
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return err;
+        }
+    }
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpu_id, MSR_DEV, 0xC0010015, &tmp);
+    if (err)
+    {
+        ERROR_PLAIN_PRINT(Cannot read register 0xC0010015);
+        return err;
+    }
+    
+    if (turbo)
+    {
+        tmp &= ~(1ULL<<25);
+    }
+    else
+    {
+        tmp |= (1ULL << 25);
+    }
+    err = HPMwrite(cpu_id, MSR_DEV, 0xC0010015, tmp);
+    if (err)
+    {
+        ERROR_PLAIN_PRINT(Cannot write register 0xC0010015);
+        return err;
+    }
+
+    if (own_hpm)
+        HPMfinalize();
+    return err == 0;
+}
+
+static int getIntelTurbo(const int cpu_id)
+{
+    int err = 0;
+    int own_hpm = 0;
+
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        err = HPMaddThread(cpu_id);
+        if (err != 0)
+        {
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return err;
+        }
+    }
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpu_id, MSR_DEV, MSR_IA32_MISC_ENABLE, &tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot read register 0x%x, MSR_IA32_MISC_ENABLE);
+        return err;
+    }
+    if (own_hpm)
+        HPMfinalize();
+    err = ((tmp >> 38) & 0x1);
+    return err == 0;
+}
+
+static int setIntelTurbo(const int cpu_id, const int turbo)
+{
+    int err = 0;
+    int own_hpm = 0;
+
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        
+        err = HPMaddThread(cpu_id);
+        if (err != 0)
+        {
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return err;
+        }
+    }
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpu_id, MSR_DEV, MSR_IA32_MISC_ENABLE, &tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot read register 0x%x, MSR_IA32_MISC_ENABLE);
+        return err;
+    }
+    
+    if (turbo)
+    {
+        tmp &= ~(1ULL << 38);
+    }
+    else
+    {
+        tmp |= (1ULL << 38);
+    }
+    err = HPMwrite(cpu_id, MSR_DEV, MSR_IA32_MISC_ENABLE, tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot write register 0x%x, MSR_IA32_MISC_ENABLE);
+        return err;
+    }
+
+    if (own_hpm)
+        HPMfinalize();
+    return err == 0;
+}
+
+static int isAMD()
+{
+    unsigned int eax,ebx,ecx,edx;
+    eax = 0x0;
+    CPUID(eax,ebx,ecx,edx);
+    if (ecx == 0x444d4163)
+        return 1;
+    return 0;
+}
+
+int freq_getTurbo(const int cpu_id)
+{
+    if (drv == ACPICPUFREQ)
+    {
+        if (isAMD())
+            return getAMDTurbo(cpu_id);
+        return getIntelTurbo(cpu_id);
+    }
+    else if (drv == INTELPSTATE)
     {
-        fprintf(stderr, "CPUfreq driver intel_pstate not supported\n");
-        free(drv);
+        return freq_pstate_getTurbo(cpu_id);
+    }
+    return -1;
+}
+
+int freq_setTurbo(const int cpu_id, const int turbo)
+{
+    FILE *fpipe = NULL;
+    char cmd[256];
+
+    sprintf(cmd, "%s %d tur %d", daemon_path, cpu_id, turbo);
+    if ( !(fpipe = (FILE*)popen(cmd,"r")) )
+    {  // If fpipe is NULL
+        fprintf(stderr, "Problems setting turbo mode of CPU %d", cpu_id);
         return 0;
     }
-    free(drv);
+    pclose(fpipe);
+    if (isAMD())
+        return setAMDTurbo(cpu_id, turbo);
+    else
+        return setIntelTurbo(cpu_id, turbo);
+    return 1;
+}
+
+int freq_setGovernor(const int cpu_id, const char* gov)
+{
+    FILE *fpipe = NULL;
+    char cmd[256];
+    char buff[256];
+
     sprintf(buff, "%s", daemon_path);
     if (access(buff, X_OK))
     {
-        fprintf(stderr, "Daemon %s not executable", buff);
+        ERROR_PRINT(Daemon %s not executable, buff);
         return 0;
     }
 
     sprintf(cmd, "%s %d gov %s", daemon_path, cpu_id, gov);
     if ( !(fpipe = (FILE*)popen(cmd,"r")) )
     {  // If fpipe is NULL
-        fprintf(stderr, "Problems setting cpu frequency of CPU %d", cpu_id);
+        ERROR_PRINT(Problems setting cpu frequency of CPU %d, cpu_id);
         return 0;
     }
     if (pclose(fpipe))
@@ -307,132 +615,386 @@ int freq_setGovernor(const int cpu_id, const char* gov)
 char * freq_getAvailFreq(const int cpu_id )
 {
     int i, j, k;
-    FILE *f = NULL;
+    FILE *fpipe = NULL;
     char cmd[256];
-    char buff[256];
+    char buff[2048];
     char tmp[10];
     char *eptr = NULL, *rptr = NULL, *sptr = NULL;
-    double d = 0.0;
+    double d = 0;
+    int take_next = 0;
     bstring bbuff;
 
-    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_available_frequencies", cpu_id);
-    f = fopen(buff, "r");
-    if (f == NULL)
-    {
-        fprintf(stderr, "Unable to open path %s for reading\n", buff);
+    sprintf(cmd, "%s 2>&1", daemon_path);
+    if ( !(fpipe = (FILE*)popen(cmd,"r")) )
+    {  // If fpipe is NULL
+        ERROR_PRINT(Problem executing %s, daemon_path);
         return NULL;
     }
-    rptr = fgets(buff, 256, f);
-    if (rptr != NULL)
+    while (fgets(buff, 2048, fpipe))
     {
-        struct bstrList * freq_list;
-        bbuff = bfromcstr(buff);
-        btrimws(bbuff);
-        DEBUG_PRINT(DEBUGLEV_DETAIL, Result: %s, bdata(bbuff));
-
-        freq_list = bsplit(bbuff, ' ');
-        eptr = malloc(freq_list->qty * 10 * sizeof(char));
-        if (eptr == NULL)
+        if (strncmp(buff, "Frequency steps:", 16) == 0)
         {
-            fclose(f);
-            return NULL;
+            //printf("Take next\n");
+            take_next = 1;
+            continue;
         }
-        sptr = bdata(freq_list->entry[0]);
-        d = strtod(sptr, NULL);
-        j = sprintf(eptr, "%.3f", d * 1E-6);
-        for (i=1; i< freq_list->qty; i++)
+        if (take_next)
         {
-            sptr = bdata(freq_list->entry[i]);
-            d = strtod(sptr, NULL);
-            sprintf(tmp, " %.3f", d * 1E-6);
-            for (k= strlen(tmp)-1; k >= 0; k--)
+            int eidx = 0;
+            //printf("Take %s\n", buff);
+            eptr = malloc(strlen(buff) * sizeof(char));
+            sptr = strtok(buff, " ");
+            while (sptr != NULL)
             {
-                if (tmp[k] != '0') break;
-                if (tmp[k] == '0' && k > 0 && tmp[k-1] != '.') tmp[k] = '\0';
+                d = atof(sptr);
+                if (d > 0)
+                {
+                    eidx += snprintf(&(eptr[eidx]), 19, "%g ", d*1E-6);
+                }
+                sptr = strtok(NULL, " ");
             }
-            j+= sprintf(&(eptr[j]), "%s", tmp);
+            break;
+        }
+    }
+    if (pclose(fpipe) == -1)
+    {
+        return NULL;
+    }
+    for (int i=strlen(eptr)-1; i>= 0; i--)
+    {
+        if (eptr[i] == ' ')
+        {
+            eptr[i] = '\0';
+        }
+        else
+        {
+            break;
         }
-        bstrListDestroy(freq_list);
     }
-    fclose(f);
     return eptr;
 }
 
 char * freq_getAvailGovs(const int cpu_id )
 {
     int i, j, k;
-    FILE *f = NULL;
+    FILE *fpipe = NULL;
     char cmd[256];
-    char buff[256];
+    char buff[2048];
     char tmp[10];
-    char* eptr = NULL, *rptr = NULL;
+    char *eptr = NULL, *rptr = NULL, *sptr = NULL;
+    double d = 0;
+    int take_next = 0;
     bstring bbuff;
 
-    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_available_governors", cpu_id);
-    f = fopen(buff, "r");
-    if (f == NULL)
+    sprintf(cmd, "%s 2>&1", daemon_path);
+    if ( !(fpipe = (FILE*)popen(cmd,"r")) )
+    {  // If fpipe is NULL
+        ERROR_PRINT(Problem executing %s, daemon_path);
+        return NULL;
+    }
+    while (fgets(buff, 2048, fpipe))
+    {
+        if (strncmp(buff, "Governors:", 10) == 0)
+        {
+            take_next = 1;
+            continue;
+        }
+        if (take_next)
+        {
+            int eidx = 0;
+            eptr = malloc((strlen(buff)+1) * sizeof(char));
+            memset(eptr, 0, (strlen(buff)+1) * sizeof(char));
+            strncpy(eptr, buff, strlen(buff));
+            break;
+        }
+    }
+    if (pclose(fpipe) == -1)
     {
-        fprintf(stderr, "Unable to open path %s for reading\n", buff);
         return NULL;
     }
-    rptr = fgets(buff, 256, f);
-    if (rptr != NULL)
+    for (int i=strlen(eptr)-1; i>= 0; i--)
     {
-        struct bstrList * freq_list;
-        bbuff = bfromcstr(buff);
-        btrimws(bbuff);
-        freq_list = bsplit(bbuff, ' ');
-        k = 0;
-        for (i=0;i < freq_list->qty; i++)
+        if (eptr[i] == ' ')
         {
-            k += blength(freq_list->entry[i]);
+            eptr[i] = '\0';
         }
-        eptr = malloc((k+1) * sizeof(char));
-        if (eptr == NULL)
+        else
         {
-            fclose(f);
-            return NULL;
+            break;
         }
-        j = sprintf(eptr, "%s", bdata(freq_list->entry[0]));
+    }
+    return eptr;
+}
 
-        for (i=1; i< freq_list->qty; i++)
+int freq_setUncoreFreqMin(const int socket_id, const uint64_t freq)
+{
+    int err = 0;
+    int own_hpm = 0;
+    int cpuId = -1;
+    uint64_t f = freq;
+    double fmin, fmax;
+    if (isAMD())
+    {
+        return 0;
+    }
+    err = _freq_getUncoreMinMax(socket_id, &cpuId, &fmin, &fmax);
+    if (err < 0)
+    {
+        return err;
+    }
+    if (freq < (uint64_t)fmin)
+    {
+        ERROR_PRINT(Given frequency %llu MHz lower than system limit of %.0f MHz, freq, fmin);
+        return -EINVAL;
+    }
+    if (freq > (uint64_t)fmax)
+    {
+        ERROR_PRINT(Given frequency %llu MHz higher than system limit of %.0f MHz, freq, fmax);
+        return -EINVAL;
+    }
+    
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        err = HPMaddThread(cpuId);
+        if (err != 0)
         {
-            j += sprintf(&(eptr[j]), " %s", bdata(freq_list->entry[i]));
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return err;
         }
-        bstrListDestroy(freq_list);
     }
-    fclose(f);
-    return eptr;
+    err = power_init(cpuId);
+    if (err < 0)
+    {
+        ERROR_PRINT(Cannot initialize power module on CPU %d, cpuId);
+        return err;
+    }
+
+    if (power_info.hasRAPL)
+    {
+        f /= 100;
+    }
+    else
+    {
+        f /= 133;
+    }
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpuId, MSR_DEV, MSR_UNCORE_FREQ, &tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot read register 0x%X on CPU %d, MSR_UNCORE_FREQ, cpuId);
+        return err;
+    }
+    tmp &= ~(0xFF00);
+    tmp |= (f<<8);
+    err = HPMwrite(cpuId, MSR_DEV, MSR_UNCORE_FREQ, tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot write register 0x%X on CPU %d, MSR_UNCORE_FREQ, cpuId);
+        return err;
+    }
+
+    if (own_hpm)
+        HPMfinalize();
+    return 0;
 }
 
-char * freq_getDriver(const int cpu_id )
+
+
+
+uint64_t freq_getUncoreFreqMin(const int socket_id)
 {
-    FILE *f = NULL;
-    char cmd[256];
-    char buff[256];
-    char* eptr = NULL, *rptr = NULL;
-    bstring bbuff;
+    int err = 0;
+    int own_hpm = 0;
+    int cpuId = -1;
+    if (isAMD())
+    {
+        return 0;
+    }
+    for (int i=0; i<cpuid_topology.numHWThreads; i++)
+    {
+        if (cpuid_topology.threadPool[i].packageId == socket_id)
+        {
+            cpuId = cpuid_topology.threadPool[i].apicId;
+            break;
+        }
+    }
+    if (cpuId < 0)
+    {
+        ERROR_PRINT(Unknown socket ID %d, socket_id);
+        return 0;
+    }
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        err = HPMaddThread(cpuId);
+        if (err != 0)
+        {
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return 0;
+        }
+    }
 
-    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_driver", cpu_id);
-    f = fopen(buff, "r");
-    if (f == NULL)
+    err = power_init(cpuId);
+    if (err < 0)
     {
-        fprintf(stderr, "Unable to open path %s for reading\n", buff);
-        return NULL;
+        ERROR_PRINT(Cannot initialize power module on CPU %d, cpuId);
+        return 0;
     }
-    rptr = fgets(buff, 256, f);
-    if (rptr != NULL)
+
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpuId, MSR_DEV, MSR_UNCORE_FREQ, &tmp);
+    if (err)
     {
-        bbuff = bfromcstr(buff);
-        btrimws(bbuff);
-        eptr = malloc((strlen(buff)+1) * sizeof(char));
-        if (eptr == NULL)
+        ERROR_PRINT(Cannot read register 0x%X on CPU %d, MSR_UNCORE_FREQ, cpuId);
+        return 0;
+    }
+    tmp = (tmp>>8) & 0xFFULL;
+    if (power_info.hasRAPL)
+    {
+        tmp *= 100;
+    }
+    else
+    {
+        tmp *= 133;
+    }
+
+    if (own_hpm)
+        HPMfinalize();
+    return tmp;
+}
+
+int freq_setUncoreFreqMax(const int socket_id, const uint64_t freq)
+{
+    int err = 0;
+    int own_hpm = 0;
+    int cpuId = -1;
+    uint64_t f = freq;
+    double fmin, fmax;
+    err = _freq_getUncoreMinMax(socket_id, &cpuId, &fmin, &fmax);
+    if (err < 0)
+    {
+        return err;
+    }
+    if (freq < (uint64_t)fmin)
+    {
+        ERROR_PRINT(Given frequency %llu MHz lower than system limit of %.0f MHz, freq, fmin);
+        return -EINVAL;
+    }
+    if (freq > (uint64_t)fmax)
+    {
+        ERROR_PRINT(Given frequency %llu MHz higher than system limit of %.0f MHz, freq, fmax);
+        return -EINVAL;
+    }
+
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        err = HPMaddThread(cpuId);
+        if (err != 0)
         {
-            fclose(f);
-            return NULL;
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return err;
         }
-        sprintf(eptr, "%s", bdata(bbuff));
     }
-    fclose(f);
-    return eptr;
+    err = power_init(cpuId);
+    if (err < 0)
+    {
+        ERROR_PRINT(Cannot initialize power module on CPU %d, cpuId);
+        return err;
+    }
+
+    if (power_info.hasRAPL)
+    {
+        f /= 100;
+    }
+    else
+    {
+        f /= 133;
+    }
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpuId, MSR_DEV, MSR_UNCORE_FREQ, &tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot read register 0x%X on CPU %d, MSR_UNCORE_FREQ, cpuId);
+        return err;
+    }
+    tmp &= ~(0xFFULL);
+    tmp |= (f & 0xFFULL);
+    err = HPMwrite(cpuId, MSR_DEV, MSR_UNCORE_FREQ, tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot write register 0x%X on CPU %d, MSR_UNCORE_FREQ, cpuId);
+        return err;
+    }
+    if (own_hpm)
+        HPMfinalize();
+    return 0;
+}
+
+uint64_t freq_getUncoreFreqMax(const int socket_id)
+{
+    int err = 0;
+    int own_hpm = 0;
+    int cpuId = -1;
+    if (isAMD())
+    {
+        return 0;
+    }
+    for (int i=0; i<cpuid_topology.numHWThreads; i++)
+    {
+        if (cpuid_topology.threadPool[i].packageId == socket_id)
+        {
+            cpuId = cpuid_topology.threadPool[i].apicId;
+            break;
+        }
+    }
+    if (cpuId < 0)
+    {
+        ERROR_PRINT(Unknown socket ID %d, socket_id);
+        return 0;
+    }
+    if (!HPMinitialized())
+    {
+        HPMinit();
+        own_hpm = 1;
+        err = HPMaddThread(cpuId);
+        if (err != 0)
+        {
+            ERROR_PLAIN_PRINT(Cannot get access to MSRs)
+            return 0;
+        }
+    }
+    err = power_init(cpuId);
+    if (err < 0)
+    {
+        ERROR_PRINT(Cannot initialize power module on CPU %d, cpuId);
+        return 0;
+    }
+
+    uint64_t tmp = 0x0ULL;
+    err = HPMread(cpuId, MSR_DEV, MSR_UNCORE_FREQ, &tmp);
+    if (err)
+    {
+        ERROR_PRINT(Cannot read register 0x%X on CPU %d, MSR_UNCORE_FREQ, cpuId);
+        return 0;
+    }
+    tmp = tmp & 0xFFULL;
+    if (power_info.hasRAPL)
+    {
+        tmp *= 100;
+    }
+    else
+    {
+        tmp *= 133;
+    }
+    if (own_hpm)
+        HPMfinalize();
+    return tmp;
 }
diff --git a/src/frequency_acpi.c b/src/frequency_acpi.c
new file mode 100644
index 0000000..72c9084
--- /dev/null
+++ b/src/frequency_acpi.c
@@ -0,0 +1,104 @@
+/*
+ * =======================================================================================
+ *
+ *      Filename:  frequency_acpi.c
+ *
+ *      Description:  Module implementing an interface for frequency manipulation, the
+ *                    ACPI CPUFreq backend
+ *
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
+ *                Jan Treibig (jt), jan.treibig at gmail.com
+ *      Project:  likwid
+ *
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+ *
+ *      This program is free software: you can redistribute it and/or modify it under
+ *      the terms of the GNU General Public License as published by the Free Software
+ *      Foundation, either version 3 of the License, or (at your option) any later
+ *      version.
+ *
+ *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License along with
+ *      this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * =======================================================================================
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <math.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include <bstrlib.h>
+#include <likwid.h>
+#include <types.h>
+#include <error.h>
+#include <topology.h>
+#include <access.h>
+#include <registers.h>
+
+#include <frequency_acpi.h>
+
+
+
+uint64_t freq_acpi_getCpuClockMax(const int cpu_id )
+{
+    FILE *f = NULL;
+    char cmd[256];
+    char buff[256];
+    char* eptr = NULL;
+    uint64_t clock = 0x0ULL;
+
+
+    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq", cpu_id);
+    f = fopen(buff, "r");
+    if (f == NULL) {
+        fprintf(stderr, "Unable to open path %s for reading\n", buff);
+        return 0;
+    }
+    eptr = fgets(cmd, 256, f);
+    if (eptr != NULL)
+    {
+        clock = strtoull(cmd, NULL, 10);
+    }
+    fclose(f);
+    return clock *1E3;
+}
+
+
+uint64_t freq_acpi_getCpuClockMin(const int cpu_id )
+{
+
+    uint64_t clock = 0x0ULL;
+    FILE *f = NULL;
+    char cmd[256];
+    char buff[256];
+    char* eptr = NULL;
+
+    sprintf(buff, "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq", cpu_id);
+    f = fopen(buff, "r");
+    if (f == NULL) {
+        fprintf(stderr, "Unable to open path %s for reading\n", buff);
+        return 0;
+    }
+    eptr = fgets(cmd, 256, f);
+    if (eptr != NULL)
+    {
+        clock = strtoull(cmd, NULL, 10);
+    }
+    fclose(f);
+    return clock *1E3;
+}
+
+
+
diff --git a/src/frequency_pstate.c b/src/frequency_pstate.c
new file mode 100644
index 0000000..1f6a5a0
--- /dev/null
+++ b/src/frequency_pstate.c
@@ -0,0 +1,274 @@
+/*
+ * =======================================================================================
+ *
+ *      Filename:  frequency_pstate.c
+ *
+ *      Description:  Module implementing an interface for frequency manipulation, the
+ *                    Intel PState backend
+ *
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
+ *                Amin Nabikhani, amin.nabikhani at gmail.com
+ *      Project:  likwid
+ *
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+ *
+ *      This program is free software: you can redistribute it and/or modify it under
+ *      the terms of the GNU General Public License as published by the Free Software
+ *      Foundation, either version 3 of the License, or (at your option) any later
+ *      version.
+ *
+ *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License along with
+ *      this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * =======================================================================================
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <math.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+
+#include <bstrlib.h>
+#include <likwid.h>
+#include <types.h>
+#include <error.h>
+#include <topology.h>
+#include <access.h>
+#include <registers.h>
+
+#include <frequency_pstate.h>
+
+static unsigned int freqs[100];
+static unsigned int percent[100];
+static unsigned int num_steps = 0;
+
+static int mode()
+{
+    char readval[5];
+    int tmode;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/no_turbo","r");
+    if (fp != NULL)
+    {
+        while( fgets(readval, 5, fp) )
+        {
+            tmode = atoi(readval);
+        }
+        fclose(fp);
+    }
+    return tmode;
+}
+
+static unsigned int turbo_pct()
+{
+    char readval[4];
+    unsigned int turbo_pct;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/turbo_pct","r");
+    if (fp != NULL)
+    {
+        while( fgets(readval, 4, fp) )
+        {
+            turbo_pct = strtoul(readval,NULL,10);
+        }
+        fclose(fp);
+    }
+    return turbo_pct;
+}
+
+
+static unsigned int getMax()
+{
+    char line[1024];
+    unsigned int maxFreq = 0;
+    unsigned int trb = turbo_pct();
+    char* eptr;
+    FILE* fp = fopen("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq", "r");
+    if(fp != NULL)
+    {
+        eptr = fgets(line, 1024, fp);
+        maxFreq = strtoul(line, NULL, 10);
+        fclose(fp);
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+    if(maxFreq != 0)
+    {
+        int t = mode();
+        if (t != 0)
+        {
+            maxFreq /= (1+0.01*trb);
+        }
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+    return maxFreq;
+}
+
+
+static unsigned int getMin()
+{
+    char line[1024];
+    unsigned int minFreq = 0;
+    char* eptr;
+    FILE* fp = fopen("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq", "r");
+    if(fp != NULL)
+    {
+        eptr = fgets(line, 1024, fp);
+        minFreq = strtoul(line, NULL, 10);
+        fclose(fp);
+    }
+    else
+    {
+        fprintf(stderr, "\tEXIT WITH ERROR:  Max Freq. could not be read\n");
+        exit(EXIT_FAILURE);
+    }
+
+    return minFreq;
+}
+
+
+
+static unsigned int num_pstates()
+{
+    char readval[4];
+    unsigned int num;
+    FILE* fp = fopen("/sys/devices/system/cpu/intel_pstate/num_pstates","r");
+    if (fp != NULL)
+    {
+        while( fgets(readval, 4, fp) )
+        {
+            num = strtoul(readval,NULL,10);
+        }
+        fclose(fp);
+    }
+    else
+    {
+        exit(1);
+    }
+    return num;
+}
+
+
+
+static void steps()
+{
+    unsigned int minFreq = getMin();
+    unsigned int trb = turbo_pct();
+    unsigned int maxFreq = getMax();
+    unsigned int step = num_pstates();
+    int range = 0;
+
+    
+    if(step != 0)
+    {
+        range = (maxFreq-minFreq)/step;
+        freqs[0] = minFreq;
+        freqs[step-1]= maxFreq;
+        percent[0] = (minFreq/(float)maxFreq) * 100;
+        percent[step-1] = 100;
+        double t = 0;
+
+        for(size_t i=1; i < step-1; i++)
+        {
+            freqs[i] = minFreq+ i* range;
+            t = (((double)(freqs[i]))/((double)maxFreq)) * 100;
+            percent[i] = (unsigned int)t;
+        }
+        num_steps = step;
+    }
+    else
+    {
+        fprintf(stderr,"\tEXIT WITH ERROR:  # of pstates could not be read");
+    }
+}
+
+
+uint64_t freq_pstate_getCpuClockMax(const int cpu_id )
+{
+    char buff[256];
+    unsigned int pct = 0;
+    unsigned int maxFreq = getMax();
+    if (num_steps == 0)
+    {
+        steps();
+    }
+    uint64_t clock = ((percent[num_steps-1]) * maxFreq) * 10;
+    FILE* f = fopen("/sys/devices/system/cpu/intel_pstate/max_perf_pct","r");
+    if (f != NULL)
+    {
+        char *eptr = fgets(buff, 256, f);
+        if (eptr != NULL)
+        {
+            pct = strtoull(buff, NULL, 10);
+            for (int i=num_steps-1; i >= 0; i--)
+            {
+                if (percent[i] == pct)
+                {
+                    //clock = freqs[i]*1000;
+                    clock = ((percent[i]) * maxFreq) * 10; // *1000/100
+                    break;
+                }
+            }
+        }
+        fclose(f);
+    }
+    return clock;
+}
+
+
+
+uint64_t freq_pstate_getCpuClockMin(const int cpu_id )
+{
+    char buff[256];
+    unsigned int pct = 0;
+    unsigned int maxFreq = getMax();
+    if (num_steps == 0)
+    {
+        steps();
+    }
+    uint64_t clock = ((percent[0]) * maxFreq) * 10;
+    FILE* f = fopen("/sys/devices/system/cpu/intel_pstate/min_perf_pct","r");
+    if (f != NULL)
+    {
+        char *eptr = fgets(buff, 256, f);
+        if (eptr != NULL)
+        {
+            pct = strtoull(buff, NULL, 10);
+            for (int i=0; i < num_steps; i++)
+            {
+                if (percent[i] == pct)
+                {
+                    if (i > 0)
+                        clock = ((percent[i-1]) * maxFreq) * 10;
+                    else
+                        clock = ((percent[i]) * maxFreq) * 10;
+                    break;
+                }
+            }
+        }
+        fclose(f);
+    }
+    return clock;
+}
+
+int freq_pstate_getTurbo(const int cpu_id )
+{
+    return (mode() ? 0 : 1);
+}
+
diff --git a/src/hashTable.c b/src/hashTable.c
index f78fdd1..2cae00b 100644
--- a/src/hashTable.c
+++ b/src/hashTable.c
@@ -6,13 +6,13 @@
  *      Description: Hashtable implementation based on SGLIB.
  *                   Used for Marker API result handling.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -83,6 +83,19 @@ hashTable_initThread(int coreID)
 }
 
 int
+hashTable_test(bstring label)
+{
+    int coreID = likwid_getProcessorId();
+    LikwidThreadResults* resEntry = NULL;
+    ThreadList* resPtr = threadList[coreID];
+    resEntry = g_hash_table_lookup(resPtr->hashTable, (gpointer) bdata(label));
+    if (resEntry != NULL)
+        return 1;
+    return 0;
+}
+
+
+int
 hashTable_get(bstring label, LikwidThreadResults** resEntry)
 {
     int coreID = likwid_getProcessorId();
@@ -110,6 +123,7 @@ hashTable_get(bstring label, LikwidThreadResults** resEntry)
         (*resEntry)->time = 0.0;
         (*resEntry)->count = 0;
         (*resEntry)->index = resPtr->hashIndex++;
+        (*resEntry)->state = MARKER_STATE_NEW;
         for (int i=0; i< NUM_PMC; i++)
         {
             (*resEntry)->PMcounters[i] = 0.0;
@@ -141,7 +155,6 @@ hashTable_finalize(int* numThreads, int* numRegions, LikwidResults** results)
         {
             numberOfThreads++;
             uint32_t threadNumberOfRegions = g_hash_table_size(threadList[i]->hashTable);
-
             /*  Determine maximum number of regions */
             if (numberOfRegions < threadNumberOfRegions)
             {
diff --git a/src/includes/access.h b/src/includes/access.h
index f9cb032..6eca021 100644
--- a/src/includes/access.h
+++ b/src/includes/access.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File HPM access Module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/access_client.h b/src/includes/access_client.h
index d824394..f56886c 100644
--- a/src/includes/access_client.h
+++ b/src/includes/access_client.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file for interface to the access daemon for the access module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/access_client_types.h b/src/includes/access_client_types.h
index 1c1d9b4..afa1606 100644
--- a/src/includes/access_client_types.h
+++ b/src/includes/access_client_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Types file for access_client access module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/access_x86.h b/src/includes/access_x86.h
index 2dcfbad..71d5eae 100644
--- a/src/includes/access_x86.h
+++ b/src/includes/access_x86.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file for the interface to x86 related functions for the access module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/access_x86_msr.h b/src/includes/access_x86_msr.h
index 1ade728..17d15bb 100644
--- a/src/includes/access_x86_msr.h
+++ b/src/includes/access_x86_msr.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file for the interface to x86 MSR functions for the access module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/access_x86_pci.h b/src/includes/access_x86_pci.h
index 8dc68cd..ae09f13 100644
--- a/src/includes/access_x86_pci.h
+++ b/src/includes/access_x86_pci.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file for the interface to x86 PCI functions for the access module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/affinity.h b/src/includes/affinity.h
index 1ea72da..5c59ef1 100644
--- a/src/includes/affinity.h
+++ b/src/includes/affinity.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File affinity Module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -37,10 +37,16 @@
 int socket_lock[MAX_NUM_NODES];
 int core_lock[MAX_NUM_THREADS];
 int tile_lock[MAX_NUM_THREADS];
+int numa_lock[MAX_NUM_THREADS];
+int sharedl2_lock[MAX_NUM_THREADS];
+int sharedl3_lock[MAX_NUM_THREADS];
+
 extern AffinityDomains affinityDomains;
 
-extern int affinity_core2node_lookup[MAX_NUM_THREADS];
-extern int affinity_thread2core_lookup[MAX_NUM_THREADS];
+extern int *affinity_thread2core_lookup;
+extern int *affinity_thread2socket_lookup;
+extern int *affinity_thread2numa_lookup;
+extern int *affinity_thread2sharedl3_lookup;
 extern int affinity_processGetProcessorId();
 extern int affinity_threadGetProcessorId();
 extern const AffinityDomain* affinity_getDomain(bstring domain);
diff --git a/src/includes/bitUtil.h b/src/includes/bitUtil.h
index 50eeac3..b005a37 100644
--- a/src/includes/bitUtil.h
+++ b/src/includes/bitUtil.h
@@ -6,13 +6,13 @@
  *      Description:  Header File bitUtil Module.
  *                    Helper routines for dealing with bit manipulations
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/calculator.h b/src/includes/calculator.h
deleted file mode 100644
index edca1d9..0000000
--- a/src/includes/calculator.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * =======================================================================================
- *
- *      Filename:  calculator.h
- *
- *      Description:  Header file for infix calculator
- *
- *      Version:   4.2
- *      Released:  22.12.2016
- *
- *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
- *                Thomas Roehl (tr), thomas.roehl at gmail.com
- *      Project:  likwid
- *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
- *
- *      This program is free software: you can redistribute it and/or modify it under
- *      the terms of the GNU General Public License as published by the Free Software
- *      Foundation, either version 3 of the License, or (at your option) any later
- *      version.
- *
- *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- *      You should have received a copy of the GNU General Public License along with
- *      this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * =======================================================================================
- */
-#ifndef CALCULATOR_H
-#define CALCULATOR_H
-
-int calculate_infix(char* finfix, double *result);
-
-#endif
diff --git a/src/includes/calculator_stack.h b/src/includes/calculator_stack.h
deleted file mode 100644
index 2358980..0000000
--- a/src/includes/calculator_stack.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * =======================================================================================
- *
- *      Filename:  calculator_stack.h
- *
- *      Description:  Stack implementation for infix calculator
- *
- *      Version:   4.2
- *      Released:  22.12.2016
- *
- *      Author:   Brandon Mills (bm), mills.brandont at gmail.com
- *      Project:  likwid
- *
- *      Copyright (C) Brandon Mills
- *
- *      Permission is hereby granted, free of charge, to any person obtaining a copy of this
- *      software and associated documentation files (the "Software"), to deal in the
- *      Softwarewithout restriction, including without limitation the rights to use, copy,
- *      modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
- *      and to permit persons to whom the Software is furnished to do so, subject to the
- *      following conditions:
- *
- *      The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
- *
- *      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- *      INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- *      PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- *      HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- *      OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- *      SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * =======================================================================================
- */
-
-#ifndef CALCULATOR_STACK_H
-#define CALCULATOR_STACK_H
-
-typedef struct
-{
-    void **content;
-    int size;
-    int top;
-} Stack;
-
-void stackInit(Stack *s, int size);
-void stackPush(Stack *s, void* val);
-void* stackTop(Stack *s);
-void* stackPop(Stack *s);
-int stackSize(Stack *s);
-void stackFree(Stack *s);
-
-#endif /* CALCULATOR_STACK_H */
diff --git a/src/includes/configuration.h b/src/includes/configuration.h
index 9cfdf80..567543b 100644
--- a/src/includes/configuration.h
+++ b/src/includes/configuration.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File of Module configuration.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -34,7 +34,7 @@
 #include <likwid.h>
 #include <error.h>
 
-extern Configuration config;
+extern Likwid_Configuration config;
 extern int init_config;
 
 #endif
diff --git a/src/includes/cpuFeatures.h b/src/includes/cpuFeatures.h
index da9c4c3..211860c 100644
--- a/src/includes/cpuFeatures.h
+++ b/src/includes/cpuFeatures.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File of Module cpuFeatures.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/cpuFeatures_types.h b/src/includes/cpuFeatures_types.h
index 5d8e6bc..a35c5a0 100644
--- a/src/includes/cpuFeatures_types.h
+++ b/src/includes/cpuFeatures_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Types file for CpuFeature module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/cpuid.h b/src/includes/cpuid.h
index 273e179..464985d 100644
--- a/src/includes/cpuid.h
+++ b/src/includes/cpuid.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Common macro definition for CPUID instruction
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/error.h b/src/includes/error.h
index ab34ca1..c0ee79c 100644
--- a/src/includes/error.h
+++ b/src/includes/error.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Central error handling macros
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/frequency.h b/src/includes/frequency.h
index 212669d..2a4ae2a 100644
--- a/src/includes/frequency.h
+++ b/src/includes/frequency.h
@@ -3,15 +3,15 @@
  *
  *      Filename:  frequency.h
  *
- *      Description:  Header File for frequency module
+ *      Description:  Header File frequency module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/pci_hwloc.h b/src/includes/frequency_acpi.h
similarity index 71%
copy from src/includes/pci_hwloc.h
copy to src/includes/frequency_acpi.h
index 9cb2c32..0139764 100644
--- a/src/includes/pci_hwloc.h
+++ b/src/includes/frequency_acpi.h
@@ -1,17 +1,17 @@
 /*
  * =======================================================================================
  *
- *      Filename:  pci_hwloc.h
+ *      Filename:  frequency_acpi.h
  *
- *      Description:  Header File hwloc based PCI lookup backend
+ *      Description:  Header File frequency module, the ACPI-CPUFreq backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -27,9 +27,13 @@
  *
  * =======================================================================================
  */
-#ifndef PCI_HWLOC_H
-#define PCI_HWLOC_H
 
-extern int hwloc_pci_init(uint16_t testDevice, char** socket_bus, int* nrSockets);
+#ifndef LIKWID_FREQUENCY_ACPI
+#define LIKWID_FREQUENCY_ACPI
+
+uint64_t freq_acpi_getCpuClockMax(const int cpu_id );
+uint64_t freq_acpi_getCpuClockMin(const int cpu_id );
+
+
 
 #endif
diff --git a/src/includes/pci_hwloc.h b/src/includes/frequency_pstate.h
similarity index 68%
copy from src/includes/pci_hwloc.h
copy to src/includes/frequency_pstate.h
index 9cb2c32..e8816a9 100644
--- a/src/includes/pci_hwloc.h
+++ b/src/includes/frequency_pstate.h
@@ -1,17 +1,17 @@
 /*
  * =======================================================================================
  *
- *      Filename:  pci_hwloc.h
+ *      Filename:  frequency_pstate.h
  *
- *      Description:  Header File hwloc based PCI lookup backend
+ *      Description:  Header File frequency module, the Intel PState backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -27,9 +27,13 @@
  *
  * =======================================================================================
  */
-#ifndef PCI_HWLOC_H
-#define PCI_HWLOC_H
 
-extern int hwloc_pci_init(uint16_t testDevice, char** socket_bus, int* nrSockets);
+#ifndef LIKWID_FREQUENCY_PSTATE
+#define LIKWID_FREQUENCY_PSTATE
+
+uint64_t freq_pstate_getCpuClockMax(const int cpu_id );
+uint64_t freq_pstate_getCpuClockMin(const int cpu_id );
+
+int freq_pstate_getTurbo(const int cpu_id );
 
 #endif
diff --git a/src/includes/hashTable.h b/src/includes/hashTable.h
index 8f32025..c47a052 100644
--- a/src/includes/hashTable.h
+++ b/src/includes/hashTable.h
@@ -7,13 +7,13 @@
  *                    Wrapper for HashTable data structure holding thread
  *                    specific region information.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -37,6 +37,7 @@
 
 extern void hashTable_init();
 void hashTable_initThread(int coreID);
+extern int hashTable_test(bstring label);
 extern int hashTable_get(bstring regionTag, LikwidThreadResults** result);
 extern void hashTable_finalize(int* numberOfThreads, int* numberOfRegions, LikwidResults** results);
 
diff --git a/src/includes/libperfctr_types.h b/src/includes/libperfctr_types.h
index cea758a..5634259 100644
--- a/src/includes/libperfctr_types.h
+++ b/src/includes/libperfctr_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Types file for libperfctr module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -32,6 +32,12 @@
 
 #include <bstrlib.h>
 
+typedef enum LikwidThreadStates {
+    MARKER_STATE_NEW,
+    MARKER_STATE_START,
+    MARKER_STATE_STOP
+} LikwidThreadStates;
+
 typedef struct LikwidThreadResults{
     bstring  label;
     uint32_t index;
@@ -43,6 +49,7 @@ typedef struct LikwidThreadResults{
     double StartPMcounters[NUM_PMC];
     int StartOverflows[NUM_PMC];
     double PMcounters[NUM_PMC];
+    LikwidThreadStates state;
 } LikwidThreadResults;
 
 typedef struct {
diff --git a/src/includes/likwid.h b/src/includes/likwid.h
index 8039b3b..e00a816 100644
--- a/src/includes/likwid.h
+++ b/src/includes/likwid.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of likwid API
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -42,6 +42,9 @@
 #define DEBUGLEV_DETAIL 2
 #define DEBUGLEV_DEVELOP 3
 
+#define LIKWID_VERSION "VERSION.RELEASE.MINORVERSION"
+#define LIKWID_COMMIT GITCOMMIT
+
 extern int perfmon_verbosity;
 
 /** \addtogroup MarkerAPI Marker API module
@@ -274,10 +277,10 @@ typedef struct {
     AccessMode daemonMode; /*!< \brief Access mode to the MSR and PCI registers */
     int maxNumThreads; /*!< \brief Maximum number of HW threads */
     int maxNumNodes; /*!< \brief Maximum number of NUMA nodes */
-} Configuration;
+} Likwid_Configuration;
 
 /** \brief Pointer for exporting the Configuration data structure */
-typedef Configuration* Configuration_t;
+typedef Likwid_Configuration* Configuration_t;
 /*! \brief Read the config file of LIKWID, if it exists
 
 Search for LIKWID config file and read the values in
@@ -1108,7 +1111,7 @@ extern void timer_finalize(void) __attribute__ ((visibility ("default") ));
 \def NUM_POWER_DOMAINS
 Amount of currently supported RAPL domains
 */
-#define NUM_POWER_DOMAINS 4
+#define NUM_POWER_DOMAINS 5
 /*! \brief List of all RAPL domain names
 */
 extern const char* power_names[NUM_POWER_DOMAINS] __attribute__ ((visibility ("default") ));
@@ -1155,7 +1158,8 @@ typedef enum {
     PKG = 0, /*!< \brief PKG domain, mostly one CPU socket/package */
     PP0 = 1, /*!< \brief PP0 domain, not clearly defined by Intel */
     PP1 = 2, /*!< \brief PP1 domain, not clearly defined by Intel */
-    DRAM = 3 /*!< \brief DRAM domain, the memory modules */
+    DRAM = 3, /*!< \brief DRAM domain, the memory modules */
+    PLATFORM = 4 /*!< \brief PLATFORM domain, the whole system (if powered through the main board) */
 } PowerType;
 
 /*! \brief Structure describing an RAPL power domain
@@ -1444,14 +1448,7 @@ Get the current clock frequency of a core
 @return Frequency or 0 in case of errors
 */
 extern uint64_t freq_getCpuClockCurrent(const int cpu_id ) __attribute__ ((visibility ("default") ));
-/*! \brief Set the current clock frequency of a core
 
-Set the current clock frequency of a core
- at param [in] cpu_id CPU ID
- at param [in] freq Frequency in kHz
- at return Frequency or 0 in case of errors
-*/
-extern uint64_t freq_setCpuClockCurrent(const int cpu_id, const uint64_t freq) __attribute__ ((visibility ("default") ));
 /*! \brief Get the maximal clock frequency of a core
 
 Get the maximal clock frequency of a core
@@ -1482,6 +1479,21 @@ Set the minimal clock frequency of a core
 @return Frequency or 0 in case of errors
 */
 extern uint64_t freq_setCpuClockMin(const int cpu_id, const uint64_t freq) __attribute__ ((visibility ("default") ));
+/*! \brief De/Activate turbo mode for core
+
+De/Activate turbo mode for core
+ at param [in] cpu_id CPU ID
+ at param [in] turbo (0=off, 1=on)
+ at return 1 or 0 in case of errors
+*/
+extern int freq_setTurbo(const int cpu_id, int turbo) __attribute__ ((visibility ("default") ));
+/*! \brief Get state of turbo mode for core
+
+Get state of  turbo mode for core
+ at param [in] cpu_id CPU ID
+ at return 1=Turbo active or 0=Turbo inactive
+*/
+extern int freq_getTurbo(const int cpu_id) __attribute__ ((visibility ("default") ));
 /*! \brief Get the frequency governor of a core
 
 Get the frequency governor of a core. The returned string must be freed by the caller.
@@ -1511,13 +1523,40 @@ Get the available frequency governors of a core. The returned string must be fre
 @return String with available frequency governors or NULL in case of errors
 */
 extern char * freq_getAvailGovs(const int cpu_id ) __attribute__ ((visibility ("default") ));
-/*! \brief Get the name of the currently active cpufreq driver
 
-Get the name of the currently active cpufreq driver. The returned string must be freed by the caller.
- at param [in] cpu_id CPU ID
- at return String with active cpufreq driver or NULL in case of errors
+/*! \brief Set the minimal Uncore frequency
+
+Set the minimal Uncore frequency. Since the ranges are not documented, valid frequencies are from minimal CPU clock to maximal Turbo clock. If selecting a frequency at the borders, please check the result with the UNCORE_CLOCK event to be effective.
+ at param [in] socket_id ID of socket
+ at param [in] freq Frequency in MHz
+ at return 0 for success, -ERROR at failure
+*/
+extern int freq_setUncoreFreqMin(const int socket_id, const uint64_t freq) __attribute__ ((visibility ("default") ));
+
+/*! \brief Get the minimal Uncore frequency
+
+Get the minimal Uncore frequency.
+ at param [in] socket_id ID of socket
+ at return frequency in MHz or 0 at failure
+*/
+extern uint64_t freq_getUncoreFreqMin(const int socket_id) __attribute__ ((visibility ("default") ));
+
+/*! \brief Set the maximal Uncore frequency
+
+Set the maximal Uncore frequency. Since the ranges are not documented, valid frequencies are from minimal CPU clock to maximal Turbo clock. If selecting a frequency at the borders, please check the result with the UNCORE_CLOCK event to be effective.
+ at param [in] socket_id ID of socket
+ at param [in] freq Frequency in MHz
+ at return 0 for success, -ERROR at failure
+*/
+extern int freq_setUncoreFreqMax(const int socket_id, const uint64_t freq) __attribute__ ((visibility ("default") ));
+
+/*! \brief Get the maximal Uncore frequency
+
+Get the maximal Uncore frequency.
+ at param [in] socket_id ID of socket
+ at return frequency in MHz or 0 at failure
 */
-extern char * freq_getDriver(const int cpu_id ) __attribute__ ((visibility ("default") ));
+extern uint64_t freq_getUncoreFreqMax(const int socket_id) __attribute__ ((visibility ("default") ));
 /** @}*/
 
 #ifdef __cplusplus
diff --git a/src/includes/lock.h b/src/includes/lock.h
index 158660d..cd086ab 100644
--- a/src/includes/lock.h
+++ b/src/includes/lock.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File Locking primitive Module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/memsweep.h b/src/includes/memsweep.h
index 9ab7133..a26a92c 100644
--- a/src/includes/memsweep.h
+++ b/src/includes/memsweep.h
@@ -6,13 +6,13 @@
  *      Description:  Header File memsweep module for internal use. External functions are
  *                    defined in likwid.h
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/numa.h b/src/includes/numa.h
index dba72c6..23de116 100644
--- a/src/includes/numa.h
+++ b/src/includes/numa.h
@@ -6,13 +6,13 @@
  *      Description:  Header File NUMA module for internal use. External functions are
  *                    defined in likwid.h
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/numa_hwloc.h b/src/includes/numa_hwloc.h
index 5a3fbba..b333f48 100644
--- a/src/includes/numa_hwloc.h
+++ b/src/includes/numa_hwloc.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File hwloc NUMA backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/numa_proc.h b/src/includes/numa_proc.h
index 6c3ffde..77940b8 100644
--- a/src/includes/numa_proc.h
+++ b/src/includes/numa_proc.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File procfs/sysfs NUMA backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/pci_hwloc.h b/src/includes/pci_hwloc.h
index 9cb2c32..af0b617 100644
--- a/src/includes/pci_hwloc.h
+++ b/src/includes/pci_hwloc.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File hwloc based PCI lookup backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -31,5 +31,6 @@
 #define PCI_HWLOC_H
 
 extern int hwloc_pci_init(uint16_t testDevice, char** socket_bus, int* nrSockets);
+extern int sysfs_pci_init(uint16_t testDevice, char** socket_bus, int* nrSockets);
 
 #endif
diff --git a/src/includes/pci_proc.h b/src/includes/pci_proc.h
index 734d369..2b48127 100644
--- a/src/includes/pci_proc.h
+++ b/src/includes/pci_proc.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File procfs based PCI lookup backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/pci_types.h b/src/includes/pci_types.h
index aaed79e..a0aa924 100644
--- a/src/includes/pci_types.h
+++ b/src/includes/pci_types.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Types file for pci module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfgroup.h b/src/includes/perfgroup.h
index bb63e2a..24fda8d 100644
--- a/src/includes/perfgroup.h
+++ b/src/includes/perfgroup.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File of performance group and event set handler
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -47,28 +47,26 @@ typedef struct {
     char** metricnames; /*!< \brief Metric names */
     char** metricformulas; /*!< \brief Metric formulas */
     char* longinfo; /*!< \brief Descriptive text about the group or empty */
+    char* lua_funcs; /*!< \brief Custom Lua functions used in metric formulas */
 } GroupInfo;
 
-typedef struct {
-    int counters; /*!< \brief Number of entries in the list */
-    char** cnames; /*!< \brief List of counter names */
-    double* cvalues; /*!< \brief List of counter values */
-} CounterList;
-
 typedef enum {
     GROUP_NONE = 0,
     GROUP_SHORT,
     GROUP_EVENTSET,
     GROUP_METRICS,
-    GROUP_LONG
+    GROUP_LONG,
+    GROUP_LUA,
+    MAX_GROUP_FILE_SECTIONS
 } GroupFileSections;
 
-static char* groupFileSectionNames[5] = {
+static char* groupFileSectionNames[MAX_GROUP_FILE_SECTIONS] = {
     "NONE",
     "SHORT",
     "EVENTSET",
     "METRICS",
-    "LONG"
+    "LONG",
+    "LUA"
 };
 
 extern int get_groups(const char* grouppath, const char* architecture, char*** groupnames, char*** groupshort, char*** grouplong);
@@ -83,11 +81,14 @@ extern char* get_longInfo(GroupInfo* ginfo);
 void put_longInfo(char* linfo);
 extern void return_group(GroupInfo* ginfo);
 
-extern void init_clist(CounterList* clist);
-extern int add_to_clist(CounterList* clist, char* counter, double result);
-extern int update_clist(CounterList* clist, char* counter, double result);
-extern void destroy_clist(CounterList* clist);
 
-extern int calc_metric(char* formula, CounterList* clist, double *result);
 
+extern int calc_add_str_def(char* name, char* value, int cpu);
+extern int calc_add_int_def(char* name, int value, int cpu);
+extern int calc_add_dbl_def(char* name, double value, int cpu);
+extern int calc_add_str_var(char* name, char* value, bstring vars, bstring varlist);
+extern int calc_add_dbl_var(char* name, double value, bstring vars, bstring varlist);
+extern int calc_add_int_var(char* name, int value, bstring vars, bstring varlist);
+extern int calc_set_user_funcs(char* s);
+extern int calc_metric(int cpu, char* formula, bstring varstr, bstring varlist, double *result);
 #endif /* PERFGROUP_H */
diff --git a/src/includes/perfmon.h b/src/includes/perfmon.h
index cc821b9..c50c56b 100644
--- a/src/includes/perfmon.h
+++ b/src/includes/perfmon.h
@@ -7,14 +7,14 @@
  *                    Configures and reads out performance counters
  *                    on x86 based architectures. Supports multi threading.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -40,7 +40,7 @@
 #define FREEZE_FLAG_CLEAR_CTR (1ULL<<1)
 #define FREEZE_FLAG_CLEAR_CTL (1ULL<<0)
 
-extern uint64_t currentConfig[MAX_NUM_THREADS][NUM_PMC];
+extern uint64_t **currentConfig;
 
 extern int (*perfmon_startCountersThread) (int thread_id, PerfmonEventSet* eventSet);
 extern int (*perfmon_stopCountersThread) (int thread_id, PerfmonEventSet* eventSet);
diff --git a/src/includes/perfmon_atom.h b/src/includes/perfmon_atom.h
index 1a9f9c3..4954b7b 100644
--- a/src/includes/perfmon_atom.h
+++ b/src/includes/perfmon_atom.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file of perfmon module for Atom
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_atom_events.txt b/src/includes/perfmon_atom_events.txt
index b533378..d8c4a95 100644
--- a/src/includes/perfmon_atom_events.txt
+++ b/src/includes/perfmon_atom_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Atom
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_broadwell.h b/src/includes/perfmon_broadwell.h
index b4dbb89..2992a4b 100644
--- a/src/includes/perfmon_broadwell.h
+++ b/src/includes/perfmon_broadwell.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File of perfmon module for Intel Broadwell.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -68,8 +68,8 @@ int perfmon_init_broadwell(int cpu_id)
 {
     int ret;
     uint64_t data;
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     if ((cpuid_info.model == BROADWELL_E) || (cpuid_info.model == BROADWELL_D))
     {
@@ -77,7 +77,7 @@ int perfmon_init_broadwell(int cpu_id)
         bdw_did_cbox_check = 1;
     }
     else if ((cpuid_info.model == BROADWELL || cpuid_info.model == BROADWELL_E3) &&
-             socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id &&
+             socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id &&
              bdw_did_cbox_check == 0)
     {
         ret = HPMwrite(cpu_id, MSR_DEV, MSR_UNC_CBO_0_PERFEVTSEL0, 0x0ULL);
@@ -216,7 +216,7 @@ int bdw_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -256,7 +256,7 @@ int bdw_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     int j;
     uint64_t flags = 0x0ULL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -299,7 +299,7 @@ int bdwep_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint32_t filter1 = box_map[counter_map[index].type].filterRegister2;
     int set_state_all = 0;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -396,7 +396,7 @@ int bdw_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t filter = box_map[counter_map[index].type].filterRegister1;
     int clean_filter = 1;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -469,7 +469,7 @@ int bdw_bbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int match_flag = 0;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -543,7 +543,7 @@ int bdw_mbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -589,7 +589,7 @@ int bdw_mboxfix_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -628,7 +628,7 @@ int bdw_ibox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -674,7 +674,7 @@ int bdw_pbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -724,7 +724,7 @@ int bdw_rbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -773,7 +773,7 @@ int bdw_sbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -832,7 +832,7 @@ int bdw_qbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event, PciDevi
     uint64_t filterval = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -1048,7 +1048,7 @@ int perfmon_setupCounterThread_broadwell(
     int cpu_id = groupSet->threads[thread_id].processorId;
     print_ht_warn_once = 1;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1210,7 +1210,7 @@ int perfmon_startCountersThread_broadwell(int thread_id, PerfmonEventSet* eventS
     uint64_t tmp = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1303,7 +1303,7 @@ int bdw_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
     PciDeviceIndex dev = counter_map[index].device;
     uint64_t counter1 = counter_map[index].counterRegister;
     uint64_t counter2 = counter_map[index].counterRegister2;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -1342,7 +1342,7 @@ int bdw_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
                                            global_status_reg,
                                            &ovf_values));
             VERBOSEPRINTREG(cpu_id, global_status_reg, LLU_CAST ovf_values, READ_GLOBAL_OVFL);
-            if (ovf_values & (1<<global_offset))
+            if (ovf_values & (1ULL<<global_offset))
             {
                 VERBOSEPRINTREG(cpu_id, global_status_reg, LLU_CAST (1<<global_offset), CLEAR_GLOBAL_OVFL);
                 CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV,
@@ -1363,7 +1363,7 @@ int bdw_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
                                               box_map[type].statusRegister,
                                               &ovf_values));
             VERBOSEPRINTPCIREG(cpu_id, dev, box_map[type].statusRegister, LLU_CAST ovf_values, READ_BOX_OVFL);
-            if (ovf_values & (1<<box_offset))
+            if (ovf_values & (1ULL<<box_offset))
             {
                 (*overflows)++;
                 VERBOSEPRINTPCIREG(cpu_id, dev, box_map[type].statusRegister, LLU_CAST (1<<box_offset), RESET_BOX_OVFL);
@@ -1409,7 +1409,7 @@ int perfmon_stopCountersThread_broadwell(int thread_id, PerfmonEventSet* eventSe
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1459,6 +1459,7 @@ int perfmon_stopCountersThread_broadwell(int thread_id, PerfmonEventSet* eventSe
                         VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, STOP_POWER)
                         if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
                         {
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
                             eventSet->events[i].threadCounter[thread_id].overflows++;
                         }
                     }
@@ -1607,7 +1608,7 @@ int perfmon_readCountersThread_broadwell(int thread_id, PerfmonEventSet* eventSe
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1658,9 +1659,10 @@ int perfmon_readCountersThread_broadwell(int thread_id, PerfmonEventSet* eventSe
                     if (haveLock)
                     {
                         CHECK_POWER_READ_ERROR(power_read(cpu_id, counter1, (uint32_t*)&counter_result));
-                        VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, STOP_POWER)
+                        VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_POWER)
                         if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
                         {
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
                             eventSet->events[i].threadCounter[thread_id].overflows++;
                         }
                         *current = field64(counter_result, 0, box_map[type].regWidth);
@@ -1804,11 +1806,11 @@ int perfmon_finalizeCountersThread_broadwell(int thread_id, PerfmonEventSet* eve
     uint64_t ovf_values_uncore = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_broadwellEP_counters.h b/src/includes/perfmon_broadwellEP_counters.h
index 59c85f8..877062a 100644
--- a/src/includes/perfmon_broadwellEP_counters.h
+++ b/src/includes/perfmon_broadwellEP_counters.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Counter Header File of perfmon module for Broadwell EP/EN/EX.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -366,3 +366,56 @@ static PciDevice broadwellEP_pci_devices[MAX_NUM_PCI_DEVICES] = {
  [PCI_R3QPI_DEVICE_LINK_1] = {R3QPI, "0b.2", "PCI_R3QPI_DEVICE_LINK_1", "RBOX1", 0x6F37},
  [PCI_R3QPI_DEVICE_LINK_2] = {R3QPI, "0b.5", "PCI_R3QPI_DEVICE_LINK_2", "RBOX1", 0x6F3E},
 };
+
+static char* broadwellEP_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [POWER] = "/sys/bus/event_source/devices/power",
+    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc_0",
+    [MBOX1] = "/sys/bus/event_source/devices/uncore_imc_1",
+    [MBOX2] = "/sys/bus/event_source/devices/uncore_imc_2",
+    [MBOX3] = "/sys/bus/event_source/devices/uncore_imc_3",
+    [MBOX4] = "/sys/bus/event_source/devices/uncore_imc_4",
+    [MBOX5] = "/sys/bus/event_source/devices/uncore_imc_5",
+    [MBOX6] = "/sys/bus/event_source/devices/uncore_imc_6",
+    [MBOX7] = "/sys/bus/event_source/devices/uncore_imc_7",
+    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
+    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
+    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
+    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
+    [CBOX4] = "/sys/bus/event_source/devices/uncore_cbox_4",
+    [CBOX5] = "/sys/bus/event_source/devices/uncore_cbox_5",
+    [CBOX6] = "/sys/bus/event_source/devices/uncore_cbox_6",
+    [CBOX7] = "/sys/bus/event_source/devices/uncore_cbox_7",
+    [CBOX8] = "/sys/bus/event_source/devices/uncore_cbox_8",
+    [CBOX9] = "/sys/bus/event_source/devices/uncore_cbox_9",
+    [CBOX10] = "/sys/bus/event_source/devices/uncore_cbox_10",
+    [CBOX11] = "/sys/bus/event_source/devices/uncore_cbox_11",
+    [CBOX12] = "/sys/bus/event_source/devices/uncore_cbox_12",
+    [CBOX13] = "/sys/bus/event_source/devices/uncore_cbox_13",
+    [CBOX14] = "/sys/bus/event_source/devices/uncore_cbox_14",
+    [CBOX15] = "/sys/bus/event_source/devices/uncore_cbox_15",
+    [CBOX16] = "/sys/bus/event_source/devices/uncore_cbox_16",
+    [CBOX17] = "/sys/bus/event_source/devices/uncore_cbox_17",
+    [CBOX18] = "/sys/bus/event_source/devices/uncore_cbox_18",
+    [CBOX19] = "/sys/bus/event_source/devices/uncore_cbox_19",
+    [CBOX20] = "/sys/bus/event_source/devices/uncore_cbox_20",
+    [CBOX21] = "/sys/bus/event_source/devices/uncore_cbox_21",
+    [CBOX22] = "/sys/bus/event_source/devices/uncore_cbox_22",
+    [CBOX23] = "/sys/bus/event_source/devices/uncore_cbox_23",
+    [BBOX0] = "/sys/bus/event_source/devices/uncore_ha_0",
+    [BBOX1] = "/sys/bus/event_source/devices/uncore_ha_1",
+    [WBOX] = "/sys/bus/event_source/devices/uncore_pcu",
+    [QBOX0] = "/sys/bus/event_source/devices/uncore_qpi_0",
+    [QBOX1] = "/sys/bus/event_source/devices/uncore_qpi_1",
+    [QBOX2] = "/sys/bus/event_source/devices/uncore_qpi_2",
+    [SBOX0] = "/sys/bus/event_source/devices/uncore_sbox_0",
+    [SBOX1] = "/sys/bus/event_source/devices/uncore_sbox_1",
+    [SBOX2] = "/sys/bus/event_source/devices/uncore_sbox_2",
+    [SBOX3] = "/sys/bus/event_source/devices/uncore_sbox_3",
+    [PBOX] = "/sys/bus/event_source/devices/uncore_r2pcie",
+    [RBOX0] = "/sys/bus/event_source/devices/uncore_r3qpi_0",
+    [RBOX1] = "/sys/bus/event_source/devices/uncore_r3qpi_1",
+    [UBOX] = "/sys/bus/event_source/devices/uncore_ubox",
+    [IBOX0] = "/sys/bus/event_source/devices/uncore_irp",
+};
diff --git a/src/includes/perfmon_broadwellEP_events.txt b/src/includes/perfmon_broadwellEP_events.txt
index 00ec49e..2300160 100644
--- a/src/includes/perfmon_broadwellEP_events.txt
+++ b/src/includes/perfmon_broadwellEP_events.txt
@@ -4,13 +4,13 @@
 #
 #      Description:  Event list for Intel Broadwell EP/EN/EX.
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -29,16 +29,16 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
 UMASK_PWR_DRAM_ENERGY          0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
@@ -1315,6 +1315,9 @@ UMASK_REQUESTS_WRITES_REMOTE            0x08
 UMASK_REQUESTS_WRITES                   0x0C
 UMASK_REQUESTS_INVITOE_LOCAL            0x10
 UMASK_REQUESTS_INVITOE_REMOTE           0x20
+UMASK_REQUESTS_ALL_LOCAL                0x15
+UMASK_REQUESTS_ALL_REMOTE               0x2A
+UMASK_REQUESTS_ALL                      0x3F
 
 EVENT_RING_AD_USED                      0x3E BBOX
 UMASK_RING_AD_USED_CW_EVEN              0x01
@@ -1345,12 +1348,14 @@ UMASK_RPQ_CYCLES_NO_REG_CREDITS_CHN0    0x01
 UMASK_RPQ_CYCLES_NO_REG_CREDITS_CHN1    0x02
 UMASK_RPQ_CYCLES_NO_REG_CREDITS_CHN2    0x04
 UMASK_RPQ_CYCLES_NO_REG_CREDITS_CHN3    0x08
+UMASK_RPQ_CYCLES_NO_REG_CREDITS_ALL     0x0F
 
 EVENT_WPQ_CYCLES_NO_REG_CREDITS         0x18 BBOX
 UMASK_WPQ_CYCLES_NO_REG_CREDITS_CHN0    0x01
-UMASK_WPQ_CYCLES_NO_REG_CREDITS_CHN0    0x02
-UMASK_WPQ_CYCLES_NO_REG_CREDITS_CHN0    0x04
-UMASK_WPQ_CYCLES_NO_REG_CREDITS_CHN0    0x08
+UMASK_WPQ_CYCLES_NO_REG_CREDITS_CHN1    0x02
+UMASK_WPQ_CYCLES_NO_REG_CREDITS_CHN2    0x04
+UMASK_WPQ_CYCLES_NO_REG_CREDITS_CHN3    0x08
+UMASK_WPQ_CYCLES_NO_REG_CREDITS_ALL     0x0F
 
 EVENT_SBO0_CREDITS_ACQUIRED             0x68 BBOX
 UMASK_SBO0_CREDITS_ACQUIRED_AD          0x01
@@ -1436,12 +1441,17 @@ UMASK_TRACKER_OCCUPANCY_READS_LOCAL     0x04
 UMASK_TRACKER_OCCUPANCY_READS_REMOTE    0x08
 UMASK_TRACKER_OCCUPANCY_WRITES_LOCAL    0x10
 UMASK_TRACKER_OCCUPANCY_WRITES_REMOTE   0x20
+UMASK_TRACKER_OCCUPANCY_RW_LOCAL        0x14
+UMASK_TRACKER_OCCUPANCY_RW_REMOTE       0x28
 UMASK_TRACKER_OCCUPANCY_INVITOE_LOCAL   0x40
 UMASK_TRACKER_OCCUPANCY_INVITOE_REMOTE  0x80
+UMASK_TRACKER_OCCUPANCY_ALL_LOCAL       0x54
+UMASK_TRACKER_OCCUPANCY_ALL_REMOTE      0xA8
 
 EVENT_TRACKER_PENDING_OCCUPANCY         0x05 BBOX
 UMASK_TRACKER_PENDING_OCCUPANCY_LOCAL   0x01
 UMASK_TRACKER_PENDING_OCCUPANCY_REMOTE  0x02
+UMASK_TRACKER_PENDING_OCCUPANCY_ALL     0x03
 
 EVENT_TXR_AD_CYCLES_FULL                0x2A BBOX
 UMASK_TXR_AD_CYCLES_FULL_SCHED0         0x01
@@ -1755,6 +1765,10 @@ UMASK_RPQ_CYCLES_NE                     0x00
 EVENT_RPQ_INSERTS                       0x10 MBOX
 UMASK_RPQ_INSERTS                       0x00
 
+# Undocumented event, not mentioned in any documentation but working
+EVENT_RPQ_CYCLES_FULL                   0x12 MBOX
+UMASK_RPQ_CYCLES_FULL                   0x00
+
 EVENT_VMSE_MXB_WR_OCCUPANCY             0x91 MBOX
 UMASK_VMSE_MXB_WR_OCCUPANCY             0x00
 
diff --git a/src/includes/perfmon_broadwell_counters.h b/src/includes/perfmon_broadwell_counters.h
index a1a7528..d9f9d70 100644
--- a/src/includes/perfmon_broadwell_counters.h
+++ b/src/includes/perfmon_broadwell_counters.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Counter Header File of perfmon module for Broadwell.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_broadwell_events.txt b/src/includes/perfmon_broadwell_events.txt
index 7d78d7d..079fb32 100644
--- a/src/includes/perfmon_broadwell_events.txt
+++ b/src/includes/perfmon_broadwell_events.txt
@@ -4,13 +4,13 @@
 #
 #      Description:  Event list for Intel Broadwell
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -29,16 +29,16 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
 UMASK_PWR_DRAM_ENERGY          0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
diff --git a/src/includes/perfmon_broadwelld_counters.h b/src/includes/perfmon_broadwelld_counters.h
index a0aeb6e..4f71d23 100644
--- a/src/includes/perfmon_broadwelld_counters.h
+++ b/src/includes/perfmon_broadwelld_counters.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Counter Header File of perfmon module for Broadwell D.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_broadwelld_events.txt b/src/includes/perfmon_broadwelld_events.txt
index 1bdeb97..ccac199 100644
--- a/src/includes/perfmon_broadwelld_events.txt
+++ b/src/includes/perfmon_broadwelld_events.txt
@@ -4,13 +4,13 @@
 #
 #      Description:  Event list for Intel Broadwell D
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -29,16 +29,16 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
 UMASK_PWR_DRAM_ENERGY          0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
diff --git a/src/includes/perfmon_core2.h b/src/includes/perfmon_core2.h
index 2feea4a..0aee05a 100644
--- a/src/includes/perfmon_core2.h
+++ b/src/includes/perfmon_core2.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header file of perfmon module for Intel Core 2
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_core2_counters.h b/src/includes/perfmon_core2_counters.h
index 10d6a78..187e4bb 100644
--- a/src/includes/perfmon_core2_counters.h
+++ b/src/includes/perfmon_core2_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter header file of perfmon module for Intel Core 2
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_core2_events.txt b/src/includes/perfmon_core2_events.txt
index 42c1fc4..21f349f 100644
--- a/src/includes/perfmon_core2_events.txt
+++ b/src/includes/perfmon_core2_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Core 2
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_goldmont.h b/src/includes/perfmon_goldmont.h
index 4f69e76..2b284cd 100644
--- a/src/includes/perfmon_goldmont.h
+++ b/src/includes/perfmon_goldmont.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Goldmont.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -43,8 +43,8 @@ static int perfmon_numArchEventsGoldmont = NUM_ARCH_EVENTS_GOLDMONT;
 
 int perfmon_init_goldmont(int cpu_id)
 {
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     return 0;
 }
@@ -163,7 +163,7 @@ int perfmon_setupCounterThread_goldmont(
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -221,7 +221,7 @@ int perfmon_startCountersThread_goldmont(int thread_id, PerfmonEventSet* eventSe
     uint64_t tmp = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -313,7 +313,7 @@ int perfmon_stopCountersThread_goldmont(int thread_id, PerfmonEventSet* eventSet
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -392,7 +392,7 @@ int perfmon_readCountersThread_goldmont(int thread_id, PerfmonEventSet* eventSet
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -474,11 +474,11 @@ int perfmon_finalizeCountersThread_goldmont(int thread_id, PerfmonEventSet* even
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_goldmont_counters.h b/src/includes/perfmon_goldmont_counters.h
index 374a6a7..2f22835 100644
--- a/src/includes/perfmon_goldmont_counters.h
+++ b/src/includes/perfmon_goldmont_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter Header File of perfmon module for Intel Goldmont.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_goldmont_events.txt b/src/includes/perfmon_goldmont_events.txt
index 439b151..378bbff 100644
--- a/src/includes/perfmon_goldmont_events.txt
+++ b/src/includes/perfmon_goldmont_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Goldmont
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -30,16 +30,16 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
 UMASK_PWR_DRAM_ENERGY          0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
diff --git a/src/includes/perfmon_haswell.h b/src/includes/perfmon_haswell.h
index 5039c83..e0e5969 100644
--- a/src/includes/perfmon_haswell.h
+++ b/src/includes/perfmon_haswell.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Haswell.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -61,8 +61,8 @@ int perfmon_init_haswell(int cpu_id)
 {
     int ret;
     uint64_t data;
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     
     if (cpuid_info.model == HASWELL_EP)
@@ -71,7 +71,7 @@ int perfmon_init_haswell(int cpu_id)
         has_did_cbox_check = 1;
     }
     else if ((cpuid_info.model == HASWELL || cpuid_info.model == HASWELL_M1 || cpuid_info.model == HASWELL_M1) &&
-             socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id &&
+             socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id &&
              has_did_cbox_check == 0)
     {
         ret = HPMwrite(cpu_id, MSR_DEV, MSR_UNC_CBO_0_PERFEVTSEL0, 0x0ULL);
@@ -199,7 +199,7 @@ int has_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     int j;
     uint64_t flags = 0x0ULL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -241,7 +241,7 @@ int hasep_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint32_t filter1 = box_map[counter_map[index].type].filterRegister2;
     int set_state_all = 0;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -323,7 +323,7 @@ int hasep_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -366,7 +366,7 @@ int hasep_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int clean_filter_reg = 1;
     uint64_t filter = box_map[counter_map[index].type].filterRegister1;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -439,7 +439,7 @@ int hasep_bbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int match_flag = 0;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -519,7 +519,7 @@ int hasep_sbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -572,7 +572,7 @@ int hasep_mbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -622,7 +622,7 @@ int hasep_ibox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -673,7 +673,7 @@ int hasep_pbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -723,7 +723,7 @@ int hasep_rbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -775,7 +775,7 @@ int hasep_qbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event, PciDe
     uint64_t filterval = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -1039,7 +1039,7 @@ int perfmon_setupCounterThread_haswell(
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1204,7 +1204,7 @@ int perfmon_startCountersThread_haswell(int thread_id, PerfmonEventSet* eventSet
     uint64_t tmp = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1299,7 +1299,7 @@ int has_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
     PciDeviceIndex dev = counter_map[index].device;
     uint64_t counter1 = counter_map[index].counterRegister;
     uint64_t counter2 = counter_map[index].counterRegister2;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -1339,7 +1339,7 @@ int has_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
                                            global_status_reg,
                                            &ovf_values));
             VERBOSEPRINTREG(cpu_id, global_status_reg, LLU_CAST ovf_values, READ_GLOBAL_OVFL);
-            if (ovf_values & (1<<global_offset))
+            if (ovf_values & (1ULL<<global_offset))
             {
                 VERBOSEPRINTREG(cpu_id, global_status_reg, LLU_CAST (1<<global_offset), CLEAR_GLOBAL_OVFL);
                 CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV,
@@ -1360,7 +1360,7 @@ int has_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
                                               box_map[type].statusRegister,
                                               &ovf_values));
             VERBOSEPRINTPCIREG(cpu_id, dev, box_map[type].statusRegister, LLU_CAST ovf_values, READ_BOX_OVFL);
-            if (ovf_values & (1<<box_offset))
+            if (ovf_values & (1ULL<<box_offset))
             {
                 (*overflows)++;
                 VERBOSEPRINTPCIREG(cpu_id, dev, box_map[type].statusRegister, LLU_CAST (1<<box_offset), RESET_BOX_OVFL);
@@ -1406,7 +1406,7 @@ int perfmon_stopCountersThread_haswell(int thread_id, PerfmonEventSet* eventSet)
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1621,7 +1621,7 @@ int perfmon_readCountersThread_haswell(int thread_id, PerfmonEventSet* eventSet)
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1845,11 +1845,11 @@ int perfmon_finalizeCountersThread_haswell(int thread_id, PerfmonEventSet* event
     uint64_t ovf_values_uncore = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_haswellEP_counters.h b/src/includes/perfmon_haswellEP_counters.h
index aa64010..df38bac 100644
--- a/src/includes/perfmon_haswellEP_counters.h
+++ b/src/includes/perfmon_haswellEP_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter Header File of perfmon module for Intel Haswell EP/EN/EX.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -314,22 +314,69 @@ static PciDevice haswellEP_pci_devices[MAX_NUM_PCI_DEVICES] = {
  [PCI_R3QPI_DEVICE_LINK_0] = {R3QPI, "0b.1", "PCI_R3QPI_DEVICE_LINK_0", "RBOX0", 0x2F36},
  [PCI_R3QPI_DEVICE_LINK_1] = {R3QPI, "0b.2", "PCI_R3QPI_DEVICE_LINK_1", "RBOX1", 0x2F37},
  [PCI_R2PCIE_DEVICE] = {R2PCIE, "10.1", "PCI_R2PCIE_DEVICE", "PBOX0", 0x2F34},
- [PCI_IMC_DEVICE_0_CH_0] = {IMC, "14.0", "PCI_IMC_DEVICE_0_CH_0", "MBOX0", 0x2FB4},
- [PCI_IMC_DEVICE_0_CH_1] = {IMC, "14.1", "PCI_IMC_DEVICE_0_CH_1", "MBOX1", 0x2FB5},
- [PCI_IMC_DEVICE_0_CH_2] = {IMC, "15.0", "PCI_IMC_DEVICE_0_CH_2", "MBOX2", 0x2FB0},
- [PCI_IMC_DEVICE_0_CH_3] = {IMC, "15.1", "PCI_IMC_DEVICE_0_CH_3", "MBOX3", 0x2FB1},
+ [PCI_IMC_DEVICE_0_CH_0] = {IMC, "14.0", "PCI_IMC_DEVICE_0_CH_0", "MBOX0", 0x2FB0},
+ [PCI_IMC_DEVICE_0_CH_1] = {IMC, "14.1", "PCI_IMC_DEVICE_0_CH_1", "MBOX1", 0x2FB1},
+ [PCI_IMC_DEVICE_0_CH_2] = {IMC, "15.0", "PCI_IMC_DEVICE_0_CH_2", "MBOX2", 0x2FB4},
+ [PCI_IMC_DEVICE_0_CH_3] = {IMC, "15.1", "PCI_IMC_DEVICE_0_CH_3", "MBOX3", 0x2FB5},
  [PCI_HA_DEVICE_0] = {HA, "12.1", "PCI_HA_DEVICE_0", "BBOX0", 0x2F30},
  [PCI_HA_DEVICE_1] = {HA, "12.5", "PCI_HA_DEVICE_1", "BBOX1", 0x2F38},
- [PCI_IMC_DEVICE_1_CH_0] = {IMC, "17.0", "PCI_IMC_DEVICE_1_CH_0", "MBOX4", 0x2FD4},
- [PCI_IMC_DEVICE_1_CH_1] = {IMC, "17.1", "PCI_IMC_DEVICE_1_CH_1", "MBOX5", 0x2FD5},
- [PCI_IMC_DEVICE_1_CH_2] = {IMC, "18.0", "PCI_IMC_DEVICE_1_CH_2", "MBOX6", 0x2FD0},
- [PCI_IMC_DEVICE_1_CH_3] = {IMC, "18.1", "PCI_IMC_DEVICE_1_CH_3", "MBOX7", 0x2FD1},
+ [PCI_IMC_DEVICE_1_CH_0] = {IMC, "17.0", "PCI_IMC_DEVICE_1_CH_0", "MBOX4", 0x2FD0},
+ [PCI_IMC_DEVICE_1_CH_1] = {IMC, "17.1", "PCI_IMC_DEVICE_1_CH_1", "MBOX5", 0x2FD1},
+ [PCI_IMC_DEVICE_1_CH_2] = {IMC, "18.0", "PCI_IMC_DEVICE_1_CH_2", "MBOX6", 0x2FD4},
+ [PCI_IMC_DEVICE_1_CH_3] = {IMC, "18.1", "PCI_IMC_DEVICE_1_CH_3", "MBOX7", 0x2FD5},
  [PCI_IRP_DEVICE] = {IRP, "05.6", "PCI_IRP_DEVICE", "IBOX", 0x2F39},
  [PCI_QPI_DEVICE_PORT_0] = {QPI, "08.2", "PCI_QPI_DEVICE_PORT_0", "QBOX0", 0x2F32},
  [PCI_QPI_DEVICE_PORT_1] = {QPI, "09.2", "PCI_QPI_DEVICE_PORT_1", "QBOX1", 0x2F33},
  [PCI_QPI_MASK_DEVICE_PORT_0] = {QPI, "08.6", "PCI_QPI_MASK_DEVICE_PORT_0", NULL, 0x2F86},
  [PCI_QPI_MASK_DEVICE_PORT_1] = {QPI, "09.6", "PCI_QPI_MASK_DEVICE_PORT_1", NULL, 0x2F96},
  [PCI_QPI_MISC_DEVICE_PORT_0] = {QPI, "08.0", "PCI_QPI_MISC_DEVICE_PORT_0", "QBOX0FIX", 0x2F80},
- [PCI_QPI_MISC_DEVICE_PORT_1] = {QPI, "08.0", "PCI_QPI_MISC_DEVICE_PORT_1", "QBOX1FIX", 0x2F80},
+ [PCI_QPI_MISC_DEVICE_PORT_1] = {QPI, "09.0", "PCI_QPI_MISC_DEVICE_PORT_1", "QBOX1FIX", 0x2F90},
 };
 
+static char* haswellEP_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [POWER] = "/sys/bus/event_source/devices/power",
+    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc_0",
+    [MBOX1] = "/sys/bus/event_source/devices/uncore_imc_1",
+    [MBOX2] = "/sys/bus/event_source/devices/uncore_imc_2",
+    [MBOX3] = "/sys/bus/event_source/devices/uncore_imc_3",
+    [MBOX4] = "/sys/bus/event_source/devices/uncore_imc_4",
+    [MBOX5] = "/sys/bus/event_source/devices/uncore_imc_5",
+    [MBOX6] = "/sys/bus/event_source/devices/uncore_imc_6",
+    [MBOX7] = "/sys/bus/event_source/devices/uncore_imc_7",
+    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
+    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
+    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
+    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
+    [CBOX4] = "/sys/bus/event_source/devices/uncore_cbox_4",
+    [CBOX5] = "/sys/bus/event_source/devices/uncore_cbox_5",
+    [CBOX6] = "/sys/bus/event_source/devices/uncore_cbox_6",
+    [CBOX7] = "/sys/bus/event_source/devices/uncore_cbox_7",
+    [CBOX8] = "/sys/bus/event_source/devices/uncore_cbox_8",
+    [CBOX9] = "/sys/bus/event_source/devices/uncore_cbox_9",
+    [CBOX10] = "/sys/bus/event_source/devices/uncore_cbox_10",
+    [CBOX11] = "/sys/bus/event_source/devices/uncore_cbox_11",
+    [CBOX12] = "/sys/bus/event_source/devices/uncore_cbox_12",
+    [CBOX13] = "/sys/bus/event_source/devices/uncore_cbox_13",
+    [CBOX14] = "/sys/bus/event_source/devices/uncore_cbox_14",
+    [CBOX15] = "/sys/bus/event_source/devices/uncore_cbox_15",
+    [CBOX16] = "/sys/bus/event_source/devices/uncore_cbox_16",
+    [CBOX17] = "/sys/bus/event_source/devices/uncore_cbox_17",
+    [BBOX0] = "/sys/bus/event_source/devices/uncore_ha_0",
+    [BBOX1] = "/sys/bus/event_source/devices/uncore_ha_1",
+    [WBOX] = "/sys/bus/event_source/devices/uncore_pcu",
+    [QBOX0] = "/sys/bus/event_source/devices/uncore_qpi_0",
+    [QBOX1] = "/sys/bus/event_source/devices/uncore_qpi_1",
+    [QBOX2] = "/sys/bus/event_source/devices/uncore_qpi_2",
+    [SBOX0] = "/sys/bus/event_source/devices/uncore_sbox_0",
+    [SBOX1] = "/sys/bus/event_source/devices/uncore_sbox_1",
+    [SBOX2] = "/sys/bus/event_source/devices/uncore_sbox_2",
+    [SBOX3] = "/sys/bus/event_source/devices/uncore_sbox_3",
+    [PBOX] = "/sys/bus/event_source/devices/uncore_r2pcie",
+    [RBOX0] = "/sys/bus/event_source/devices/uncore_r3qpi_0",
+    [RBOX1] = "/sys/bus/event_source/devices/uncore_r3qpi_1",
+    [RBOX2] = "/sys/bus/event_source/devices/uncore_r3qpi_2",
+    [UBOX] = "/sys/bus/event_source/devices/uncore_ubox",
+    [IBOX0] = "/sys/bus/event_source/devices/uncore_irp",
+};
diff --git a/src/includes/perfmon_haswellEP_events.txt b/src/includes/perfmon_haswellEP_events.txt
index 1968f92..7292d2b 100644
--- a/src/includes/perfmon_haswellEP_events.txt
+++ b/src/includes/perfmon_haswellEP_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Haswell EP/EN/EX
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -30,16 +30,16 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
 UMASK_PWR_DRAM_ENERGY          0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
diff --git a/src/includes/perfmon_haswell_counters.h b/src/includes/perfmon_haswell_counters.h
index cf1aee8..2d6f835 100644
--- a/src/includes/perfmon_haswell_counters.h
+++ b/src/includes/perfmon_haswell_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter Header File of perfmon module for Intel Haswell.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_haswell_events.txt b/src/includes/perfmon_haswell_events.txt
index fd59b8e..4dafe35 100644
--- a/src/includes/perfmon_haswell_events.txt
+++ b/src/includes/perfmon_haswell_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Haswell
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -30,16 +30,16 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
 UMASK_PWR_DRAM_ENERGY          0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
diff --git a/src/includes/perfmon_interlagos.h b/src/includes/perfmon_interlagos.h
index a11b8e8..12cbe36 100644
--- a/src/includes/perfmon_interlagos.h
+++ b/src/includes/perfmon_interlagos.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header file of perfmon module for AMD Interlagos
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -39,7 +39,7 @@ static int perfmon_numArchEventsInterlagos = NUM_ARCH_EVENTS_INTERLAGOS;
 
 int perfmon_init_interlagos(int cpu_id)
 {
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
     return 0;
 }
 
@@ -89,7 +89,7 @@ int ilg_uncore_setup(int cpu_id, RegisterIndex index, PerfmonEvent* event)
 {
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -110,7 +110,7 @@ int perfmon_setupCounterThread_interlagos(int thread_id, PerfmonEventSet* eventS
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -147,7 +147,7 @@ int perfmon_startCountersThread_interlagos(int thread_id, PerfmonEventSet* event
     uint64_t flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -185,7 +185,7 @@ int perfmon_stopCountersThread_interlagos(int thread_id, PerfmonEventSet* eventS
     uint64_t tmp;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -236,7 +236,7 @@ int perfmon_readCountersThread_interlagos(int thread_id, PerfmonEventSet* eventS
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t tmp;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -278,7 +278,7 @@ int perfmon_finalizeCountersThread_interlagos(int thread_id, PerfmonEventSet* ev
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
diff --git a/src/includes/perfmon_interlagos_counters.h b/src/includes/perfmon_interlagos_counters.h
index 08c4cce..deddcc6 100644
--- a/src/includes/perfmon_interlagos_counters.h
+++ b/src/includes/perfmon_interlagos_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter Header File of perfmon module for AMD Interlagos
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_interlagos_events.txt b/src/includes/perfmon_interlagos_events.txt
index c94ea02..6a4fb37 100644
--- a/src/includes/perfmon_interlagos_events.txt
+++ b/src/includes/perfmon_interlagos_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for AMD Interlagos
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_ivybridge.h b/src/includes/perfmon_ivybridge.h
index c4a354b..b275dfe 100644
--- a/src/includes/perfmon_ivybridge.h
+++ b/src/includes/perfmon_ivybridge.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Ivy Bridge.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -60,8 +60,8 @@ int perfmon_init_ivybridge(int cpu_id)
 {
     int ret;
     uint64_t data = 0x0ULL;
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
     HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL);
     if ((cpuid_info.model == IVYBRIDGE_EP))
     {
@@ -69,7 +69,7 @@ int perfmon_init_ivybridge(int cpu_id)
         ivb_did_cbox_test = 1;
     }
     else if (cpuid_info.model == IVYBRIDGE &&
-             socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id &&
+             socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id &&
              ivb_did_cbox_test == 0)
     {
         ret = HPMwrite(cpu_id, MSR_DEV, MSR_UNC_CBO_0_PERFEVTSEL0, 0x0ULL);
@@ -190,7 +190,7 @@ int ivb_bbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t filter = 0x0UL;
     uint32_t reg = counter_map[index].configRegister;
     PciDeviceIndex dev = counter_map[index].device;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -242,7 +242,7 @@ int ivb_bbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 int ivb_pci_box_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint64_t flags = 0x0UL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -283,7 +283,7 @@ int ivb_pci_box_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 int ivb_mboxfix_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint64_t flags = 0x0ULL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -308,7 +308,7 @@ int ivb_sbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event, PciDevi
     uint64_t flags = 0x0UL;
     uint32_t filterreg = 0x0U;
     uint64_t filterval = 0x0ULL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -405,7 +405,7 @@ int ivb_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint32_t flags = 0x0UL;
     uint64_t mask = 0x0ULL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -442,7 +442,7 @@ int ivbep_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint32_t flags = 0x0UL;
     uint64_t mask = 0x0ULL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -519,7 +519,7 @@ int ivbep_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 int ivb_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint32_t flags = 0x0UL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -564,7 +564,7 @@ int ivb_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 int ivb_uboxfix_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint32_t flags = 0x0UL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -581,7 +581,7 @@ int ivb_uboxfix_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 int ivb_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint32_t flags = 0x0UL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -638,7 +638,7 @@ int ivb_ibox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     uint32_t flags = 0x0UL;
     PciDeviceIndex dev = counter_map[index].device;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -690,7 +690,7 @@ int ivb_uncore_freeze(int cpu_id, PerfmonEventSet* eventSet)
     {
         return 0;
     }
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -720,7 +720,7 @@ int ivb_uncore_unfreeze(int cpu_id, PerfmonEventSet* eventSet)
     {
         return 0;
     }
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -743,7 +743,7 @@ int perfmon_setupCounterThread_ivybridge(
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -793,7 +793,7 @@ int perfmon_setupCounterThread_ivybridge(
             case RBOX0:
             case RBOX1:
                 ivb_pci_box_setup(cpu_id, index, event);
-                
+
                 break;
 
             case BBOX0:
@@ -884,7 +884,7 @@ int perfmon_startCountersThread_ivybridge(int thread_id, PerfmonEventSet* eventS
     uint64_t tmp = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -974,7 +974,7 @@ uint64_t ivb_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event, i
     uint64_t counter1 = counter_map[index].counterRegister;
     uint64_t counter2 = counter_map[index].counterRegister2;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return result;
     }
@@ -1024,7 +1024,7 @@ int ivb_uncore_overflow(int cpu_id, RegisterIndex index, PerfmonEvent *event,
             CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV,
                                            MSR_UNC_U_PMON_GLOBAL_STATUS,
                                            &ovf_values));
-            if (ovf_values & (1<<global_offset))
+            if (ovf_values & (1ULL<<global_offset))
             {
                 CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV,
                                                  MSR_UNC_U_PMON_GLOBAL_STATUS,
@@ -1052,7 +1052,7 @@ int ivb_uncore_overflow(int cpu_id, RegisterIndex index, PerfmonEvent *event,
                                               box_map[type].statusRegister,
                                               &ovf_values));
             }
-            if (ovf_values & (1<<box_offset))
+            if (ovf_values & (1ULL<<box_offset))
             {
                 (*overflows)++;
                 if (ivybridge_box_map[type].isPci)
@@ -1078,7 +1078,7 @@ int perfmon_stopCountersThread_ivybridge(int thread_id, PerfmonEventSet* eventSe
     uint64_t counter_result = 0x0ULL;
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1144,10 +1144,12 @@ int perfmon_stopCountersThread_ivybridge(int thread_id, PerfmonEventSet* eventSe
                     {
                         CHECK_POWER_READ_ERROR(power_read(cpu_id, counter1, (uint32_t*)&counter_result));
                         VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, STOP_POWER)
-                        if (counter_result < *current)
+                        if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
                         {
-                            (*overflows)++;
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
+                            eventSet->events[i].threadCounter[thread_id].overflows++;
                         }
+                        *current = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
 
@@ -1285,7 +1287,7 @@ int perfmon_readCountersThread_ivybridge(int thread_id, PerfmonEventSet* eventSe
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1349,11 +1351,13 @@ int perfmon_readCountersThread_ivybridge(int thread_id, PerfmonEventSet* eventSe
                     if (haveLock)
                     {
                         CHECK_POWER_READ_ERROR(power_read(cpu_id, counter1, (uint32_t*)&counter_result));
-                        VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, STOP_POWER)
-                        if (counter_result < *current)
+                        VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_POWER)
+                        if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
                         {
-                            (*overflows)++;
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
+                            eventSet->events[i].threadCounter[thread_id].overflows++;
                         }
+                        *current = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
 
@@ -1430,6 +1434,17 @@ int perfmon_readCountersThread_ivybridge(int thread_id, PerfmonEventSet* eventSe
                     ivb_uncore_overflow(cpu_id, index, event, overflows, counter_result,
                                         *current, box_map[type].ovflOffset, 0);
                     break;
+                case WBOX0FIX:
+                case WBOX1FIX:
+                    if (haveLock)
+                    {
+                        CHECK_PCI_READ_ERROR(HPMread(cpu_id, dev, counter1, &counter_result));
+                        if (counter_result < *current)
+                        {
+                            (*overflows)++;
+                        }
+                    }
+                    break;
 
                 case IBOX1:
                     counter_result = ivb_uncore_read(cpu_id, index, event, FREEZE_FLAG_ONLYFREEZE);
@@ -1498,11 +1513,11 @@ int perfmon_finalizeCountersThread_ivybridge(int thread_id, PerfmonEventSet* eve
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_ivybridgeEP_counters.h b/src/includes/perfmon_ivybridgeEP_counters.h
index 5f8e77b..43cd9e2 100644
--- a/src/includes/perfmon_ivybridgeEP_counters.h
+++ b/src/includes/perfmon_ivybridgeEP_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter header file of perfmon module for Intel Ivy Bridge EP.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -312,10 +312,51 @@ static PciDevice ivybridgeEP_pci_devices[MAX_NUM_PCI_DEVICES] = {
  [PCI_IRP_DEVICE] = {IRP, "05.6", "PCI_IRP_DEVICE", NULL, 0x0e39},
  [PCI_QPI_DEVICE_PORT_0] = {QPI, "08.2", "PCI_QPI_DEVICE_PORT_0", "SBOX0", 0x0e32},
  [PCI_QPI_DEVICE_PORT_1] = {QPI, "09.2", "PCI_QPI_DEVICE_PORT_1", "SBOX1", 0x0e33},
- [PCI_QPI_DEVICE_PORT_2] = {QPI, "0a.2", "PCI_QPI_DEVICE_PORT_2", "SBOX2", 0x0e3a},
+ [PCI_QPI_DEVICE_PORT_2] = {QPI, "0a.2", "PCI_QPI_DEVICE_PORT_2", "SBOX2", 0x0ec2},
  [PCI_QPI_MASK_DEVICE_PORT_0] = {QPI, "08.6", "PCI_QPI_MASK_DEVICE_PORT_0", NULL, 0x0e86},
  [PCI_QPI_MASK_DEVICE_PORT_1] = {QPI, "09.6", "PCI_QPI_MASK_DEVICE_PORT_1", NULL, 0x0e96},
  [PCI_QPI_MASK_DEVICE_PORT_2] = {QPI, "0a.6", "PCI_QPI_MASK_DEVICE_PORT_2", NULL, 0x0ec6},
  [PCI_QPI_MISC_DEVICE_PORT_0] = {QPI, "08.0", "PCI_QPI_MISC_DEVICE_PORT_0/1", "SBOX01FIX",0x0e80},
  [PCI_QPI_MISC_DEVICE_PORT_2] = {QPI, "0a.0", "PCI_QPI_MISC_DEVICE_PORT_2", "SBOX2FIX", 0x0ec0},
 };
+
+
+static char* ivybridgeEP_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [POWER] = "/sys/bus/event_source/devices/power",
+    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc_0",
+    [MBOX1] = "/sys/bus/event_source/devices/uncore_imc_1",
+    [MBOX2] = "/sys/bus/event_source/devices/uncore_imc_2",
+    [MBOX3] = "/sys/bus/event_source/devices/uncore_imc_3",
+    [MBOX4] = "/sys/bus/event_source/devices/uncore_imc_4",
+    [MBOX5] = "/sys/bus/event_source/devices/uncore_imc_5",
+    [MBOX6] = "/sys/bus/event_source/devices/uncore_imc_6",
+    [MBOX7] = "/sys/bus/event_source/devices/uncore_imc_7",
+    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
+    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
+    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
+    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
+    [CBOX4] = "/sys/bus/event_source/devices/uncore_cbox_4",
+    [CBOX5] = "/sys/bus/event_source/devices/uncore_cbox_5",
+    [CBOX6] = "/sys/bus/event_source/devices/uncore_cbox_6",
+    [CBOX7] = "/sys/bus/event_source/devices/uncore_cbox_7",
+    [CBOX8] = "/sys/bus/event_source/devices/uncore_cbox_8",
+    [CBOX9] = "/sys/bus/event_source/devices/uncore_cbox_9",
+    [CBOX10] = "/sys/bus/event_source/devices/uncore_cbox_10",
+    [CBOX11] = "/sys/bus/event_source/devices/uncore_cbox_11",
+    [CBOX12] = "/sys/bus/event_source/devices/uncore_cbox_12",
+    [CBOX13] = "/sys/bus/event_source/devices/uncore_cbox_13",
+    [CBOX14] = "/sys/bus/event_source/devices/uncore_cbox_14",
+    [BBOX0] = "/sys/bus/event_source/devices/uncore_ha_0",
+    [BBOX1] = "/sys/bus/event_source/devices/uncore_ha_1",
+    [WBOX] = "/sys/bus/event_source/devices/uncore_pcu",
+    [SBOX0] = "/sys/bus/event_source/devices/uncore_qpi_0",
+    [SBOX1] = "/sys/bus/event_source/devices/uncore_qpi_1",
+    [SBOX2] = "/sys/bus/event_source/devices/uncore_qpi_2",
+    [PBOX] = "/sys/bus/event_source/devices/uncore_r2pcie",
+    [RBOX0] = "/sys/bus/event_source/devices/uncore_r3qpi_0",
+    [RBOX1] = "/sys/bus/event_source/devices/uncore_r3qpi_1",
+    [UBOX] = "/sys/bus/event_source/devices/uncore_ubox",
+    [IBOX0] = "/sys/bus/event_source/devices/uncore_irp",
+};
diff --git a/src/includes/perfmon_ivybridgeEP_events.txt b/src/includes/perfmon_ivybridgeEP_events.txt
index 92f5a6f..1b9a889 100644
--- a/src/includes/perfmon_ivybridgeEP_events.txt
+++ b/src/includes/perfmon_ivybridgeEP_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Ivy Bridge EP/EN/EX
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -29,15 +29,19 @@
 
 EVENT_TEMP_CORE               0x00   TMP0
 UMASK_TEMP_CORE               0x00
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY         0x00   PWR3
+EVENT_PWR_DRAM_ENERGY         0x03   PWR3
 UMASK_PWR_DRAM_ENERGY         0x00
 
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
+UMASK_PWR_PP1_ENERGY          0x00
+
 EVENT_INSTR_RETIRED           0x00   FIXC0
 UMASK_INSTR_RETIRED_ANY       0x00
 
diff --git a/src/includes/perfmon_ivybridge_counters.h b/src/includes/perfmon_ivybridge_counters.h
index 79d09f1..8ba2438 100644
--- a/src/includes/perfmon_ivybridge_counters.h
+++ b/src/includes/perfmon_ivybridge_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter header file of perfmon module for Intel Ivy Bridge.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_ivybridge_events.txt b/src/includes/perfmon_ivybridge_events.txt
index a05bf05..bf43d77 100644
--- a/src/includes/perfmon_ivybridge_events.txt
+++ b/src/includes/perfmon_ivybridge_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Ivy Bridge
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -30,16 +30,16 @@
 EVENT_TEMP_CORE               0x00   TMP0
 UMASK_TEMP_CORE               0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY         0x00   PWR3
+EVENT_PWR_DRAM_ENERGY         0x03   PWR3
 UMASK_PWR_DRAM_ENERGY         0x00
 
 EVENT_INSTR_RETIRED           0x00   FIXC0
diff --git a/src/includes/perfmon_k10.h b/src/includes/perfmon_k10.h
index a713768..75d88cf 100644
--- a/src/includes/perfmon_k10.h
+++ b/src/includes/perfmon_k10.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header file of perfmon module for AMD K10
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_k10_counters.h b/src/includes/perfmon_k10_counters.h
index 30b32eb..a1c51dd 100644
--- a/src/includes/perfmon_k10_counters.h
+++ b/src/includes/perfmon_k10_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  AMD K10 performance counter definition. Also used for AMD K8.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_k10_events.txt b/src/includes/perfmon_k10_events.txt
index 62465b0..9551507 100644
--- a/src/includes/perfmon_k10_events.txt
+++ b/src/includes/perfmon_k10_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for AMD K10
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_k8.h b/src/includes/perfmon_k8.h
index 753e520..e90df79 100644
--- a/src/includes/perfmon_k8.h
+++ b/src/includes/perfmon_k8.h
@@ -6,14 +6,14 @@
  *      Description:  Header File of perfmon module for AMD K8 support.
  *                    The setup routines and registers are similar to AMD K10
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_k8_events.txt b/src/includes/perfmon_k8_events.txt
index 6b86346..e8eb0ed 100644
--- a/src/includes/perfmon_k8_events.txt
+++ b/src/includes/perfmon_k8_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for AMD K8
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_kabini.h b/src/includes/perfmon_kabini.h
index 7aac840..37b47a9 100644
--- a/src/includes/perfmon_kabini.h
+++ b/src/includes/perfmon_kabini.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header file of perfmon module for AMD Family 16
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -39,8 +39,8 @@ static int perfmon_numArchEventsKabini = NUM_ARCH_EVENTS_KABINI;
 
 int perfmon_init_kabini(int cpu_id)
 {
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
     return 0;
 }
 
@@ -91,7 +91,7 @@ int k16_uncore_setup(int cpu_id, RegisterIndex index, PerfmonEvent* event)
 {
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -110,7 +110,7 @@ int k16_cache_setup(int cpu_id, RegisterIndex index, PerfmonEvent* event)
 {
     uint64_t flags = 0x0ULL;
 
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] != cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -191,11 +191,11 @@ int perfmon_startCountersThread_kabini(int thread_id, PerfmonEventSet* eventSet)
     uint64_t flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveSLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTLock = 1;
     }
@@ -236,11 +236,11 @@ int perfmon_stopCountersThread_kabini(int thread_id, PerfmonEventSet* eventSet)
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveSLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTLock = 1;
     }
@@ -285,11 +285,11 @@ int perfmon_readCountersThread_kabini(int thread_id, PerfmonEventSet* eventSet)
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveSLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTLock = 1;
     }
@@ -331,11 +331,11 @@ int perfmon_finalizeCountersThread_kabini(int thread_id, PerfmonEventSet* eventS
     int haveTLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveSLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTLock = 1;
     }
diff --git a/src/includes/perfmon_kabini_counters.h b/src/includes/perfmon_kabini_counters.h
index fdfeb2f..0433c78 100644
--- a/src/includes/perfmon_kabini_counters.h
+++ b/src/includes/perfmon_kabini_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter Header File of perfmon module for AMD Family 16
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_kabini_events.txt b/src/includes/perfmon_kabini_events.txt
index 68775c4..c0f99fc 100644
--- a/src/includes/perfmon_kabini_events.txt
+++ b/src/includes/perfmon_kabini_events.txt
@@ -4,13 +4,13 @@
 #
 #      Description:  Event list for AMD Kabini
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   saravanan.ekanathan at amd.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -386,7 +386,6 @@ UMASK_UNC_MEMORY_CONTROLLER_BYPASS_COUNTER_SATURATION_DCQ_SATURATED_DCT5
 UMASK_UNC_MEMORY_CONTROLLER_BYPASS_COUNTER_SATURATION_DCQ_SATURATED_DCT6         0x38
 UMASK_UNC_MEMORY_CONTROLLER_BYPASS_COUNTER_SATURATION_DCQ_SATURATED_DCT7         0x3C
 
-
 EVENT_UNC_THERMAL_STATUS    0x0E8     UPMC
 UMASK_UNC_THERMAL_STATUS_HTC_TRIP_POINT_CROSSED  0x04
 UMASK_UNC_THERMAL_STATUS_HTCP_INACTIVE           0x20
diff --git a/src/includes/perfmon_knl.h b/src/includes/perfmon_knl.h
index a609a95..90a6322 100644
--- a/src/includes/perfmon_knl.h
+++ b/src/includes/perfmon_knl.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file of perfmon module for Intel Xeon Phi (Knights Landing)
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -38,8 +38,8 @@ static int perfmon_numArchEventsKNL = NUM_ARCH_EVENTS_KNL;
 
 int perfmon_init_knl(int cpu_id)
 {
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     return 0;
 }
@@ -72,6 +72,10 @@ int knl_pmc_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     uint64_t offcore_flags = 0x0ULL;
 
+    if (event->eventId == 0xB7 && tile_lock[affinity_thread2core_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
 
     flags |= (1ULL<<16)|(1ULL<<22);
     flags |= (event->umask<<8) + event->eventId;
@@ -201,7 +205,7 @@ int knl_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -262,7 +266,7 @@ int knl_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int set_opcode_all = 0;
     int set_match1_all = 1;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -379,7 +383,7 @@ int knl_mbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -431,7 +435,7 @@ int perfmon_setupCountersThread_knl(
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -663,7 +667,7 @@ int perfmon_startCountersThread_knl(int thread_id, PerfmonEventSet* eventSet)
     uint64_t flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -763,7 +767,7 @@ int knl_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
     PciDeviceIndex dev = counter_map[index].device;
     uint64_t counter1 = counter_map[index].counterRegister;
     uint64_t counter2 = counter_map[index].counterRegister2;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -856,7 +860,7 @@ int perfmon_stopCountersThread_knl(int thread_id, PerfmonEventSet* eventSet)
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1042,7 +1046,7 @@ int perfmon_readCountersThread_knl(int thread_id, PerfmonEventSet* eventSet)
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1226,11 +1230,11 @@ int perfmon_finalizeCountersThread_knl(int thread_id, PerfmonEventSet* eventSet)
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    /*if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    /*if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }*/
diff --git a/src/includes/perfmon_knl_counters.h b/src/includes/perfmon_knl_counters.h
index 530bf09..343ccf3 100644
--- a/src/includes/perfmon_knl_counters.h
+++ b/src/includes/perfmon_knl_counters.h
@@ -5,13 +5,13 @@
  *
  *      Description: Counter header file of perfmon module for Intel Atom (Silvermont)
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -446,30 +446,102 @@ static BoxMap knl_box_map[NUM_UNITS] = {
 
 static PciDevice knl_pci_devices[MAX_NUM_PCI_DEVICES] = {
  [MSR_DEV] = {NODEVTYPE, "", "", ""},
- [PCI_IMC_DEVICE_0_CH_0] = {IMC, "08.2", "PCI_IMC_DEVICE_CH_0", "MBOX0", 0x3cb0},
- [PCI_IMC_DEVICE_0_CH_1] = {IMC, "08.3", "PCI_IMC_DEVICE_CH_0", "MBOX1", 0x3cb0},
- [PCI_IMC_DEVICE_0_CH_2] = {IMC, "08.4", "PCI_IMC_DEVICE_CH_0", "MBOX2", 0x3cb0},
- [PCI_IMC_DEVICE_0_CH_3] = {IMC, "0a.0", "PCI_IMC_DEVICE_CH_0", "MBOX3", 0x3cb0},
- [PCI_IMC_DEVICE_1_CH_0] = {IMC, "09.2", "PCI_IMC_DEVICE_CH_1", "MBOX4", 0x3cb0},
- [PCI_IMC_DEVICE_1_CH_1] = {IMC, "09.3", "PCI_IMC_DEVICE_CH_1", "MBOX5", 0x3cb0},
- [PCI_IMC_DEVICE_1_CH_2] = {IMC, "09.4", "PCI_IMC_DEVICE_CH_1", "MBOX6", 0x3cb0},
- [PCI_IMC_DEVICE_1_CH_3] = {IMC, "0b.0", "PCI_IMC_DEVICE_CH_1", "MBOX7", 0x3cb0},
- [PCI_R2PCIE_DEVICE] = {R2PCIE, "0c.1", "PCI_R2PCIE_DEVICE", "R2PCIE", 0x0000},
- [PCI_IRP_DEVICE] = {IRP, "05.6", "PCI_IRP_DEVICE", "IRP", 0x0000},
- [PCI_EDC0_UCLK_DEVICE] = {EDC, "0f.0", "PCI_EDC0_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC0_DCLK_DEVICE] = {EDC, "18.2", "PCI_EDC0_DCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC1_UCLK_DEVICE] = {EDC, "10.0", "PCI_EDC1_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC1_DCLK_DEVICE] = {EDC, "19.2", "PCI_EDC1_DCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC2_UCLK_DEVICE] = {EDC, "11.0", "PCI_EDC2_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC2_DCLK_DEVICE] = {EDC, "1a.2", "PCI_EDC2_DCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC3_UCLK_DEVICE] = {EDC, "12.0", "PCI_EDC3_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC3_DCLK_DEVICE] = {EDC, "1b.2", "PCI_EDC3_DCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC4_UCLK_DEVICE] = {EDC, "13.0", "PCI_EDC4_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC4_DCLK_DEVICE] = {EDC, "1c.2", "PCI_EDC4_DCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC5_UCLK_DEVICE] = {EDC, "14.0", "PCI_EDC5_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC5_DCLK_DEVICE] = {EDC, "1d.2", "PCI_EDC5_DCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC6_UCLK_DEVICE] = {EDC, "15.0", "PCI_EDC6_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC6_DCLK_DEVICE] = {EDC, "1e.2", "PCI_EDC6_DCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC7_UCLK_DEVICE] = {EDC, "16.0", "PCI_EDC7_UCLK_DEVICE", "EDC", 0x0000},
- [PCI_EDC7_DCLK_DEVICE] = {EDC, "1f.2", "PCI_EDC7_DCLK_DEVICE", "EDC", 0x0000},
+ [PCI_IMC_DEVICE_0_CH_0] = {IMC, "08.2", "PCI_IMC_DEVICE_0_CH_0", "MBOX0", 0x7843},
+ [PCI_IMC_DEVICE_0_CH_1] = {IMC, "08.3", "PCI_IMC_DEVICE_0_CH_1", "MBOX1", 0x7843},
+ [PCI_IMC_DEVICE_0_CH_2] = {IMC, "08.4", "PCI_IMC_DEVICE_0_CH_2", "MBOX2", 0x7843},
+ [PCI_IMC_DEVICE_0_CH_3] = {IMC, "0a.0", "PCI_IMC_DEVICE_0_CH_3", "MBOX3", 0x7843},
+ [PCI_IMC_DEVICE_1_CH_0] = {IMC, "09.2", "PCI_IMC_DEVICE_1_CH_0", "MBOX4", 0x7843},
+ [PCI_IMC_DEVICE_1_CH_1] = {IMC, "09.3", "PCI_IMC_DEVICE_1_CH_1", "MBOX5", 0x7843},
+ [PCI_IMC_DEVICE_1_CH_2] = {IMC, "09.4", "PCI_IMC_DEVICE_1_CH_2", "MBOX6", 0x7843},
+ [PCI_IMC_DEVICE_1_CH_3] = {IMC, "0b.0", "PCI_IMC_DEVICE_1_CH_3", "MBOX7", 0x7843},
+ [PCI_R2PCIE_DEVICE] = {R2PCIE, "0c.1", "PCI_R2PCIE_DEVICE", "R2PCIE", 0x7817},
+ [PCI_IRP_DEVICE] = {IRP, "05.6", "PCI_IRP_DEVICE", "IRP", 0x7814},
+ [PCI_EDC0_UCLK_DEVICE] = {EDC, "0f.0", "PCI_EDC0_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC0_DCLK_DEVICE] = {EDC, "18.2", "PCI_EDC0_DCLK_DEVICE", "EDC", 0x7835},
+ [PCI_EDC1_UCLK_DEVICE] = {EDC, "10.0", "PCI_EDC1_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC1_DCLK_DEVICE] = {EDC, "19.2", "PCI_EDC1_DCLK_DEVICE", "EDC", 0x7835},
+ [PCI_EDC2_UCLK_DEVICE] = {EDC, "11.0", "PCI_EDC2_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC2_DCLK_DEVICE] = {EDC, "1a.2", "PCI_EDC2_DCLK_DEVICE", "EDC", 0x7835},
+ [PCI_EDC3_UCLK_DEVICE] = {EDC, "12.0", "PCI_EDC3_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC3_DCLK_DEVICE] = {EDC, "1b.2", "PCI_EDC3_DCLK_DEVICE", "EDC", 0x7835},
+ [PCI_EDC4_UCLK_DEVICE] = {EDC, "13.0", "PCI_EDC4_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC4_DCLK_DEVICE] = {EDC, "1c.2", "PCI_EDC4_DCLK_DEVICE", "EDC", 0x7835},
+ [PCI_EDC5_UCLK_DEVICE] = {EDC, "14.0", "PCI_EDC5_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC5_DCLK_DEVICE] = {EDC, "1d.2", "PCI_EDC5_DCLK_DEVICE", "EDC", 0x7835},
+ [PCI_EDC6_UCLK_DEVICE] = {EDC, "15.0", "PCI_EDC6_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC6_DCLK_DEVICE] = {EDC, "1e.2", "PCI_EDC6_DCLK_DEVICE", "EDC", 0x7835},
+ [PCI_EDC7_UCLK_DEVICE] = {EDC, "16.0", "PCI_EDC7_UCLK_DEVICE", "EDC", 0x7833},
+ [PCI_EDC7_DCLK_DEVICE] = {EDC, "1f.2", "PCI_EDC7_DCLK_DEVICE", "EDC", 0x7835},
+};
+
+static char* knl_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [POWER] = "/sys/bus/event_source/devices/power",
+    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc_0",
+    [MBOX1] = "/sys/bus/event_source/devices/uncore_imc_1",
+    [MBOX2] = "/sys/bus/event_source/devices/uncore_imc_2",
+    [MBOX4] = "/sys/bus/event_source/devices/uncore_imc_3",
+    [MBOX5] = "/sys/bus/event_source/devices/uncore_imc_4",
+    [MBOX6] = "/sys/bus/event_source/devices/uncore_imc_5",
+    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
+    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
+    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
+    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
+    [CBOX4] = "/sys/bus/event_source/devices/uncore_cbox_4",
+    [CBOX5] = "/sys/bus/event_source/devices/uncore_cbox_5",
+    [CBOX6] = "/sys/bus/event_source/devices/uncore_cbox_6",
+    [CBOX7] = "/sys/bus/event_source/devices/uncore_cbox_7",
+    [CBOX8] = "/sys/bus/event_source/devices/uncore_cbox_8",
+    [CBOX9] = "/sys/bus/event_source/devices/uncore_cbox_9",
+    [CBOX10] = "/sys/bus/event_source/devices/uncore_cbox_10",
+    [CBOX11] = "/sys/bus/event_source/devices/uncore_cbox_11",
+    [CBOX12] = "/sys/bus/event_source/devices/uncore_cbox_12",
+    [CBOX13] = "/sys/bus/event_source/devices/uncore_cbox_13",
+    [CBOX14] = "/sys/bus/event_source/devices/uncore_cbox_14",
+    [CBOX15] = "/sys/bus/event_source/devices/uncore_cbox_15",
+    [CBOX16] = "/sys/bus/event_source/devices/uncore_cbox_16",
+    [CBOX17] = "/sys/bus/event_source/devices/uncore_cbox_17",
+    [CBOX18] = "/sys/bus/event_source/devices/uncore_cbox_18",
+    [CBOX19] = "/sys/bus/event_source/devices/uncore_cbox_19",
+    [CBOX20] = "/sys/bus/event_source/devices/uncore_cbox_20",
+    [CBOX21] = "/sys/bus/event_source/devices/uncore_cbox_21",
+    [CBOX22] = "/sys/bus/event_source/devices/uncore_cbox_22",
+    [CBOX23] = "/sys/bus/event_source/devices/uncore_cbox_23",
+    [CBOX24] = "/sys/bus/event_source/devices/uncore_cbox_24",
+    [CBOX25] = "/sys/bus/event_source/devices/uncore_cbox_25",
+    [CBOX26] = "/sys/bus/event_source/devices/uncore_cbox_26",
+    [CBOX27] = "/sys/bus/event_source/devices/uncore_cbox_27",
+    [CBOX28] = "/sys/bus/event_source/devices/uncore_cbox_28",
+    [CBOX29] = "/sys/bus/event_source/devices/uncore_cbox_29",
+    [CBOX30] = "/sys/bus/event_source/devices/uncore_cbox_30",
+    [CBOX31] = "/sys/bus/event_source/devices/uncore_cbox_31",
+    [CBOX32] = "/sys/bus/event_source/devices/uncore_cbox_32",
+    [CBOX33] = "/sys/bus/event_source/devices/uncore_cbox_33",
+    [CBOX34] = "/sys/bus/event_source/devices/uncore_cbox_34",
+    [CBOX35] = "/sys/bus/event_source/devices/uncore_cbox_35",
+    [CBOX36] = "/sys/bus/event_source/devices/uncore_cbox_36",
+    [CBOX37] = "/sys/bus/event_source/devices/uncore_cbox_37",
+    [WBOX] = "/sys/bus/event_source/devices/uncore_pcu",
+    [PBOX] = "/sys/bus/event_source/devices/uncore_m2pcie",
+    [UBOX] = "/sys/bus/event_source/devices/uncore_ubox",
+    [IBOX0] = "/sys/bus/event_source/devices/uncore_irp",
+    [EUBOX0] = "/sys/bus/event_source/devices/uncore_edc_uclk_0",
+    [EUBOX1] = "/sys/bus/event_source/devices/uncore_edc_uclk_1",
+    [EUBOX2] = "/sys/bus/event_source/devices/uncore_edc_uclk_2",
+    [EUBOX3] = "/sys/bus/event_source/devices/uncore_edc_uclk_3",
+    [EUBOX4] = "/sys/bus/event_source/devices/uncore_edc_uclk_4",
+    [EUBOX5] = "/sys/bus/event_source/devices/uncore_edc_uclk_5",
+    [EUBOX6] = "/sys/bus/event_source/devices/uncore_edc_uclk_6",
+    [EUBOX7] = "/sys/bus/event_source/devices/uncore_edc_uclk_7",
+    [EDBOX0] = "/sys/bus/event_source/devices/uncore_edc_eclk_0",
+    [EDBOX1] = "/sys/bus/event_source/devices/uncore_edc_eclk_1",
+    [EDBOX2] = "/sys/bus/event_source/devices/uncore_edc_eclk_2",
+    [EDBOX3] = "/sys/bus/event_source/devices/uncore_edc_eclk_3",
+    [EDBOX4] = "/sys/bus/event_source/devices/uncore_edc_eclk_4",
+    [EDBOX5] = "/sys/bus/event_source/devices/uncore_edc_eclk_5",
+    [EDBOX6] = "/sys/bus/event_source/devices/uncore_edc_eclk_6",
+    [EDBOX7] = "/sys/bus/event_source/devices/uncore_edc_eclk_7",
+    [MBOX3FIX] = "/sys/bus/event_source/devices/uncore_imc_uclk_0",
+    [MBOX7FIX] = "/sys/bus/event_source/devices/uncore_imc_uclk_1",
 };
diff --git a/src/includes/perfmon_knl_events.txt b/src/includes/perfmon_knl_events.txt
index 9aaeea9..d043045 100644
--- a/src/includes/perfmon_knl_events.txt
+++ b/src/includes/perfmon_knl_events.txt
@@ -4,13 +4,13 @@
 #
 #      Description:  Event list for Intel Xeon Phi (Knights Landing)
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -29,14 +29,17 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
-UMASK_PWR_DRAM_ENERGY          0x00
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
+UMASK_PWR_PP1_ENERGY          0x00
+
+EVENT_PWR_DRAM_ENERGY         0x03   PWR3
+UMASK_PWR_DRAM_ENERGY         0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
 UMASK_INSTR_RETIRED_ANY          0x00
diff --git a/src/includes/perfmon_nehalem.h b/src/includes/perfmon_nehalem.h
index df3dee2..900cea3 100644
--- a/src/includes/perfmon_nehalem.h
+++ b/src/includes/perfmon_nehalem.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Nehalem.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -41,8 +41,8 @@ static int perfmon_numArchEventsNehalem = NUM_ARCH_EVENTS_NEHALEM;
 
 int perfmon_init_nehalem(int cpu_id)
 {
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     return 0;
 }
@@ -151,7 +151,7 @@ int neh_uncore_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     uint64_t mask_flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -225,7 +225,7 @@ int perfmon_setupCounterThread_nehalem(int thread_id, PerfmonEventSet* eventSet)
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -293,7 +293,7 @@ int perfmon_startCountersThread_nehalem(int thread_id, PerfmonEventSet* eventSet
     int cpu_id = groupSet->threads[thread_id].processorId;
 
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -386,7 +386,7 @@ int perfmon_stopCountersThread_nehalem(int thread_id, PerfmonEventSet* eventSet)
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -459,7 +459,7 @@ int perfmon_readCountersThread_nehalem(int thread_id, PerfmonEventSet* eventSet)
     uint64_t pmc_flags = 0x0ULL;
     uint64_t uncore_flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -544,11 +544,11 @@ int perfmon_finalizeCountersThread_nehalem(int thread_id, PerfmonEventSet* event
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_nehalemEX.h b/src/includes/perfmon_nehalemEX.h
index 653b7e9..e65b64c 100644
--- a/src/includes/perfmon_nehalemEX.h
+++ b/src/includes/perfmon_nehalemEX.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Nehalem EX.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -46,8 +46,8 @@ static int perfmon_numCountersNehalemEX = NUM_COUNTERS_NEHALEMEX;
 
 int perfmon_init_nehalemEX(int cpu_id)
 {
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     return 0;
 }
@@ -149,7 +149,7 @@ int nex_mbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t subflags2 = 0x0ULL;
     int number;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -402,7 +402,7 @@ int nex_rbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t subflags = 0x0ULL;
     int number;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -495,7 +495,7 @@ int nex_bbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t reg = counter_map[index].configRegister;
     RegisterType type = counter_map[index].type;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -535,7 +535,7 @@ int nex_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     uint64_t reg = counter_map[index].configRegister;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -577,7 +577,7 @@ int nex_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t reg = counter_map[index].configRegister;
     int j;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -620,7 +620,7 @@ int nex_sbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t reg = counter_map[index].configRegister;
     RegisterType type = counter_map[index].type;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -728,11 +728,11 @@ int perfmon_setupCounterThread_nehalemEX(int thread_id, PerfmonEventSet* eventSe
     uint64_t ubox_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
@@ -943,7 +943,7 @@ int perfmon_startCountersThread_nehalemEX(int thread_id, PerfmonEventSet* eventS
     uint32_t uflags[NUM_UNITS] = { [0 ... NUM_UNITS-1] = 0x0U };
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1042,7 +1042,7 @@ int perfmon_stopCountersThread_nehalemEX(int thread_id, PerfmonEventSet* eventSe
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1101,7 +1101,7 @@ int perfmon_readCountersThread_nehalemEX(int thread_id, PerfmonEventSet* eventSe
     uint64_t counter_result = 0x0ULL;
     uint64_t core_ctrl_flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1164,11 +1164,11 @@ int perfmon_finalizeCountersThread_nehalemEX(int thread_id, PerfmonEventSet* eve
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_nehalemEX_counters.h b/src/includes/perfmon_nehalemEX_counters.h
index 9d313da..4e12396 100644
--- a/src/includes/perfmon_nehalemEX_counters.h
+++ b/src/includes/perfmon_nehalemEX_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter Header File of perfmon module for Intel Westmere EX.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_nehalemEX_events.txt b/src/includes/perfmon_nehalemEX_events.txt
index 8406091..e1cf7ec 100644
--- a/src/includes/perfmon_nehalemEX_events.txt
+++ b/src/includes/perfmon_nehalemEX_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Nehalem EX
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_nehalemEX_westmereEX_common.h b/src/includes/perfmon_nehalemEX_westmereEX_common.h
index 33497fa..37588ab 100644
--- a/src/includes/perfmon_nehalemEX_westmereEX_common.h
+++ b/src/includes/perfmon_nehalemEX_westmereEX_common.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Common definitions for Intel Nehalem EX and Westmere EX
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_nehalem_counters.h b/src/includes/perfmon_nehalem_counters.h
index d4b97a7..a5d4f89 100644
--- a/src/includes/perfmon_nehalem_counters.h
+++ b/src/includes/perfmon_nehalem_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter Header File of perfmon module for Intel Nehalem.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_nehalem_events.txt b/src/includes/perfmon_nehalem_events.txt
index c42d186..8be621c 100644
--- a/src/includes/perfmon_nehalem_events.txt
+++ b/src/includes/perfmon_nehalem_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Nehalem
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_p6_events.txt b/src/includes/perfmon_p6_events.txt
index fe2a500..f9d28bc 100644
--- a/src/includes/perfmon_p6_events.txt
+++ b/src/includes/perfmon_p6_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Pentium 3
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_perf.h b/src/includes/perfmon_perf.h
deleted file mode 100644
index 0451a8d..0000000
--- a/src/includes/perfmon_perf.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * =======================================================================================
- *
- *      Filename:  perfmon_perf.h
- *
- *      Description: Header file of example perfmon module for software events using
- *                   the perf_event interface
- *
- *      Version:   4.2
- *      Released:  22.12.2016
- *
- *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
- *                Thomas Roehl (tr), thomas.roehl at googlemail.com
- *      Project:  likwid
- *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
- *
- *      This program is free software: you can redistribute it and/or modify it under
- *      the terms of the GNU General Public License as published by the Free Software
- *      Foundation, either version 3 of the License, or (at your option) any later
- *      version.
- *
- *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- *      You should have received a copy of the GNU General Public License along with
- *      this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * =======================================================================================
- */
-
-#ifndef PERFMON_PERF_H
-#define PERFMON_PERF_H
-
-#include <perfmon_types.h>
-
-#define MAX_SW_EVENTS 9
-
-
-extern int init_perf_event(int cpu_id);
-
-extern int setup_perf_event(int cpu_id, PerfmonEvent *event);
-
-extern int read_perf_event(int cpu_id, uint64_t eventID, uint64_t *data);
-
-extern int stop_perf_event(int cpu_id, uint64_t eventID);
-extern int stop_all_perf_event(int cpu_id);
-
-extern int clear_perf_event(int cpu_id, uint64_t eventID);
-extern int clear_all_perf_event(int cpu_id);
-
-extern int start_perf_event(int cpu_id, uint64_t eventID);
-extern int start_all_perf_event(int cpu_id);
-
-extern int close_perf_event(int cpu_id, uint64_t eventID);
-
-extern int finalize_perf_event(int cpu_id);
-
-#endif
diff --git a/src/includes/perfmon_perfevent.h b/src/includes/perfmon_perfevent.h
index bcd53e2..bd0949f 100644
--- a/src/includes/perfmon_perfevent.h
+++ b/src/includes/perfmon_perfevent.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File of perfmon module for perf_event kernel interface.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -40,54 +40,13 @@
 #include <asm/unistd.h>
 #include <string.h>
 
-
-static int* cpu_event_fds[MAX_NUM_THREADS] = { NULL };
+extern char** translate_types;
+static int** cpu_event_fds = NULL;
+static int active_cpus = 0;
 static int paranoid_level = -1;
 static int informed_paranoid = 0;
 static int running_group = -1;
 
-static char* translate_types[NUM_UNITS] = {
-    [FIXED] = "/sys/bus/event_source/devices/cpu",
-    [PMC] = "/sys/bus/event_source/devices/cpu",
-    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc_0",
-    [MBOX1] = "/sys/bus/event_source/devices/uncore_imc_1",
-    [MBOX2] = "/sys/bus/event_source/devices/uncore_imc_2",
-    [MBOX3] = "/sys/bus/event_source/devices/uncore_imc_3",
-    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
-    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
-    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
-    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
-    [CBOX4] = "/sys/bus/event_source/devices/uncore_cbox_4",
-    [CBOX5] = "/sys/bus/event_source/devices/uncore_cbox_5",
-    [CBOX6] = "/sys/bus/event_source/devices/uncore_cbox_6",
-    [CBOX7] = "/sys/bus/event_source/devices/uncore_cbox_7",
-    [CBOX8] = "/sys/bus/event_source/devices/uncore_cbox_8",
-    [CBOX9] = "/sys/bus/event_source/devices/uncore_cbox_9",
-    [CBOX10] = "/sys/bus/event_source/devices/uncore_cbox_10",
-    [CBOX11] = "/sys/bus/event_source/devices/uncore_cbox_11",
-    [CBOX12] = "/sys/bus/event_source/devices/uncore_cbox_12",
-    [CBOX13] = "/sys/bus/event_source/devices/uncore_cbox_13",
-    [CBOX14] = "/sys/bus/event_source/devices/uncore_cbox_14",
-    [CBOX15] = "/sys/bus/event_source/devices/uncore_cbox_15",
-    [CBOX16] = "/sys/bus/event_source/devices/uncore_cbox_16",
-    [CBOX17] = "/sys/bus/event_source/devices/uncore_cbox_17",
-    [CBOX18] = "/sys/bus/event_source/devices/uncore_cbox_18",
-    [CBOX19] = "/sys/bus/event_source/devices/uncore_cbox_19",
-    [CBOX20] = "/sys/bus/event_source/devices/uncore_cbox_20",
-    [CBOX21] = "/sys/bus/event_source/devices/uncore_cbox_21",
-    [CBOX22] = "/sys/bus/event_source/devices/uncore_cbox_22",
-    [CBOX23] = "/sys/bus/event_source/devices/uncore_cbox_23",
-    [BBOX0] = "/sys/bus/event_source/devices/uncore_ha",
-    [WBOX] = "/sys/bus/event_source/devices/uncore_pcu",
-    [SBOX0] = "/sys/bus/event_source/devices/uncore_qpi_0",
-    [SBOX1] = "/sys/bus/event_source/devices/uncore_qpi_1",
-    [PBOX] = "/sys/bus/event_source/devices/uncore_r2pcie",
-    [RBOX0] = "/sys/bus/event_source/devices/uncore_r3qpi_0",
-    [RBOX1] = "/sys/bus/event_source/devices/uncore_r3qpi_1",
-    [UBOX] = "/sys/bus/event_source/devices/uncore_ubox",
-};
-
-
 static long
 perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
                 int cpu, int group_fd, unsigned long flags)
@@ -121,15 +80,23 @@ int perfmon_init_perfevent(int cpu_id)
             paranoid_level = atoi(buff);
         }
         fclose(fd);
-        if (paranoid_level > 0)
+        if (paranoid_level > 0 && getuid() != 0)
         {
             fprintf(stderr, "WARN: Linux kernel configured with paranoid level %d\n", paranoid_level);
 #if defined(__x86_64__) || defined(__i386__)
-            fprintf(stderr, "WARN: Paranoid level 0 is required to measure Uncore counters\n");
+            fprintf(stderr, "WARN: Paranoid level 0 or root access is required to measure Uncore counters\n");
 #endif
         }
         informed_paranoid = 1;
     }
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    if (cpu_event_fds == NULL)
+    {
+        cpu_event_fds = malloc(cpuid_topology.numHWThreads * sizeof(int*));
+        for (int i=0; i < cpuid_topology.numHWThreads; i++)
+            cpu_event_fds[i] = NULL;
+    }
     if (cpu_event_fds[cpu_id] == NULL)
     {
         cpu_event_fds[cpu_id] = (int*) malloc(perfmon_numCounters * sizeof(int));
@@ -138,6 +105,7 @@ int perfmon_init_perfevent(int cpu_id)
             return -ENOMEM;
         }
         memset(cpu_event_fds[cpu_id], -1, perfmon_numCounters * sizeof(int));
+        active_cpus += 1;
     }
     return 0;
 }
@@ -168,7 +136,7 @@ int perf_fixed_setup(struct perf_event_attr *attr, PerfmonEvent *event)
         ret = 0;
     }
 #endif
-    
+
     return ret;
 }
 
@@ -195,7 +163,7 @@ int perf_pmc_setup(struct perf_event_attr *attr, PerfmonEvent *event)
             }
         }
     }
-    
+
     return 0;
 }
 
@@ -240,8 +208,8 @@ int perf_uncore_setup(struct perf_event_attr *attr, RegisterType type, PerfmonEv
     attr->config = (event->umask<<8) + event->eventId;
     attr->disabled = 1;
     attr->inherit = 1;
-    attr->exclude_kernel = 1;
-    attr->exclude_hv = 1;
+
+    //attr->exclusive = 1;
     return 0;
 }
 
@@ -256,14 +224,37 @@ int perfmon_setupCountersThread_perfevent(
     int cpu_id = groupSet->threads[thread_id].processorId;
     struct perf_event_attr attr;
     int group_fd = -1;
+    int is_uncore = 0;
+    pid_t allpid = -1;
+    unsigned long allflags = 0;
+
+    if (getenv("LIKWID_PERF_PID") != NULL)
+    {
+        allpid = (pid_t)atoi(getenv("LIKWID_PERF_PID"));
+    }
+    else if (paranoid_level > 0)
+    {
+        fprintf(stderr, "Cannot setup events without PID of executed application because perf_event_paranoid > 0\n");
+        fprintf(stderr, "You can use either --execpid to track the started application or --perfpid <pid> to monitor another application\n");
+        return -((int)thread_id+1);
+    }
+    if (getenv("LIKWID_PERF_FLAGS") != NULL)
+    {
+        allflags = strtoul(getenv("LIKWID_PERF_FLAGS"), NULL, 16);
+    }
     for (int i=0;i < eventSet->numberOfEvents;i++)
     {
+        is_uncore = 0;
         RegisterIndex index = eventSet->events[i].index;
         if (cpu_event_fds[cpu_id][index] != -1)
         {
             continue;
         }
         RegisterType type = eventSet->events[i].type;
+        if (!TESTTYPE(eventSet, type))
+        {
+            continue;
+        }
         PerfmonEvent *event = &(eventSet->events[i].event);
         memset(&attr, 0, sizeof(struct perf_event_attr));
         attr.size = sizeof(struct perf_event_attr);
@@ -281,11 +272,20 @@ int perfmon_setupCountersThread_perfevent(
                 ret = perf_pmc_setup(&attr, event);
                 VERBOSEPRINTREG(cpu_id, index, attr.config, SETUP_PMC);
                 break;
+            case POWER:
+                ret = perf_uncore_setup(&attr, type, event);
+                is_uncore = 1;
+                VERBOSEPRINTREG(cpu_id, index, attr.config, SETUP_POWER);
+                break;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
             case MBOX0:
             case MBOX1:
             case MBOX2:
             case MBOX3:
+            case MBOX4:
+            case MBOX5:
+            case MBOX6:
+            case MBOX7:
             case CBOX0:
             case CBOX1:
             case CBOX2:
@@ -294,15 +294,58 @@ int perfmon_setupCountersThread_perfevent(
             case CBOX5:
             case CBOX6:
             case CBOX7:
+            case CBOX8:
+            case CBOX9:
+            case CBOX10:
+            case CBOX11:
+            case CBOX12:
+            case CBOX13:
+            case CBOX14:
+            case CBOX15:
+            case CBOX16:
+            case CBOX17:
+            case CBOX18:
+            case CBOX19:
+            case CBOX20:
+            case CBOX21:
+            case CBOX22:
+            case CBOX23:
+            case CBOX24:
+            case CBOX25:
+            case CBOX26:
+            case CBOX27:
             case UBOX:
             case SBOX0:
             case SBOX1:
+            case SBOX2:
+            case SBOX3:
+            case QBOX0:
+            case QBOX1:
+            case QBOX2:
             case WBOX:
             case PBOX:
             case RBOX0:
             case RBOX1:
             case BBOX0:
+            case EDBOX0:
+            case EDBOX1:
+            case EDBOX2:
+            case EDBOX3:
+            case EDBOX4:
+            case EDBOX5:
+            case EDBOX6:
+            case EDBOX7:
+            case EUBOX0:
+            case EUBOX1:
+            case EUBOX2:
+            case EUBOX3:
+            case EUBOX4:
+            case EUBOX5:
+            case EUBOX6:
+            case EUBOX7:
                 ret = perf_uncore_setup(&attr, type, event);
+                is_uncore = 1;
+                VERBOSEPRINTREG(cpu_id, index, attr.config, SETUP_UNCORE);
                 break;
 #endif
             default:
@@ -310,20 +353,35 @@ int perfmon_setupCountersThread_perfevent(
         }
         if (ret == 0)
         {
-            cpu_event_fds[cpu_id][index] = perf_event_open(&attr, 0, cpu_id, -1, 0);
-            if (cpu_event_fds[cpu_id][index] < 0)
-            {
-                fprintf(stderr, "Setup of event %s on CPU %d failed: %s\n", event->name, cpu_id, strerror(errno));
-                fprintf(stderr, "Config of event 0x%X\n", attr.config);
-                fprintf(stderr, "Type of event 0x%X\n", attr.type);
-                continue;
-            }
-            if (group_fd < 0)
+
+            if (!is_uncore || socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
             {
-                group_fd = cpu_event_fds[cpu_id][index];
-                running_group = group_fd;
+                pid_t curpid = allpid;
+                if (is_uncore && curpid >= 0)
+                    curpid = -1;
+                DEBUG_PRINT(DEBUGLEV_DEVELOP, perf_event_open: cpu_id=%d pid=%d flags=%d, cpu_id, curpid, allflags);
+                cpu_event_fds[cpu_id][index] = perf_event_open(&attr, curpid, cpu_id, -1, allflags);
+                if (cpu_event_fds[cpu_id][index] < 0)
+                {
+                    fprintf(stderr, "Setup of event %s on CPU %d failed: %s\n", event->name, cpu_id, strerror(errno));
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, perf_event_open: cpu_id=%d pid=%d flags=%d, cpu_id, curpid, allflags);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, type %d, attr.type);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, size %d, attr.size);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, config 0x%llX, attr.config);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, read_format %d, attr.read_format);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, disabled %d, attr.disabled);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, inherit %d, attr.inherit);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, pinned %d, attr.pinned);
+                    DEBUG_PRINT(DEBUGLEV_DEVELOP, exclusive %d, attr.exclusive);
+                    continue;
+                }
+                if (group_fd < 0)
+                {
+                    group_fd = cpu_event_fds[cpu_id][index];
+                    running_group = group_fd;
+                }
+                eventSet->events[i].threadCounter[thread_id].init = TRUE;
             }
-            eventSet->events[i].threadCounter[thread_id].init = TRUE;
         }
     }
     return 0;
@@ -342,7 +400,15 @@ int perfmon_startCountersThread_perfevent(int thread_id, PerfmonEventSet* eventS
             VERBOSEPRINTREG(cpu_id, 0x0, 0x0, RESET_COUNTER);
             ioctl(cpu_event_fds[cpu_id][index], PERF_EVENT_IOC_RESET, 0);
             eventSet->events[i].threadCounter[thread_id].startData = 0x0ULL;
-            VERBOSEPRINTREG(cpu_id, 0x0, 0x0, START_COUNTER);
+            if (eventSet->events[i].type == POWER)
+            {
+                read(cpu_event_fds[cpu_id][index],
+                     &eventSet->events[i].threadCounter[thread_id].startData,
+                     sizeof(long long));
+            }
+            VERBOSEPRINTREG(cpu_id, 0x0,
+                            eventSet->events[i].threadCounter[thread_id].startData,
+                            START_COUNTER);
             ioctl(cpu_event_fds[cpu_id][index], PERF_EVENT_IOC_ENABLE, 0);
         }
     }
@@ -365,7 +431,7 @@ int perfmon_stopCountersThread_perfevent(int thread_id, PerfmonEventSet* eventSe
             ioctl(cpu_event_fds[cpu_id][index], PERF_EVENT_IOC_DISABLE, 0);
             tmp = 0;
             ret = read(cpu_event_fds[cpu_id][index], &tmp, sizeof(long long));
-            DEBUG_PRINT(DEBUGLEV_DEVELOP, READ CPU %d COUNTER %d VALUE %llu, cpu_id, index, tmp);
+            VERBOSEPRINTREG(cpu_id, cpu_event_fds[cpu_id][index], tmp, READ_COUNTER);
             if (ret == sizeof(long long))
             {
                 eventSet->events[i].threadCounter[thread_id].counterData = tmp;
@@ -374,6 +440,7 @@ int perfmon_stopCountersThread_perfevent(int thread_id, PerfmonEventSet* eventSe
             VERBOSEPRINTREG(cpu_id, cpu_event_fds[cpu_id][index], 0x0, RESET_COUNTER);
         }
     }
+    return 0;
 }
 
 int perfmon_readCountersThread_perfevent(int thread_id, PerfmonEventSet* eventSet)
@@ -401,6 +468,7 @@ int perfmon_readCountersThread_perfevent(int thread_id, PerfmonEventSet* eventSe
             ioctl(cpu_event_fds[cpu_id][index], PERF_EVENT_IOC_ENABLE, 0);
         }
     }
+    return 0;
 }
 
 int perfmon_finalizeCountersThread_perfevent(int thread_id, PerfmonEventSet* eventSet)
@@ -418,6 +486,17 @@ int perfmon_finalizeCountersThread_perfevent(int thread_id, PerfmonEventSet* eve
             cpu_event_fds[cpu_id][index] = -1;
         }
     }
-    free(cpu_event_fds[cpu_id]);
+    if (cpu_event_fds[cpu_id] != NULL)
+    {
+        free(cpu_event_fds[cpu_id]);
+        cpu_event_fds[cpu_id] = NULL;
+        active_cpus--;
+    }
+    if (active_cpus == 0)
+    {
+        free(cpu_event_fds);
+        cpu_event_fds = NULL;
+    }
     return 0;
 }
+
diff --git a/src/includes/perfmon_phi.h b/src/includes/perfmon_phi.h
index 5e8e174..27efe2a 100644
--- a/src/includes/perfmon_phi.h
+++ b/src/includes/perfmon_phi.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Xeon Phi.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_phi_counters.h b/src/includes/perfmon_phi_counters.h
index 01bfbd0..9522b58 100644
--- a/src/includes/perfmon_phi_counters.h
+++ b/src/includes/perfmon_phi_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter Header File of perfmon module for Intel Xeon Phi.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_phi_events.txt b/src/includes/perfmon_phi_events.txt
index e0dca61..369fa6d 100644
--- a/src/includes/perfmon_phi_events.txt
+++ b/src/includes/perfmon_phi_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Xeon Phi
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_pm.h b/src/includes/perfmon_pm.h
index e0c22e1..cc9fd05 100644
--- a/src/includes/perfmon_pm.h
+++ b/src/includes/perfmon_pm.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module Pentium M.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_pm_counters.h b/src/includes/perfmon_pm_counters.h
index 968a812..24f0281 100644
--- a/src/includes/perfmon_pm_counters.h
+++ b/src/includes/perfmon_pm_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter Header File of perfmon module for Intel Pentium M.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_pm_events.txt b/src/includes/perfmon_pm_events.txt
index 028b41f..3e846ee 100644
--- a/src/includes/perfmon_pm_events.txt
+++ b/src/includes/perfmon_pm_events.txt
@@ -4,13 +4,13 @@
 #
 #      Description:  Event list for Intel Pentium M
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_sandybridge.h b/src/includes/perfmon_sandybridge.h
index f379ec5..13a6e67 100644
--- a/src/includes/perfmon_sandybridge.h
+++ b/src/includes/perfmon_sandybridge.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Sandy Bridge.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -57,8 +57,8 @@ int perfmon_init_sandybridge(int cpu_id)
 {
     int ret;
     uint64_t data = 0x0ULL;
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     
     if ((cpuid_info.model == SANDYBRIDGE_EP))
@@ -67,7 +67,7 @@ int perfmon_init_sandybridge(int cpu_id)
         snb_did_cbox_test = 1;
     }
     else if (cpuid_info.model == SANDYBRIDGE &&
-             socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id &&
+             socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id &&
              snb_did_cbox_test == 0)
     {
         ret = HPMwrite(cpu_id, MSR_DEV, MSR_UNC_CBO_0_PERFEVTSEL0, 0x0ULL);
@@ -188,7 +188,7 @@ int snb_mbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint32_t flags = 0x0U;
     PciDeviceIndex dev = counter_map[index].device;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -315,7 +315,7 @@ int snb_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint32_t flags = 0x0U;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -351,7 +351,7 @@ int snbep_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint32_t flags = 0x0U;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -405,7 +405,7 @@ int snb_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint32_t flags = 0x0U;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -444,7 +444,7 @@ int snb_bbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint32_t flags = 0x0U;
     uint64_t match = 0x0ULL;
     PciDeviceIndex dev = counter_map[index].device;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -501,7 +501,7 @@ int snb_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint32_t flags = 0x0U;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -551,7 +551,7 @@ int snb_sbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event, PciDevi
     int j;
     uint32_t flags = 0x0U;
     PciDeviceIndex dev = counter_map[index].device;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -648,7 +648,7 @@ int snb_rbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint32_t flags = 0x0U;
     PciDeviceIndex dev = counter_map[index].device;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -690,7 +690,7 @@ int snb_pbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint32_t flags = 0x0U;
     PciDeviceIndex dev = counter_map[index].device;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -783,7 +783,7 @@ int perfmon_setupCounterThread_sandybridge(
     uint64_t flags = 0x0ULL;
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1020,7 +1020,7 @@ int perfmon_startCountersThread_sandybridge(int thread_id, PerfmonEventSet* even
     uint64_t flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1224,7 +1224,7 @@ int perfmon_stopCountersThread_sandybridge(int thread_id, PerfmonEventSet* event
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1282,6 +1282,7 @@ int perfmon_stopCountersThread_sandybridge(int thread_id, PerfmonEventSet* event
             uint64_t reg = counter_map[index].configRegister;
             uint64_t counter1 = counter_map[index].counterRegister;
             uint64_t counter2 = counter_map[index].counterRegister2;
+            uint64_t* current = &(eventSet->events[i].threadCounter[thread_id].counterData);
             switch (type)
             {
                 case PMC:
@@ -1320,7 +1321,12 @@ int perfmon_stopCountersThread_sandybridge(int thread_id, PerfmonEventSet* event
                     {
                         CHECK_POWER_READ_ERROR(power_read(cpu_id, counter1, (uint32_t*)&counter_result));
                         VERBOSEPRINTPCIREG(cpu_id, dev, counter1,  LLU_CAST counter_result, STOP_POWER);
-                        SNB_CHECK_OVERFLOW;
+                        if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
+                        {
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
+                            eventSet->events[i].threadCounter[thread_id].overflows++;
+                        }
+                        *current = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
 
@@ -1509,7 +1515,7 @@ int perfmon_readCountersThread_sandybridge(int thread_id, PerfmonEventSet* event
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t pmc_flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1574,6 +1580,7 @@ int perfmon_readCountersThread_sandybridge(int thread_id, PerfmonEventSet* event
             uint64_t reg = counter_map[index].configRegister;
             uint64_t counter1 = counter_map[index].counterRegister;
             uint64_t counter2 = counter_map[index].counterRegister2;
+            uint64_t* current = &(eventSet->events[i].threadCounter[thread_id].counterData);
             switch (type)
             {
                 case PMC:
@@ -1616,7 +1623,12 @@ int perfmon_readCountersThread_sandybridge(int thread_id, PerfmonEventSet* event
                     {
                         CHECK_POWER_READ_ERROR(power_read(cpu_id, counter1, (uint32_t*)&counter_result));
                         VERBOSEPRINTPCIREG(cpu_id, dev, counter1,  LLU_CAST counter_result, READ_POWER);
-                        SNB_CHECK_OVERFLOW;
+                        if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
+                        {
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
+                            eventSet->events[i].threadCounter[thread_id].overflows++;
+                        }
+                        *current = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
 
@@ -1841,11 +1853,11 @@ int perfmon_finalizeCountersThread_sandybridge(int thread_id, PerfmonEventSet* e
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_sandybridgeEP_counters.h b/src/includes/perfmon_sandybridgeEP_counters.h
index 89fdc29..a71fef7 100644
--- a/src/includes/perfmon_sandybridgeEP_counters.h
+++ b/src/includes/perfmon_sandybridgeEP_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter header file of perfmon module for Intel Sandy Bridge EP.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -217,3 +217,33 @@ static PciDevice sandybridgeEP_pci_devices[MAX_NUM_PCI_DEVICES] = {
  [PCI_QPI_MISC_DEVICE_PORT_0] = {QPI, "08.0", "PCI_QPI_MISC_DEVICE_PORT_0", "SBOX0FIX",0x3c80},
  [PCI_QPI_MISC_DEVICE_PORT_1] = {QPI, "09.0", "PCI_QPI_MISC_DEVICE_PORT_1", "SBOX1FIX", 0x3c91},
 };
+
+static char* sandybridgeEP_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [POWER] = "/sys/bus/event_source/devices/power",
+    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc_0",
+    [MBOX1] = "/sys/bus/event_source/devices/uncore_imc_1",
+    [MBOX2] = "/sys/bus/event_source/devices/uncore_imc_2",
+    [MBOX3] = "/sys/bus/event_source/devices/uncore_imc_3",
+    [MBOX4] = "/sys/bus/event_source/devices/uncore_imc_4",
+    [MBOX5] = "/sys/bus/event_source/devices/uncore_imc_5",
+    [MBOX6] = "/sys/bus/event_source/devices/uncore_imc_6",
+    [MBOX7] = "/sys/bus/event_source/devices/uncore_imc_7",
+    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
+    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
+    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
+    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
+    [CBOX4] = "/sys/bus/event_source/devices/uncore_cbox_4",
+    [CBOX5] = "/sys/bus/event_source/devices/uncore_cbox_5",
+    [CBOX6] = "/sys/bus/event_source/devices/uncore_cbox_6",
+    [CBOX7] = "/sys/bus/event_source/devices/uncore_cbox_7",
+    [BBOX0] = "/sys/bus/event_source/devices/uncore_ha",
+    [WBOX] = "/sys/bus/event_source/devices/uncore_pcu",
+    [SBOX0] = "/sys/bus/event_source/devices/uncore_qpi_0",
+    [SBOX1] = "/sys/bus/event_source/devices/uncore_qpi_1",
+    [PBOX] = "/sys/bus/event_source/devices/uncore_r2pcie",
+    [RBOX0] = "/sys/bus/event_source/devices/uncore_r3qpi_0",
+    [RBOX1] = "/sys/bus/event_source/devices/uncore_r3qpi_1",
+    [UBOX] = "/sys/bus/event_source/devices/uncore_ubox",
+};
diff --git a/src/includes/perfmon_sandybridgeEP_events.txt b/src/includes/perfmon_sandybridgeEP_events.txt
index eba79bc..e43bb16 100644
--- a/src/includes/perfmon_sandybridgeEP_events.txt
+++ b/src/includes/perfmon_sandybridgeEP_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel SandyBridge EP
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -30,16 +30,16 @@
 EVENT_TEMP_CORE               0x00   TMP0
 UMASK_TEMP_CORE               0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY         0x00   PWR3
+EVENT_PWR_DRAM_ENERGY         0x03   PWR3
 UMASK_PWR_DRAM_ENERGY         0x00
 
 EVENT_INSTR_RETIRED           0x00   FIXC0
diff --git a/src/includes/perfmon_sandybridge_counters.h b/src/includes/perfmon_sandybridge_counters.h
index 13a83cc..b2407e2 100644
--- a/src/includes/perfmon_sandybridge_counters.h
+++ b/src/includes/perfmon_sandybridge_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter header file of perfmon module for Intel Sandy Bridge.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_sandybridge_events.txt b/src/includes/perfmon_sandybridge_events.txt
index dcc4435..1a4adba 100644
--- a/src/includes/perfmon_sandybridge_events.txt
+++ b/src/includes/perfmon_sandybridge_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel SandyBridge
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -30,16 +30,16 @@
 EVENT_TEMP_CORE               0x00   TMP0
 UMASK_TEMP_CORE               0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY         0x00   PWR3
+EVENT_PWR_DRAM_ENERGY         0x03   PWR3
 UMASK_PWR_DRAM_ENERGY         0x00
 
 EVENT_INSTR_RETIRED           0x00   FIXC0
diff --git a/src/includes/perfmon_silvermont.h b/src/includes/perfmon_silvermont.h
index db4bb92..d746275 100644
--- a/src/includes/perfmon_silvermont.h
+++ b/src/includes/perfmon_silvermont.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header file of perfmon module for Intel Atom (Silvermont)
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -38,8 +38,8 @@ static int perfmon_numArchEventsSilvermont = NUM_ARCH_EVENTS_SILVERMONT;
 
 int perfmon_init_silvermont(int cpu_id)
 {
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     return 0;
 }
@@ -168,7 +168,7 @@ int perfmon_setupCountersThread_silvermont(
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -225,7 +225,7 @@ int perfmon_startCountersThread_silvermont(int thread_id, PerfmonEventSet* event
     uint64_t flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -288,7 +288,7 @@ int perfmon_stopCountersThread_silvermont(int thread_id, PerfmonEventSet* eventS
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -372,7 +372,7 @@ int perfmon_readCountersThread_silvermont(int thread_id, PerfmonEventSet* eventS
     int haveLock = 0;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -462,11 +462,11 @@ int perfmon_finalizeCountersThread_silvermont(int thread_id, PerfmonEventSet* ev
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_silvermont_counters.h b/src/includes/perfmon_silvermont_counters.h
index 70020ce..437cd90 100644
--- a/src/includes/perfmon_silvermont_counters.h
+++ b/src/includes/perfmon_silvermont_counters.h
@@ -5,13 +5,13 @@
  *
  *      Description: Counter header file of perfmon module for Intel Atom (Silvermont)
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_silvermont_events.txt b/src/includes/perfmon_silvermont_events.txt
index 6198372..b654aa2 100644
--- a/src/includes/perfmon_silvermont_events.txt
+++ b/src/includes/perfmon_silvermont_events.txt
@@ -4,13 +4,13 @@
 #
 #      Description:  Event list for Intel Atom (Silvermont)
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -29,12 +29,18 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
+UMASK_PWR_PP1_ENERGY          0x00
+
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
+UMASK_PWR_DRAM_ENERGY          0x00
+
 EVENT_INSTR_RETIRED              0x00   FIXC0
 UMASK_INSTR_RETIRED_ANY          0x00
 
diff --git a/src/includes/perfmon_skylake.h b/src/includes/perfmon_skylake.h
index 9061784..4a98da8 100644
--- a/src/includes/perfmon_skylake.h
+++ b/src/includes/perfmon_skylake.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Skylake.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -31,6 +31,8 @@
 
 #include <perfmon_skylake_events.h>
 #include <perfmon_skylake_counters.h>
+#include <perfmon_skylakeX_events.h>
+#include <perfmon_skylakeX_counters.h>
 #include <error.h>
 #include <affinity.h>
 #include <limits.h>
@@ -41,11 +43,45 @@ static int perfmon_numCountersSkylake = NUM_COUNTERS_SKYLAKE;
 static int perfmon_numCoreCountersSkylake = NUM_COUNTERS_CORE_SKYLAKE;
 static int perfmon_numArchEventsSkylake = NUM_ARCH_EVENTS_SKYLAKE;
 
+static int perfmon_numCountersSkylakeX = NUM_COUNTERS_SKYLAKEX;
+static int perfmon_numCoreCountersSkylakeX = NUM_COUNTERS_CORE_SKYLAKEX;
+static int perfmon_numArchEventsSkylakeX = NUM_ARCH_EVENTS_SKYLAKEX;
+
+static int skl_did_cbox_check = 0;
+int skl_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event);
+int skx_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event);
+int (*skylake_cbox_setup)(int, RegisterIndex, PerfmonEvent *);
+
+int skl_cbox_nosetup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    return 0;
+}
 int perfmon_init_skylake(int cpu_id)
 {
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
+    if (cpuid_info.model == SKYLAKEX)
+    {
+        skylake_cbox_setup = skx_cbox_setup;
+        skl_did_cbox_check = 1;
+    }
+    else if ((cpuid_info.model == SKYLAKE1 || cpuid_info.model == SKYLAKE2) &&
+             socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id &&
+             skl_did_cbox_check == 0)
+    {
+        int ret = 0;
+        uint64_t data = 0x0ULL;
+        ret = HPMwrite(cpu_id, MSR_DEV, MSR_V4_C0_PERF_CTRL0, 0x0ULL);
+        ret += HPMread(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, &data);
+        ret += HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL);
+        ret += HPMread(cpu_id, MSR_DEV, MSR_V4_C0_PERF_CTRL0, &data);
+        if ((ret == 0) && (data == 0x0ULL))
+            skylake_cbox_setup = skl_cbox_setup;
+        else
+            skylake_cbox_setup = skl_cbox_nosetup;
+        skl_did_cbox_check = 1;
+    }
     return 0;
 }
 
@@ -145,7 +181,7 @@ int skl_pmc_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
         VERBOSEPRINTREG(cpu_id, MSR_OFFCORE_RESP1, LLU_CAST offcore_flags, SETUP_PMC_OFFCORE);
         CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_OFFCORE_RESP1, offcore_flags));
     }
-    else if (event->eventId == 0xC6)
+    if (event->eventId == 0xC6)
     {
         VERBOSEPRINTREG(cpu_id, MSR_V4_PEBS_FRONTEND, LLU_CAST event->cmask, SETUP_PMC_FRONTEND);
         CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_PEBS_FRONTEND, event->cmask));
@@ -164,7 +200,7 @@ int skl_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -200,11 +236,29 @@ int skl_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     return 0;
 }
 
+int skl_uboxfix_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    uint64_t flags = 0x0ULL;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+    flags = (1ULL<<22)|(1ULL<<20);
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, flags, SETUP_UBOXFIX);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
 int skl_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
 {
     int j;
     uint64_t flags = 0x0ULL;
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -237,6 +291,444 @@ int skl_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     return 0;
 }
 
+int skx_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    int j;
+    uint64_t flags = 0x0ULL;
+    uint64_t filter_flags0 = 0x0ULL;
+    uint64_t filter_flags1 = 0x0ULL;
+    uint32_t filter0 = box_map[counter_map[index].type].filterRegister1;
+    uint32_t filter1 = box_map[counter_map[index].type].filterRegister2;
+    int set_state_all = 0;
+    int opc_match = 0;
+    int match1 = 0;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+
+    flags = (1ULL<<22);
+    flags |= (event->umask<<8) + event->eventId;
+    if (event->eventId == 0x34)
+    {
+        set_state_all = 1;
+    }
+    if ((event->eventId == 0x13 || event->eventId == 0x11) && (event->umask & 0x2ULL))
+    {
+        fprintf(stderr, "IRQ_REJECTED should not be Ored with the other umasks.");
+    }
+
+    if (event->numberOfOptions > 0)
+    {
+        for(j = 0; j < event->numberOfOptions; j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_EDGE:
+                    flags |= (1ULL<<18);
+                    break;
+                case EVENT_OPTION_INVERT:
+                    flags |= (1ULL<<23);
+                    break;
+                case EVENT_OPTION_THRESHOLD:
+                    flags |= (event->options[j].value & 0xFFULL) << 24;
+                    break;
+                case EVENT_OPTION_OPCODE:
+                    filter_flags1 |= (extractBitField(event->options[j].value,20,0) << 9);
+                    filter_flags1 |= (0x3<<27);
+                    filter_flags1 |= (0x3<<17);
+                    opc_match = 1;
+                    break;
+                case EVENT_OPTION_STATE:
+                    filter_flags0 |= (extractBitField(event->options[j].value,10,0) << 17);
+                    set_state_all = 0;
+                    break;
+                case EVENT_OPTION_TID:
+                    filter_flags0 |= (extractBitField(event->options[j].value,8,0));
+                    flags |= (1ULL<<19);
+                    break;
+                case EVENT_OPTION_MATCH0:
+                    filter_flags1 |= ((extractBitField(event->options[j].value,2,0) & 0x3ULL) << 30);
+                    break;
+                case EVENT_OPTION_MATCH1:
+                    filter_flags1 |= (extractBitField(event->options[j].value,6,0) & 0x33);
+                    match1 = 1;
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    if (opc_match && !match1)
+    {
+        filter_flags1 |= 0x33ULL;
+        VERBOSEPRINTREG(cpu_id, filter1, filter_flags1, SETUP_CBOX_ADD_OPCODE_MATCH1);
+    }
+
+    if (filter_flags0 != 0x0ULL)
+    {
+        VERBOSEPRINTREG(cpu_id, filter0, filter_flags0, SETUP_CBOX_FILTER0);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, filter0, filter_flags0));
+    }
+    else
+    {
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, filter0, 0x0ULL));
+    }
+    if (filter_flags1 != 0x0ULL)
+    {
+        VERBOSEPRINTREG(cpu_id, filter1, filter_flags1, SETUP_CBOX_FILTER1);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, filter1, filter_flags1));
+    }
+    else
+    {
+        VERBOSEPRINTREG(cpu_id, filter0, filter_flags0, SETUP_CBOX_DEF_FILTER_STATE);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, filter1, 0x3BULL));
+    }
+
+    if (set_state_all)
+    {
+        CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, filter0, &filter_flags0));
+        filter_flags0 |= (0x3FF << 17);
+        VERBOSEPRINTREG(cpu_id, filter0, filter_flags0, SETUP_CBOX_DEF_FILTER_STATE);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, filter0, filter_flags0));
+    }
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, flags, SETUP_CBOX);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int skx_mbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    int j;
+    uint64_t flags = 0x0ULL;
+    PciDeviceIndex dev = counter_map[index].device;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+    if (!HPMcheck(dev, cpu_id))
+    {
+        return -ENODEV;
+    }
+
+    flags = (1ULL<<20)|(1ULL<<22);
+    flags |= (event->umask<<8) + event->eventId;
+    if (event->numberOfOptions > 0)
+    {
+        for(j = 0; j < event->numberOfOptions; j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_EDGE:
+                    flags |= (1ULL<<18);
+                    break;
+                case EVENT_OPTION_INVERT:
+                    flags |= (1ULL<<23);
+                    break;
+                case EVENT_OPTION_THRESHOLD:
+                    flags |= (event->options[j].value & 0xFFULL) << 24;
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, flags, SETUP_MBOX);
+        CHECK_PCI_WRITE_ERROR(HPMwrite(cpu_id, dev, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int skx_mboxfix_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    int j;
+    uint64_t flags = 0x0ULL;
+    PciDeviceIndex dev = counter_map[index].device;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+    if (!HPMcheck(dev, cpu_id))
+    {
+        return -ENODEV;
+    }
+
+    flags = (1ULL<<20)|(1ULL<<22);
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTPCIREG(cpu_id, dev, counter_map[index].configRegister, flags, SETUP_MBOX);
+        CHECK_PCI_WRITE_ERROR(HPMwrite(cpu_id, dev, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int skx_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    int j;
+    uint64_t flags = 0x0ULL;
+    uint64_t filter = box_map[counter_map[index].type].filterRegister1;
+    int clean_filter = 1;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+
+    flags = (1ULL<<22)|(1ULL<<20);
+    flags |= event->eventId;
+    if ((event->umask > 0x00) && (event->umask <= 0x3))
+    {
+        flags |= (event->umask << 14);
+    }
+    else if (event->umask == 0xFF)
+    {
+        flags = (1ULL<<21);
+    }
+    if (event->numberOfOptions > 0)
+    {
+        for(j = 0; j < event->numberOfOptions; j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_EDGE:
+                    flags |= (1ULL<<18);
+                    break;
+                case EVENT_OPTION_INVERT:
+                    flags |= (1ULL<<23);
+                    break;
+                case EVENT_OPTION_THRESHOLD:
+                    flags |= (event->options[j].value & 0x1FULL) << 24;
+                    break;
+                case EVENT_OPTION_OCCUPANCY:
+                    flags |= ((event->options[j].value & 0x3ULL)<<14);
+                    break;
+                case EVENT_OPTION_OCCUPANCY_FILTER:
+                    clean_filter = 0;
+                    VERBOSEPRINTREG(cpu_id, filter, (event->options[j].value & 0xFFFFFFFFULL), SETUP_WBOX_FILTER);
+                    CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, filter, (event->options[j].value & 0xFFFFFFFFULL)));
+                    break;
+                case EVENT_OPTION_OCCUPANCY_EDGE:
+                    flags |= (1ULL<<31);
+                    break;
+                case EVENT_OPTION_OCCUPANCY_INVERT:
+                    flags |= (1ULL<<30);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    if (clean_filter)
+    {
+        VERBOSEPRINTREG(cpu_id, filter, (event->options[j].value & 0xFFFFFFFFULL), CLEAN_WBOX_FILTER);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, filter, 0x0ULL));
+    }
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, flags, SETUP_WBOX);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int skx_sbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    int j = 0;
+    uint64_t flags = 0x0ULL;
+    PciDeviceIndex dev = counter_map[index].device;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+    if (!HPMcheck(dev, cpu_id))
+    {
+        return -ENODEV;
+    }
+    flags = (1ULL<<20)|(1ULL<<22);
+    flags |= (event->umask<<8) + event->eventId;
+    if (event->numberOfOptions > 0)
+    {
+        for(j = 0; j < event->numberOfOptions; j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_EDGE:
+                    flags |= (1ULL<<18);
+                    break;
+                case EVENT_OPTION_INVERT:
+                    flags |= (1ULL<<23);
+                    break;
+                case EVENT_OPTION_THRESHOLD:
+                    flags |= (event->options[j].value & 0xFFULL) << 24;
+                    break;
+                case EVENT_OPTION_NID:
+                    flags |= (event->options[j].value & 0xFULL) << 40;
+                    flags |= (1ULL<<45);
+                    break;
+                case EVENT_OPTION_MATCH0:
+                    flags |= (event->options[j].value & 0xFFULL) << 32;
+                    break;
+                case EVENT_OPTION_MATCH1:
+                    flags |= (event->options[j].value & 0x3FF) << 46;
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, flags, SETUP_SBOX_BOX);
+        CHECK_PCI_WRITE_ERROR(HPMwrite(cpu_id, dev, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int skx_uncorebox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    int j;
+    uint64_t flags = 0x0ULL;
+    PciDeviceIndex dev = counter_map[index].device;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+    if (!HPMcheck(dev, cpu_id))
+    {
+        return -ENODEV;
+    }
+
+    flags = (1ULL<<20)|(1ULL<<22);
+    flags |= (event->umask<<8) + event->eventId;
+    if (event->numberOfOptions > 0)
+    {
+        for(j = 0; j < event->numberOfOptions; j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_EDGE:
+                    flags |= (1ULL<<18);
+                    break;
+                case EVENT_OPTION_INVERT:
+                    flags |= (1ULL<<23);
+                    break;
+                case EVENT_OPTION_THRESHOLD:
+                    flags |= (event->options[j].value & 0xFFULL) << 24;
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, flags, SETUP_UNCORE_BOX);
+        CHECK_PCI_WRITE_ERROR(HPMwrite(cpu_id, dev, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int skx_ibox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
+{
+    int j;
+    uint64_t flags = 0x0ULL;
+    PciDeviceIndex dev = counter_map[index].device;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+    if (!HPMcheck(counter_map[index].device, cpu_id))
+    {
+        return -ENODEV;
+    }
+
+    flags = (1ULL<<20)|(1ULL<<22);
+    flags |= (event->umask<<8) + event->eventId;
+    if (event->numberOfOptions > 0)
+    {
+        for(j = 0; j < event->numberOfOptions; j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_EDGE:
+                    flags |= (1ULL<<18);
+                    break;
+                case EVENT_OPTION_INVERT:
+                    flags |= (1ULL<<23);
+                    break;
+                case EVENT_OPTION_THRESHOLD:
+                    flags |= (event->options[j].value & 0xFFFULL) << 24;
+                    break;
+                case EVENT_OPTION_MASK0:
+                    flags |= (event->options[j].value & 0xFFULL) << 36;
+                    break;
+                case EVENT_OPTION_MASK1:
+                    flags |= (event->options[j].value & 0x7ULL) << 44;
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, flags, SETUP_IBOX);
+        CHECK_PCI_WRITE_ERROR(HPMwrite(cpu_id, dev, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+
+#define SKL_UNCORE_FREEZE \
+    if (haveLock && MEASURE_UNCORE(eventSet)) \
+    { \
+        if (cpuid_info.model == SKYLAKE1 || cpuid_info.model == SKYLAKE2) \
+        { \
+            VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL, FREEZE_UNCORE) \
+            CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL)); \
+            CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_STATUS, 0x0ULL)); \
+        } \
+        else if (cpuid_info.model == SKYLAKEX) \
+        { \
+            VERBOSEPRINTREG(cpu_id, MSR_UNC_V3_U_PMON_GLOBAL_CTL, (1ULL<<63), FREEZE_UNCORE) \
+            CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_UNC_V3_U_PMON_GLOBAL_CTL, (1ULL<<63))); \
+        } \
+    }
+
+#define SKL_UNCORE_UNFREEZE \
+    if (haveLock && MEASURE_UNCORE(eventSet)) \
+    { \
+        if (cpuid_info.model == SKYLAKE1 || cpuid_info.model == SKYLAKE2) \
+        { \
+            VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, uflags|(1ULL<<29), UNFREEZE_UNCORE) \
+            CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, uflags|(1ULL<<29))); \
+        } \
+        else if (cpuid_info.model == SKYLAKEX) \
+        { \
+            VERBOSEPRINTREG(cpu_id, MSR_UNC_V3_U_PMON_GLOBAL_CTL, (1ULL<<61), UNFREEZE_UNCORE) \
+            CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_UNC_V3_U_PMON_GLOBAL_CTL, (1ULL<<61))); \
+        } \
+    }
+
 int perfmon_setupCounterThread_skylake(
         int thread_id,
         PerfmonEventSet* eventSet)
@@ -246,7 +738,7 @@ int perfmon_setupCounterThread_skylake(
     uint64_t fixed_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -258,12 +750,7 @@ int perfmon_setupCounterThread_skylake(
         CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PERF_GLOBAL_OVF_CTRL, 0xC00000070000000F));
         CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     }
-    if (haveLock && MEASURE_UNCORE(eventSet))
-    {
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL, FREEZE_UBOXFIX)
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL));
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_STATUS, 0x0ULL));
-    }
+    SKL_UNCORE_FREEZE;
 
     for (int i=0;i < eventSet->numberOfEvents;i++)
     {
@@ -288,6 +775,12 @@ int perfmon_setupCounterThread_skylake(
                 break;
 
             case POWER:
+            case IBOX0FIX:
+            case IBOX1FIX:
+            case IBOX2FIX:
+            case IBOX3FIX:
+            case IBOX4FIX:
+            case IBOX5FIX:
                 break;
             case UBOXFIX:
                 if (haveLock)
@@ -301,11 +794,80 @@ int perfmon_setupCounterThread_skylake(
             case UBOX:
                 skl_ubox_setup(cpu_id, index, event);
                 break;
+            case WBOX:
+                skx_wbox_setup(cpu_id, index, event);
+                break;
             case CBOX0:
             case CBOX1:
             case CBOX2:
             case CBOX3:
-                skl_cbox_setup(cpu_id, index, event);
+            case CBOX4:
+            case CBOX5:
+            case CBOX6:
+            case CBOX7:
+            case CBOX8:
+            case CBOX9:
+            case CBOX10:
+            case CBOX11:
+            case CBOX12:
+            case CBOX13:
+            case CBOX14:
+            case CBOX15:
+            case CBOX16:
+            case CBOX17:
+            case CBOX18:
+            case CBOX19:
+            case CBOX20:
+            case CBOX21:
+            case CBOX22:
+            case CBOX23:
+            case CBOX24:
+            case CBOX25:
+            case CBOX26:
+            case CBOX27:
+                skylake_cbox_setup(cpu_id, index, event);
+                break;
+            case MBOX0:
+            case MBOX1:
+            case MBOX2:
+            case MBOX3:
+            case MBOX4:
+            case MBOX5:
+                skx_mbox_setup(cpu_id, index, event);
+                break;
+            case MBOX0FIX:
+            case MBOX1FIX:
+            case MBOX2FIX:
+            case MBOX3FIX:
+            case MBOX4FIX:
+            case MBOX5FIX:
+                skx_mboxfix_setup(cpu_id, index, event);
+                break;
+            case SBOX0:
+            case SBOX1:
+            case SBOX2:
+                skx_sbox_setup(cpu_id, index, event);
+                break;
+            case BBOX0:
+            case BBOX1:
+            case RBOX0:
+            case RBOX1:
+            case RBOX2:
+            case EUBOX0:
+            case EUBOX1:
+            case EUBOX2:
+            case EUBOX3:
+            case EUBOX4:
+            case EUBOX5:
+                skx_uncorebox_setup(cpu_id, index, event);
+                break;
+            case IBOX0:
+            case IBOX1:
+            case IBOX2:
+            case IBOX3:
+            case IBOX4:
+            case IBOX5:
+                skx_ibox_setup(cpu_id, index, event);
                 break;
             default:
                 break;
@@ -327,7 +889,7 @@ int perfmon_startCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet
     uint64_t tmp = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -387,10 +949,94 @@ int perfmon_startCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet
                 case CBOX1:
                 case CBOX2:
                 case CBOX3:
-                    if (haveLock)
+                case CBOX4:
+                case CBOX5:
+                case CBOX6:
+                case CBOX7:
+                case CBOX8:
+                case CBOX9:
+                case CBOX10:
+                case CBOX11:
+                case CBOX12:
+                case CBOX13:
+                case CBOX14:
+                case CBOX15:
+                case CBOX16:
+                case CBOX17:
+                case CBOX18:
+                case CBOX19:
+                case CBOX20:
+                case CBOX21:
+                case CBOX22:
+                case CBOX23:
+                case CBOX24:
+                case CBOX25:
+                case CBOX26:
+                case CBOX27:
+                    if (haveLock && (cpuid_info.model == SKYLAKE1 || cpuid_info.model == SKYLAKE2))
                     {
                         uflags |= (1ULL<<(type-CBOX0));
                     }
+                    else if (haveLock && cpuid_info.model == SKYLAKEX)
+                    {
+                        VERBOSEPRINTREG(cpu_id, counter1, 0x0ULL, CLEAR_CBOX)
+                        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, dev, counter1, 0x0ULL));
+                    }
+                    break;
+                case WBOX:
+                case MBOX0:
+                case MBOX1:
+                case MBOX2:
+                case MBOX3:
+                case MBOX4:
+                case MBOX5:
+                case MBOX0FIX:
+                case MBOX1FIX:
+                case MBOX2FIX:
+                case MBOX3FIX:
+                case MBOX4FIX:
+                case MBOX5FIX:
+                case BBOX0:
+                case BBOX1:
+                case SBOX0:
+                case SBOX1:
+                case SBOX2:
+                case RBOX0:
+                case RBOX1:
+                case RBOX2:
+                case IBOX0:
+                case IBOX1:
+                case IBOX2:
+                case IBOX3:
+                case IBOX4:
+                case IBOX5:
+                case EUBOX0:
+                case EUBOX1:
+                case EUBOX2:
+                case EUBOX3:
+                case EUBOX4:
+                case EUBOX5:
+
+                case IBOX0FIX:
+                case IBOX1FIX:
+                case IBOX2FIX:
+                case IBOX3FIX:
+                case IBOX4FIX:
+                case IBOX5FIX:
+                    if (haveLock)
+                    {
+                        VERBOSEPRINTREG(cpu_id, counter1, 0x0ULL, CLEAR_BOX)
+                        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, dev, counter1, 0x0ULL));
+                    }
+                    break;
+                case WBOX0FIX:
+                    if (haveLock)
+                    {
+                        tmp = 0x0ULL;
+                        VERBOSEPRINTREG(cpu_id, counter1, 0x0ULL, START_WBOXFIX)
+                        CHECK_MSR_READ_ERROR(HPMread(cpu_id, dev, counter1, &tmp));
+                        eventSet->events[i].threadCounter[thread_id].startData = field64(tmp, 0, box_map[type].regWidth);
+                    }
                     break;
                 default:
                     break;
@@ -399,11 +1045,7 @@ int perfmon_startCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet
         }
     }
 
-    if ((haveLock) && MEASURE_UNCORE(eventSet))
-    {
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, uflags|(1ULL<<29), UNFREEZE_UBOXFIX)
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, uflags|(1ULL<<29)));
-    }
+    SKL_UNCORE_UNFREEZE;
 
     if (MEASURE_CORE(eventSet))
     {
@@ -453,13 +1095,92 @@ int perfmon_startCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet
         } \
     }
 
+int skl_uncore_read(int cpu_id, RegisterIndex index, PerfmonEvent *event,
+                     uint64_t* cur_result, int* overflows, int flags,
+                     int global_offset, int box_offset)
+{
+    uint64_t result = 0x0ULL;
+    uint64_t tmp = 0x0ULL;
+    RegisterType type = counter_map[index].type;
+    PciDeviceIndex dev = counter_map[index].device;
+    uint64_t counter1 = counter_map[index].counterRegister;
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+
+    CHECK_PCI_READ_ERROR(HPMread(cpu_id, dev, counter1, &result));
+    VERBOSEPRINTPCIREG(cpu_id, dev, counter1, LLU_CAST result, READ_REG_1);
+    if (flags & FREEZE_FLAG_CLEAR_CTR)
+    {
+        VERBOSEPRINTPCIREG(cpu_id, dev, counter1, LLU_CAST 0x0U, CLEAR_REG_1);
+        CHECK_PCI_WRITE_ERROR(HPMwrite(cpu_id, dev, counter1, 0x0U));
+    }
+    //printf("%s: %lu\n", counter_map[index].key, result);
+    result = field64(result, 0, box_map[type].regWidth);
+    //printf("%s: %lu\n", counter_map[index].key, result);
+    if (result < *cur_result)
+    {
+        uint64_t ovf_values = 0x0ULL;
+        int global_offset = box_map[type].ovflOffset;
+        int test_local = 0;
+        uint32_t global_status_reg = MSR_UNC_V3_U_PMON_GLOBAL_STATUS;
+        if (cpuid_info.model != SKYLAKEX)
+        {
+            global_status_reg = MSR_V4_UNC_PERF_GLOBAL_STATUS;
+        }
+        if (global_offset != -1)
+        {
+            CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV,
+                                           global_status_reg,
+                                           &ovf_values));
+            VERBOSEPRINTREG(cpu_id, global_status_reg, LLU_CAST ovf_values, READ_GLOBAL_OVFL);
+            if (ovf_values & (1ULL<<global_offset))
+            {
+                VERBOSEPRINTREG(cpu_id, global_status_reg, LLU_CAST (1<<global_offset), CLEAR_GLOBAL_OVFL);
+                CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV,
+                                                 global_status_reg,
+                                                 (1<<global_offset)));
+                test_local = 1;
+            }
+        }
+        else
+        {
+            test_local = 1;
+        }
+
+        if (test_local && box_offset >= 0)
+        {
+            ovf_values = 0x0ULL;
+            CHECK_PCI_READ_ERROR(HPMread(cpu_id, dev,
+                                              box_map[type].statusRegister,
+                                              &ovf_values));
+            VERBOSEPRINTPCIREG(cpu_id, dev, box_map[type].statusRegister, LLU_CAST ovf_values, READ_BOX_OVFL);
+            if (ovf_values & (1ULL<<box_offset))
+            {
+                (*overflows)++;
+                VERBOSEPRINTPCIREG(cpu_id, dev, box_map[type].statusRegister, LLU_CAST (1<<box_offset), RESET_BOX_OVFL);
+                CHECK_PCI_WRITE_ERROR(HPMwrite(cpu_id, dev,
+                                                    box_map[type].statusRegister,
+                                                    (1<<box_offset)));
+            }
+        }
+        else if (test_local)
+        {
+            (*overflows)++;
+        }
+    }
+    *cur_result = result;
+    return 0;
+}
+
 int perfmon_stopCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
 {
     int haveLock = 0;
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -469,11 +1190,7 @@ int perfmon_stopCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
         VERBOSEPRINTREG(cpu_id, MSR_PERF_GLOBAL_CTRL, 0x0ULL, FREEZE_PMC_AND_FIXED)
         CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PERF_GLOBAL_CTRL, 0x0ULL));
     }
-    if ((haveLock) && MEASURE_UNCORE(eventSet))
-    {
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL, FREEZE_UBOXFIX)
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL));
-    }
+    SKL_UNCORE_FREEZE;
 
     for (int i=0;i < eventSet->numberOfEvents;i++)
     {
@@ -491,20 +1208,19 @@ int perfmon_stopCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
             uint64_t counter1 = counter_map[index].counterRegister;
             uint64_t* current = &(eventSet->events[i].threadCounter[thread_id].counterData);
             int* overflows = &(eventSet->events[i].threadCounter[thread_id].overflows);
+            int ovf_offset = box_map[type].ovflOffset;
             switch (type)
             {
                 case PMC:
                     CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                     SKL_CHECK_CORE_OVERFLOW(index-cpuid_info.perf_num_fixed_ctr);
                     VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_PMC)
-                    *current = field64(counter_result, 0, box_map[type].regWidth);
                     break;
 
                 case FIXED:
                     CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                     SKL_CHECK_CORE_OVERFLOW(index+32);
                     VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_FIXED)
-                    *current = field64(counter_result, 0, box_map[type].regWidth);
                     break;
 
                 case POWER:
@@ -514,24 +1230,21 @@ int perfmon_stopCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
                         VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, STOP_POWER)
                         if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
                         {
-                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER);
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
                             eventSet->events[i].threadCounter[thread_id].overflows++;
                         }
-                        *current = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
 
                 case THERMAL:
                     CHECK_TEMP_READ_ERROR(thermal_read(cpu_id,(uint32_t*)&counter_result));
-                    *current = field64(counter_result, 0, box_map[type].regWidth);
                     break;
-                
+
                 case UBOXFIX:
                     if (haveLock)
                     {
                         CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                         SKL_CHECK_UNCORE_OVERFLOW(box_map[type].ovflOffset);
-                        *current = field64(counter_result, 0, 44);
                     }
                     break;
                 case UBOX:
@@ -539,24 +1252,118 @@ int perfmon_stopCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
                     {
                         CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                         SKL_CHECK_UNCORE_OVERFLOW(box_map[type].ovflOffset);
-                        *current = field64(counter_result, 0, 44);
+                    }
+                    break;
+                case WBOX0FIX:
+                case IBOX0FIX:
+                case IBOX1FIX:
+                case IBOX2FIX:
+                case IBOX3FIX:
+                case IBOX4FIX:
+                case IBOX5FIX:
+                    if (haveLock)
+                    {
+                        CHECK_MSR_READ_ERROR(HPMread(cpu_id, dev, counter1, &counter_result));
+                        VERBOSEPRINTPCIREG(cpu_id, dev, counter1, LLU_CAST counter_result, STOP_UNC_FIXED_CTR);
                     }
                     break;
                 case CBOX0:
                 case CBOX1:
                 case CBOX2:
                 case CBOX3:
-                    if (haveLock)
+                case CBOX4:
+                case CBOX5:
+                case CBOX6:
+                case CBOX7:
+                case CBOX8:
+                case CBOX9:
+                case CBOX10:
+                case CBOX11:
+                case CBOX12:
+                case CBOX13:
+                case CBOX14:
+                case CBOX15:
+                case CBOX16:
+                case CBOX17:
+                case CBOX18:
+                case CBOX19:
+                case CBOX20:
+                case CBOX21:
+                case CBOX22:
+                case CBOX23:
+                case CBOX24:
+                case CBOX25:
+                case CBOX26:
+                case CBOX27:
+                case WBOX:
+                    if (haveLock && (cpuid_info.model == SKYLAKE1 || cpuid_info.model == SKYLAKE2))
                     {
                         CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                         SKL_CHECK_UNCORE_OVERFLOW(box_map[type].ovflOffset);
-                        *current = field64(counter_result, 0, box_map[type].regWidth);
+                        VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_CBOX)
+                    }
+                    else if (haveLock && cpuid_info.model == SKYLAKEX)
+                    {
+                        skl_uncore_read(cpu_id, index, event, current, overflows,
+                                    FREEZE_FLAG_CLEAR_CTR, ovf_offset, getCounterTypeOffset(index));
+                        counter_result = *current;
+                        VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_CBOX)
                     }
                     break;
+                case MBOX0:
+                case MBOX1:
+                case MBOX2:
+                case MBOX3:
+                case MBOX4:
+                case MBOX5:
+
+                    skl_uncore_read(cpu_id, index, event, current, overflows,
+                                    FREEZE_FLAG_CLEAR_CTR, ovf_offset, getCounterTypeOffset(index)+1);
+                    counter_result = *current;
+                    VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_MBOX)
+                    break;
+                case MBOX0FIX:
+                case MBOX1FIX:
+                case MBOX2FIX:
+                case MBOX3FIX:
+                case MBOX4FIX:
+                case MBOX5FIX:
+                case MBOX6FIX:
+                case MBOX7FIX:
+                    bdw_uncore_read(cpu_id, index, event, current, overflows,
+                                    FREEZE_FLAG_CLEAR_CTR, ovf_offset, 0);
+                    counter_result = *current;
+                    break;
+                case BBOX0:
+                case BBOX1:
+                case SBOX0:
+                case SBOX1:
+                case SBOX2:
+                case RBOX0:
+                case RBOX1:
+                case RBOX2:
+                case IBOX0:
+                case IBOX1:
+                case IBOX2:
+                case IBOX3:
+                case IBOX4:
+                case IBOX5:
+                case EUBOX0:
+                case EUBOX1:
+                case EUBOX2:
+                case EUBOX3:
+                case EUBOX4:
+                case EUBOX5:
+                    skl_uncore_read(cpu_id, index, event, current, overflows,
+                                    FREEZE_FLAG_CLEAR_CTR, ovf_offset, getCounterTypeOffset(index));
+                    counter_result = *current;
+                    VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_BBOX)
 
+                    break;
                 default:
                     break;
             }
+            *current = field64(counter_result, 0, box_map[type].regWidth);
         }
         eventSet->events[i].threadCounter[thread_id].init = FALSE;
     }
@@ -568,7 +1375,7 @@ int perfmon_stopCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
             CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_STATUS, counter_result));
         }
     }
-    
+
 
     return 0;
 }
@@ -582,7 +1389,7 @@ int perfmon_readCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -595,13 +1402,7 @@ int perfmon_readCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
         VERBOSEPRINTREG(cpu_id, MSR_PERF_GLOBAL_CTRL, 0x0ULL, RESET_PMC_FLAGS)
     }
 
-    if ((haveLock) && MEASURE_UNCORE(eventSet))
-    {
-        CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, &uflags));
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, LLU_CAST uflags, SAFE_UNCORE_FLAGS)
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL));
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL, RESET_UNCORE_FLAGS)
-    }
+    SKL_UNCORE_FREEZE;
 
     for (int i=0;i < eventSet->numberOfEvents;i++)
     {
@@ -619,20 +1420,19 @@ int perfmon_readCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
             uint64_t counter1 = counter_map[index].counterRegister;
             uint64_t* current = &(eventSet->events[i].threadCounter[thread_id].counterData);
             int* overflows = &(eventSet->events[i].threadCounter[thread_id].overflows);
+            int ovf_offset = box_map[type].ovflOffset;
             switch (type)
             {
                 case PMC:
                     CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                     SKL_CHECK_CORE_OVERFLOW(index-cpuid_info.perf_num_fixed_ctr);
                     VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_PMC)
-                    eventSet->events[i].threadCounter[thread_id].counterData = field64(counter_result, 0, box_map[type].regWidth);
                     break;
 
                 case FIXED:
                     CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                     SKL_CHECK_CORE_OVERFLOW(index+32);
                     VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_FIXED)
-                    eventSet->events[i].threadCounter[thread_id].counterData = field64(counter_result, 0, box_map[type].regWidth);
                     break;
 
                 case POWER:
@@ -642,10 +1442,9 @@ int perfmon_readCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
                         VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_POWER)
                         if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
                         {
-                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER);
+                            VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, OVERFLOW_POWER)
                             eventSet->events[i].threadCounter[thread_id].overflows++;
                         }
-                        eventSet->events[i].threadCounter[thread_id].counterData = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
 
@@ -653,13 +1452,19 @@ int perfmon_readCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
                     CHECK_TEMP_READ_ERROR(thermal_read(cpu_id,(uint32_t*)&counter_result));
                     eventSet->events[i].threadCounter[thread_id].counterData = field64(counter_result, 0, box_map[type].regWidth);
                     break;
-                
+
                 case UBOXFIX:
+                case WBOX0FIX:
+                case IBOX0FIX:
+                case IBOX1FIX:
+                case IBOX2FIX:
+                case IBOX3FIX:
+                case IBOX4FIX:
+                case IBOX5FIX:
                     if (haveLock)
                     {
                         CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                         SKL_CHECK_UNCORE_OVERFLOW(box_map[type].ovflOffset);
-                        *current = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
                 case UBOX:
@@ -667,37 +1472,104 @@ int perfmon_readCountersThread_skylake(int thread_id, PerfmonEventSet* eventSet)
                     {
                         CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                         SKL_CHECK_UNCORE_OVERFLOW(box_map[type].ovflOffset);
-                        *current = field64(counter_result, 0, box_map[type].regWidth);
                     }
                     break;
                 case CBOX0:
                 case CBOX1:
                 case CBOX2:
                 case CBOX3:
-                    if (haveLock)
+                case CBOX4:
+                case CBOX5:
+                case CBOX6:
+                case CBOX7:
+                case CBOX8:
+                case CBOX9:
+                case CBOX10:
+                case CBOX11:
+                case CBOX12:
+                case CBOX13:
+                case CBOX14:
+                case CBOX15:
+                case CBOX16:
+                case CBOX17:
+                case CBOX18:
+                case CBOX19:
+                case CBOX20:
+                case CBOX21:
+                case CBOX22:
+                case CBOX23:
+                case CBOX24:
+                case CBOX25:
+                case CBOX26:
+                case CBOX27:
+                    if (haveLock && (cpuid_info.model == SKYLAKE1 || cpuid_info.model == SKYLAKE2))
                     {
                         CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter1, &counter_result));
                         SKL_CHECK_UNCORE_OVERFLOW(box_map[type].ovflOffset);
                         *current = field64(counter_result, 0, box_map[type].regWidth);
                         uflags |= (1ULL<<(type-CBOX0));
                     }
+                    else if (haveLock && cpuid_info.model == SKYLAKEX)
+                    {
+                        skl_uncore_read(cpu_id, index, event, current, overflows,
+                                    0, ovf_offset, getCounterTypeOffset(index));
+                        counter_result = *current;
+                    }
+                    break;
+                case MBOX0:
+                case MBOX1:
+                case MBOX2:
+                case MBOX3:
+                case MBOX4:
+                case MBOX5:
+                    skl_uncore_read(cpu_id, index, event, current, overflows,
+                                    0, ovf_offset, getCounterTypeOffset(index)+1);
+                    counter_result = *current;
+                    break;
+                case MBOX0FIX:
+                case MBOX1FIX:
+                case MBOX2FIX:
+                case MBOX3FIX:
+                case MBOX4FIX:
+                case MBOX5FIX:
+                    skl_uncore_read(cpu_id, index, event, current, overflows,
+                                    0, ovf_offset, 0);
+                    counter_result = *current;
+                    break;
+                case BBOX0:
+                case BBOX1:
+                case SBOX0:
+                case SBOX1:
+                case SBOX2:
+                case RBOX0:
+                case RBOX1:
+                case RBOX2:
+                case IBOX0:
+                case IBOX1:
+                case IBOX2:
+                case IBOX3:
+                case IBOX4:
+                case IBOX5:
+                case EUBOX0:
+                case EUBOX1:
+                case EUBOX2:
+                case EUBOX3:
+                case EUBOX4:
+                case EUBOX5:
+                case WBOX:
+                    skl_uncore_read(cpu_id, index, event, current, overflows,
+                                    0, ovf_offset, getCounterTypeOffset(index));
+                    counter_result = *current;
+                    VERBOSEPRINTREG(cpu_id, counter1, LLU_CAST counter_result, READ_BBOX)
                     break;
-
                 default:
                     break;
             }
+            *current = field64(counter_result, 0, box_map[type].regWidth);
         }
     }
-    if ((haveLock) && MEASURE_UNCORE(eventSet))
-    {
-        CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_STATUS, &counter_result));
-        if (counter_result != 0x0ULL)
-        {
-            CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_STATUS, counter_result));
-        }
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, uflags|(1ULL<<29)));
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, uflags|(1ULL<<29), RESTORE_UNCORE_FLAGS)
-    }
+
+    SKL_UNCORE_UNFREEZE;
 
     if (MEASURE_CORE(eventSet))
     {
@@ -717,11 +1589,11 @@ int perfmon_finalizeCountersThread_skylake(int thread_id, PerfmonEventSet* event
     uint64_t ovf_values_uncore = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
@@ -749,11 +1621,6 @@ int perfmon_finalizeCountersThread_skylake(int thread_id, PerfmonEventSet* event
                     VERBOSEPRINTREG(cpu_id, MSR_OFFCORE_RESP1, 0x0ULL, CLEAR_OFFCORE_RESP1);
                     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_OFFCORE_RESP1, 0x0ULL));
                 }
-                else if (eventSet->events[i].event.eventId == 0xC6)
-                {
-                    VERBOSEPRINTREG(cpu_id, MSR_V4_PEBS_FRONTEND, 0x0ULL, CLEAR_PMC_FRONTEND);
-                    CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_PEBS_FRONTEND, 0x0ULL));
-                }
                 break;
             case FIXED:
                 ovf_values_core |= (1ULL<<(index+32));
@@ -761,7 +1628,7 @@ int perfmon_finalizeCountersThread_skylake(int thread_id, PerfmonEventSet* event
             default:
                 break;
         }
-        if ((reg) && (((type == PMC)||(type == FIXED))||((type >= UNCORE) && (haveLock))))
+        if ((reg) && (((type == PMC)||(type == FIXED))|| ((type >= UNCORE) && (haveLock))))
         {
             CHECK_MSR_READ_ERROR(HPMread(cpu_id, dev, reg, &ovf_values_uncore));
             VERBOSEPRINTPCIREG(cpu_id, dev, reg, ovf_values_uncore, SHOW_CTL);
@@ -774,20 +1641,22 @@ int perfmon_finalizeCountersThread_skylake(int thread_id, PerfmonEventSet* event
             }
             VERBOSEPRINTPCIREG(cpu_id, dev, counter_map[index].counterRegister, 0x0ULL, CLEAR_CTR);
             CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, dev, counter_map[index].counterRegister, 0x0ULL));
-            if (counter_map[index].counterRegister2 != 0x0)
-            {
-                VERBOSEPRINTPCIREG(cpu_id, dev, counter_map[index].counterRegister2, 0x0ULL, CLEAR_CTR);
-                CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, dev, counter_map[index].counterRegister2, 0x0ULL));
-            }
         }
         eventSet->events[i].threadCounter[thread_id].init = FALSE;
     }
     if (haveLock && MEASURE_UNCORE(eventSet))
     {
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_STATUS, LLU_CAST 0x0ULL, CLEAR_UNCORE_STATUS)
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_STATUS, 0x0ULL));
-        VERBOSEPRINTREG(cpu_id, MSR_V4_UNC_PERF_GLOBAL_CTRL, LLU_CAST 0x0ULL, CLEAR_UNCORE_CTRL)
-        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_V4_UNC_PERF_GLOBAL_CTRL, 0x0ULL));
+        uint32_t status_reg = MSR_V4_UNC_PERF_GLOBAL_STATUS;
+        uint32_t ctrl_reg = MSR_V4_UNC_PERF_GLOBAL_CTRL;
+        if (cpuid_info.model == SKYLAKEX)
+        {
+            status_reg = MSR_UNC_V3_U_PMON_GLOBAL_STATUS;
+            ctrl_reg = MSR_UNC_V3_U_PMON_GLOBAL_CTL;
+        }
+        VERBOSEPRINTREG(cpu_id, status_reg, LLU_CAST 0x0ULL, CLEAR_UNCORE_STATUS)
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, status_reg, 0x0ULL));
+        VERBOSEPRINTREG(cpu_id, ctrl_reg, LLU_CAST 0x0ULL, CLEAR_UNCORE_CTRL)
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, ctrl_reg, 0x0ULL));
         for (int i=UNCORE;i<NUM_UNITS;i++)
         {
             if (TESTTYPE(eventSet, i) && box_map[i].ctrlRegister != 0x0)
diff --git a/src/includes/perfmon_skylakeX_counters.h b/src/includes/perfmon_skylakeX_counters.h
new file mode 100644
index 0000000..70976ff
--- /dev/null
+++ b/src/includes/perfmon_skylakeX_counters.h
@@ -0,0 +1,561 @@
+/*
+ * =======================================================================================
+ *
+ *      Filename:  perfmon_skylakeX_counters.h
+ *
+ *      Description:  Counter Header File of perfmon module for Intel Skylake X.
+ *
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
+ *                Thomas Roehl (tr), thomas.roehl at googlemail.com
+ *      Project:  likwid
+ *
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+ *
+ *      This program is free software: you can redistribute it and/or modify it under
+ *      the terms of the GNU General Public License as published by the Free Software
+ *      Foundation, either version 3 of the License, or (at your option) any later
+ *      version.
+ *
+ *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License along with
+ *      this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * =======================================================================================
+ */
+
+#define NUM_COUNTERS_SKYLAKEX 333
+#define NUM_COUNTERS_CORE_SKYLAKEX 12
+#define NUM_COUNTERS_UNCORE_SKYLAKEX 321
+
+#define SKX_VALID_OPTIONS_FIXED EVENT_OPTION_ANYTHREAD_MASK|EVENT_OPTION_COUNT_KERNEL_MASK
+#define SKX_VALID_OPTIONS_PMC EVENT_OPTION_EDGE_MASK|EVENT_OPTION_COUNT_KERNEL_MASK| \
+            EVENT_OPTION_INVERT_MASK|EVENT_OPTION_ANYTHREAD_MASK| \
+            EVENT_OPTION_IN_TRANS_MASK|EVENT_OPTION_THRESHOLD_MASK
+#define SKX_VALID_OPTIONS_CBOX EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|\
+            EVENT_OPTION_THRESHOLD_MASK|EVENT_OPTION_TID_MASK| \
+            EVENT_OPTION_MATCH0_MASK|EVENT_OPTION_MATCH1_MASK| \
+            EVENT_OPTION_OPCODE_MASK|EVENT_OPTION_STATE_MASK
+#define SKX_VALID_OPTIONS_UBOX EVENT_OPTION_THRESHOLD_MASK|EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK
+#define SKX_VALID_OPTIONS_MBOX EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK
+#define SKX_VALID_OPTIONS_WBOX EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK|EVENT_OPTION_OCCUPANCY_MASK|EVENT_OPTION_OCCUPANCY_FILTER_MASK|EVENT_OPTION_OCCUPANCY_EDGE_MASK|EVENT_OPTION_OCCUPANCY_INVERT_MASK
+#define SKX_VALID_OPTIONS_BBOX EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK
+#define SKX_VALID_OPTIONS_RBOX EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK
+#define SKX_VALID_OPTIONS_IBOX EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK|EVENT_OPTION_MASK0_MASK|EVENT_OPTION_MASK1_MASK
+#define SKX_VALID_OPTIONS_IRP EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK
+#define SKX_VALID_OPTIONS_SBOX EVENT_OPTION_EDGE_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK|EVENT_OPTION_MATCH0_MASK|EVENT_OPTION_MATCH1_MASK|EVENT_OPTION_MASK0_MASK|EVENT_OPTION_MASK1_MASK|EVENT_OPTION_OPCODE_MASK
+
+
+/* SKX CHA */
+#define SKX_CHA_MSR_PMON_BOX_FILTER_TID		(0x1ffULL << 0)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_LINK	(0xfULL << 9)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_STATE	(0x3ffULL << 17)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_REM		(0x1ULL << 32)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_LOC		(0x1ULL << 33)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_ALL_OPC	(0x1ULL << 35)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_NM		(0x1ULL << 36)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_NOT_NM	(0x1ULL << 37)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_OPC0	(0x3ffULL << 41)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_OPC1	(0x3ffULL << 51)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_C6		(0x1ULL << 61)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_NC		(0x1ULL << 62)
+#define SKX_CHA_MSR_PMON_BOX_FILTER_ISOC	(0x1ULL << 63)
+
+#define SKX_PMON_CTL_TRESH_MASK		(0xff << 24)
+#define SKX_PMON_CTL_TRESH_MASK_EXT	(0xf)
+#define SKX_PMON_CTL_CH_MASK		(0xff << 4)
+#define SKX_PMON_CTL_FC_MASK	(0x7 << 12)
+
+#define SKX_PMON_CTL_UMASK_EXT		0xff
+
+
+static RegisterMap skylakeX_counter_map[NUM_COUNTERS_SKYLAKEX] = {
+    /* Fixed Counters: instructions retired, cycles unhalted core */
+    {"FIXC0", PMC0, FIXED, MSR_PERF_FIXED_CTR_CTRL, MSR_PERF_FIXED_CTR0, 0, 0, SKX_VALID_OPTIONS_FIXED},
+    {"FIXC1", PMC1, FIXED, MSR_PERF_FIXED_CTR_CTRL, MSR_PERF_FIXED_CTR1, 0, 0, SKX_VALID_OPTIONS_FIXED},
+    {"FIXC2", PMC2, FIXED, MSR_PERF_FIXED_CTR_CTRL, MSR_PERF_FIXED_CTR2, 0, 0, SKX_VALID_OPTIONS_FIXED},
+    /* PMC Counters: 4 48bit wide */
+    {"PMC0", PMC3, PMC, MSR_PERFEVTSEL0, MSR_PMC0, 0, 0, SKX_VALID_OPTIONS_PMC},
+    {"PMC1", PMC4, PMC, MSR_PERFEVTSEL1, MSR_PMC1, 0, 0, SKX_VALID_OPTIONS_PMC},
+    {"PMC2", PMC5, PMC, MSR_PERFEVTSEL2, MSR_PMC2, 0, 0, SKX_VALID_OPTIONS_PMC|EVENT_OPTION_IN_TRANS_ABORT_MASK},
+    {"PMC3", PMC6, PMC, MSR_PERFEVTSEL3, MSR_PMC3, 0, 0, SKX_VALID_OPTIONS_PMC},
+    /* Additional PMC Counters if HyperThreading is not active: 4 48bit wide */
+    {"PMC4", PMC7, PMC, MSR_PERFEVTSEL4, MSR_PMC4, 0, 0, SKX_VALID_OPTIONS_PMC},
+    {"PMC5", PMC8, PMC, MSR_PERFEVTSEL5, MSR_PMC5, 0, 0, SKX_VALID_OPTIONS_PMC},
+    {"PMC6", PMC9, PMC, MSR_PERFEVTSEL6, MSR_PMC6, 0, 0, SKX_VALID_OPTIONS_PMC|EVENT_OPTION_IN_TRANS_ABORT_MASK},
+    {"PMC7", PMC10, PMC, MSR_PERFEVTSEL7, MSR_PMC7, 0, 0, SKX_VALID_OPTIONS_PMC},
+    /* Temperature Sensor*/
+    {"TMP0", PMC11, THERMAL, 0, IA32_THERM_STATUS, 0, 0, EVENT_OPTION_NONE_MASK},
+    /* RAPL counters */
+    {"PWR0", PMC12, POWER, 0, MSR_PKG_ENERGY_STATUS, 0, 0, EVENT_OPTION_NONE_MASK},
+    {"PWR1", PMC13, POWER, 0, MSR_PP0_ENERGY_STATUS, 0, 0, EVENT_OPTION_NONE_MASK},
+    {"PWR2", PMC14, POWER, 0, MSR_PP1_ENERGY_STATUS,  0, 0, EVENT_OPTION_NONE_MASK},
+    {"PWR3", PMC15, POWER, 0, MSR_DRAM_ENERGY_STATUS,  0, 0, EVENT_OPTION_NONE_MASK},
+    //{"PWR4", PMC16, POWER, 0, MSR_PLATFORM_ENERGY_STATUS,  0, 0, EVENT_OPTION_NONE_MASK},
+    /* Uncore */
+    {"UBOX0", PMC16, UBOX, MSR_UNC_V3_U_PMON_CTL0, MSR_UNC_V3_U_PMON_CTR0,  0, 0, SKX_VALID_OPTIONS_UBOX},
+    {"UBOX1", PMC17, UBOX, MSR_UNC_V3_U_PMON_CTL1, MSR_UNC_V3_U_PMON_CTR1,  0, 0, SKX_VALID_OPTIONS_UBOX},
+    {"UBOXFIX", PMC18, UBOXFIX, MSR_UNC_V3_U_UCLK_FIXED_CTL, MSR_UNC_V3_U_UCLK_FIXED_CTR, 0, 0, EVENT_OPTION_NONE_MASK},
+    {"CBOX0C0", PMC19, CBOX0, MSR_UNC_V3_C0_PMON_CTL0, MSR_UNC_V3_C0_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX0C1", PMC20, CBOX0, MSR_UNC_V3_C0_PMON_CTL1, MSR_UNC_V3_C0_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX0C2", PMC21, CBOX0, MSR_UNC_V3_C0_PMON_CTL2, MSR_UNC_V3_C0_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX0C3", PMC22, CBOX0, MSR_UNC_V3_C0_PMON_CTL3, MSR_UNC_V3_C0_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX1C0", PMC23, CBOX1, MSR_UNC_V3_C1_PMON_CTL0, MSR_UNC_V3_C1_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX1C1", PMC24, CBOX1, MSR_UNC_V3_C1_PMON_CTL1, MSR_UNC_V3_C1_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX1C2", PMC25, CBOX1, MSR_UNC_V3_C1_PMON_CTL2, MSR_UNC_V3_C1_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX1C3", PMC26, CBOX1, MSR_UNC_V3_C1_PMON_CTL3, MSR_UNC_V3_C1_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX2C0", PMC27, CBOX2, MSR_UNC_V3_C2_PMON_CTL0, MSR_UNC_V3_C2_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX2C1", PMC28, CBOX2, MSR_UNC_V3_C2_PMON_CTL1, MSR_UNC_V3_C2_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX2C2", PMC29, CBOX2, MSR_UNC_V3_C2_PMON_CTL2, MSR_UNC_V3_C2_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX2C3", PMC30, CBOX2, MSR_UNC_V3_C2_PMON_CTL3, MSR_UNC_V3_C2_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX3C0", PMC31, CBOX3, MSR_UNC_V3_C3_PMON_CTL0, MSR_UNC_V3_C3_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX3C1", PMC32, CBOX3, MSR_UNC_V3_C3_PMON_CTL1, MSR_UNC_V3_C3_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX3C2", PMC33, CBOX3, MSR_UNC_V3_C3_PMON_CTL2, MSR_UNC_V3_C3_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX3C3", PMC34, CBOX3, MSR_UNC_V3_C3_PMON_CTL3, MSR_UNC_V3_C3_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX4C0", PMC35, CBOX4, MSR_UNC_V3_C4_PMON_CTL0, MSR_UNC_V3_C4_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX4C1", PMC36, CBOX4, MSR_UNC_V3_C4_PMON_CTL1, MSR_UNC_V3_C4_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX4C2", PMC37, CBOX4, MSR_UNC_V3_C4_PMON_CTL2, MSR_UNC_V3_C4_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX4C3", PMC38, CBOX4, MSR_UNC_V3_C4_PMON_CTL3, MSR_UNC_V3_C4_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX5C0", PMC39, CBOX5, MSR_UNC_V3_C5_PMON_CTL0, MSR_UNC_V3_C5_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX5C1", PMC40, CBOX5, MSR_UNC_V3_C5_PMON_CTL1, MSR_UNC_V3_C5_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX5C2", PMC41, CBOX5, MSR_UNC_V3_C5_PMON_CTL2, MSR_UNC_V3_C5_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX5C3", PMC42, CBOX5, MSR_UNC_V3_C5_PMON_CTL3, MSR_UNC_V3_C5_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX6C0", PMC43, CBOX6, MSR_UNC_V3_C6_PMON_CTL0, MSR_UNC_V3_C6_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX6C1", PMC44, CBOX6, MSR_UNC_V3_C6_PMON_CTL1, MSR_UNC_V3_C6_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX6C2", PMC45, CBOX6, MSR_UNC_V3_C6_PMON_CTL2, MSR_UNC_V3_C6_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX6C3", PMC46, CBOX6, MSR_UNC_V3_C6_PMON_CTL3, MSR_UNC_V3_C6_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX7C0", PMC47, CBOX7, MSR_UNC_V3_C7_PMON_CTL0, MSR_UNC_V3_C7_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX7C1", PMC48, CBOX7, MSR_UNC_V3_C7_PMON_CTL1, MSR_UNC_V3_C7_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX7C2", PMC49, CBOX7, MSR_UNC_V3_C7_PMON_CTL2, MSR_UNC_V3_C7_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX7C3", PMC50, CBOX7, MSR_UNC_V3_C7_PMON_CTL3, MSR_UNC_V3_C7_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX8C0", PMC51, CBOX8, MSR_UNC_V3_C8_PMON_CTL0, MSR_UNC_V3_C8_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX8C1", PMC52, CBOX8, MSR_UNC_V3_C8_PMON_CTL1, MSR_UNC_V3_C8_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX8C2", PMC53, CBOX8, MSR_UNC_V3_C8_PMON_CTL2, MSR_UNC_V3_C8_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX8C3", PMC54, CBOX8, MSR_UNC_V3_C8_PMON_CTL3, MSR_UNC_V3_C8_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX9C0", PMC55, CBOX9, MSR_UNC_V3_C9_PMON_CTL0, MSR_UNC_V3_C9_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX9C1", PMC56, CBOX9, MSR_UNC_V3_C9_PMON_CTL1, MSR_UNC_V3_C9_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX9C2", PMC57, CBOX9, MSR_UNC_V3_C9_PMON_CTL2, MSR_UNC_V3_C9_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX9C3", PMC58, CBOX9, MSR_UNC_V3_C9_PMON_CTL3, MSR_UNC_V3_C9_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX10C0", PMC59, CBOX10, MSR_UNC_V3_C10_PMON_CTL0, MSR_UNC_V3_C10_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX10C1", PMC60, CBOX10, MSR_UNC_V3_C10_PMON_CTL1, MSR_UNC_V3_C10_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX10C2", PMC61, CBOX10, MSR_UNC_V3_C10_PMON_CTL2, MSR_UNC_V3_C10_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX10C3", PMC62, CBOX10, MSR_UNC_V3_C10_PMON_CTL3, MSR_UNC_V3_C10_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX11C0", PMC63, CBOX11, MSR_UNC_V3_C11_PMON_CTL0, MSR_UNC_V3_C11_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX11C1", PMC64, CBOX11, MSR_UNC_V3_C11_PMON_CTL1, MSR_UNC_V3_C11_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX11C2", PMC65, CBOX11, MSR_UNC_V3_C11_PMON_CTL2, MSR_UNC_V3_C11_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX11C3", PMC66, CBOX11, MSR_UNC_V3_C11_PMON_CTL3, MSR_UNC_V3_C11_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX12C0", PMC67, CBOX12, MSR_UNC_V3_C12_PMON_CTL0, MSR_UNC_V3_C12_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX12C1", PMC68, CBOX12, MSR_UNC_V3_C12_PMON_CTL1, MSR_UNC_V3_C12_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX12C2", PMC69, CBOX12, MSR_UNC_V3_C12_PMON_CTL2, MSR_UNC_V3_C12_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX12C3", PMC70, CBOX12, MSR_UNC_V3_C12_PMON_CTL3, MSR_UNC_V3_C12_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX13C0", PMC71, CBOX13, MSR_UNC_V3_C13_PMON_CTL0, MSR_UNC_V3_C13_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX13C1", PMC72, CBOX13, MSR_UNC_V3_C13_PMON_CTL1, MSR_UNC_V3_C13_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX13C2", PMC73, CBOX13, MSR_UNC_V3_C13_PMON_CTL2, MSR_UNC_V3_C13_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX13C3", PMC74, CBOX13, MSR_UNC_V3_C13_PMON_CTL3, MSR_UNC_V3_C13_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX14C0", PMC75, CBOX14, MSR_UNC_V3_C14_PMON_CTL0, MSR_UNC_V3_C14_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX14C1", PMC76, CBOX14, MSR_UNC_V3_C14_PMON_CTL1, MSR_UNC_V3_C14_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX14C2", PMC77, CBOX14, MSR_UNC_V3_C14_PMON_CTL2, MSR_UNC_V3_C14_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX14C3", PMC78, CBOX14, MSR_UNC_V3_C14_PMON_CTL3, MSR_UNC_V3_C14_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX15C0", PMC79, CBOX15, MSR_UNC_V3_C15_PMON_CTL0, MSR_UNC_V3_C15_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX15C1", PMC80, CBOX15, MSR_UNC_V3_C15_PMON_CTL1, MSR_UNC_V3_C15_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX15C2", PMC81, CBOX15, MSR_UNC_V3_C15_PMON_CTL2, MSR_UNC_V3_C15_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX15C3", PMC82, CBOX15, MSR_UNC_V3_C15_PMON_CTL3, MSR_UNC_V3_C15_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX16C0", PMC83, CBOX16, MSR_UNC_V3_C16_PMON_CTL0, MSR_UNC_V3_C16_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX16C1", PMC84, CBOX16, MSR_UNC_V3_C16_PMON_CTL1, MSR_UNC_V3_C16_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX16C2", PMC85, CBOX16, MSR_UNC_V3_C16_PMON_CTL2, MSR_UNC_V3_C16_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX16C3", PMC86, CBOX16, MSR_UNC_V3_C16_PMON_CTL3, MSR_UNC_V3_C16_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX17C0", PMC87, CBOX17, MSR_UNC_V3_C17_PMON_CTL0, MSR_UNC_V3_C17_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX17C1", PMC88, CBOX17, MSR_UNC_V3_C17_PMON_CTL1, MSR_UNC_V3_C17_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX17C2", PMC89, CBOX17, MSR_UNC_V3_C17_PMON_CTL2, MSR_UNC_V3_C17_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX17C3", PMC90, CBOX17, MSR_UNC_V3_C17_PMON_CTL3, MSR_UNC_V3_C17_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX18C0", PMC91, CBOX18, MSR_UNC_V3_C18_PMON_CTL0, MSR_UNC_V3_C18_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX18C1", PMC92, CBOX18, MSR_UNC_V3_C18_PMON_CTL1, MSR_UNC_V3_C18_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX18C2", PMC93, CBOX18, MSR_UNC_V3_C18_PMON_CTL2, MSR_UNC_V3_C18_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX18C3", PMC94, CBOX18, MSR_UNC_V3_C18_PMON_CTL3, MSR_UNC_V3_C18_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX19C0", PMC95, CBOX19, MSR_UNC_V3_C19_PMON_CTL0, MSR_UNC_V3_C19_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX19C1", PMC96, CBOX19, MSR_UNC_V3_C19_PMON_CTL1, MSR_UNC_V3_C19_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX19C2", PMC97, CBOX19, MSR_UNC_V3_C19_PMON_CTL2, MSR_UNC_V3_C19_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX19C3", PMC98, CBOX19, MSR_UNC_V3_C19_PMON_CTL3, MSR_UNC_V3_C19_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX20C0", PMC99, CBOX20, MSR_UNC_V3_C20_PMON_CTL0, MSR_UNC_V3_C20_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX20C1", PMC100, CBOX20, MSR_UNC_V3_C20_PMON_CTL1, MSR_UNC_V3_C20_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX20C2", PMC101, CBOX20, MSR_UNC_V3_C20_PMON_CTL2, MSR_UNC_V3_C20_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX20C3", PMC102, CBOX20, MSR_UNC_V3_C20_PMON_CTL3, MSR_UNC_V3_C20_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX21C0", PMC103, CBOX21, MSR_UNC_V3_C21_PMON_CTL0, MSR_UNC_V3_C21_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX21C1", PMC104, CBOX21, MSR_UNC_V3_C21_PMON_CTL1, MSR_UNC_V3_C21_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX21C2", PMC105, CBOX21, MSR_UNC_V3_C21_PMON_CTL2, MSR_UNC_V3_C21_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX21C3", PMC106, CBOX21, MSR_UNC_V3_C21_PMON_CTL3, MSR_UNC_V3_C21_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX22C0", PMC107, CBOX22, MSR_UNC_V3_C22_PMON_CTL0, MSR_UNC_V3_C22_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX22C1", PMC108, CBOX22, MSR_UNC_V3_C22_PMON_CTL1, MSR_UNC_V3_C22_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX22C2", PMC109, CBOX22, MSR_UNC_V3_C22_PMON_CTL2, MSR_UNC_V3_C22_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX22C3", PMC110, CBOX22, MSR_UNC_V3_C22_PMON_CTL3, MSR_UNC_V3_C22_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX23C0", PMC111, CBOX23, MSR_UNC_V3_C23_PMON_CTL0, MSR_UNC_V3_C23_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX23C1", PMC112, CBOX23, MSR_UNC_V3_C23_PMON_CTL1, MSR_UNC_V3_C23_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX23C2", PMC113, CBOX23, MSR_UNC_V3_C23_PMON_CTL2, MSR_UNC_V3_C23_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX23C3", PMC114, CBOX23, MSR_UNC_V3_C23_PMON_CTL3, MSR_UNC_V3_C23_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX24C0", PMC115, CBOX24, MSR_UNC_V3_C24_PMON_CTL0, MSR_UNC_V3_C24_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX24C1", PMC116, CBOX24, MSR_UNC_V3_C24_PMON_CTL1, MSR_UNC_V3_C24_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX24C2", PMC117, CBOX24, MSR_UNC_V3_C24_PMON_CTL2, MSR_UNC_V3_C24_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX24C3", PMC118, CBOX24, MSR_UNC_V3_C24_PMON_CTL3, MSR_UNC_V3_C24_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX25C0", PMC119, CBOX25, MSR_UNC_V3_C25_PMON_CTL0, MSR_UNC_V3_C25_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX25C1", PMC120, CBOX25, MSR_UNC_V3_C25_PMON_CTL1, MSR_UNC_V3_C25_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX25C2", PMC121, CBOX25, MSR_UNC_V3_C25_PMON_CTL2, MSR_UNC_V3_C25_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX25C3", PMC122, CBOX25, MSR_UNC_V3_C25_PMON_CTL3, MSR_UNC_V3_C25_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX26C0", PMC123, CBOX26, MSR_UNC_V3_C26_PMON_CTL0, MSR_UNC_V3_C26_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX26C1", PMC124, CBOX26, MSR_UNC_V3_C26_PMON_CTL1, MSR_UNC_V3_C26_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX26C2", PMC125, CBOX26, MSR_UNC_V3_C26_PMON_CTL2, MSR_UNC_V3_C26_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX26C3", PMC126, CBOX26, MSR_UNC_V3_C26_PMON_CTL3, MSR_UNC_V3_C26_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX27C0", PMC127, CBOX27, MSR_UNC_V3_C27_PMON_CTL0, MSR_UNC_V3_C27_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX27C1", PMC128, CBOX27, MSR_UNC_V3_C27_PMON_CTL1, MSR_UNC_V3_C27_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX27C2", PMC129, CBOX27, MSR_UNC_V3_C27_PMON_CTL2, MSR_UNC_V3_C27_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"CBOX27C3", PMC130, CBOX27, MSR_UNC_V3_C27_PMON_CTL3, MSR_UNC_V3_C27_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_CBOX},
+    {"WBOX0", PMC131, WBOX, MSR_UNC_V3_PCU_PMON_CTL0, MSR_UNC_V3_PCU_PMON_CTR0, 0, 0, SKX_VALID_OPTIONS_WBOX},
+    {"WBOX1", PMC132, WBOX, MSR_UNC_V3_PCU_PMON_CTL1, MSR_UNC_V3_PCU_PMON_CTR1, 0, 0, SKX_VALID_OPTIONS_WBOX},
+    {"WBOX2", PMC133, WBOX, MSR_UNC_V3_PCU_PMON_CTL2, MSR_UNC_V3_PCU_PMON_CTR2, 0, 0, SKX_VALID_OPTIONS_WBOX},
+    {"WBOX3", PMC134, WBOX, MSR_UNC_V3_PCU_PMON_CTL3, MSR_UNC_V3_PCU_PMON_CTR3, 0, 0, SKX_VALID_OPTIONS_WBOX},
+    {"WBOX0FIX", PMC135, WBOX0FIX, 0, MSR_UNC_V3_PCU_CC3_CTR, 0, 0, EVENT_OPTION_NONE_MASK},
+    {"WBOX1FIX", PMC136, WBOX0FIX, 0, MSR_UNC_V3_PCU_CC6_CTR, 0, 0, EVENT_OPTION_NONE_MASK},
+    {"WBOX2FIX", PMC137, WBOX0FIX, 0, MSR_UNC_V3_PCU_PC3_CTR, 0, 0, EVENT_OPTION_NONE_MASK},
+    {"WBOX3FIX", PMC138, WBOX0FIX, 0, MSR_UNC_V3_PCU_PC6_CTR, 0, 0, EVENT_OPTION_NONE_MASK},
+    {"M2M0C0", PMC139, BBOX0, MSR_UNC_SKX_M2M_PMON_CTL0, MSR_UNC_SKX_M2M_PMON_CTR0, 0, PCI_HA_DEVICE_0, SKX_VALID_OPTIONS_BBOX},
+    {"M2M0C1", PMC140, BBOX0, MSR_UNC_SKX_M2M_PMON_CTL1, MSR_UNC_SKX_M2M_PMON_CTR1, 0, PCI_HA_DEVICE_0, SKX_VALID_OPTIONS_BBOX},
+    {"M2M0C2", PMC141, BBOX0, MSR_UNC_SKX_M2M_PMON_CTL2, MSR_UNC_SKX_M2M_PMON_CTR2, 0, PCI_HA_DEVICE_0, SKX_VALID_OPTIONS_BBOX},
+    {"M2M0C3", PMC142, BBOX0, MSR_UNC_SKX_M2M_PMON_CTL3, MSR_UNC_SKX_M2M_PMON_CTR3, 0, PCI_HA_DEVICE_0, SKX_VALID_OPTIONS_BBOX},
+    {"M2M1C0", PMC143, BBOX1, MSR_UNC_SKX_M2M_PMON_CTL0, MSR_UNC_SKX_M2M_PMON_CTR0, 0, PCI_HA_DEVICE_1, SKX_VALID_OPTIONS_BBOX},
+    {"M2M1C1", PMC144, BBOX1, MSR_UNC_SKX_M2M_PMON_CTL1, MSR_UNC_SKX_M2M_PMON_CTR1, 0, PCI_HA_DEVICE_1, SKX_VALID_OPTIONS_BBOX},
+    {"M2M1C2", PMC145, BBOX1, MSR_UNC_SKX_M2M_PMON_CTL2, MSR_UNC_SKX_M2M_PMON_CTR2, 0, PCI_HA_DEVICE_1, SKX_VALID_OPTIONS_BBOX},
+    {"M2M1C3", PMC146, BBOX1, MSR_UNC_SKX_M2M_PMON_CTL3, MSR_UNC_SKX_M2M_PMON_CTR2, 0, PCI_HA_DEVICE_1, SKX_VALID_OPTIONS_BBOX},
+    {"MBOX0C0", PMC147, MBOX0, PCI_UNC_SKX_MC_PMON_CTL0, PCI_UNC_SKX_MC_PMON_CTR0, 0, PCI_IMC_DEVICE_0_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX0C1", PMC148, MBOX0, PCI_UNC_SKX_MC_PMON_CTL1, PCI_UNC_SKX_MC_PMON_CTR1, 0, PCI_IMC_DEVICE_0_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX0C2", PMC149, MBOX0, PCI_UNC_SKX_MC_PMON_CTL2, PCI_UNC_SKX_MC_PMON_CTR2, 0, PCI_IMC_DEVICE_0_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX0C3", PMC150, MBOX0, PCI_UNC_SKX_MC_PMON_CTL3, PCI_UNC_SKX_MC_PMON_CTR3, 0, PCI_IMC_DEVICE_0_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX0FIX", PMC151, MBOX0FIX, PCI_UNC_SKX_MC_PMON_FIXED_CTL, PCI_UNC_SKX_MC_PMON_FIXED_CTR, 0, PCI_IMC_DEVICE_0_CH_0, EVENT_OPTION_INVERT_MASK},
+    {"MBOX1C0", PMC152, MBOX1, PCI_UNC_SKX_MC_PMON_CTL0, PCI_UNC_SKX_MC_PMON_CTR0, 0, PCI_IMC_DEVICE_0_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX1C1", PMC153, MBOX1, PCI_UNC_SKX_MC_PMON_CTL1, PCI_UNC_SKX_MC_PMON_CTR1, 0, PCI_IMC_DEVICE_0_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX1C2", PMC154, MBOX1, PCI_UNC_SKX_MC_PMON_CTL2, PCI_UNC_SKX_MC_PMON_CTR2, 0, PCI_IMC_DEVICE_0_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX1C3", PMC155, MBOX1, PCI_UNC_SKX_MC_PMON_CTL3, PCI_UNC_SKX_MC_PMON_CTR3, 0, PCI_IMC_DEVICE_0_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX1FIX", PMC156, MBOX1FIX, PCI_UNC_SKX_MC_PMON_FIXED_CTL, PCI_UNC_SKX_MC_PMON_FIXED_CTR, 0, PCI_IMC_DEVICE_0_CH_1, EVENT_OPTION_INVERT_MASK},
+    {"MBOX2C0", PMC157, MBOX2, PCI_UNC_SKX_MC_PMON_CTL0, PCI_UNC_SKX_MC_PMON_CTR0, 0, PCI_IMC_DEVICE_0_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX2C1", PMC158, MBOX2, PCI_UNC_SKX_MC_PMON_CTL1, PCI_UNC_SKX_MC_PMON_CTR1, 0, PCI_IMC_DEVICE_0_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX2C2", PMC159, MBOX2, PCI_UNC_SKX_MC_PMON_CTL2, PCI_UNC_SKX_MC_PMON_CTR2, 0, PCI_IMC_DEVICE_0_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX2C3", PMC160, MBOX2, PCI_UNC_SKX_MC_PMON_CTL3, PCI_UNC_SKX_MC_PMON_CTR3, 0, PCI_IMC_DEVICE_0_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX2FIX", PMC161, MBOX2FIX, PCI_UNC_SKX_MC_PMON_FIXED_CTL, PCI_UNC_SKX_MC_PMON_FIXED_CTR, 0, PCI_IMC_DEVICE_0_CH_2, EVENT_OPTION_INVERT_MASK},
+    {"MBOX3C0", PMC162, MBOX3, PCI_UNC_SKX_MC_PMON_CTL0, PCI_UNC_SKX_MC_PMON_CTR0, 0, PCI_IMC_DEVICE_1_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX3C1", PMC163, MBOX3, PCI_UNC_SKX_MC_PMON_CTL1, PCI_UNC_SKX_MC_PMON_CTR1, 0, PCI_IMC_DEVICE_1_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX3C2", PMC164, MBOX3, PCI_UNC_SKX_MC_PMON_CTL2, PCI_UNC_SKX_MC_PMON_CTR2, 0, PCI_IMC_DEVICE_1_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX3C3", PMC165, MBOX3, PCI_UNC_SKX_MC_PMON_CTL3, PCI_UNC_SKX_MC_PMON_CTR3, 0, PCI_IMC_DEVICE_1_CH_0, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX3FIX", PMC166, MBOX3FIX, PCI_UNC_SKX_MC_PMON_FIXED_CTL, PCI_UNC_SKX_MC_PMON_FIXED_CTR, 0, PCI_IMC_DEVICE_1_CH_0, EVENT_OPTION_INVERT_MASK},
+    {"MBOX4C0", PMC167, MBOX4, PCI_UNC_SKX_MC_PMON_CTL0, PCI_UNC_SKX_MC_PMON_CTR0, 0, PCI_IMC_DEVICE_1_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX4C1", PMC168, MBOX4, PCI_UNC_SKX_MC_PMON_CTL1, PCI_UNC_SKX_MC_PMON_CTR1, 0, PCI_IMC_DEVICE_1_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX4C2", PMC169, MBOX4, PCI_UNC_SKX_MC_PMON_CTL2, PCI_UNC_SKX_MC_PMON_CTR2, 0, PCI_IMC_DEVICE_1_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX4C3", PMC170, MBOX4, PCI_UNC_SKX_MC_PMON_CTL3, PCI_UNC_SKX_MC_PMON_CTR3, 0, PCI_IMC_DEVICE_1_CH_1, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX4FIX", PMC171, MBOX4FIX, PCI_UNC_SKX_MC_PMON_FIXED_CTL, PCI_UNC_SKX_MC_PMON_FIXED_CTR, 0, PCI_IMC_DEVICE_1_CH_1, EVENT_OPTION_INVERT_MASK},
+    {"MBOX5C0", PMC172, MBOX5, PCI_UNC_SKX_MC_PMON_CTL0, PCI_UNC_SKX_MC_PMON_CTR0, 0, PCI_IMC_DEVICE_1_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX5C1", PMC173, MBOX5, PCI_UNC_SKX_MC_PMON_CTL1, PCI_UNC_SKX_MC_PMON_CTR1, 0, PCI_IMC_DEVICE_1_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX5C2", PMC174, MBOX5, PCI_UNC_SKX_MC_PMON_CTL2, PCI_UNC_SKX_MC_PMON_CTR2, 0, PCI_IMC_DEVICE_1_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX5C3", PMC175, MBOX5, PCI_UNC_SKX_MC_PMON_CTL3, PCI_UNC_SKX_MC_PMON_CTR3, 0, PCI_IMC_DEVICE_1_CH_2, SKX_VALID_OPTIONS_MBOX},
+    {"MBOX5FIX", PMC176, MBOX5FIX, PCI_UNC_SKX_MC_PMON_FIXED_CTL, PCI_UNC_SKX_MC_PMON_FIXED_CTR, 0, PCI_IMC_DEVICE_1_CH_2, EVENT_OPTION_INVERT_MASK},
+    {"SBOX0C0", PMC177, SBOX0, MSR_UNC_SKX_UPI_PMON_CTL0, MSR_UNC_SKX_UPI_PMON_CTR0, 0, PCI_QPI_DEVICE_PORT_0, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX0C1", PMC178, SBOX0, MSR_UNC_SKX_UPI_PMON_CTL1, MSR_UNC_SKX_UPI_PMON_CTR1, 0, PCI_QPI_DEVICE_PORT_0, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX0C2", PMC179, SBOX0, MSR_UNC_SKX_UPI_PMON_CTL2, MSR_UNC_SKX_UPI_PMON_CTR2, 0, PCI_QPI_DEVICE_PORT_0, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX1C0", PMC180, SBOX1, MSR_UNC_SKX_UPI_PMON_CTL0, MSR_UNC_SKX_UPI_PMON_CTR0, 0, PCI_QPI_DEVICE_PORT_1, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX1C1", PMC181, SBOX1, MSR_UNC_SKX_UPI_PMON_CTL1, MSR_UNC_SKX_UPI_PMON_CTR1, 0, PCI_QPI_DEVICE_PORT_1, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX1C2", PMC182, SBOX1, MSR_UNC_SKX_UPI_PMON_CTL2, MSR_UNC_SKX_UPI_PMON_CTR2, 0, PCI_QPI_DEVICE_PORT_1, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX2C0", PMC183, SBOX2, MSR_UNC_SKX_UPI_PMON_CTL0, MSR_UNC_SKX_UPI_PMON_CTR0, 0, PCI_QPI_DEVICE_PORT_2, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX2C1", PMC184, SBOX2, MSR_UNC_SKX_UPI_PMON_CTL1, MSR_UNC_SKX_UPI_PMON_CTR1, 0, PCI_QPI_DEVICE_PORT_2, SKX_VALID_OPTIONS_SBOX},
+    {"SBOX2C2", PMC185, SBOX2, MSR_UNC_SKX_UPI_PMON_CTL2, MSR_UNC_SKX_UPI_PMON_CTR2, 0, PCI_QPI_DEVICE_PORT_2, SKX_VALID_OPTIONS_SBOX},
+    {"RBOX0C0", PMC186, RBOX0, MSR_UNC_SKX_M3UPI_PMON_CTL0, MSR_UNC_SKX_M3UPI_PMON_CTR0, 0, PCI_R3QPI_DEVICE_LINK_0, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX0C1", PMC187, RBOX0, MSR_UNC_SKX_M3UPI_PMON_CTL1, MSR_UNC_SKX_M3UPI_PMON_CTR1, 0, PCI_R3QPI_DEVICE_LINK_0, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX0C2", PMC188, RBOX0, MSR_UNC_SKX_M3UPI_PMON_CTL2, MSR_UNC_SKX_M3UPI_PMON_CTR2, 0, PCI_R3QPI_DEVICE_LINK_0, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX1C0", PMC189, RBOX1, MSR_UNC_SKX_M3UPI_PMON_CTL0, MSR_UNC_SKX_M3UPI_PMON_CTR0, 0, PCI_R3QPI_DEVICE_LINK_1, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX1C1", PMC190, RBOX1, MSR_UNC_SKX_M3UPI_PMON_CTL1, MSR_UNC_SKX_M3UPI_PMON_CTR1, 0, PCI_R3QPI_DEVICE_LINK_1, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX1C2", PMC191, RBOX1, MSR_UNC_SKX_M3UPI_PMON_CTL2, MSR_UNC_SKX_M3UPI_PMON_CTR2, 0, PCI_R3QPI_DEVICE_LINK_1, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX2C0", PMC192, RBOX2, MSR_UNC_SKX_M3UPI_PMON_CTL0, MSR_UNC_SKX_M3UPI_PMON_CTR0, 0, PCI_R3QPI_DEVICE_LINK_2, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX2C1", PMC193, RBOX2, MSR_UNC_SKX_M3UPI_PMON_CTL1, MSR_UNC_SKX_M3UPI_PMON_CTR1, 0, PCI_R3QPI_DEVICE_LINK_2, SKX_VALID_OPTIONS_RBOX},
+    {"RBOX2C2", PMC194, RBOX2, MSR_UNC_SKX_M3UPI_PMON_CTL2, MSR_UNC_SKX_M3UPI_PMON_CTR2, 0, PCI_R3QPI_DEVICE_LINK_2, SKX_VALID_OPTIONS_RBOX},
+    {"IBOX0C0", PMC195, IBOX0, MSR_UNC_SKX_II0_CBDMA_CTL0, MSR_UNC_SKX_II0_CBDMA_CTR0, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX0C1", PMC196, IBOX0, MSR_UNC_SKX_II0_CBDMA_CTL1, MSR_UNC_SKX_II0_CBDMA_CTR1, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX0C2", PMC197, IBOX0, MSR_UNC_SKX_II0_CBDMA_CTL2, MSR_UNC_SKX_II0_CBDMA_CTR2, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX0C3", PMC198, IBOX0, MSR_UNC_SKX_II0_CBDMA_CTL3, MSR_UNC_SKX_II0_CBDMA_CTR3, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX0CLK", PMC199, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_CLOCK, 0, 0, 0},
+    {"IBAND0PI0", PMC200, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT0_IN, 0, 0, 0},
+    {"IBAND0PI1", PMC201, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT1_IN, 0, 0, 0},
+    {"IBAND0PI2", PMC202, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT2_IN, 0, 0, 0},
+    {"IBAND0PI3", PMC203, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT3_IN, 0, 0, 0},
+    {"IBAND0PO0", PMC204, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT0_OUT, 0, 0, 0},
+    {"IBAND0PO1", PMC205, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT1_OUT, 0, 0, 0},
+    {"IBAND0PO2", PMC206, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT2_OUT, 0, 0, 0},
+    {"IBAND0PO3", PMC207, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_BAND_PORT3_OUT, 0, 0, 0},
+    {"IUTIL0PI0", PMC208, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT0_IN, 0, 0, 0},
+    {"IUTIL0PI1", PMC209, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT1_IN, 0, 0, 0},
+    {"IUTIL0PI2", PMC210, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT2_IN, 0, 0, 0},
+    {"IUTIL0PI3", PMC211, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT3_IN, 0, 0, 0},
+    {"IUTIL0PO0", PMC212, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT0_OUT, 0, 0, 0},
+    {"IUTIL0PO1", PMC213, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT1_OUT, 0, 0, 0},
+    {"IUTIL0PO2", PMC214, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT2_OUT, 0, 0, 0},
+    {"IUTIL0PO3", PMC215, IBOX0FIX, 0, MSR_UNC_SKX_II0_CBDMA_UTIL_PORT3_OUT, 0, 0, 0},
+    {"IBOX1C0", PMC216, IBOX1, MSR_UNC_SKX_II0_PCIE0_CTL0, MSR_UNC_SKX_II0_PCIE0_CTR0, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX1C1", PMC217, IBOX1, MSR_UNC_SKX_II0_PCIE0_CTL1, MSR_UNC_SKX_II0_PCIE0_CTR1, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX1C2", PMC218, IBOX1, MSR_UNC_SKX_II0_PCIE0_CTL2, MSR_UNC_SKX_II0_PCIE0_CTR2, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX1C3", PMC219, IBOX1, MSR_UNC_SKX_II0_PCIE0_CTL3, MSR_UNC_SKX_II0_PCIE0_CTR3, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX1CLK", PMC220, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_CLOCK, 0, 0, 0},
+    {"IBAND1PI0", PMC221, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT0_IN, 0, 0, 0},
+    {"IBAND1PI1", PMC222, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT1_IN, 0, 0, 0},
+    {"IBAND1PI2", PMC223, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT2_IN, 0, 0, 0},
+    {"IBAND1PI3", PMC224, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT3_IN, 0, 0, 0},
+    {"IBAND1PO0", PMC225, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT0_OUT, 0, 0, 0},
+    {"IBAND1PO1", PMC226, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT1_OUT, 0, 0, 0},
+    {"IBAND1PO2", PMC227, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT2_OUT, 0, 0, 0},
+    {"IBAND1PO3", PMC228, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_BAND_PORT3_OUT, 0, 0, 0},
+    {"IUTIL1PI0", PMC229, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT0_IN, 0, 0, 0},
+    {"IUTIL1PI1", PMC230, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT1_IN, 0, 0, 0},
+    {"IUTIL1PI2", PMC231, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT2_IN, 0, 0, 0},
+    {"IUTIL1PI3", PMC232, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT3_IN, 0, 0, 0},
+    {"IUTIL1PO0", PMC233, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT0_OUT, 0, 0, 0},
+    {"IUTIL1PO1", PMC234, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT1_OUT, 0, 0, 0},
+    {"IUTIL1PO2", PMC235, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT2_OUT, 0, 0, 0},
+    {"IUTIL1PO3", PMC236, IBOX1FIX, 0, MSR_UNC_SKX_II0_PCIE0_UTIL_PORT3_OUT, 0, 0, 0},
+    {"IBOX2C0", PMC237,IBOX2, MSR_UNC_SKX_II0_PCIE1_CTL0, MSR_UNC_SKX_II0_PCIE1_CTR0, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX2C1", PMC238, IBOX2, MSR_UNC_SKX_II0_PCIE1_CTL1, MSR_UNC_SKX_II0_PCIE1_CTR1, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX2C2", PMC239, IBOX2, MSR_UNC_SKX_II0_PCIE1_CTL2, MSR_UNC_SKX_II0_PCIE1_CTR2, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX2C3", PMC240, IBOX2, MSR_UNC_SKX_II0_PCIE1_CTL3, MSR_UNC_SKX_II0_PCIE1_CTR3, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX2CLK", PMC241, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_CLOCK, 0, 0, 0},
+    {"IBAND2PI0", PMC242, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT0_IN, 0, 0, 0},
+    {"IBAND2PI1", PMC243, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT1_IN, 0, 0, 0},
+    {"IBAND2PI2", PMC244, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT2_IN, 0, 0, 0},
+    {"IBAND2PI3", PMC245, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT3_IN, 0, 0, 0},
+    {"IBAND2PO0", PMC246, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT0_OUT, 0, 0, 0},
+    {"IBAND2PO1", PMC247, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT1_OUT, 0, 0, 0},
+    {"IBAND2PO2", PMC248, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT2_OUT, 0, 0, 0},
+    {"IBAND2PO3", PMC249, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_BAND_PORT3_OUT, 0, 0, 0},
+    {"IUTIL2PI0", PMC250, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT0_IN, 0, 0, 0},
+    {"IUTIL2PI1", PMC251, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT1_IN, 0, 0, 0},
+    {"IUTIL2PI2", PMC252, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT2_IN, 0, 0, 0},
+    {"IUTIL2PI3", PMC253, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT3_IN, 0, 0, 0},
+    {"IUTIL2PO0", PMC254, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT0_OUT, 0, 0, 0},
+    {"IUTIL2PO1", PMC255, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT1_OUT, 0, 0, 0},
+    {"IUTIL2PO2", PMC256, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT2_OUT, 0, 0, 0},
+    {"IUTIL2PO3", PMC257, IBOX2FIX, 0, MSR_UNC_SKX_II0_PCIE1_UTIL_PORT3_OUT, 0, 0, 0},
+    {"IBOX3C0", PMC258, IBOX3, MSR_UNC_SKX_II0_PCIE2_CTL0, MSR_UNC_SKX_II0_PCIE2_CTR0, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX3C1", PMC259, IBOX3, MSR_UNC_SKX_II0_PCIE2_CTL1, MSR_UNC_SKX_II0_PCIE2_CTR1, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX3C2", PMC260, IBOX3, MSR_UNC_SKX_II0_PCIE2_CTL2, MSR_UNC_SKX_II0_PCIE2_CTR2, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX3C3", PMC261, IBOX3, MSR_UNC_SKX_II0_PCIE2_CTL3, MSR_UNC_SKX_II0_PCIE2_CTR3, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX3CLK", PMC262, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_CLOCK, 0, 0, 0},
+    {"IBAND3PI0", PMC263, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT0_IN, 0, 0, 0},
+    {"IBAND3PI1", PMC264, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT1_IN, 0, 0, 0},
+    {"IBAND3PI2", PMC265, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT2_IN, 0, 0, 0},
+    {"IBAND3PI3", PMC266, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT3_IN, 0, 0, 0},
+    {"IBAND3PO0", PMC267, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT0_OUT, 0, 0, 0},
+    {"IBAND3PO1", PMC268, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT1_OUT, 0, 0, 0},
+    {"IBAND3PO2", PMC269, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT2_OUT, 0, 0, 0},
+    {"IBAND3PO3", PMC270, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_BAND_PORT3_OUT, 0, 0, 0},
+    {"IUTIL3PI0", PMC271, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT0_IN, 0, 0, 0},
+    {"IUTIL3PI1", PMC272, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT1_IN, 0, 0, 0},
+    {"IUTIL3PI2", PMC273, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT2_IN, 0, 0, 0},
+    {"IUTIL3PI3", PMC274, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT3_IN, 0, 0, 0},
+    {"IUTIL3PO0", PMC275, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT0_OUT, 0, 0, 0},
+    {"IUTIL3PO1", PMC276, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT1_OUT, 0, 0, 0},
+    {"IUTIL3PO2", PMC277, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT2_OUT, 0, 0, 0},
+    {"IUTIL3PO3", PMC278, IBOX3FIX, 0, MSR_UNC_SKX_II0_PCIE2_UTIL_PORT3_OUT, 0, 0, 0},
+
+    {"IBOX4C0", PMC279, IBOX4, MSR_UNC_SKX_II0_MCP0_CTL0, MSR_UNC_SKX_II0_MCP0_CTR0, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX4C1", PMC280, IBOX4, MSR_UNC_SKX_II0_MCP0_CTL1, MSR_UNC_SKX_II0_MCP0_CTR1, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX4C2", PMC281, IBOX4, MSR_UNC_SKX_II0_MCP0_CTL2, MSR_UNC_SKX_II0_MCP0_CTR2, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX4C3", PMC282, IBOX4, MSR_UNC_SKX_II0_MCP0_CTL3, MSR_UNC_SKX_II0_MCP0_CTR3, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX4CLK", PMC283, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_CLOCK, 0, 0, 0},
+    {"IBAND4PI0", PMC284, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT0_IN, 0, 0, 0},
+    {"IBAND4PI1", PMC285, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT1_IN, 0, 0, 0},
+    {"IBAND4PI2", PMC286, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT2_IN, 0, 0, 0},
+    {"IBAND4PI3", PMC287, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT3_IN, 0, 0, 0},
+    {"IBAND4PO0", PMC288, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT0_OUT, 0, 0, 0},
+    {"IBAND4PO1", PMC289, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT1_OUT, 0, 0, 0},
+    {"IBAND4PO2", PMC290, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT2_OUT, 0, 0, 0},
+    {"IBAND4PO3", PMC291, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_BAND_PORT3_OUT, 0, 0, 0},
+    {"IUTIL4PI0", PMC292, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT0_IN, 0, 0, 0},
+    {"IUTIL4PI1", PMC293, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT1_IN, 0, 0, 0},
+    {"IUTIL4PI2", PMC294, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT2_IN, 0, 0, 0},
+    {"IUTIL4PI3", PMC295, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT3_IN, 0, 0, 0},
+    {"IUTIL4PO0", PMC296, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT0_OUT, 0, 0, 0},
+    {"IUTIL4PO1", PMC297, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT1_OUT, 0, 0, 0},
+    {"IUTIL4PO2", PMC298, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT2_OUT, 0, 0, 0},
+    {"IUTIL4PO3", PMC299, IBOX4FIX, 0, MSR_UNC_SKX_II0_MCP0_UTIL_PORT3_OUT, 0, 0, 0},
+    {"IBOX5C0", PMC300, IBOX5, MSR_UNC_SKX_II0_MCP1_CTL0, MSR_UNC_SKX_II0_MCP1_CTR0, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX5C1", PMC301, IBOX5, MSR_UNC_SKX_II0_MCP1_CTL1, MSR_UNC_SKX_II0_MCP1_CTR1, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX5C2", PMC302, IBOX5, MSR_UNC_SKX_II0_MCP1_CTL2, MSR_UNC_SKX_II0_MCP1_CTR2, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX5C3", PMC303, IBOX5, MSR_UNC_SKX_II0_MCP1_CTL3, MSR_UNC_SKX_II0_MCP1_CTR3, 0, 0, SKX_VALID_OPTIONS_IBOX},
+    {"IBOX5CLK", PMC304, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_CLOCK, 0, 0, 0},
+    {"IBAND5PI0", PMC305, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT0_IN, 0, 0, 0},
+    {"IBAND5PI1", PMC306, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT1_IN, 0, 0, 0},
+    {"IBAND5PI2", PMC307, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT2_IN, 0, 0, 0},
+    {"IBAND5PI3", PMC308, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT3_IN, 0, 0, 0},
+    {"IBAND5PO0", PMC309, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT0_OUT, 0, 0, 0},
+    {"IBAND5PO1", PMC310, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT1_OUT, 0, 0, 0},
+    {"IBAND5PO2", PMC311, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT2_OUT, 0, 0, 0},
+    {"IBAND5PO3", PMC312, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_BAND_PORT3_OUT, 0, 0, 0},
+    {"IUTIL5PI0", PMC313, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT0_IN, 0, 0, 0},
+    {"IUTIL5PI1", PMC314, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT1_IN, 0, 0, 0},
+    {"IUTIL5PI2", PMC315, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT2_IN, 0, 0, 0},
+    {"IUTIL5PI3", PMC316, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT3_IN, 0, 0, 0},
+    {"IUTIL5PO0", PMC317, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT0_OUT, 0, 0, 0},
+    {"IUTIL5PO1", PMC318, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT1_OUT, 0, 0, 0},
+    {"IUTIL5PO2", PMC319, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT2_OUT, 0, 0, 0},
+    {"IUTIL5PO3", PMC320, IBOX5FIX, 0, MSR_UNC_SKX_II0_MCP1_UTIL_PORT3_OUT, 0, 0, 0},
+    {"IRP0C0", PMC321, EUBOX0, MSR_UNC_SKX_IRP_CBDMA_CTL0, MSR_UNC_SKX_IRP_CBDMA_CTR0, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP0C1", PMC322, EUBOX0, MSR_UNC_SKX_IRP_CBDMA_CTL1, MSR_UNC_SKX_IRP_CBDMA_CTR1, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP1C0", PMC323, EUBOX1, MSR_UNC_SKX_IRP_PCIE0_CTL0, MSR_UNC_SKX_IRP_PCIE0_CTR0, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP1C1", PMC324, EUBOX1, MSR_UNC_SKX_IRP_PCIE0_CTL1, MSR_UNC_SKX_IRP_PCIE0_CTR1, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP2C0", PMC325, EUBOX2, MSR_UNC_SKX_IRP_PCIE1_CTL0, MSR_UNC_SKX_IRP_PCIE1_CTR0, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP2C1", PMC326, EUBOX2, MSR_UNC_SKX_IRP_PCIE1_CTL1, MSR_UNC_SKX_IRP_PCIE1_CTR1, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP3C0", PMC327, EUBOX3, MSR_UNC_SKX_IRP_PCIE2_CTL0, MSR_UNC_SKX_IRP_PCIE2_CTR0, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP3C1", PMC328, EUBOX3, MSR_UNC_SKX_IRP_PCIE2_CTL1, MSR_UNC_SKX_IRP_PCIE2_CTR1, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP4C0", PMC329, EUBOX4, MSR_UNC_SKX_IRP_MCP0_CTL0, MSR_UNC_SKX_IRP_MCP0_CTR0, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP4C1", PMC330, EUBOX4, MSR_UNC_SKX_IRP_MCP0_CTL1, MSR_UNC_SKX_IRP_MCP0_CTR1, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP5C0", PMC331, EUBOX5, MSR_UNC_SKX_IRP_MCP1_CTL0, MSR_UNC_SKX_IRP_MCP1_CTR0, 0, 0, SKX_VALID_OPTIONS_IRP},
+    {"IRP5C1", PMC332, EUBOX5, MSR_UNC_SKX_IRP_MCP1_CTL1, MSR_UNC_SKX_IRP_MCP1_CTR1, 0, 0, SKX_VALID_OPTIONS_IRP},
+};
+
+
+static BoxMap skylakeX_box_map[NUM_UNITS] = {
+    [PMC] = {MSR_PERF_GLOBAL_CTRL, MSR_V4_PERF_GLOBAL_STATUS, MSR_V4_PERF_GLOBAL_STATUS_RESET, 0, 0, 0, 48},
+    [THERMAL] = {0, 0, 0, 0, 0, 0, 8},
+    [FIXED] =  {MSR_PERF_GLOBAL_CTRL, MSR_V4_PERF_GLOBAL_STATUS, MSR_V4_PERF_GLOBAL_STATUS_RESET, 0, 0, 0, 48},
+    [POWER] = {0, 0, 0, 0, 0, 0, 32},
+    [UBOX] = {0, MSR_UNC_V3_U_PMON_BOX_STATUS, MSR_UNC_V3_U_PMON_BOX_STATUS, 1, 0, 0, 48},
+    [UBOXFIX] = {0, MSR_UNC_V3_U_PMON_BOX_STATUS, MSR_UNC_V3_U_PMON_BOX_STATUS, 0, 0, 0, 48},
+    [MBOX0] = {PCI_UNC_SKX_MC_PMON_BOX_CTL, PCI_UNC_SKX_MC_PMON_BOX_STATUS, PCI_UNC_SKX_MC_PMON_BOX_STATUS, 39, 1, PCI_IMC_DEVICE_0_CH_0, 48},
+    [MBOX1] = {PCI_UNC_SKX_MC_PMON_BOX_CTL, PCI_UNC_SKX_MC_PMON_BOX_STATUS, PCI_UNC_SKX_MC_PMON_BOX_STATUS, 39, 1, PCI_IMC_DEVICE_0_CH_1, 48},
+    [MBOX2] = {PCI_UNC_SKX_MC_PMON_BOX_CTL, PCI_UNC_SKX_MC_PMON_BOX_STATUS, PCI_UNC_SKX_MC_PMON_BOX_STATUS, 39, 1, PCI_IMC_DEVICE_0_CH_2, 48},
+    [MBOX3] = {PCI_UNC_SKX_MC_PMON_BOX_CTL, PCI_UNC_SKX_MC_PMON_BOX_STATUS, PCI_UNC_SKX_MC_PMON_BOX_STATUS, 40, 1, PCI_IMC_DEVICE_1_CH_0, 48},
+    [MBOX4] = {PCI_UNC_SKX_MC_PMON_BOX_CTL, PCI_UNC_SKX_MC_PMON_BOX_STATUS, PCI_UNC_SKX_MC_PMON_BOX_STATUS, 40, 1, PCI_IMC_DEVICE_1_CH_1, 48},
+    [MBOX5] = {PCI_UNC_SKX_MC_PMON_BOX_CTL, PCI_UNC_SKX_MC_PMON_BOX_STATUS, PCI_UNC_SKX_MC_PMON_BOX_STATUS, 40, 1, PCI_IMC_DEVICE_1_CH_2, 48},
+    [SBOX0] = {MSR_UNC_SKX_UPI_PMON_BOX_CTL, MSR_UNC_SKX_UPI_PMON_BOX_STATUS, MSR_UNC_SKX_UPI_PMON_BOX_STATUS, 41, 1, PCI_QPI_DEVICE_PORT_0, 48},
+    [SBOX1] = {MSR_UNC_SKX_UPI_PMON_BOX_CTL, MSR_UNC_SKX_UPI_PMON_BOX_STATUS, MSR_UNC_SKX_UPI_PMON_BOX_STATUS, 42, 1, PCI_QPI_DEVICE_PORT_1, 48},
+    [SBOX2] = {MSR_UNC_SKX_UPI_PMON_BOX_CTL, MSR_UNC_SKX_UPI_PMON_BOX_STATUS, MSR_UNC_SKX_UPI_PMON_BOX_STATUS, 43, 1, PCI_QPI_DEVICE_PORT_2, 48},
+    [RBOX0] = {MSR_UNC_SKX_M3UPI_PMON_BOX_CTL, MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS, MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS, 46, 1, PCI_R3QPI_DEVICE_LINK_0, 48},
+    [RBOX1] = {MSR_UNC_SKX_M3UPI_PMON_BOX_CTL, MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS, MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS, 47, 1, PCI_R3QPI_DEVICE_LINK_1, 48},
+    [RBOX2] = {MSR_UNC_SKX_M3UPI_PMON_BOX_CTL, MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS, MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS, 0, 1, PCI_R3QPI_DEVICE_LINK_2, 48},
+    [BBOX0] = {MSR_UNC_SKX_M2M_PMON_BOX_CTL, MSR_UNC_SKX_M2M_PMON_BOX_STATUS, MSR_UNC_SKX_M2M_PMON_BOX_STATUS, 62, 1, PCI_HA_DEVICE_0, 48},
+    [BBOX1] = {MSR_UNC_SKX_M2M_PMON_BOX_CTL, MSR_UNC_SKX_M2M_PMON_BOX_STATUS, MSR_UNC_SKX_M2M_PMON_BOX_STATUS, 63, 1, PCI_HA_DEVICE_1, 48},
+    [WBOX] = {MSR_UNC_V3_PCU_PMON_BOX_CTL, MSR_UNC_V3_PCU_PMON_BOX_STATUS,MSR_UNC_V3_PCU_PMON_BOX_STATUS, 2, 0, 0, 48, MSR_UNC_V3_PCU_PMON_BOX_FILTER},
+    [WBOX0FIX] = {0,0,0,-1,0,0,64},
+    [CBOX0] = {MSR_UNC_V3_C0_PMON_BOX_CTL, MSR_UNC_V3_C0_PMON_BOX_STATUS, MSR_UNC_V3_C0_PMON_BOX_STATUS, 3, 0, 0, 48, MSR_UNC_V3_C0_PMON_BOX_FILTER0, MSR_UNC_V3_C0_PMON_BOX_FILTER1},
+    [CBOX1] = {MSR_UNC_V3_C1_PMON_BOX_CTL, MSR_UNC_V3_C1_PMON_BOX_STATUS, MSR_UNC_V3_C1_PMON_BOX_STATUS, 4, 0, 0, 48, MSR_UNC_V3_C1_PMON_BOX_FILTER0, MSR_UNC_V3_C1_PMON_BOX_FILTER1},
+    [CBOX2] = {MSR_UNC_V3_C2_PMON_BOX_CTL, MSR_UNC_V3_C2_PMON_BOX_STATUS, MSR_UNC_V3_C2_PMON_BOX_STATUS, 5, 0, 0, 48, MSR_UNC_V3_C2_PMON_BOX_FILTER0, MSR_UNC_V3_C2_PMON_BOX_FILTER1},
+    [CBOX3] = {MSR_UNC_V3_C3_PMON_BOX_CTL, MSR_UNC_V3_C3_PMON_BOX_STATUS, MSR_UNC_V3_C3_PMON_BOX_STATUS, 6, 0, 0, 48, MSR_UNC_V3_C3_PMON_BOX_FILTER0, MSR_UNC_V3_C3_PMON_BOX_FILTER1},
+    [CBOX4] = {MSR_UNC_V3_C4_PMON_BOX_CTL, MSR_UNC_V3_C4_PMON_BOX_STATUS, MSR_UNC_V3_C4_PMON_BOX_STATUS, 7, 0, 0, 48, MSR_UNC_V3_C4_PMON_BOX_FILTER0, MSR_UNC_V3_C4_PMON_BOX_FILTER1},
+    [CBOX5] = {MSR_UNC_V3_C5_PMON_BOX_CTL, MSR_UNC_V3_C5_PMON_BOX_STATUS, MSR_UNC_V3_C5_PMON_BOX_STATUS, 8, 0, 0, 48, MSR_UNC_V3_C5_PMON_BOX_FILTER0, MSR_UNC_V3_C5_PMON_BOX_FILTER1},
+    [CBOX6] = {MSR_UNC_V3_C6_PMON_BOX_CTL, MSR_UNC_V3_C6_PMON_BOX_STATUS, MSR_UNC_V3_C6_PMON_BOX_STATUS, 9, 0, 0, 48, MSR_UNC_V3_C6_PMON_BOX_FILTER0, MSR_UNC_V3_C6_PMON_BOX_FILTER1},
+    [CBOX7] = {MSR_UNC_V3_C7_PMON_BOX_CTL, MSR_UNC_V3_C7_PMON_BOX_STATUS, MSR_UNC_V3_C7_PMON_BOX_STATUS, 10, 0, 0, 48, MSR_UNC_V3_C7_PMON_BOX_FILTER0, MSR_UNC_V3_C7_PMON_BOX_FILTER1},
+    [CBOX8] = {MSR_UNC_V3_C8_PMON_BOX_CTL, MSR_UNC_V3_C8_PMON_BOX_STATUS, MSR_UNC_V3_C8_PMON_BOX_STATUS, 11, 0, 0, 48, MSR_UNC_V3_C8_PMON_BOX_FILTER0, MSR_UNC_V3_C8_PMON_BOX_FILTER1},
+    [CBOX9] = {MSR_UNC_V3_C9_PMON_BOX_CTL, MSR_UNC_V3_C9_PMON_BOX_STATUS, MSR_UNC_V3_C9_PMON_BOX_STATUS, 12, 0, 0, 48, MSR_UNC_V3_C9_PMON_BOX_FILTER0, MSR_UNC_V3_C9_PMON_BOX_FILTER1},
+    [CBOX10] = {MSR_UNC_V3_C10_PMON_BOX_CTL, MSR_UNC_V3_C10_PMON_BOX_STATUS, MSR_UNC_V3_C10_PMON_BOX_STATUS, 13, 0, 0, 48, MSR_UNC_V3_C10_PMON_BOX_FILTER0, MSR_UNC_V3_C10_PMON_BOX_FILTER1},
+    [CBOX11] = {MSR_UNC_V3_C11_PMON_BOX_CTL, MSR_UNC_V3_C11_PMON_BOX_STATUS, MSR_UNC_V3_C11_PMON_BOX_STATUS, 14, 0, 0, 48, MSR_UNC_V3_C11_PMON_BOX_FILTER0, MSR_UNC_V3_C11_PMON_BOX_FILTER1},
+    [CBOX12] = {MSR_UNC_V3_C12_PMON_BOX_CTL, MSR_UNC_V3_C12_PMON_BOX_STATUS, MSR_UNC_V3_C12_PMON_BOX_STATUS, 15, 0, 0, 48, MSR_UNC_V3_C12_PMON_BOX_FILTER0, MSR_UNC_V3_C12_PMON_BOX_FILTER1},
+    [CBOX13] = {MSR_UNC_V3_C13_PMON_BOX_CTL, MSR_UNC_V3_C13_PMON_BOX_STATUS, MSR_UNC_V3_C13_PMON_BOX_STATUS, 16, 0, 0, 48, MSR_UNC_V3_C13_PMON_BOX_FILTER0, MSR_UNC_V3_C13_PMON_BOX_FILTER1},
+    [CBOX14] = {MSR_UNC_V3_C14_PMON_BOX_CTL, MSR_UNC_V3_C14_PMON_BOX_STATUS, MSR_UNC_V3_C14_PMON_BOX_STATUS, 17, 0, 0, 48, MSR_UNC_V3_C14_PMON_BOX_FILTER0, MSR_UNC_V3_C14_PMON_BOX_FILTER1},
+    [CBOX15] = {MSR_UNC_V3_C15_PMON_BOX_CTL, MSR_UNC_V3_C15_PMON_BOX_STATUS, MSR_UNC_V3_C15_PMON_BOX_STATUS, 18, 0, 0, 48, MSR_UNC_V3_C15_PMON_BOX_FILTER0, MSR_UNC_V3_C15_PMON_BOX_FILTER1},
+    [CBOX16] = {MSR_UNC_V3_C16_PMON_BOX_CTL, MSR_UNC_V3_C16_PMON_BOX_STATUS, MSR_UNC_V3_C16_PMON_BOX_STATUS, 19, 0, 0, 48, MSR_UNC_V3_C16_PMON_BOX_FILTER0, MSR_UNC_V3_C16_PMON_BOX_FILTER1},
+    [CBOX17] = {MSR_UNC_V3_C17_PMON_BOX_CTL, MSR_UNC_V3_C17_PMON_BOX_STATUS, MSR_UNC_V3_C17_PMON_BOX_STATUS, 20, 0, 0, 48, MSR_UNC_V3_C17_PMON_BOX_FILTER0, MSR_UNC_V3_C17_PMON_BOX_FILTER1},
+    [CBOX18] = {MSR_UNC_V3_C18_PMON_BOX_CTL, MSR_UNC_V3_C18_PMON_BOX_STATUS, MSR_UNC_V3_C18_PMON_BOX_STATUS, 21, 0, 0, 48, MSR_UNC_V3_C18_PMON_BOX_FILTER0, MSR_UNC_V3_C18_PMON_BOX_FILTER1},
+    [CBOX19] = {MSR_UNC_V3_C19_PMON_BOX_CTL, MSR_UNC_V3_C19_PMON_BOX_STATUS, MSR_UNC_V3_C19_PMON_BOX_STATUS, 22, 0, 0, 48, MSR_UNC_V3_C19_PMON_BOX_FILTER0, MSR_UNC_V3_C19_PMON_BOX_FILTER1},
+    [CBOX20] = {MSR_UNC_V3_C20_PMON_BOX_CTL, MSR_UNC_V3_C20_PMON_BOX_STATUS, MSR_UNC_V3_C20_PMON_BOX_STATUS, 23, 0, 0, 48, MSR_UNC_V3_C20_PMON_BOX_FILTER0, MSR_UNC_V3_C20_PMON_BOX_FILTER1},
+    [CBOX21] = {MSR_UNC_V3_C21_PMON_BOX_CTL, MSR_UNC_V3_C21_PMON_BOX_STATUS, MSR_UNC_V3_C21_PMON_BOX_STATUS, 24, 0, 0, 48, MSR_UNC_V3_C21_PMON_BOX_FILTER0, MSR_UNC_V3_C21_PMON_BOX_FILTER1},
+    [CBOX22] = {MSR_UNC_V3_C22_PMON_BOX_CTL, MSR_UNC_V3_C22_PMON_BOX_STATUS, MSR_UNC_V3_C22_PMON_BOX_STATUS, 25, 0, 0, 48, MSR_UNC_V3_C22_PMON_BOX_FILTER0, MSR_UNC_V3_C22_PMON_BOX_FILTER1},
+    [CBOX23] = {MSR_UNC_V3_C23_PMON_BOX_CTL, MSR_UNC_V3_C23_PMON_BOX_STATUS, MSR_UNC_V3_C23_PMON_BOX_STATUS, 26, 0, 0, 48, MSR_UNC_V3_C23_PMON_BOX_FILTER0, MSR_UNC_V3_C23_PMON_BOX_FILTER1},
+    [CBOX24] = {MSR_UNC_V3_C24_PMON_BOX_CTL, MSR_UNC_V3_C24_PMON_BOX_STATUS, MSR_UNC_V3_C24_PMON_BOX_STATUS, 27, 0, 0, 48, MSR_UNC_V3_C24_PMON_BOX_FILTER0, MSR_UNC_V3_C24_PMON_BOX_FILTER1},
+    [CBOX25] = {MSR_UNC_V3_C25_PMON_BOX_CTL, MSR_UNC_V3_C25_PMON_BOX_STATUS, MSR_UNC_V3_C25_PMON_BOX_STATUS, 28, 0, 0, 48, MSR_UNC_V3_C25_PMON_BOX_FILTER0, MSR_UNC_V3_C25_PMON_BOX_FILTER1},
+    [CBOX26] = {MSR_UNC_V3_C26_PMON_BOX_CTL, MSR_UNC_V3_C26_PMON_BOX_STATUS, MSR_UNC_V3_C26_PMON_BOX_STATUS, 29, 0, 0, 48, MSR_UNC_V3_C26_PMON_BOX_FILTER0, MSR_UNC_V3_C26_PMON_BOX_FILTER1},
+    [CBOX27] = {MSR_UNC_V3_C27_PMON_BOX_CTL, MSR_UNC_V3_C27_PMON_BOX_STATUS, MSR_UNC_V3_C27_PMON_BOX_STATUS, 30, 0, 0, 48, MSR_UNC_V3_C27_PMON_BOX_FILTER0, MSR_UNC_V3_C27_PMON_BOX_FILTER1},
+    [IBOX0] = {MSR_UNC_SKX_II0_CBDMA_BOX_CTL, MSR_UNC_SKX_II0_CBDMA_BOX_STATUS, MSR_UNC_SKX_II0_CBDMA_BOX_STATUS, 56, 0, 0, 48},
+    [IBOX1] = {MSR_UNC_SKX_II0_PCIE0_BOX_CTL, MSR_UNC_SKX_II0_PCIE0_BOX_STATUS, MSR_UNC_SKX_II0_PCIE0_BOX_STATUS, 57, 0, 0, 48},
+    [IBOX2] = {MSR_UNC_SKX_II0_PCIE1_BOX_CTL, MSR_UNC_SKX_II0_PCIE1_BOX_STATUS, MSR_UNC_SKX_II0_PCIE1_BOX_STATUS, 58, 0, 0, 48},
+    [IBOX3] = {MSR_UNC_SKX_II0_PCIE2_BOX_CTL, MSR_UNC_SKX_II0_PCIE2_BOX_STATUS, MSR_UNC_SKX_II0_PCIE2_BOX_STATUS, 59, 0, 0, 48},
+    [IBOX4] = {MSR_UNC_SKX_II0_MCP0_BOX_CTL, MSR_UNC_SKX_II0_MCP0_BOX_STATUS, MSR_UNC_SKX_II0_MCP0_BOX_STATUS, 60, 0, 0, 48},
+    [IBOX5] = {MSR_UNC_SKX_II0_MCP1_BOX_CTL, MSR_UNC_SKX_II0_MCP1_BOX_STATUS, MSR_UNC_SKX_II0_MCP1_BOX_STATUS, -1, 0, 0, 48},
+    [IBOX0FIX] = {0, 0, 0, -1, 0, 0, 36},
+    [IBOX1FIX] = {0, 0, 0, -1, 0, 0, 36},
+    [IBOX2FIX] = {0, 0, 0, -1, 0, 0, 36},
+    [IBOX3FIX] = {0, 0, 0, -1, 0, 0, 36},
+    [IBOX4FIX] = {0, 0, 0, -1, 0, 0, 36},
+    [IBOX5FIX] = {0, 0, 0, -1, 0, 0, 36},
+    [EUBOX0] = {MSR_UNC_SKX_IRP_CBDMA_BOX_CTL, MSR_UNC_SKX_IRP_CBDMA_BOX_STATUS, MSR_UNC_SKX_IRP_CBDMA_BOX_STATUS, 56, 0, 0, 48},
+    [EUBOX1] = {MSR_UNC_SKX_IRP_PCIE0_BOX_CTL, MSR_UNC_SKX_IRP_PCIE0_BOX_STATUS, MSR_UNC_SKX_IRP_PCIE0_BOX_STATUS, 57, 0, 0, 48},
+    [EUBOX2] = {MSR_UNC_SKX_IRP_PCIE1_BOX_CTL, MSR_UNC_SKX_IRP_PCIE1_BOX_STATUS, MSR_UNC_SKX_IRP_PCIE1_BOX_STATUS, 58, 0, 0, 48},
+    [EUBOX3] = {MSR_UNC_SKX_IRP_PCIE2_BOX_CTL, MSR_UNC_SKX_IRP_PCIE2_BOX_STATUS, MSR_UNC_SKX_IRP_PCIE2_BOX_STATUS, 59, 0, 0, 48},
+    [EUBOX4] = {MSR_UNC_SKX_IRP_MCP0_BOX_CTL, MSR_UNC_SKX_IRP_MCP0_BOX_STATUS, MSR_UNC_SKX_IRP_MCP0_BOX_STATUS, 60, 0, 0, 48},
+    [EUBOX5] = {MSR_UNC_SKX_IRP_MCP1_BOX_CTL, MSR_UNC_SKX_IRP_MCP1_BOX_STATUS, MSR_UNC_SKX_IRP_MCP1_BOX_STATUS, 56, 0, 0, 48},
+};
+
+static PciDevice skylakeX_pci_devices[MAX_NUM_PCI_DEVICES] = {
+ [MSR_DEV] = {NODEVTYPE, "", "", ""},
+ [PCI_IMC_DEVICE_0_CH_0] = {IMC, "0a.2", "PCI_IMC_DEVICE_CH_0", "MBOX0", 0x2042},
+ [PCI_IMC_DEVICE_0_CH_1] = {IMC, "0a.6", "PCI_IMC_DEVICE_CH_1", "MBOX1", 0x2046},
+ [PCI_IMC_DEVICE_0_CH_2] = {IMC, "0b.2", "PCI_IMC_DEVICE_CH_2", "MBOX2", 0x204a},
+ [PCI_IMC_DEVICE_1_CH_0] = {IMC, "0c.2", "PCI_IMC_DEVICE_CH_0", "MBOX3", 0x2042},
+ [PCI_IMC_DEVICE_1_CH_1] = {IMC, "0c.6", "PCI_IMC_DEVICE_CH_1", "MBOX4", 0x2046},
+ [PCI_IMC_DEVICE_1_CH_2] = {IMC, "0d.2", "PCI_IMC_DEVICE_CH_2", "MBOX5", 0x204a},
+ [PCI_QPI_DEVICE_PORT_0] = {QPI, "0e.0", "PCI_QPI_DEVICE_PORT_0", "SBOX0", 0x2058},
+ [PCI_QPI_DEVICE_PORT_1] = {QPI, "0f.0", "PCI_QPI_DEVICE_PORT_1", "SBOX1", 0x2058},
+ [PCI_QPI_DEVICE_PORT_2] = {QPI, "10.0", "PCI_QPI_DEVICE_PORT_2", "SBOX1", 0x2058},
+ [PCI_R3QPI_DEVICE_LINK_0] = {R3QPI, "12.0", "PCI_R3QPI_DEVICE_LINK_0", "RBOX0", 0x204c},
+ [PCI_R3QPI_DEVICE_LINK_1] = {R3QPI, "12.1", "PCI_R3QPI_DEVICE_LINK_1", "RBOX1", 0x204d},
+ [PCI_R3QPI_DEVICE_LINK_2] = {R3QPI, "12.4", "PCI_R3QPI_DEVICE_LINK_2", "RBOX2", 0x204c},
+ [PCI_HA_DEVICE_0] = {HA, "08.0", "PCI_M2M_DEVICE_0", "BBOX0", 0x2066},
+ [PCI_HA_DEVICE_1] = {HA, "09.0", "PCI_M2M_DEVICE_1", "BBOX1", 0x2066},
+};
+
+static char* skylakeX_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [POWER] = "/sys/bus/event_source/devices/power",
+    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc_0",
+    [MBOX1] = "/sys/bus/event_source/devices/uncore_imc_1",
+    [MBOX2] = "/sys/bus/event_source/devices/uncore_imc_2",
+    [MBOX3] = "/sys/bus/event_source/devices/uncore_imc_3",
+    [MBOX4] = "/sys/bus/event_source/devices/uncore_imc_4",
+    [MBOX5] = "/sys/bus/event_source/devices/uncore_imc_5",
+    [MBOX6] = "/sys/bus/event_source/devices/uncore_imc_6",
+    [MBOX7] = "/sys/bus/event_source/devices/uncore_imc_7",
+    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
+    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
+    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
+    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
+    [CBOX4] = "/sys/bus/event_source/devices/uncore_cbox_4",
+    [CBOX5] = "/sys/bus/event_source/devices/uncore_cbox_5",
+    [CBOX6] = "/sys/bus/event_source/devices/uncore_cbox_6",
+    [CBOX7] = "/sys/bus/event_source/devices/uncore_cbox_7",
+    [CBOX8] = "/sys/bus/event_source/devices/uncore_cbox_8",
+    [CBOX9] = "/sys/bus/event_source/devices/uncore_cbox_9",
+    [CBOX10] = "/sys/bus/event_source/devices/uncore_cbox_10",
+    [CBOX11] = "/sys/bus/event_source/devices/uncore_cbox_11",
+    [CBOX12] = "/sys/bus/event_source/devices/uncore_cbox_12",
+    [CBOX13] = "/sys/bus/event_source/devices/uncore_cbox_13",
+    [CBOX14] = "/sys/bus/event_source/devices/uncore_cbox_14",
+    [CBOX15] = "/sys/bus/event_source/devices/uncore_cbox_15",
+    [CBOX16] = "/sys/bus/event_source/devices/uncore_cbox_16",
+    [CBOX17] = "/sys/bus/event_source/devices/uncore_cbox_17",
+    [CBOX18] = "/sys/bus/event_source/devices/uncore_cbox_18",
+    [CBOX19] = "/sys/bus/event_source/devices/uncore_cbox_19",
+    [CBOX20] = "/sys/bus/event_source/devices/uncore_cbox_20",
+    [CBOX21] = "/sys/bus/event_source/devices/uncore_cbox_21",
+    [CBOX22] = "/sys/bus/event_source/devices/uncore_cbox_22",
+    [CBOX23] = "/sys/bus/event_source/devices/uncore_cbox_23",
+    [CBOX24] = "/sys/bus/event_source/devices/uncore_cbox_24",
+    [CBOX25] = "/sys/bus/event_source/devices/uncore_cbox_25",
+    [CBOX26] = "/sys/bus/event_source/devices/uncore_cbox_26",
+    [CBOX27] = "/sys/bus/event_source/devices/uncore_cbox_27",
+    [BBOX0] = "/sys/bus/event_source/devices/uncore_m2m_0",
+    [BBOX1] = "/sys/bus/event_source/devices/uncore_m2m_1",
+    [WBOX] = "/sys/bus/event_source/devices/uncore_pcu",
+    [SBOX0] = "/sys/bus/event_source/devices/uncore_upi_0",
+    [SBOX1] = "/sys/bus/event_source/devices/uncore_upi_1",
+    [SBOX2] = "/sys/bus/event_source/devices/uncore_upi_2",
+    [RBOX0] = "/sys/bus/event_source/devices/uncore_m3upi_0",
+    [RBOX1] = "/sys/bus/event_source/devices/uncore_m3upi_1",
+    [RBOX2] = "/sys/bus/event_source/devices/uncore_m3upi_2",
+    [UBOX] = "/sys/bus/event_source/devices/uncore_ubox",
+};
diff --git a/src/includes/perfmon_skylakeX_events.txt b/src/includes/perfmon_skylakeX_events.txt
new file mode 100644
index 0000000..002d9e8
--- /dev/null
+++ b/src/includes/perfmon_skylakeX_events.txt
@@ -0,0 +1,3392 @@
+# =======================================================================================
+#
+#      Filename:  perfmon_skylakeX_events.txt
+#
+#      Description:  Event list for Intel Skylake X
+#
+#      Version:   4.3.1
+#      Released:  04.01.2018
+#
+#      Author:   Jan Treibig (jt), jan.treibig at gmail.com
+#                Thomas Roehl (tr), thomas.roehl at googlemail.com
+#      Project:  likwid
+#
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+#
+#      This program is free software: you can redistribute it and/or modify it under
+#      the terms of the GNU General Public License as published by the Free Software
+#      Foundation, either version 3 of the License, or (at your option) any later
+#      version.
+#
+#      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+#      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+#      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+#      You should have received a copy of the GNU General Public License along with
+#      this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# =======================================================================================
+
+EVENT_TEMP_CORE          0x00   TMP0
+UMASK_TEMP_CORE          0x00
+
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
+UMASK_PWR_PKG_ENERGY          0x00
+
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
+UMASK_PWR_PP0_ENERGY          0x00
+
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
+UMASK_PWR_PP1_ENERGY          0x00
+
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
+UMASK_PWR_DRAM_ENERGY          0x00
+
+EVENT_PWR_PLATFORM_ENERGY          0x05   PWR4
+UMASK_PWR_PLATFORM_ENERGY          0x00
+
+EVENT_INSTR_RETIRED              0x00   FIXC0
+UMASK_INSTR_RETIRED_ANY          0x00
+
+EVENT_CPU_CLK_UNHALTED           0x00   FIXC1
+UMASK_CPU_CLK_UNHALTED_CORE      0x00
+
+EVENT_CPU_CLK_UNHALTED           0x00   FIXC2
+UMASK_CPU_CLK_UNHALTED_REF       0x00
+
+EVENT_ICACHE_16B_IFDATA_STALL    0x80 PMC
+UMASK_ICACHE_16B_IFDATA_STALL    0x04
+
+EVENT_ICACHE_64B_IFTAG           0x83 PMC
+UMASK_ICACHE_64B_IFTAG_HIT       0x01
+UMASK_ICACHE_64B_IFTAG_MISS      0x02
+UMASK_ICACHE_64B_IFTAG_ALL       0x03
+UMASK_ICACHE_64B_IFTAG_STALL     0x04
+
+EVENT_CPU_CLOCK_UNHALTED         0x3C   PMC
+UMASK_CPU_CLOCK_UNHALTED_THREAD_P  0x00
+DEFAULT_OPTIONS_CPU_CLOCK_UNHALTED_THREAD_P_ANY EVENT_OPTION_ANYTHREAD=1
+UMASK_CPU_CLOCK_UNHALTED_THREAD_P_ANY  0x00
+UMASK_CPU_CLOCK_UNHALTED_REF_XCLK     0x01
+DEFAULT_OPTIONS_CPU_CLOCK_UNHALTED_REF_XCLK_ANY EVENT_OPTION_ANYTHREAD=1
+UMASK_CPU_CLOCK_UNHALTED_REF_XCLK_ANY     0x01
+UMASK_CPU_CLOCK_THREAD_UNHALTED_ONE_THREAD_ACTIVE 0x02
+DEFAULT_OPTIONS_CPU_CLOCK_UNHALTED_TOTAL_CYCLES EVENT_OPTION_THRESHOLD=0x2,EVENT_OPTION_INVERT=0x1
+UMASK_CPU_CLOCK_UNHALTED_TOTAL_CYCLES   0x00
+
+EVENT_BACLEARS                      0xE6 PMC
+UMASK_BACLEARS_ANY                  0x01
+
+EVENT_ITLB_FLUSH                    0xAE PMC
+UMASK_ITLB_FLUSH                    0x01
+
+EVENT_ILD_STALL_LCP                 0x87 PMC
+UMASK_ILD_STALL_LCP                 0x01
+
+
+EVENT_IDQ_ALL_MITE_CYCLES_ANY_UOPS      0x9C PMC
+UMASK_IDQ_ALL_MITE_CYCLES_ANY_UOPS_CORE 0x01
+DEFAULT_OPTIONS_IDQ_UOPS_NOT_DELIVERED_CYCLES_0_UOPS_DELIV_CORE EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_UOPS_NOT_DELIVERED_CYCLES_0_UOPS_DELIV_CORE 0x01
+DEFAULT_OPTIONS_IDQ_UOPS_NOT_DELIVERED_CYCLES_LE_1_UOP_DELIV_CORE EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_UOPS_NOT_DELIVERED_CYCLES_LE_1_UOP_DELIV_CORE 0x01
+DEFAULT_OPTIONS_IDQ_UOPS_NOT_DELIVERED_CYCLES_LE_2_UOP_DELIV_CORE EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_UOPS_NOT_DELIVERED_CYCLES_LE_2_UOP_DELIV_CORE 0x01
+DEFAULT_OPTIONS_IDQ_UOPS_NOT_DELIVERED_CYCLES_LE_3_UOP_DELIV_CORE EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_UOPS_NOT_DELIVERED_CYCLES_LE_3_UOP_DELIV_CORE 0x01
+DEFAULT_OPTIONS_IDQ_UOPS_NOT_DELIVERED_CYCLES_FE_WAS_OK EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=0x1
+UMASK_IDQ_UOPS_NOT_DELIVERED_CYCLES_FE_WAS_OK 0x01
+
+EVENT_DSB2MITE_SWITCHES_PENALTY_CYCLES 0xAB PMC
+UMASK_DSB2MITE_SWITCHES_PENALTY_CYCLES 0x02
+
+EVENT_INT_MISC                          0x0D PMC
+UMASK_INT_MISC_RECOVERY_CYCLES          0x01
+DEFAULT_OPTIONS_INT_MISC_RECOVERY_COUNT EVENT_OPTION_EDGE=1
+UMASK_INT_MISC_RECOVERY_COUNT           0x01
+DEFAULT_OPTIONS_INT_MISC_RECOVERY_CYCLES_ANY EVENT_OPTION_ANYTHREAD=0x1
+UMASK_INT_MISC_RECOVERY_CYCLES_ANY      0x01
+DEFAULT_OPTIONS_INT_MISC_RECOVERY_CYCLES_ANY EVENT_OPTION_ANYTHREAD=0x1,EVENT_OPTION_EDGE=1
+UMASK_INT_MISC_RECOVERY_COUNT_ANY       0x01
+UMASK_INT_MISC_CLEAR_RESTEER_CYCLES     0x80
+DEFAULT_OPTIONS_INT_MISC_CLEAR_RESTEER_COUNT EVENT_OPTION_EDGE=1
+UMASK_INT_MISC_CLEAR_RESTEER_COUNT      0x80
+
+
+EVENT_RESOURCE_STALLS                   0xA2 PMC
+UMASK_RESOURCE_STALLS_ANY               0x01
+UMASK_RESOURCE_STALLS_SB                0x08
+
+EVENT_UOPS_ISSUED                0x0E  PMC
+UMASK_UOPS_ISSUED_ANY            0x01
+UMASK_UOPS_ISSUED_VECTOR_WIDTH_MISMATCH 0x02
+UMASK_UOPS_ISSUED_SLOW_LEA       0x20
+DEFAULT_OPTIONS_UOPS_ISSUED_USED_CYCLES EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_ISSUED_USED_CYCLES   0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_STALL_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=1
+UMASK_UOPS_ISSUED_STALL_CYCLES   0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_TOTAL_CYCLES EVENT_OPTION_THRESHOLD=0xA,EVENT_OPTION_INVERT=1
+UMASK_UOPS_ISSUED_TOTAL_CYCLES   0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CORE_USED_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_ISSUED_CORE_USED_CYCLES   0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CORE_STALL_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=1,EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_ISSUED_CORE_STALL_CYCLES   0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CORE_TOTAL_CYCLES EVENT_OPTION_THRESHOLD=0xA,EVENT_OPTION_INVERT=1,EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_ISSUED_CORE_TOTAL_CYCLES   0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CYCLES_GE_1_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_ISSUED_CYCLES_GE_1_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CYCLES_GE_2_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x2
+UMASK_UOPS_ISSUED_CYCLES_GE_2_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CYCLES_GE_3_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x3
+UMASK_UOPS_ISSUED_CYCLES_GE_3_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CYCLES_GE_4_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x4
+UMASK_UOPS_ISSUED_CYCLES_GE_4_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_ISSUED_CYCLES_GE_5_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x5
+UMASK_UOPS_ISSUED_CYCLES_GE_5_UOPS_EXEC 0x01
+
+
+
+EVENT_TX_EXEC                           0x5D PMC
+UMASK_TX_EXEC_MISC1                     0x01
+UMASK_TX_EXEC_MISC2                     0x02
+UMASK_TX_EXEC_MISC3                     0x04
+UMASK_TX_EXEC_MISC4                     0x08
+UMASK_TX_EXEC_MISC5                     0x10
+
+EVENT_RS_EVENTS_EMPTY                   0x5E PMC
+UMASK_RS_EVENTS_EMPTY_CYCLES            0x01
+DEFAULT_OPTIONS_RS_EVENTS_EMPTY_END     EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=0x1,EVENT_OPTION_EDGE=0x1
+UMASK_RS_EVENTS_EMPTY_END               0x01
+
+EVENT_HLE_RETIRED                       0xC8 PMC
+UMASK_HLE_RETIRED_START                 0x01
+UMASK_HLE_RETIRED_COMMIT                0x02
+UMASK_HLE_RETIRED_ABORTED               0x04
+UMASK_HLE_RETIRED_ABORTED_MEM           0x08
+UMASK_HLE_RETIRED_ABORTED_TIMER         0x10
+UMASK_HLE_RETIRED_ABORTED_UNFRIENDLY    0x20
+UMASK_HLE_RETIRED_ABORTED_MEMTYPE       0x40
+UMASK_HLE_RETIRED_ABORTED_EVENTS        0x80
+
+EVENT_RTM_RETIRED                       0xC9 PMC
+UMASK_RTM_RETIRED_START                 0x01
+UMASK_RTM_RETIRED_COMMIT                0x02
+UMASK_RTM_RETIRED_ABORTED               0x04
+UMASK_RTM_RETIRED_ABORTED_MEM           0x08
+UMASK_RTM_RETIRED_ABORTED_TIMER         0x10
+UMASK_RTM_RETIRED_ABORTED_UNFRIENDLY    0x20
+UMASK_RTM_RETIRED_ABORTED_MEMTYPE       0x40
+UMASK_RTM_RETIRED_ABORTED_EVENTS        0x80
+
+EVENT_MACHINE_CLEARS                    0xC3 PMC
+DEFAULT_OPTIONS_MACHINE_CLEARS_COUNT    EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_EDGE=0x1
+UMASK_MACHINE_CLEARS_COUNT              0x01
+UMASK_MACHINE_CLEARS_MEMORY_ORDERING    0x02
+UMASK_MACHINE_CLEARS_SMC                0x04
+
+EVENT_HW_INTERRUPTS_RECEIVED            0xCB PMC
+UMASK_HW_INTERRUPTS_RECEIVED            0x01
+
+EVENT_INST_RETIRED                      0xC0 PMC
+UMASK_INST_RETIRED_ANY                  0x00
+
+EVENT_UOPS_RETIRED                       0xC2  PMC
+UMASK_UOPS_RETIRED_ALL                   0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CORE_ALL EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_RETIRED_CORE_ALL              0x01
+UMASK_UOPS_RETIRED_RETIRE_SLOTS          0x02
+DEFAULT_OPTIONS__UOPS_RETIRED_CORE_RETIRE_SLOTS EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_RETIRED_CORE_RETIRE_SLOTS     0x02
+DEFAULT_OPTIONS_UOPS_RETIRED_USED_CYCLES EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_RETIRED_USED_CYCLES           0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_STALL_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=1
+UMASK_UOPS_RETIRED_STALL_CYCLES          0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_TOTAL_CYCLES EVENT_OPTION_THRESHOLD=0xA,EVENT_OPTION_INVERT=1
+UMASK_UOPS_RETIRED_TOTAL_CYCLES          0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CORE_ALL EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_RETIRED_CORE_ALL              0x01
+DEFAULT_OPTIONS__UOPS_RETIRED_CORE_RETIRE_SLOTS EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_RETIRED_CORE_RETIRE_SLOTS     0x02
+DEFAULT_OPTIONS_UOPS_RETIRED_CORE_USED_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_RETIRED_CORE_USED_CYCLES      0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CORE_STALL_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=1,EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_RETIRED_CORE_STALL_CYCLES     0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CORE_TOTAL_CYCLES EVENT_OPTION_THRESHOLD=0xA,EVENT_OPTION_INVERT=1,EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_RETIRED_CORE_TOTAL_CYCLES     0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_1_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_RETIRED_CYCLES_GE_1_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_2_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x2
+UMASK_UOPS_RETIRED_CYCLES_GE_2_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_3_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x3
+UMASK_UOPS_RETIRED_CYCLES_GE_3_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_4_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x4
+UMASK_UOPS_RETIRED_CYCLES_GE_4_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_5_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x5
+UMASK_UOPS_RETIRED_CYCLES_GE_5_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_6_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x6
+UMASK_UOPS_RETIRED_CYCLES_GE_6_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_7_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x7
+UMASK_UOPS_RETIRED_CYCLES_GE_7_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_RETIRED_CYCLES_GE_8_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x8
+UMASK_UOPS_RETIRED_CYCLES_GE_8_UOPS_EXEC 0x01
+
+EVENT_BR_INST_RETIRED                   0xC4 PMC
+UMASK_BR_INST_RETIRED_ALL_BRANCHES      0x00
+UMASK_BR_INST_RETIRED_CONDITIONAL       0x01
+UMASK_BR_INST_RETIRED_NEAR_CALL         0x02
+UMASK_BR_INST_RETIRED_NEAR_RETURN       0x08
+UMASK_BR_INST_RETIRED_NOT_TAKEN         0x10
+UMASK_BR_INST_RETIRED_NEAR_TAKEN        0x20
+UMASK_BR_INST_RETIRED_FAR_BRANCH        0x40
+
+EVENT_BR_MISP_RETIRED                   0xC5 PMC
+UMASK_BR_MISP_RETIRED_ALL_BRANCHES      0x00
+UMASK_BR_MISP_RETIRED_CONDITIONAL       0x01
+UMASK_BR_MISP_RETIRED_NEAR_TAKEN        0x20
+
+EVENT_FP_ARITH_INST_RETIRED                     0xC7 PMC
+UMASK_FP_ARITH_INST_RETIRED_SCALAR_DOUBLE       0x01
+UMASK_FP_ARITH_INST_RETIRED_SCALAR_SINGLE       0x02
+UMASK_FP_ARITH_INST_RETIRED_128B_PACKED_DOUBLE  0x04
+UMASK_FP_ARITH_INST_RETIRED_128B_PACKED_SINGLE  0x08
+UMASK_FP_ARITH_INST_RETIRED_256B_PACKED_DOUBLE  0x10
+UMASK_FP_ARITH_INST_RETIRED_256B_PACKED_SINGLE  0x20
+UMASK_FP_ARITH_INST_RETIRED_512B_PACKED_DOUBLE  0x40
+UMASK_FP_ARITH_INST_RETIRED_512B_PACKED_SINGLE  0x80
+UMASK_FP_ARITH_INST_RETIRED_DOUBLE              0x55
+UMASK_FP_ARITH_INST_RETIRED_SINGLE              0xAA
+
+EVENT_FP_ASSIST_ANY                     0xCA PMC
+DEFAULT_OPTIONS_FP_ASSIST_ANY           EVENT_OPTION_THRESHOLD=0x1
+UMASK_FP_ASSIST_ANY                     0x1E
+
+EVENT_MEM_INST_RETIRED                  0xD0 PMC
+UMASK_MEM_INST_RETIRED_STLB_MISS_LOADS  0x11
+UMASK_MEM_INST_RETIRED_STLB_MISS_STORES 0x12
+UMASK_MEM_INST_RETIRED_LOCK_LOADS       0x21
+UMASK_MEM_INST_RETIRED_SPLIT_LOADS      0x41
+UMASK_MEM_INST_RETIRED_SPLIT_STORES     0x42
+UMASK_MEM_INST_RETIRED_ALL_LOADS        0x81
+UMASK_MEM_INST_RETIRED_ALL_STORES       0x82
+UMASK_MEM_INST_RETIRED_ALL              0x83
+
+EVENT_MEM_LOAD_RETIRED                  0xD1 PMC
+UMASK_MEM_LOAD_RETIRED_L1_HIT           0x01
+UMASK_MEM_LOAD_RETIRED_L2_HIT           0x02
+UMASK_MEM_LOAD_RETIRED_L3_HIT           0x04
+UMASK_MEM_LOAD_RETIRED_L1_MISS          0x08
+UMASK_MEM_LOAD_RETIRED_L2_MISS          0x10
+UMASK_MEM_LOAD_RETIRED_L3_MISS          0x20
+UMASK_MEM_LOAD_RETIRED_FB_HIT           0x40
+
+EVENT_MEM_LOAD_L3_HIT_RETIRED           0xD2 PMC
+UMASK_MEM_LOAD_L3_HIT_RETIRED_XSNP_MISS 0x01
+UMASK_MEM_LOAD_L3_HIT_RETIRED_XSNP_HIT  0x02
+UMASK_MEM_LOAD_L3_HIT_RETIRED_XSNP_HITM 0x04
+UMASK_MEM_LOAD_L3_HIT_RETIRED_XSNP_NONE 0x08
+
+EVENT_FRONTEND_RETIRED                  0xC6 PMC
+UMASK_FRONTEND_RETIRED_DSB_MISS         0x01 0x00 0x11
+UMASK_FRONTEND_RETIRED_L1I_MISS         0x01 0x00 0x12
+UMASK_FRONTEND_RETIRED_L2_MISS          0x01 0x00 0x13
+UMASK_FRONTEND_RETIRED_ITLB_MISS        0x01 0x00 0x14
+UMASK_FRONTEND_RETIRED_STLB_MISS        0x01 0x00 0x15
+UMASK_FRONTEND_RETIRED_LATENCY_GE_2     0x01 0x00 0x400206
+UMASK_FRONTEND_RETIRED_LATENCY_GE_2_BUBBLES_GE_2 0x01 0x00 0x200206
+UMASK_FRONTEND_RETIRED_LATENCY_GE_4     0x01 0x00 0x400406
+
+EVENT_UOPS_EXECUTED                       0xB1   PMC
+EVENT_UOPS_EXECUTED                       0xB1   PMC
+UMASK_UOPS_EXECUTED_THREAD                0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_USED_CYCLES EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_EXECUTED_USED_CYCLES           0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_STALL_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=1
+UMASK_UOPS_EXECUTED_STALL_CYCLES          0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_TOTAL_CYCLES EVENT_OPTION_THRESHOLD=0xA,EVENT_OPTION_INVERT=1
+UMASK_UOPS_EXECUTED_TOTAL_CYCLES          0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_1_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_EXECUTED_CYCLES_GE_1_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_2_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x2
+UMASK_UOPS_EXECUTED_CYCLES_GE_2_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_3_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x3
+UMASK_UOPS_EXECUTED_CYCLES_GE_3_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_4_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x4
+UMASK_UOPS_EXECUTED_CYCLES_GE_4_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_5_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x5
+UMASK_UOPS_EXECUTED_CYCLES_GE_5_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_6_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x6
+UMASK_UOPS_EXECUTED_CYCLES_GE_6_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_7_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x7
+UMASK_UOPS_EXECUTED_CYCLES_GE_7_UOPS_EXEC 0x01
+DEFAULT_OPTIONS_UOPS_EXECUTED_CYCLES_GE_8_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x8
+UMASK_UOPS_EXECUTED_CYCLES_GE_8_UOPS_EXEC 0x01
+UMASK_UOPS_EXECUTED_CORE                  0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_USED_CYCLES EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_EXECUTED_CORE_USED_CYCLES           0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_STALL_CYCLES EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=1
+UMASK_UOPS_EXECUTED_CORE_STALL_CYCLES          0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_TOTAL_CYCLES EVENT_OPTION_THRESHOLD=0xA,EVENT_OPTION_INVERT=1
+UMASK_UOPS_EXECUTED_CORE_TOTAL_CYCLES          0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_1_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x1
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_1_UOPS_EXEC 0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_2_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x2
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_2_UOPS_EXEC 0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_3_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x3
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_3_UOPS_EXEC 0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_4_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x4
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_4_UOPS_EXEC 0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_5_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x5
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_5_UOPS_EXEC 0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_6_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x6
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_6_UOPS_EXEC 0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_7_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x7
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_7_UOPS_EXEC 0x02
+DEFAULT_OPTIONS_UOPS_EXECUTED_CORE_CYCLES_GE_8_UOPS_EXEC EVENT_OPTION_THRESHOLD=0x8
+UMASK_UOPS_EXECUTED_CORE_CYCLES_GE_8_UOPS_EXEC 0x02
+UMASK_UOPS_EXECUTED_X87                 0x10
+
+
+EVENT_EXE_ACTIVITY                      0xA6 PMC
+UMASK_EXE_ACTIVITY_EXE_BOUND_0_PORTS    0x01
+UMASK_EXE_ACTIVITY_1_PORTS_UTIL         0x02
+UMASK_EXE_ACTIVITY_2_PORTS_UTIL         0x04
+UMASK_EXE_ACTIVITY_3_PORTS_UTIL         0x08
+UMASK_EXE_ACTIVITY_4_PORTS_UTIL         0x10
+UMASK_EXE_ACTIVITY_BOUND_ON_STORES      0x40
+
+EVENT_UOPS_DISPATCHED_PORT              0xA1 PMC
+UMASK_UOPS_DISPATCHED_PORT_PORT_0       0x01
+UMASK_UOPS_DISPATCHED_PORT_PORT_1       0x02
+UMASK_UOPS_DISPATCHED_PORT_PORT_2       0x04
+UMASK_UOPS_DISPATCHED_PORT_PORT_3       0x08
+UMASK_UOPS_DISPATCHED_PORT_PORT_4       0x10
+UMASK_UOPS_DISPATCHED_PORT_PORT_5       0x20
+UMASK_UOPS_DISPATCHED_PORT_PORT_6       0x40
+UMASK_UOPS_DISPATCHED_PORT_PORT_7       0x80
+UMASK_UOPS_DISPATCHED_PORT_ARITH_PORTS      0x63
+DEFAULT_OPTIONS_UOPS_DISPATCHED_PORT_ARITH_PORTS_CORE    EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_DISPATCHED_PORT_ARITH_PORTS_CORE 0x63
+DEFAULT_OPTIONS_UOPS_DISPATCHED_PORT_DATA_PORTS    EVENT_OPTION_ANYTHREAD=1
+UMASK_UOPS_DISPATCHED_PORT_DATA_PORTS       0x9C
+
+EVENT_CYCLE_ACTIVITY_STALLS_TOTAL       0xA3 PMC
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_TOTAL EVENT_OPTION_THRESHOLD=0x4
+UMASK_CYCLE_ACTIVITY_STALLS_TOTAL       0x04
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_NO_EXECUTE EVENT_OPTION_THRESHOLD=0x4
+UMASK_CYCLE_ACTIVITY_CYCLES_NO_EXECUTE       0x04
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_L2_MISS EVENT_OPTION_THRESHOLD=0x1
+UMASK_CYCLE_ACTIVITY_CYCLES_L2_MISS     0x01
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_L2_MISS EVENT_OPTION_THRESHOLD=0x5
+UMASK_CYCLE_ACTIVITY_STALLS_L2_MISS     0x05
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_L2_PENDING EVENT_OPTION_THRESHOLD=0x1
+UMASK_CYCLE_ACTIVITY_CYCLES_L2_PENDING     0x01
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_L2_PENDING EVENT_OPTION_THRESHOLD=0x5
+UMASK_CYCLE_ACTIVITY_STALLS_L2_PENDING     0x05
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_L3_MISS EVENT_OPTION_THRESHOLD=0x2
+UMASK_CYCLE_ACTIVITY_CYCLES_L3_MISS     0x02
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_L3_MISS EVENT_OPTION_THRESHOLD=0x6
+UMASK_CYCLE_ACTIVITY_STALLS_L3_MISS     0x06
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_L3_PENDING EVENT_OPTION_THRESHOLD=0x2
+UMASK_CYCLE_ACTIVITY_CYCLES_L3_PENDING     0x02
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_L3_PENDING EVENT_OPTION_THRESHOLD=0x6
+UMASK_CYCLE_ACTIVITY_STALLS_L3_PENDING     0x06
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_MEM_ANY EVENT_OPTION_THRESHOLD=0x10
+UMASK_CYCLE_ACTIVITY_CYCLES_MEM_ANY     0x10
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_MEM_ANY EVENT_OPTION_THRESHOLD=0x14
+UMASK_CYCLE_ACTIVITY_STALLS_MEM_ANY     0x14
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_LDM_PENDING EVENT_OPTION_THRESHOLD=0x10
+UMASK_CYCLE_ACTIVITY_CYCLES_LDM_PENDING     0x10
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_LDM_PENDING EVENT_OPTION_THRESHOLD=0x14
+UMASK_CYCLE_ACTIVITY_STALLS_LDM_PENDING     0x14
+
+EVENT_CYCLE_ACTIVITY_CYCLES_L1D_MISS  0xA3 PMC
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_L1D_MISS EVENT_OPTION_THRESHOLD=0x8
+UMASK_CYCLE_ACTIVITY_CYCLES_L1D_MISS    0x08
+
+EVENT_CYCLE_ACTIVITY_STALLS_L1D_MISS  0xA3 PMC
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_L1D_MISS EVENT_OPTION_THRESHOLD=0xC
+UMASK_CYCLE_ACTIVITY_STALLS_L1D_MISS    0x0C
+
+EVENT_CYCLE_ACTIVITY_CYCLES_L1D_PENDING 0xA3 PMC
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_CYCLES_L1D_PENDING EVENT_OPTION_THRESHOLD=0x8
+UMASK_CYCLE_ACTIVITY_CYCLES_L1D_PENDING    0x08
+
+EVENT_CYCLE_ACTIVITY_STALLS_L1D_PENDING 0xA3 PMC
+DEFAULT_OPTIONS_CYCLE_ACTIVITY_STALLS_L1D_PENDING EVENT_OPTION_THRESHOLD=0xC
+UMASK_CYCLE_ACTIVITY_STALLS_L1D_PENDING    0x0C
+
+EVENT_EPT_WALK_PENDING  0x4F PMC
+UMASK_EPT_WALK_PENDING                  0x10
+
+EVENT_ITLB_MISSES                       0x85 PMC
+UMASK_ITLB_MISSES_CAUSES_A_WALK         0x01
+
+UMASK_ITLB_MISSES_WALK_PENDING          0x10
+UMASK_ITLB_MISSES_STLB_HIT              0x20
+UMASK_ITLB_MISSES_WALK_COMPLETED        0x0E
+UMASK_ITLB_MISSES_WALK_COMPLETED_4K     0x02
+UMASK_ITLB_MISSES_WALK_COMPLETED_2M_4M  0x04
+UMASK_ITLB_MISSES_WALK_COMPLETED_1G     0x08
+DEFAULT_OPTIONS_ITLB_MISSES_WALK_ACTIVE EVENT_OPTION_THRESHOLD=0x1
+UMASK_ITLB_MISSES_WALK_ACTIVE           0x10
+
+EVENT_DTLB_LOAD_MISSES                      0x08 PMC
+UMASK_DTLB_LOAD_MISSES_CAUSES_A_WALK        0x01
+UMASK_DTLB_LOAD_MISSES_WALK_PENDING         0x10
+UMASK_DTLB_LOAD_MISSES_STLB_HIT             0x20
+UMASK_DTLB_LOAD_MISSES_WALK_COMPLETED       0x0E
+UMASK_DTLB_LOAD_MISSES_WALK_COMPLETED_4K    0x02
+UMASK_DTLB_LOAD_MISSES_WALK_COMPLETED_2M_4M 0x04
+UMASK_DTLB_LOAD_MISSES_WALK_COMPLETED_1G    0x08
+DEFAULT_OPTIONS_DTLB_LOAD_MISSES_WALK_ACTIVE EVENT_OPTION_THRESHOLD=0x1
+UMASK_DTLB_LOAD_MISSES_WALK_ACTIVE          0x10
+
+EVENT_DTLB_STORE_MISSES                      0x49 PMC
+UMASK_DTLB_STORE_MISSES_CAUSES_A_WALK        0x01
+UMASK_DTLB_STORE_MISSES_WALK_PENDING         0x10
+UMASK_DTLB_STORE_MISSES_STLB_HIT             0x20
+UMASK_DTLB_STORE_MISSES_WALK_COMPLETED       0x0E
+UMASK_DTLB_STORE_MISSES_WALK_COMPLETED_4K    0x02
+UMASK_DTLB_STORE_MISSES_WALK_COMPLETED_2M_4M 0x04
+UMASK_DTLB_STORE_MISSES_WALK_COMPLETED_1G    0x08
+DEFAULT_OPTIONS_DTLB_STORE_MISSES_WALK_ACTIVE EVENT_OPTION_THRESHOLD=0x1
+UMASK_DTLB_STORE_MISSES_WALK_ACTIVE          0x10
+
+EVENT_TLB_FLUSH                         0xBD PMC
+UMASK_TLB_FLUSH_DTLB_THREAD             0x01
+UMASK_TLB_FLUSH_STLB_ANY                0x20
+
+EVENT_L1D                               0x51 PMC
+UMASK_L1D_REPLACEMENT                   0x01
+UMASK_L1D_M_EVICT                       0x04
+
+EVENT_TX_MEM                            0x54 PMC
+UMASK_TX_MEM_ABORT_CONFLICT             0x01
+UMASK_TX_MEM_ABORT_CAPACITY             0x02
+UMASK_TX_MEM_ABORT_HLE_STORE_TO_ELIDED_LOCK 0x04
+UMASK_TX_MEM_ABORT_HLE_ELISION_BUFFER_NOT_EMPTY 0x08
+UMASK_TX_MEM_ABORT_HLE_ELISION_BUFFER_MISMATCH 0x10
+UMASK_TX_MEM_ABORT_HLE_ELISION_BUFFER_UNSUPPORTED_ALIGNMENT 0x20
+UMASK_TX_MEM_HLE_ELISION_BUFFER_FULL    0x40
+
+EVENT_L1D_PEND_MISS                     0x48 PMC
+UMASK_L1D_PEND_MISS_PENDING             0x01
+UMASK_L1D_PEND_MISS_FB_FULL             0x02
+DEFAULT_OPTIONS_L1D_PEND_MISS_PENDING_CYCLES EVENT_OPTION_THRESHOLD=0x1
+UMASK_L1D_PEND_MISS_PENDING_CYCLES      0x01
+DEFAULT_OPTIONS_L1D_PEND_MISS_PENDING_CYCLES_ANY EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_ANYTHREAD=0x1
+UMASK_L1D_PEND_MISS_PENDING_CYCLES_ANY  0x01
+
+EVENT_LOAD_HIT_PRE_SW_PF                0x4C PMC
+UMASK_LOAD_HIT_PRE_SW_PF                0x01
+
+EVENT_LOCK_CYCLES_CACHE_LOCK_DURATION   0x63 PMC
+UMASK_LOCK_CYCLES_CACHE_LOCK_DURATION   0x02
+DEFAULT_OPTIONS_LOCK_CYCLES_CACHE_LOCK_COUNT EVENT_OPTION_EDGE=1
+UMASK_LOCK_CYCLES_CACHE_LOCK_COUNT      0x02
+
+EVENT_LD_BLOCKS                         0x03 PMC
+UMASK_LD_BLOCKS_STORE_FORWARD           0x02
+UMASK_LD_BLOCKS_NO_SR                   0x08
+
+EVENT_LD_BLOCKS_PARTIAL_ADDRESS_ALIAS   0x07 PMC
+UMASK_LD_BLOCKS_PARTIAL_ADDRESS_ALIAS   0x01
+
+EVENT_OFFCORE_REQUESTS                  0xB0 PMC
+UMASK_OFFCORE_REQUESTS_DEMAND_DATA_RD   0x01
+UMASK_OFFCORE_REQUESTS_DEMAND_CODE_RD   0x02
+UMASK_OFFCORE_REQUESTS_DEMAND_RFO       0x04
+UMASK_OFFCORE_REQUESTS_ALL_DATA_RD      0x08
+UMASK_OFFCORE_REQUESTS_L3_MISS_DEMAND_DATA_RD 0x10
+UMASK_OFFCORE_REQUESTS_ALL_REQUESTS     0x80
+
+EVENT_OFFCORE_REQUESTS_OUTSTANDING      0x60 PMC
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_DEMAND_DATA_RD 0x01
+DEFAULT_OPTIONS_OFFCORE_REQUESTS_OUTSTANDING_DEMAND_DATA_RD_GE_6 EVENT_OPTION_THRESHOLD=0x6
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_DEMAND_DATA_RD_GE_6 0x01
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_DEMAND_CODE_RD 0x02
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_DEMAND_RFO 0x04
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_ALL_DATA_RD 0x08
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_L3_MISS_DEMAND_DATA_RD 0x10
+DEFAULT_OPTIONS_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DEMAND_DATA_RD EVENT_OPTION_THRESHOLD=0x1
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DEMAND_DATA_RD 0x01
+DEFAULT_OPTIONS_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DATA_RD EVENT_OPTION_THRESHOLD=0x1
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DATA_RD 0x08
+DEFAULT_OPTIONS_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DEMAND_CODE_RD EVENT_OPTION_THRESHOLD=0x1
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DEMAND_CODE_RD 0x02
+DEFAULT_OPTIONS_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DEMAND_RFO EVENT_OPTION_THRESHOLD=0x1
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_DEMAND_RFO 0x04
+DEFAULT_OPTIONS_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_L3_MISS_DEMAND_DATA_RD EVENT_OPTION_THRESHOLD=0x1
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_CYCLES_WITH_L3_MISS_DEMAND_DATA_RD 0x10
+DEFAULT_OPTIONS_OFFCORE_REQUESTS_OUTSTANDING_L3_MISS_DEMAND_DATA_RD_GE_6 EVENT_OPTION_THRESHOLD=0x6
+UMASK_OFFCORE_REQUESTS_OUTSTANDING_L3_MISS_DEMAND_DATA_RD_GE_6 0x10
+
+EVENT_LOCK_CYCLES_CACHE_LOCK_DURATION   0x63 PMC
+UMASK_LOCK_CYCLES_CACHE_LOCK_DURATION   0x02
+DEFAULT_OPTIONS_LOCK_CYCLES_CACHE_LOCK_COUNT EVENT_OPTION_EDGE=0x1
+UMASK_LOCK_CYCLES_CACHE_LOCK_COUNT      0x02
+
+EVENT_OFFCORE_REQUESTS_BUFFER_SQ_FULL   0xB2 PMC
+UMASK_OFFCORE_REQUESTS_BUFFER_SQ_FULL   0x01
+
+# The only officially released event is L2_TRANS_L2_WB
+# All others count something but no guarantees
+EVENT_L2_TRANS                0xF0  PMC
+UMASK_L2_TRANS_DEMAND_DATA_RD 0x01
+UMASK_L2_TRANS_RFO            0x02
+UMASK_L2_TRANS_CODE_RD        0x04
+UMASK_L2_TRANS_ALL_PF         0x08
+UMASK_L2_TRANS_L1D_WB         0x10
+UMASK_L2_TRANS_L2_FILL        0x20
+UMASK_L2_TRANS_L2_WB          0x40
+UMASK_L2_TRANS_ALL_REQUESTS   0x80
+
+EVENT_LONGEST_LAT_CACHE                 0x2E PMC
+UMASK_LONGEST_LAT_CACHE_MISS            0x41
+UMASK_LONGEST_LAT_CACHE_REFERENCE       0x4F
+
+
+EVENT_L2_RQSTS                          0x24 PMC
+UMASK_L2_RQSTS_DEMAND_DATA_RD_MISS      0x21
+UMASK_L2_RQSTS_DEMAND_DATA_RD_HIT       0x41
+UMASK_L2_RQSTS_ALL_DEMAND_DATA_RD       0xE1
+UMASK_L2_RQSTS_ALL_RFO                  0xE2
+UMASK_L2_RQSTS_ALL_CODE_RD              0xE4
+UMASK_L2_RQSTS_ALL_PF                   0xF8
+UMASK_L2_RQSTS_PF_MISS                  0x38
+UMASK_L2_RQSTS_PF_HIT                   0xD8
+UMASK_L2_RQSTS_RFO_HIT                  0x42
+UMASK_L2_RQSTS_RFO_MISS                 0x22
+UMASK_L2_RQSTS_CODE_RD_HIT              0x44
+UMASK_L2_RQSTS_CODE_RD_MISS             0x24
+UMASK_L2_RQSTS_ALL_DEMAND_MISS          0x27
+UMASK_L2_RQSTS_ALL_DEMAND_REFERENCES    0xE7
+UMASK_L2_RQSTS_MISS                     0x3F
+UMASK_L2_RQSTS_REFERENCES               0xFF
+
+EVENT_IDQ_MS                            0x79 PMC
+UMASK_IDQ_MITE_UOPS                     0x04
+UMASK_IDQ_DSB_UOPS                      0x08
+UMASK_IDQ_MS_DSB_UOPS                   0x10
+UMASK_IDQ_MS_MITE_UOPS                  0x20
+UMASK_IDQ_MS_UOPS                       0x30
+DEFAULT_OPTIONS_IDQ_MITE_CYCLES         EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MITE_CYCLES                   0x04
+DEFAULT_OPTIONS_IDQ_MITE_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MITE_CYCLES_1_UOPS            0x04
+DEFAULT_OPTIONS_IDQ_MITE_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_MITE_CYCLES_2_UOPS            0x04
+DEFAULT_OPTIONS_IDQ_MITE_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_MITE_CYCLES_3_UOPS            0x04
+DEFAULT_OPTIONS_IDQ_MITE_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_MITE_CYCLES_4_UOPS            0x04
+DEFAULT_OPTIONS_IDQ_MITE_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_MITE_CYCLES_5_UOPS            0x04
+DEFAULT_OPTIONS_IDQ_MITE_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_MITE_CYCLES_6_UOPS            0x04
+DEFAULT_OPTIONS_IDQ_DSB_CYCLES          EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_DSB_CYCLES                    0x08
+DEFAULT_OPTIONS_IDQ_DSB_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_DSB_CYCLES_1_UOPS             0x08
+DEFAULT_OPTIONS_IDQ_DSB_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_DSB_CYCLES_2_UOPS             0x08
+DEFAULT_OPTIONS_IDQ_DSB_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_DSB_CYCLES_3_UOPS             0x08
+DEFAULT_OPTIONS_IDQ_DSB_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_DSB_CYCLES_4_UOPS             0x08
+DEFAULT_OPTIONS_IDQ_DSB_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_DSB_CYCLES_5_UOPS             0x08
+DEFAULT_OPTIONS_IDQ_DSB_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_DSB_CYCLES_6_UOPS             0x08
+DEFAULT_OPTIONS_IDQ_MS_DSB_CYCLES       EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MS_DSB_CYCLES                 0x10
+DEFAULT_OPTIONS_IDQ_MS_DSB_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MS_DSB_CYCLES_1_UOPS          0x10
+DEFAULT_OPTIONS_IDQ_MS_DSB_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_MS_DSB_CYCLES_2_UOPS          0x10
+DEFAULT_OPTIONS_IDQ_MS_DSB_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_MS_DSB_CYCLES_3_UOPS          0x10
+DEFAULT_OPTIONS_IDQ_MS_DSB_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_MS_DSB_CYCLES_4_UOPS          0x10
+DEFAULT_OPTIONS_IDQ_MS_DSB_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_MS_DSB_CYCLES_5_UOPS          0x10
+DEFAULT_OPTIONS_IDQ_MS_DSB_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_MS_DSB_CYCLES_6_UOPS          0x10
+DEFAULT_OPTIONS_IDQ_MS_DSB_OCCUR        EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_EDGE=1
+UMASK_IDQ_MS_DSB_OCCUR                  0x10
+DEFAULT_OPTIONS_IDQ_MS_MITE_CYCLES      EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MS_MITE_CYCLES                0x20
+DEFAULT_OPTIONS_IDQ_MS_MITE_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MS_MITE_CYCLES_1_UOPS         0x20
+DEFAULT_OPTIONS_IDQ_MS_MITE_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_MS_MITE_CYCLES_2_UOPS         0x20
+DEFAULT_OPTIONS_IDQ_MS_MITE_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_MS_MITE_CYCLES_3_UOPS         0x20
+DEFAULT_OPTIONS_IDQ_MS_MITE_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_MS_MITE_CYCLES_4_UOPS         0x20
+DEFAULT_OPTIONS_IDQ_MS_MITE_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_MS_MITE_CYCLES_5_UOPS         0x20
+DEFAULT_OPTIONS_IDQ_MS_MITE_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_MS_MITE_CYCLES_6_UOPS         0x20
+DEFAULT_OPTIONS_IDQ_MS_CYCLES           EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MS_CYCLES                     0x30
+DEFAULT_OPTIONS_IDQ_MS_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_MS_CYCLES_1_UOPS              0x30
+DEFAULT_OPTIONS_IDQ_MS_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_MS_CYCLES_2_UOPS              0x30
+DEFAULT_OPTIONS_IDQ_MS_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_MS_CYCLES_3_UOPS              0x30
+DEFAULT_OPTIONS_IDQ_MS_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_MS_CYCLES_4_UOPS              0x30
+DEFAULT_OPTIONS_IDQ_MS_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_MS_CYCLES_5_UOPS              0x30
+DEFAULT_OPTIONS_IDQ_MS_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_MS_CYCLES_6_UOPS              0x30
+DEFAULT_OPTIONS_IDQ_MS_SWITCHES         EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_EDGE=1
+UMASK_IDQ_MS_SWITCHES                   0x30
+DEFAULT_OPTIONS_IDQ_ALL_DSB_CYCLES_ANY_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_ALL_DSB_CYCLES_ANY_UOPS       0x18
+DEFAULT_OPTIONS_IDQ_ALL_DSB_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_ALL_DSB_CYCLES_1_UOPS         0x18
+DEFAULT_OPTIONS_IDQ_ALL_DSB_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_ALL_DSB_CYCLES_2_UOPS         0x18
+DEFAULT_OPTIONS_IDQ_ALL_DSB_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_ALL_DSB_CYCLES_3_UOPS         0x18
+DEFAULT_OPTIONS_IDQ_ALL_DSB_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_ALL_DSB_CYCLES_4_UOPS         0x18
+DEFAULT_OPTIONS_IDQ_ALL_DSB_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_ALL_DSB_CYCLES_5_UOPS         0x18
+DEFAULT_OPTIONS_IDQ_ALL_DSB_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_ALL_DSB_CYCLES_6_UOPS         0x18
+DEFAULT_OPTIONS_IDQ_ALL_MITE_CYCLES_ANY_UOPS  EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_ALL_MITE_CYCLES_ANY_UOPS      0x24
+DEFAULT_OPTIONS_IDQ_ALL_MITE_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_ALL_MITE_CYCLES_1_UOPS        0x24
+DEFAULT_OPTIONS_IDQ_ALL_MITE_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_ALL_MITE_CYCLES_2_UOPS        0x24
+DEFAULT_OPTIONS_IDQ_ALL_MITE_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_ALL_MITE_CYCLES_3_UOPS        0x24
+DEFAULT_OPTIONS_IDQ_ALL_MITE_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_ALL_MITE_CYCLES_4_UOPS        0x24
+DEFAULT_OPTIONS_IDQ_ALL_MITE_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_ALL_MITE_CYCLES_5_UOPS        0x24
+DEFAULT_OPTIONS_IDQ_ALL_MITE_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_ALL_MITE_CYCLES_6_UOPS        0x24
+DEFAULT_OPTIONS_IDQ_ALL_CYCLES_ANY_UOPS  EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_ALL_CYCLES_ANY_UOPS      0x3C
+DEFAULT_OPTIONS_IDQ_ALL_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_IDQ_ALL_CYCLES_1_UOPS        0x3C
+DEFAULT_OPTIONS_IDQ_ALL_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_IDQ_ALL_CYCLES_2_UOPS        0x3C
+DEFAULT_OPTIONS_IDQ_ALL_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_IDQ_ALL_CYCLES_3_UOPS        0x3C
+DEFAULT_OPTIONS_IDQ_ALL_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_IDQ_ALL_CYCLES_4_UOPS        0x3C
+DEFAULT_OPTIONS_IDQ_ALL_CYCLES_5_UOPS EVENT_OPTION_THRESHOLD=0x5
+UMASK_IDQ_ALL_CYCLES_5_UOPS        0x3C
+DEFAULT_OPTIONS_IDQ_ALL_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
+UMASK_IDQ_ALL_CYCLES_6_UOPS        0x3C
+
+EVENT_L2_LINES_IN                       0xF1 PMC
+UMASK_L2_LINES_IN_I                     0x01
+UMASK_L2_LINES_IN_S                     0x02
+UMASK_L2_LINES_IN_E                     0x04
+UMASK_L2_LINES_IN_ALL                   0x07
+
+EVENT_L2_LINES_OUT                      0xF2 PMC
+UMASK_L2_LINES_OUT_SILENT               0x01
+UMASK_L2_LINES_OUT_NON_SILENT           0x02
+UMASK_L2_LINES_OUT_USELESS_PREF         0x04
+
+EVENT_SQ_MISC                           0xF4 PMC
+UMASK_SQ_MISC_SPLIT_LOCK                0x10
+
+EVENT_ARITH_DIVIDER_ACTIVE              0x14 PMC
+UMASK_ARITH_DIVIDER_ACTIVE              0x01
+DEFAULT_OPTIONS_ARITH_DIVIDER_COUNT     EVENT_OPTION_EDGE=0x1
+UMASK_ARITH_DIVIDER_COUNT               0x01
+
+EVENT_LSD_UOPS                 0xA8   PMC
+UMASK_LSD_UOPS                 0x01
+DEFAULT_OPTIONS_LSD_CYCLES_1_UOPS EVENT_OPTION_THRESHOLD=0x1
+UMASK_LSD_CYCLES_1_UOPS         0x01
+DEFAULT_OPTIONS_LSD_CYCLES_2_UOPS EVENT_OPTION_THRESHOLD=0x2
+UMASK_LSD_CYCLES_2_UOPS         0x01
+DEFAULT_OPTIONS_LSD_CYCLES_3_UOPS EVENT_OPTION_THRESHOLD=0x3
+UMASK_LSD_CYCLES_3_UOPS         0x01
+DEFAULT_OPTIONS_LSD_CYCLES_4_UOPS EVENT_OPTION_THRESHOLD=0x4
+UMASK_LSD_CYCLES_4_UOPS         0x01
+DEFAULT_OPTIONS_LSD_CYCLES_ACTIVE EVENT_OPTION_THRESHOLD=0x01
+UMASK_LSD_CYCLES_ACTIVE        0x01
+DEFAULT_OPTIONS_LSD_CYCLES_INACTIVE EVENT_OPTION_THRESHOLD=0x1,EVENT_OPTION_INVERT=1
+UMASK_LSD_CYCLES_INACTIVE         0x01
+
+EVENT_OTHER_ASSISTS_ANY                 0xC1 PMC
+UMASK_OTHER_ASSISTS_ANY                 0x3F
+
+EVENT_FRONTEND_RETIRED_LATENCY          0xC6 PMC
+UMASK_FRONTEND_RETIRED_LATENCY_GE_8     0x01 0x00 0x400806
+UMASK_FRONTEND_RETIRED_LATENCY_GE_16    0x01 0x00 0x401006
+UMASK_FRONTEND_RETIRED_LATENCY_GE_32    0x01 0x00 0x402006
+UMASK_FRONTEND_RETIRED_LATENCY_GE_64    0x01 0x00 0x404006
+UMASK_FRONTEND_RETIRED_LATENCY_GE_128   0x01 0x00 0x408006
+UMASK_FRONTEND_RETIRED_LATENCY_GE_256   0x01 0x00 0x410006
+UMASK_FRONTEND_RETIRED_LATENCY_GE_512   0x01 0x00 0x420006
+UMASK_FRONTEND_RETIRED_LATENCY_GE_2_BUBBLES_GE_1 0x01 0x00 0x100206
+UMASK_FRONTEND_RETIRED_LATENCY_GE_2_BUBBLES_GE_3 0x01 0x00 0x300206
+
+EVENT_OFFCORE_RESPONSE_0                            0xB7 PMC
+OPTIONS_OFFCORE_RESPONSE_0_OPTIONS                  EVENT_OPTION_MATCH0_MASK|EVENT_OPTION_MATCH1_MASK
+UMASK_OFFCORE_RESPONSE_0_OPTIONS                    0x01 0xFF 0xFF
+
+EVENT_OFFCORE_RESPONSE_1                            0xBB PMC
+OPTIONS_OFFCORE_RESPONSE_1_OPTIONS                  EVENT_OPTION_MATCH0_MASK|EVENT_OPTION_MATCH1_MASK
+UMASK_OFFCORE_RESPONSE_1_OPTIONS                    0x01 0xFF 0xFF
+
+EVENT_EVENT_MSG                     0x42 UBOX
+UMASK_EVENT_MSG_VLW_RCVD            0x01
+UMASK_EVENT_MSG_MSI_RCVD            0x02
+UMASK_EVENT_MSG_IPI_RCVD            0x04
+UMASK_EVENT_MSG_DOORBELL_RCVD       0x08
+UMASK_EVENT_MSG_INT_PRIO            0x10
+
+EVENT_LOCK_CYCLES                   0x44 UBOX
+UMASK_LOCK_CYCLES                   0x00
+
+EVENT_PHOLD_CYCLES                  0x45 UBOX
+UMASK_PHOLD_CYCLES_ASSERT_TO_ACK    0x01
+
+EVENT_RACU_DRNG                 0x4C UBOX
+UMASK_RACU_DRNG_RDRAND          0x01
+UMASK_RACU_DRNG_RDSEED          0x02
+UMASK_RACU_DRNG_PFTCH_BUF_EMPTY 0x04
+
+EVENT_RACU_REQUESTS                 0x46 UBOX
+UMASK_RACU_REQUESTS                 0x00
+
+EVENT_UNCORE_CLOCK                  0x00 UBOXFIX
+UMASK_UNCORE_CLOCK                  0x00
+
+EVENT_2LM_NM_SETCONFLICTS           0x64 CBOX
+UMASK_2LM_NM_SETCONFLICTS_SF        0x01
+UMASK_2LM_NM_SETCONFLICTS_LLC       0x02
+UMASK_2LM_NM_SETCONFLICTS_TOR       0x04
+UMASK_2LM_NM_SETCONFLICTS_TOR_REJECT 0x08
+UMASK_2LM_NM_SETCONFLICTS_IODC      0x10
+
+EVENT_BYPASS_CHA_IMC                0x57 CBOX
+UMASK_BYPASS_CHA_IMC_TAKEN          0x01
+UMASK_BYPASS_CHA_IMC_INTERMEDIATE   0x02
+UMASK_BYPASS_CHA_IMC_NOT_TAKEN      0x04
+
+EVENT_CBOX_CLOCKTICKS               0x00 CBOX
+UMASK_CBOX_CLOCKTICKS               0x00
+
+EVENT_CORE_PMA                      0x17 CBOX
+UMASK_CORE_PMA_C1_STATE             0x01
+UMASK_CORE_PMA_C1_TRANSITION        0x02
+UMASK_CORE_PMA_C6_STATE             0x04
+UMASK_CORE_PMA_C6_TRANSITION        0x08
+UMASK_CORE_PMA_GV                   0x10
+
+EVENT_CORE_SNP                      0x33 CBOX
+UMASK_CORE_SNP_EXT_ONE              0x21
+UMASK_CORE_SNP_EXT_GTONE            0x22
+UMASK_CORE_SNP_EXT_REMOTE           0x24
+UMASK_CORE_SNP_CORE_ONE             0x41
+UMASK_CORE_SNP_CORE_GTONE           0x42
+UMASK_CORE_SNP_CORE_REMOTE          0x44
+UMASK_CORE_SNP_EVICT_ONE            0x81
+UMASK_CORE_SNP_EVICT_GTONE          0x82
+UMASK_CORE_SNP_EVICT_REMOTE         0x84
+UMASK_CORE_SNP_ANY_ONE              0xE1
+UMASK_CORE_SNP_ANY_GTONE            0xE2
+UMASK_CORE_SNP_ANY_REMOTE           0xE4
+
+EVENT_COUNTER0_OCCUPANCY            0x1F CBOX0C0|CBOX1C0|CBOX2C0|CBOX3C0|CBOX4C0|CBOX5C0|CBOX6C0|CBOX7C0|CBOX8C0|CBOX9C0|CBOX10C0|CBOX11C0|CBOX12C0|CBOX13C0|CBOX14C0|CBOX15C0|CBOX16C0|CBOX17C0|CBOX18C0|CBOX19C0|CBOX20C0|CBOX21C0|CBOX22C0|CBOX23C0|CBOX24C0|CBOX25C0|CBOX26C0|CBOX27C0
+UMASK_COUNTER0_OCCUPANCY            0x00
+DEFAULT_OPTIONS_COUNTER0_OCCUPANCY_BUSY EVENT_OPTION_THRESHOLD=0x01
+UMASK_COUNTER0_OCCUPANCY_COUNT      0x00
+
+EVENT_DIR_LOOKUP                    0x53 CBOX
+UMASK_DIR_LOOKUP_SNP                0x01
+UMASK_DIR_LOOKUP_NO_SNP             0x02
+
+EVENT_DIR_UPDATE                    0x54 CBOX
+UMASK_DIR_UPDATE_HA                 0x01
+UMASK_DIR_UPDATE_TOR                0x02
+
+EVENT_HITME_HIT                     0x5F CBOX
+UMASK_HITME_HIT_EX_RDS              0x01
+UMASK_HITME_HIT_SHARED_OWNREQ       0x04
+UMASK_HITME_HIT_WBMTOE              0x08
+UMASK_HITME_HIT_WBMTOI_OR_S         0x10
+
+EVENT_HITME_LOOKUP                  0x5E CBOX
+UMASK_HITME_LOOKUP_READ             0x01
+UMASK_HITME_LOOKUP_WRITE            0x02
+
+EVENT_HITME_MISS                    0x60 CBOX
+UMASK_HITME_MISS_SHARED_RDINVOWN    0x20
+UMASK_HITME_MISS_NOTSHARED_RDINVOWN 0x40
+UMASK_HITME_MISS_READ_OR_INV        0x80
+
+EVENT_HITME_UPDATE                          0x61 CBOX
+UMASK_HITME_UPDATE_DEALLOCATE_RSPFWDI_LOC   0x01
+UMASK_HITME_UPDATE_RSPFWDI_REM              0x02
+UMASK_HITME_UPDATE_SHARED                   0x04
+UMASK_HITME_UPDATE_RDINVOWN                 0x08
+UMASK_HITME_UPDATE_DEALLOCATE               0x10
+
+EVENT_IMC_READS_COUNT               0x59 CBOX
+UMASK_IMC_READS_COUNT_NORMAL        0x01
+UMASK_IMC_READS_COUNT_PRIORITY      0x02
+
+EVENT_IMC_WRITES_COUNT              0x59 CBOX
+UMASK_IMC_WRITES_COUNT_FULL         0x01
+UMASK_IMC_WRITES_COUNT_PARTIAL      0x02
+UMASK_IMC_WRITES_COUNT_FULL_PRIORITY 0x04
+UMASK_IMC_WRITES_COUNT_PARTIAL      0x02
+UMASK_IMC_WRITES_COUNT_PARTIAL      0x02
+UMASK_IMC_WRITES_COUNT_PARTIAL      0x02
+
+EVENT_IODC_ALLOC                    0x62 CBOX
+UMASK_IODC_ALLOC_INVITOM            0x01
+UMASK_IODC_ALLOC_IODCFULL           0x02
+UMASK_IODC_ALLOC_OSBGATED           0x04
+
+EVENT_IODC_DEALLOC                  0x63 CBOX
+UMASK_IODC_DEALLOC_WBMTOE           0x01
+UMASK_IODC_DEALLOC_WBMTOI           0x02
+UMASK_IODC_DEALLOC_WBPUSHMTOI       0x04
+UMASK_IODC_DEALLOC_SNPOUT           0x08
+UMASK_IODC_DEALLOC_ALL              0x10
+
+EVENT_LLC_LOOKUP                    0x34 CBOX
+OPTIONS_LLC_LOOKUP_DATA_READ        EVENT_OPTION_STATE_MASK
+UMASK_LLC_LOOKUP_DATA_READ          0x03
+OPTIONS_LLC_LOOKUP_WRITE            EVENT_OPTION_STATE_MASK
+UMASK_LLC_LOOKUP_WRITE              0x05
+OPTIONS_LLC_LOOKUP_REMOTE_SNOOP     EVENT_OPTION_STATE_MASK
+UMASK_LLC_LOOKUP_REMOTE_SNOOP       0x09
+OPTIONS_LLC_LOOKUP_ANY              EVENT_OPTION_STATE_MASK
+UMASK_LLC_LOOKUP_ANY                0x11
+OPTIONS_LLC_LOOKUP_LOCAL            EVENT_OPTION_STATE_MASK
+UMASK_LLC_LOOKUP_LOCAL              0x31
+OPTIONS_LLC_LOOKUP_REMOTE           EVENT_OPTION_STATE_MASK
+UMASK_LLC_LOOKUP_REMOTE             0x91
+
+EVENT_LLC_VICTIMS                   0x37 CBOX
+UMASK_LLC_VICTIMS_M_STATE           0x01
+UMASK_LLC_VICTIMS_E_STATE           0x02
+UMASK_LLC_VICTIMS_S_STATE           0x04
+UMASK_LLC_VICTIMS_F_STATE           0x08
+UMASK_LLC_VICTIMS_LOCAL             0x20
+UMASK_LLC_VICTIMS_REMOTE            0x80
+
+EVENT_MISC                          0x39 CBOX
+UMASK_MISC_RSPI_WAS_FSE             0x01
+UMASK_MISC_WC_ALIASING              0x02
+UMASK_MISC_RFO_HIT_S                0x08
+UMASK_MISC_CVZERO_PREFETCH_VICTIM   0x10
+UMASK_MISC_CVZERO_PREFETCH_MISS     0x20
+
+EVENT_OSB_EDR                       0x55 CBOX
+UMASK_OSB_EDR                       0x00
+
+EVENT_READ_NO_CREDITS               0x58 CBOX
+UMASK_READ_NO_CREDITS_MC0_SMI0      0x01
+UMASK_READ_NO_CREDITS_MC1_SMI1      0x02
+UMASK_READ_NO_CREDITS_MC_ALL        0x03
+UMASK_READ_NO_CREDITS_EDC0_SMI2     0x04
+UMASK_READ_NO_CREDITS_EDC1_SMI3     0x08
+UMASK_READ_NO_CREDITS_EDC2_SMI4     0x10
+UMASK_READ_NO_CREDITS_EDC3_SMI5     0x20
+UMASK_READ_NO_CREDITS_EDC_ALL       0x3C
+
+EVENT_WRITE_NO_CREDITS               0x5A CBOX
+UMASK_WRITE_NO_CREDITS_MC0_SMI0      0x01
+UMASK_WRITE_NO_CREDITS_MC1_SMI1      0x02
+UMASK_WRITE_NO_CREDITS_MC_ALL        0x03
+UMASK_WRITE_NO_CREDITS_EDC0_SMI2     0x04
+UMASK_WRITE_NO_CREDITS_EDC1_SMI3     0x08
+UMASK_WRITE_NO_CREDITS_EDC2_SMI4     0x10
+UMASK_WRITE_NO_CREDITS_EDC3_SMI5     0x20
+UMASK_WRITE_NO_CREDITS_EDC_ALL       0x3C
+
+EVENT_REQUESTS                      0x50 CBOX
+UMASK_REQUESTS_READS_LOCAL          0x01
+UMASK_REQUESTS_READS_REMOTE         0x02
+UMASK_REQUESTS_READS                0x03
+UMASK_REQUESTS_WRITES_LOCAL         0x04
+UMASK_REQUESTS_WRITES_REMOTE        0x08
+UMASK_REQUESTS_WRITES               0x0C
+UMASK_REQUESTS_INVITOE_LOCAL        0x10
+UMASK_REQUESTS_INVITOE_REMOTE       0x20
+
+EVENT_RXC_INSERTS                   0x13 CBOX
+UMASK_RXC_INSERTS_IRQ               0x01
+UMASK_RXC_INSERTS_IRQ_REJ           0x02
+UMASK_RXC_INSERTS_IPQ               0x04
+UMASK_RXC_INSERTS_PRQ               0x10
+UMASK_RXC_INSERTS_PRQ_REJ           0x20
+UMASK_RXC_INSERTS_RRQ               0x20
+UMASK_RXC_INSERTS_WBQ               0x40
+
+EVENT_RXC_IPQ0_REJECT               0x22 CBOX
+UMASK_RXC_IPQ0_REJECT_AD_REQ_VN0    0x01
+UMASK_RXC_IPQ0_REJECT_AD_RSP_VN0    0x02
+UMASK_RXC_IPQ0_REJECT_BL_RSP_VN0    0x04
+UMASK_RXC_IPQ0_REJECT_BL_WB_VN0     0x08
+UMASK_RXC_IPQ0_REJECT_BL_NCB_VN0    0x10
+UMASK_RXC_IPQ0_REJECT_BL_NCS_VN0    0x20
+UMASK_RXC_IPQ0_REJECT_AK_NON_UPI    0x40
+UMASK_RXC_IPQ0_REJECT_IV_NON_UPI    0x80
+
+EVENT_RXC_IPQ1_REJECT               0x23 CBOX
+UMASK_RXC_IPQ1_REJECT_ANY0          0x01
+UMASK_RXC_IPQ1_REJECT_HA            0x02
+UMASK_RXC_IPQ1_REJECT_LLC_VICTIM    0x04
+UMASK_RXC_IPQ1_REJECT_SF_VICTIM     0x08
+UMASK_RXC_IPQ1_REJECT_VICTIM        0x10
+UMASK_RXC_IPQ1_REJECT_LLC_OR_SF_WAY 0x20
+UMASK_RXC_IPQ1_REJECT_ALLOW_SNP     0x40
+UMASK_RXC_IPQ1_REJECT_PA_MATCH      0x80
+
+EVENT_RXC_IRQ0_REJECT               0x18 CBOX
+UMASK_RXC_IRQ0_REJECT_AD_REQ_VN0    0x01
+UMASK_RXC_IRQ0_REJECT_AD_RSP_VN0    0x02
+UMASK_RXC_IRQ0_REJECT_BL_RSP_VN0    0x04
+UMASK_RXC_IRQ0_REJECT_BL_WB_VN0     0x08
+UMASK_RXC_IRQ0_REJECT_BL_NCB_VN0    0x10
+UMASK_RXC_IRQ0_REJECT_BL_NCS_VN0    0x20
+UMASK_RXC_IRQ0_REJECT_AK_NON_UPI    0x40
+UMASK_RXC_IRQ0_REJECT_IV_NON_UPI    0x80
+
+EVENT_RXC_IRQ1_REJECT               0x19 CBOX
+UMASK_RXC_IRQ1_REJECT_ANY0          0x01
+UMASK_RXC_IRQ1_REJECT_HA            0x02
+UMASK_RXC_IRQ1_REJECT_LLC_VICTIM    0x04
+UMASK_RXC_IRQ1_REJECT_SF_VICTIM     0x08
+UMASK_RXC_IRQ1_REJECT_VICTIM        0x10
+UMASK_RXC_IRQ1_REJECT_LLC_OR_SF_WAY 0x20
+UMASK_RXC_IRQ1_REJECT_ALLOW_SNP     0x40
+UMASK_RXC_IRQ1_REJECT_PA_MATCH      0x80
+
+EVENT_RXC_ISMQ0_REJECT               0x24 CBOX
+UMASK_RXC_ISMQ0_REJECT_AD_REQ_VN0    0x01
+UMASK_RXC_ISMQ0_REJECT_AD_RSP_VN0    0x02
+UMASK_RXC_ISMQ0_REJECT_BL_RSP_VN0    0x04
+UMASK_RXC_ISMQ0_REJECT_BL_WB_VN0     0x08
+UMASK_RXC_ISMQ0_REJECT_BL_NCB_VN0    0x10
+UMASK_RXC_ISMQ0_REJECT_BL_NCS_VN0    0x20
+UMASK_RXC_ISMQ0_REJECT_AK_NON_UPI    0x40
+UMASK_RXC_ISMQ0_REJECT_IV_NON_UPI    0x80
+
+EVENT_RXC_ISMQ1_REJECT               0x25 CBOX
+UMASK_RXC_ISMQ1_REJECT_ANY0          0x01
+UMASK_RXC_ISMQ1_REJECT_HA            0x02
+
+EVENT_RXC_ISMQ0_RETRY               0x2C CBOX
+UMASK_RXC_ISMQ0_RETRY_AD_REQ_VN0    0x01
+UMASK_RXC_ISMQ0_RETRY_AD_RSP_VN0    0x02
+UMASK_RXC_ISMQ0_RETRY_BL_RSP_VN0    0x04
+UMASK_RXC_ISMQ0_RETRY_BL_WB_VN0     0x08
+UMASK_RXC_ISMQ0_RETRY_BL_NCB_VN0    0x10
+UMASK_RXC_ISMQ0_RETRY_BL_NCS_VN0    0x20
+UMASK_RXC_ISMQ0_RETRY_AK_NON_UPI    0x40
+UMASK_RXC_ISMQ0_RETRY_IV_NON_UPI    0x80
+
+EVENT_RXC_ISMQ1_RETRY               0x2D CBOX
+UMASK_RXC_ISMQ1_RETRY_ANY0          0x01
+UMASK_RXC_ISMQ1_RETRY_HA            0x02
+
+EVENT_RXC_OCCUPANCY                 0x11 CBOX0C0|CBOX1C0|CBOX2C0|CBOX3C0|CBOX4C0|CBOX5C0|CBOX6C0|CBOX7C0|CBOX8C0|CBOX9C0|CBOX10C0|CBOX11C0|CBOX12C0|CBOX13C0|CBOX14C0|CBOX15C0|CBOX16C0|CBOX17C0|CBOX18C0|CBOX19C0|CBOX20C0|CBOX21C0|CBOX22C0|CBOX23C0|CBOX24C0|CBOX25C0|CBOX26C0|CBOX27C0
+UMASK_RXC_OCCUPANCY_IRQ             0x01
+UMASK_RXC_OCCUPANCY_IPQ             0x04
+UMASK_RXC_OCCUPANCY_RRQ             0x40
+UMASK_RXC_OCCUPANCY_WBQ             0x80
+
+EVENT_RXC_OTHER0_RETRY              0x2E CBOX
+UMASK_RXC_OTHER0_RETRY_AD_REQ_VN0   0x01
+UMASK_RXC_OTHER0_RETRY_AD_RSP_VN0   0x02
+UMASK_RXC_OTHER0_RETRY_BL_RSP_VN0   0x04
+UMASK_RXC_OTHER0_RETRY_BL_WB_VN0    0x08
+UMASK_RXC_OTHER0_RETRY_BL_NCB_VN0   0x10
+UMASK_RXC_OTHER0_RETRY_BL_NCS_VN0   0x20
+UMASK_RXC_OTHER0_RETRY_AK_NON_UPI   0x40
+UMASK_RXC_OTHER0_RETRY_IV_NON_UPI   0x80
+
+EVENT_RXC_OTHER1_REJECT               0x2F CBOX
+UMASK_RXC_OTHER1_REJECT_ANY0          0x01
+UMASK_RXC_OTHER1_REJECT_HA            0x02
+UMASK_RXC_OTHER1_REJECT_LLC_VICTIM    0x04
+UMASK_RXC_OTHER1_REJECT_SF_VICTIM     0x08
+UMASK_RXC_OTHER1_REJECT_VICTIM        0x10
+UMASK_RXC_OTHER1_REJECT_LLC_OR_SF_WAY 0x20
+UMASK_RXC_OTHER1_REJECT_ALLOW_SNP     0x40
+UMASK_RXC_OTHER1_REJECT_PA_MATCH      0x80
+
+EVENT_RXC_PRQ0_REJECT               0x20 CBOX
+UMASK_RXC_PRQ0_REJECT_AD_REQ_VN0    0x01
+UMASK_RXC_PRQ0_REJECT_AD_RSP_VN0    0x02
+UMASK_RXC_PRQ0_REJECT_BL_RSP_VN0    0x04
+UMASK_RXC_PRQ0_REJECT_BL_WB_VN0     0x08
+UMASK_RXC_PRQ0_REJECT_BL_NCB_VN0    0x10
+UMASK_RXC_PRQ0_REJECT_BL_NCS_VN0    0x20
+UMASK_RXC_PRQ0_REJECT_AK_NON_UPI    0x40
+UMASK_RXC_PRQ0_REJECT_IV_NON_UPI    0x80
+
+EVENT_RXC_PRQ1_REJECT               0x21 CBOX
+UMASK_RXC_PRQ1_REJECT_ANY0          0x01
+UMASK_RXC_PRQ1_REJECT_HA            0x02
+UMASK_RXC_PRQ1_REJECT_LLC_VICTIM    0x04
+UMASK_RXC_PRQ1_REJECT_SF_VICTIM     0x08
+UMASK_RXC_PRQ1_REJECT_VICTIM        0x10
+UMASK_RXC_PRQ1_REJECT_LLC_OR_SF_WAY 0x20
+UMASK_RXC_PRQ1_REJECT_ALLOW_SNP     0x40
+UMASK_RXC_PRQ1_REJECT_PA_MATCH      0x80
+
+EVENT_RXC_REQ_Q0_RETRY              0x2A CBOX
+UMASK_RXC_REQ_Q0_RETRY_AD_REQ_VN0   0x01
+UMASK_RXC_REQ_Q0_RETRY_AD_RSP_VN0   0x02
+UMASK_RXC_REQ_Q0_RETRY_BL_RSP_VN0   0x04
+UMASK_RXC_REQ_Q0_RETRY_BL_WB_VN0    0x08
+UMASK_RXC_REQ_Q0_RETRY_BL_NCB_VN0   0x10
+UMASK_RXC_REQ_Q0_RETRY_BL_NCS_VN0   0x20
+UMASK_RXC_REQ_Q0_RETRY_AK_NON_UPI   0x40
+UMASK_RXC_REQ_Q0_RETRY_IV_NON_UPI   0x80
+
+EVENT_RXC_REQ_Q1_RETRY               0x2B CBOX
+UMASK_RXC_REQ_Q1_RETRY_ANY0          0x01
+UMASK_RXC_REQ_Q1_RETRY_HA            0x02
+UMASK_RXC_REQ_Q1_RETRY_LLC_VICTIM    0x04
+UMASK_RXC_REQ_Q1_RETRY_SF_VICTIM     0x08
+UMASK_RXC_REQ_Q1_RETRY_VICTIM        0x10
+UMASK_RXC_REQ_Q1_RETRY_LLC_OR_SF_WAY 0x20
+UMASK_RXC_REQ_Q1_RETRY_ALLOW_SNP     0x40
+UMASK_RXC_REQ_Q1_RETRY_PA_MATCH      0x80
+
+EVENT_RXC_RRQ0_REJECT               0x26 CBOX
+UMASK_RXC_RRQ0_REJECT_AD_REQ_VN0    0x01
+UMASK_RXC_RRQ0_REJECT_AD_RSP_VN0    0x02
+UMASK_RXC_RRQ0_REJECT_BL_RSP_VN0    0x04
+UMASK_RXC_RRQ0_REJECT_BL_WB_VN0     0x08
+UMASK_RXC_RRQ0_REJECT_BL_NCB_VN0    0x10
+UMASK_RXC_RRQ0_REJECT_BL_NCS_VN0    0x20
+UMASK_RXC_RRQ0_REJECT_AK_NON_UPI    0x40
+UMASK_RXC_RRQ0_REJECT_IV_NON_UPI    0x80
+
+EVENT_RXC_RRQ1_REJECT               0x27 CBOX
+UMASK_RXC_RRQ1_REJECT_ANY0          0x01
+UMASK_RXC_RRQ1_REJECT_HA            0x02
+UMASK_RXC_RRQ1_REJECT_LLC_VICTIM    0x04
+UMASK_RXC_RRQ1_REJECT_SF_VICTIM     0x08
+UMASK_RXC_RRQ1_REJECT_VICTIM        0x10
+UMASK_RXC_RRQ1_REJECT_LLC_OR_SF_WAY 0x20
+UMASK_RXC_RRQ1_REJECT_ALLOW_SNP     0x40
+UMASK_RXC_RRQ1_REJECT_PA_MATCH      0x80
+
+EVENT_RXC_WBQ0_REJECT               0x28 CBOX
+UMASK_RXC_WBQ0_REJECT_AD_REQ_VN0    0x01
+UMASK_RXC_WBQ0_REJECT_AD_RSP_VN0    0x02
+UMASK_RXC_WBQ0_REJECT_BL_RSP_VN0    0x04
+UMASK_RXC_WBQ0_REJECT_BL_WB_VN0     0x08
+UMASK_RXC_WBQ0_REJECT_BL_NCB_VN0    0x10
+UMASK_RXC_WBQ0_REJECT_BL_NCS_VN0    0x20
+UMASK_RXC_WBQ0_REJECT_AK_NON_UPI    0x40
+UMASK_RXC_WBQ0_REJECT_IV_NON_UPI    0x80
+
+EVENT_RXC_WBQ1_REJECT               0x29 CBOX
+UMASK_RXC_WBQ1_REJECT_ANY0          0x01
+UMASK_RXC_WBQ1_REJECT_HA            0x02
+UMASK_RXC_WBQ1_REJECT_LLC_VICTIM    0x04
+UMASK_RXC_WBQ1_REJECT_SF_VICTIM     0x08
+UMASK_RXC_WBQ1_REJECT_VICTIM        0x10
+UMASK_RXC_WBQ1_REJECT_LLC_OR_SF_WAY 0x20
+UMASK_RXC_WBQ1_REJECT_ALLOW_SNP     0x40
+UMASK_RXC_WBQ1_REJECT_PA_MATCH      0x80
+
+EVENT_SNOOPS_SENT                   0x51 CBOX
+UMASK_SNOOPS_SENT_ALL               0x01
+UMASK_SNOOPS_SENT_LOCAL             0x04
+UMASK_SNOOPS_SENT_REMOTE            0x08
+UMASK_SNOOPS_SENT_BCST_LOCAL        0x10
+UMASK_SNOOPS_SENT_BCST_REMOTE       0x20
+UMASK_SNOOPS_SENT_DIRECT_LOCAL      0x40
+UMASK_SNOOPS_SENT_DIRECT_REMOTE     0x80
+
+EVENT_SNOOPS_RESP                   0x5C CBOX
+UMASK_SNOOPS_RESP_RSPI              0x01
+UMASK_SNOOPS_RESP_RSPS              0x02
+UMASK_SNOOPS_RESP_RSPIFWD           0x04
+UMASK_SNOOPS_RESP_RSPSFWD           0x08
+UMASK_SNOOPS_RESP_RSP_WBWB          0x10
+UMASK_SNOOPS_RESP_RSP_FWD_WB        0x20
+UMASK_SNOOPS_RESP_RSPCNFLCTS        0x40
+UMASK_SNOOPS_RESP_RSPFWD            0x80
+
+EVENT_SNOOPS_RESP_LOCAL                   0x5D CBOX
+UMASK_SNOOPS_RESP_LOCAL_RSPI              0x01
+UMASK_SNOOPS_RESP_LOCAL_RSPS              0x02
+UMASK_SNOOPS_RESP_LOCAL_RSPIFWD           0x04
+UMASK_SNOOPS_RESP_LOCAL_RSPSFWD           0x08
+UMASK_SNOOPS_RESP_LOCAL_RSP_WBWB          0x10
+UMASK_SNOOPS_RESP_LOCAL_RSP_FWD_WB        0x20
+UMASK_SNOOPS_RESP_LOCAL_RSPCNFLCTS        0x40
+UMASK_SNOOPS_RESP_LOCAL_RSPFWD            0x80
+
+EVENT_TOR_INSERTS                   0x35 CBOX
+OPTIONS_TOR_INSERTS_IRQ             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IRQ               0x01
+OPTIONS_TOR_INSERTS_EVICT           EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_EVICT             0x02
+OPTIONS_TOR_INSERTS_PRQ             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_PRQ               0x04
+OPTIONS_TOR_INSERTS_IPQ             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IPQ               0x08
+OPTIONS_TOR_INSERTS_HIT             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_HIT               0x10
+OPTIONS_TOR_INSERTS_IA_HIT          EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IA_HIT            0x11
+OPTIONS_TOR_INSERTS_IO_HIT          EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IO_HIT            0x14
+OPTIONS_TOR_INSERTS_ALL_HIT         EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_ALL_HIT           0x15
+OPTIONS_TOR_INSERTS_MISS            EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_MISS              0x20
+OPTIONS_TOR_INSERTS_IA_MISS         EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IA_MISS           0x21
+OPTIONS_TOR_INSERTS_IO_MISS         EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IO_MISS           0x24
+OPTIONS_TOR_INSERTS_ALL_MISS        EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_ALL_MISS          0x25
+OPTIONS_TOR_INSERTS_IA              EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IA                0x31
+OPTIONS_TOR_INSERTS_IO              EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_IO                0x34
+OPTIONS_TOR_INSERTS_ALL_IO_IA       EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_INSERTS_ALL_IO_IA         0x35
+
+EVENT_TOR_OCCUPANCY                   0x36 CBOX0C0|CBOX1C0|CBOX2C0|CBOX3C0|CBOX4C0|CBOX5C0|CBOX6C0|CBOX7C0|CBOX8C0|CBOX9C0|CBOX10C0|CBOX11C0|CBOX12C0|CBOX13C0|CBOX14C0|CBOX15C0|CBOX16C0|CBOX17C0|CBOX18C0|CBOX19C0|CBOX20C0|CBOX21C0|CBOX22C0|CBOX23C0|CBOX24C0|CBOX25C0|CBOX26C0|CBOX27C0
+OPTIONS_TOR_OCCUPANCY_IRQ             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IRQ               0x01
+OPTIONS_TOR_OCCUPANCY_EVICT           EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_EVICT             0x02
+OPTIONS_TOR_OCCUPANCY_PRQ             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_PRQ               0x04
+OPTIONS_TOR_OCCUPANCY_IPQ             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IPQ               0x08
+OPTIONS_TOR_OCCUPANCY_HIT             EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_HIT               0x10
+OPTIONS_TOR_OCCUPANCY_IA_HIT          EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IA_HIT            0x11
+OPTIONS_TOR_OCCUPANCY_IO_HIT          EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IO_HIT            0x14
+OPTIONS_TOR_OCCUPANCY_ALL_HIT         EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_ALL_HIT           0x17
+OPTIONS_TOR_OCCUPANCY_MISS            EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_MISS              0x20
+OPTIONS_TOR_OCCUPANCY_IA_MISS         EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IA_MISS           0x21
+OPTIONS_TOR_OCCUPANCY_IO_MISS         EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IO_MISS           0x24
+OPTIONS_TOR_OCCUPANCY_ALL_MISS        EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_ALL_MISS          0x27
+OPTIONS_TOR_OCCUPANCY_IA              EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IA                0x31
+OPTIONS_TOR_OCCUPANCY_IO              EVENT_OPTION_OPCODE_MASK
+UMASK_TOR_OCCUPANCY_IO                0x34
+
+EVENT_WB_PUSH_MTOI                  0x56 CBOX
+UMASK_WB_PUSH_MTOI_LLC              0x01
+UMASK_WB_PUSH_MTOI_MEM              0x02
+
+EVENT_XSNP_RESP                     0x32 CBOX
+UMASK_XSNP_RESP_EXT_RSP_HITFSE      0x21
+UMASK_XSNP_RESP_EXT_RSPS_FWDFE      0x22
+UMASK_XSNP_RESP_EXT_RSPI_FWDFE      0x24
+UMASK_XSNP_RESP_EXT_RSPS_FWDM       0x28
+UMASK_XSNP_RESP_EXT_RSPI_FWDM       0x30
+UMASK_XSNP_RESP_CORE_RSP_HITFSE     0x41
+UMASK_XSNP_RESP_CORE_RSPS_FWDFE     0x42
+UMASK_XSNP_RESP_CORE_RSPI_FWDFE     0x44
+UMASK_XSNP_RESP_CORE_RSPS_FWDM      0x48
+UMASK_XSNP_RESP_CORE_RSPI_FWDM      0x50
+UMASK_XSNP_RESP_EVICT_RSP_HITFSE    0x81
+UMASK_XSNP_RESP_EVICT_RSPS_FWDFE    0x82
+UMASK_XSNP_RESP_EVICT_RSPI_FWDFE    0x84
+UMASK_XSNP_RESP_EVICT_RSPS_FWDM     0x88
+UMASK_XSNP_RESP_EVICT_RSPI_FWDM     0x90
+UMASK_XSNP_RESP_ANY_RSP_HITFSE      0xE1
+UMASK_XSNP_RESP_ANY_RSPS_FWDFE      0xE2
+UMASK_XSNP_RESP_ANY_RSPI_FWDFE      0xE4
+UMASK_XSNP_RESP_ANY_RSPS_FWDM       0xE8
+
+EVENT_ACT_COUNT                     0x01 MBOX
+UMASK_ACT_COUNT_RD                  0x01
+UMASK_ACT_COUNT_WR                  0x02
+UMASK_ACT_COUNT_BYP                 0x08
+
+EVENT_BYP_CMDS                      0xA1 MBOX
+UMASK_BYP_CMDS_ACT                  0x01
+UMASK_BYP_CMDS_CAS                  0x02
+UMASK_BYP_CMDS_PRE                  0x04
+
+EVENT_CAS_COUNT                     0x04 MBOX
+UMASK_CAS_COUNT_RD_REG              0x01
+UMASK_CAS_COUNT_RD_UNDERFILL        0x02
+UMASK_CAS_COUNT_RD                  0x03
+UMASK_CAS_COUNT_WR_WMM              0x04
+UMASK_CAS_COUNT_WR_RMM              0x08
+UMASK_CAS_COUNT_WR                  0x0C
+UMASK_CAS_COUNT_RD_WMM              0x10
+UMASK_CAS_COUNT_RD_RMM              0x20
+UMASK_CAS_COUNT_RD_ISOCH            0x40
+UMASK_CAS_COUNT_WR_ISOCH            0x80
+
+EVENT_DRAM_CLOCKTICKS               0x00 MBOX0FIX|MBOX1FIX|MBOX2FIX|MBOX3FIX|MBOX4FIX|MBOX5FIX
+UMASK_DRAM_CLOCKTICKS               0x00
+
+EVENT_WBOX_CLOCKTICKS               0x00 WBOX
+UMASK_WBOX_CLOCKTICKS               0x00
+
+EVENT_CORE_TRANSITION_CYCLES        0x60 WBOX
+UMASK_CORE_TRANSITION_CYCLES        0x00
+
+EVENT_CTS_EVENT0                    0x11 WBOX
+UMASK_CTS_EVENT0                    0x00
+
+EVENT_CTS_EVENT1                    0x12 WBOX
+UMASK_CTS_EVENT1                    0x00
+
+EVENT_DEMOTIONS                     0x30 WBOX
+UMASK_DEMOTIONS                     0x00
+
+EVENT_FIVR_PS_PS0_CYCLES            0x75 WBOX
+UMASK_FIVR_PS_PS0_CYCLES            0x00
+
+EVENT_FIVR_PS_PS1_CYCLES            0x76 WBOX
+UMASK_FIVR_PS_PS1_CYCLES            0x00
+
+EVENT_FIVR_PS_PS2_CYCLES            0x77 WBOX
+UMASK_FIVR_PS_PS2_CYCLES            0x00
+
+EVENT_FIVR_PS_PS3_CYCLES            0x78 WBOX
+UMASK_FIVR_PS_PS3_CYCLES            0x00
+
+EVENT_FREQ_MAX_LIMIT_THERMAL_CYCLES 0x04 WBOX
+UMASK_FREQ_MAX_LIMIT_THERMAL_CYCLES 0x00
+
+EVENT_FREQ_MAX_POWER_CYCLES         0x05 WBOX
+UMASK_FREQ_MAX_POWER_CYCLES         0x00
+
+EVENT_FREQ_MIN_IO_P_CYCLES          0x73 WBOX
+UMASK_FREQ_MIN_IO_P_CYCLES          0x00
+
+EVENT_FREQ_TRANS_CYCLES             0x74 WBOX
+UMASK_FREQ_TRANS_CYCLES             0x00
+
+EVENT_MCP_PROCHOT_CYCLES            0x06 WBOX
+UMASK_MCP_PROCHOT_CYCLES            0x00
+
+EVENT_MEMORY_PHASE_SHEDDING_CYCLES  0x2F WBOX
+UMASK_MEMORY_PHASE_SHEDDING_CYCLES  0x00
+
+EVENT_PKG_RESIDENCY_C0_CYCLES       0x2A WBOX
+UMASK_PKG_RESIDENCY_C0_CYCLES       0x00
+
+EVENT_PKG_RESIDENCY_C2E_CYCLES      0x2B WBOX
+UMASK_PKG_RESIDENCY_C2E_CYCLES      0x00
+
+EVENT_PKG_RESIDENCY_C3_CYCLES       0x2C WBOX
+UMASK_PKG_RESIDENCY_C3_CYCLES       0x00
+
+EVENT_PKG_RESIDENCY_C6_CYCLES       0x2D WBOX
+UMASK_PKG_RESIDENCY_C6_CYCLES       0x00
+
+EVENT_PMAX_THROTTLED_CYCLES         0x07 WBOX
+UMASK_PMAX_THROTTLED_CYCLES         0x00
+
+EVENT_PROCHOT_EXTERNAL_CYCLES       0x0A WBOX
+UMASK_PROCHOT_EXTERNAL_CYCLES       0x00
+
+EVENT_PROCHOT_INTERNAL_CYCLES       0x09 WBOX
+UMASK_PROCHOT_INTERNAL_CYCLES       0x00
+
+EVENT_TOTAL_TRANSITION_CYCLES       0x72 WBOX
+UMASK_TOTAL_TRANSITION_CYCLES       0x00
+
+EVENT_VR_HOT_CYCLES                 0x42 WBOX
+UMASK_VR_HOT_CYCLES                 0x00
+
+EVENT_CORES_IN_C3                       0x00 WBOX0FIX
+UMASK_CORES_IN_C3                       0x00
+
+EVENT_CORES_IN_C6                       0x00 WBOX1FIX
+UMASK_CORES_IN_C6                       0x00
+
+EVENT_CORES_IN_P3                       0x00 WBOX2FIX
+UMASK_CORES_IN_P3                       0x00
+
+EVENT_CORES_IN_P6                       0x00 WBOX3FIX
+UMASK_CORES_IN_P6                       0x00
+
+EVENT_M2M_CLOCKTICKS                   0x00 M2M
+UMASK_M2M_CLOCKTICKS                   0x00
+
+EVENT_BYPASS_M2M_EGRESS             0x22 M2M
+UMASK_BYPASS_M2M_EGRESS_TAKEN       0x01
+UMASK_BYPASS_M2M_EGRESS_NOT_TAKEN   0x02
+
+EVENT_BYPASS_M2M_INGRESS            0x21 M2M
+UMASK_BYPASS_M2M_INGRESS_TAKEN      0x01
+UMASK_BYPASS_M2M_INGRESS_NOT_TAKEN  0x02
+
+EVENT_DDRT_RPQ_CYCLES_REG_CREDITS       0x4F M2M
+UMASK_DDRT_RPQ_CYCLES_REG_CREDITS_CHN0  0x01
+UMASK_DDRT_RPQ_CYCLES_REG_CREDITS_CHN1  0x02
+UMASK_DDRT_RPQ_CYCLES_REG_CREDITS_CHN2  0x04
+DEFAULT_OPTIONS_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN0 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN0  0x01
+DEFAULT_OPTIONS_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN1 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN1  0x02
+DEFAULT_OPTIONS_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN2 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN2  0x03
+
+EVENT_DDRT_WPQ_CYCLES_REG_CREDITS       0x51 M2M
+UMASK_DDRT_WPQ_CYCLES_REG_CREDITS_CHN0  0x01
+UMASK_DDRT_WPQ_CYCLES_REG_CREDITS_CHN1  0x02
+UMASK_DDRT_WPQ_CYCLES_REG_CREDITS_CHN2  0x04
+DEFAULT_OPTIONS_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN0 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_DDRT_WPQ_CYCLES_REG_NO_CREDITS_CHN0  0x01
+DEFAULT_OPTIONS_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN1 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_DDRT_WPQ_CYCLES_REG_NO_CREDITS_CHN1  0x02
+DEFAULT_OPTIONS_DDRT_RPQ_CYCLES_REG_NO_CREDITS_CHN2 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_DDRT_WPQ_CYCLES_REG_NO_CREDITS_CHN2  0x03
+
+EVENT_DIRECT2CORE_NOT_TAKEN_DIRSTATE    0x24 M2M
+UMASK_DIRECT2CORE_NOT_TAKEN_DIRSTATE    0x00
+
+EVENT_DIRECT2CORE_TAKEN                 0x24 M2M
+UMASK_DIRECT2CORE_TAKEN                 0x00
+
+EVENT_DIRECT2CORE_TXN_OVERRIDE          0x25 M2M
+UMASK_DIRECT2CORE_TXN_OVERRIDE          0x00
+
+EVENT_DIRECT2UPI_NOT_TAKEN_CREDITS      0x28 M2M
+UMASK_DIRECT2UPI_NOT_TAKEN_CREDITS      0x00
+
+EVENT_DIRECT2UPI_NOT_TAKEN_DIRSTATE     0x27 M2M
+UMASK_DIRECT2UPI_NOT_TAKEN_DIRSTATE     0x00
+
+EVENT_DIRECT2UPI_TAKEN                  0x26 M2M
+UMASK_DIRECT2UPI_TAKEN                  0x00
+
+EVENT_DIRECT2UPI_TXN_OVERRIDE           0x29 M2M
+UMASK_DIRECT2UPI_TXN_OVERRIDE           0x00
+
+EVENT_DIRECTORY_HIT                     0x2A M2M
+UMASK_DIRECTORY_HIT_DIRTY_I             0x01
+UMASK_DIRECTORY_HIT_DIRTY_S             0x02
+UMASK_DIRECTORY_HIT_DIRTY_P             0x04
+UMASK_DIRECTORY_HIT_DIRTY_A             0x08
+UMASK_DIRECTORY_HIT_CLEAN_I             0x10
+UMASK_DIRECTORY_HIT_CLEAN_S             0x20
+UMASK_DIRECTORY_HIT_CLEAN_P             0x40
+UMASK_DIRECTORY_HIT_CLEAN_A             0x80
+
+EVENT_DIRECTORY_LOOKUP                  0x2D M2M
+UMASK_DIRECTORY_LOOKUP_ANY              0x01
+UMASK_DIRECTORY_LOOKUP_STATE_I          0x02
+UMASK_DIRECTORY_LOOKUP_STATE_S          0x04
+UMASK_DIRECTORY_LOOKUP_STATE_A          0x08
+
+EVENT_DIRECTORY_MISS                     0x2B M2M
+UMASK_DIRECTORY_MISS_DIRTY_I             0x01
+UMASK_DIRECTORY_MISS_DIRTY_S             0x02
+UMASK_DIRECTORY_MISS_DIRTY_P             0x04
+UMASK_DIRECTORY_MISS_DIRTY_A             0x08
+UMASK_DIRECTORY_MISS_CLEAN_I             0x10
+UMASK_DIRECTORY_MISS_CLEAN_S             0x20
+UMASK_DIRECTORY_MISS_CLEAN_P             0x40
+UMASK_DIRECTORY_MISS_CLEAN_A             0x80
+
+EVENT_DIRECTORY_UPDATE                  0x2E M2M
+UMASK_DIRECTORY_UPDATE_ANY              0x01
+UMASK_DIRECTORY_UPDATE_I2S              0x02
+UMASK_DIRECTORY_UPDATE_I2A              0x04
+UMASK_DIRECTORY_UPDATE_S2I              0x08
+UMASK_DIRECTORY_UPDATE_S2A              0x10
+UMASK_DIRECTORY_UPDATE_A2I              0x20
+UMASK_DIRECTORY_UPDATE_A2S              0x40
+
+EVENT_IMC_READS                         0x37 M2M
+UMASK_IMC_READS_NORMAL                  0x01
+UMASK_IMC_READS_ISOCH                   0x02
+UMASK_IMC_READS_ALL                     0x04
+UMASK_IMC_READS_TO_DDRT                 0x08
+UMASK_IMC_READS_FROM_TRANSGRESS         0x10
+
+EVENT_IMC_WRITES                         0x37 M2M
+UMASK_IMC_WRITES_FULL                    0x01
+UMASK_IMC_WRITES_PARTIAL                 0x02
+UMASK_IMC_WRITES_FULL_ISOCH              0x04
+UMASK_IMC_WRITES_PARTIAL_ISOCH           0x08
+UMASK_IMC_WRITES_ALL                     0x10
+UMASK_IMC_WRITES_TO_DDRT                 0x20
+UMASK_IMC_WRITES_FROM_TRANSGRESS         0x40
+UMASK_IMC_WRITES_NI                      0x80
+
+EVENT_PCOMMITS                          0x65 M2M
+UMASK_PCOMMITS                          0x00
+
+EVENT_PCOMMIT_COALESCED                 0x66 M2M
+UMASK_PCOMMIT_COALESCED                 0x00
+
+EVENT_PKT_MATCH                         0x4C M2M
+UMASK_PKT_MATCH_MESH                    0x01
+UMASK_PKT_MATCH_MC                      0x02
+
+EVENT_PREFCAM_CYCLES_FULL               0x53 M2M
+UMASK_PREFCAM_CYCLES_FULL               0x00
+
+EVENT_PREFCAM_CYCLES_NE                 0x54 M2M
+UMASK_PREFCAM_CYCLES_NE                 0x00
+
+EVENT_PREFCAM_DEMAND_PROMOTIONS         0x56 M2M
+UMASK_PREFCAM_DEMAND_PROMOTIONS         0x00
+
+EVENT_PREFCAM_INSERTS                   0x57 M2M
+UMASK_PREFCAM_INSERTS                   0x00
+
+EVENT_PREFCAM_OCCUPANCY                 0x55 M2M
+UMASK_PREFCAM_OCCUPANCY                 0x00
+
+EVENT_RPQ_CYCLES_REG_CREDITS            0x43 M2M
+UMASK_RPQ_CYCLES_REG_CREDITS_CHN0       0x01
+UMASK_RPQ_CYCLES_REG_CREDITS_CHN1       0x02
+UMASK_RPQ_CYCLES_REG_CREDITS_CHN2       0x04
+DEFAULT_OPTIONS_RPQ_CYCLES_REG_NO_CREDITS_CHN0 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_RPQ_CYCLES_REG_NO_CREDITS_CHN0    0x01
+DEFAULT_OPTIONS_RPQ_CYCLES_REG_NO_CREDITS_CHN1 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_RPQ_CYCLES_REG_NO_CREDITS_CHN1    0x02
+DEFAULT_OPTIONS_RPQ_CYCLES_REG_NO_CREDITS_CHN2 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_RPQ_CYCLES_REG_NO_CREDITS_CHN2    0x04
+
+EVENT_RPQ_CYCLES_SPEC_CREDITS            0x44 M2M
+UMASK_RPQ_CYCLES_SPEC_CREDITS_CHN0       0x01
+UMASK_RPQ_CYCLES_SPEC_CREDITS_CHN1       0x02
+UMASK_RPQ_CYCLES_SPEC_CREDITS_CHN2       0x04
+DEFAULT_OPTIONS_RPQ_CYCLES_SPEC_NO_CREDITS_CHN0 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_RPQ_CYCLES_SPEC_NO_CREDITS_CHN0    0x01
+DEFAULT_OPTIONS_RPQ_CYCLES_SPEC_NO_CREDITS_CHN1 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_RPQ_CYCLES_SPEC_NO_CREDITS_CHN1    0x02
+DEFAULT_OPTIONS_RPQ_CYCLES_SPEC_NO_CREDITS_CHN2 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_RPQ_CYCLES_SPEC_NO_CREDITS_CHN2    0x04
+
+EVENT_RXC_AD_CYCLES_FULL                0x04 M2M
+UMASK_RXC_AD_CYCLES_FULL                0x00
+
+EVENT_RXC_AD_CYCLES_NE                0x03 M2M
+UMASK_RXC_AD_CYCLES_NE                0x00
+
+EVENT_RXC_AD_INSERTS                0x01 M2M
+UMASK_RXC_AD_INSERTS                0x00
+
+EVENT_RXC_AD_OCCUPANCY                0x02 M2M
+UMASK_RXC_AD_OCCUPANCY                0x00
+
+EVENT_RXC_BL_CYCLES_FULL                0x08 M2M
+UMASK_RXC_BL_CYCLES_FULL                0x00
+
+EVENT_RXC_BL_CYCLES_NE                0x07 M2M
+UMASK_RXC_BL_CYCLES_NE                0x00
+
+EVENT_RXC_BL_INSERTS                0x05 M2M
+UMASK_RXC_BL_INSERTS                0x00
+
+EVENT_RXC_BL_OCCUPANCY                0x06 M2M
+UMASK_RXC_BL_OCCUPANCY                0x00
+
+EVENT_SCOREBOARD_AD_RETRY_ACCEPTS       0x33 M2M
+UMASK_SCOREBOARD_AD_RETRY_ACCEPTS       0x00
+
+EVENT_SCOREBOARD_AD_RETRY_REJECTS       0x34 M2M
+UMASK_SCOREBOARD_AD_RETRY_REJECTS       0x00
+
+EVENT_SCOREBOARD_BL_RETRY_ACCEPTS       0x35 M2M
+UMASK_SCOREBOARD_BL_RETRY_ACCEPTS       0x00
+
+EVENT_SCOREBOARD_BL_RETRY_REJECTS       0x36 M2M
+UMASK_SCOREBOARD_BL_RETRY_REJECTS       0x00
+
+EVENT_SCOREBOARD_CYCLES_REG_CREDITS            0x59 M2M
+UMASK_SCOREBOARD_CYCLES_REG_CREDITS_CHN0       0x01
+UMASK_SCOREBOARD_CYCLES_REG_CREDITS_CHN1       0x02
+UMASK_SCOREBOARD_CYCLES_REG_CREDITS_CHN2       0x04
+DEFAULT_OPTIONS_SCOREBOARD_CYCLES_REG_NO_CREDITS_CHN0 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_SCOREBOARD_CYCLES_REG_NO_CREDITS_CHN0    0x01
+DEFAULT_OPTIONS_SCOREBOARD_CYCLES_REG_NO_CREDITS_CHN1 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_SCOREBOARD_CYCLES_REG_NO_CREDITS_CHN1    0x02
+DEFAULT_OPTIONS_SCOREBOARD_CYCLES_REG_NO_CREDITS_CHN2 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_SCOREBOARD_CYCLES_REG_NO_CREDITS_CHN2    0x04
+
+EVENT_SCOREBOARD_RD_RETRY_ACCEPTS       0x2F M2M
+UMASK_SCOREBOARD_RD_RETRY_ACCEPTS       0x00
+
+EVENT_SCOREBOARD_RD_RETRY_REJECTS       0x30 M2M
+UMASK_SCOREBOARD_RD_RETRY_REJECTS       0x00
+
+EVENT_SCOREBOARD_WR_RETRY_ACCEPTS       0x31 M2M
+UMASK_SCOREBOARD_WR_RETRY_ACCEPTS       0x00
+
+EVENT_SCOREBOARD_WR_RETRY_REJECTS       0x32 M2M
+UMASK_SCOREBOARD_WR_RETRY_REJECTS       0x00
+
+EVENT_TAG_HIT                           0x2C M2M
+UMASK_TAG_HIT_NM_DRD_HIT_CLEAN          0x01
+UMASK_TAG_HIT_NM_DRD_HIT_DIRTY          0x02
+UMASK_TAG_HIT_NM_UFILL_HIT_CLEAN        0x04
+UMASK_TAG_HIT_NM_UFILL_HIT_DIRTY        0x08
+
+EVENT_TGR_AD_CREDITS                    0x41 M2M
+UMASK_TGR_AD_CREDITS                    0x00
+
+EVENT_TGR_BL_CREDITS                    0x42 M2M
+UMASK_TGR_BL_CREDITS                    0x00
+
+EVENT_TRACKER_CYCLES_FULL               0x45 M2M
+UMASK_TRACKER_CYCLES_FULL_CHN0          0x01
+UMASK_TRACKER_CYCLES_FULL_CHN1          0x02
+UMASK_TRACKER_CYCLES_FULL_CHN2          0x04
+UMASK_TRACKER_CYCLES_FULL_ALL           0x07
+
+EVENT_TRACKER_CYCLES_NE                 0x46 M2M
+UMASK_TRACKER_CYCLES_NE_CHN0            0x01
+UMASK_TRACKER_CYCLES_NE_CHN1            0x02
+UMASK_TRACKER_CYCLES_NE_CHN2            0x04
+UMASK_TRACKER_CYCLES_NE_ALL             0x07
+
+EVENT_TRACKER_CYCLES_INSERTS               0x47 M2M
+UMASK_TRACKER_CYCLES_INSERTS_CHN0          0x01
+UMASK_TRACKER_CYCLES_INSERTS_CHN1          0x02
+UMASK_TRACKER_CYCLES_INSERTS_CHN2          0x04
+UMASK_TRACKER_CYCLES_INSERTS_ALL           0x07
+
+EVENT_TRACKER_PENDING_OCCUPANCY         0x48 M2M
+UMASK_TRACKER_PENDING_OCCUPANCY         0x00
+
+EVENT_TXC_AD_CREDITS_ACQUIRED           0x0D M2M
+UMASK_TXC_AD_CREDITS_ACQUIRED           0x00
+
+EVENT_TXC_AD_CREDITS_OCCUPANCY          0x0E M2M
+UMASK_TXC_AD_CREDITS_OCCUPANCY          0x00
+
+EVENT_TXC_AD_CYCLES_FULL                0x0C M2M
+UMASK_TXC_AD_CYCLES_FULL                0x00
+
+EVENT_TXC_AD_CYCLES_NE                  0x0B M2M
+UMASK_TXC_AD_CYCLES_NE                  0x00
+
+EVENT_TXC_AD_INSERTS                    0x09 M2M
+UMASK_TXC_AD_INSERTS                    0x00
+
+EVENT_TXC_AD_NO_CREDIT_CYCLES           0x0F M2M
+UMASK_TXC_AD_NO_CREDIT_CYCLES           0x00
+
+EVENT_TXC_AD_NO_CREDIT_STALLED          0x10 M2M
+UMASK_TXC_AD_NO_CREDIT_STALLED          0x00
+
+EVENT_TXC_AD_OCCUPANCY                  0x0A M2M
+UMASK_TXC_AD_OCCUPANCY                  0x00
+
+EVENT_TXC_AK                            0x39 M2M
+UMASK_TXC_AK_NDR                        0x01
+UMASK_TXC_AK_CRD_CBO                    0x02
+
+EVENT_TXC_AK_CREDITS_ACQUIRED           0x1D M2M
+UMASK_TXC_AK_CREDITS_ACQUIRED_CMS0      0x01
+UMASK_TXC_AK_CREDITS_ACQUIRED_CMS1      0x02
+UMASK_TXC_AK_CREDITS_ACQUIRED_ALL       0x03
+
+EVENT_TXC_AK_CREDITS_OCCUPANCY          0x1E M2M
+UMASK_TXC_AK_CREDITS_OCCUPANCY_CMS0     0x01
+UMASK_TXC_AK_CREDITS_OCCUPANCY_CMS1     0x02
+UMASK_TXC_AK_CREDITS_OCCUPANCY_ALL      0x03
+
+EVENT_TXC_AK_CYCLES_FULL                0x14 M2M
+UMASK_TXC_AK_CYCLES_FULL_CMS0           0x01
+UMASK_TXC_AK_CYCLES_FULL_CMS1           0x02
+UMASK_TXC_AK_CYCLES_FULL_ALL            0x03
+UMASK_TXC_AK_CYCLES_FULL_PCOMMIT        0x04
+UMASK_TXC_AK_CYCLES_FULL_RDCRD0         0x08
+UMASK_TXC_AK_CYCLES_FULL_WRCRD0         0x10
+UMASK_TXC_AK_CYCLES_FULL_WRCMP0         0x20
+UMASK_TXC_AK_CYCLES_FULL_RDCRD1         0x88
+UMASK_TXC_AK_CYCLES_FULL_WRCRD1         0x90
+UMASK_TXC_AK_CYCLES_FULL_WRCMP1         0xA0
+
+EVENT_TXC_AK_CYCLES_NE                  0x13 M2M
+UMASK_TXC_AK_CYCLES_NE_CMS0             0x01
+UMASK_TXC_AK_CYCLES_NE_CMS1             0x02
+UMASK_TXC_AK_CYCLES_NE_ALL              0x03
+UMASK_TXC_AK_CYCLES_NE_PCOMMIT          0x04
+UMASK_TXC_AK_CYCLES_NE_RDCRD            0x08
+UMASK_TXC_AK_CYCLES_NE_WRCRD            0x10
+UMASK_TXC_AK_CYCLES_NE_WRCMP            0x20
+
+EVENT_TXC_AK_INSERTS                    0x11 M2M
+UMASK_TXC_AK_INSERTS_CMS0               0x01
+UMASK_TXC_AK_INSERTS_CMS1               0x02
+UMASK_TXC_AK_INSERTS_ALL                0x03
+UMASK_TXC_AK_INSERTS_WRCRD              0x04
+UMASK_TXC_AK_INSERTS_RDCRD              0x04
+UMASK_TXC_AK_INSERTS_WRCMP              0x08
+UMASK_TXC_AK_INSERTS_PREF_RD_CAM_HIT    0x10
+
+EVENT_TXC_AK_NO_CREDIT_CYCLES           0x1F M2M
+UMASK_TXC_AK_NO_CREDIT_CYCLES_CMS0      0x01
+UMASK_TXC_AK_NO_CREDIT_CYCLES_CMS1      0x02
+UMASK_TXC_AK_NO_CREDIT_CYCLES_ALL       0x03
+
+EVENT_TXC_AK_NO_CREDIT_STALLED          0x20 M2M
+UMASK_TXC_AK_NO_CREDIT_STALLED_CMS0     0x01
+UMASK_TXC_AK_NO_CREDIT_STALLED_CMS1     0x02
+UMASK_TXC_AK_NO_CREDIT_STALLED_ALL      0x03
+
+EVENT_TXC_AK_OCCUPANCY                  0x12 M2M
+UMASK_TXC_AK_OCCUPANCY_CMS0             0x01
+UMASK_TXC_AK_OCCUPANCY_CMS1             0x02
+UMASK_TXC_AK_OCCUPANCY_ALL              0x03
+UMASK_TXC_AK_OCCUPANCY_PCOMMIT          0x04
+UMASK_TXC_AK_OCCUPANCY_RDCRD            0x08
+UMASK_TXC_AK_OCCUPANCY_WRCRD            0x10
+UMASK_TXC_AK_OCCUPANCY_WRCMP            0x20
+
+EVENT_TXC_AK_SIDEBAND                   0x6B M2M
+UMASK_TXC_AK_SIDEBAND_RD                0x01
+UMASK_TXC_AK_SIDEBAND_WR                0x02
+
+EVENT_TXC_BL                            0x40 M2M
+UMASK_TXC_BL_DRS_CACHE                  0x01
+UMASK_TXC_BL_DRS_CORE                   0x02
+UMASK_TXC_BL_DRS_UPI                    0x04
+
+EVENT_TXC_BL_CREDITS_ACQUIRED           0x19 M2M
+UMASK_TXC_BL_CREDITS_ACQUIRED_CMS0      0x01
+UMASK_TXC_BL_CREDITS_ACQUIRED_CMS1      0x02
+UMASK_TXC_BL_CREDITS_ACQUIRED_ALL       0x03
+
+EVENT_TXC_BL_CREDITS_OCCUPANCY          0x1E M2M
+UMASK_TXC_BL_CREDITS_OCCUPANCY_CMS0     0x01
+UMASK_TXC_BL_CREDITS_OCCUPANCY_CMS1     0x02
+UMASK_TXC_BL_CREDITS_OCCUPANCY_ALL      0x03
+
+EVENT_TXC_BL_CYCLES_FULL                0x18 M2M
+UMASK_TXC_BL_CYCLES_FULL_CMS0           0x01
+UMASK_TXC_BL_CYCLES_FULL_CMS1           0x02
+UMASK_TXC_BL_CYCLES_FULL_ALL            0x03
+
+EVENT_TXC_BL_CYCLES_NE                  0x17 M2M
+UMASK_TXC_BL_CYCLES_NE_CMS0             0x01
+UMASK_TXC_BL_CYCLES_NE_CMS1             0x02
+UMASK_TXC_BL_CYCLES_NE_ALL              0x03
+
+EVENT_TXC_BL_INSERTS                    0x15 M2M
+UMASK_TXC_BL_INSERTS_CMS0               0x01
+UMASK_TXC_BL_INSERTS_CMS1               0x02
+UMASK_TXC_BL_INSERTS_ALL                0x03
+
+EVENT_TXC_BL_NO_CREDIT_CYCLES           0x1B M2M
+UMASK_TXC_BL_NO_CREDIT_CYCLES_CMS0      0x01
+UMASK_TXC_BL_NO_CREDIT_CYCLES_CMS1      0x02
+UMASK_TXC_BL_NO_CREDIT_CYCLES_ALL       0x03
+
+EVENT_TXC_BL_NO_CREDIT_STALLED          0x1C M2M
+UMASK_TXC_BL_NO_CREDIT_STALLED_CMS0     0x01
+UMASK_TXC_BL_NO_CREDIT_STALLED_CMS1     0x02
+UMASK_TXC_BL_NO_CREDIT_STALLED_ALL      0x03
+
+EVENT_TXC_BL_OCCUPANCY                  0x16 M2M
+UMASK_TXC_BL_OCCUPANCY_CMS0             0x01
+UMASK_TXC_BL_OCCUPANCY_CMS1             0x02
+UMASK_TXC_BL_OCCUPANCY_ALL              0x03
+
+EVENT_WPQ_CYCLES_REG_CREDITS            0x4D M2M
+UMASK_WPQ_CYCLES_REG_CREDITS_CHN0       0x01
+UMASK_WPQ_CYCLES_REG_CREDITS_CHN1       0x02
+UMASK_WPQ_CYCLES_REG_CREDITS_CHN2       0x04
+UMASK_WPQ_CYCLES_REG_CREDITS_ALL        0x07
+DEFAULT_OPTIONS_WPQ_CYCLES_REG_NO_CREDITS_CHN0 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_REG_NO_CREDITS_CHN0    0x01
+DEFAULT_OPTIONS_WPQ_CYCLES_REG_NO_CREDITS_CHN1 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_REG_NO_CREDITS_CHN1    0x02
+DEFAULT_OPTIONS_WPQ_CYCLES_REG_NO_CREDITS_CHN2 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_REG_NO_CREDITS_CHN2    0x04
+DEFAULT_OPTIONS_WPQ_CYCLES_REG_NO_CREDITS_ALL EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_REG_NO_CREDITS_ALL     0x07
+
+EVENT_WPQ_CYCLES_SPEC_CREDITS            0x4E M2M
+UMASK_WPQ_CYCLES_SPEC_CREDITS_CHN0       0x01
+UMASK_WPQ_CYCLES_SPEC_CREDITS_CHN1       0x02
+UMASK_WPQ_CYCLES_SPEC_CREDITS_CHN2       0x04
+UMASK_WPQ_CYCLES_SPEC_CREDITS_ALL        0x07
+DEFAULT_OPTIONS_WPQ_CYCLES_SPEC_NO_CREDITS_CHN0 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_SPEC_NO_CREDITS_CHN0    0x01
+DEFAULT_OPTIONS_WPQ_CYCLES_SPEC_NO_CREDITS_CHN1 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_SPEC_NO_CREDITS_CHN1    0x02
+DEFAULT_OPTIONS_WPQ_CYCLES_SPEC_NO_CREDITS_CHN2 EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_SPEC_NO_CREDITS_CHN2    0x04
+DEFAULT_OPTIONS_WPQ_CYCLES_SPEC_NO_CREDITS_ALL EVENT_OPTION_THRESHOLD=0x01,EVENT_OPTION_INVERT=1
+UMASK_WPQ_CYCLES_SPEC_NO_CREDITS_ALL     0x07
+
+EVENT_WRITE_TRACKER_CYCLES_FULL         0x4A M2M
+UMASK_WRITE_TRACKER_CYCLES_FULL_CH0     0x01
+UMASK_WRITE_TRACKER_CYCLES_FULL_CH1     0x02
+UMASK_WRITE_TRACKER_CYCLES_FULL_CH2     0x04
+UMASK_WRITE_TRACKER_CYCLES_FULL_ALL     0x07
+
+EVENT_WRITE_TRACKER_CYCLES_NE         0x4B M2M
+UMASK_WRITE_TRACKER_CYCLES_NE_CH0     0x01
+UMASK_WRITE_TRACKER_CYCLES_NE_CH1     0x02
+UMASK_WRITE_TRACKER_CYCLES_NE_CH2     0x04
+UMASK_WRITE_TRACKER_CYCLES_NE_ALL     0x07
+
+EVENT_WRITE_TRACKER_INSERTS         0x61 M2M
+UMASK_WRITE_TRACKER_INSERTS_CH0     0x01
+UMASK_WRITE_TRACKER_INSERTS_CH1     0x02
+UMASK_WRITE_TRACKER_INSERTS_CH2     0x04
+UMASK_WRITE_TRACKER_INSERTS_ALL     0x07
+
+EVENT_WRITE_TRACKER_OCCUPANCY         0x60 M2M
+UMASK_WRITE_TRACKER_OCCUPANCY_CH0     0x01
+UMASK_WRITE_TRACKER_OCCUPANCY_CH1     0x02
+UMASK_WRITE_TRACKER_OCCUPANCY_CH2     0x04
+UMASK_WRITE_TRACKER_OCCUPANCY_ALL     0x07
+
+EVENT_SBOX_CLOCKTICKS               0x01 SBOX
+UMASK_SBOX_CLOCKTICKS               0x00
+
+EVENT_DIRECT_ATTEMPTS               0x12 SBOX
+UMASK_DIRECT_ATTEMPTS_D2C           0x01
+UMASK_DIRECT_ATTEMPTS_D2K           0x02
+
+EVENT_FLOWQ_NO_VNA_CRD              0x18 SBOX|CBOX|PBOX
+UMASK_FLOWQ_NO_VNA_CRD_AD_VNA_EQ0   0x01
+UMASK_FLOWQ_NO_VNA_CRD_AD_VNA_EQ1   0x02
+UMASK_FLOWQ_NO_VNA_CRD_AD_VNA_EQ2   0x04
+UMASK_FLOWQ_NO_VNA_CRD_BL_VNA_EQ0   0x08
+UMASK_FLOWQ_NO_VNA_CRD_AK_VNA_EQ0   0x10
+UMASK_FLOWQ_NO_VNA_CRD_AK_VNA_EQ1   0x20
+UMASK_FLOWQ_NO_VNA_CRD_AK_VNA_EQ2   0x40
+UMASK_FLOWQ_NO_VNA_CRD_AK_VNA_EQ3   0x80
+
+EVENT_L1_POWER_CYCLES               0x21 SBOX
+UMASK_L1_POWER_CYCLES               0x00
+
+EVENT_M3_BYP_BLOCKED                    0x14 SBOX
+UMASK_M3_BYP_BLOCKED_FLOWQ_AD_VNA_LE2   0x01
+UMASK_M3_BYP_BLOCKED_FLOWQ_BL_VNA_EQ0   0x02
+UMASK_M3_BYP_BLOCKED_FLOWQ_AK_VNA_LE3   0x04
+UMASK_M3_BYP_BLOCKED_BGF_CRD            0x08
+UMASK_M3_BYP_BLOCKED_GV_BLOCK           0x10
+
+EVENT_M3_CRD_RETURN_BLOCKED         0x16 SBOX
+UMASK_M3_CRD_RETURN_BLOCKED         0x00
+
+EVENT_M3_RXQ_BLOCKED                    0x15 SBOX
+UMASK_M3_RXQ_BLOCKED_FLOWQ_AD_VNA_LE2   0x01
+UMASK_M3_RXQ_BLOCKED_FLOWQ_AD_VNA_BTW_2_THRESH 0x02
+UMASK_M3_RXQ_BLOCKED_FLOWQ_BL_VNA_EQ0   0x04
+UMASK_M3_RXQ_BLOCKED_FLOWQ_BL_VNA_BTW_0_THRESH  0x08
+UMASK_M3_RXQ_BLOCKED_FLOWQ_AK_VNA_LE3   0x10
+UMASK_M3_RXQ_BLOCKED_BGF_CRD            0x20
+UMASK_M3_RXQ_BLOCKED_GV_BLOCK           0x40
+
+EVENT_PHY_INIT_CYCLES                   0x20 SBOX
+UMASK_PHY_INIT_CYCLES                   0x00
+
+EVENT_POWER_L1_NACK                     0x23 SBOX
+UMASK_POWER_L1_NACK                     0x00
+
+EVENT_POWER_L1_REQ                      0x22 SBOX
+UMASK_POWER_L1_REQ                      0x00
+
+EVENT_REQ_SLOT2_FROM_M3                 0x46 SBOX
+UMASK_REQ_SLOT2_FROM_M3_VNA             0x01
+UMASK_REQ_SLOT2_FROM_M3_VN0             0x02
+UMASK_REQ_SLOT2_FROM_M3_VN1             0x04
+UMASK_REQ_SLOT2_FROM_M3_ACK             0x08
+
+EVENT_RXL0P_POWER_CYCLES                0x25 SBOX
+UMASK_RXL0P_POWER_CYCLES                0x00
+
+EVENT_RXL0P_POWER_TRANSITION_COUNT      0x25 SBOX
+DEFAULT_OPTIONS_RXL0P_POWER_TRANSITION_COUNT EVENT_OPTION_EDGE=0x01
+UMASK_RXL0P_POWER_TRANSITION_COUNT      0x00
+
+EVENT_RXL0_POWER_CYCLES                 0x24 SBOX
+UMASK_RXL0_POWER_CYCLES                 0x00
+
+EVENT_RXL_BASIC_HDR_MATCH               0x05 SBOX
+UMASK_RXL_BASIC_HDR_MATCH_REQ           0x08 0x00 0x00
+UMASK_RXL_BASIC_HDR_MATCH_REQ_OPC       0x08 0x00 0x01
+UMASK_RXL_BASIC_HDR_MATCH_SNP           0x09 0x00 0x00
+UMASK_RXL_BASIC_HDR_MATCH_SNP_OPC       0x09 0x00 0x01
+UMASK_RXL_BASIC_HDR_MATCH_RSP_NODATA    0x0A 0x00 0x00
+UMASK_RXL_BASIC_HDR_MATCH_RSP_NODATA_OPC 0x0A 0x00 0x01
+UMASK_RXL_BASIC_HDR_MATCH_RSP_DATA      0x0C 0x00 0x00
+UMASK_RXL_BASIC_HDR_MATCH_RSP_DATA_OPC  0x0C 0x00 0x01
+UMASK_RXL_BASIC_HDR_MATCH_WB            0x0D 0x00 0x00
+UMASK_RXL_BASIC_HDR_MATCH_WB_OPC        0x0D 0x00 0x01
+UMASK_RXL_BASIC_HDR_MATCH_NCB           0x0E 0x00 0x00
+UMASK_RXL_BASIC_HDR_MATCH_NCB_OPC       0x0E 0x00 0x01
+UMASK_RXL_BASIC_HDR_MATCH_NCS           0x0F 0x00 0x00
+UMASK_RXL_BASIC_HDR_MATCH_NCS_OPC       0x0F 0x00 0x01
+
+EVENT_RXL_BYPASSED                      0x31 SBOX
+UMASK_RXL_BYPASSED_SLOT0                0x01
+UMASK_RXL_BYPASSED_SLOT1                0x02
+UMASK_RXL_BYPASSED_SLOT2                0x04
+
+EVENT_RXL_CREDITS_CONSUMED_VN0          0x39 SBOX
+UMASK_RXL_CREDITS_CONSUMED_VN0          0x00
+
+EVENT_RXL_CREDITS_CONSUMED_VN1          0x3A SBOX
+UMASK_RXL_CREDITS_CONSUMED_VN1          0x00
+
+EVENT_RXL_CREDITS_CONSUMED_VNA          0x38 SBOX
+UMASK_RXL_CREDITS_CONSUMED_VNA          0x00
+
+EVENT_RXL_FLITS                         0x03 SBOX
+UMASK_RXL_FLITS_SLOT0                   0x01
+UMASK_RXL_FLITS_SLOT1                   0x02
+UMASK_RXL_FLITS_SLOT2                   0x04
+UMASK_RXL_FLITS_DATA                    0x08
+UMASK_RXL_FLITS_ALL_DATA                0x0F
+UMASK_RXL_FLITS_LLCRD                   0x10
+UMASK_RXL_FLITS_NULL                    0x20
+UMASK_RXL_FLITS_LLCTRL                  0x40
+UMASK_RXL_FLITS_IDLE                    0x47
+UMASK_RXL_FLITS_PROTHDR                 0x80
+UMASK_RXL_FLITS_NON_DATA                0xB7
+
+EVENT_RXL_INSERTS                       0x30 SBOX
+UMASK_RXL_INSERTS                       0x00
+
+EVENT_RXL_OCCUPANCY                      0x32 SBOX
+UMASK_RXL_OCCUPANCY_SLOT0                0x01
+UMASK_RXL_OCCUPANCY_SLOT1                0x02
+UMASK_RXL_OCCUPANCY_SLOT2                0x04
+
+EVENT_RXL_SLOT_BYPASS                   0x33 SBOX
+UMASK_RXL_SLOT_BYPASS_S0_RXQ1           0x01
+UMASK_RXL_SLOT_BYPASS_S0_RXQ2           0x02
+UMASK_RXL_SLOT_BYPASS_S1_RXQ0           0x04
+UMASK_RXL_SLOT_BYPASS_S1_RXQ2           0x08
+UMASK_RXL_SLOT_BYPASS_S2_RXQ0           0x10
+UMASK_RXL_SLOT_BYPASS_S2_RXQ1           0x20
+
+EVENT_TXL0P_CLK_ACTIVE                  0x2A SBOX
+UMASK_TXL0P_CLK_ACTIVE_CFG_CTL          0x01
+UMASK_TXL0P_CLK_ACTIVE_RXQ              0x02
+UMASK_TXL0P_CLK_ACTIVE_RXQ_BYPASS       0x04
+UMASK_TXL0P_CLK_ACTIVE_RXQ_CRED         0x08
+UMASK_TXL0P_CLK_ACTIVE_TXQ              0x10
+UMASK_TXL0P_CLK_ACTIVE_RETRY            0x20
+UMASK_TXL0P_CLK_ACTIVE_DFX              0x40
+UMASK_TXL0P_CLK_ACTIVE_SPARE            0x80
+
+EVENT_TXL0P_POWER_CYCLES                0x27 SBOX
+UMASK_TXL0P_POWER_CYCLES                0x00
+
+EVENT_TXL0P_POWER_TRANSITION_COUNT      0x27 SBOX
+DEFAULT_OPTIONS_TXL0P_POWER_TRANSITION_COUNT EVENT_OPTION_EDGE=0x01
+UMASK_TXL0P_POWER_TRANSITION_COUNT      0x00
+
+EVENT_TXL0P_POWER_CYCLES_LL_ENTER       0x28 SBOX
+UMASK_TXL0P_POWER_CYCLES_LL_ENTER       0x00
+
+EVENT_TXL0P_POWER_CYCLES_M3_EXIT        0x29 SBOX
+UMASK_TXL0P_POWER_CYCLES_M3_EXIT        0x00
+
+EVENT_TXL0_POWER_CYCLES                 0x26 SBOX
+UMASK_TXL0_POWER_CYCLES                 0x00
+
+EVENT_TXL_BASIC_HDR_MATCH               0x04 SBOX
+UMASK_TXL_BASIC_HDR_MATCH_REQ           0x08 0x00 0x00
+UMASK_TXL_BASIC_HDR_MATCH_REQ_OPC       0x08 0x00 0x01
+UMASK_TXL_BASIC_HDR_MATCH_SNP           0x09 0x00 0x00
+UMASK_TXL_BASIC_HDR_MATCH_SNP_OPC       0x09 0x00 0x01
+UMASK_TXL_BASIC_HDR_MATCH_RSP_NODATA    0x0A 0x00 0x00
+UMASK_TXL_BASIC_HDR_MATCH_RSP_NODATA_OPC 0x0A 0x00 0x01
+UMASK_TXL_BASIC_HDR_MATCH_RSP_DATA      0x0C 0x00 0x00
+UMASK_TXL_BASIC_HDR_MATCH_RSP_DATA_OPC  0x0C 0x00 0x01
+UMASK_TXL_BASIC_HDR_MATCH_WB            0x0D 0x00 0x00
+UMASK_TXL_BASIC_HDR_MATCH_WB_OPC        0x0D 0x00 0x01
+UMASK_TXL_BASIC_HDR_MATCH_NCB           0x0E 0x00 0x00
+UMASK_TXL_BASIC_HDR_MATCH_NCB_OPC       0x0E 0x00 0x01
+UMASK_TXL_BASIC_HDR_MATCH_NCS           0x0F 0x00 0x00
+UMASK_TXL_BASIC_HDR_MATCH_NCS_OPC       0x0F 0x00 0x01
+
+EVENT_TXL_BYPASSED                      0x41 SBOX
+UMASK_TXL_BYPASSED                      0x00
+
+EVENT_TXL_FLITS                         0x02 SBOX
+UMASK_TXL_FLITS_SLOT0                   0x01
+UMASK_TXL_FLITS_SLOT1                   0x02
+UMASK_TXL_FLITS_SLOT2                   0x04
+UMASK_TXL_FLITS_DATA                    0x08
+UMASK_TXL_FLITS_ALL_DATA                0x0F
+UMASK_TXL_FLITS_LLCRD                   0x10
+UMASK_TXL_FLITS_NULL                    0x20
+UMASK_TXL_FLITS_LLCTRL                  0x40
+UMASK_TXL_FLITS_IDLE                    0x47
+UMASK_TXL_FLITS_PROTHDR                 0x80
+UMASK_TXL_FLITS_NON_DATA                0xB7
+
+EVENT_TXL_INSERTS                       0x40 SBOX
+UMASK_TXL_INSERTS                       0x00
+
+EVENT_TXL_OCCUPANCY                      0x42 SBOX
+UMASK_TXL_OCCUPANCY_SLOT0                0x01
+UMASK_TXL_OCCUPANCY_SLOT1                0x02
+UMASK_TXL_OCCUPANCY_SLOT2                0x04
+
+EVENT_VNA_CREDIT_RETURN_BLOCKED_VN01    0x45 SBOX
+UMASK_VNA_CREDIT_RETURN_BLOCKED_VN01    0x00
+
+EVENT_VNA_CREDIT_RETURN_OCCUPANCY       0x44 SBOX
+UMASK_VNA_CREDIT_RETURN_OCCUPANCY       0x00
+
+EVENT_PBOX_CLOCKTICKS                   0x01 PBOX
+UMASK_PBOX_CLOCKTICKS                   0x00
+
+EVENT_IIO_CREDITS_ACQUIRED              0x33 PBOX
+UMASK_IIO_CREDITS_ACQUIRED_DRS_0        0x01
+UMASK_IIO_CREDITS_ACQUIRED_DRS_1        0x02
+UMASK_IIO_CREDITS_ACQUIRED_NCB_0        0x04
+UMASK_IIO_CREDITS_ACQUIRED_NCB_1        0x08
+UMASK_IIO_CREDITS_ACQUIRED_NCS_0        0x10
+UMASK_IIO_CREDITS_ACQUIRED_NCS_1        0x20
+
+EVENT_IIO_CREDITS_REJECT                0x34 PBOX
+UMASK_IIO_CREDITS_REJECT_DRS            0x08
+UMASK_IIO_CREDITS_REJECT_NCB            0x10
+UMASK_IIO_CREDITS_REJECT_NCS            0x20
+
+EVENT_IIO_CREDITS_USED              0x32 PBOX
+UMASK_IIO_CREDITS_USED_DRS_0        0x01
+UMASK_IIO_CREDITS_USED_DRS_1        0x02
+UMASK_IIO_CREDITS_USED_NCB_0        0x04
+UMASK_IIO_CREDITS_USED_NCB_1        0x08
+UMASK_IIO_CREDITS_USED_NCS_0        0x10
+UMASK_IIO_CREDITS_USED_NCS_1        0x20
+
+EVENT_RXC_CYCLES_NE                 0x10 PBOX
+UMASK_RXC_CYCLES_NE_CBO_IDI         0x01
+UMASK_RXC_CYCLES_NE_CBO_NCB         0x02
+UMASK_RXC_CYCLES_NE_CBO_NCS         0x04
+UMASK_RXC_CYCLES_NE_QPI_INCS        0x10
+UMASK_RXC_CYCLES_NE_IIO_INCB        0x20
+UMASK_RXC_CYCLES_NE_IIO_INCS        0x40
+UMASK_RXC_CYCLES_NE_ALL             0x80
+
+EVENT_RXC_INSERTS                 0x11 PBOX
+UMASK_RXC_INSERTS_CBO_IDI         0x01
+UMASK_RXC_INSERTS_CBO_NCB         0x02
+UMASK_RXC_INSERTS_CBO_NCS         0x04
+UMASK_RXC_INSERTS_QPI_INCS        0x10
+UMASK_RXC_INSERTS_IIO_INCB        0x20
+UMASK_RXC_INSERTS_IIO_INCS        0x40
+UMASK_RXC_INSERTS_ALL             0x80
+
+EVENT_RXC_OCCUPANCY                 0x13 PBOX0C0|PBOX1C0|PBOX2C0|PBOX3C0
+UMASK_RXC_OCCUPANCY_CBO_IDI         0x01
+UMASK_RXC_OCCUPANCY_CBO_NCB         0x02
+UMASK_RXC_OCCUPANCY_CBO_NCS         0x04
+UMASK_RXC_OCCUPANCY_QPI_INCS        0x10
+UMASK_RXC_OCCUPANCY_IIO_INCB        0x20
+UMASK_RXC_OCCUPANCY_IIO_INCS        0x40
+UMASK_RXC_OCCUPANCY_ALL             0x80
+
+EVENT_TXC_CREDITS               0x2D PBOX0C0|PBOX1C0|PBOX2C0|PBOX3C0|PBOX0C1|PBOX1C1|PBOX2C1|PBOX3C1
+UMASK_TXC_CREDITS_PRQ_0         0x01
+UMASK_TXC_CREDITS_PRQ_1         0x02
+UMASK_TXC_CREDITS_ISOCH_0       0x04
+UMASK_TXC_CREDITS_ISOCH_1       0x08
+
+EVENT_TXC_CYCLES_FULL           0x25 PBOX
+UMASK_TXC_CYCLES_FULL_AD_0      0x01
+UMASK_TXC_CYCLES_FULL_AK_0      0x02
+UMASK_TXC_CYCLES_FULL_BL_0      0x04
+UMASK_TXC_CYCLES_FULL_AD_1      0x08
+UMASK_TXC_CYCLES_FULL_AK_1      0x10
+UMASK_TXC_CYCLES_FULL_BL_1      0x20
+
+EVENT_TXC_CYCLES_NE           0x23 PBOX
+UMASK_TXC_CYCLES_NE_AD_0      0x01
+UMASK_TXC_CYCLES_NE_AK_0      0x02
+UMASK_TXC_CYCLES_NE_BL_0      0x04
+UMASK_TXC_CYCLES_NE_AD_1      0x08
+UMASK_TXC_CYCLES_NE_AK_1      0x10
+UMASK_TXC_CYCLES_NE_BL_1      0x20
+
+EVENT_TXC_INSERTS               0x24 PBOX
+UMASK_TXC_INSERTS_AD_0          0x01
+UMASK_TXC_INSERTS_AK_0          0x02
+UMASK_TXC_INSERTS_BL_0          0x04
+UMASK_TXC_INSERTS_AK_CRD_0      0x08
+UMASK_TXC_INSERTS_AD_1          0x10
+UMASK_TXC_INSERTS_AK_1          0x20
+UMASK_TXC_INSERTS_BL_1          0x40
+UMASK_TXC_INSERTS_AK_CRD_1      0x80
+
+EVENT_TXC_OCCUPANCY             0x27 PBOX0C0|PBOX1C0|PBOX2C0|PBOX3C0
+UMASK_TXC_OCCUPANCY_AD_0        0x01
+UMASK_TXC_OCCUPANCY_AK_0        0x02
+UMASK_TXC_OCCUPANCY_BL_0        0x04
+UMASK_TXC_OCCUPANCY_AD_1        0x08
+UMASK_TXC_OCCUPANCY_AK_1        0x10
+UMASK_TXC_OCCUPANCY_BL_1        0x20
+
+EVENT_RBOX_CLOCKTICKS           0x01 RBOX
+UMASK_RBOX_CLOCKTICKS           0x00
+
+EVENT_CHA_AD_CREDITS_EMPTY      0x22 RBOX
+UMASK_CHA_AD_CREDITS_EMPTY_VNA  0x01
+UMASK_CHA_AD_CREDITS_EMPTY_WB   0x02
+UMASK_CHA_AD_CREDITS_EMPTY_REQ  0x04
+UMASK_CHA_AD_CREDITS_EMPTY_SNP  0x08
+
+EVENT_D2C_SENT                  0x2B RBOX
+UMASK_D2C_SENT                  0x00
+
+EVENT_D2U_SENT                  0x2A RBOX
+UMASK_D2U_SENT                  0x00
+
+EVENT_M2_BL_CREDITS_EMPTY                   0x23 RBOX
+UMASK_M2_BL_CREDITS_EMPTY_IIO0_IIO1_NCB     0x01
+UMASK_M2_BL_CREDITS_EMPTY_IIO2_NCB          0x02
+UMASK_M2_BL_CREDITS_EMPTY_IIO3_NCB          0x04
+UMASK_M2_BL_CREDITS_EMPTY_IIO4_NCB          0x08
+UMASK_M2_BL_CREDITS_EMPTY_IIO5_NCB          0x10
+UMASK_M2_BL_CREDITS_EMPTY_NCS               0x20
+UMASK_M2_BL_CREDITS_EMPTY_NCS_SEL           0x40
+
+EVENT_MULTI_SLOT_RCVD               0x3E RBOX
+UMASK_MULTI_SLOT_RCVD_AD_SLOT0      0x01
+UMASK_MULTI_SLOT_RCVD_AD_SLOT1      0x02
+UMASK_MULTI_SLOT_RCVD_AD_SLOT2      0x04
+UMASK_MULTI_SLOT_RCVD_BL_SLOT0      0x10
+UMASK_MULTI_SLOT_RCVD_AK_SLOT0      0x20
+UMASK_MULTI_SLOT_RCVD_AK_SLOT2      0x40
+
+EVENT_RXC_ARB_LOST_VN0              0x4B RBOX
+UMASK_RXC_ARB_LOST_VN0_AD_REQ       0x01
+UMASK_RXC_ARB_LOST_VN0_AD_SNP       0x02
+UMASK_RXC_ARB_LOST_VN0_AD_RSP       0x04
+UMASK_RXC_ARB_LOST_VN0_BL_RSP       0x08
+UMASK_RXC_ARB_LOST_VN0_BL_WB        0x10
+UMASK_RXC_ARB_LOST_VN0_BL_NCB       0x20
+UMASK_RXC_ARB_LOST_VN0_BL_NCS       0x40
+
+EVENT_RXC_ARB_LOST_VN1              0x4C RBOX
+UMASK_RXC_ARB_LOST_VN1_AD_REQ       0x01
+UMASK_RXC_ARB_LOST_VN1_AD_SNP       0x02
+UMASK_RXC_ARB_LOST_VN1_AD_RSP       0x04
+UMASK_RXC_ARB_LOST_VN1_BL_RSP       0x08
+UMASK_RXC_ARB_LOST_VN1_BL_WB        0x10
+UMASK_RXC_ARB_LOST_VN1_BL_NCB       0x20
+UMASK_RXC_ARB_LOST_VN1_BL_NCS       0x40
+
+EVENT_RXC_ARB_MISC                   0x4D RBOX
+UMASK_RXC_ARB_MISC_PAR_BIAS_VN0      0x01
+UMASK_RXC_ARB_MISC_PAR_BIAS_VN1      0x02
+UMASK_RXC_ARB_MISC_NO_PROG_AD_VN0    0x04
+UMASK_RXC_ARB_MISC_NO_PROG_AD_VN1    0x08
+UMASK_RXC_ARB_MISC_NO_PROG_BL_VN0    0x10
+UMASK_RXC_ARB_MISC_NO_PROG_BL_VN1    0x20
+UMASK_RXC_ARB_MISC_ADBL_PARALLEL_WIN 0x40
+
+EVENT_RXC_ARB_NOAD_REQ_VN0              0x49 RBOX
+UMASK_RXC_ARB_NOAD_REQ_VN0_AD_REQ       0x01
+UMASK_RXC_ARB_NOAD_REQ_VN0_AD_SNP       0x02
+UMASK_RXC_ARB_NOAD_REQ_VN0_AD_RSP       0x04
+UMASK_RXC_ARB_NOAD_REQ_VN0_BL_RSP       0x08
+UMASK_RXC_ARB_NOAD_REQ_VN0_BL_WB        0x10
+UMASK_RXC_ARB_NOAD_REQ_VN0_BL_NCB       0x20
+UMASK_RXC_ARB_NOAD_REQ_VN0_BL_NCS       0x40
+
+EVENT_RXC_ARB_NOAD_REQ_VN1              0x4A RBOX
+UMASK_RXC_ARB_NOAD_REQ_VN1_AD_REQ       0x01
+UMASK_RXC_ARB_NOAD_REQ_VN1_AD_SNP       0x02
+UMASK_RXC_ARB_NOAD_REQ_VN1_AD_RSP       0x04
+UMASK_RXC_ARB_NOAD_REQ_VN1_BL_RSP       0x08
+UMASK_RXC_ARB_NOAD_REQ_VN1_BL_WB        0x10
+UMASK_RXC_ARB_NOAD_REQ_VN1_BL_NCB       0x20
+UMASK_RXC_ARB_NOAD_REQ_VN1_BL_NCS       0x40
+
+EVENT_RXC_ARB_NOCRED_VN0              0x47 RBOX
+UMASK_RXC_ARB_NOCRED_VN0_AD_REQ       0x01
+UMASK_RXC_ARB_NOCRED_VN0_AD_SNP       0x02
+UMASK_RXC_ARB_NOCRED_VN0_AD_RSP       0x04
+UMASK_RXC_ARB_NOCRED_VN0_BL_RSP       0x08
+UMASK_RXC_ARB_NOCRED_VN0_BL_WB        0x10
+UMASK_RXC_ARB_NOCRED_VN0_BL_NCB       0x20
+UMASK_RXC_ARB_NOCRED_VN0_BL_NCS       0x40
+
+EVENT_RXC_ARB_NOCRED_VN1              0x48 RBOX
+UMASK_RXC_ARB_NOCRED_VN1_AD_REQ       0x01
+UMASK_RXC_ARB_NOCRED_VN1_AD_SNP       0x02
+UMASK_RXC_ARB_NOCRED_VN1_AD_RSP       0x04
+UMASK_RXC_ARB_NOCRED_VN1_BL_RSP       0x08
+UMASK_RXC_ARB_NOCRED_VN1_BL_WB        0x10
+UMASK_RXC_ARB_NOCRED_VN1_BL_NCB       0x20
+UMASK_RXC_ARB_NOCRED_VN1_BL_NCS       0x40
+
+EVENT_RXC_BYPASSED                  0x40 RBOX
+UMASK_RXC_BYPASSED_AD_S0_IDLE       0x01
+UMASK_RXC_BYPASSED_AD_S0_BL_ARB     0x02
+UMASK_RXC_BYPASSED_AD_S1_BL_SLOT    0x04
+UMASK_RXC_BYPASSED_AD_S2_BL_SLOT    0x08
+
+EVENT_RXC_COLLISION_VN0              0x50 RBOX
+UMASK_RXC_COLLISION_VN0_AD_REQ       0x01
+UMASK_RXC_COLLISION_VN0_AD_SNP       0x02
+UMASK_RXC_COLLISION_VN0_AD_RSP       0x04
+UMASK_RXC_COLLISION_VN0_BL_RSP       0x08
+UMASK_RXC_COLLISION_VN0_BL_WB        0x10
+UMASK_RXC_COLLISION_VN0_BL_NCB       0x20
+UMASK_RXC_COLLISION_VN0_BL_NCS       0x40
+
+EVENT_RXC_COLLISION_VN1              0x51 RBOX
+UMASK_RXC_COLLISION_VN1_AD_REQ       0x01
+UMASK_RXC_COLLISION_VN1_AD_SNP       0x02
+UMASK_RXC_COLLISION_VN1_AD_RSP       0x04
+UMASK_RXC_COLLISION_VN1_BL_RSP       0x08
+UMASK_RXC_COLLISION_VN1_BL_WB        0x10
+UMASK_RXC_COLLISION_VN1_BL_NCB       0x20
+UMASK_RXC_COLLISION_VN1_BL_NCS       0x40
+
+EVENT_RXC_CRD_MISC                  0x60 RBOX
+UMASK_RXC_CRD_MISC_ANY_BGF_FIFO     0x01
+UMASK_RXC_CRD_MISC_ANY_BGF_PATH     0x02
+UMASK_RXC_CRD_MISC_NO_D2K_FOR_ARB   0x04
+
+EVENT_RXC_CRD_OCC                   0x61 RBOX
+UMASK_RXC_CRD_OCC_VNA_IN_USE        0x01
+UMASK_RXC_CRD_OCC_FLITS_IN_FIFO     0x02
+UMASK_RXC_CRD_OCC_FLITS_IN_PATH     0x04
+UMASK_RXC_CRD_OCC_TXQ_CRD           0x08
+UMASK_RXC_CRD_OCC_D2K_CRD           0x10
+UMASK_RXC_CRD_OCC_P1P_TOTAL         0x20
+UMASK_RXC_CRD_OCC_P1P_FIFO          0x40
+
+EVENT_RXC_CYCLES_NE_VN0             0x43 RBOX
+UMASK_RXC_CYCLES_NE_VN0_AD_REQ      0x01
+UMASK_RXC_CYCLES_NE_VN0_AD_SNP      0x02
+UMASK_RXC_CYCLES_NE_VN0_AD_RSP      0x04
+UMASK_RXC_CYCLES_NE_VN0_BL_RSP      0x08
+UMASK_RXC_CYCLES_NE_VN0_BL_WB       0x10
+UMASK_RXC_CYCLES_NE_VN0_BL_NCB      0x20
+UMASK_RXC_CYCLES_NE_VN0_BL_NCS      0x40
+
+EVENT_RXC_CYCLES_NE_VN1             0x44 RBOX
+UMASK_RXC_CYCLES_NE_VN1_AD_REQ      0x01
+UMASK_RXC_CYCLES_NE_VN1_AD_SNP      0x02
+UMASK_RXC_CYCLES_NE_VN1_AD_RSP      0x04
+UMASK_RXC_CYCLES_NE_VN1_BL_RSP      0x08
+UMASK_RXC_CYCLES_NE_VN1_BL_WB       0x10
+UMASK_RXC_CYCLES_NE_VN1_BL_NCB      0x20
+UMASK_RXC_CYCLES_NE_VN1_BL_NCS      0x40
+
+EVENT_RXC_FLITS_DATA_NOT_SENT           0x57 RBOX
+UMASK_RXC_FLITS_DATA_NOT_SENT_ALL       0x01
+UMASK_RXC_FLITS_DATA_NOT_SENT_NO_BGF    0x02
+UMASK_RXC_FLITS_DATA_NOT_SENT_NO_TXQ    0x04
+
+EVENT_RXC_FLITS_GEN_BL              0x59 RBOX
+UMASK_RXC_FLITS_GEN_BL_P0_WAIT      0x01
+UMASK_RXC_FLITS_GEN_BL_P1_WAIT      0x02
+UMASK_RXC_FLITS_GEN_BL_P1P_TO_LIMBO 0x04
+UMASK_RXC_FLITS_GEN_BL_P1P_BUSY     0x08
+UMASK_RXC_FLITS_GEN_BL_P1P_AT_LIMIT 0x10
+UMASK_RXC_FLITS_GEN_BL_P1P_HOLD_P0  0x20
+UMASK_RXC_FLITS_GEN_BL_P1P_FIFO_FULL 0x40
+
+EVENT_RXC_FLITS_MISC                0x5A RBOX
+UMASK_RXC_FLITS_MISC                0x00
+
+EVENT_RXC_FLITS_SENT                0x56 RBOX
+UMASK_RXC_FLITS_SENT_1_MSG          0x01
+UMASK_RXC_FLITS_SENT_2_MSGS         0x02
+UMASK_RXC_FLITS_SENT_3_MSGS         0x04
+UMASK_RXC_FLITS_SENT_1_MSG_VNX      0x08
+UMASK_RXC_FLITS_SENT_SLOTS_1        0x10
+UMASK_RXC_FLITS_SENT_SLOTS_2        0x20
+UMASK_RXC_FLITS_SENT_SLOTS_3        0x40
+
+EVENT_RXC_FLITS_SLOT_BL             0x58 RBOX
+UMASK_RXC_FLITS_SLOT_BL_ALL         0x01
+UMASK_RXC_FLITS_SLOT_BL_NEED_DATA   0x02
+UMASK_RXC_FLITS_SLOT_BL_P0_WAIT     0x04
+UMASK_RXC_FLITS_SLOT_BL_P1_WAIT     0x08
+UMASK_RXC_FLITS_SLOT_BL_P1_NOT_REQ  0x10
+UMASK_RXC_FLITS_SLOT_BL_P1_NOT_REQ_BUT_BUBBLE 0x20
+UMASK_RXC_FLITS_SLOT_BL_P1_NOT_REQ_NOT_AVAIL  0x40
+
+EVENT_RXC_FLIT_GEN_HDR1                 0x53 RBOX
+UMASK_RXC_FLIT_GEN_HDR1_ACCUM           0x01
+UMASK_RXC_FLIT_GEN_HDR1_ACCUM_READ      0x02
+UMASK_RXC_FLIT_GEN_HDR1_ACCUM_WASTED    0x04
+UMASK_RXC_FLIT_GEN_HDR1_AHEAD_BLOCKED   0x08
+UMASK_RXC_FLIT_GEN_HDR1_AHEAD_MSG       0x10
+UMASK_RXC_FLIT_GEN_HDR1_PAR             0x20
+UMASK_RXC_FLIT_GEN_HDR1_PAR_MSG         0x40
+UMASK_RXC_FLIT_GEN_HDR1_PAR_FLIT        0x80
+
+EVENT_RXC_FLIT_GEN_HDR2                 0x54 RBOX
+UMASK_RXC_FLIT_GEN_HDR2_RMSTALL         0x01
+UMASK_RXC_FLIT_GEN_HDR2_RMSTALL_NOMSG   0x02
+
+EVENT_RXC_FLIT_NOT_SENT                 0x55 RBOX
+UMASK_RXC_FLIT_NOT_SENT_ALL             0x01
+UMASK_RXC_FLIT_NOT_SENT_NO_BGF_CRD      0x02
+UMASK_RXC_FLIT_NOT_SENT_NO_TXQ_CRD      0x04
+UMASK_RXC_FLIT_NOT_SENT_NO_BGF_NO_MSG   0x08
+UMASK_RXC_FLIT_NOT_SENT_NO_TXQ_NO_MSG   0x10
+UMASK_RXC_FLIT_NOT_SENT_ONE_TAKEN       0x20
+UMASK_RXC_FLIT_NOT_SENT_TWO_TAKEN       0x40
+UMASK_RXC_FLIT_NOT_SENT_THREE_TAKEN     0x80
+
+EVENT_RXC_HELD                          0x52 RBOX
+UMASK_RXC_HELD_VN0                      0x01
+UMASK_RXC_HELD_VN1                      0x02
+UMASK_RXC_HELD_PARALLEL_ATTEMPT         0x04
+UMASK_RXC_HELD_PARALLEL_SUCCESS         0x08
+UMASK_RXC_HELD_PARALLEL_AD_LOST         0x10
+UMASK_RXC_HELD_PARALLEL_BL_LOST         0x20
+UMASK_RXC_HELD_CANT_SLOT_AD             0x40
+UMASK_RXC_HELD_CANT_SLOT_BL             0x80
+
+EVENT_RXC_INSERTS_VN0              0x41 RBOX
+UMASK_RXC_INSERTS_VN0_AD_REQ       0x01
+UMASK_RXC_INSERTS_VN0_AD_SNP       0x02
+UMASK_RXC_INSERTS_VN0_AD_RSP       0x04
+UMASK_RXC_INSERTS_VN0_BL_RSP       0x08
+UMASK_RXC_INSERTS_VN0_BL_WB        0x10
+UMASK_RXC_INSERTS_VN0_BL_NCB       0x20
+UMASK_RXC_INSERTS_VN0_BL_NCS       0x40
+
+EVENT_RXC_INSERTS_VN1              0x42 RBOX
+UMASK_RXC_INSERTS_VN1_AD_REQ       0x01
+UMASK_RXC_INSERTS_VN1_AD_SNP       0x02
+UMASK_RXC_INSERTS_VN1_AD_RSP       0x04
+UMASK_RXC_INSERTS_VN1_BL_RSP       0x08
+UMASK_RXC_INSERTS_VN1_BL_WB        0x10
+UMASK_RXC_INSERTS_VN1_BL_NCB       0x20
+UMASK_RXC_INSERTS_VN1_BL_NCS       0x40
+
+EVENT_RXC_OCCUPANCY_VN0              0x45 RBOX
+UMASK_RXC_OCCUPANCY_VN0_AD_REQ       0x01
+UMASK_RXC_OCCUPANCY_VN0_AD_SNP       0x02
+UMASK_RXC_OCCUPANCY_VN0_AD_RSP       0x04
+UMASK_RXC_OCCUPANCY_VN0_BL_RSP       0x08
+UMASK_RXC_OCCUPANCY_VN0_BL_WB        0x10
+UMASK_RXC_OCCUPANCY_VN0_BL_NCB       0x20
+UMASK_RXC_OCCUPANCY_VN0_BL_NCS       0x40
+
+EVENT_RXC_OCCUPANCY_VN1              0x46 RBOX
+UMASK_RXC_OCCUPANCY_VN1_AD_REQ       0x01
+UMASK_RXC_OCCUPANCY_VN1_AD_SNP       0x02
+UMASK_RXC_OCCUPANCY_VN1_AD_RSP       0x04
+UMASK_RXC_OCCUPANCY_VN1_BL_RSP       0x08
+UMASK_RXC_OCCUPANCY_VN1_BL_WB        0x10
+UMASK_RXC_OCCUPANCY_VN1_BL_NCB       0x20
+UMASK_RXC_OCCUPANCY_VN1_BL_NCS       0x40
+
+EVENT_RXC_PACKING_MISS_VN0              0x4E RBOX
+UMASK_RXC_PACKING_MISS_VN0_AD_REQ       0x01
+UMASK_RXC_PACKING_MISS_VN0_AD_SNP       0x02
+UMASK_RXC_PACKING_MISS_VN0_AD_RSP       0x04
+UMASK_RXC_PACKING_MISS_VN0_BL_RSP       0x08
+UMASK_RXC_PACKING_MISS_VN0_BL_WB        0x10
+UMASK_RXC_PACKING_MISS_VN0_BL_NCB       0x20
+UMASK_RXC_PACKING_MISS_VN0_BL_NCS       0x40
+
+EVENT_RXC_PACKING_MISS_VN1              0x4F RBOX
+UMASK_RXC_PACKING_MISS_VN1_AD_REQ       0x01
+UMASK_RXC_PACKING_MISS_VN1_AD_SNP       0x02
+UMASK_RXC_PACKING_MISS_VN1_AD_RSP       0x04
+UMASK_RXC_PACKING_MISS_VN1_BL_RSP       0x08
+UMASK_RXC_PACKING_MISS_VN1_BL_WB        0x10
+UMASK_RXC_PACKING_MISS_VN1_BL_NCB       0x20
+UMASK_RXC_PACKING_MISS_VN1_BL_NCS       0x40
+
+EVENT_RXC_SMI3_PFTCH                    0x62 RBOX
+UMASK_RXC_SMI3_PFTCH_ARRIVED            0x01
+UMASK_RXC_SMI3_PFTCH_ARB_LOST           0x02
+UMASK_RXC_SMI3_PFTCH_SLOTTED            0x04
+UMASK_RXC_SMI3_PFTCH_DROP_OLD           0x08
+UMASK_RXC_SMI3_PFTCH_DROP_WRAP          0x10
+
+EVENT_RXC_VNA_CRD                       0x5B RBOX
+UMASK_RXC_VNA_CRD_USED                  0x01
+UMASK_RXC_VNA_CRD_CORRECTED             0x02
+UMASK_RXC_VNA_CRD_LT1                   0x04
+UMASK_RXC_VNA_CRD_LT4                   0x08
+UMASK_RXC_VNA_CRD_LT5                   0x10
+UMASK_RXC_VNA_CRD_ANY_IN_USE            0x20
+
+EVENT_TXC_AD_ARB_FAIL                   0x30 RBOX
+UMASK_TXC_AD_ARB_FAIL_VN0_REQ           0x01
+UMASK_TXC_AD_ARB_FAIL_VN0_SNP           0x02
+UMASK_TXC_AD_ARB_FAIL_VN0_RSP           0x04
+UMASK_TXC_AD_ARB_FAIL_VN0_WB            0x08
+UMASK_TXC_AD_ARB_FAIL_VN1_REQ           0x10
+UMASK_TXC_AD_ARB_FAIL_VN1_SNP           0x20
+UMASK_TXC_AD_ARB_FAIL_VN1_RSP           0x40
+UMASK_TXC_AD_ARB_FAIL_VN1_WB            0x80
+
+EVENT_TXC_AD_FLQ_BYPASS                 0x2C RBOX
+UMASK_TXC_AD_FLQ_BYPASS_AD_SLOT0        0x01
+UMASK_TXC_AD_FLQ_BYPASS_AD_SLOT1        0x02
+UMASK_TXC_AD_FLQ_BYPASS_AD_SLOT2        0x04
+UMASK_TXC_AD_FLQ_BYPASS_BL_EARLY_RSP    0x08
+
+EVENT_TXC_AD_FLQ_CYCLES_NE                   0x27 RBOX
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN0_REQ           0x01
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN0_SNP           0x02
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN0_RSP           0x04
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN0_WB            0x08
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN1_REQ           0x10
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN1_SNP           0x20
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN1_RSP           0x40
+UMASK_TXC_AD_FLQ_CYCLES_NE_VN1_WB            0x80
+
+EVENT_TXC_AD_FLQ_INSERTS                   0x2D RBOX
+UMASK_TXC_AD_FLQ_INSERTS_VN0_REQ           0x01
+UMASK_TXC_AD_FLQ_INSERTS_VN0_SNP           0x02
+UMASK_TXC_AD_FLQ_INSERTS_VN0_RSP           0x04
+UMASK_TXC_AD_FLQ_INSERTS_VN0_WB            0x08
+UMASK_TXC_AD_FLQ_INSERTS_VN1_REQ           0x10
+UMASK_TXC_AD_FLQ_INSERTS_VN1_SNP           0x20
+UMASK_TXC_AD_FLQ_INSERTS_VN1_RSP           0x40
+UMASK_TXC_AD_FLQ_INSERTS_VN1_WB            0x80
+
+EVENT_TXC_AD_FLQ_OCCUPANCY                   0x1C RBOX0C0|RBOX1C0|RBOX2C0|RBOX3C0
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN0_REQ           0x01
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN0_SNP           0x02
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN0_RSP           0x04
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN0_WB            0x08
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN1_REQ           0x10
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN1_SNP           0x20
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN1_RSP           0x40
+UMASK_TXC_AD_FLQ_OCCUPANCY_VN1_WB            0x80
+
+EVENT_TXC_AD_SNPF_GRP1_VN1                  0x3C RBOX0C0|RBOX1C0|RBOX2C0|RBOX3C0
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN0_PEER_UPI0    0x01
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN0_PEER_UPI1    0x02
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN0_CHA          0x04
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN1_PEER_UPI0    0x08
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN1_PEER_UPI1    0x10
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN1_CHA          0x20
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN0_NON_IDLE     0x40
+UMASK_TXC_AD_SNPF_GRP1_VN1_VN1_NON_IDLE     0x80
+
+EVENT_TXC_AD_SNPF_GRP2_VN1                  0x3D RBOX
+UMASK_TXC_AD_SNPF_GRP2_VN1_VN0_SNPFP_NONSNP 0x01
+UMASK_TXC_AD_SNPF_GRP2_VN1_VN1_SNPFP_NONSNP 0x02
+UMASK_TXC_AD_SNPF_GRP2_VN1_VN0_SNPFP_VN2SNP 0x04
+UMASK_TXC_AD_SNPF_GRP2_VN1_VN1_SNPFP_VN2SNP 0x08
+
+EVENT_TXC_AD_SPEC_ARB_CRD_AVAIL                   0x34 RBOX
+UMASK_TXC_AD_SPEC_ARB_CRD_AVAIL_VN0_REQ           0x01
+UMASK_TXC_AD_SPEC_ARB_CRD_AVAIL_VN0_SNP           0x02
+UMASK_TXC_AD_SPEC_ARB_CRD_AVAIL_VN0_WB            0x08
+UMASK_TXC_AD_SPEC_ARB_CRD_AVAIL_VN1_REQ           0x10
+UMASK_TXC_AD_SPEC_ARB_CRD_AVAIL_VN1_SNP           0x20
+UMASK_TXC_AD_SPEC_ARB_CRD_AVAIL_VN1_WB            0x80
+
+EVENT_TXC_AD_SPEC_ARB_NEW_MSG                   0x33 RBOX
+UMASK_TXC_AD_SPEC_ARB_NEW_MSG_VN0_REQ           0x01
+UMASK_TXC_AD_SPEC_ARB_NEW_MSG_VN0_SNP           0x02
+UMASK_TXC_AD_SPEC_ARB_NEW_MSG_VN0_WB            0x08
+UMASK_TXC_AD_SPEC_ARB_NEW_MSG_VN1_REQ           0x10
+UMASK_TXC_AD_SPEC_ARB_NEW_MSG_VN1_SNP           0x20
+UMASK_TXC_AD_SPEC_ARB_NEW_MSG_VN1_WB            0x80
+
+EVENT_TXC_AD_SPEC_ARB_NO_OTHER_PEND                   0x32 RBOX
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN0_REQ           0x01
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN0_SNP           0x02
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN0_RSP           0x04
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN0_WB            0x08
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN1_REQ           0x10
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN1_SNP           0x20
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN1_RSP           0x40
+UMASK_TXC_AD_SPEC_ARB_NO_OTHER_PEND_VN1_WB            0x80
+
+EVENT_TXC_AK_FLQ_INSERTS            0x2F RBOX
+UMASK_TXC_AK_FLQ_INSERTS            0x00
+
+EVENT_TXC_AK_FLQ_OCCUPANCY          0x1E RBOX0C0|RBOX1C0|RBOX2C0|RBOX3C0
+UMASK_TXC_AK_FLQ_OCCUPANCY          0x00
+
+EVENT_TXC_BL_ARB_FAIL                   0x35 RBOX
+UMASK_TXC_BL_ARB_FAIL_VN0_RSP           0x01
+UMASK_TXC_BL_ARB_FAIL_VN0_WB            0x02
+UMASK_TXC_BL_ARB_FAIL_VN0_NCB           0x04
+UMASK_TXC_BL_ARB_FAIL_VN0_NCS           0x08
+UMASK_TXC_BL_ARB_FAIL_VN1_RSP           0x10
+UMASK_TXC_BL_ARB_FAIL_VN1_WB            0x20
+UMASK_TXC_BL_ARB_FAIL_VN1_NCB           0x40
+UMASK_TXC_BL_ARB_FAIL_VN1_NCS           0x80
+
+EVENT_TXC_BL_FLQ_CYCLES_NE                   0x28 RBOX
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN0_REQ           0x01
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN0_SNP           0x02
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN0_RSP           0x04
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN0_WB            0x08
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN1_REQ           0x10
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN1_SNP           0x20
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN1_RSP           0x40
+UMASK_TXC_BL_FLQ_CYCLES_NE_VN1_WB            0x80
+
+EVENT_TXC_BL_FLQ_INSERTS                   0x2E RBOX
+UMASK_TXC_BL_FLQ_INSERTS_VN0_NCB           0x01
+UMASK_TXC_BL_FLQ_INSERTS_VN0_NCS           0x02
+UMASK_TXC_BL_FLQ_INSERTS_VN0_WB            0x04
+UMASK_TXC_BL_FLQ_INSERTS_VN0_RSP           0x08
+UMASK_TXC_BL_FLQ_INSERTS_VN1_NCB           0x10
+UMASK_TXC_BL_FLQ_INSERTS_VN1_NCS           0x20
+UMASK_TXC_BL_FLQ_INSERTS_VN1_WB            0x40
+UMASK_TXC_BL_FLQ_INSERTS_VN1_RSP           0x80
+
+EVENT_TXC_BL_FLQ_OCCUPANCY                   0x1D RBOX0C0|RBOX1C0|RBOX2C0|RBOX3C0
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN0_RSP           0x01
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN0_WB            0x02
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN0_NCB           0x04
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN0_NCS           0x08
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN1_RSP           0x10
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN1_WB            0x20
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN1_NCB           0x40
+UMASK_TXC_BL_FLQ_OCCUPANCY_VN1_NCS           0x80
+
+EVENT_TXC_BL_SPEC_ARB_NEW_MSG               0x38 RBOX
+UMASK_TXC_BL_SPEC_ARB_NEW_MSG_VN0_WB        0x01
+UMASK_TXC_BL_SPEC_ARB_NEW_MSG_VN0_NCB       0x02
+UMASK_TXC_BL_SPEC_ARB_NEW_MSG_VN0_NCS       0x08
+UMASK_TXC_BL_SPEC_ARB_NEW_MSG_VN1_WB        0x10
+UMASK_TXC_BL_SPEC_ARB_NEW_MSG_VN1_NCB       0x20
+UMASK_TXC_BL_SPEC_ARB_NEW_MSG_VN1_NCS       0x80
+
+EVENT_TXC_BL_SPEC_ARB_NO_OTHER_PEND         0x37 RBOX
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN0_RSP 0x01
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN0_WB  0x02
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN0_NCB 0x04
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN0_NCS 0x08
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN1_RSP 0x10
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN1_WB  0x20
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN1_NCB 0x40
+UMASK_TXC_BL_SPEC_ARB_NO_OTHER_PEND_VN1_NCS 0x80
+
+EVENT_UPI_PEER_AD_CREDITS_EMPTY             0x20 RBOX
+UMASK_UPI_PEER_AD_CREDITS_EMPTY_VNA         0x01
+UMASK_UPI_PEER_AD_CREDITS_EMPTY_VN0_REQ     0x02
+UMASK_UPI_PEER_AD_CREDITS_EMPTY_VN0_SNP     0x04
+UMASK_UPI_PEER_AD_CREDITS_EMPTY_VN0_RSP     0x08
+UMASK_UPI_PEER_AD_CREDITS_EMPTY_VN1_REQ     0x10
+UMASK_UPI_PEER_AD_CREDITS_EMPTY_VN1_SNP     0x20
+UMASK_UPI_PEER_AD_CREDITS_EMPTY_VN1_RSP     0x40
+
+EVENT_UPI_PEER_BL_CREDITS_EMPTY             0x21 RBOX
+UMASK_UPI_PEER_BL_CREDITS_EMPTY_VNA         0x01
+UMASK_UPI_PEER_BL_CREDITS_EMPTY_VN0_RSP     0x02
+UMASK_UPI_PEER_BL_CREDITS_EMPTY_VN0_NCS_NCB 0x04
+UMASK_UPI_PEER_BL_CREDITS_EMPTY_VN0_WB      0x08
+UMASK_UPI_PEER_BL_CREDITS_EMPTY_VN1_RSP     0x10
+UMASK_UPI_PEER_BL_CREDITS_EMPTY_VN1_NCS_NCB 0x20
+UMASK_UPI_PEER_BL_CREDITS_EMPTY_VN1_WB      0x40
+
+EVENT_UPI_PREFETCH_SPAWN                0x29 RBOX
+UMASK_UPI_PREFETCH_SPAWN                0x00
+
+EVENT_VN0_CREDITS_USED                  0x5C RBOX
+UMASK_VN0_CREDITS_USED_REQ              0x01
+UMASK_VN0_CREDITS_USED_SNP              0x02
+UMASK_VN0_CREDITS_USED_RSP              0x04
+UMASK_VN0_CREDITS_USED_WB               0x08
+UMASK_VN0_CREDITS_USED_NCB              0x10
+UMASK_VN0_CREDITS_USED_NCS              0x20
+
+EVENT_VN1_CREDITS_USED                  0x5D RBOX
+UMASK_VN1_CREDITS_USED_REQ              0x01
+UMASK_VN1_CREDITS_USED_SNP              0x02
+UMASK_VN1_CREDITS_USED_RSP              0x04
+UMASK_VN1_CREDITS_USED_WB               0x08
+UMASK_VN1_CREDITS_USED_NCB              0x10
+UMASK_VN1_CREDITS_USED_NCS              0x20
+
+EVENT_VN0_NO_CREDITS                  0x5E RBOX
+UMASK_VN0_NO_CREDITS_REQ              0x01
+UMASK_VN0_NO_CREDITS_SNP              0x02
+UMASK_VN0_NO_CREDITS_RSP              0x04
+UMASK_VN0_NO_CREDITS_WB               0x08
+UMASK_VN0_NO_CREDITS_NCB              0x10
+UMASK_VN0_NO_CREDITS_NCS              0x20
+
+EVENT_VN1_NO_CREDITS                  0x5F RBOX
+UMASK_VN1_NO_CREDITS_REQ              0x01
+UMASK_VN1_NO_CREDITS_SNP              0x02
+UMASK_VN1_NO_CREDITS_RSP              0x04
+UMASK_VN1_NO_CREDITS_WB               0x08
+UMASK_VN1_NO_CREDITS_NCB              0x10
+UMASK_VN1_NO_CREDITS_NCS              0x20
+
+EVENT_IBOX_CLOCKTICKS               0x01 IBOX
+UMASK_IBOX_CLOCKTICKS               0x00
+
+EVENT_COMP_BUF_INSERTS              0xC2 IBOX
+UMASK_COMP_BUF_INSERTS_PORT0        0x04 0x07 0x01
+UMASK_COMP_BUF_INSERTS_PORT1        0x04 0x07 0x02
+UMASK_COMP_BUF_INSERTS_PORT2        0x04 0x07 0x04
+UMASK_COMP_BUF_INSERTS_PORT3        0x04 0x07 0x08
+
+EVENT_COMP_BUF_OCCUPANCY            0xD5 IBOX
+UMASK_COMP_BUF_OCCUPANCY            0x00
+
+EVENT_DATA_REQ_BY_CPU                    0xC0 IBOX
+UMASK_DATA_REQ_BY_CPU_MEM_READ_PART0     0x04 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_MEM_READ_PART1     0x04 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_MEM_READ_PART2     0x04 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_MEM_READ_PART3     0x04 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_MEM_READ_VTD0      0x04 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_MEM_READ_VTD1      0x04 0x03 0x20
+UMASK_DATA_REQ_BY_CPU_MEM_WRITE_PART0    0x01 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_MEM_WRITE_PART1    0x01 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_MEM_WRITE_PART2    0x01 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_MEM_WRITE_PART3    0x01 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_MEM_WRITE_VTD0     0x01 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_MEM_WRITE_VTD1     0x01 0x03 0x20
+UMASK_DATA_REQ_BY_CPU_PEER_READ_PART0    0x08 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_PEER_READ_PART1    0x08 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_PEER_READ_PART2    0x08 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_PEER_READ_PART3    0x08 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_PEER_READ_VTD0     0x08 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_PEER_READ_VTD1     0x08 0x03 0x20
+UMASK_DATA_REQ_BY_CPU_PEER_WRITE_PART0   0x02 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_PEER_WRITE_PART1   0x02 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_PEER_WRITE_PART2   0x02 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_PEER_WRITE_PART3   0x02 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_PEER_WRITE_VTD0    0x02 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_PEER_WRITE_VTD1    0x02 0x03 0x20
+UMASK_DATA_REQ_BY_CPU_CFG_READ_PART0     0x40 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_CFG_READ_PART1     0x40 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_CFG_READ_PART2     0x40 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_CFG_READ_PART3     0x40 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_CFG_READ_VTD0      0x40 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_CFG_READ_VTD1      0x40 0x03 0x20
+UMASK_DATA_REQ_BY_CPU_CFG_READ_PART0     0x40 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_CFG_WRITE_PART1    0x10 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_CFG_WRITE_PART2    0x10 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_CFG_WRITE_PART3    0x10 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_CFG_WRITE_VTD0     0x10 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_CFG_WRITE_VTD1     0x10 0x03 0x20
+UMASK_DATA_REQ_BY_CPU_IO_READ_PART0      0x80 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_IO_READ_PART1      0x80 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_IO_READ_PART2      0x80 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_IO_READ_PART3      0x80 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_IO_READ_VTD0       0x80 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_IO_READ_VTD1       0x80 0x03 0x20
+UMASK_DATA_REQ_BY_CPU_IO_READ_PART0      0x80 0x03 0x01
+UMASK_DATA_REQ_BY_CPU_IO_WRITE_PART1     0x20 0x03 0x02
+UMASK_DATA_REQ_BY_CPU_IO_WRITE_PART2     0x20 0x03 0x04
+UMASK_DATA_REQ_BY_CPU_IO_WRITE_PART3     0x20 0x03 0x08
+UMASK_DATA_REQ_BY_CPU_IO_WRITE_VTD0      0x20 0x03 0x10
+UMASK_DATA_REQ_BY_CPU_IO_WRITE_VTD1      0x20 0x03 0x20
+
+
+EVENT_DATA_REQ_OF_CPU                    0x83 IBOX
+UMASK_DATA_REQ_OF_CPU_MEM_READ_PART0     0x04 0x03 0x01
+UMASK_DATA_REQ_OF_CPU_MEM_READ_PART1     0x04 0x03 0x02
+UMASK_DATA_REQ_OF_CPU_MEM_READ_PART2     0x04 0x03 0x04
+UMASK_DATA_REQ_OF_CPU_MEM_READ_PART3     0x04 0x03 0x08
+UMASK_DATA_REQ_OF_CPU_MEM_READ_VTD0      0x04 0x03 0x10
+UMASK_DATA_REQ_OF_CPU_MEM_READ_VTD1      0x04 0x03 0x20
+UMASK_DATA_REQ_OF_CPU_MEM_WRITE_PART0    0x01 0x03 0x01
+UMASK_DATA_REQ_OF_CPU_MEM_WRITE_PART1    0x01 0x03 0x02
+UMASK_DATA_REQ_OF_CPU_MEM_WRITE_PART2    0x01 0x03 0x04
+UMASK_DATA_REQ_OF_CPU_MEM_WRITE_PART3    0x01 0x03 0x08
+UMASK_DATA_REQ_OF_CPU_MEM_WRITE_VTD0     0x01 0x03 0x10
+UMASK_DATA_REQ_OF_CPU_MEM_WRITE_VTD1     0x01 0x03 0x20
+UMASK_DATA_REQ_OF_CPU_PEER_READ_PART0    0x08 0x03 0x01
+UMASK_DATA_REQ_OF_CPU_PEER_READ_PART1    0x08 0x03 0x02
+UMASK_DATA_REQ_OF_CPU_PEER_READ_PART2    0x08 0x03 0x04
+UMASK_DATA_REQ_OF_CPU_PEER_READ_PART3    0x08 0x03 0x08
+UMASK_DATA_REQ_OF_CPU_PEER_READ_VTD0     0x08 0x03 0x10
+UMASK_DATA_REQ_OF_CPU_PEER_READ_VTD1     0x08 0x03 0x20
+UMASK_DATA_REQ_OF_CPU_PEER_WRITE_PART0   0x02 0x03 0x01
+UMASK_DATA_REQ_OF_CPU_PEER_WRITE_PART1   0x02 0x03 0x02
+UMASK_DATA_REQ_OF_CPU_PEER_WRITE_PART2   0x02 0x03 0x04
+UMASK_DATA_REQ_OF_CPU_PEER_WRITE_PART3   0x02 0x03 0x08
+UMASK_DATA_REQ_OF_CPU_PEER_WRITE_VTD0    0x02 0x03 0x10
+UMASK_DATA_REQ_OF_CPU_PEER_WRITE_VTD1    0x02 0x03 0x20
+UMASK_DATA_REQ_OF_CPU_ATOMIC_PART0       0x10 0x03 0x01
+UMASK_DATA_REQ_OF_CPU_ATOMIC_PART1       0x10 0x03 0x02
+UMASK_DATA_REQ_OF_CPU_ATOMIC_PART2       0x10 0x03 0x04
+UMASK_DATA_REQ_OF_CPU_ATOMIC_PART3       0x10 0x03 0x08
+UMASK_DATA_REQ_OF_CPU_ATOMIC_VTD0        0x10 0x03 0x10
+UMASK_DATA_REQ_OF_CPU_ATOMIC_VTD1        0x10 0x03 0x20
+UMASK_DATA_REQ_OF_CPU_ATOMICCMP_PART0    0x20 0x03 0x01
+UMASK_DATA_REQ_OF_CPU_ATOMICCMP_PART1    0x20 0x03 0x02
+UMASK_DATA_REQ_OF_CPU_ATOMICCMP_PART2    0x20 0x03 0x04
+UMASK_DATA_REQ_OF_CPU_ATOMICCMP_PART3    0x20 0x03 0x08
+UMASK_DATA_REQ_OF_CPU_ATOMICCMP_VTD0     0x20 0x03 0x10
+UMASK_DATA_REQ_OF_CPU_ATOMICCMP_VTD1     0x20 0x03 0x20
+UMASK_DATA_REQ_OF_CPU_MSG_PART0          0x40 0x03 0x01
+UMASK_DATA_REQ_OF_CPU_MSG_PART1          0x40 0x03 0x02
+UMASK_DATA_REQ_OF_CPU_MSG_PART2          0x40 0x03 0x04
+UMASK_DATA_REQ_OF_CPU_MSG_PART3          0x40 0x03 0x08
+UMASK_DATA_REQ_OF_CPU_MSG_VTD0           0x40 0x03 0x10
+UMASK_DATA_REQ_OF_CPU_MSG_VTD1           0x40 0x03 0x20
+
+EVENT_LINK_NUM_CORR_ERR             0x0F IBOX
+UMASK_LINK_NUM_CORR_ERR             0x00
+
+EVENT_LINK_NUM_RETRIES              0x0E IBOX
+UMASK_LINK_NUM_RETRIES              0x00
+
+EVENT_MASK_MATCH                    0x21 IBOX
+UMASK_MASK_MATCH                    0x00
+
+EVENT_MASK_MATCH_AND                0x02 IBOX
+UMASK_MASK_MATCH_AND_BUS0           0x01
+UMASK_MASK_MATCH_AND_BUS1           0x02
+UMASK_MASK_MATCH_AND_BUS0_NOT_BUS1  0x04
+UMASK_MASK_MATCH_AND_BUS0_BUS1      0x08
+UMASK_MASK_MATCH_AND_NOT_BUS0_BUS1  0x10
+UMASK_MASK_MATCH_AND_NOT_BUS0_NOT_BUS1 0x20
+
+EVENT_MASK_MATCH_OR                0x03 IBOX
+UMASK_MASK_MATCH_OR_BUS0           0x01
+UMASK_MASK_MATCH_OR_BUS1           0x02
+UMASK_MASK_MATCH_OR_BUS0_NOT_BUS1  0x04
+UMASK_MASK_MATCH_OR_BUS0_BUS1      0x08
+UMASK_MASK_MATCH_OR_NOT_BUS0_BUS1  0x10
+UMASK_MASK_MATCH_OR_NOT_BUS0_NOT_BUS1 0x20
+
+EVENT_NOTHING                       0x00 IBOX
+UMASK_NOTHING                       0x00
+
+EVENT_SYMBOL_TIMES                  0x82 IBOX
+UMASK_SYMBOL_TIMES                  0x00
+
+
+EVENT_TXN_REQ_BY_CPU                    0xC1 IBOX
+UMASK_TXN_REQ_BY_CPU_MEM_READ_PART0     0x04 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_MEM_READ_PART1     0x04 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_MEM_READ_PART2     0x04 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_MEM_READ_PART3     0x04 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_MEM_READ_VTD0      0x04 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_MEM_READ_VTD1      0x04 0x03 0x20
+UMASK_TXN_REQ_BY_CPU_MEM_WRITE_PART0    0x01 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_MEM_WRITE_PART1    0x01 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_MEM_WRITE_PART2    0x01 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_MEM_WRITE_PART3    0x01 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_MEM_WRITE_VTD0     0x01 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_MEM_WRITE_VTD1     0x01 0x03 0x20
+UMASK_TXN_REQ_BY_CPU_PEER_READ_PART0    0x08 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_PEER_READ_PART1    0x08 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_PEER_READ_PART2    0x08 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_PEER_READ_PART3    0x08 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_PEER_READ_VTD0     0x08 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_PEER_READ_VTD1     0x08 0x03 0x20
+UMASK_TXN_REQ_BY_CPU_PEER_WRITE_PART0   0x02 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_PEER_WRITE_PART1   0x02 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_PEER_WRITE_PART2   0x02 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_PEER_WRITE_PART3   0x02 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_PEER_WRITE_VTD0    0x02 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_PEER_WRITE_VTD1    0x02 0x03 0x20
+UMASK_TXN_REQ_BY_CPU_CFG_READ_PART0     0x40 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_CFG_READ_PART1     0x40 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_CFG_READ_PART2     0x40 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_CFG_READ_PART3     0x40 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_CFG_READ_VTD0      0x40 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_CFG_READ_VTD1      0x40 0x03 0x20
+UMASK_TXN_REQ_BY_CPU_CFG_READ_PART0     0x40 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_CFG_WRITE_PART1    0x10 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_CFG_WRITE_PART2    0x10 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_CFG_WRITE_PART3    0x10 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_CFG_WRITE_VTD0     0x10 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_CFG_WRITE_VTD1     0x10 0x03 0x20
+UMASK_TXN_REQ_BY_CPU_IO_READ_PART0      0x80 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_IO_READ_PART1      0x80 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_IO_READ_PART2      0x80 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_IO_READ_PART3      0x80 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_IO_READ_VTD0       0x80 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_IO_READ_VTD1       0x80 0x03 0x20
+UMASK_TXN_REQ_BY_CPU_IO_READ_PART0      0x80 0x03 0x01
+UMASK_TXN_REQ_BY_CPU_IO_WRITE_PART1     0x20 0x03 0x02
+UMASK_TXN_REQ_BY_CPU_IO_WRITE_PART2     0x20 0x03 0x04
+UMASK_TXN_REQ_BY_CPU_IO_WRITE_PART3     0x20 0x03 0x08
+UMASK_TXN_REQ_BY_CPU_IO_WRITE_VTD0      0x20 0x03 0x10
+UMASK_TXN_REQ_BY_CPU_IO_WRITE_VTD1      0x20 0x03 0x20
+
+EVENT_TXN_REQ_OF_CPU                    0x84 IBOX
+UMASK_TXN_REQ_OF_CPU_MEM_READ_PART0     0x04 0x03 0x01
+UMASK_TXN_REQ_OF_CPU_MEM_READ_PART1     0x04 0x03 0x02
+UMASK_TXN_REQ_OF_CPU_MEM_READ_PART2     0x04 0x03 0x04
+UMASK_TXN_REQ_OF_CPU_MEM_READ_PART3     0x04 0x03 0x08
+UMASK_TXN_REQ_OF_CPU_MEM_READ_VTD0      0x04 0x03 0x10
+UMASK_TXN_REQ_OF_CPU_MEM_READ_VTD1      0x04 0x03 0x20
+UMASK_TXN_REQ_OF_CPU_MEM_WRITE_PART0    0x01 0x03 0x01
+UMASK_TXN_REQ_OF_CPU_MEM_WRITE_PART1    0x01 0x03 0x02
+UMASK_TXN_REQ_OF_CPU_MEM_WRITE_PART2    0x01 0x03 0x04
+UMASK_TXN_REQ_OF_CPU_MEM_WRITE_PART3    0x01 0x03 0x08
+UMASK_TXN_REQ_OF_CPU_MEM_WRITE_VTD0     0x01 0x03 0x10
+UMASK_TXN_REQ_OF_CPU_MEM_WRITE_VTD1     0x01 0x03 0x20
+UMASK_TXN_REQ_OF_CPU_PEER_READ_PART0    0x08 0x03 0x01
+UMASK_TXN_REQ_OF_CPU_PEER_READ_PART1    0x08 0x03 0x02
+UMASK_TXN_REQ_OF_CPU_PEER_READ_PART2    0x08 0x03 0x04
+UMASK_TXN_REQ_OF_CPU_PEER_READ_PART3    0x08 0x03 0x08
+UMASK_TXN_REQ_OF_CPU_PEER_READ_VTD0     0x08 0x03 0x10
+UMASK_TXN_REQ_OF_CPU_PEER_READ_VTD1     0x08 0x03 0x20
+UMASK_TXN_REQ_OF_CPU_PEER_WRITE_PART0   0x02 0x03 0x01
+UMASK_TXN_REQ_OF_CPU_PEER_WRITE_PART1   0x02 0x03 0x02
+UMASK_TXN_REQ_OF_CPU_PEER_WRITE_PART2   0x02 0x03 0x04
+UMASK_TXN_REQ_OF_CPU_PEER_WRITE_PART3   0x02 0x03 0x08
+UMASK_TXN_REQ_OF_CPU_PEER_WRITE_VTD0    0x02 0x03 0x10
+UMASK_TXN_REQ_OF_CPU_PEER_WRITE_VTD1    0x02 0x03 0x20
+UMASK_TXN_REQ_OF_CPU_ATOMIC_PART0       0x10 0x03 0x01
+UMASK_TXN_REQ_OF_CPU_ATOMIC_PART1       0x10 0x03 0x02
+UMASK_TXN_REQ_OF_CPU_ATOMIC_PART2       0x10 0x03 0x04
+UMASK_TXN_REQ_OF_CPU_ATOMIC_PART3       0x10 0x03 0x08
+UMASK_TXN_REQ_OF_CPU_ATOMIC_VTD0        0x10 0x03 0x10
+UMASK_TXN_REQ_OF_CPU_ATOMIC_VTD1        0x10 0x03 0x20
+UMASK_TXN_REQ_OF_CPU_ATOMICCMP_PART0    0x20 0x03 0x01
+UMASK_TXN_REQ_OF_CPU_ATOMICCMP_PART1    0x20 0x03 0x02
+UMASK_TXN_REQ_OF_CPU_ATOMICCMP_PART2    0x20 0x03 0x04
+UMASK_TXN_REQ_OF_CPU_ATOMICCMP_PART3    0x20 0x03 0x08
+UMASK_TXN_REQ_OF_CPU_ATOMICCMP_VTD0     0x20 0x03 0x10
+UMASK_TXN_REQ_OF_CPU_ATOMICCMP_VTD1     0x20 0x03 0x20
+UMASK_TXN_REQ_OF_CPU_MSG_PART0          0x40 0x03 0x01
+UMASK_TXN_REQ_OF_CPU_MSG_PART1          0x40 0x03 0x02
+UMASK_TXN_REQ_OF_CPU_MSG_PART2          0x40 0x03 0x04
+UMASK_TXN_REQ_OF_CPU_MSG_PART3          0x40 0x03 0x08
+UMASK_TXN_REQ_OF_CPU_MSG_VTD0           0x40 0x03 0x10
+UMASK_TXN_REQ_OF_CPU_MSG_VTD1           0x40 0x03 0x20
+
+EVENT_VTD_ACCESS                        0x41 IBOX
+UMASK_VTD_ACCESS_L4_PAGE_HIT            0x01
+UMASK_VTD_ACCESS_CTXT_MISS              0x02
+UMASK_VTD_ACCESS_L1_MISS                0x04
+UMASK_VTD_ACCESS_L2_MISS                0x08
+UMASK_VTD_ACCESS_L3_MISS                0x10
+UMASK_VTD_ACCESS_TLB_MISS               0x20
+UMASK_VTD_ACCESS_TLB_FULL               0x40
+UMASK_VTD_ACCESS_TLB1_MISS              0x80
+
+EVENT_VTD_OCCUPANCY                 0x40 IBOX
+UMASK_VTD_OCCUPANCY                 0x00
+
+EVENT_BANDWIDTH_PORT0_IN      0x00 IBAND0PI0|IBAND1PI0|IBAND2PI0|IBAND3PI0|IBAND4PI0|IBAND5PI0
+UMASK_BANDWIDTH_PORT0_IN      0x00
+
+EVENT_BANDWIDTH_PORT1_IN      0x00 IBAND0PI1|IBAND1PI1|IBAND2PI1|IBAND3PI1|IBAND4PI1|IBAND5PI1
+UMASK_BANDWIDTH_PORT1_IN      0x00
+
+EVENT_BANDWIDTH_PORT2_IN      0x00 IBAND0PI2|IBAND1PI2|IBAND2PI2|IBAND3PI2|IBAND4PI2|IBAND5PI2
+UMASK_BANDWIDTH_PORT2_IN      0x00
+
+EVENT_BANDWIDTH_PORT3_IN      0x00 IBAND0PI3|IBAND1PI3|IBAND2PI3|IBAND3PI3|IBAND4PI3|IBAND5PI3
+UMASK_BANDWIDTH_PORT3_IN      0x00
+
+EVENT_BANDWIDTH_PORT0_OUT      0x00 IBAND0PO0|IBAND1PO0|IBAND2PO0|IBAND3PO0|IBAND4PO0|IBAND5PO0
+UMASK_BANDWIDTH_PORT0_OUT      0x00
+
+EVENT_BANDWIDTH_PORT1_OUT      0x00 IBAND0PO1|IBAND1PO1|IBAND2PO1|IBAND3PO1|IBAND4PO1|IBAND5PO1
+UMASK_BANDWIDTH_PORT1_OUT      0x00
+
+EVENT_BANDWIDTH_PORT2_OUT      0x00 IBAND0PO2|IBAND1PO2|IBAND2PO2|IBAND3PO2|IBAND4PO2|IBAND5PO2
+UMASK_BANDWIDTH_PORT2_OUT      0x00
+
+EVENT_BANDWIDTH_PORT3_OUT      0x00 IBAND0PO3|IBAND1PO3|IBAND2PO3|IBAND3PO3|IBAND4PO3|IBAND5PO3
+UMASK_BANDWIDTH_PORT3_OUT      0x00
+
+EVENT_IUNIT_CLOCKTICKS          0x00 IBOX0CLK|IBOX1CLK|IBOX2CLK|IBOX3CLK|IBOX4CLK|IBOX5CLK
+UMASK_IUNIT_CLOCKTICKS          0x00
+
+EVENT_UTLILIZATION_PORT0_IN      0x00 IUTIL0PI0|IUTIL1PI0|IUTIL2PI0|IUTIL3PI0|IUTIL4PI0|IUTIL5PI0
+UMASK_UTLILIZATION_PORT0_IN      0x00
+
+EVENT_UTLILIZATION_PORT1_IN      0x00 IUTIL0PI1|IUTIL1PI1|IUTIL2PI1|IUTIL3PI1|IUTIL4PI1|IUTIL5PI1
+UMASK_UTLILIZATION_PORT1_IN      0x00
+
+EVENT_UTLILIZATION_PORT2_IN      0x00 IUTIL0PI2|IUTIL1PI2|IUTIL2PI2|IUTIL3PI2|IUTIL4PI2|IUTIL5PI2
+UMASK_UTLILIZATION_PORT2_IN      0x00
+
+EVENT_UTLILIZATION_PORT3_IN      0x00 IUTIL0PI3|IUTIL1PI3|IUTIL2PI3|IUTIL3PI3|IUTIL4PI3|IUTIL5PI3
+UMASK_UTLILIZATION_PORT3_IN      0x00
+
+EVENT_UTLILIZATION_PORT0_OUT      0x00 IUTIL0PO0|IUTIL1PO0|IUTIL2PO0|IUTIL3PO0|IUTIL4PO0|IUTIL5PO0
+UMASK_UTLILIZATION_PORT0_OUT      0x00
+
+EVENT_UTLILIZATION_PORT1_OUT      0x00 IUTIL0PO1|IUTIL1PO1|IUTIL2PO1|IUTIL3PO1|IUTIL4PO1|IUTIL5PO1
+UMASK_UTLILIZATION_PORT1_OUT      0x00
+
+EVENT_UTLILIZATION_PORT2_OUT      0x00 IUTIL0PO2|IUTIL1PO2|IUTIL2PO2|IUTIL3PO2|IUTIL4PO2|IUTIL5PO2
+UMASK_UTLILIZATION_PORT2_OUT      0x00
+
+EVENT_UTLILIZATION_PORT3_OUT      0x00 IUTIL0PO3|IUTIL1PO3|IUTIL2PO3|IUTIL3PO3|IUTIL4PO3|IUTIL5PO3
+UMASK_UTLILIZATION_PORT3_OUT      0x00
+
+EVENT_IRP_CLOCKTICKS            0x01 IRP
+UMASK_IRP_CLOCKTICKS            0x00
+
+EVENT_CACHE_TOTAL_OCCUPANCY         0x0F IRP
+UMASK_CACHE_TOTAL_OCCUPANCY_ANY     0x01
+UMASK_CACHE_TOTAL_OCCUPANCY_IV_Q    0x02
+UMASK_CACHE_TOTAL_OCCUPANCY_MEM     0x04
+
+EVENT_COHERENT_OPS              0x10 IRP
+UMASK_COHERENT_OPS_PCIRDCUR     0x01
+UMASK_COHERENT_OPS_CRD          0x02
+UMASK_COHERENT_OPS_DRD          0x04
+UMASK_COHERENT_OPS_RFO          0x08
+UMASK_COHERENT_OPS_PCITOM       0x10
+UMASK_COHERENT_OPS_PCIDCAHINT   0x20
+UMASK_COHERENT_OPS_WBMTOI       0x40
+UMASK_COHERENT_OPS_CLFLUSH      0x80
+
+EVENT_FAF_FULL                  0x17 IRP
+UMASK_FAF_FULL                  0x00
+
+EVENT_FAF_INSERTS               0x18 IRP
+UMASK_FAF_INSERTS               0x00
+
+EVENT_FAF_OCCUPANCY             0x19 IRP
+UMASK_FAF_OCCUPANCY             0x00
+
+EVENT_FAF_TRANSACTIONS          0x16 IRP
+UMASK_FAF_TRANSACTIONS          0x00
+
+EVENT_IRP_ALL                   0x1E IRP
+UMASK_IRP_ALL_INBOUND_INSERTS   0x01
+UMASK_IRP_ALL_OUTBOUND_INSERTS  0x02
+
+EVENT_MISC0                     0x1C IRP
+UMASK_MISC0_FAST_REQ            0x01
+UMASK_MISC0_FAST_REJ            0x02
+UMASK_MISC0_FAST_2ND_RD_INSERT  0x04
+UMASK_MISC0_FAST_2ND_WR_INSERT  0x08
+UMASK_MISC0_FAST_2ND_ATOMIC_INSERT 0x10
+UMASK_MISC0_FAST_FAST_XFER      0x20
+UMASK_MISC0_FAST_PF_ACK_HINT    0x40
+UMASK_MISC0_FAST_UNKNOWN        0x80
+
+EVENT_MISC1                     0x1D IRP
+UMASK_MISC1_SLOW_I              0x01
+UMASK_MISC1_SLOW_S              0x02
+UMASK_MISC1_SLOW_E              0x04
+UMASK_MISC1_SLOW_M              0x08
+UMASK_MISC1_LOST_FWD            0x10
+UMASK_MISC1_SEC_RCVD_INVLD      0x20
+UMASK_MISC1_SEC_RCVD_VLD        0x40
+
+EVENT_P2P_INSERTS               0x14 IRP
+UMASK_P2P_INSERTS               0x00
+
+EVENT_P2P_OCCUPANCY             0x15 IRP
+UMASK_P2P_OCCUPANCY             0x00
+
+EVENT_P2P_TRANSACTIONS          0x13 IRP
+UMASK_P2P_TRANSACTIONS_RD       0x01
+UMASK_P2P_TRANSACTIONS_WR       0x02
+UMASK_P2P_TRANSACTIONS_MSG      0x04
+UMASK_P2P_TRANSACTIONS_CMPL     0x08
+UMASK_P2P_TRANSACTIONS_REM      0x10
+UMASK_P2P_TRANSACTIONS_REM_AND_TGT_MATCH       0x20
+UMASK_P2P_TRANSACTIONS_LOC      0x40
+UMASK_P2P_TRANSACTIONS_LOC_AND_TGT_MATCH       0x80
+
+EVENT_SNOOP_RESP                0x12 IRP
+UMASK_SNOOP_RESP_MISS_SNPCODE   0x11
+UMASK_SNOOP_RESP_MISS_SNPDATA   0x21
+UMASK_SNOOP_RESP_MISS_SNPINV    0x41
+UMASK_SNOOP_RESP_MISS_SNPALL    0x71
+UMASK_SNOOP_RESP_HIT_I_SNPCODE   0x12
+UMASK_SNOOP_RESP_HIT_I_SNPDATA   0x22
+UMASK_SNOOP_RESP_HIT_I_SNPINV    0x42
+UMASK_SNOOP_RESP_HIT_I_SNPALL    0x72
+UMASK_SNOOP_RESP_HIT_ES_SNPCODE   0x14
+UMASK_SNOOP_RESP_HIT_ES_SNPDATA   0x24
+UMASK_SNOOP_RESP_HIT_ES_SNPINV    0x44
+UMASK_SNOOP_RESP_HIT_ES_SNPALL    0x74
+UMASK_SNOOP_RESP_HIT_M_SNPCODE   0x18
+UMASK_SNOOP_RESP_HIT_M_SNPDATA   0x28
+UMASK_SNOOP_RESP_HIT_M_SNPINV    0x48
+UMASK_SNOOP_RESP_HIT_M_SNPALL    0x78
+UMASK_SNOOP_RESP_HIT_ESM_SNPCODE   0x1C
+UMASK_SNOOP_RESP_HIT_ESM_SNPDATA   0x2C
+UMASK_SNOOP_RESP_HIT_ESM_SNPINV    0x4C
+UMASK_SNOOP_RESP_HIT_ESM_SNPALL    0x7C
+
+EVENT_TRANSACTIONS              0x11 IRP
+UMASK_TRANSACTIONS_READS        0x01
+UMASK_TRANSACTIONS_WRITES       0x02
+UMASK_TRANSACTIONS_RD_PREF      0x04
+UMASK_TRANSACTIONS_WR_PREF      0x08
+UMASK_TRANSACTIONS_ATOMIC       0x10
+UMASK_TRANSACTIONS_OTHER        0x20
+UMASK_TRANSACTIONS_ORDERINGQ    0x40
+
+EVENT_TXC_AK_INSERTS            0x0B IRP
+UMASK_TXC_AK_INSERTS            0x00
+
+EVENT_TXC_BL_DRS_CYCLES_FULL    0x05 IRP
+UMASK_TXC_BL_DRS_CYCLES_FULL    0x00
+
+EVENT_TXC_BL_DRS_INSERTS        0x02 IRP
+UMASK_TXC_BL_DRS_INSERTS        0x00
+
+EVENT_TXC_BL_DRS_OCCUPANCY      0x08 IRP
+UMASK_TXC_BL_DRS_OCCUPANCY      0x00
+
+EVENT_TXC_BL_NCB_CYCLES_FULL    0x06 IRP
+UMASK_TXC_BL_NCB_CYCLES_FULL    0x00
+
+EVENT_TXC_BL_NCB_INSERTS        0x03 IRP
+UMASK_TXC_BL_NCB_INSERTS        0x00
+
+EVENT_TXC_BL_NCB_OCCUPANCY      0x09 IRP
+UMASK_TXC_BL_NCB_OCCUPANCY      0x00
+
+EVENT_TXC_BL_NCS_CYCLES_FULL    0x07 IRP
+UMASK_TXC_BL_NCS_CYCLES_FULL    0x00
+
+EVENT_TXC_BL_NCS_INSERTS        0x04 IRP
+UMASK_TXC_BL_NCS_INSERTS        0x00
+
+EVENT_TXC_BL_NCS_OCCUPANCY      0x0A IRP
+UMASK_TXC_BL_NCS_OCCUPANCY      0x00
+
+EVENT_TXR2_AD_STALL_CREDIT_CYCLES   0x1A IRP
+UMASK_TXR2_AD_STALL_CREDIT_CYCLES   0x00
+
+EVENT_TXR2_BL_STALL_CREDIT_CYCLES   0x1B IRP
+UMASK_TXR2_BL_STALL_CREDIT_CYCLES   0x00
+
+EVENT_TXS_DATA_INSERTS_NCB      0x0D IRP
+UMASK_TXS_DATA_INSERTS_NCB      0x00
+
+EVENT_TXS_DATA_INSERTS_NCS      0x0E IRP
+UMASK_TXS_DATA_INSERTS_NCS      0x00
+
+EVENT_TXS_REQUEST_OCCUPANCY     0x0C IRP
+UMASK_TXS_REQUEST_OCCUPANCY     0x00
+
+
+EVENT_AG0_AD_CRD_ACQUIRED       0x80 CBOX|M2M|RBOX|PBOX
+UMASK_AG0_AD_CRD_ACQUIRED_TGR0  0x01
+UMASK_AG0_AD_CRD_ACQUIRED_TGR1  0x02
+UMASK_AG0_AD_CRD_ACQUIRED_TGR2  0x04
+UMASK_AG0_AD_CRD_ACQUIRED_TGR3  0x08
+UMASK_AG0_AD_CRD_ACQUIRED_TGR4  0x10
+UMASK_AG0_AD_CRD_ACQUIRED_TGR5  0x20
+
+EVENT_AG0_AD_CRD_OCCUPANCY       0x82 CBOX|M2M|RBOX|PBOX
+UMASK_AG0_AD_CRD_OCCUPANCY_TGR0  0x01
+UMASK_AG0_AD_CRD_OCCUPANCY_TGR1  0x02
+UMASK_AG0_AD_CRD_OCCUPANCY_TGR2  0x04
+UMASK_AG0_AD_CRD_OCCUPANCY_TGR3  0x08
+UMASK_AG0_AD_CRD_OCCUPANCY_TGR4  0x10
+UMASK_AG0_AD_CRD_OCCUPANCY_TGR5  0x20
+
+EVENT_AG1_AD_CRD_ACQUIRED       0x84 CBOX|M2M|RBOX|PBOX
+UMASK_AG1_AD_CRD_ACQUIRED_TGR0  0x01
+UMASK_AG1_AD_CRD_ACQUIRED_TGR1  0x02
+UMASK_AG1_AD_CRD_ACQUIRED_TGR2  0x04
+UMASK_AG1_AD_CRD_ACQUIRED_TGR3  0x08
+UMASK_AG1_AD_CRD_ACQUIRED_TGR4  0x10
+UMASK_AG1_AD_CRD_ACQUIRED_TGR5  0x20
+
+EVENT_AG1_AD_CRD_OCCUPANCY       0x86 CBOX|M2M|RBOX|PBOX
+UMASK_AG1_AD_CRD_OCCUPANCY_TGR0  0x01
+UMASK_AG1_AD_CRD_OCCUPANCY_TGR1  0x02
+UMASK_AG1_AD_CRD_OCCUPANCY_TGR2  0x04
+UMASK_AG1_AD_CRD_OCCUPANCY_TGR3  0x08
+UMASK_AG1_AD_CRD_OCCUPANCY_TGR4  0x10
+UMASK_AG1_AD_CRD_OCCUPANCY_TGR5  0x20
+
+EVENT_AG0_BL_CRD_ACQUIRED       0x88 CBOX|M2M|RBOX|PBOX
+UMASK_AG0_BL_CRD_ACQUIRED_TGR0  0x01
+UMASK_AG0_BL_CRD_ACQUIRED_TGR1  0x02
+UMASK_AG0_BL_CRD_ACQUIRED_TGR2  0x04
+UMASK_AG0_BL_CRD_ACQUIRED_TGR3  0x08
+UMASK_AG0_BL_CRD_ACQUIRED_TGR4  0x10
+UMASK_AG0_BL_CRD_ACQUIRED_TGR5  0x20
+
+EVENT_AG0_BL_CRD_OCCUPANCY       0x8A CBOX|M2M|RBOX|PBOX
+UMASK_AG0_BL_CRD_OCCUPANCY_TGR0  0x01
+UMASK_AG0_BL_CRD_OCCUPANCY_TGR1  0x02
+UMASK_AG0_BL_CRD_OCCUPANCY_TGR2  0x04
+UMASK_AG0_BL_CRD_OCCUPANCY_TGR3  0x08
+UMASK_AG0_BL_CRD_OCCUPANCY_TGR4  0x10
+UMASK_AG0_BL_CRD_OCCUPANCY_TGR5  0x20
+
+EVENT_AG1_BL_CRD_ACQUIRED       0x8C CBOX|M2M|RBOX|PBOX
+UMASK_AG1_BL_CRD_ACQUIRED_TGR0  0x01
+UMASK_AG1_BL_CRD_ACQUIRED_TGR1  0x02
+UMASK_AG1_BL_CRD_ACQUIRED_TGR2  0x04
+UMASK_AG1_BL_CRD_ACQUIRED_TGR3  0x08
+UMASK_AG1_BL_CRD_ACQUIRED_TGR4  0x10
+UMASK_AG1_BL_CRD_ACQUIRED_TGR5  0x20
+
+EVENT_AG1_BL_CRD_OCCUPANCY       0x8E CBOX|M2M|RBOX|PBOX
+UMASK_AG1_BL_CRD_OCCUPANCY_TGR0  0x01
+UMASK_AG1_BL_CRD_OCCUPANCY_TGR1  0x02
+UMASK_AG1_BL_CRD_OCCUPANCY_TGR2  0x04
+UMASK_AG1_BL_CRD_OCCUPANCY_TGR3  0x08
+UMASK_AG1_BL_CRD_OCCUPANCY_TGR4  0x10
+UMASK_AG1_BL_CRD_OCCUPANCY_TGR5  0x20
+
+EVENT_CMS_CLOCKTICKS            0xC0 CBOX|M2M|RBOX|PBOX
+UMASK_CMS_CLOCKTICKS            0x00
+
+EVENT_EGRESS_ORDERING               0xAE CBOX|M2M|RBOX|PBOX
+UMASK_EGRESS_ORDERING_IV_SNOOPGO_UP 0x01
+UMASK_EGRESS_ORDERING_IV_SNOOPGO_DN 0x04
+
+EVENT_FAST_ASSERTED             0xA5 CBOX|M2M|RBOX|PBOX
+UMASK_FAST_ASSERTED_VERT        0x01
+UMASK_FAST_ASSERTED_HORZ        0x02
+
+EVENT_HORZ_RING_AD_IN_USE               0xA7 CBOX|M2M|RBOX|PBOX
+UMASK_HORZ_RING_AD_IN_USE_LEFT_EVEN     0x01
+UMASK_HORZ_RING_AD_IN_USE_LEFT_ODD      0x02
+UMASK_HORZ_RING_AD_IN_USE_RIGHT_EVEN    0x04
+UMASK_HORZ_RING_AD_IN_USE_RIGHT_ODD     0x08
+
+EVENT_HORZ_RING_AK_IN_USE               0xA9 CBOX|M2M|RBOX|PBOX
+UMASK_HORZ_RING_AK_IN_USE_LEFT_EVEN     0x01
+UMASK_HORZ_RING_AK_IN_USE_LEFT_ODD      0x02
+UMASK_HORZ_RING_AK_IN_USE_RIGHT_EVEN    0x04
+UMASK_HORZ_RING_AK_IN_USE_RIGHT_ODD     0x08
+
+EVENT_HORZ_RING_BL_IN_USE               0xAB CBOX|M2M|RBOX|PBOX
+UMASK_HORZ_RING_BL_IN_USE_LEFT_EVEN     0x01
+UMASK_HORZ_RING_BL_IN_USE_LEFT_ODD      0x02
+UMASK_HORZ_RING_BL_IN_USE_RIGHT_EVEN    0x04
+UMASK_HORZ_RING_BL_IN_USE_RIGHT_ODD     0x08
+
+EVENT_HORZ_RING_IV_IN_USE               0xAB CBOX|M2M|RBOX|PBOX
+UMASK_HORZ_RING_IV_IN_USE_LEFT          0x01
+UMASK_HORZ_RING_IV_IN_USE_RIGHT         0x04
+
+EVENT_RING_BOUNCES_HORZ                 0xA1 CBOX|M2M|RBOX|PBOX
+UMASK_RING_BOUNCES_HORZ_AD              0x01
+UMASK_RING_BOUNCES_HORZ_AK              0x02
+UMASK_RING_BOUNCES_HORZ_BL              0x04
+UMASK_RING_BOUNCES_HORZ_IV              0x08
+
+EVENT_RING_BOUNCES_VERT                 0xA0 CBOX|M2M|RBOX|PBOX
+UMASK_RING_BOUNCES_VERT_AD              0x01
+UMASK_RING_BOUNCES_VERT_AK              0x02
+UMASK_RING_BOUNCES_VERT_BL              0x04
+UMASK_RING_BOUNCES_VERT_IV              0x08
+
+EVENT_RING_SINK_STARVED_HORZ            0xA3 CBOX|M2M|RBOX|PBOX
+UMASK_RING_SINK_STARVED_HORZ_AD         0x01
+UMASK_RING_SINK_STARVED_HORZ_AK         0x02
+UMASK_RING_SINK_STARVED_HORZ_BL         0x04
+UMASK_RING_SINK_STARVED_HORZ_IV         0x08
+UMASK_RING_SINK_STARVED_HORZ_AK_AG1     0x20
+
+EVENT_RING_SINK_STARVED_VERT            0xA2 CBOX|M2M|RBOX|PBOX
+UMASK_RING_SINK_STARVED_VERT_AD         0x01
+UMASK_RING_SINK_STARVED_VERT_AK         0x02
+UMASK_RING_SINK_STARVED_VERT_BL         0x04
+UMASK_RING_SINK_STARVED_VERT_IV         0x08
+
+EVENT_RING_SRC_THRTL                    0xA4 CBOX|M2M|RBOX|PBOX
+UMASK_RING_SRC_THRTL                    0x00
+
+EVENT_RxR_BUSY_STARVED                  0xB4 CBOX|M2M|RBOX|PBOX
+UMASK_RxR_BUSY_STARVED_AD_BNC           0x01
+UMASK_RxR_BUSY_STARVED_BL_BNC           0x04
+UMASK_RxR_BUSY_STARVED_AD_CRD           0x10
+UMASK_RxR_BUSY_STARVED_BL_CRD           0x40
+UMASK_RxR_BUSY_STARVED_AD               0x11
+UMASK_RxR_BUSY_STARVED_BL               0x44
+
+EVENT_RxR_BYPASS                        0xB2 CBOX|M2M|RBOX|PBOX
+UMASK_RxR_BYPASS_AD_BNC                 0x01
+UMASK_RxR_BYPASS_AK_BNC                 0x02
+UMASK_RxR_BYPASS_BL_BNC                 0x04
+UMASK_RxR_BYPASS_IV_BNC                 0x08
+UMASK_RxR_BYPASS_AD_CRD                 0x10
+UMASK_RxR_BYPASS_BL_CRD                 0x40
+UMASK_RxR_BYPASS_AD                     0x11
+UMASK_RxR_BYPASS_BL                     0x44
+
+EVENT_RxR_CRD_STARVED                   0xB3 CBOX|M2M|RBOX|PBOX
+UMASK_RxR_CRD_STARVED_AD_BNC            0x01
+UMASK_RxR_CRD_STARVED_AK_BNC            0x02
+UMASK_RxR_CRD_STARVED_BL_BNC            0x04
+UMASK_RxR_CRD_STARVED_IV_BNC            0x08
+UMASK_RxR_CRD_STARVED_AD_CRD            0x10
+UMASK_RxR_CRD_STARVED_BL_CRD            0x40
+UMASK_RxR_CRD_STARVED_IFV               0x80
+UMASK_RxR_CRD_STARVED_AD                0x11
+UMASK_RxR_CRD_STARVED_BL                0x44
+
+EVENT_RxR_INSERTS                        0xB1 CBOX|M2M|RBOX|PBOX
+UMASK_RxR_INSERTS_AD_BNC                 0x01
+UMASK_RxR_INSERTS_AK_BNC                 0x02
+UMASK_RxR_INSERTS_BL_BNC                 0x04
+UMASK_RxR_INSERTS_IV_BNC                 0x08
+UMASK_RxR_INSERTS_AD_CRD                 0x10
+UMASK_RxR_INSERTS_BL_CRD                 0x40
+UMASK_RxR_INSERTS_AD                     0x11
+UMASK_RxR_INSERTS_BL                     0x44
+
+EVENT_RxR_OCCUPANCY                        0xB0 CBOX|M2M|RBOX|PBOX
+UMASK_RxR_OCCUPANCY_AD_BNC                 0x01
+UMASK_RxR_OCCUPANCY_AK_BNC                 0x02
+UMASK_RxR_OCCUPANCY_BL_BNC                 0x04
+UMASK_RxR_OCCUPANCY_IV_BNC                 0x08
+UMASK_RxR_OCCUPANCY_AD_CRD                 0x10
+UMASK_RxR_OCCUPANCY_BL_CRD                 0x40
+UMASK_RxR_OCCUPANCY_AD                     0x11
+UMASK_RxR_OCCUPANCY_BL                     0x44
+
+EVENT_STALL_NO_TxR_HORZ_CRD_AD_AG0          0xD0 CBOX|M2M|RBOX|PBOX
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG0_TGR0     0x01
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG0_TGR1     0x02
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG0_TGR2     0x04
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG0_TGR3     0x08
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG0_TGR4     0x10
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG0_TGR5     0x20
+
+EVENT_STALL_NO_TxR_HORZ_CRD_AD_AG1          0xD2 CBOX|M2M|RBOX|PBOX
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG1_TGR0     0x01
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG1_TGR1     0x02
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG1_TGR2     0x04
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG1_TGR3     0x08
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG1_TGR4     0x10
+UMASK_STALL_NO_TxR_HORZ_CRD_AD_AG1_TGR5     0x20
+
+EVENT_STALL_NO_TxR_HORZ_CRD_BL_AG0          0xD4 CBOX|M2M|RBOX|PBOX
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG0_TGR0     0x01
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG0_TGR1     0x02
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG0_TGR2     0x04
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG0_TGR3     0x08
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG0_TGR4     0x10
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG0_TGR5     0x20
+
+EVENT_STALL_NO_TxR_HORZ_CRD_BL_AG1          0xD6 CBOX|M2M|RBOX|PBOX
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG1_TGR0     0x01
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG1_TGR1     0x02
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG1_TGR2     0x04
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG1_TGR3     0x08
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG1_TGR4     0x10
+UMASK_STALL_NO_TxR_HORZ_CRD_BL_AG1_TGR5     0x20
+
+EVENT_TxR_HORZ_ADS_USED                 0x9D CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_ADS_USED_AD_BNC          0x01
+UMASK_TxR_HORZ_ADS_USED_AK_BNC          0x02
+UMASK_TxR_HORZ_ADS_USED_BL_BNC          0x04
+UMASK_TxR_HORZ_ADS_USED_AD_CRD          0x10
+UMASK_TxR_HORZ_ADS_USED_BL_CRD          0x40
+UMASK_TxR_HORZ_ADS_USED_AD              0x11
+UMASK_TxR_HORZ_ADS_USED_BL              0x44
+
+EVENT_TxR_HORZ_BYPASS                   0x9F CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_BYPASS_AD_BNC            0x01
+UMASK_TxR_HORZ_BYPASS_AK_BNC            0x02
+UMASK_TxR_HORZ_BYPASS_BL_BNC            0x04
+UMASK_TxR_HORZ_BYPASS_IV_BNC            0x08
+UMASK_TxR_HORZ_BYPASS_AD_CRD            0x10
+UMASK_TxR_HORZ_BYPASS_BL_CRD            0x40
+UMASK_TxR_HORZ_BYPASS_AD                0x11
+UMASK_TxR_HORZ_BYPASS_BL                0x44
+
+EVENT_TxR_HORZ_CYCLES_FULL                   0x96 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_CYCLES_FULL_AD_BNC            0x01
+UMASK_TxR_HORZ_CYCLES_FULL_AK_BNC            0x02
+UMASK_TxR_HORZ_CYCLES_FULL_BL_BNC            0x04
+UMASK_TxR_HORZ_CYCLES_FULL_IV_BNC            0x08
+UMASK_TxR_HORZ_CYCLES_FULL_AD_CRD            0x10
+UMASK_TxR_HORZ_CYCLES_FULL_BL_CRD            0x40
+UMASK_TxR_HORZ_CYCLES_FULL_AD                0x11
+UMASK_TxR_HORZ_CYCLES_FULL_BL                0x44
+
+EVENT_TxR_HORZ_CYCLES_NE                   0x97 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_CYCLES_NE_AD_BNC            0x01
+UMASK_TxR_HORZ_CYCLES_NE_AK_BNC            0x02
+UMASK_TxR_HORZ_CYCLES_NE_BL_BNC            0x04
+UMASK_TxR_HORZ_CYCLES_NE_IV_BNC            0x08
+UMASK_TxR_HORZ_CYCLES_NE_AD_CRD            0x10
+UMASK_TxR_HORZ_CYCLES_NE_BL_CRD            0x40
+UMASK_TxR_HORZ_CYCLES_NE_AD                0x11
+UMASK_TxR_HORZ_CYCLES_NE_BL                0x44
+
+EVENT_TxR_HORZ_INSERTS                   0x95 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_INSERTS_AD_BNC            0x01
+UMASK_TxR_HORZ_INSERTS_AK_BNC            0x02
+UMASK_TxR_HORZ_INSERTS_BL_BNC            0x04
+UMASK_TxR_HORZ_INSERTS_IV_BNC            0x08
+UMASK_TxR_HORZ_INSERTS_AD_CRD            0x10
+UMASK_TxR_HORZ_INSERTS_BL_CRD            0x40
+UMASK_TxR_HORZ_INSERTS_AD                0x11
+UMASK_TxR_HORZ_INSERTS_BL                0x44
+
+EVENT_TxR_HORZ_NACK                   0x99 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_NACK_AD_BNC            0x01
+UMASK_TxR_HORZ_NACK_AK_BNC            0x02
+UMASK_TxR_HORZ_NACK_BL_BNC            0x04
+UMASK_TxR_HORZ_NACK_IV_BNC            0x08
+UMASK_TxR_HORZ_NACK_AD_CRD            0x10
+UMASK_TxR_HORZ_NACK_BL_CRD            0x40
+UMASK_TxR_HORZ_NACK_AD                0x11
+UMASK_TxR_HORZ_NACK_BL                0x44
+
+EVENT_TxR_HORZ_OCCUPANCY                   0x94 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_OCCUPANCY_AD_BNC            0x01
+UMASK_TxR_HORZ_OCCUPANCY_AK_BNC            0x02
+UMASK_TxR_HORZ_OCCUPANCY_BL_BNC            0x04
+UMASK_TxR_HORZ_OCCUPANCY_IV_BNC            0x08
+UMASK_TxR_HORZ_OCCUPANCY_AD_CRD            0x10
+UMASK_TxR_HORZ_OCCUPANCY_BL_CRD            0x40
+UMASK_TxR_HORZ_OCCUPANCY_AD                0x11
+UMASK_TxR_HORZ_OCCUPANCY_BL                0x44
+
+EVENT_TxR_HORZ_STARVED                   0x9B CBOX|M2M|RBOX|PBOX
+UMASK_TxR_HORZ_STARVED_AD_BNC            0x01
+UMASK_TxR_HORZ_STARVED_AK_BNC            0x02
+UMASK_TxR_HORZ_STARVED_BL_BNC            0x04
+UMASK_TxR_HORZ_STARVED_IV_BNC            0x08
+
+EVENT_TxR_VERT_ADS_USED                 0x9C CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_ADS_USED_AD_AG0          0x01
+UMASK_TxR_VERT_ADS_USED_AK_AG0          0x02
+UMASK_TxR_VERT_ADS_USED_BL_AG0          0x04
+UMASK_TxR_VERT_ADS_USED_AD_AG1          0x10
+UMASK_TxR_VERT_ADS_USED_AK_AG1          0x20
+UMASK_TxR_VERT_ADS_USED_BL_AG1          0x40
+UMASK_TxR_VERT_ADS_USED_AD              0x11
+UMASK_TxR_VERT_ADS_USED_AK              0x22
+UMASK_TxR_VERT_ADS_USED_BL              0x44
+
+EVENT_TxR_VERT_BYPASS                 0x9E CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_BYPASS_AD_AG0          0x01
+UMASK_TxR_VERT_BYPASS_AK_AG0          0x02
+UMASK_TxR_VERT_BYPASS_BL_AG0          0x04
+UMASK_TxR_VERT_BYPASS_IV_AG1          0x08
+UMASK_TxR_VERT_BYPASS_AD_AG1          0x10
+UMASK_TxR_VERT_BYPASS_AK_AG1          0x20
+UMASK_TxR_VERT_BYPASS_BL_AG1          0x40
+UMASK_TxR_VERT_BYPASS_AD              0x11
+UMASK_TxR_VERT_BYPASS_AK              0x22
+UMASK_TxR_VERT_BYPASS_BL              0x44
+
+EVENT_TxR_VERT_CYCLES_FULL                   0x92 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_CYCLES_FULL_AD_AG0            0x01
+UMASK_TxR_VERT_CYCLES_FULL_AK_AG0            0x02
+UMASK_TxR_VERT_CYCLES_FULL_BL_AG0            0x04
+UMASK_TxR_VERT_CYCLES_FULL_IV_AG0            0x08
+UMASK_TxR_VERT_CYCLES_FULL_AD_AG1            0x10
+UMASK_TxR_VERT_CYCLES_FULL_AK_AG1            0x20
+UMASK_TxR_VERT_CYCLES_FULL_BL_AG1            0x40
+UMASK_TxR_VERT_CYCLES_FULL_AD                0x11
+UMASK_TxR_VERT_CYCLES_FULL_AK                0x22
+UMASK_TxR_VERT_CYCLES_FULL_BL                0x44
+
+EVENT_TxR_VERT_CYCLES_NE                   0x93 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_CYCLES_NE_AD_AG0            0x01
+UMASK_TxR_VERT_CYCLES_NE_AK_AG0            0x02
+UMASK_TxR_VERT_CYCLES_NE_BL_AG0            0x04
+UMASK_TxR_VERT_CYCLES_NE_IV_AG0            0x08
+UMASK_TxR_VERT_CYCLES_NE_AD_AG1            0x10
+UMASK_TxR_VERT_CYCLES_NE_AK_AG1            0x20
+UMASK_TxR_VERT_CYCLES_NE_BL_AG1            0x40
+UMASK_TxR_VERT_CYCLES_NE_AD                0x11
+UMASK_TxR_VERT_CYCLES_NE_AK                0x22
+UMASK_TxR_VERT_CYCLES_NE_BL                0x44
+
+EVENT_TxR_VERT_INSERTS                      0x91 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_INSERTS_AD_AG0               0x01
+UMASK_TxR_VERT_INSERTS_AK_AG0               0x02
+UMASK_TxR_VERT_INSERTS_BL_AG0               0x04
+UMASK_TxR_VERT_INSERTS_IV_AG0               0x08
+UMASK_TxR_VERT_INSERTS_AD_AG1               0x10
+UMASK_TxR_VERT_INSERTS_AK_AG1               0x20
+UMASK_TxR_VERT_INSERTS_BL_AG1               0x40
+UMASK_TxR_VERT_INSERTS_AD                   0x11
+UMASK_TxR_VERT_INSERTS_AK                   0x22
+UMASK_TxR_VERT_INSERTS_BL                   0x44
+
+EVENT_TxR_VERT_NACK                      0x98 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_NACK_AD_AG0               0x01
+UMASK_TxR_VERT_NACK_AK_AG0               0x02
+UMASK_TxR_VERT_NACK_BL_AG0               0x04
+UMASK_TxR_VERT_NACK_IV_AG0               0x08
+UMASK_TxR_VERT_NACK_AD_AG1               0x10
+UMASK_TxR_VERT_NACK_AK_AG1               0x20
+UMASK_TxR_VERT_NACK_BL_AG1               0x40
+UMASK_TxR_VERT_NACK_AD                   0x11
+UMASK_TxR_VERT_NACK_AK                   0x22
+UMASK_TxR_VERT_NACK_BL                   0x44
+
+EVENT_TxR_VERT_OCCUPANCY                      0x90 CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_OCCUPANCY_AD_AG0               0x01
+UMASK_TxR_VERT_OCCUPANCY_AK_AG0               0x02
+UMASK_TxR_VERT_OCCUPANCY_BL_AG0               0x04
+UMASK_TxR_VERT_OCCUPANCY_IV_AG0               0x08
+UMASK_TxR_VERT_OCCUPANCY_AD_AG1               0x10
+UMASK_TxR_VERT_OCCUPANCY_AK_AG1               0x20
+UMASK_TxR_VERT_OCCUPANCY_BL_AG1               0x40
+UMASK_TxR_VERT_OCCUPANCY_AD                   0x11
+UMASK_TxR_VERT_OCCUPANCY_AK                   0x22
+UMASK_TxR_VERT_OCCUPANCY_BL                   0x44
+
+EVENT_TxR_VERT_STARVED                      0x9A CBOX|M2M|RBOX|PBOX
+UMASK_TxR_VERT_STARVED_AD_AG0               0x01
+UMASK_TxR_VERT_STARVED_AK_AG0               0x02
+UMASK_TxR_VERT_STARVED_BL_AG0               0x04
+UMASK_TxR_VERT_STARVED_IV_AG0               0x08
+UMASK_TxR_VERT_STARVED_AD_AG1               0x10
+UMASK_TxR_VERT_STARVED_AK_AG1               0x20
+UMASK_TxR_VERT_STARVED_BL_AG1               0x40
+UMASK_TxR_VERT_STARVED_AD                   0x11
+UMASK_TxR_VERT_STARVED_AK                   0x22
+UMASK_TxR_VERT_STARVED_BL                   0x44
+
+EVENT_VERT_RING_AD_IN_USE               0xA6 CBOX|M2M|RBOX|PBOX
+UMASK_VERT_RING_AD_IN_USE_UP_EVEN       0x01
+UMASK_VERT_RING_AD_IN_USE_UP_ODD        0x02
+UMASK_VERT_RING_AD_IN_USE_DN_EVEN       0x04
+UMASK_VERT_RING_AD_IN_USE_DN_ODD        0x08
+
+EVENT_VERT_RING_AK_IN_USE               0xA8 CBOX|M2M|RBOX|PBOX
+UMASK_VERT_RING_AK_IN_USE_UP_EVEN       0x01
+UMASK_VERT_RING_AK_IN_USE_UP_ODD        0x02
+UMASK_VERT_RING_AK_IN_USE_DN_EVEN       0x04
+UMASK_VERT_RING_AK_IN_USE_DN_ODD        0x08
+
+EVENT_VERT_RING_BL_IN_USE               0xAA CBOX|M2M|RBOX|PBOX
+UMASK_VERT_RING_BL_IN_USE_UP_EVEN       0x01
+UMASK_VERT_RING_BL_IN_USE_UP_ODD        0x02
+UMASK_VERT_RING_BL_IN_USE_DN_EVEN       0x04
+UMASK_VERT_RING_BL_IN_USE_DN_ODD        0x08
+
+EVENT_VERT_RING_IV_IN_USE               0xAC CBOX|M2M|RBOX|PBOX
+UMASK_VERT_RING_IV_IN_USE_UP            0x01
+UMASK_VERT_RING_IV_IN_USE_DN            0x04
+
+
+
+
+
diff --git a/src/includes/perfmon_skylake_counters.h b/src/includes/perfmon_skylake_counters.h
index d47c28d..7011c90 100644
--- a/src/includes/perfmon_skylake_counters.h
+++ b/src/includes/perfmon_skylake_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Counter Header File of perfmon module for Intel Skylake.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_skylake_events.txt b/src/includes/perfmon_skylake_events.txt
index b204348..e2c322e 100644
--- a/src/includes/perfmon_skylake_events.txt
+++ b/src/includes/perfmon_skylake_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Skylake
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
@@ -30,19 +30,19 @@
 EVENT_TEMP_CORE          0x00   TMP0
 UMASK_TEMP_CORE          0x00
 
-EVENT_PWR_PKG_ENERGY          0x00   PWR0
+EVENT_PWR_PKG_ENERGY          0x02   PWR0
 UMASK_PWR_PKG_ENERGY          0x00
 
-EVENT_PWR_PP0_ENERGY          0x00   PWR1
+EVENT_PWR_PP0_ENERGY          0x01   PWR1
 UMASK_PWR_PP0_ENERGY          0x00
 
-EVENT_PWR_PP1_ENERGY          0x00   PWR2
+EVENT_PWR_PP1_ENERGY          0x04   PWR2
 UMASK_PWR_PP1_ENERGY          0x00
 
-EVENT_PWR_DRAM_ENERGY          0x00   PWR3
+EVENT_PWR_DRAM_ENERGY          0x03   PWR3
 UMASK_PWR_DRAM_ENERGY          0x00
 
-EVENT_PWR_PLATFORM_ENERGY          0x00   PWR4
+EVENT_PWR_PLATFORM_ENERGY          0x05   PWR4
 UMASK_PWR_PLATFORM_ENERGY          0x00
 
 EVENT_INSTR_RETIRED              0x00   FIXC0
@@ -525,9 +525,17 @@ UMASK_LOCK_CYCLES_CACHE_LOCK_COUNT      0x02
 EVENT_OFFCORE_REQUESTS_BUFFER_SQ_FULL   0xB2 PMC
 UMASK_OFFCORE_REQUESTS_BUFFER_SQ_FULL   0x01
 
-EVENT_L2_TRANS                          0xF0 PMC
-UMASK_L2_TRANS_L2_WB                    0x40
-UMASK_L2_TRANS_ALL_REQUESTS             0x80
+# The only officially released event is L2_TRANS_L2_WB
+# All others count something but no guarantees
+EVENT_L2_TRANS                0xF0  PMC
+UMASK_L2_TRANS_DEMAND_DATA_RD 0x01
+UMASK_L2_TRANS_RFO            0x02
+UMASK_L2_TRANS_CODE_RD        0x04
+UMASK_L2_TRANS_ALL_PF         0x08
+UMASK_L2_TRANS_L1D_WB         0x10
+UMASK_L2_TRANS_L2_FILL        0x20
+UMASK_L2_TRANS_L2_WB          0x40
+UMASK_L2_TRANS_ALL_REQUESTS   0x80
 
 EVENT_LONGEST_LAT_CACHE                 0x2E PMC
 UMASK_LONGEST_LAT_CACHE_MISS            0x41
@@ -675,7 +683,7 @@ UMASK_IDQ_ALL_CYCLES_5_UOPS        0x3C
 DEFAULT_OPTIONS_IDQ_ALL_CYCLES_6_UOPS EVENT_OPTION_THRESHOLD=0x6
 UMASK_IDQ_ALL_CYCLES_6_UOPS        0x3C
 
-EVENT_L2_LINES                          0xF1 PMC
+EVENT_L2_LINES_IN                       0xF1 PMC
 UMASK_L2_LINES_IN_I                     0x01
 UMASK_L2_LINES_IN_S                     0x02
 UMASK_L2_LINES_IN_E                     0x04
diff --git a/src/includes/perfmon_types.h b/src/includes/perfmon_types.h
index f652480..a3aaaca 100644
--- a/src/includes/perfmon_types.h
+++ b/src/includes/perfmon_types.h
@@ -7,14 +7,14 @@
  *                    Configures and reads out performance counters
  *                    on x86 based architectures. Supports multi threading.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -79,6 +79,10 @@ typedef enum {
     EVENT_OPTION_OCCUPANCY_INVERT, /*!< \brief Invert filter for occupancy counting */
     EVENT_OPTION_IN_TRANS, /*!< \brief Count events during transactions */
     EVENT_OPTION_IN_TRANS_ABORT, /*!< \brief Count events that aborted during transactions */
+#ifdef LIKWID_USE_PERFEVENT
+    EVENT_OPTION_PERF_PID, /*!< \brief PID parameter to use in the perf_event_open call */
+    EVENT_OPTION_PERF_FLAGS, /*!< \brief FLAGS parameters to use in the perf_event_open call */
+#endif
     NUM_EVENT_OPTIONS /*!< \brief Amount of defined options */
 } EventOptionType;
 
diff --git a/src/includes/perfmon_westmere.h b/src/includes/perfmon_westmere.h
index 3992a28..b72a826 100644
--- a/src/includes/perfmon_westmere.h
+++ b/src/includes/perfmon_westmere.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Westmere.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_westmereEX.h b/src/includes/perfmon_westmereEX.h
index 3e5dfa6..c397426 100644
--- a/src/includes/perfmon_westmereEX.h
+++ b/src/includes/perfmon_westmereEX.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of perfmon module for Intel Westmere EX.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -44,8 +44,8 @@ static int perfmon_numArchEventsWestmereEX = NUM_ARCH_EVENTS_WESTMEREEX;
 
 int perfmon_init_westmereEX(int cpu_id)
 {
-    lock_acquire((int*) &socket_lock[affinity_core2node_lookup[cpu_id]], cpu_id);
-    lock_acquire((int*) &tile_lock[affinity_thread2tile_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &tile_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
     CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_PEBS_ENABLE, 0x0ULL));
     return 0;
 }
@@ -150,7 +150,7 @@ int wex_bbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     RegisterType type = counter_map[index].type;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -191,7 +191,7 @@ int wex_cbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t flags = 0x0ULL;
     uint64_t reg = counter_map[index].configRegister;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -233,7 +233,7 @@ int wex_wbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t reg = counter_map[index].configRegister;
     int j;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -276,7 +276,7 @@ int wex_sbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int write_mm_cfg = 0;
     RegisterType type = counter_map[index].type;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -346,7 +346,7 @@ int wex_ubox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     int j;
     uint64_t flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -386,7 +386,7 @@ int wex_mbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t subflags2 = 0x0ULL;
     int number;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -638,7 +638,7 @@ int wex_rbox_setup(int cpu_id, RegisterIndex index, PerfmonEvent *event)
     uint64_t subflags = 0x0ULL;
     int number;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -729,7 +729,7 @@ int wex_uncore_freeze(int cpu_id, PerfmonEventSet* eventSet, int flags)
 {
     uint64_t freeze_flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -774,7 +774,7 @@ int wex_uncore_unfreeze(int cpu_id, PerfmonEventSet* eventSet, int flags)
 {
     uint64_t unfreeze_flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] != cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
     {
         return 0;
     }
@@ -827,7 +827,7 @@ int perfmon_setupCounterThread_westmereEX(int thread_id, PerfmonEventSet* eventS
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint32_t uflags[NUM_UNITS] = { [0 ... NUM_UNITS-1] = 0x0U };
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1032,7 +1032,7 @@ int perfmon_startCountersThread_westmereEX(int thread_id, PerfmonEventSet* event
     uint64_t core_ctrl_flags = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1151,7 +1151,7 @@ int perfmon_stopCountersThread_westmereEX(int thread_id, PerfmonEventSet* eventS
     uint64_t counter_result = 0x0ULL;
     int cpu_id = groupSet->threads[thread_id].processorId;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1210,7 +1210,7 @@ int perfmon_readCountersThread_westmereEX(int thread_id, PerfmonEventSet* eventS
     uint64_t counter_result = 0x0ULL;
     uint64_t core_ctrl_flags = 0x0ULL;
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
@@ -1278,11 +1278,11 @@ int perfmon_finalizeCountersThread_westmereEX(int thread_id, PerfmonEventSet* ev
     int cpu_id = groupSet->threads[thread_id].processorId;
     uint64_t ovf_values_core = (1ULL<<63)|(1ULL<<62);
 
-    if (socket_lock[affinity_core2node_lookup[cpu_id]] == cpu_id)
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
     {
         haveLock = 1;
     }
-    if (tile_lock[affinity_thread2tile_lookup[cpu_id]] == cpu_id)
+    if (tile_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
     {
         haveTileLock = 1;
     }
diff --git a/src/includes/perfmon_westmereEX_counters.h b/src/includes/perfmon_westmereEX_counters.h
index 08f9414..0981990 100644
--- a/src/includes/perfmon_westmereEX_counters.h
+++ b/src/includes/perfmon_westmereEX_counters.h
@@ -5,14 +5,14 @@
  *
  *      Description: Counter Header File of perfmon module for Westmere EX.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_westmereEX_events.txt b/src/includes/perfmon_westmereEX_events.txt
index 69747b6..948859f 100644
--- a/src/includes/perfmon_westmereEX_events.txt
+++ b/src/includes/perfmon_westmereEX_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel WestmereEX
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_westmere_events.txt b/src/includes/perfmon_westmere_events.txt
index df8a0d1..67e9f10 100644
--- a/src/includes/perfmon_westmere_events.txt
+++ b/src/includes/perfmon_westmere_events.txt
@@ -4,14 +4,14 @@
 #
 #      Description:  Event list for Intel Westmere
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:   Jan Treibig (jt), jan.treibig at gmail.com
 #                Thomas Roehl (tr), thomas.roehl at googlemail.com
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/perfmon_zen.h b/src/includes/perfmon_zen.h
new file mode 100644
index 0000000..456b88c
--- /dev/null
+++ b/src/includes/perfmon_zen.h
@@ -0,0 +1,509 @@
+/*
+ * =======================================================================================
+ *
+ *      Filename:  perfmon_zen.h
+ *
+ *      Description:  Header file of perfmon module for AMD Family 17 (ZEN)
+ *
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
+ *      Project:  likwid
+ *
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+ *
+ *      This program is free software: you can redistribute it and/or modify it under
+ *      the terms of the GNU General Public License as published by the Free Software
+ *      Foundation, either version 3 of the License, or (at your option) any later
+ *      version.
+ *
+ *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License along with
+ *      this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * =======================================================================================
+ */
+
+#include <perfmon_zen_events.h>
+#include <perfmon_zen_counters.h>
+#include <error.h>
+#include <affinity.h>
+
+static int perfmon_numCountersZen = NUM_COUNTERS_ZEN;
+static int perfmon_numArchEventsZen = NUM_ARCH_EVENTS_ZEN;
+
+int perfmon_init_zen(int cpu_id)
+{
+    lock_acquire((int*) &socket_lock[affinity_thread2socket_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &core_lock[affinity_thread2core_lookup[cpu_id]], cpu_id);
+    lock_acquire((int*) &sharedl3_lock[affinity_thread2sharedl3_lookup[cpu_id]], cpu_id);
+    return 0;
+}
+
+int k17_fixed_setup(int cpu_id, RegisterIndex index, PerfmonEvent* event)
+{
+    uint64_t flags = 0x0ULL;
+    switch (event->eventId)
+    {
+        case 0x1:
+
+            flags |= (1ULL << AMD_K17_INST_RETIRE_ENABLE_BIT);
+            VERBOSEPRINTREG(cpu_id, 0x00, LLU_CAST flags, SETUP_FIXC0);
+            break;
+        case 0x2:
+        case 0x3:
+            break;
+        default:
+            fprintf(stderr, "Unknown fixed event 0x%X\n", event->eventId);
+            break;
+    }
+    return flags;
+}
+
+int k17_pmc_setup(int cpu_id, RegisterIndex index, PerfmonEvent* event)
+{
+    uint64_t flags = 0x0ULL;
+
+    // per default LIKWID counts in user-space
+    flags |= (1ULL<<AMD_K17_PMC_USER_BIT);
+    flags |= ((event->umask & AMD_K17_PMC_UNIT_MASK) << AMD_K17_PMC_UNIT_SHIFT);
+    flags |= ((event->eventId & AMD_K17_PMC_EVSEL_MASK) << AMD_K17_PMC_EVSEL_SHIFT);
+    flags |= (((event->eventId >> 8) & AMD_K17_PMC_EVSEL_MASK2) << AMD_K17_PMC_EVSEL_SHIFT2);
+
+    if (event->numberOfOptions > 0)
+    {
+        for(int j=0;j<event->numberOfOptions;j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_EDGE:
+                    flags |= (1ULL<<AMD_K17_PMC_EDGE_BIT);
+                    break;
+                case EVENT_OPTION_COUNT_KERNEL:
+                    flags |= (1ULL<<AMD_K17_PMC_KERNEL_BIT);
+                    break;
+                case EVENT_OPTION_INVERT:
+                    flags |= (1ULL<<AMD_K17_PMC_INVERT_BIT);
+                    break;
+                case EVENT_OPTION_THRESHOLD:
+                    flags |= (event->options[j].value & AMD_K17_PMC_THRES_MASK) << AMD_K17_PMC_THRES_SHIFT;
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, LLU_CAST flags, SETUP_PMC);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int k17_cache_setup(int cpu_id, RegisterIndex index, PerfmonEvent* event)
+{
+    uint64_t flags = 0x0ULL;
+    int has_tid = 0;
+    int has_match0 = 0;
+
+    if (sharedl3_lock[affinity_thread2sharedl3_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+
+    flags |= ((event->umask & AMD_K17_L3_UNIT_MASK) << AMD_K17_L3_UNIT_SHIFT);
+    flags |= ((event->eventId & AMD_K17_L3_EVSEL_MASK) << AMD_K17_L3_EVSEL_SHIFT);
+    if (event->numberOfOptions > 0)
+    {
+        for(int j=0;j<event->numberOfOptions;j++)
+        {
+            switch (event->options[j].type)
+            {
+                case EVENT_OPTION_TID:
+                    flags |= ((uint64_t)(event->options[j].value & AMD_K17_L3_TID_MASK)) << AMD_K17_L3_TID_SHIFT;
+                    has_tid = 1;
+                    break;
+                case EVENT_OPTION_MATCH0:
+                    flags |= ((uint64_t)(event->options[j].value & AMD_K17_L3_SLICE_MASK)) << AMD_K17_L3_SLICE_SHIFT;
+                    has_match0 = 1;
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    if (!has_tid)
+        flags |= AMD_K17_L3_TID_MASK << AMD_K17_L3_TID_SHIFT;
+    if (!has_match0)
+        flags |= AMD_K17_L3_SLICE_MASK << AMD_K17_L3_SLICE_SHIFT;
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, LLU_CAST flags, SETUP_CBOX);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int k17_uncore_setup(int cpu_id, RegisterIndex index, PerfmonEvent* event)
+{
+    uint64_t flags = 0x0ULL;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] != cpu_id)
+    {
+        return 0;
+    }
+
+    flags |= ((uint64_t)(event->eventId>>8)<<32) + (event->umask<<8) + (event->eventId & ~(0xF00U));
+    if (flags != currentConfig[cpu_id][index])
+    {
+        VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, LLU_CAST flags, SETUP_UNCORE);
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].configRegister, flags));
+        currentConfig[cpu_id][index] = flags;
+    }
+    return 0;
+}
+
+int perfmon_setupCounterThread_zen(int thread_id, PerfmonEventSet* eventSet)
+{
+    int cpu_id = groupSet->threads[thread_id].processorId;
+    uint64_t fixed_flags = 0x0ULL;
+
+    for (int i=0;i < eventSet->numberOfEvents;i++)
+    {
+        RegisterType type = eventSet->events[i].type;
+        if (!TESTTYPE(eventSet, type))
+        {
+            continue;
+        }
+        RegisterIndex index = eventSet->events[i].index;
+        PerfmonEvent *event = &(eventSet->events[i].event);
+        switch (type)
+        {
+            case PMC:
+                k17_pmc_setup(cpu_id, index, event);
+                break;
+            case CBOX0:
+                k17_cache_setup(cpu_id, index, event);
+                break;
+            case POWER:
+                break;
+            case FIXED:
+                fixed_flags |= k17_fixed_setup(cpu_id, index, event);
+                break;
+            case UNCORE:
+                k17_uncore_setup(cpu_id, index, event);
+                break;
+            default:
+                break;
+        }
+        eventSet->events[i].threadCounter[thread_id].init = TRUE;
+    }
+    if ((fixed_flags > 0x0ULL))
+    {
+        uint64_t tmp = 0x0ULL;
+        CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, MSR_AMD17_HW_CONFIG, &tmp));
+        VERBOSEPRINTREG(cpu_id, MSR_AMD17_HW_CONFIG, LLU_CAST tmp, READ_HW_CONFIG);
+        tmp |= fixed_flags;
+        VERBOSEPRINTREG(cpu_id, MSR_AMD17_HW_CONFIG, LLU_CAST tmp, WRITE_HW_CONFIG)
+        CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_AMD17_HW_CONFIG, tmp));
+    }
+    return 0;
+}
+
+
+int perfmon_startCountersThread_zen(int thread_id, PerfmonEventSet* eventSet)
+{
+    int haveSLock = 0;
+    int haveL3Lock = 0;
+    int haveCLock = 0;
+    uint64_t flags = 0x0ULL;
+    int cpu_id = groupSet->threads[thread_id].processorId;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
+    {
+        haveSLock = 1;
+    }
+    if (sharedl3_lock[affinity_thread2sharedl3_lookup[cpu_id]] == cpu_id)
+    {
+        haveL3Lock = 1;
+    }
+    if (core_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
+    {
+        haveCLock = 1;
+    }
+
+    for (int i=0;i < eventSet->numberOfEvents;i++)
+    {
+        if (eventSet->events[i].threadCounter[thread_id].init == TRUE)
+        {
+            RegisterType type = eventSet->events[i].type;
+            if (!TESTTYPE(eventSet, type))
+            {
+                continue;
+            }
+            flags = 0x0ULL;
+            RegisterIndex index = eventSet->events[i].index;
+            uint32_t reg = counter_map[index].configRegister;
+            uint32_t counter = counter_map[index].counterRegister;
+            eventSet->events[i].threadCounter[thread_id].startData = 0;
+            eventSet->events[i].threadCounter[thread_id].counterData = 0;
+            if ((type == PMC) ||
+                ((type == UNCORE) && (haveSLock)) ||
+                ((type == CBOX0) && (haveL3Lock)))
+            {
+                VERBOSEPRINTREG(cpu_id, counter, LLU_CAST 0x0ULL, RESET_CTR);
+                CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter, 0x0ULL));
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, reg, &flags));
+                VERBOSEPRINTREG(cpu_id, reg, LLU_CAST flags, READ_CTRL);
+                flags |= (1ULL << AMD_K17_ENABLE_BIT);  /* enable flag */
+                VERBOSEPRINTREG(cpu_id, reg, LLU_CAST flags, START_CTRL);
+                CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, reg, flags));
+            }
+            else if (type == POWER)
+            {
+                if (counter == MSR_AMD17_RAPL_PKG_STATUS && (!haveSLock))
+                    continue;
+                if (counter == MSR_AMD17_RAPL_CORE_STATUS && (!haveCLock))
+                    continue;
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter, &flags));
+                eventSet->events[i].threadCounter[thread_id].startData = field64(flags, 0, box_map[type].regWidth);
+                VERBOSEPRINTREG(cpu_id, counter, LLU_CAST field64(flags, 0, box_map[type].regWidth), START_POWER);
+            }
+            else if (type == FIXED)
+            {
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter, &flags));
+                eventSet->events[i].threadCounter[thread_id].startData = field64(flags, 0, box_map[type].regWidth);
+                VERBOSEPRINTREG(cpu_id, counter, LLU_CAST field64(flags, 0, box_map[type].regWidth), START_FIXED);
+            }
+            eventSet->events[i].threadCounter[thread_id].counterData = eventSet->events[i].threadCounter[thread_id].startData;
+        }
+    }
+    return 0;
+}
+
+int perfmon_stopCountersThread_zen(int thread_id, PerfmonEventSet* eventSet)
+{
+    uint64_t flags = 0x0ULL;
+    int haveSLock = 0;
+    int haveL3Lock = 0;
+    int haveCLock = 0;
+    uint64_t counter_result = 0x0ULL;
+    int cpu_id = groupSet->threads[thread_id].processorId;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
+    {
+        haveSLock = 1;
+    }
+    if (sharedl3_lock[affinity_thread2sharedl3_lookup[cpu_id]] == cpu_id)
+    {
+        haveL3Lock = 1;
+    }
+    if (core_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
+    {
+        haveCLock = 1;
+    }
+
+    for (int i=0;i < eventSet->numberOfEvents;i++)
+    {
+        if (eventSet->events[i].threadCounter[thread_id].init == TRUE)
+        {
+            RegisterType type = eventSet->events[i].type;
+            if (!TESTTYPE(eventSet, type))
+            {
+                continue;
+            }
+            counter_result = 0x0ULL;
+            RegisterIndex index = eventSet->events[i].index;
+            uint32_t reg = counter_map[index].configRegister;
+            uint32_t counter = counter_map[index].counterRegister;
+            if ((type == PMC) ||
+                ((type == UNCORE) && (haveSLock)) ||
+                ((type == CBOX0) && (haveL3Lock)))
+            {
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, reg, &flags));
+                flags &= ~(1ULL<<22);  /* clear enable flag */
+                VERBOSEPRINTREG(cpu_id, reg, LLU_CAST flags, STOP_CTRL);
+                CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, reg, flags));
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter, &counter_result));
+                VERBOSEPRINTREG(cpu_id, reg, LLU_CAST counter_result, READ_CTR);
+                if (field64(counter_result, 0, box_map[type].regWidth) < eventSet->events[i].threadCounter[thread_id].counterData)
+                {
+                    eventSet->events[i].threadCounter[thread_id].overflows++;
+                    VERBOSEPRINTREG(cpu_id, reg, LLU_CAST counter_result, OVERFLOW);
+                }
+            }
+            else if (type == POWER)
+            {
+                if (counter == MSR_AMD17_RAPL_PKG_STATUS && (!haveSLock))
+                    continue;
+                if (counter == MSR_AMD17_RAPL_CORE_STATUS && (!haveCLock))
+                    continue;
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter, &counter_result));
+                counter_result = field64(counter_result, 0, box_map[type].regWidth);
+                if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
+                {
+                    eventSet->events[i].threadCounter[thread_id].overflows++;
+                    VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, OVERFLOW_POWER)
+                }
+
+                VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, STOP_POWER);
+            }
+            else if (type == FIXED)
+            {
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter, &counter_result));
+                counter_result = field64(counter_result, 0, box_map[type].regWidth);
+                if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
+                {
+                    eventSet->events[i].threadCounter[thread_id].overflows++;
+                    VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, OVERFLOW_FIXED)
+                }
+                VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, STOP_FIXED);
+            }
+            eventSet->events[i].threadCounter[thread_id].counterData = counter_result;
+        }
+    }
+    return 0;
+}
+
+
+int perfmon_readCountersThread_zen(int thread_id, PerfmonEventSet* eventSet)
+{
+    int haveSLock = 0;
+    int haveL3Lock = 0;
+    int haveCLock = 0;
+    uint64_t counter_result = 0x0ULL;
+    int cpu_id = groupSet->threads[thread_id].processorId;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
+    {
+        haveSLock = 1;
+    }
+    if (sharedl3_lock[affinity_thread2sharedl3_lookup[cpu_id]] == cpu_id)
+    {
+        haveL3Lock = 1;
+    }
+    if (core_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
+    {
+        haveCLock = 1;
+    }
+
+    for (int i=0;i < eventSet->numberOfEvents;i++)
+    {
+        if (eventSet->events[i].threadCounter[thread_id].init == TRUE)
+        {
+            RegisterType type = eventSet->events[i].type;
+            if (!TESTTYPE(eventSet, type))
+            {
+                continue;
+            }
+            counter_result = 0x0ULL;
+            RegisterIndex index = eventSet->events[i].index;
+            uint32_t counter = counter_map[index].counterRegister;
+            uint64_t* current = &(eventSet->events[i].threadCounter[thread_id].counterData);
+            if ((type == PMC) ||
+                ((type == UNCORE) && (haveSLock)) ||
+                ((type == CBOX0) && (haveL3Lock)))
+            {
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter, &counter_result));
+                VERBOSEPRINTREG(cpu_id, counter, counter_result, READ_CTR);
+                if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
+                {
+                    eventSet->events[i].threadCounter[thread_id].overflows++;
+                }
+                *current = field64(counter_result, 0, box_map[type].regWidth);
+            }
+            else if (type == POWER)
+            {
+                if (counter == MSR_AMD17_RAPL_PKG_STATUS && (!haveSLock))
+                    continue;
+                if (counter == MSR_AMD17_RAPL_CORE_STATUS && (!haveCLock))
+                    continue;
+                CHECK_POWER_READ_ERROR(power_read(cpu_id, counter, (uint32_t*)&counter_result));
+                VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, READ_POWER)
+                if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
+                {
+                    VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, OVERFLOW_POWER)
+                    eventSet->events[i].threadCounter[thread_id].overflows++;
+                }
+                *current = field64(counter_result, 0, box_map[type].regWidth);
+            }
+            else if (type == FIXED)
+            {
+                CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, counter, &counter_result));
+                VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, READ_FIXED)
+                if (counter_result < eventSet->events[i].threadCounter[thread_id].counterData)
+                {
+                    VERBOSEPRINTREG(cpu_id, counter, LLU_CAST counter_result, OVERFLOW_FIXED)
+                    eventSet->events[i].threadCounter[thread_id].overflows++;
+                }
+                *current = field64(counter_result, 0, box_map[type].regWidth);
+            }
+        }
+    }
+    return 0;
+}
+
+
+int perfmon_finalizeCountersThread_zen(int thread_id, PerfmonEventSet* eventSet)
+{
+    int haveSLock = 0;
+    int haveL3Lock = 0;
+    int haveCLock = 0;
+    int cpu_id = groupSet->threads[thread_id].processorId;
+
+    if (socket_lock[affinity_thread2socket_lookup[cpu_id]] == cpu_id)
+    {
+        haveSLock = 1;
+    }
+    if (sharedl3_lock[affinity_thread2sharedl3_lookup[cpu_id]] == cpu_id)
+    {
+        haveL3Lock = 1;
+    }
+    if (core_lock[affinity_thread2core_lookup[cpu_id]] == cpu_id)
+    {
+        haveCLock = 1;
+    }
+    for (int i=0;i < eventSet->numberOfEvents;i++)
+    {
+        RegisterType type = eventSet->events[i].type;
+        if (!TESTTYPE(eventSet, type))
+        {
+            continue;
+        }
+        RegisterIndex index = eventSet->events[i].index;
+        if ((type == PMC) ||
+            ((type == UNCORE) && (haveSLock)) ||
+            ((type == CBOX0) && (haveL3Lock)))
+        {
+            if (counter_map[index].configRegister != 0x0)
+            {
+                VERBOSEPRINTREG(cpu_id, counter_map[index].configRegister, 0x0ULL, CLEAR_CTRL);
+                CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].configRegister, 0x0ULL));
+            }
+            if (counter_map[index].counterRegister != 0x0)
+            {
+                VERBOSEPRINTREG(cpu_id, counter_map[index].counterRegister, 0x0ULL, CLEAR_CTR);
+                CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, counter_map[index].counterRegister, 0x0ULL));
+            }
+            eventSet->events[i].threadCounter[thread_id].init = FALSE;
+        }
+        else if (type == FIXED)
+        {
+            uint64_t tmp = 0x0ULL;
+            CHECK_MSR_READ_ERROR(HPMread(cpu_id, MSR_DEV, MSR_AMD17_HW_CONFIG, &tmp));
+            if (tmp & (1ULL << AMD_K17_INST_RETIRE_ENABLE_BIT))
+            {
+                tmp &= ~(1ULL << AMD_K17_INST_RETIRE_ENABLE_BIT);
+            }
+            CHECK_MSR_WRITE_ERROR(HPMwrite(cpu_id, MSR_DEV, MSR_AMD17_HW_CONFIG, tmp));
+        }
+    }
+    return 0;
+}
diff --git a/src/includes/perfmon_zen_counters.h b/src/includes/perfmon_zen_counters.h
new file mode 100644
index 0000000..612c3b2
--- /dev/null
+++ b/src/includes/perfmon_zen_counters.h
@@ -0,0 +1,107 @@
+/*
+ * =======================================================================================
+ *
+ *      Filename:  perfmon_zen_counters.h
+ *
+ *      Description:  Counter Header File of perfmon module for AMD Family 17
+ *
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
+ *
+ *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
+ *      Project:  likwid
+ *
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+ *
+ *      This program is free software: you can redistribute it and/or modify it under
+ *      the terms of the GNU General Public License as published by the Free Software
+ *      Foundation, either version 3 of the License, or (at your option) any later
+ *      version.
+ *
+ *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ *      You should have received a copy of the GNU General Public License along with
+ *      this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * =======================================================================================
+ */
+
+#define NUM_COUNTERS_ZEN 19
+#define NUM_COUNTERS_CORE_ZEN 7
+
+#define AMD_K17_ENABLE_BIT 22
+
+#define AMD_K17_INST_RETIRE_ENABLE_BIT 30
+
+#define AMD_K17_PMC_INVERT_BIT 23
+#define AMD_K17_PMC_EDGE_BIT 18
+#define AMD_K17_PMC_KERNEL_BIT 17
+#define AMD_K17_PMC_USER_BIT 16
+#define AMD_K17_PMC_THRES_SHIFT 24
+#define AMD_K17_PMC_THRES_MASK 0x7FULL
+#define AMD_K17_PMC_HOST_BIT 41
+#define AMD_K17_PMC_GUEST_BIT 40
+
+#define AMD_K17_PMC_UNIT_SHIFT 8
+#define AMD_K17_PMC_UNIT_MASK 0xFFULL
+#define AMD_K17_PMC_EVSEL_SHIFT 0
+#define AMD_K17_PMC_EVSEL_MASK 0xFFULL
+#define AMD_K17_PMC_EVSEL_SHIFT2 32
+#define AMD_K17_PMC_EVSEL_MASK2 0xFULL
+
+#define AMD_K17_L3_UNIT_SHIFT 8
+#define AMD_K17_L3_UNIT_MASK 0xFFULL
+#define AMD_K17_L3_EVSEL_SHIFT 0
+#define AMD_K17_L3_EVSEL_MASK 0xFFULL
+#define AMD_K17_L3_TID_SHIFT 56
+#define AMD_K17_L3_TID_MASK 0xFFULL
+#define AMD_K17_L3_SLICE_SHIFT 48
+#define AMD_K17_L3_SLICE_MASK 0xFULL
+
+#define ZEN_VALID_OPTIONS_PMC EVENT_OPTION_EDGE_MASK|EVENT_OPTION_COUNT_KERNEL_MASK|EVENT_OPTION_INVERT_MASK|EVENT_OPTION_THRESHOLD_MASK
+#define ZEN_VALID_OPTIONS_L3 EVENT_OPTION_TID_MASK|EVENT_OPTION_MATCH0_MASK
+
+static RegisterMap zen_counter_map[NUM_COUNTERS_ZEN] = {
+    /* Fixed counters */
+    {"FIXC0", PMC0, FIXED, MSR_AMD17_HW_CONFIG, MSR_AMD17_RO_INST_RETIRED_CTR, 0, 0, 0},
+    {"FIXC1", PMC1, FIXED, 0, MSR_AMD17_RO_APERF, 0, 0, 0},
+    {"FIXC2", PMC2, FIXED, 0, MSR_AMD17_RO_MPERF, 0, 0, 0},
+    /* Core counters */
+    {"PMC0",PMC3, PMC, MSR_AMD17_PERFEVTSEL0, MSR_AMD17_PMC0, 0, 0, ZEN_VALID_OPTIONS_PMC},
+    {"PMC1",PMC4, PMC, MSR_AMD17_PERFEVTSEL1, MSR_AMD17_PMC1, 0, 0, ZEN_VALID_OPTIONS_PMC},
+    {"PMC2",PMC5, PMC, MSR_AMD17_PERFEVTSEL2, MSR_AMD17_PMC2, 0, 0, ZEN_VALID_OPTIONS_PMC},
+    {"PMC3",PMC6, PMC, MSR_AMD17_PERFEVTSEL3, MSR_AMD17_PMC3, 0, 0, ZEN_VALID_OPTIONS_PMC},
+    /* L3 cache counters */
+    {"CPMC0",PMC7, CBOX0, MSR_AMD17_L3_PERFEVTSEL0, MSR_AMD17_L3_PMC0, 0, 0, ZEN_VALID_OPTIONS_L3},
+    {"CPMC1",PMC8, CBOX0, MSR_AMD17_L3_PERFEVTSEL1, MSR_AMD17_L3_PMC1, 0, 0, ZEN_VALID_OPTIONS_L3},
+    {"CPMC2",PMC9, CBOX0, MSR_AMD17_L3_PERFEVTSEL2, MSR_AMD17_L3_PMC2, 0, 0, ZEN_VALID_OPTIONS_L3},
+    {"CPMC3",PMC10, CBOX0, MSR_AMD17_L3_PERFEVTSEL3, MSR_AMD17_L3_PMC3, 0, 0, ZEN_VALID_OPTIONS_L3},
+    {"CPMC4",PMC11, CBOX0, MSR_AMD17_L3_PERFEVTSEL4, MSR_AMD17_L3_PMC4, 0, 0, ZEN_VALID_OPTIONS_L3},
+    {"CPMC5",PMC12, CBOX0, MSR_AMD17_L3_PERFEVTSEL5, MSR_AMD17_L3_PMC5, 0, 0, ZEN_VALID_OPTIONS_L3},
+    /* Energy counters */
+    {"PWR0", PMC13, POWER, 0, MSR_AMD17_RAPL_CORE_STATUS, 0, 0},
+    {"PWR1", PMC14, POWER, 0, MSR_AMD17_RAPL_PKG_STATUS, 0, 0},
+    /* Northbridge counters */
+    {"UPMC0",PMC15, UNCORE, MSR_AMD16_NB_PERFEVTSEL0, MSR_AMD16_NB_PMC0, 0, 0},
+    {"UPMC1",PMC16, UNCORE, MSR_AMD16_NB_PERFEVTSEL1, MSR_AMD16_NB_PMC1, 0, 0},
+    {"UPMC2",PMC17, UNCORE, MSR_AMD16_NB_PERFEVTSEL2, MSR_AMD16_NB_PMC2, 0, 0},
+    {"UPMC3",PMC18, UNCORE, MSR_AMD16_NB_PERFEVTSEL3, MSR_AMD16_NB_PMC3, 0, 0}
+};
+
+static BoxMap zen_box_map[NUM_UNITS] = {
+    [FIXED] = {0, 0, 0, 0, 0, 0, 64},
+    [PMC] = {0, 0, 0, 0, 0, 0, 48},
+    [CBOX0] = {0, 0, 0, 0, 0, 0, 48},
+    [UNCORE] = {0, 0, 0, 0, 0, 0, 48},
+    [POWER] = {0, 0, 0, 0, 0, 0, 32},
+};
+
+static char* zen_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [POWER] = "/sys/bus/event_source/devices/power",
+    [CBOX0] = "/sys/bus/event_source/devices/amd_l2",
+    [UNCORE] = "/sys/bus/event_source/devices/amd_nb",
+};
diff --git a/src/includes/perfmon_zen_events.txt b/src/includes/perfmon_zen_events.txt
new file mode 100644
index 0000000..b932187
--- /dev/null
+++ b/src/includes/perfmon_zen_events.txt
@@ -0,0 +1,332 @@
+# =======================================================================================
+#
+#      Filename:  perfmon_zen_events.txt
+#
+#      Description:  Event list for AMD Zen
+#
+#      Version:   4.3.1
+#      Released:  04.01.2018
+#
+#      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
+#      Project:  likwid
+#
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
+#
+#      This program is free software: you can redistribute it and/or modify it under
+#      the terms of the GNU General Public License as published by the Free Software
+#      Foundation, either version 3 of the License, or (at your option) any later
+#      version.
+#
+#      This program is distributed in the hope that it will be useful, but WITHOUT ANY
+#      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+#      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+#      You should have received a copy of the GNU General Public License along with
+#      this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# =======================================================================================
+
+# Fixed Events
+EVENT_INST_RETIRED_ANY                      0x01 FIXC0
+UMASK_INST_RETIRED_ANY                      0x00
+
+EVENT_ACTUAL_CPU_CLOCK                      0x02 FIXC1
+UMASK_ACTUAL_CPU_CLOCK                      0x00
+
+EVENT_APERF                                 0x02 FIXC1
+UMASK_APERF                                 0x00
+
+EVENT_MAX_CPU_CLOCK                         0x03 FIXC2
+UMASK_MAX_CPU_CLOCK                         0x00
+
+EVENT_MPERF                                 0x03 FIXC2
+UMASK_MPERF                                 0x00
+
+# Core-local Events
+
+EVENT_FPU_PIPE_ASSIGNMENT                         0x00    PMC
+UMASK_FPU_PIPE_ASSIGNMENT_UOPS_PIPE_0                  0x01
+UMASK_FPU_PIPE_ASSIGNMENT_UOPS_PIPE_1                  0x02
+UMASK_FPU_PIPE_ASSIGNMENT_UOPS_PIPE_2                  0x04
+UMASK_FPU_PIPE_ASSIGNMENT_UOPS_PIPE_3                  0x08
+UMASK_FPU_PIPE_ASSIGNMENT_UOPS_PIPE_ALL                0x0F
+UMASK_FPU_PIPE_ASSIGNMENT_MULTI_PIPE_UOPS_PIPE_0       0x10
+UMASK_FPU_PIPE_ASSIGNMENT_MULTI_PIPE_UOPS_PIPE_1       0x20
+UMASK_FPU_PIPE_ASSIGNMENT_MULTI_PIPE_UOPS_PIPE_2       0x40
+UMASK_FPU_PIPE_ASSIGNMENT_MULTI_PIPE_UOPS_PIPE_3       0x80
+UMASK_FPU_PIPE_ASSIGNMENT_MULTI_PIPE_UOPS_PIPE_ALL     0xF0
+
+
+EVENT_FP_SCHEDULER_EMPTY                          0x01    PMC
+UMASK_FP_SCHEDULER_EMPTY                          0x00
+
+EVENT_RETIRED_X87_FLOPS                           0x02     PMC
+UMASK_RETIRED_X87_FLOPS_ADD_SUB                   0x01
+UMASK_RETIRED_X87_FLOPS_MULT                      0x02
+UMASK_RETIRED_X87_FLOPS_DIV                       0x04
+UMASK_RETIRED_X87_FLOPS_ALL                       0x07
+
+EVENT_RETIRED_SSE_AVX_FLOPS                     0x03    PMC
+UMASK_RETIRED_SSE_AVX_FLOPS_SINGLE_ADD_SUB      0x01
+UMASK_RETIRED_SSE_AVX_FLOPS_SINGLE_MULT         0x02
+UMASK_RETIRED_SSE_AVX_FLOPS_SINGLE_DIV          0x04
+UMASK_RETIRED_SSE_AVX_FLOPS_SINGLE_ADD_MULT_DIV 0x07
+UMASK_RETIRED_SSE_AVX_FLOPS_SINGLE_FMA          0x08
+UMASK_RETIRED_SSE_AVX_FLOPS_SINGLE_ALL          0x0F
+UMASK_RETIRED_SSE_AVX_FLOPS_DOUBLE_ADD_SUB      0x10
+UMASK_RETIRED_SSE_AVX_FLOPS_DOUBLE_MULT         0x20
+UMASK_RETIRED_SSE_AVX_FLOPS_DOUBLE_DIV          0x40
+UMASK_RETIRED_SSE_AVX_FLOPS_DOUBLE_ADD_MULT_DIV 0x70
+UMASK_RETIRED_SSE_AVX_FLOPS_DOUBLE_FMA          0x80
+UMASK_RETIRED_SSE_AVX_FLOPS_DOUBLE_ALL          0xF0
+UMASK_RETIRED_SSE_AVX_FLOPS_ALL                 0xFF
+
+EVENT_MOVE_ELIMINATION                       0x04 PMC
+UMASK_MOVE_ELIMINATION_SSE_MOVES               0x01
+UMASK_MOVE_ELIMINATION_SSE_MOVE_ELIMS          0x02
+
+EVENT_SCALAR_OP_OPTIMIZATIONS                   0x04 PMC
+UMASK_SCALAR_OP_OPTIMIZATIONS_POTENTIAL        0x04
+UMASK_SCALAR_OP_OPTIMIZATIONS_DONE               0x08
+
+EVENT_RETIRED_SERIALIZING_OPS                       0x05    PMC
+UMASK_RETIRED_SERIALIZING_OPS_SSE_BOTTOM            0x00
+UMASK_RETIRED_SERIALIZING_OPS_SSE_CONTROL           0x01
+UMASK_RETIRED_SERIALIZING_OPS_X87_BOTTOM            0x02
+UMASK_RETIRED_SERIALIZING_OPS_X87_CONTROL           0x04
+
+
+EVENT_LOCKS                            0x25 PMC
+UMASK_LOCKS_BUS_LOCK                   0x01
+UMASK_LOCKS_NON_SPEC_LOCK              0x02
+UMASK_LOCKS_SPEC_LOCK                  0x04
+UMASK_LOCKS_SPEC_LOCK_MAP_COMMIT       0x08
+
+EVENT_LS_DISPATCH                      0x29    PMC
+UMASK_LS_DISPATCH_LOADS                0x01
+UMASK_LS_DISPATCH_STORES               0x02
+UMASK_LS_DISPATCH_LOAD_OP_STORES       0x04
+
+EVENT_ST_TO_LD_FWD                     0x35 PMC
+UMASK_ST_TO_LD_FWD                     0x00
+
+EVENT_DATA_CACHE_ACCESSES              0x40    PMC
+UMASK_DATA_CACHE_ACCESSES              0x00
+
+EVENT_MAB_ALLOC_PIPE                   0x41 PMC
+UMASK_MAB_ALLOC_PIPE_DATA              0x01
+UMASK_MAB_ALLOC_PIPE_STORE             0x02
+UMASK_MAB_ALLOC_PIPE_TLB_LATE          0x04
+UMASK_MAB_ALLOC_PIPE_HW_PF             0x08
+UMASK_MAB_ALLOC_PIPE_TLB_EARLY         0x10
+
+EVENT_L1_DTLB_MISS                     0x45 PMC
+UMASK_L1_DTLB_MISS_4K_L2_HIT           0x01
+UMASK_L1_DTLB_MISS_32K_L2_HIT          0x02
+UMASK_L1_DTLB_MISS_2M_L2_HIT           0x04
+UMASK_L1_DTLB_MISS_1G_L2_HIT           0x08
+UMASK_L1_DTLB_MISS_ANY_L2_HIT          0x0F
+UMASK_L1_DTLB_MISS_4K_L2_MISS          0x10
+UMASK_L1_DTLB_MISS_32K_L2_MISS         0x20
+UMASK_L1_DTLB_MISS_2M_L2_MISS          0x40
+UMASK_L1_DTLB_MISS_1G_L2_MISS          0x80
+UMASK_L1_DTLB_MISS_ANY_L2_MISS         0xF0
+
+EVENT_TABLEWALKER_ALLOC                0x46 PMC
+UMASK_TABLEWALKER_ALLOC_DSIDE0         0x01
+UMASK_TABLEWALKER_ALLOC_DSIDE1         0x02
+UMASK_TABLEWALKER_ALLOC_ISIDE0         0x04
+UMASK_TABLEWALKER_ALLOC_ISIDE1         0x08
+
+EVENT_MISALIGNED_LOADS                      0x47    PMC
+UMASK_MISALIGNED_LOADS                      0x00
+
+EVENT_PREF_INSTR_DISPATCHED                   0x4B    PMC
+UMASK_PREF_INSTR_DISPATCHED_LOAD              0x01
+UMASK_PREF_INSTR_DISPATCHED_STORE             0x02
+UMASK_PREF_INSTR_DISPATCHED_NTA               0x04
+
+EVENT_INEFFECTIVE_SW_PREF                    0x52    PMC
+UMASK_INEFFECTIVE_SW_PREF_DATA_CACHE_HIT     0x01
+UMASK_INEFFECTIVE_SW_PREF_MAB_MATCH         0x02
+
+EVENT_CPU_CLOCKS_UNHALTED                    0x76     PMC
+UMASK_CPU_CLOCKS_UNHALTED                    0x00
+
+EVENT_ICACHE_FETCHES                        0x80     PMC
+UMASK_ICACHE_FETCHES                         0x00
+
+EVENT_ICACHE_MISSES                        0x81     PMC
+UMASK_ICACHE_MISSES                         0x00
+
+EVENT_ICACHE_L2_REFILLS                    0x82     PMC
+UMASK_ICACHE_L2_REFILLS                     0x00
+
+EVENT_ICACHE_SYSTEM_REFILLS                0x83     PMC
+UMASK_ICACHE_SYSTEM_REFILLS                 0x00
+
+EVENT_L1_ITLB_L2_ITLB_HIT                      0x84     PMC
+UMASK_L1_ITLB_L2_ITLB_HIT                      0x00
+
+EVENT_L1_ITLB_L2_ITLB_MISS                     0x85     PMC
+UMASK_L1_ITLB_L2_ITLB_MISS                 0x00
+
+EVENT_PIPELINE_RESTART_DUE_INSTR_STREAM_PROBE    0x86 PMC
+UMASK_PIPELINE_RESTART_DUE_INSTR_STREAM_PROBE    0x00
+
+EVENT_INSTR_PIPE_STALL                    0x87 PMC
+UMASK_INSTR_PIPE_STALL_BACK_PRESSURE        0x01
+UMASK_INSTR_PIPE_STALL_DQ_EMPTY            0x02
+UMASK_INSTR_PIPE_STALL_ANY                0x04
+
+EVENT_L1_BTB_CORRECTION                    0x8A PMC
+UMASK_L1_BTB_CORRECTION                    0x00
+
+EVENT_L2_BTB_CORRECTION                    0x8B PMC
+UMASK_L2_BTB_CORRECTION                    0x00
+
+EVENT_ICACHE_LINES_INVALIDATED            0x8C PMC
+UMASK_ICACHE_LINES_INVALIDATED_FILL        0x01
+UMASK_ICACHE_LINES_INVALIDATED_L2_PROBE        0x02
+
+EVENT_ITLB_RELOADS                        0x99     PMC
+UMASK_ITLB_RELOADS                         0x00
+
+EVENT_OC_MODE_SWITCH                    0x28A PMC
+UMASK_OC_MODE_SWITCH_IC_OC                0x01
+UMASK_OC_MODE_SWITCH_OC_IC                0x02
+
+# DE Events
+
+EVENT_DYN_TOKENS_DISP_STALL_CYCLES                        0xAF PMC
+UMASK_DYN_TOKENS_DISP_STALL_CYCLES_ALSQ1_TOKEN_STALL        0x01
+UMASK_DYN_TOKENS_DISP_STALL_CYCLES_ALSQ2_TOKEN_STALL        0x02
+UMASK_DYN_TOKENS_DISP_STALL_CYCLES_ALSQ3_TOKEN_STALL        0x04
+UMASK_DYN_TOKENS_DISP_STALL_CYCLES_ALSQ3_0_TOKEN_STALL        0x08
+UMASK_DYN_TOKENS_DISP_STALL_CYCLES_ALU_TOKEN_STALL        0x10
+UMASK_DYN_TOKENS_DISP_STALL_CYCLES_AGSQ_TOKEN_STALL        0x20
+UMASK_DYN_TOKENS_DISP_STALL_CYCLES_RETIRE_TOKEN_STALL        0x40
+
+# EX (SC) Events
+
+EVENT_RETIRED_INSTRUCTIONS                    0xC0     PMC
+UMASK_RETIRED_INSTRUCTIONS                 0x00
+
+EVENT_RETIRED_UOPS                        0xC1     PMC
+UMASK_RETIRED_UOPS                         0x00
+
+EVENT_RETIRED_BRANCH_INSTR                    0xC2     PMC
+UMASK_RETIRED_BRANCH_INSTR                 0x00
+
+EVENT_RETIRED_MISP_BRANCH_INSTR                0xC3     PMC
+UMASK_RETIRED_MISP_BRANCH_INSTR             0x00
+
+EVENT_RETIRED_TAKEN_BRANCH_INSTR            0xC4     PMC
+UMASK_RETIRED_TAKEN_BRANCH_INSTR             0x00
+
+EVENT_RETIRED_TAKEN_MISP_BRANCH_INSTR        0xC5     PMC
+UMASK_RETIRED_TAKEN_MISP_BRANCH_INSTR        0x00
+
+EVENT_RETIRED_FAR_CONTROL_TRANSFERS            0xC6     PMC
+UMASK_RETIRED_FAR_CONTROL_TRANSFERS             0x00
+
+EVENT_RETIRED_BRANCH_RESYNCS                0xC7     PMC
+UMASK_RETIRED_BRANCH_RESYNCS                 0x00
+
+EVENT_RETIRED_NEAR_RETURNS                    0xC8     PMC
+UMASK_RETIRED_NEAR_RETURNS                 0x00
+
+EVENT_RETIRED_NEAR_RETURNS_MISP                0xC9     PMC
+UMASK_RETIRED_NEAR_RETURNS_MISP                 0x00
+
+EVENT_RETIRED_INDIRECT_BRANCHES_MISP            0xCA     PMC
+UMASK_RETIRED_INDIRECT_BRANCHES_MISP         0x00
+
+EVENT_RETIRED_MMX_FP_INSTR                0xCB     PMC
+UMASK_RETIRED_MMX_FP_INSTR_X87                 0x01
+UMASK_RETIRED_MMX_FP_INSTR_MMX                 0x02
+UMASK_RETIRED_MMX_FP_INSTR_SSE                 0x04
+UMASK_RETIRED_MMX_FP_INSTR_ALL                 0x07
+
+EVENT_RETIRED_COND_BRANCH_INSTR            0xD1 PMC
+UMASK_RETIRED_COND_BRANCH_INSTR            0x00
+
+EVENT_RETIRED_COND_BRANCH_INSTR_MISP        0xD2 PMC
+UMASK_RETIRED_COND_BRANCH_INSTR_MISP        0x00
+
+EVENT_DIV_BUSY_CYCLES                    0xD3 PMC
+UMASK_DIV_BUSY_CYCLES                    0x00
+
+EVENT_DIV_OP_COUNT                        0xD4 PMC
+UMASK_DIV_OP_COUNT                        0x00
+
+EVENT_TAGGED_IBS_OPS                    0x1CF PMC
+UMASK_TAGGED_IBS_OPS_COUNT                0x01
+UMASK_TAGGED_IBS_OPS_COUNT_RETIRED            0x02
+UMASK_TAGGED_IBS_OPS_IBS_COUNT_ROLLOVER        0x04
+
+EVENT_RETIRED_FUSED_BRANCH_INSTR            0x1D0 PMC
+UMASK_RETIRED_FUSED_BRANCH_INSTR            0x00
+
+# L2 Cache Events
+
+EVENT_REQUESTS_TO_L2_GRP1                0x60 PMC
+UMASK_REQUESTS_TO_L2_GRP1_OTHER            0x01
+UMASK_REQUESTS_TO_L2_GRP1_L2_HW_PREF        0x02
+UMASK_REQUESTS_TO_L2_GRP1_PREF_L2            0x04
+UMASK_REQUESTS_TO_L2_GRP1_CHANGE_TO_X        0x08
+UMASK_REQUESTS_TO_L2_GRP1_CACHEABLE_IC_READ    0x10
+UMASK_REQUESTS_TO_L2_GRP1_LS_RD_BLOCK_C_S        0x20
+UMASK_REQUESTS_TO_L2_GRP1_RD_BLOCK_X        0x40
+UMASK_REQUESTS_TO_L2_GRP1_RD_BLOCK_L        0x80
+
+EVENT_REQUESTS_TO_L2_GRP2                0x61 PMC
+UMASK_REQUESTS_TO_L2_GRP2_BUS_LOCK_RESP        0x01
+UMASK_REQUESTS_TO_L2_GRP2_BUS_LOCK_ORIG        0x02
+UMASK_REQUESTS_TO_L2_GRP2_SMC_INVAL        0x04
+UMASK_REQUESTS_TO_L2_GRP2_IC_READ_SIZED_NC    0x08
+UMASK_REQUESTS_TO_L2_GRP2_IC_READ_SIZED        0x10
+UMASK_REQUESTS_TO_L2_GRP2_LS_READ_SIZED_NC    0x20
+UMASK_REQUESTS_TO_L2_GRP2_LS_READ_SIZED        0x40
+UMASK_REQUESTS_TO_L2_GRP2_GRP1            0x80
+
+EVENT_L2_LATENCY_CYCLES                    0x62 PMC
+UMASK_L2_LATENCY_CYCLES_WAIT_ON_FILLS        0x01
+
+EVENT_LS_TO_L2_WBC_REQUESTS                0x63 PMC
+UMASK_LS_TO_L2_WBC_REQUESTS_CL_ZERO        0x01
+UMASK_LS_TO_L2_WBC_REQUESTS_LOCAL_IC_CLEAR    0x02
+UMASK_LS_TO_L2_WBC_REQUESTS_ZERO_BYTE_STORE    0x04
+UMASK_LS_TO_L2_WBC_REQUESTS_I_LINE_FLUSH    0x08
+UMASK_LS_TO_L2_WBC_REQUESTS_CACHELINE_FLUSH    0x10
+UMASK_LS_TO_L2_WBC_REQUESTS_WCB_CLOSE        0x20
+UMASK_LS_TO_L2_WBC_REQUESTS_WCB_WRITE        0x40
+
+EVENT_CORE_TO_L2_CACHE_REQUESTS                    0x64 PMC
+UMASK_CORE_TO_L2_CACHE_REQUESTS_IC_FILL_MISS            0x01
+UMASK_CORE_TO_L2_CACHE_REQUESTS_IC_FILL_HIT_S        0x02
+UMASK_CORE_TO_L2_CACHE_REQUESTS_IC_FILL_HIT_X        0x04
+UMASK_CORE_TO_L2_CACHE_REQUESTS_LD_READ_BLK_C        0x08
+UMASK_CORE_TO_L2_CACHE_REQUESTS_LD_READ_BLK_X        0x10
+UMASK_CORE_TO_L2_CACHE_REQUESTS_LD_READ_BLK_L_HIT_X    0x20
+UMASK_CORE_TO_L2_CACHE_REQUESTS_LD_READ_BLK_L_HIT_X    0x40
+UMASK_CORE_TO_L2_CACHE_REQUESTS_LD_READ_BLK_CS        0x80
+
+EVENT_CYCLES_FILL_PEND_FROM_L2            0x6D PMC
+UMASK_CYCLES_FILL_PEND_FROM_L2_BUSY        0x01
+
+# L3 Cache Events
+
+EVENT_L3_ACCESS                        0x01 CPMC
+UMASK_L3_ACCESS                        0x80
+
+EVENT_L3_MISS                            0x06 CPMC
+UMASK_L3_MISS                            0x01
+
+# Energy Events
+
+EVENT_RAPL_CORE_ENERGY                  0x01 PWR0
+UMASK_RAPL_CORE_ENERGY                  0x00
+
+EVENT_RAPL_PKG_ENERGY                  0x02 PWR1
+UMASK_RAPL_PKG_ENERGY                  0x00
diff --git a/src/includes/power.h b/src/includes/power.h
index 1a0c4e2..4742548 100644
--- a/src/includes/power.h
+++ b/src/includes/power.h
@@ -6,14 +6,14 @@
  *      Description:  Header File Power Module
  *                    Implements Intel RAPL Interface.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -37,33 +37,46 @@
 #include <bitUtil.h>
 #include <error.h>
 #include <access.h>
+#include <unistd.h>
 
-const char* power_names[NUM_POWER_DOMAINS] = {"PKG", "PP0", "PP1", "DRAM"};
+const char* power_names[NUM_POWER_DOMAINS] = {"PKG", "PP0", "PP1", "DRAM", "PLATFORM"};
+const char* perf_power_names[NUM_POWER_DOMAINS] = {
+    "/sys/devices/power/events/energy-pkg.scale",
+    "/sys/devices/power/events/energy-cores.scale",
+    "",
+    "/sys/devices/power/events/energy-ram.scale",
+    "/sys/devices/power/events/energy-platform.scale",
+};
 
 uint32_t power_regs[NUM_POWER_DOMAINS] = {MSR_PKG_ENERGY_STATUS,
                                 MSR_PP0_ENERGY_STATUS,
                                 MSR_PP1_ENERGY_STATUS,
-                                MSR_DRAM_ENERGY_STATUS};
+                                MSR_DRAM_ENERGY_STATUS,
+                                MSR_PLATFORM_ENERGY_STATUS};
 
 uint32_t limit_regs[NUM_POWER_DOMAINS] = {MSR_PKG_RAPL_POWER_LIMIT,
                                 MSR_PP0_RAPL_POWER_LIMIT,
                                 MSR_PP1_RAPL_POWER_LIMIT,
-                                MSR_DRAM_RAPL_POWER_LIMIT};
+                                MSR_DRAM_RAPL_POWER_LIMIT,
+                                MSR_PLATFORM_POWER_LIMIT};
 
 uint32_t policy_regs[NUM_POWER_DOMAINS] = {0,
                                 MSR_PP0_ENERGY_POLICY,
                                 MSR_PP1_ENERGY_POLICY,
+                                0,
                                 0};
 
 uint32_t perf_regs[NUM_POWER_DOMAINS] = {MSR_PKG_PERF_STATUS,
                                 MSR_PP0_PERF_STATUS,
                                 0,
-                                MSR_DRAM_PERF_STATUS};
+                                MSR_DRAM_PERF_STATUS,
+                                0};
 
 uint32_t info_regs[NUM_POWER_DOMAINS] = {MSR_PKG_POWER_INFO,
                                 0,
                                 0,
-                                MSR_DRAM_POWER_INFO};
+                                MSR_DRAM_POWER_INFO,
+                                MSR_PLATFORM_INFO};
 
 
 double
@@ -202,6 +215,23 @@ power_tread(int socket_fd, int cpuId, uint64_t reg, uint32_t *data)
 double
 power_getEnergyUnit(int domain)
 {
+#ifdef LIKWID_USE_PERFEVENT
+    FILE* fd = NULL;
+    char out[512];
+    if (power_info.domains[domain].energyUnit == 0)
+    {
+        if (!access(perf_power_names[domain], R_OK))
+        {
+            fd = fopen(perf_power_names[domain], "r");
+            if (fd != NULL)
+            {
+                fread(out, sizeof(char), 512, fd);
+                fclose(fd);
+                power_info.domains[domain].energyUnit = atof(out);
+            }
+        }
+    }
+#endif
     return power_info.domains[domain].energyUnit;
 }
 
diff --git a/src/includes/power_types.h b/src/includes/power_types.h
index 6f0dce8..2447181 100644
--- a/src/includes/power_types.h
+++ b/src/includes/power_types.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Types file for power module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/registers.h b/src/includes/registers.h
index c459c1a..b2a2d3f 100644
--- a/src/includes/registers.h
+++ b/src/includes/registers.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Register Defines for the perfmon module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -1395,6 +1395,59 @@
 #define MSR_UNC_V3_C23_PMON_CTR2           0xF7A
 #define MSR_UNC_V3_C23_PMON_CTR3           0xF7B
 
+#define MSR_UNC_V3_C24_PMON_BOX_CTL 0xF80
+#define MSR_UNC_V3_C24_PMON_BOX_STATUS 0xF87
+#define MSR_UNC_V3_C24_PMON_BOX_FILTER0 0xF85
+#define MSR_UNC_V3_C24_PMON_BOX_FILTER1 0xF86
+#define MSR_UNC_V3_C24_PMON_CTL0 0xF81
+#define MSR_UNC_V3_C24_PMON_CTL1 0xF82
+#define MSR_UNC_V3_C24_PMON_CTL2 0xF83
+#define MSR_UNC_V3_C24_PMON_CTL3 0xF84
+#define MSR_UNC_V3_C24_PMON_CTR0 0xF88
+#define MSR_UNC_V3_C24_PMON_CTR1 0xF89
+#define MSR_UNC_V3_C24_PMON_CTR2 0xF8A
+#define MSR_UNC_V3_C24_PMON_CTR3 0xF8B
+
+#define MSR_UNC_V3_C25_PMON_BOX_CTL 0xF90
+#define MSR_UNC_V3_C25_PMON_BOX_STATUS 0xF97
+#define MSR_UNC_V3_C25_PMON_BOX_FILTER0 0xF95
+#define MSR_UNC_V3_C25_PMON_BOX_FILTER1 0xF96
+#define MSR_UNC_V3_C25_PMON_CTL0 0xF91
+#define MSR_UNC_V3_C25_PMON_CTL1 0xF92
+#define MSR_UNC_V3_C25_PMON_CTL2 0xF93
+#define MSR_UNC_V3_C25_PMON_CTL3 0xF94
+#define MSR_UNC_V3_C25_PMON_CTR0 0xF98
+#define MSR_UNC_V3_C25_PMON_CTR1 0xF99
+#define MSR_UNC_V3_C25_PMON_CTR2 0xF9A
+#define MSR_UNC_V3_C25_PMON_CTR3 0xF9B
+
+#define MSR_UNC_V3_C26_PMON_BOX_CTL 0xFA0
+#define MSR_UNC_V3_C26_PMON_BOX_STATUS 0xFA7
+#define MSR_UNC_V3_C26_PMON_BOX_FILTER0 0xFA5
+#define MSR_UNC_V3_C26_PMON_BOX_FILTER1 0xFA6
+#define MSR_UNC_V3_C26_PMON_CTL0 0xFA1
+#define MSR_UNC_V3_C26_PMON_CTL1 0xFA2
+#define MSR_UNC_V3_C26_PMON_CTL2 0xFA3
+#define MSR_UNC_V3_C26_PMON_CTL3 0xFA4
+#define MSR_UNC_V3_C26_PMON_CTR0 0xFA8
+#define MSR_UNC_V3_C26_PMON_CTR1 0xFA9
+#define MSR_UNC_V3_C26_PMON_CTR2 0xFAA
+#define MSR_UNC_V3_C26_PMON_CTR3 0xFAB
+
+#define MSR_UNC_V3_C27_PMON_BOX_CTL 0xFB0
+#define MSR_UNC_V3_C27_PMON_BOX_STATUS 0xFB7
+#define MSR_UNC_V3_C27_PMON_BOX_FILTER0 0xFB5
+#define MSR_UNC_V3_C27_PMON_BOX_FILTER1 0xFB6
+#define MSR_UNC_V3_C27_PMON_CTL0 0xFB1
+#define MSR_UNC_V3_C27_PMON_CTL1 0xFB2
+#define MSR_UNC_V3_C27_PMON_CTL2 0xFB3
+#define MSR_UNC_V3_C27_PMON_CTL3 0xFB4
+#define MSR_UNC_V3_C27_PMON_CTR0 0xFB8
+#define MSR_UNC_V3_C27_PMON_CTR1 0xFB9
+#define MSR_UNC_V3_C27_PMON_CTR2 0xFBA
+#define MSR_UNC_V3_C27_PMON_CTR3 0xFBB
+
+
 /* Sbox */
 #define MSR_UNC_V3_S0_PMON_BOX_CTL         0x720
 #define MSR_UNC_V3_S0_PMON_BOX_STATUS      0x725
@@ -1461,6 +1514,7 @@
 #define MSR_UNC_V3_PCU_CC3_CTR             0x3FC
 #define MSR_UNC_V3_PCU_PC2_CTR             0x60D
 #define MSR_UNC_V3_PCU_PC3_CTR             0x3F8
+#define MSR_UNC_V3_PCU_PC6_CTR             0x3F9
 
 /* V3 QPI Box Performance Monitoring, mostly similar to V1/V2 */
 
@@ -1495,6 +1549,309 @@
 
 /* V3 R3QPI Box Performance Monitoring similar to V1/V2 */
 
+/* New registers for Intel Skylake X */
+#define MSR_CPU_NODE_ID                 0xC0
+#define MSR_GID_NID_MAP                 0xD4
+
+/* SLX UBOX */
+/* Similar to Haswell/Broadwell UBOX */
+/* See MSR_UNC_V3_U_PMON_BOX_CTL */
+
+/* SLX CBOX */
+/* Similar to Haswell/Broadwell CBOXes */
+/* See MSR_UNC_V3_C[0-27]_PMON_BOX_CTL */
+
+/* SLX PCU */
+/* Similar to Haswell/Broadwell CBOXes */
+/* See MSR_UNC_V3_PCU_PMON_BOX_CTL */
+
+/* SKX IRP */
+/* The SKX IRP contains subunits for CBDMA, PCIe0,
+ * PCIe1, PCIe2, MCP0 and MCP1
+ */
+#define MSR_UNC_SKX_IRP_CBDMA_CTL0           0xA5B
+#define MSR_UNC_SKX_IRP_CBDMA_CTL1           0xA5C
+#define MSR_UNC_SKX_IRP_CBDMA_CTR0           0xA59
+#define MSR_UNC_SKX_IRP_CBDMA_CTR1           0xA5A
+#define MSR_UNC_SKX_IRP_CBDMA_BOX_CTL        0xA58
+#define MSR_UNC_SKX_IRP_CBDMA_BOX_STATUS     0xA5F
+
+#define	MSR_UNC_SKX_IRP_PCIE0_CTL0	0xA7B
+#define	MSR_UNC_SKX_IRP_PCIE0_CTL1	0xA7C
+#define	MSR_UNC_SKX_IRP_PCIE0_CTR0	0xA79
+#define	MSR_UNC_SKX_IRP_PCIE0_CTR1	0xA7A
+#define	MSR_UNC_SKX_IRP_PCIE0_BOX_CTL	0xA78
+#define	MSR_UNC_SKX_IRP_PCIE0_BOX_STATUS	0xA7F
+
+#define	MSR_UNC_SKX_IRP_PCIE1_CTL0	0xA9B
+#define	MSR_UNC_SKX_IRP_PCIE1_CTL1	0xA9C
+#define	MSR_UNC_SKX_IRP_PCIE1_CTR0	0xA99
+#define	MSR_UNC_SKX_IRP_PCIE1_CTR1	0xA9A
+#define	MSR_UNC_SKX_IRP_PCIE1_BOX_CTL	0xA98
+#define	MSR_UNC_SKX_IRP_PCIE1_BOX_STATUS	0xA9F
+
+#define	MSR_UNC_SKX_IRP_PCIE2_CTL0	0xABB
+#define	MSR_UNC_SKX_IRP_PCIE2_CTL1	0xABC
+#define	MSR_UNC_SKX_IRP_PCIE2_CTR0	0xAB9
+#define	MSR_UNC_SKX_IRP_PCIE2_CTR1	0xABA
+#define	MSR_UNC_SKX_IRP_PCIE2_BOX_CTL	0xAB8
+#define	MSR_UNC_SKX_IRP_PCIE2_BOX_STATUS	0xABF
+
+#define	MSR_UNC_SKX_IRP_MCP0_CTL0	0xADB
+#define	MSR_UNC_SKX_IRP_MCP0_CTL1	0xADC
+#define	MSR_UNC_SKX_IRP_MCP0_CTR0	0xAD9
+#define	MSR_UNC_SKX_IRP_MCP0_CTR1	0xADA
+#define	MSR_UNC_SKX_IRP_MCP0_BOX_CTL	0xAD8
+#define	MSR_UNC_SKX_IRP_MCP0_BOX_STATUS	0xADF
+
+#define	MSR_UNC_SKX_IRP_MCP1_CTL0	0xAFB
+#define	MSR_UNC_SKX_IRP_MCP1_CTL1	0xAFC
+#define	MSR_UNC_SKX_IRP_MCP1_CTR0	0xAF9
+#define	MSR_UNC_SKX_IRP_MCP1_CTR1	0xAFA
+#define	MSR_UNC_SKX_IRP_MCP1_BOX_CTL	0xAF8
+#define	MSR_UNC_SKX_IRP_MCP1_BOX_STATUS	0xAFF
+
+/* SKX iMC (Memory controller) */
+#define PCI_UNC_SKX_MC_PMON_BOX_CTL         0xF4
+#define PCI_UNC_SKX_MC_PMON_BOX_STATUS      0xF8
+#define PCI_UNC_SKX_MC_PMON_FIXED_CTL       0xF0
+#define PCI_UNC_SKX_MC_PMON_FIXED_CTR       0xD0
+#define PCI_UNC_SKX_MC_PMON_CTL0            0xD8
+#define PCI_UNC_SKX_MC_PMON_CTL1            0xDC
+#define PCI_UNC_SKX_MC_PMON_CTL2            0xE0
+#define PCI_UNC_SKX_MC_PMON_CTL3            0xE4
+#define PCI_UNC_SKX_MC_PMON_CTR0            0xA0
+#define PCI_UNC_SKX_MC_PMON_CTR1            0xA8
+#define PCI_UNC_SKX_MC_PMON_CTR2            0xB0
+#define PCI_UNC_SKX_MC_PMON_CTR3            0xB8
+
+/* SKX UPI */
+#define MSR_UNC_SKX_UPI_PMON_CTL0           0x350
+#define MSR_UNC_SKX_UPI_PMON_CTL1           0x358
+#define MSR_UNC_SKX_UPI_PMON_CTL2           0x360
+#define MSR_UNC_SKX_UPI_PMON_CTL3           0x368
+#define MSR_UNC_SKX_UPI_PMON_CTR0           0x318
+#define MSR_UNC_SKX_UPI_PMON_CTR1           0x320
+#define MSR_UNC_SKX_UPI_PMON_CTR2           0x328
+#define MSR_UNC_SKX_UPI_PMON_CTR3           0x330
+#define MSR_UNC_SKX_UPI_PMON_BOX_CTL        0x378
+#define MSR_UNC_SKX_UPI_PMON_BOX_STATUS     0x37C
+
+/* SKX M2M */
+#define MSR_UNC_SKX_M2M_PMON_CTL0           0x228
+#define MSR_UNC_SKX_M2M_PMON_CTL1           0x230
+#define MSR_UNC_SKX_M2M_PMON_CTL2           0x238
+#define MSR_UNC_SKX_M2M_PMON_CTL3           0x240
+#define MSR_UNC_SKX_M2M_PMON_CTR0           0x200
+#define MSR_UNC_SKX_M2M_PMON_CTR1           0x208
+#define MSR_UNC_SKX_M2M_PMON_CTR2           0x210
+#define MSR_UNC_SKX_M2M_PMON_CTR3           0x218
+#define MSR_UNC_SKX_M2M_PMON_BOX_CTL        0x258
+#define MSR_UNC_SKX_M2M_PMON_BOX_STATUS     0x260
+#define MSR_UNC_SKX_M2M_PMON_OPCODE_FILTER  0x278
+#define MSR_UNC_SKX_M2M_PMON_ADDRMASK0_FILTER  0x270
+#define MSR_UNC_SKX_M2M_PMON_ADDRMASK1_FILTER  0x274
+#define MSR_UNC_SKX_M2M_PMON_ADDRMATCH0_FILTER  0x268
+#define MSR_UNC_SKX_M2M_PMON_ADDRMATCH1_FILTER  0x26C
+
+/* SKX M3UPI */
+#define MSR_UNC_SKX_M3UPI_PMON_CTL0           0xD8
+#define MSR_UNC_SKX_M3UPI_PMON_CTL1           0xDC
+#define MSR_UNC_SKX_M3UPI_PMON_CTL2           0xE0
+#define MSR_UNC_SKX_M3UPI_PMON_CTR0           0xA0
+#define MSR_UNC_SKX_M3UPI_PMON_CTR1           0xA8
+#define MSR_UNC_SKX_M3UPI_PMON_CTR2           0xB0
+#define MSR_UNC_SKX_M3UPI_PMON_BOX_CTL        0xF4
+#define MSR_UNC_SKX_M3UPI_PMON_BOX_STATUS     0xF8
+
+/* SKX IIO */
+/* The SKX IIO contains subunits for CBDMA, PCIe0,
+ * PCIe1, PCIe2, MCP0 and MCP1
+ */
+#define MSR_UNC_SKX_II0_CBDMA_CTL0           0xA48
+#define MSR_UNC_SKX_II0_CBDMA_CTL1           0xA49
+#define MSR_UNC_SKX_II0_CBDMA_CTL2           0xA4A
+#define MSR_UNC_SKX_II0_CBDMA_CTL3           0xA4B
+#define MSR_UNC_SKX_II0_CBDMA_CTR0           0xA41
+#define MSR_UNC_SKX_II0_CBDMA_CTR1           0xA42
+#define MSR_UNC_SKX_II0_CBDMA_CTR2           0xA43
+#define MSR_UNC_SKX_II0_CBDMA_CTR3           0xA44
+#define MSR_UNC_SKX_II0_CBDMA_BOX_CTL        0xA40
+#define MSR_UNC_SKX_II0_CBDMA_BOX_STATUS     0xA47
+#define MSR_UNC_SKX_II0_CBDMA_CLOCK          0xA45
+
+#define	MSR_UNC_SKX_II0_PCIE0_CTL0	0xA68
+#define	MSR_UNC_SKX_II0_PCIE0_CTL1	0xA69
+#define	MSR_UNC_SKX_II0_PCIE0_CTL2	0xA6A
+#define	MSR_UNC_SKX_II0_PCIE0_CTL3	0xA6B
+#define	MSR_UNC_SKX_II0_PCIE0_CTR0	0xA61
+#define	MSR_UNC_SKX_II0_PCIE0_CTR1	0xA62
+#define	MSR_UNC_SKX_II0_PCIE0_CTR2	0xA63
+#define	MSR_UNC_SKX_II0_PCIE0_CTR3	0xA64
+#define	MSR_UNC_SKX_II0_PCIE0_BOX_CTL	0xA60
+#define	MSR_UNC_SKX_II0_PCIE0_BOX_STATUS	0xA67
+#define	MSR_UNC_SKX_II0_PCIE0_CLOCK	0xA65
+
+#define	MSR_UNC_SKX_II0_PCIE1_CTL0	0xA88
+#define	MSR_UNC_SKX_II0_PCIE1_CTL1	0xA89
+#define	MSR_UNC_SKX_II0_PCIE1_CTL2	0xA8A
+#define	MSR_UNC_SKX_II0_PCIE1_CTL3	0xA8B
+#define	MSR_UNC_SKX_II0_PCIE1_CTR0	0xA81
+#define	MSR_UNC_SKX_II0_PCIE1_CTR1	0xA82
+#define	MSR_UNC_SKX_II0_PCIE1_CTR2	0xA83
+#define	MSR_UNC_SKX_II0_PCIE1_CTR3	0xA84
+#define	MSR_UNC_SKX_II0_PCIE1_BOX_CTL	0xA80
+#define	MSR_UNC_SKX_II0_PCIE1_BOX_STATUS	0xA87
+#define	MSR_UNC_SKX_II0_PCIE1_CLOCK	0xA85
+
+#define	MSR_UNC_SKX_II0_PCIE2_CTL0	0xAA8
+#define	MSR_UNC_SKX_II0_PCIE2_CTL1	0xAA9
+#define	MSR_UNC_SKX_II0_PCIE2_CTL2	0xAAA
+#define	MSR_UNC_SKX_II0_PCIE2_CTL3	0xAAB
+#define	MSR_UNC_SKX_II0_PCIE2_CTR0	0xAA1
+#define	MSR_UNC_SKX_II0_PCIE2_CTR1	0xAA2
+#define	MSR_UNC_SKX_II0_PCIE2_CTR2	0xAA3
+#define	MSR_UNC_SKX_II0_PCIE2_CTR3	0xAA4
+#define	MSR_UNC_SKX_II0_PCIE2_BOX_CTL	0xAA0
+#define	MSR_UNC_SKX_II0_PCIE2_BOX_STATUS	0xAA7
+#define	MSR_UNC_SKX_II0_PCIE2_CLOCK	0xAA5
+
+#define	MSR_UNC_SKX_II0_MCP0_CTL0	0xAC8
+#define	MSR_UNC_SKX_II0_MCP0_CTL1	0xAC9
+#define	MSR_UNC_SKX_II0_MCP0_CTL2	0xACA
+#define	MSR_UNC_SKX_II0_MCP0_CTL3	0xACB
+#define	MSR_UNC_SKX_II0_MCP0_CTR0	0xAC1
+#define	MSR_UNC_SKX_II0_MCP0_CTR1	0xAC2
+#define	MSR_UNC_SKX_II0_MCP0_CTR2	0xAC3
+#define	MSR_UNC_SKX_II0_MCP0_CTR3	0xAC4
+#define	MSR_UNC_SKX_II0_MCP0_BOX_CTL	0xAC0
+#define	MSR_UNC_SKX_II0_MCP0_BOX_STATUS	0xAC7
+#define	MSR_UNC_SKX_II0_MCP0_CLOCK	0xAC5
+
+#define	MSR_UNC_SKX_II0_MCP1_CTL0	0xAE8
+#define	MSR_UNC_SKX_II0_MCP1_CTL1	0xAE9
+#define	MSR_UNC_SKX_II0_MCP1_CTL2	0xAEA
+#define	MSR_UNC_SKX_II0_MCP1_CTL3	0xAEB
+#define	MSR_UNC_SKX_II0_MCP1_CTR0	0xAE1
+#define	MSR_UNC_SKX_II0_MCP1_CTR1	0xAE2
+#define	MSR_UNC_SKX_II0_MCP1_CTR2	0xAE3
+#define	MSR_UNC_SKX_II0_MCP1_CTR3	0xAE4
+#define	MSR_UNC_SKX_II0_MCP1_BOX_CTL	0xAE0
+#define	MSR_UNC_SKX_II0_MCP1_BOX_STATUS	0xAE7
+#define	MSR_UNC_SKX_II0_MCP1_CLOCK	0xAE5
+
+/* SKX Free-Running IIO Bandwidth Counters */
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT0_IN      0xB00
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT1_IN      0xB01
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT2_IN      0xB02
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT3_IN      0xB03
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT0_OUT     0xB04
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT1_OUT     0xB05
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT2_OUT     0xB06
+#define MSR_UNC_SKX_II0_CBDMA_BAND_PORT3_OUT     0xB07
+
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT0_IN	0xB10
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT1_IN	0xB11
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT2_IN	0xB12
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT3_IN	0xB13
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT0_OUT	0xB14
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT1_OUT	0xB15
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT2_OUT	0xB16
+#define	MSR_UNC_SKX_II0_PCIE0_BAND_PORT3_OUT	0xB17
+
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT0_IN	0xB20
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT1_IN	0xB21
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT2_IN	0xB22
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT3_IN	0xB23
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT0_OUT	0xB24
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT1_OUT	0xB25
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT2_OUT	0xB26
+#define	MSR_UNC_SKX_II0_PCIE1_BAND_PORT3_OUT	0xB27
+
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT0_IN	0xB30
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT1_IN	0xB31
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT2_IN	0xB32
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT3_IN	0xB33
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT0_OUT	0xB34
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT1_OUT	0xB35
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT2_OUT	0xB36
+#define	MSR_UNC_SKX_II0_PCIE2_BAND_PORT3_OUT	0xB37
+
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT0_IN	0xB40
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT1_IN	0xB41
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT2_IN	0xB42
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT3_IN	0xB43
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT0_OUT	0xB44
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT1_OUT	0xB45
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT2_OUT	0xB46
+#define	MSR_UNC_SKX_II0_MCP0_BAND_PORT3_OUT	0xB47
+
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT0_IN	0xB50
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT1_IN	0xB51
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT2_IN	0xB52
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT3_IN	0xB53
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT0_OUT	0xB54
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT1_OUT	0xB55
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT2_OUT	0xB56
+#define	MSR_UNC_SKX_II0_MCP1_BAND_PORT3_OUT	0xB57
+
+/* SKX Free-Running IIO Utilization Counters */
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT0_IN      0xB08
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT1_IN      0xB0A
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT2_IN      0xB0C
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT3_IN      0xB0E
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT0_OUT     0xB09
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT1_OUT     0xB0B
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT2_OUT     0xB0D
+#define MSR_UNC_SKX_II0_CBDMA_UTIL_PORT3_OUT     0xB0F
+
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT0_IN	0xB18
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT1_IN	0xB1A
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT2_IN	0xB1C
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT3_IN	0xB1E
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT0_OUT	0xB19
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT1_OUT	0xB1B
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT2_OUT	0xB1D
+#define	MSR_UNC_SKX_II0_PCIE0_UTIL_PORT3_OUT	0xB1F
+
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT0_IN	0xB28
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT1_IN	0xB2A
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT2_IN	0xB2C
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT3_IN	0xB2E
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT0_OUT	0xB29
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT1_OUT	0xB2B
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT2_OUT	0xB2D
+#define	MSR_UNC_SKX_II0_PCIE1_UTIL_PORT3_OUT	0xB2F
+
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT0_IN	0xB38
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT1_IN	0xB3A
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT2_IN	0xB3C
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT3_IN	0xB3E
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT0_OUT	0xB39
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT1_OUT	0xB3B
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT2_OUT	0xB3D
+#define	MSR_UNC_SKX_II0_PCIE2_UTIL_PORT3_OUT	0xB3F
+
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT0_IN	0xB48
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT1_IN	0xB4A
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT2_IN	0xB4C
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT3_IN	0xB4E
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT0_OUT	0xB49
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT1_OUT	0xB4B
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT2_OUT	0xB4D
+#define	MSR_UNC_SKX_II0_MCP0_UTIL_PORT3_OUT	0xB4F
+
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT0_IN	0xB58
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT1_IN	0xB5A
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT2_IN	0xB5C
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT3_IN	0xB5E
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT0_OUT	0xB59
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT1_OUT	0xB5B
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT2_OUT	0xB5D
+#define	MSR_UNC_SKX_II0_MCP1_UTIL_PORT3_OUT	0xB5F
+
+
+
 /* ########################################################## */
 
 /* EX type uncore */
@@ -1893,6 +2250,7 @@
 #define MSR_TURBO_RATIO_LIMIT1          0x1AE
 #define MSR_TURBO_RATIO_LIMIT2          0x1AF
 #define MSR_TURBO_RATIO_LIMIT3          0x1AC
+#define MSR_TURBO_RATIO_LIMIT_CORES     MSR_TURBO_RATIO_LIMIT1
 
 /* MISC Intel register */
 #define MSR_MPERF                       0xE7
@@ -1972,4 +2330,44 @@
 #define MSR_AMD16_NB_PMC2               0xC0010245
 #define MSR_AMD16_NB_PMC3               0xC0010247
 
+/* AMD 0x17 (Zen) */
+
+#define MSR_AMD17_PERFEVTSEL0		0xC0010200
+#define MSR_AMD17_PMC0			    0xC0010201
+#define MSR_AMD17_PERFEVTSEL1		0xC0010202
+#define MSR_AMD17_PMC1			    0xC0010203
+#define MSR_AMD17_PERFEVTSEL2		0xC0010204
+#define MSR_AMD17_PMC2			    0xC0010205
+#define MSR_AMD17_PERFEVTSEL3		0xC0010206
+#define MSR_AMD17_PMC3			    0xC0010207
+
+#define MSR_AMD17_L3_PERFEVTSEL0		0xC0010230
+#define MSR_AMD17_L3_PMC0		        0xC0010231
+#define MSR_AMD17_L3_PERFEVTSEL1		0xC0010232
+#define MSR_AMD17_L3_PMC1		        0xC0010233
+#define MSR_AMD17_L3_PERFEVTSEL2		0xC0010234
+#define MSR_AMD17_L3_PMC2		        0xC0010235
+#define MSR_AMD17_L3_PERFEVTSEL3		0xC0010236
+#define MSR_AMD17_L3_PMC3		        0xC0010237
+#define MSR_AMD17_L3_PERFEVTSEL4		0xC0010238
+#define MSR_AMD17_L3_PMC4		        0xC0010239
+#define MSR_AMD17_L3_PERFEVTSEL5		0xC001023A
+#define MSR_AMD17_L3_PMC5		        0xC001023B
+
+#define MSR_AMD17_HW_CONFIG			    0xC0010015
+#define MSR_AMD17_SYS_CONFIG			0xC0010010
+
+#define MSR_AMD17_RO_INST_RETIRED_CTR	0xC00000E9
+#define MSR_AMD17_RO_APERF				0xC00000E8
+#define MSR_AMD17_RO_MPERF			    0xC00000E7
+#define MSR_AMD17_INST_RETIRED_CTR		0x000000E9
+#define MSR_AMD17_APERF				    0x000000E8
+#define MSR_AMD17_MPERF				    0x000000E7
+
+#define MSR_AMD17_FEATURE_ENABLE		0xC0000080
+
+#define MSR_AMD17_RAPL_POWER_UNIT		0xC0010299
+#define MSR_AMD17_RAPL_CORE_STATUS		0xC001029A
+#define MSR_AMD17_RAPL_PKG_STATUS		0xC001029B
+
 #endif /* REGISTERS_H */
diff --git a/src/includes/registers_types.h b/src/includes/registers_types.h
index 68da3d2..256f53b 100644
--- a/src/includes/registers_types.h
+++ b/src/includes/registers_types.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of registers.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -85,6 +85,14 @@ typedef enum {
     PMC283, PMC284, PMC285, PMC286, PMC287, PMC288,
     PMC289, PMC290, PMC291, PMC292, PMC293, PMC294,
     PMC295, PMC296, PMC297, PMC298, PMC299, PMC300,
+    PMC301, PMC302, PMC303, PMC304, PMC305, PMC306,
+    PMC307, PMC308, PMC309, PMC310, PMC311, PMC312,
+    PMC313, PMC314, PMC315, PMC316, PMC317, PMC318,
+    PMC319, PMC320, PMC321, PMC322, PMC323, PMC324,
+    PMC325, PMC326, PMC327, PMC328, PMC329, PMC330,
+    PMC331, PMC332, PMC333, PMC334, PMC335, PMC336,
+    PMC337, PMC338, PMC339, PMC340, PMC341, PMC342,
+    PMC343, PMC344, PMC345, PMC346, PMC347, PMC348,
     NUM_PMC
 } RegisterIndex;
 
@@ -115,10 +123,11 @@ typedef enum {
     CBOX30, CBOX31, CBOX32,
     CBOX33, CBOX34, CBOX35,
     CBOX36, CBOX37,
-    PBOX,
+    PBOX, PBOX1, PBOX2, PBOX3,
     UBOX,
     UBOXFIX,
-    IBOX0, IBOX1,
+    IBOX0, IBOX1, IBOX2, IBOX3, IBOX4, IBOX5,
+    IBOX0FIX, IBOX1FIX, IBOX2FIX, IBOX3FIX, IBOX4FIX, IBOX5FIX,
     QBOX0, QBOX1, QBOX2,
     QBOX0FIX, QBOX1FIX, QBOX2FIX,
     EUBOX0, EUBOX0FIX, EUBOX1, EUBOX1FIX,
@@ -209,10 +218,17 @@ static char* RegisterTypeNames[MAX_UNITS] = {
     [CBOX36] = "Caching Agent box 36",
     [CBOX37] = "Caching Agent box 37",
     [PBOX] = "Physical Layer box",
+    [PBOX1] = "Physical Layer box",
+    [PBOX2] = "Physical Layer box",
+    [PBOX3] = "Physical Layer box",
     [UBOX] = "System Configuration box",
     [UBOXFIX] = "System Configuration box fixed counter",
     [IBOX0] = "Coherency Maintainer for IIO traffic",
     [IBOX1] = "Coherency Maintainer for IIO traffic",
+    [IBOX2] = "Coherency Maintainer for IIO traffic",
+    [IBOX3] = "Coherency Maintainer for IIO traffic",
+    [IBOX4] = "Coherency Maintainer for IIO traffic",
+    [IBOX5] = "Coherency Maintainer for IIO traffic",
     [QBOX0] = "QPI Link Layer 0",
     [QBOX1] = "QPI Link Layer 1",
     [QBOX0FIX] = "QPI Link Layer rate status 0",
diff --git a/src/includes/textcolor.h b/src/includes/textcolor.h
index 17a9bf9..4f1ffee 100644
--- a/src/includes/textcolor.h
+++ b/src/includes/textcolor.h
@@ -7,13 +7,13 @@
  *                    Allows toggling of terminal escape sequences for
  *                    colored text.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/thermal.h b/src/includes/thermal.h
index fdbbc77..c282a31 100644
--- a/src/includes/thermal.h
+++ b/src/includes/thermal.h
@@ -6,13 +6,13 @@
  *      Description:  Header File Thermal Module.
  *                    Implements Intel TM/TM2 Interface.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/thermal_types.h b/src/includes/thermal_types.h
index 849cf85..cf4cca7 100644
--- a/src/includes/thermal_types.h
+++ b/src/includes/thermal_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Types file for thermal module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/timer.h b/src/includes/timer.h
index c2b9e60..a87d851 100644
--- a/src/includes/timer.h
+++ b/src/includes/timer.h
@@ -10,13 +10,13 @@
  *      with rdtsc of 100 cycles in the worst case. Therefore sensible
  *      measurements should be over 1000 cycles.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/timer_types.h b/src/includes/timer_types.h
index 2a12b0a..49869cd 100644
--- a/src/includes/timer_types.h
+++ b/src/includes/timer_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Types file for timer module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/tlb-info.h b/src/includes/tlb-info.h
index 9cc1f5f..d2bba54 100644
--- a/src/includes/tlb-info.h
+++ b/src/includes/tlb-info.h
@@ -6,13 +6,13 @@
  *      Description:  Header File of topology module that contains the TLB
  *                    describing strings. Not used currently.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/topology.h b/src/includes/topology.h
index 8f5ee4a..146fad6 100644
--- a/src/includes/topology.h
+++ b/src/includes/topology.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of topology module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -45,8 +45,6 @@
 #define MAX_FEATURE_STRING_LENGTH 512
 #define MAX_MODEL_STRING_LENGTH 512
 
-extern int affinity_thread2tile_lookup[MAX_NUM_THREADS];
-extern int affinity_thread2tile_lookup[MAX_NUM_THREADS];
 struct topology_functions {
     void (*init_cpuInfo) (cpu_set_t cpuSet);
     void (*init_cpuFeatures) (void);
@@ -73,6 +71,8 @@ struct topology_functions {
 #define ATOM_SILVERMONT_F    0x5DU
 #define ATOM_SILVERMONT_AIR  0x4CU
 #define ATOM_SILVERMONT_GOLD 0x5CU
+#define ATOM_DENVERTON       0x5FU
+#define ATOM_GOLDMONT_PLUS   0x7AU
 #define NEHALEM              0x1AU
 #define NEHALEM_BLOOMFIELD   0x1AU
 #define NEHALEM_LYNNFIELD    0x1EU
@@ -91,23 +91,27 @@ struct topology_functions {
 #define WESTMERE_EX          0x2FU
 #define XEON_MP              0x1DU
 #define BROADWELL            0x3DU
-#define BROADWELL_E3         0x47U
 #define BROADWELL_E          0x4FU
 #define BROADWELL_D          0x56U
+#define BROADWELL_E3         0x47U
 #define SKYLAKE1             0x4EU
 #define SKYLAKE2             0x5EU
+#define SKYLAKEX             0x55U
 #define KABYLAKE1            0x8EU
 #define KABYLAKE2            0x9EU
+#define CANNONLAKE           0x66U
 
 /* Intel MIC */
 #define XEON_PHI           0x01U
 #define XEON_PHI_KNL       0x57U
+#define XEON_PHI_KML       0x85U
 
 /* AMD K10 */
 #define BARCELONA      0x02U
 #define SHANGHAI       0x04U
 #define ISTANBUL       0x08U
 #define MAGNYCOURS     0x09U
+#define THUBAN         0x0AU
 
 /* AMD K8 */
 #define OPTERON_SC_1MB  0x05U
@@ -120,11 +124,13 @@ struct topology_functions {
 #define ATHLON64_X2_G   0x6BU
 #define ATHLON64_G1     0x6FU
 #define ATHLON64_G2     0x7FU
+#define ZEN_RYZEN       0x01
 
 
 #define  P6_FAMILY        0x6U
 #define  MIC_FAMILY       0xBU
 #define  NETBURST_FAMILY  0xFFU
+#define  ZEN_FAMILY       0x17
 #define  K15_FAMILY       0x15U
 #define  K16_FAMILY       0x16U
 #define  K10_FAMILY       0x10U
diff --git a/src/includes/topology_cpuid.h b/src/includes/topology_cpuid.h
index d7d47a6..d150038 100644
--- a/src/includes/topology_cpuid.h
+++ b/src/includes/topology_cpuid.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Header File of topology backend using cpuid instruction.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/topology_hwloc.h b/src/includes/topology_hwloc.h
index bd5a398..20ac767 100644
--- a/src/includes/topology_hwloc.h
+++ b/src/includes/topology_hwloc.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File of topology backend using the hwloc library
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/topology_proc.h b/src/includes/topology_proc.h
index f5aee2d..743cf00 100644
--- a/src/includes/topology_proc.h
+++ b/src/includes/topology_proc.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Header File of topology backend using procfs/sysfs
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/topology_types.h b/src/includes/topology_types.h
index 06e2f3a..158f76a 100644
--- a/src/includes/topology_types.h
+++ b/src/includes/topology_types.h
@@ -6,14 +6,14 @@
  *      Description:  Types file for topology module. External definitions are
  *                    in likwid.h
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -67,6 +67,7 @@ typedef enum {
     HLE, /*!< \brief Hardware Lock Elision */
     HTT, /*!< \brief Hyper-Threading Technology */
     RDSEED, /*!< \brief Non-deterministic random bit generator */
+    AVX512, /*!< \brief 512-bit wide vector registers for Advanced Vector Extensions */
 } FeatureBit;
 /** @}*/
 #endif /*CPUID_TYPES_H*/
diff --git a/src/includes/tree.h b/src/includes/tree.h
index 5fc7a10..b45d2b0 100644
--- a/src/includes/tree.h
+++ b/src/includes/tree.h
@@ -6,13 +6,13 @@
  *      Description:  Header File tree Module.
  *                    Implements a simple tree data structure.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/tree_types.h b/src/includes/tree_types.h
index 1ef63be..9c0b769 100644
--- a/src/includes/tree_types.h
+++ b/src/includes/tree_types.h
@@ -5,13 +5,13 @@
  *
  *      Description:  Types file for tree module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/includes/types.h b/src/includes/types.h
index a45fdb8..8f10313 100644
--- a/src/includes/types.h
+++ b/src/includes/types.h
@@ -5,14 +5,14 @@
  *
  *      Description:  Global  Types file
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/libperfctr.c b/src/libperfctr.c
index 852de8c..dde9e31 100644
--- a/src/libperfctr.c
+++ b/src/libperfctr.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Marker API interface of module perfmon
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -40,6 +40,7 @@
 #include <sched.h>
 #include <pthread.h>
 #include <inttypes.h>
+#include <math.h>
 
 #include <likwid.h>
 #include <bitUtil.h>
@@ -50,13 +51,11 @@
 #include <registers.h>
 #include <error.h>
 #include <access.h>
-
+#include <affinity.h>
 #include <perfmon.h>
 
 /* #####   VARIABLES  -  LOCAL TO THIS SOURCE FILE   ###################### */
 
-int socket_lock[MAX_NUM_NODES];
-int core_lock[MAX_NUM_THREADS];
 static int likwid_init = 0;
 static int numberOfGroups = 0;
 static int* groups;
@@ -111,17 +110,20 @@ static double
 calculateMarkerResult(RegisterIndex index, uint64_t start, uint64_t stop, int overflows)
 {
     double result = 0.0;
-
+    uint64_t maxValue = 0ULL;
     if (overflows == 0)
     {
         result = (double) (stop - start);
     }
     else if (overflows > 0)
     {
-        result += (double) ((perfmon_getMaxCounterValue(counter_map[index].type) - start) + stop);
-        overflows--;
+        maxValue = perfmon_getMaxCounterValue(counter_map[index].type);
+        result += (double) ((maxValue - start) + stop);
+        if (overflows > 1)
+        {
+            result += (double) ((overflows-1) * maxValue);
+        }
     }
-    result += (double) (overflows * perfmon_getMaxCounterValue(counter_map[index].type));
     if (counter_map[index].type == POWER)
     {
         result *= power_getEnergyUnit(getCounterTypeOffset(index));
@@ -178,10 +180,9 @@ likwid_markerInit(void)
     affinity_init();
     hashTable_init();
 
-    for(int i=0; i<MAX_NUM_NODES; i++) socket_lock[i] = LOCK_INIT;
-
+//#ifndef LIKWID_USE_PERFEVENT
     HPMmode(atoi(modeStr));
-
+//#endif
     if (getenv("LIKWID_DEBUG") != NULL)
     {
         perfmon_verbosity = atoi(getenv("LIKWID_DEBUG"));
@@ -254,13 +255,14 @@ likwid_markerInit(void)
     {
         likwid_init = 1;
     }
-    groupSet->activeGroup = 0;
     threads2Pthread[registered_cpus] = pthread_self();
     registered_cpus++;
 
+    groupSet->activeGroup = 0;
+//#ifdef LIKWID_USE_PERFEVENT
     perfmon_setupCounters(groupSet->activeGroup);
     perfmon_startCounters();
-
+//#endif
 }
 
 void
@@ -287,7 +289,6 @@ likwid_markerThreadInit(void)
         threads2Pthread[registered_cpus] = t;
         myID = registered_cpus++;
     }
-    //myID = registered_cpus++;
     pthread_mutex_unlock(&globalLock);
 
     if (getenv("LIKWID_PIN") != NULL)
@@ -298,7 +299,7 @@ likwid_markerThreadInit(void)
         if ((CPU_COUNT(&cpuset) > 1) || (likwid_getProcessorId() != threads2Cpu[myID % num_cpus]))
         {
             likwid_pinThread(threads2Cpu[myID % num_cpus]);
-            DEBUG_PRINT(DEBUGLEV_DEVELOP, "Pin thread %lu to CPU %d currently %d\n", gettid(), threads2Cpu[myID % num_cpus], sched_getcpu());
+            DEBUG_PRINT(DEBUGLEV_DEVELOP, Pin thread %lu to CPU %d currently %d, gettid(), threads2Cpu[myID % num_cpus], sched_getcpu());
         }
     }
 }
@@ -340,13 +341,14 @@ likwid_markerClose(void)
     char* markerfile = NULL;
     int lineidx = 0;
     char line[1024];
+    int* validRegions = NULL;
 
     if ( ! likwid_init )
     {
         return;
     }
     hashTable_finalize(&numberOfThreads, &numberOfRegions, &results);
-    if ((numberOfThreads == 0)||(numberOfThreads == 0))
+    if ((numberOfThreads == 0)||(numberOfRegions == 0))
     {
         fprintf(stderr, "No threads or regions defined in hash table\n");
         return;
@@ -358,33 +360,68 @@ likwid_markerClose(void)
                 "Is the application executed with LIKWID wrapper? No file path for the Marker API output defined.\n");
         return;
     }
+    validRegions = (int*)malloc(numberOfRegions*sizeof(int));
+    if (!validRegions)
+    {
+        return;
+    }
+    for (int i=0; i<numberOfRegions; i++)
+    {
+        validRegions[i] = 0;
+    }
     file = fopen(markerfile,"w");
 
     if (file != NULL)
     {
+        int newNumberOfRegions = 0;
+        int newRegionID = 0;
+        for (int i=0; i<numberOfRegions; i++)
+        {
+            for (int j=0; j<numberOfThreads; j++)
+            {
+                validRegions[i] += results[i].count[j];
+            }
+            if (validRegions[i] > 0)
+                newNumberOfRegions++;
+            else
+                fprintf(stderr, "WARN: Skipping region %s for evaluation.\n", bdata(results[i].tag));
+        }
+        if (newNumberOfRegions < numberOfRegions)
+        {
+            fprintf(stderr, "WARN: Regions are skipped because:\n");
+            fprintf(stderr, "      - The region was only registered\n");
+            fprintf(stderr, "      - The region was started but never stopped\n");
+            fprintf(stderr, "      - The region was never started but stopped\n");
+        }
         DEBUG_PRINT(DEBUGLEV_DEVELOP,
                 Creating Marker file %s with %d regions %d groups and %d threads,
-                markerfile, numberOfRegions, numberOfGroups, numberOfThreads);
-        fprintf(file,"%d %d %d\n",numberOfThreads, numberOfRegions, numberOfGroups);
-        DEBUG_PRINT(DEBUGLEV_DEVELOP, %d %d %d, numberOfThreads, numberOfRegions, numberOfGroups);
+                markerfile, newNumberOfRegions, numberOfGroups, numberOfThreads);
+        fprintf(file,"%d %d %d\n",numberOfThreads, newNumberOfRegions, numberOfGroups);
+        DEBUG_PRINT(DEBUGLEV_DEVELOP, %d %d %d, numberOfThreads, newNumberOfRegions, numberOfGroups);
 
         for (int i=0; i<numberOfRegions; i++)
         {
-            fprintf(file,"%d:%s\n",i,bdata(results[i].tag));
-            DEBUG_PRINT(DEBUGLEV_DEVELOP, %d:%s, i,bdata(results[i].tag));
+            if (validRegions[i] == 0)
+                continue;
+            fprintf(file,"%d:%s\n",newRegionID,bdata(results[i].tag));
+            DEBUG_PRINT(DEBUGLEV_DEVELOP, %d:%s, newRegionID,bdata(results[i].tag));
+            newRegionID++;
         }
+        newRegionID = 0;
         for (int i=0; i<numberOfRegions; i++)
         {
+            if (validRegions[i] == 0)
+                continue;
             for (int j=0; j<numberOfThreads; j++)
             {
-                fprintf(file,"%d ",i);
+                fprintf(file,"%d ",newRegionID);
                 fprintf(file,"%d ",results[i].groupID);
                 fprintf(file,"%d ",results[i].cpulist[j]);
                 fprintf(file,"%u ",results[i].count[j]);
                 fprintf(file,"%e ",results[i].time[j]);
                 fprintf(file,"%d ",groupSet->groups[results[i].groupID].numberOfEvents);
                 lineidx = sprintf(&(line[0]), "%d %d %d %u %e %d ",
-                        i, results[i].groupID,results[i].cpulist[j],results[i].count[j],
+                        newRegionID, results[i].groupID,results[i].cpulist[j],results[i].count[j],
                         results[i].time[j],groupSet->groups[results[i].groupID].numberOfEvents);
 
                 for (int k=0; k<groupSet->groups[results[i].groupID].numberOfEvents; k++)
@@ -395,6 +432,7 @@ likwid_markerClose(void)
                 fprintf(file,"\n");
                 DEBUG_PRINT(DEBUGLEV_DEVELOP, %s,line);
             }
+            newRegionID++;
         }
         fclose(file);
     }
@@ -403,7 +441,7 @@ likwid_markerClose(void)
         fprintf(stderr, "Cannot open file %s\n", markerfile);
         fprintf(stderr, "%s", strerror(errno));
     }
-
+    free(validRegions);
 }
 
 void __attribute__((destructor (101))) likwid_markerCloseDestruct(void)
@@ -454,7 +492,11 @@ likwid_markerRegisterRegion(const char* regionTag)
     bcatcstr(tag, groupSuffix);
     int cpu_id = hashTable_get(tag, &results);
     bdestroy(tag);
+//#ifdef LIKWID_USE_PERFEVENT
     return HPMaddThread(cpu_id);
+//#else
+//    return 0;
+//#endif
 }
 
 int
@@ -478,19 +520,32 @@ likwid_markerStartRegion(const char* regionTag)
 
     int cpu_id = hashTable_get(tag, &results);
     int thread_id = getThreadID(cpu_id);
+    if (results->state == MARKER_STATE_START)
+    {
+        fprintf(stderr, "WARN: Region %s was already started\n", regionTag);
+    }
     perfmon_readCountersCpu(cpu_id);
     results->cpuID = cpu_id;
     for(int i=0;i<groupSet->groups[groupSet->activeGroup].numberOfEvents;i++)
     {
-        DEBUG_PRINT(DEBUGLEV_DEVELOP, START [%s] READ EVENT [%d=%d] EVENT %d VALUE %llu,
-                regionTag, thread_id, cpu_id, i,
-                LLU_CAST groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData);
-        //groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].startData =
-        //        groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData;
-
-        results->StartPMcounters[i] = groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData;
-        results->StartOverflows[i] = groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].overflows;
+        if (groupSet->groups[groupSet->activeGroup].events[i].type != NOTYPE)
+        {
+            DEBUG_PRINT(DEBUGLEV_DEVELOP, START [%s] READ EVENT [%d=%d] EVENT %d VALUE %llu,
+                    regionTag, thread_id, cpu_id, i,
+                    LLU_CAST groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData);
+            //groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].startData =
+            //        groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData;
+
+            results->StartPMcounters[i] = groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData;
+            results->StartOverflows[i] = groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].overflows;
+        }
+        else
+        {
+            results->StartPMcounters[i] = NAN;
+            results->StartOverflows[i] = -1;
+        }
     }
+    results->state = MARKER_STATE_START;
 
     bdestroy(tag);
     timer_start(&(results->startTime));
@@ -527,6 +582,11 @@ likwid_markerStopRegion(const char* regionTag)
 
     cpu_id = hashTable_get(tag, &results);
     thread_id = getThreadID(cpu_id);
+    if (results->state != MARKER_STATE_START)
+    {
+        fprintf(stderr, "WARN: Stopping an unknown/not-started region %s\n", regionTag);
+        return -EFAULT;
+    }
     results->groupID = groupSet->activeGroup;
     results->startTime.stop.int64 = timestamp.stop.int64;
     results->time += timer_print(&(results->startTime));
@@ -537,21 +597,29 @@ likwid_markerStopRegion(const char* regionTag)
 
     for(int i=0;i<groupSet->groups[groupSet->activeGroup].numberOfEvents;i++)
     {
-        DEBUG_PRINT(DEBUGLEV_DEVELOP, STOP [%s] READ EVENT [%d=%d] EVENT %d VALUE %llu, regionTag, thread_id, cpu_id, i,
-                        LLU_CAST groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData);
-        result = calculateMarkerResult(groupSet->groups[groupSet->activeGroup].events[i].index, results->StartPMcounters[i],
-                                        groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData,
-                                        groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].overflows -
-                                        results->StartOverflows[i]);
-        if (counter_map[groupSet->groups[groupSet->activeGroup].events[i].index].type != THERMAL)
+        if (groupSet->groups[groupSet->activeGroup].events[i].type != NOTYPE)
         {
-            results->PMcounters[i] += result;
+            DEBUG_PRINT(DEBUGLEV_DEVELOP, STOP [%s] READ EVENT [%d=%d] EVENT %d VALUE %llu, regionTag, thread_id, cpu_id, i,
+                            LLU_CAST groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData);
+            result = calculateMarkerResult(groupSet->groups[groupSet->activeGroup].events[i].index, results->StartPMcounters[i],
+                                            groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].counterData,
+                                            groupSet->groups[groupSet->activeGroup].events[i].threadCounter[thread_id].overflows -
+                                            results->StartOverflows[i]);
+            if (counter_map[groupSet->groups[groupSet->activeGroup].events[i].index].type != THERMAL)
+            {
+                results->PMcounters[i] += result;
+            }
+            else
+            {
+                results->PMcounters[i] = result;
+            }
         }
         else
         {
-            results->PMcounters[i] = result;
+            results->PMcounters[i] = NAN;
         }
     }
+    results->state = MARKER_STATE_STOP;
     if (use_locks == 1)
     {
         pthread_mutex_unlock(&threadLocks[myCPU]);
diff --git a/src/likwid.f90 b/src/likwid.f90
index 81c8076..dea10b1 100644
--- a/src/likwid.f90
+++ b/src/likwid.f90
@@ -4,14 +4,14 @@
 !
 !     Description: Marker API f90 module
 !
-!      Version:   4.2
-!      Released:  22.12.2016
+!      Version:   4.3.1
+!      Released:  04.01.2018
 !
 !     Authors:  Jan Treibig (jt), jan.treibig at gmail.com,
 !               Thomas Roehl (tr), thomas.roehl at googlemail.com
 !     Project:  likwid
 !
-!      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+!      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 !
 !      This program is free software: you can redistribute it and/or modify it under
 !      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/likwid_f90_interface.c b/src/likwid_f90_interface.c
index d451c5b..c0887fc 100644
--- a/src/likwid_f90_interface.c
+++ b/src/likwid_f90_interface.c
@@ -5,14 +5,14 @@
  *
  *      Description: F90 interface for marker API
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com,
  *               Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/luawid.c b/src/luawid.c
index 96b1c3f..e3c4a4a 100644
--- a/src/luawid.c
+++ b/src/luawid.c
@@ -5,13 +5,13 @@
  *
  *      Description:  C part of the Likwid Lua interface
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -41,6 +41,7 @@
 #include <sched.h>
 #include <sys/types.h>
 #include <pwd.h>
+#include <sys/syscall.h>
 
 #include <lua.h>                               /* Always include this */
 #include <lauxlib.h>                           /* Always include this */
@@ -55,6 +56,8 @@
 #include <textcolor.h>
 #endif
 
+#define gettid() syscall(SYS_gettid)
+
 /* #####   VARIABLES  -  LOCAL TO THIS SOURCE FILE   ###################### */
 
 static int topology_isInitialized = 0;
@@ -1333,13 +1336,19 @@ lua_likwid_cpustr_to_cpulist(lua_State* L)
 {
     int ret = 0;
     char* cpustr = (char *)luaL_checkstring(L, 1);
-    int* cpulist = (int*) malloc(MAX_NUM_THREADS * sizeof(int));
+    if (!cputopo)
+    {
+        topology_init();
+        cputopo = get_cpuTopology();
+        topology_isInitialized = 1;
+    }
+    int* cpulist = (int*) malloc(cputopo->numHWThreads * sizeof(int));
     if (cpulist == NULL)
     {
         lua_pushstring(L,"Cannot allocate data for the CPU list");
         lua_error(L);
     }
-    ret = cpustr_to_cpulist(cpustr, cpulist, MAX_NUM_THREADS);
+    ret = cpustr_to_cpulist(cpustr, cpulist, cputopo->numHWThreads);
     if (ret <= 0)
     {
         lua_pushstring(L,"Cannot parse cpustring");
@@ -1362,13 +1371,21 @@ lua_likwid_nodestr_to_nodelist(lua_State* L)
 {
     int ret = 0;
     char* nodestr = (char *)luaL_checkstring(L, 1);
-    int* nodelist = (int*) malloc(MAX_NUM_NODES * sizeof(int));
+    if (!numainfo)
+    {
+        topology_init();
+        numa_init();
+        numainfo = get_numaTopology();
+        topology_isInitialized = 1;
+        numa_isInitialized = 1;
+    }
+    int* nodelist = (int*) malloc(numainfo->numberOfNodes * sizeof(int));
     if (nodelist == NULL)
     {
         lua_pushstring(L,"Cannot allocate data for the node list");
         lua_error(L);
     }
-    ret = nodestr_to_nodelist(nodestr, nodelist, MAX_NUM_NODES);
+    ret = nodestr_to_nodelist(nodestr, nodelist, numainfo->numberOfNodes);
     if (ret <= 0)
     {
         lua_pushstring(L,"Cannot parse node string");
@@ -1391,13 +1408,19 @@ lua_likwid_sockstr_to_socklist(lua_State* L)
 {
     int ret = 0;
     char* sockstr = (char *)luaL_checkstring(L, 1);
-    int* socklist = (int*) malloc(MAX_NUM_NODES * sizeof(int));
+    if (!cputopo)
+    {
+        topology_init();
+        cputopo = get_cpuTopology();
+        topology_isInitialized = 1;
+    }
+    int* socklist = (int*) malloc(cputopo->numSockets * sizeof(int));
     if (socklist == NULL)
     {
         lua_pushstring(L,"Cannot allocate data for the socket list");
         lua_error(L);
     }
-    ret = nodestr_to_nodelist(sockstr, socklist, MAX_NUM_NODES);
+    ret = nodestr_to_nodelist(sockstr, socklist, cputopo->numSockets);
     if (ret <= 0)
     {
         lua_pushstring(L,"Cannot parse socket string");
@@ -1476,7 +1499,6 @@ lua_likwid_getPowerInfo(lua_State* L)
             return 0;
         }
     }
-
     lua_newtable(L);
     lua_pushstring(L,"hasRAPL");
     lua_pushboolean(L,power_hasRAPL);
@@ -1626,7 +1648,7 @@ lua_likwid_startPower(lua_State* L)
 #else
     PowerType type = (PowerType) ((lua_Unsigned)lua_tointegerx(L,2, NULL));
 #endif
-    luaL_argcheck(L, type >= PKG+1 && type <= DRAM+1, 2, "Type not valid");
+    luaL_argcheck(L, type >= PKG+1 && type <= NUM_POWER_DOMAINS, 2, "Type not valid");
     power_start(&pwrdata, cpuId, type-1);
     lua_pushnumber(L,pwrdata.before);
     return 1;
@@ -1643,7 +1665,7 @@ lua_likwid_stopPower(lua_State* L)
 #else
     PowerType type = (PowerType) ((lua_Unsigned)lua_tointegerx(L,2, NULL));
 #endif
-    luaL_argcheck(L, type >= PKG+1 && type <= DRAM+1, 2, "Type not valid");
+    luaL_argcheck(L, type >= PKG+1 && type <= NUM_POWER_DOMAINS, 2, "Type not valid");
     power_stop(&pwrdata, cpuId, type-1);
     lua_pushnumber(L,pwrdata.after);
     return 1;
@@ -1858,6 +1880,22 @@ lua_likwid_return_signal_state(lua_State* L)
     return 1;
 }
 
+static int
+lua_likwid_send_signal(lua_State* L)
+{
+    int err = 0;
+#if LUA_VERSION_NUM == 501
+    pid_t pid = ((lua_Integer)lua_tointeger(L,1));
+    int signal = ((lua_Integer)lua_tointeger(L,2));
+#else
+    pid_t pid = ((lua_Unsigned)lua_tointegerx(L,1, NULL));
+    int signal = ((lua_Unsigned)lua_tointegerx(L,2, NULL));
+#endif
+    err = kill(pid, signal);
+    lua_pushnumber(L, err);
+    return 1;
+}
+
 /* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
 
 void
@@ -1891,13 +1929,23 @@ lua_likwid_startProgram(lua_State* L)
     char *argv[4096];
     exec = (char *)luaL_checkstring(L, 1);
     int nrThreads = luaL_checknumber(L,2);
-    int cpus[MAX_NUM_THREADS];
+    CpuTopology_t cputopo = get_cpuTopology();
+    if (nrThreads > cputopo->numHWThreads)
+    {
+        lua_pushstring(L,"Number of threads greater than available HW threads");
+        lua_error(L);
+        return 0;
+    }
+    int *cpus = malloc(cputopo->numHWThreads * sizeof(int));
+    if (!cpus)
+        return 0;
     cpu_set_t cpuset;
     if (nrThreads > 0)
     {
         if (!lua_istable(L, -1)) {
           lua_pushstring(L,"No table given as second argument");
           lua_error(L);
+          free(cpus);
         }
         for (status = 1; status<=nrThreads; status++)
         {
@@ -1921,6 +1969,7 @@ lua_likwid_startProgram(lua_State* L)
     pid = fork();
     if (pid < 0)
     {
+        free(cpus);
         return 0;
     }
     else if ( pid == 0)
@@ -1940,6 +1989,7 @@ lua_likwid_startProgram(lua_State* L)
     else
     {
         signal(SIGCHLD, catch_sigchild);
+        free(cpus);
         lua_pushnumber(L, pid);
     }
     return 1;
@@ -1982,8 +2032,10 @@ lua_likwid_waitpid(lua_State* L)
     pid_t retpid = waitpid(pid, &status, 0);
     if (pid == retpid)
     {
-        if (WIFEXITED(status))
+        if (WIFEXITED(status) || WIFSIGNALED(status))
+        {
             ret = WEXITSTATUS(status);
+        }
     }
     lua_pushinteger(L, ret);
     return 1;
@@ -2051,6 +2103,37 @@ lua_likwid_pinProcess(lua_State* L)
 }
 
 static int
+lua_likwid_pinThread(lua_State* L)
+{
+    int cpuID = luaL_checknumber(L,-2);
+    int silent = luaL_checknumber(L,-1);
+#ifdef HAS_SCHEDAFFINITY
+    luaL_argcheck(L, cpuID >= 0, 1, "CPU ID must be greater or equal 0");
+    if (affinity_isInitialized == 0)
+    {
+        affinity_init();
+        affinity_isInitialized = 1;
+        affinity = get_affinityDomains();
+    }
+    affinity_pinThread(cpuID);
+    if (!silent)
+    {
+#ifdef COLOR
+            color_on(BRIGHT, COLOR);
+#endif
+            printf("[likwid-pin] PID %lu -> core %d - OK", gettid(), cpuID);
+#ifdef COLOR
+            color_reset();
+#endif
+            printf("\n");
+    }
+#else
+    printf("Pinning of threads is not supported by your system\n")
+#endif
+    return 0;
+}
+
+static int
 lua_likwid_setenv(lua_State* L)
 {
     const char* element = (const char*)luaL_checkstring(L, -2);
@@ -2060,6 +2143,14 @@ lua_likwid_setenv(lua_State* L)
 }
 
 static int
+lua_likwid_unsetenv(lua_State* L)
+{
+    const char* element = (const char*)luaL_checkstring(L, -1);
+    unsetenv(element);
+    return 0;
+}
+
+static int
 lua_likwid_getpid(lua_State* L)
 {
     lua_pushinteger(L, (lua_Integer)(getpid()));
@@ -2402,15 +2493,6 @@ lua_likwid_getCpuClockCurrent(lua_State* L)
 }
 
 static int
-lua_likwid_setCpuClockCurrent(lua_State* L)
-{
-    const int cpu_id = lua_tointeger(L,-2);
-    const unsigned long freq = lua_tointeger(L,-1);
-    lua_pushnumber(L, freq_setCpuClockCurrent(cpu_id, freq));
-    return 1;
-}
-
-static int
 lua_likwid_getCpuClockMin(lua_State* L)
 {
     const int cpu_id = lua_tointeger(L,-1);
@@ -2445,12 +2527,32 @@ lua_likwid_setCpuClockMax(lua_State* L)
 }
 
 static int
+lua_likwid_setTurbo(lua_State* L)
+{
+    const int cpu_id = lua_tointeger(L,-2);
+    const int turbo = lua_tointeger(L,-1);
+    lua_pushnumber(L, freq_setTurbo(cpu_id, turbo));
+    return 1;
+}
+
+static int
+lua_likwid_getTurbo(lua_State* L)
+{
+    const int cpu_id = lua_tointeger(L,-1);
+    lua_pushnumber(L, freq_getTurbo(cpu_id));
+    return 1;
+}
+
+static int
 lua_likwid_getGovernor(lua_State* L)
 {
     const int cpu_id = lua_tointeger(L,-1);
     char *gov = freq_getGovernor(cpu_id);
     if (gov)
+    {
         lua_pushstring(L, gov);
+        free(gov);
+    }
     else
         lua_pushnil(L);
     return 1;
@@ -2471,7 +2573,10 @@ lua_likwid_getAvailFreq(lua_State* L)
     const int cpu_id = lua_tointeger(L,-1);
     char* avail = freq_getAvailFreq(cpu_id);
     if (avail)
+    {
         lua_pushstring(L, avail);
+        free(avail);
+    }
     else
         lua_pushnil(L);
     return 1;
@@ -2489,15 +2594,42 @@ lua_likwid_getAvailGovs(lua_State* L)
     return 1;
 }
 
+
 static int
-lua_likwid_getDriver(lua_State* L)
+lua_likwid_setUncoreFreqMin(lua_State* L)
 {
-    const int cpu_id = lua_tointeger(L,-1);
-    char* drv = freq_getDriver(cpu_id);
-    if (drv)
-        lua_pushstring(L, drv);
-    else
-        lua_pushnil(L);
+    const int socket_id = lua_tointeger(L,-2);
+    const uint64_t freq = lua_tointeger(L,-1);
+    int err = freq_setUncoreFreqMin(socket_id, freq);
+    lua_pushinteger(L, err);
+    return 1;
+}
+
+static int
+lua_likwid_getUncoreFreqMin(lua_State* L)
+{
+    const int socket_id = lua_tointeger(L,-1);
+    uint64_t freq = freq_getUncoreFreqMin(socket_id);
+    lua_pushinteger(L, freq);
+    return 1;
+}
+
+static int
+lua_likwid_setUncoreFreqMax(lua_State* L)
+{
+    const int socket_id = lua_tointeger(L,-2);
+    const uint64_t freq = lua_tointeger(L,-1);
+    int err = freq_setUncoreFreqMax(socket_id, freq);
+    lua_pushinteger(L, err);
+    return 1;
+}
+
+static int
+lua_likwid_getUncoreFreqMax(lua_State* L)
+{
+    const int socket_id = lua_tointeger(L,-1);
+    uint64_t freq = freq_getUncoreFreqMax(socket_id);
+    lua_pushinteger(L, freq);
     return 1;
 }
 
@@ -2688,8 +2820,10 @@ luaopen_liblikwid(lua_State* L){
     lua_register(L, "likwid_memSweepDomain", lua_likwid_memSweepDomain);
     // Pinning functions
     lua_register(L, "likwid_pinProcess", lua_likwid_pinProcess);
+    lua_register(L, "likwid_pinThread", lua_likwid_pinThread);
     // Helper functions
     lua_register(L, "likwid_setenv", lua_likwid_setenv);
+    lua_register(L, "likwid_unsetenv", lua_likwid_unsetenv);
     lua_register(L, "likwid_getpid", lua_likwid_getpid);
     lua_register(L, "likwid_access", lua_likwid_access);
     lua_register(L, "likwid_startProgram", lua_likwid_startProgram);
@@ -2698,6 +2832,7 @@ luaopen_liblikwid(lua_State* L){
     lua_register(L, "likwid_catchSignal", lua_likwid_catch_signal);
     lua_register(L, "likwid_getSignalState", lua_likwid_return_signal_state);
     lua_register(L, "likwid_waitpid", lua_likwid_waitpid);
+    lua_register(L, "likwid_sendSignal", lua_likwid_send_signal);
     // Verbosity functions
     lua_register(L, "likwid_setVerbosity", lua_likwid_setVerbosity);
     // Marker API functions
@@ -2729,7 +2864,6 @@ luaopen_liblikwid(lua_State* L){
     lua_register(L, "likwid_markerRegionMetric", lua_likwid_markerRegionMetric);
     // CPU frequency functions
     lua_register(L, "likwid_getCpuClockCurrent", lua_likwid_getCpuClockCurrent);
-    lua_register(L, "likwid_setCpuClockCurrent", lua_likwid_setCpuClockCurrent);
     lua_register(L, "likwid_getCpuClockMin", lua_likwid_getCpuClockMin);
     lua_register(L, "likwid_setCpuClockMin", lua_likwid_setCpuClockMin);
     lua_register(L, "likwid_getCpuClockMax", lua_likwid_getCpuClockMax);
@@ -2738,7 +2872,12 @@ luaopen_liblikwid(lua_State* L){
     lua_register(L, "likwid_setGovernor", lua_likwid_setGovernor);
     lua_register(L, "likwid_getAvailFreq", lua_likwid_getAvailFreq);
     lua_register(L, "likwid_getAvailGovs", lua_likwid_getAvailGovs);
-    lua_register(L, "likwid_getDriver", lua_likwid_getDriver);
+    lua_register(L, "likwid_setTurbo", lua_likwid_setTurbo);
+    lua_register(L, "likwid_getTurbo", lua_likwid_getTurbo);
+    lua_register(L, "likwid_setUncoreFreqMin", lua_likwid_setUncoreFreqMin);
+    lua_register(L, "likwid_getUncoreFreqMin", lua_likwid_getUncoreFreqMin);
+    lua_register(L, "likwid_setUncoreFreqMax", lua_likwid_setUncoreFreqMax);
+    lua_register(L, "likwid_getUncoreFreqMax", lua_likwid_getUncoreFreqMax);
     // setuid&friends
     lua_register(L, "likwid_getuid", lua_likwid_getuid);
     lua_register(L, "likwid_geteuid", lua_likwid_geteuid);
diff --git a/src/memsweep.c b/src/memsweep.c
index c6debef..4b1243a 100644
--- a/src/memsweep.c
+++ b/src/memsweep.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Implementation of sweeper module.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/numa.c b/src/numa.c
index d8b67c9..1949c18 100644
--- a/src/numa.c
+++ b/src/numa.c
@@ -6,14 +6,14 @@
  *      Description:  Implementation of Linux NUMA interface. Selects between hwloc and
  *                    procfs/sysfs backends.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/numa_hwloc.c b/src/numa_hwloc.c
index 7d7d5b2..ff253e9 100644
--- a/src/numa_hwloc.c
+++ b/src/numa_hwloc.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Interface to hwloc for NUMA topology
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -219,6 +219,7 @@ hwloc_numa_init(void)
     int d;
     int depth;
     int cores_per_socket;
+    int numPUs = 0;
     hwloc_obj_t obj;
     const struct hwloc_distances_s* distances;
     hwloc_obj_type_t hwloc_type = HWLOC_OBJ_NODE;
@@ -232,6 +233,7 @@ hwloc_numa_init(void)
     }
 
     numa_info.numberOfNodes = likwid_hwloc_get_nbobjs_by_type(hwloc_topology, hwloc_type);
+    numPUs = likwid_hwloc_get_nbobjs_by_type(hwloc_topology, HWLOC_OBJ_PU);
 
     /* If the amount of NUMA nodes == 0, there is actually no NUMA node, hence
        aggregate all sockets in the system into the single virtually created NUMA node */
@@ -250,11 +252,11 @@ hwloc_numa_init(void)
         numa_info.nodes[0].numberOfProcessors = 0;
         numa_info.nodes[0].totalMemory = getTotalNodeMem(0);
         numa_info.nodes[0].freeMemory = getFreeNodeMem(0);
-        numa_info.nodes[0].processors = (uint32_t*) malloc(MAX_NUM_THREADS * sizeof(uint32_t));
+        numa_info.nodes[0].processors = (uint32_t*) malloc(numPUs * sizeof(uint32_t));
         if (!numa_info.nodes[0].processors)
         {
             fprintf(stderr,"No memory to allocate %ld byte for processors array of NUMA node %d\n",
-                    MAX_NUM_THREADS * sizeof(uint32_t),0);
+                    numPUs * sizeof(uint32_t),0);
             return -1;
         }
         numa_info.nodes[0].distances = (uint32_t*) malloc(sizeof(uint32_t));
@@ -308,11 +310,11 @@ hwloc_numa_init(void)
             }
             /* freeMemory not detected by hwloc, do it the native way */
             numa_info.nodes[i].freeMemory = getFreeNodeMem(numa_info.nodes[i].id);
-            numa_info.nodes[i].processors = (uint32_t*) malloc(MAX_NUM_THREADS * sizeof(uint32_t));
+            numa_info.nodes[i].processors = (uint32_t*) malloc(numPUs * sizeof(uint32_t));
             if (!numa_info.nodes[i].processors)
             {
                 fprintf(stderr,"No memory to allocate %ld byte for processors array of NUMA node %d\n",
-                        MAX_NUM_THREADS * sizeof(uint32_t), i);
+                        numPUs * sizeof(uint32_t), i);
                 return -1;
             }
             d = 0;
diff --git a/src/numa_proc.c b/src/numa_proc.c
index a0d0583..46840c4 100644
--- a/src/numa_proc.c
+++ b/src/numa_proc.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Get NUMA topology from procfs and sysfs
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -174,7 +174,7 @@ nodeProcessorList(int node, uint32_t** list)
 //    int unitSize = (int) (sizeof(unsigned long)*8);
     int unitSize = (int) 32; /* 8 nibbles */
 
-    *list = (uint32_t*) malloc(MAX_NUM_THREADS * sizeof(uint32_t));
+    *list = (uint32_t*) malloc(cpuid_topology.numHWThreads * sizeof(uint32_t));
     if (!(*list))
     {
         return -ENOMEM;
@@ -210,7 +210,7 @@ nodeProcessorList(int node, uint32_t** list)
                 {
                     if (val&(1UL<<j))
                     {
-                        if (count < MAX_NUM_THREADS)
+                        if (count < cpuid_topology.numHWThreads)
                         {
                             (*list)[count] = (j+cursor);
                         }
@@ -295,7 +295,6 @@ int proc_numa_init(void)
     int err = 0;
     uint32_t i;
     uint64_t nrCPUs = 0;
-
     if (numaInitialized > 0 || numa_info.numberOfNodes > 0)
         return 0;
 
@@ -336,7 +335,6 @@ int proc_numa_init(void)
         numa_info.nodes[i].numberOfProcessors = 0;
         numa_info.nodes[i].numberOfDistances = nodeDistanceList(i, numa_info.numberOfNodes, &numa_info.nodes[i].distances);
     }
-
     if (err == 0)
         numaInitialized = 1;
     return err;
diff --git a/src/pci_hwloc.c b/src/pci_hwloc.c
index 4a1226f..fb7431a 100644
--- a/src/pci_hwloc.c
+++ b/src/pci_hwloc.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Interface to hwloc for PCI device lookup
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -42,6 +42,9 @@
 #include <topology.h>
 #include <topology_hwloc.h>
 #include <error.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 /* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
 
@@ -84,3 +87,83 @@ hwloc_pci_init(uint16_t testDevice, char** socket_bus, int* nrSockets)
     return 0;
 }
 
+#define SKYLAKE_SERVER_SOCKETID_MBOX_DID 0x2042
+
+int sysfs_pci_init(uint16_t testDevice, char** socket_bus, int* nrSockets)
+{
+    struct dirent *pDirent, *pDirentInner;
+    DIR *pDir, *pDirInner;
+    pDir = opendir ("/sys/devices");
+    FILE* fp = NULL;
+    char iPath[200], iiPath[200], buff[100];
+    char testDev[50];
+    size_t ret = 0;
+    int nrSocks = 0;
+    if (pDir == NULL)
+    {
+        fprintf(stderr, "Cannot read /sys/devices\n");
+        return 1;
+    }
+
+    while ((pDirent = readdir(pDir)) != NULL)
+    {
+        //printf ("[%s]\n", pDirent->d_name);
+        if (strncmp(pDirent->d_name, "pci0", 4) == 0)
+        {
+            sprintf(iPath, "/sys/devices/%s", pDirent->d_name);
+            char bus[4];
+            strncpy(bus, &(pDirent->d_name[strlen(pDirent->d_name)-2]), 2);
+            bus[2] = '/';
+            bus[3] = '\0';
+            //printf("PATH %s\n", iPath);
+            pDirInner = opendir (iPath);
+            if (pDir == NULL)
+            {
+                fprintf(stderr, "Cannot read %s\n", iPath);
+                return 1;
+            }
+            while ((pDirentInner = readdir(pDirInner)) != NULL)
+            {
+                if (strncmp(pDirentInner->d_name, "0000", 4) == 0)
+                {
+                    uint32_t dev_id = 0x0;
+                    int numa_node = 0;
+                    sprintf(iiPath, "/sys/devices/%s/%s/device", pDirent->d_name, pDirentInner->d_name);
+                    fp = fopen(iiPath,"r");
+                    if( fp == NULL )
+                    {
+                        continue;
+                    }
+                    ret = fread(buff, sizeof(char), 99, fp);
+                    dev_id = strtoul(buff, NULL, 16);
+                    if (dev_id == SKYLAKE_SERVER_SOCKETID_MBOX_DID)
+                    {
+                        fclose(fp);
+                        iiPath[0] = '\0';
+                        sprintf(iiPath, "/sys/devices/%s/%s/numa_node", pDirent->d_name, pDirentInner->d_name);
+                        fp = fopen(iiPath,"r");
+                        if( fp == NULL )
+                        {
+                            continue;
+                        }
+                        ret = fread(buff, sizeof(char), 99, fp);
+                        numa_node = atoi(buff);
+                        socket_bus[numa_node] = (char*)malloc(4);
+                        sprintf(socket_bus[numa_node], "%02x/", bus);
+                        nrSocks++;
+                    }
+                    fclose(fp);
+                    iiPath[0] = '\0';
+                    buff[0] = '\0';
+                }
+            }
+            closedir (pDirInner);
+            iPath[0] = '\0';
+        }
+    }
+    closedir (pDir);
+    *nrSockets = nrSocks;
+    return 0;
+}
+
+
diff --git a/src/pci_proc.c b/src/pci_proc.c
index dcce425..d9ffdc1 100644
--- a/src/pci_proc.c
+++ b/src/pci_proc.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Interface to procfs/sysfs for PCI device lookup
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/perfgroup.c b/src/perfgroup.c
index 23602fd..8f9f5a5 100644
--- a/src/perfgroup.c
+++ b/src/perfgroup.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Handler for performance groups and event sets
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -43,11 +43,45 @@
 
 #include <error.h>
 #include <perfgroup.h>
-#include <calculator.h>
 #include <likwid.h>
 
+#include <lua.h>
+#include <lauxlib.h>
+#include <lualib.h>
+#include <math.h>
+
+
+char* in_func_str = "require('math');function SUM(...);local s = 0;for k,v in pairs({...}) do;s = s + v;end;return s;end;function ARGS(...) return #arg end;function AVG(...) return SUM(...)/ARGS(...) end;MEAN = AVG;function MIN(...) return math.min(...) end;function MAX(...) return math.max(...) end;function MEDIAN(...);local x = {...};local l = ARGS(...);table.sort(x);return x[math.floor(l/2)];end;function PERCENTILE(perc, ...);local x = {...};local xlen = #x;table.sort(x);local idx = m [...]
+char* in_expand_str = "function expand_str(x); hist = {}; runs = 0; for pref, elem in x:gmatch('([%a%d]*)%[([%d,]+)%]') do;  runs = runs + 1;  matches = {};  for num in elem:gmatch('%d+') do;   for _,v in pairs(varlist) do; if v:match(string.format('.*%s%s.*', pref, num)) then;  if not hist[v] then;   hist[v] = 1;  else;   hist[v] = hist[v] + 1; end; end; end;  end; end; res = {}; for k,v in pairs(hist) do;  if v == runs then table.insert(res, k) end; end; return table.concat(res, ',');e [...]
+char* in_user_func_str = NULL;
+
+char* not_allowed[] = {"io.", "popen(", "load", "get", "set", "call(", "require", "module", NULL};
+
+lua_State** lua_states = NULL;
+int num_states = 0;
+char** defines = NULL;
+bstring *bdefines = NULL;
+int* num_defines = NULL;
+bstring bglob_defines;
+bstring bglob_defines_list;
+
 static int totalgroups = 0;
 
+/* #####   FUNCTION DEFINITIONS  -  INTERNAL FUNCTIONS   ################## */
+
+static inline void *realloc_buffer(void *ptrmem, size_t size) {
+    void *ptr = realloc(ptrmem, size);
+    if (!ptr)  {
+        fprintf(stderr, "realloc(%p, %lu): errno=%d\n", ptrmem, size, errno);
+        free (ptrmem);
+    }
+    if (!ptrmem)
+    {
+        memset(ptr, 0, size);
+    }
+    return ptr;
+}
+
 /* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
 
 int
@@ -611,7 +645,6 @@ int custom_group(const char* eventStr, GroupInfo* ginfo)
     eventBstr = bfromcstr(eventStr);
     eventList = bsplit(eventBstr, delim);
     ginfo->nevents = eventList->qty;
-
     if (cpuid_info.isIntel)
     {
         if (binstr(eventBstr, 0, fix0) > 0)
@@ -692,7 +725,7 @@ int custom_group(const char* eventStr, GroupInfo* ginfo)
     i = eventList->qty;
     if (cpuid_info.isIntel)
     {
-        if (!has_fix0)
+        if ((!has_fix0) && cpuid_info.perf_num_fixed_ctr > 0)
         {
             ginfo->events[i] = malloc(18 * sizeof(char));
             ginfo->counters[i] = malloc(6 * sizeof(char));
@@ -700,7 +733,7 @@ int custom_group(const char* eventStr, GroupInfo* ginfo)
             sprintf(ginfo->counters[i], "%s", "FIXC0");
             i++;
         }
-        if (!has_fix1)
+        if ((!has_fix1) && cpuid_info.perf_num_fixed_ctr > 1)
         {
             ginfo->events[i] = malloc(22 * sizeof(char));
             ginfo->counters[i] = malloc(6 * sizeof(char));
@@ -708,7 +741,7 @@ int custom_group(const char* eventStr, GroupInfo* ginfo)
             sprintf(ginfo->counters[i], "%s", "FIXC1");
             i++;
         }
-        if (!has_fix2)
+        if ((!has_fix2) && cpuid_info.perf_num_fixed_ctr > 2)
         {
             ginfo->events[i] = malloc(21 * sizeof(char));
             ginfo->counters[i] = malloc(6 * sizeof(char));
@@ -717,7 +750,6 @@ int custom_group(const char* eventStr, GroupInfo* ginfo)
             i++;
         }
     }
-
     bstrListDestroy(eventList);
     bdestroy(fix0);
     bdestroy(fix1);
@@ -748,7 +780,7 @@ read_group(
 {
     FILE* fp;
     int i, s, e, err = 0;
-    char buf[512];
+    char buf[1024];
     GroupFileSections sec = GROUP_NONE;
     bstring REQUIRE = bformat("REQUIRE_NOHT");
     if ((grouppath == NULL)||(architecture == NULL)||(groupname == NULL)||(ginfo == NULL))
@@ -770,6 +802,7 @@ read_group(
         }
         else
         {
+            bdestroy(fullpath);
             fullpath = bstrcpy(homepath);
         }
     }
@@ -784,6 +817,7 @@ read_group(
     ginfo->metricformulas = NULL;
     ginfo->metricnames = NULL;
     ginfo->longinfo = NULL;
+    ginfo->lua_funcs = NULL;
     ginfo->groupname = (char*)malloc((strlen(groupname)+10)*sizeof(char));
     if (ginfo->groupname == NULL)
     {
@@ -803,7 +837,7 @@ read_group(
         return -EACCES;
     }
     struct bstrList * linelist;
-    while (fgets (buf, sizeof(buf), fp)) {
+    while (fgets (buf, 1023*sizeof(char), fp)) {
         if ((strlen(buf) == 0) || (buf[0] == '#'))
             continue;
 
@@ -844,6 +878,11 @@ read_group(
             sec = GROUP_LONG;
             continue;
         }
+        else if (strncmp(groupFileSectionNames[GROUP_LUA], buf, strlen(groupFileSectionNames[GROUP_LUA])) == 0)
+        {
+            sec = GROUP_LUA;
+            continue;
+        }
         if (sec == GROUP_NONE)
             continue;
         if (sec == GROUP_EVENTSET)
@@ -1054,6 +1093,24 @@ read_group(
             sprintf(&(ginfo->longinfo[s]), "%.*s", (int)strlen(buf), buf);
             continue;
         }
+        else if (sec == GROUP_LUA)
+        {
+            s = (ginfo->lua_funcs == NULL ? 0 : strlen(ginfo->lua_funcs));
+            char *tmp;
+            tmp = realloc(ginfo->lua_funcs, (s + strlen(buf) + 3) * sizeof(char));
+            if (tmp == NULL)
+            {
+                free(ginfo->lua_funcs);
+                err = -ENOMEM;
+                goto cleanup;
+            }
+            else
+            {
+                ginfo->lua_funcs = tmp;
+            }
+            sprintf(&(ginfo->lua_funcs[s]), "%.*s", (int)strlen(buf), buf);
+            continue;
+        }
     }
     //bstrListDestroy(linelist);
     fclose(fp);
@@ -1071,6 +1128,8 @@ cleanup:
         free(ginfo->shortinfo);
     if (ginfo->longinfo)
         free(ginfo->longinfo);
+    if (ginfo->lua_funcs)
+        free(ginfo->lua_funcs);
     if (ginfo->nevents > 0)
     {
         for(i=0;i<ginfo->nevents; i++)
@@ -1349,120 +1408,327 @@ return_group(GroupInfo* ginfo)
     ginfo->nmetrics = 0;
 }
 
-void
-init_clist(CounterList* clist)
+
+int calc_add_to_varlist(char* name, bstring bvarlist)
 {
-    clist->counters = 0;
-    clist->cnames = NULL;
-    clist->cvalues = NULL;
+    int ret = 0;
+    if (!name)
+        return -EINVAL;
+    bstring bname = bformat("\"%s\"", name);
+    if (blength(bvarlist) > 0)
+        bcatcstr(bvarlist, ",");
+    ret = bconcat(bvarlist, bname);
+    bdestroy(bname);
+    return ret;
 }
 
-int
-add_to_clist(CounterList* clist, char* counter, double result)
+int calc_add_str_var(char* name, char* value, bstring vars, bstring varlist)
 {
-    char** tmpnames;
-    double* tmpvalues;
-    if ((clist == NULL)||(counter == NULL))
-        return -EINVAL;
-    tmpnames = realloc(clist->cnames, (clist->counters + 1) * sizeof(char*));
-    if (tmpnames == NULL)
-    {
-        return -ENOMEM;
-    }
-    clist->cnames = tmpnames;
-    tmpvalues = realloc(clist->cvalues, (clist->counters + 1) * sizeof(double));
-    if (tmpvalues == NULL)
+    int ret = 0;
+    bstring add = bformat("%s = %s\n", name, value);
+    ret = bconcat(vars, add);
+    if (ret == BSTR_OK)
+        ret = calc_add_to_varlist(name, varlist);
+    bdestroy(add);
+    return ret;
+}
+
+int calc_add_dbl_var(char* name, double value, bstring bvars, bstring varlist)
+{
+    int ret = 0;
+    bstring add = bformat("%s = %20.20f\n", name, value);
+    ret = bconcat(bvars, add);
+    if (ret == BSTR_OK)
+        ret = calc_add_to_varlist(name, varlist);
+    bdestroy(add);
+    return ret;
+}
+
+int calc_add_int_var(char* name, int value, bstring bvars, bstring varlist)
+{
+    int ret = 0;
+    bstring add = bformat("%s = %d\n", name, value);
+    ret = bconcat(bvars, add);
+    if (ret == BSTR_OK)
+        ret = calc_add_to_varlist(name, varlist);
+    bdestroy(add);
+    return ret;
+}
+
+static int _calc_add_def(bstring add, int cpu)
+{
+    int ret = 0;
+    if (cpu < 0)
     {
-        return -ENOMEM;
+        ret = bconcat(bglob_defines, add);
     }
-    clist->cvalues = tmpvalues;
-    clist->cnames[clist->counters] = malloc((strlen(counter)+2)*sizeof(char));
-    if (clist->cnames[clist->counters] == NULL)
+    else
     {
-        return -ENOMEM;
+        ret = bconcat(bdefines[cpu], add);
     }
-    sprintf(clist->cnames[clist->counters],"%s", counter);
-    clist->cvalues[clist->counters] = result;
-    clist->counters++;
-    return 0;
+    return ret;
 }
 
-int
-update_clist(CounterList* clist, char* counter, double result)
+// cpu == -1 means global definition
+int calc_add_dbl_def(char* name, double value, int cpu)
 {
-    int i;
-    int found = 0;
-    if ((clist == NULL)||(counter == NULL))
+    int ret = 0;
+    bstring add = bformat("%s = %20.20f\n", name, value);
+    ret = _calc_add_def(add, cpu);
+    if (!ret)
+        ret = calc_add_to_varlist(name, bglob_defines_list);
+    bdestroy(add);
+    return ret;
+}
+
+// cpu == -1 means global definition
+int calc_add_int_def(char* name, int value, int cpu)
+{
+    int ret = 0;
+    bstring add = bformat("%s = %d\n", name, value);
+    ret = _calc_add_def(add, cpu);
+    if (!ret)
+        ret = calc_add_to_varlist(name, bglob_defines_list);
+    bdestroy(add);
+    return ret;
+}
+
+// cpu == -1 means global definition
+int calc_add_str_def(char* name, char* value, int cpu)
+{
+    int ret = 0;
+    bstring add = bformat("%s = %s\n", name, value);
+    ret = _calc_add_def(add, cpu);
+    if (!ret)
+        ret = calc_add_to_varlist(name, bglob_defines_list);
+    bdestroy(add);
+    return ret;
+}
+
+
+int calc_set_user_funcs(char* s)
+{
+    if (!s)
         return -EINVAL;
-    for (i=0; i< clist->counters; i++)
+    if (in_user_func_str)
+        free(in_user_func_str);
+
+    int i = 0;
+    while (not_allowed[i])
     {
-        if (strcmp(clist->cnames[i], counter) == 0)
+        char* p = strstr(s, not_allowed[i]);
+        if (p)
         {
-            clist->cvalues[i] = result;
-            found = 1;
-            break;
+            fprintf(stderr, "ERROR: User function string contains invalid commands\n");
+            return -EINVAL;
         }
+        i++;
+    }
+
+    // test user given functions
+    lua_State *L = luaL_newstate();
+    luaL_openlibs(L);
+    in_user_func_str = NULL;
+    int ret = luaL_dostring (L, s);
+    lua_close(L);
+    if (ret)
+    {
+        fprintf(stderr, "WARN: Defined functions not valid Lua\n");
+        return 1;
     }
-    if (!found)
+    else
     {
-        return -ENOENT;
+        ret = asprintf(&in_user_func_str, "%s", s);
+        if (ret < 0)
+            return ret;
     }
     return 0;
 }
 
-void
-destroy_clist(CounterList* clist)
+static double do_calc(int cpu, char* s, bstring vars)
 {
-    int i;
-    if (clist != NULL)
+    double res = NAN;
+    int ret = 0;
+    char* t = NULL;
+    lua_State *L = lua_states[cpu];
+    if (!L)
     {
-        for (i=0;i<clist->counters;i++)
-        {
-            free(clist->cnames[i]);
-        }
-        free(clist->cnames);
-        free(clist->cvalues);
+        L = luaL_newstate();
+        luaL_openlibs(L);
+        lua_states[cpu] = L;
+    }
+    bstring scratch = bfromcstr(in_func_str);
+    bcatcstr(scratch, "\n");
+    if (blength(bglob_defines) > 0)
+    {
+        bconcat(scratch, bglob_defines);
+    }
+    if (bdefines[cpu])
+    {
+        bconcat(scratch, bdefines[cpu]);
+        bcatcstr(scratch, "\n");
     }
+    if (in_user_func_str)
+    {
+        bcatcstr(scratch, in_user_func_str);
+        bcatcstr(scratch, "\n");
+    }
+    if (blength(vars) > 0)
+    {
+        bconcat(scratch, vars);
+        bcatcstr(scratch, "\n");
+    }
+
+    bcatcstr(scratch, "return ");
+    bcatcstr(scratch, s);
+    bcatcstr(scratch, "\n");
+
+    ret = luaL_dostring (L, bdata(scratch));
+    if (!ret)
+    {
+        if (strncmp(luaL_typename(L, -1), "number", 6) == 0)
+            res = lua_tonumber(L, -1);
+    }
+    bdestroy(scratch);
+
+    return res;
 }
 
+static char* do_expand(int cpu, char* f, bstring varlist)
+{
+    int ret = 0;
+    char* out = NULL;
+    char* t = NULL;
+
+    lua_State *L = lua_states[cpu];
+    if (!L)
+    {
+        L = luaL_newstate();
+        luaL_openlibs(L);
+        lua_states[cpu] = L;
+    }
+    bstring scratch = bformat("varlist={%s,%s}\n%s\nreturn eval_str(\"%s\")", bdata(bglob_defines_list), bdata(varlist), in_expand_str, f);
+    if (ret < 0)
+    {
+        return NULL;
+    }
+    ret = luaL_dostring (L, bdata(scratch));
+    if (!ret)
+    {
+        out = (char*)lua_tostring(L, -1);
+    }
+    bdestroy(scratch);
+    return out;
+}
+
+
+
 int
-calc_metric(char* formula, CounterList* clist, double *result)
+calc_metric(int cpu, char* formula, bstring vars, bstring varlist, double *result)
 {
     int i=0;
-    *result = 0.0;
+    char* f;
     int maxstrlen = 0, minstrlen = 10000;
+    char buf[128];
 
-    if ((formula == NULL) || (clist == NULL))
+    if ((formula == NULL) ||
+        (result == NULL) ||
+        (cpu < 0) ||
+        (cpu > cpuid_topology.numHWThreads) ||
+        (vars == NULL) ||
+        (varlist == NULL))
+        return -EINVAL;
+    if (strlen(formula) == 0 || blength(vars) == 0 || blength(varlist) == 0)
         return -EINVAL;
+    *result = NAN;
 
-    bstring f = bfromcstr(formula);
-    for(i=0;i<clist->counters;i++)
+/*    if (strchr(formula, '[') != NULL)*/
+/*    {*/
+/*        f = do_expand(cpu, formula, varlist);*/
+/*        if (f)*/
+/*        {*/
+/*            *result = do_calc(cpu, f, vars);*/
+/*            return 0;*/
+/*        }*/
+/*    }*/
+/*    else*/
+/*    {*/
+        *result = do_calc(cpu, formula, vars);
+        return 0;
+/*    }*/
+
+    return 1;
+}
+
+void __attribute__((constructor (103))) init_perfgroup(void)
+{
+    int ret = 0;
+    topology_init();
+    CpuTopology_t cputopo = get_cpuTopology();
+    CpuInfo_t cpuinfo = get_cpuInfo();
+    int cpus = cputopo->numHWThreads;
+    lua_states = (lua_State**)malloc(cpus * sizeof(lua_State*));
+    if (lua_states)
     {
-        if (strlen(clist->cnames[i]) > maxstrlen)
-            maxstrlen = strlen(clist->cnames[i]);
-        if (strlen(clist->cnames[i]) < minstrlen)
-            minstrlen = strlen(clist->cnames[i]);
+        memset(lua_states, 0, cpus * sizeof(lua_State*));
     }
+    num_states = cpus;
+    bdefines = (bstring*)malloc(cpus * sizeof(bstring));
+    if (bdefines)
+    {
+        memset(bdefines, 0, cpus * sizeof(bdefines));
+        for (int i = 0; i < cpus; i++)
+        {
+            bdefines[i] = bformat("");
+            calc_add_int_def("CPUID", cputopo->threadPool[i].apicId, cputopo->threadPool[i].apicId);
+        }
+    }
+    num_defines = (int*)malloc(cpus * sizeof(int));
+    if (num_defines)
+    {
+        memset(num_defines, 0, cpus * sizeof(int));
+    }
+    bglob_defines = bformat("");
+    bglob_defines_list = bformat("");
+    calc_add_str_def("TRUE", "true", -1);
+    calc_add_str_def("FALSE", "false", -1);
+    calc_add_int_def("CPU_COUNT", cpus, -1);
+    calc_add_int_def("CPU_ACTIVE", cputopo->activeHWThreads, -1);
+    calc_add_int_def("SOCKET_COUNT", cputopo->numSockets, -1);
+    calc_add_int_def("CORES_PER_SOCKET", cputopo->numCoresPerSocket, -1);
+    calc_add_int_def("CPUS_PER_CORE", cputopo->numThreadsPerCore, -1);
+    for (int i= 0; i < cputopo->numCacheLevels; i++)
+    {
+        char name[100];
+        snprintf(name, 99, "L%d_SIZE", cputopo->cacheLevels[i].level);
+        calc_add_int_def(name, cputopo->cacheLevels[i].size, -1);
+        snprintf(name, 99, "L%d_LINESIZE", cputopo->cacheLevels[i].level);
+        calc_add_int_def(name, cputopo->cacheLevels[i].lineSize, -1);
+    }
+    calc_add_int_def("MEM_LINESIZE", 64, -1);
+}
 
-    // try to replace each counter name in clist
-    while (maxstrlen >= minstrlen)
+void __attribute__((destructor (103))) close_perfgroup(void)
+{
+    if (lua_states && num_states > 0)
     {
-        for(i=0;i<clist->counters;i++)
+        for (int i = 0; i < num_states; i++)
         {
-            if (strlen(clist->cnames[i]) != maxstrlen)
-                continue;
-            // if we find the counter name, replace it with the value
-            bstring c = bfromcstr(clist->cnames[i]);
-            bstring v = bformat("%.20f", clist->cvalues[i]);
-            bfindreplace(f, c, v, 0);
-            bdestroy(c);
-            bdestroy(v);
+            if (lua_states[i])
+                lua_close(lua_states[i]);
         }
-        maxstrlen--;
+        free(lua_states);
     }
-    // now we can calculate the formula
-    i = calculate_infix(bdata(f), result);
-    bdestroy(f);
-    return i;
+    for (int i = 0; i < num_states; i++)
+    {
+        if (bdefines[i])
+        {
+            bdestroy(bdefines[i]);
+            num_defines[i] = 0;
+        }
+    }
+    bdestroy(bglob_defines_list);
+    bdestroy(bglob_defines);
+    free(num_defines);
 }
 
diff --git a/src/perfmon.c b/src/perfmon.c
index 413813f..4f76e0d 100644
--- a/src/perfmon.c
+++ b/src/perfmon.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Main implementation of the performance monitoring module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -71,6 +71,7 @@
 #include <perfmon_goldmont.h>
 #include <perfmon_broadwell.h>
 #include <perfmon_skylake.h>
+#include <perfmon_zen.h>
 
 #ifdef LIKWID_USE_PERFEVENT
 #include <perfmon_perfevent.h>
@@ -82,13 +83,15 @@ PerfmonEvent* eventHash = NULL;
 RegisterMap* counter_map = NULL;
 BoxMap* box_map = NULL;
 PciDevice* pci_devices = NULL;
+char** translate_types = NULL;
+
 int perfmon_numCounters = 0;
 int perfmon_numCoreCounters = 0;
 int perfmon_numArchEvents = 0;
 int perfmon_initialized = 0;
 int perfmon_verbosity = DEBUGLEV_ONLY_ERROR;
 int maps_checked = 0;
-uint64_t currentConfig[MAX_NUM_THREADS][NUM_PMC] = { 0 };
+uint64_t **currentConfig = NULL;
 
 PerfmonGroupSet* groupSet = NULL;
 LikwidResults* markerResults = NULL;
@@ -128,6 +131,22 @@ char* eventOptionTypeName[NUM_EVENT_OPTIONS] = {
     "OCCUPANCY_INVERT",
     "IN_TRANSACTION",
     "IN_TRANSACTION_ABORTED"
+#ifdef LIKWID_USE_PERFEVENT
+    ,"PERF_PID"
+    ,"PERF_FLAGS"
+#endif
+};
+
+char* default_translate_types[NUM_UNITS] = {
+    [FIXED] = "/sys/bus/event_source/devices/cpu",
+    [PMC] = "/sys/bus/event_source/devices/cpu",
+    [MBOX0] = "/sys/bus/event_source/devices/uncore_imc",
+    [CBOX0] = "/sys/bus/event_source/devices/uncore_cbox_0",
+    [CBOX1] = "/sys/bus/event_source/devices/uncore_cbox_1",
+    [CBOX2] = "/sys/bus/event_source/devices/uncore_cbox_2",
+    [CBOX3] = "/sys/bus/event_source/devices/uncore_cbox_3",
+    [UBOX] = "/sys/bus/event_source/devices/uncore_arb",
+    [POWER] = "/sys/bus/event_source/devices/power",
 };
 
 /* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
@@ -170,10 +189,10 @@ checkAccess(bstring reg, RegisterIndex index, RegisterType oldtype, int force)
         }
     }
 
-    if (type == PMC && (index - firstpmcindex) > cpuid_info.perf_num_ctr)
+    if (cpuid_info.isIntel && type == PMC && (index - firstpmcindex) >= cpuid_info.perf_num_ctr)
     {
         fprintf(stderr,
-                "WARNING: Counter %s is only available with deactivated HyperThreading. Counter results defaults to 0.\n",
+                "WARN: Counter %s is only available with deactivated HyperThreading. Counter results defaults to 0.\n",
                 bdata(reg));
         return NOTYPE;
     }
@@ -238,11 +257,16 @@ checkAccess(bstring reg, RegisterIndex index, RegisterType oldtype, int force)
         }
         if ((check_settings) && (tmp != 0x0ULL))
         {
-            if (force == 1)
+            if (force == 1 || groupSet->numberOfGroups >= 1)
             {
                 DEBUG_PRINT(DEBUGLEV_DETAIL, Counter %s has bits set (0x%llx) but we are forced to overwrite them,
                                              counter_map[index].key, LLU_CAST tmp);
-                err = HPMwrite(testcpu, counter_map[index].device, reg, 0x0ULL);
+/*                err = HPMwrite(testcpu, counter_map[index].device, reg, 0x0ULL);*/
+/*                for (int i = 0; i < groupSet->numberOfThreads; i++)*/
+/*                {*/
+/*                    int cpu_id = groupSet->threads[i].processorId;*/
+/*                    currentConfig[cpu_id][index] = 0x0ULL;*/
+/*                }*/
             }
             else if ((force == 0) && ((type != FIXED)&&(type != THERMAL)&&(type != POWER)&&(type != WBOX0FIX)))
             {
@@ -305,10 +329,6 @@ getEvent(bstring event_str, bstring counter_str, PerfmonEvent* event)
     {
         if (biseqcstr(event_str, eventHash[i].name))
         {
-            if (!checkCounter(counter_str, eventHash[i].limit))
-            {
-                continue;
-            }
             *event = eventHash[i];
             ret = TRUE;
             break;
@@ -364,7 +384,6 @@ parseOptions(struct bstrList* tokens, PerfmonEvent* event, RegisterIndex index)
     {
         event->options[i].type = EVENT_OPTION_NONE;
     }
-
     if (tokens->qty-2 > MAX_EVENT_OPTIONS)
     {
         return -ERANGE;
@@ -419,6 +438,7 @@ parseOptions(struct bstrList* tokens, PerfmonEvent* event, RegisterIndex index)
             }
             else
             {
+                fprintf(stderr, "WARN: Option '%s' unknown, skipping option\n", bdata(subtokens->entry[0]));
                 continue;
             }
             event->options[event->numberOfOptions].value = 0;
@@ -500,8 +520,21 @@ parseOptions(struct bstrList* tokens, PerfmonEvent* event, RegisterIndex index)
                 event->numberOfOptions = assignOption(event, subtokens->entry[1],
                                     event->numberOfOptions, EVENT_OPTION_OCCUPANCY_FILTER, 0);
             }
+#ifdef LIKWID_USE_PERFEVENT
+            else if (biseqcstr(subtokens->entry[0], "perf_pid") == 1)
+            {
+                event->numberOfOptions = assignOption(event, subtokens->entry[1],
+                                    event->numberOfOptions, EVENT_OPTION_PERF_PID, 0);
+            }
+            else if (biseqcstr(subtokens->entry[0], "perf_flags") == 1)
+            {
+                event->numberOfOptions = assignOption(event, subtokens->entry[1],
+                                    event->numberOfOptions, EVENT_OPTION_PERF_FLAGS, 0);
+            }
+#endif
             else
             {
+                fprintf(stderr, "WARN: Option '%s' unknown, skipping option\n", bdata(subtokens->entry[0]));
                 continue;
             }
         }
@@ -509,7 +542,11 @@ parseOptions(struct bstrList* tokens, PerfmonEvent* event, RegisterIndex index)
     }
     for(i=event->numberOfOptions-1;i>=0;i--)
     {
+#ifdef LIKWID_USE_PERFEVENT
+        if (event->options[i].type != EVENT_OPTION_PERF_PID && event->options[i].type != EVENT_OPTION_PERF_FLAGS && !(OPTIONS_TYPE_MASK(event->options[i].type) & (counter_map[index].optionMask|event->optionMask)))
+#else
         if (!(OPTIONS_TYPE_MASK(event->options[i].type) & (counter_map[index].optionMask|event->optionMask)))
+#endif
         {
             DEBUG_PRINT(DEBUGLEV_INFO,Removing Option %s not valid for register %s,
                         eventOptionTypeName[event->options[i].type],
@@ -608,6 +645,7 @@ calculateResult(int groupId, int eventId, int threadId)
         {
             result += (double) ((counter->overflows-1) * maxValue);
         }
+        counter->overflows = 0;
     }
     if (counter_map[event->index].type == POWER)
     {
@@ -679,7 +717,9 @@ perfmon_check_counter_map(int cpu_id)
         {
             startpmcindex = i;
         }
-        if (counter_map[i].type == PMC && (counter_map[i].index - counter_map[startpmcindex].index) >= cpuid_info.perf_num_ctr)
+        if (cpuid_info.isIntel &&
+            counter_map[i].type == PMC &&
+            (counter_map[i].index - counter_map[startpmcindex].index) >= cpuid_info.perf_num_ctr)
         {
             counter_map[i].type = NOTYPE;
             counter_map[i].optionMask = 0x0ULL;
@@ -758,6 +798,7 @@ perfmon_init_maps(void)
                     counter_map = pm_counter_map;
                     box_map = pm_box_map;
                     perfmon_numCounters = perfmon_numCounters_pm;
+                    translate_types = default_translate_types;
                     break;
 
                 case ATOM_45:
@@ -769,6 +810,7 @@ perfmon_init_maps(void)
                     counter_map = core2_counter_map;
                     perfmon_numCounters = perfmon_numCountersCore2;
                     box_map = core2_box_map;
+                    translate_types = default_translate_types;
                     break;
 
                 case ATOM_SILVERMONT_E:
@@ -783,15 +825,19 @@ perfmon_init_maps(void)
                     box_map = silvermont_box_map;
                     perfmon_numCounters = perfmon_numCountersSilvermont;
                     perfmon_numCoreCounters = perfmon_numCoreCountersSilvermont;
+                    translate_types = default_translate_types;
                     break;
 
                 case ATOM_SILVERMONT_GOLD:
+                case ATOM_DENVERTON:
+                case ATOM_GOLDMONT_PLUS:
                     eventHash = goldmont_arch_events;
                     perfmon_numArchEvents = perfmon_numArchEventsGoldmont;
                     counter_map = goldmont_counter_map;
                     box_map = goldmont_box_map;
                     perfmon_numCounters = perfmon_numCountersGoldmont;
                     perfmon_numCoreCounters = perfmon_numCoreCountersGoldmont;
+                    translate_types = default_translate_types;
                     break;
 
                 case CORE_DUO:
@@ -806,6 +852,7 @@ perfmon_init_maps(void)
                     counter_map = core2_counter_map;
                     perfmon_numCounters = perfmon_numCountersCore2;
                     box_map = core2_box_map;
+                    translate_types = default_translate_types;
                     break;
 
                 case NEHALEM_EX:
@@ -814,6 +861,7 @@ perfmon_init_maps(void)
                     counter_map = nehalemEX_counter_map;
                     perfmon_numCounters = perfmon_numCountersNehalemEX;
                     box_map = nehalemEX_box_map;
+                    translate_types = default_translate_types;
                     break;
 
                 case WESTMERE_EX:
@@ -822,6 +870,7 @@ perfmon_init_maps(void)
                     counter_map = westmereEX_counter_map;
                     perfmon_numCounters = perfmon_numCountersWestmereEX;
                     box_map = westmereEX_box_map;
+                    translate_types = default_translate_types;
                     break;
 
                 case NEHALEM_BLOOMFIELD:
@@ -832,6 +881,7 @@ perfmon_init_maps(void)
                     counter_map = nehalem_counter_map;
                     perfmon_numCounters = perfmon_numCountersNehalem;
                     box_map = nehalem_box_map;
+                    translate_types = default_translate_types;
                     break;
 
                 case NEHALEM_WESTMERE_M:
@@ -841,34 +891,41 @@ perfmon_init_maps(void)
                     counter_map = nehalem_counter_map;
                     perfmon_numCounters = perfmon_numCountersNehalem;
                     box_map = nehalem_box_map;
+                    translate_types = default_translate_types;
                     break;
 
                 case IVYBRIDGE_EP:
                     pci_devices = ivybridgeEP_pci_devices;
+                    translate_types = ivybridgeEP_translate_types;
                     box_map = ivybridgeEP_box_map;
                     eventHash = ivybridgeEP_arch_events;
                     perfmon_numArchEvents = perfmon_numArchEventsIvybridgeEP;
                     counter_map = ivybridgeEP_counter_map;
                     perfmon_numCounters = perfmon_numCountersIvybridgeEP;
                     perfmon_numCoreCounters = perfmon_numCoreCountersIvybridgeEP;
+                    translate_types = ivybridgeEP_translate_types;
                     break;
                 case IVYBRIDGE:
+                    translate_types = default_translate_types;
                     eventHash = ivybridge_arch_events;
                     box_map = ivybridge_box_map;
                     perfmon_numArchEvents = perfmon_numArchEventsIvybridge;
                     counter_map = ivybridge_counter_map;
                     perfmon_numCounters = perfmon_numCountersIvybridge;
                     perfmon_numCoreCounters = perfmon_numCoreCountersIvybridge;
+                    translate_types = default_translate_types;
                     break;
 
                 case HASWELL_EP:
                     eventHash = haswellEP_arch_events;
+                    translate_types = haswellEP_translate_types;
                     perfmon_numArchEvents = perfmon_numArchEventsHaswellEP;
                     counter_map = haswellEP_counter_map;
                     perfmon_numCounters = perfmon_numCountersHaswellEP;
                     perfmon_numCoreCounters = perfmon_numCoreCountersHaswellEP;
                     box_map = haswellEP_box_map;
                     pci_devices = haswellEP_pci_devices;
+                    translate_types = haswellEP_translate_types;
                     break;
                 case HASWELL:
                 case HASWELL_M1:
@@ -879,16 +936,19 @@ perfmon_init_maps(void)
                     perfmon_numCounters = perfmon_numCountersHaswell;
                     perfmon_numCoreCounters = perfmon_numCoreCountersHaswell;
                     box_map = haswell_box_map;
+                    translate_types = default_translate_types;
                     break;
 
                 case SANDYBRIDGE_EP:
                     pci_devices = sandybridgeEP_pci_devices;
+                    translate_types = sandybridgeEP_translate_types;
                     box_map = sandybridgeEP_box_map;
                     eventHash = sandybridgeEP_arch_events;
                     perfmon_numArchEvents = perfmon_numArchEventsSandybridgeEP;
                     counter_map = sandybridgeEP_counter_map;
                     perfmon_numCounters = perfmon_numCountersSandybridgeEP;
                     perfmon_numCoreCounters = perfmon_numCoreCountersSandybridgeEP;
+                    translate_types = sandybridgeEP_translate_types;
                     break;
                 case SANDYBRIDGE:
                     box_map = sandybridge_box_map;
@@ -897,6 +957,7 @@ perfmon_init_maps(void)
                     counter_map = sandybridge_counter_map;
                     perfmon_numCounters = perfmon_numCountersSandybridge;
                     perfmon_numCoreCounters = perfmon_numCoreCountersSandybridge;
+                    translate_types = default_translate_types;
                     break;
 
                 case BROADWELL:
@@ -907,24 +968,29 @@ perfmon_init_maps(void)
                     perfmon_numArchEvents = perfmon_numArchEventsBroadwell;
                     perfmon_numCounters = perfmon_numCountersBroadwell;
                     perfmon_numCoreCounters = perfmon_numCoreCountersBroadwell;
+                    translate_types = default_translate_types;
                     break;
                 case BROADWELL_D:
                     pci_devices = broadwelld_pci_devices;
+                    translate_types = broadwellEP_translate_types;
                     box_map = broadwelld_box_map;
                     eventHash = broadwelld_arch_events;
                     counter_map = broadwelld_counter_map;
                     perfmon_numArchEvents = perfmon_numArchEventsBroadwellD;
                     perfmon_numCounters = perfmon_numCountersBroadwellD;
                     perfmon_numCoreCounters = perfmon_numCoreCountersBroadwellD;
+                    translate_types = broadwellEP_translate_types;
                     break;
                 case BROADWELL_E:
                     pci_devices = broadwellEP_pci_devices;
                     box_map = broadwellEP_box_map;
                     eventHash = broadwellEP_arch_events;
+                    translate_types = broadwellEP_translate_types;
                     counter_map = broadwellEP_counter_map;
                     perfmon_numArchEvents = perfmon_numArchEventsBroadwellEP;
                     perfmon_numCounters = perfmon_numCountersBroadwellEP;
                     perfmon_numCoreCounters = perfmon_numCoreCountersBroadwellEP;
+                    translate_types = broadwellEP_translate_types;
                     break;
 
                 case SKYLAKE1:
@@ -937,6 +1003,16 @@ perfmon_init_maps(void)
                     perfmon_numArchEvents = perfmon_numArchEventsSkylake;
                     perfmon_numCounters = perfmon_numCountersSkylake;
                     perfmon_numCoreCounters = perfmon_numCoreCountersSkylake;
+                    translate_types = default_translate_types;
+                    break;
+                case SKYLAKEX:
+                    box_map = skylakeX_box_map;
+                    eventHash = skylakeX_arch_events;
+                    counter_map = skylakeX_counter_map;
+                    perfmon_numArchEvents = perfmon_numArchEventsSkylakeX;
+                    perfmon_numCounters = perfmon_numCountersSkylakeX;
+                    perfmon_numCoreCounters = perfmon_numCoreCountersSkylakeX;
+                    translate_types = skylakeX_translate_types;
                     break;
 
                 case XEON_PHI_KNL:
@@ -946,6 +1022,7 @@ perfmon_init_maps(void)
                     counter_map = knl_counter_map;
                     box_map = knl_box_map;
                     perfmon_numCounters = perfmon_numCountersKNL;
+                    translate_types = knl_translate_types;
                     break;
 
                 default:
@@ -964,6 +1041,7 @@ perfmon_init_maps(void)
                     counter_map = phi_counter_map;
                     box_map = phi_box_map;
                     perfmon_numCounters = perfmon_numCountersPhi;
+                    translate_types = default_translate_types;
                     break;
 
                 default:
@@ -978,6 +1056,7 @@ perfmon_init_maps(void)
             counter_map = k10_counter_map;
             box_map = k10_box_map;
             perfmon_numCounters = perfmon_numCountersK10;
+            translate_types = default_translate_types;
             break;
 
         case K10_FAMILY:
@@ -986,6 +1065,7 @@ perfmon_init_maps(void)
             counter_map = k10_counter_map;
             box_map = k10_box_map;
             perfmon_numCounters = perfmon_numCountersK10;
+            translate_types = default_translate_types;
             break;
 
         case K15_FAMILY:
@@ -994,6 +1074,7 @@ perfmon_init_maps(void)
             counter_map = interlagos_counter_map;
             box_map = interlagos_box_map;
             perfmon_numCounters = perfmon_numCountersInterlagos;
+            translate_types = default_translate_types;
             break;
 
         case K16_FAMILY:
@@ -1002,7 +1083,17 @@ perfmon_init_maps(void)
             counter_map = kabini_counter_map;
             box_map = kabini_box_map;
             perfmon_numCounters = perfmon_numCountersKabini;
-           break;
+            translate_types = default_translate_types;
+            break;
+
+        case ZEN_FAMILY:
+            eventHash = zen_arch_events;
+            perfmon_numArchEvents = perfmon_numArchEventsZen;
+            counter_map = zen_counter_map;
+            box_map = zen_box_map;
+            perfmon_numCounters = perfmon_numCountersZen;
+            translate_types = zen_translate_types;
+            break;
 
         default:
             ERROR_PLAIN_PRINT(Unsupported Processor);
@@ -1062,6 +1153,8 @@ perfmon_init_funcs(int* init_power, int* init_temp)
                     break;
 
                 case ATOM_SILVERMONT_GOLD:
+                case ATOM_DENVERTON:
+                case ATOM_GOLDMONT_PLUS:
                     initialize_power = TRUE;
                     initialize_thermal = TRUE;
                     initThreadArch = perfmon_init_goldmont;
@@ -1166,9 +1259,9 @@ perfmon_init_funcs(int* init_power, int* init_temp)
                     break;
 
                 case BROADWELL:
-                case BROADWELL_E3:
                 case BROADWELL_E:
                 case BROADWELL_D:
+                case BROADWELL_E3:
                     initialize_power = TRUE;
                     initialize_thermal = TRUE;
                     initThreadArch = perfmon_init_broadwell;
@@ -1181,6 +1274,7 @@ perfmon_init_funcs(int* init_power, int* init_temp)
 
                 case SKYLAKE1:
                 case SKYLAKE2:
+                case SKYLAKEX:
                 case KABYLAKE1:
                 case KABYLAKE2:
                     initialize_power = TRUE;
@@ -1263,7 +1357,17 @@ perfmon_init_funcs(int* init_power, int* init_temp)
             perfmon_readCountersThread = perfmon_readCountersThread_kabini;
             perfmon_setupCountersThread = perfmon_setupCounterThread_kabini;
             perfmon_finalizeCountersThread = perfmon_finalizeCountersThread_kabini;
-           break;
+            break;
+
+        case ZEN_FAMILY:
+            initThreadArch = perfmon_init_zen;
+            initialize_power = TRUE;
+            perfmon_startCountersThread = perfmon_startCountersThread_zen;
+            perfmon_stopCountersThread = perfmon_stopCountersThread_zen;
+            perfmon_readCountersThread = perfmon_readCountersThread_zen;
+            perfmon_setupCountersThread = perfmon_setupCounterThread_zen;
+            perfmon_finalizeCountersThread = perfmon_finalizeCountersThread_zen;
+            break;
 
         default:
             ERROR_PLAIN_PRINT(Unsupported Processor);
@@ -1306,6 +1410,9 @@ perfmon_init(int nrThreads, const int* threadsToCpu)
         return -EINVAL;
     }
 
+    init_configuration();
+    topology_init();
+
     if ((cpuid_info.family == 0) && (cpuid_info.model == 0))
     {
         ERROR_PLAIN_PRINT(Topology module not inialized. Needed to determine current CPU type);
@@ -1332,6 +1439,15 @@ perfmon_init(int nrThreads, const int* threadsToCpu)
     {
         ERROR_PLAIN_PRINT(Cannot allocate set of threads);
         free(groupSet);
+        groupSet = NULL;
+        return -ENOMEM;
+    }
+    currentConfig = malloc(cpuid_topology.numHWThreads*sizeof(uint64_t*));
+    if (!currentConfig)
+    {
+        ERROR_PLAIN_PRINT(Cannot allocate config lists);
+        free(groupSet);
+        groupSet = NULL;
         return -ENOMEM;
     }
     groupSet->numberOfThreads = nrThreads;
@@ -1340,14 +1456,28 @@ perfmon_init(int nrThreads, const int* threadsToCpu)
     groupSet->groups = NULL;
     groupSet->activeGroup = -1;
 
-    for(i=0; i<MAX_NUM_NODES; i++) socket_lock[i] = LOCK_INIT;
-    for(i=0; i<MAX_NUM_THREADS; i++)
+    for(i=0; i<cpuid_topology.numSockets; i++) socket_lock[i] = LOCK_INIT;
+    for(i=0; i<cpuid_topology.numHWThreads; i++)
     {
         tile_lock[i] = LOCK_INIT;
         core_lock[i] = LOCK_INIT;
+        sharedl3_lock[i] = LOCK_INIT;
+        sharedl2_lock[i] = LOCK_INIT;
+        numa_lock[i] = LOCK_INIT;
+        currentConfig[i] = malloc(NUM_PMC * sizeof(uint64_t));
+        if (!currentConfig[i])
+        {
+            for (int j = 0; j < i; j++)
+            {
+                free(currentConfig[j]);
+            }
+            free(groupSet);
+            groupSet = NULL;
+            return -ENOMEM;
+        }
+        memset(currentConfig[i], 0, NUM_PMC * sizeof(uint64_t));
     }
 
-
     /* Initialize access interface */
 #ifndef LIKWID_USE_PERFEVENT
     ret = HPMinit();
@@ -1356,10 +1486,16 @@ perfmon_init(int nrThreads, const int* threadsToCpu)
         ERROR_PLAIN_PRINT(Cannot set access functions);
         free(groupSet->threads);
         free(groupSet);
+        groupSet = NULL;
+        for(i=0; i<cpuid_topology.numHWThreads; i++)
+            free(currentConfig[i]);
+        free(currentConfig);
+        currentConfig = NULL;
         return ret;
     }
 #endif
     timer_init();
+    affinity_init();
 
     /* Initialize maps pointer to current architecture maps */
     perfmon_init_maps();
@@ -1378,6 +1514,11 @@ perfmon_init(int nrThreads, const int* threadsToCpu)
             ERROR_PLAIN_PRINT(Cannot get access to performance counters);
             free(groupSet->threads);
             free(groupSet);
+            groupSet = NULL;
+            for(int j=0; j<cpuid_topology.numHWThreads; j++)
+                free(currentConfig[j]);
+            free(currentConfig);
+            currentConfig = NULL;
             return ret;
         }
 
@@ -1387,6 +1528,11 @@ perfmon_init(int nrThreads, const int* threadsToCpu)
             fprintf(stderr, "Cannot get access to MSRs. Please check permissions to the MSRs\n");
             free(groupSet->threads);
             free(groupSet);
+            groupSet = NULL;
+            for(int j=0; j<cpuid_topology.numHWThreads; j++)
+                free(currentConfig[j]);
+            free(currentConfig);
+            currentConfig = NULL;
             return -EACCES;
         }
 #endif
@@ -1443,9 +1589,15 @@ perfmon_finalize(void)
     groupSet->activeGroup = -1;
     if (groupSet)
         free(groupSet);
-    for (group=0; group < MAX_NUM_THREADS; group++)
+    if (currentConfig)
     {
-        memset(currentConfig[group], 0, NUM_PMC * sizeof(uint64_t));
+        for (group=0; group < cpuid_topology.numHWThreads; group++)
+        {
+            memset(currentConfig[group], 0, NUM_PMC * sizeof(uint64_t));
+            free(currentConfig[group]);
+        }
+        free(currentConfig);
+        currentConfig = NULL;
     }
     if (markerResults != NULL)
     {
@@ -1533,15 +1685,26 @@ perfmon_addEventSet(const char* eventCString)
     DEBUG_PRINT(DEBUGLEV_INFO, Currently %d groups of %d active,
                     groupSet->numberOfActiveGroups+1,
                     groupSet->numberOfGroups+1);
+    cstringcopy = malloc((strlen(eventCString)+1)*sizeof(char));
+    if (!cstringcopy)
+        return -ENOMEM;
+    strcpy(cstringcopy, eventCString);
+    char* perf_pid = strstr(eventCString, "PERF_PID");
+    if (perf_pid != NULL)
+    {
+#ifdef LIKWID_USE_PERFEVENT
+        snprintf(cstringcopy, strlen(eventCString)-strlen(perf_pid), "%s", eventCString);
+#endif
+    }
 
-    if (strchr(eventCString, ':') == NULL)
+    if (strchr(cstringcopy, ':') == NULL)
     {
         err = read_group(config->groupPath, cpuid_info.short_name,
-                         eventCString,
+                         cstringcopy,
                          &groupSet->groups[groupSet->numberOfActiveGroups].group);
         if (err == -EACCES)
         {
-            ERROR_PRINT(Access to performance group %s not allowed, eventCString);
+            ERROR_PRINT(Access to performance group %s not allowed, cstringcopy);
             return err;
         }
         else if (err == -ENODEV)
@@ -1551,21 +1714,36 @@ perfmon_addEventSet(const char* eventCString)
         }
         else if (err < 0)
         {
-            ERROR_PRINT(Cannot read performance group %s, eventCString);
+            ERROR_PRINT(Cannot read performance group %s, cstringcopy);
             return err;
         }
         isPerfGroup = 1;
     }
     else
     {
-        err = custom_group(eventCString, &groupSet->groups[groupSet->numberOfActiveGroups].group);
+        err = custom_group(cstringcopy, &groupSet->groups[groupSet->numberOfActiveGroups].group);
         if (err)
         {
-            ERROR_PRINT(Cannot transform %s to performance group, eventCString);
+            ERROR_PRINT(Cannot transform %s to performance group, cstringcopy);
             return err;
         }
     }
     char * evstr = get_eventStr(&groupSet->groups[groupSet->numberOfActiveGroups].group);
+    if (perf_pid != NULL)
+    {
+        char* tmp = realloc(evstr, strlen(evstr)+strlen(perf_pid)+1);
+        if (!tmp)
+        {
+            return -ENOMEM;
+        }
+        else
+        {
+            evstr = tmp;
+            strcat(evstr, ":");
+            strcat(evstr, perf_pid);
+        }
+    }
+    free(cstringcopy);
     eventBString = bfromcstr(evstr);
     eventtokens = bsplit(eventBString,',');
     free(evstr);
@@ -1605,6 +1783,7 @@ perfmon_addEventSet(const char* eventCString)
         {
             if (!getIndexAndType(subtokens->entry[1], &event->index, &event->type))
             {
+                fprintf(stderr, "WARN: Counter %s not defined for current architecture\n", bdata(subtokens->entry[1]));
                 event->type = NOTYPE;
                 goto past_checks;
             }
@@ -1613,6 +1792,7 @@ perfmon_addEventSet(const char* eventCString)
             if (event->type == NOTYPE)
             {
                 DEBUG_PRINT(DEBUGLEV_INFO, Cannot access counter register %s, bdata(subtokens->entry[1]));
+                event->type = NOTYPE;
                 goto past_checks;
             }
 #else
@@ -1621,34 +1801,43 @@ perfmon_addEventSet(const char* eventCString)
             if (path == NULL || stat(path, &st) != 0)
             {
                 DEBUG_PRINT(DEBUGLEV_INFO, Cannot access counter register %s, bdata(subtokens->entry[1]));
+                event->type = NOTYPE;
                 goto past_checks;
             }
 #endif
 
             if (!getEvent(subtokens->entry[0], subtokens->entry[1], &event->event))
             {
-                DEBUG_PRINT(DEBUGLEV_INFO, Event %s not found for current architecture,
-                     bdata(subtokens->entry[0]));
+                fprintf(stderr, "WARN: Event %s not found for current architecture\n", bdata(subtokens->entry[0]));
                 event->type = NOTYPE;
                 goto past_checks;
             }
 #ifndef LIKWID_USE_PERFEVENT
             if (!checkCounter(subtokens->entry[1], event->event.limit))
             {
-                DEBUG_PRINT(DEBUGLEV_INFO, Register %s not allowed for event %s,
-                     bdata(subtokens->entry[1]),bdata(subtokens->entry[0]));
+                fprintf(stderr, "WARN: Register %s not allowed for event %s (limit %s)\n", bdata(subtokens->entry[1]),bdata(subtokens->entry[0]),event->event.limit);
                 event->type = NOTYPE;
                 goto past_checks;
             }
 #endif
             if (parseOptions(subtokens, &event->event, event->index) < 0)
             {
-                DEBUG_PRINT(DEBUGLEV_INFO, Cannot parse options in %s, bdata(eventtokens->entry[i]));
                 event->type = NOTYPE;
                 goto past_checks;
             }
 
             SETTYPE(eventSet, event->type);
+
+            for (int e = 0; e < eventSet->numberOfEvents; e++)
+            {
+                if (event->index == eventSet->events[e].index)
+                {
+                    fprintf(stderr, "WARN: Counter %s already used in event set, skipping\n", counter_map[event->index].key);
+                    event->type = NOTYPE;
+                    break;
+                }
+            }
+
 past_checks:
             event->threadCounter = (PerfmonCounter*) malloc(
                 groupSet->numberOfThreads * sizeof(PerfmonCounter));
@@ -1725,15 +1914,20 @@ perfmon_delEventSet(int groupID)
 int
 __perfmon_setupCountersThread(int thread_id, int groupId)
 {
-    int i;
+    int i = 0;
+    int ret = 0;
     if (groupId >= groupSet->numberOfActiveGroups)
     {
         ERROR_PRINT(Group %d does not exist in groupSet, groupId);
         return -ENOENT;
     }
 
-    CHECK_AND_RETURN_ERROR(perfmon_setupCountersThread(thread_id, &groupSet->groups[groupId]),
-            Setup of counters failed);
+    ret = perfmon_setupCountersThread(thread_id, &groupSet->groups[groupId]);
+    if (ret < 0)
+    {
+        fprintf(stderr, "Setup of counters failed for thread %d\n", (ret+1)*-1);
+        return ret;
+    }
 
     groupSet->activeGroup = groupId;
     return 0;
@@ -1982,7 +2176,6 @@ __perfmon_readCounters(int groupId, int threadId)
                     groupSet->groups[groupId].events[j].threadCounter[threadId].fullResult += result;
                     groupSet->groups[groupId].events[j].threadCounter[threadId].startData =
                         groupSet->groups[groupId].events[j].threadCounter[threadId].counterData;
-                    groupSet->groups[groupId].events[j].threadCounter[threadId].overflows = 0;
                 }
             }
         }
@@ -2001,7 +2194,6 @@ __perfmon_readCounters(int groupId, int threadId)
             groupSet->groups[groupId].events[j].threadCounter[threadId].fullResult += result;
             groupSet->groups[groupId].events[j].threadCounter[threadId].startData =
                 groupSet->groups[groupId].events[j].threadCounter[threadId].counterData;
-            groupSet->groups[groupId].events[j].threadCounter[threadId].overflows = 0;
         }
 }
     timer_start(&groupSet->groups[groupId].timer);
@@ -2090,16 +2282,16 @@ perfmon_getResult(int groupId, int eventId, int threadId)
 {
     if (unlikely(groupSet == NULL))
     {
-        return 0;
+        return NAN;
     }
     if (perfmon_initialized != 1)
     {
         ERROR_PLAIN_PRINT(Perfmon module not properly initialized);
-        return 0;
+        return NAN;
     }
     if (groupSet->numberOfActiveGroups == 0)
     {
-        return 0;
+        return NAN;
     }
     if ((groupId < 0) && (groupSet->activeGroup >= 0))
     {
@@ -2108,15 +2300,15 @@ perfmon_getResult(int groupId, int eventId, int threadId)
     if (eventId >= groupSet->groups[groupId].numberOfEvents)
     {
         printf("ERROR: EventID greater than defined events\n");
-        return 0;
+        return NAN;
     }
     if (threadId >= groupSet->numberOfThreads)
     {
         printf("ERROR: ThreadID greater than defined threads\n");
-        return 0;
+        return NAN;
     }
     if (groupSet->groups[groupId].events[eventId].type == NOTYPE)
-        return 0;
+        return NAN;
 
     if ((groupSet->groups[groupId].events[eventId].threadCounter[threadId].fullResult == 0) ||
         (groupSet->groups[groupId].events[eventId].type == THERMAL) ||
@@ -2173,19 +2365,21 @@ perfmon_getMetric(int groupId, int metricId, int threadId)
 {
     int e = 0;
     double result = 0;
-    CounterList clist;
+    bstring vars = bformat("");
+    bstring varlist = bformat("");
+    char split[2] = ":";
     if (unlikely(groupSet == NULL))
     {
-        return 0;
+        return NAN;
     }
     if (perfmon_initialized != 1)
     {
         ERROR_PLAIN_PRINT(Perfmon module not properly initialized);
-        return 0;
+        return NAN;
     }
     if (groupSet->numberOfActiveGroups == 0)
     {
-        return 0;
+        return NAN;
     }
     if ((groupId < 0) && (groupSet->activeGroup >= 0))
     {
@@ -2193,23 +2387,40 @@ perfmon_getMetric(int groupId, int metricId, int threadId)
     }
     if (groupSet->groups[groupId].group.nmetrics == 0)
     {
-        return 0.0;
+        return NAN;
     }
     if ((metricId < 0) || (metricId >= groupSet->groups[groupId].group.nmetrics))
     {
-        return 0.0;
+        return NAN;
     }
-    timer_init();
-    init_clist(&clist);
+    char* f = groupSet->groups[groupId].group.metricformulas[metricId];
     for (e=0;e<groupSet->groups[groupId].numberOfEvents;e++)
     {
-        add_to_clist(&clist,groupSet->groups[groupId].group.counters[e],
-                     perfmon_getResult(groupId, e, threadId));
+        if (groupSet->groups[groupId].events[e].type != NOTYPE)
+        {
+            char *ctr = strtok(groupSet->groups[groupId].group.counters[e], split);
+            if (ctr)
+                calc_add_dbl_var(ctr, perfmon_getLastResult(groupId, e, threadId), vars, varlist);
+        }
+        else
+        {
+            char *ctr = strtok(groupSet->groups[groupId].group.counters[e], split);
+            if (ctr && strstr(f, ctr) != NULL)
+            {
+                calc_add_int_var(ctr, 0, vars, varlist);
+            }
+        }
     }
-    add_to_clist(&clist, "time", perfmon_getTimeOfGroup(groupId));
-    add_to_clist(&clist, "inverseClock", 1.0/timer_getCycleClock());
-    add_to_clist(&clist, "true", 1);
-    add_to_clist(&clist, "false", 0);
+    if (groupSet->groups[groupId].group.lua_funcs)
+    {
+        if (calc_set_user_funcs(groupSet->groups[groupId].group.lua_funcs))
+        {
+            free(groupSet->groups[groupId].group.lua_funcs);
+            groupSet->groups[groupId].group.lua_funcs = NULL;
+        }
+    }
+    calc_add_dbl_var("time", perfmon_getLastTimeOfGroup(groupId), vars, varlist);
+    calc_add_dbl_var("inverseClock", 1.0/timer_getCycleClock(), vars, varlist);
     int cpu = 0, sock_cpu = 0, err = 0;
     for (e=0; e<groupSet->numberOfThreads; e++)
     {
@@ -2218,7 +2429,7 @@ perfmon_getMetric(int groupId, int metricId, int threadId)
             cpu = groupSet->threads[e].processorId;
         }
     }
-    sock_cpu = socket_lock[affinity_core2node_lookup[cpu]];
+    sock_cpu = socket_lock[affinity_thread2socket_lookup[cpu]];
     if (cpu != sock_cpu)
     {
         for (e=0; e<groupSet->numberOfThreads; e++)
@@ -2228,26 +2439,37 @@ perfmon_getMetric(int groupId, int metricId, int threadId)
                 sock_cpu = groupSet->threads[e].thread_id;
             }
         }
+        calc_add_int_var("SOCKET_CPU", sock_cpu, vars, varlist);
         for (e=0;e<groupSet->groups[groupId].numberOfEvents;e++)
         {
             if (perfmon_isUncoreCounter(groupSet->groups[groupId].group.counters[e]) &&
                 !perfmon_isUncoreCounter(groupSet->groups[groupId].group.metricformulas[metricId]))
             {
-                err = update_clist(&clist,groupSet->groups[groupId].group.counters[e], perfmon_getResult(groupId, e, sock_cpu));
-                if (err < 0)
+                if (groupSet->groups[groupId].events[e].type != NOTYPE)
                 {
-                    DEBUG_PRINT(DEBUGLEV_DEVELOP, Cannot add socket result of counter %s for thread %d, groupSet->groups[groupId].group.counters[e], threadId);
+                    char *ctr = strtok(groupSet->groups[groupId].group.counters[e], split);
+                    double res = perfmon_getResult(groupId, e, sock_cpu);
+                    err = calc_add_dbl_var(ctr, res, vars, varlist);
+                    if (err < 0)
+                    {
+                        DEBUG_PRINT(DEBUGLEV_DEVELOP, Cannot add socket result of counter %s for thread %d, groupSet->groups[groupId].group.counters[e], threadId);
+                    }
                 }
             }
         }
     }
-    e = calc_metric(groupSet->groups[groupId].group.metricformulas[metricId], &clist, &result);
+    else
+    {
+        calc_add_int_var("SOCKET_CPU", cpu, vars, varlist);
+    }
+    
+    e = calc_metric(cpu, f, vars, varlist, &result);
+    bdestroy(vars);
+    bdestroy(varlist);
     if (e < 0)
     {
-        result = 0.0;
-        //ERROR_PRINT(Cannot calculate formula %s, groupSet->groups[groupId].group.metricformulas[metricId]);
+        result = NAN;
     }
-    destroy_clist(&clist);
     return result;
 }
 
@@ -2256,19 +2478,21 @@ perfmon_getLastMetric(int groupId, int metricId, int threadId)
 {
     int e = 0;
     double result = 0;
-    CounterList clist;
+    bstring vars = bformat("");
+    bstring varlist = bformat("");
+    char split[2] = ":";
     if (unlikely(groupSet == NULL))
     {
-        return 0;
+        return NAN;
     }
     if (perfmon_initialized != 1)
     {
         ERROR_PLAIN_PRINT(Perfmon module not properly initialized);
-        return 0;
+        return NAN;
     }
     if (groupSet->numberOfActiveGroups == 0)
     {
-        return 0;
+        return NAN;
     }
     if ((groupId < 0) && (groupSet->activeGroup >= 0))
     {
@@ -2276,23 +2500,40 @@ perfmon_getLastMetric(int groupId, int metricId, int threadId)
     }
     if (groupSet->groups[groupId].group.nmetrics == 0)
     {
-        return 0.0;
+        return NAN;
     }
     if ((metricId < 0) || (metricId >= groupSet->groups[groupId].group.nmetrics))
     {
-        return 0.0;
+        return NAN;
     }
-    timer_init();
-    init_clist(&clist);
+    char* f = groupSet->groups[groupId].group.metricformulas[metricId];
     for (e=0;e<groupSet->groups[groupId].numberOfEvents;e++)
     {
-        add_to_clist(&clist,groupSet->groups[groupId].group.counters[e],
-                     perfmon_getLastResult(groupId, e, threadId));
+        if (groupSet->groups[groupId].events[e].type != NOTYPE)
+        {
+            char *ctr = strtok(groupSet->groups[groupId].group.counters[e], split);
+            if (ctr)
+                calc_add_dbl_var(ctr, perfmon_getLastResult(groupId, e, threadId), vars, varlist);
+        }
+        else
+        {
+            char *ctr = strtok(groupSet->groups[groupId].group.counters[e], split);
+            if (ctr && strstr(f, ctr) != NULL)
+            {
+                calc_add_int_var(ctr, 0, vars, varlist);
+            }
+        }
+    }
+    if (groupSet->groups[groupId].group.lua_funcs)
+    {
+        if (calc_set_user_funcs(groupSet->groups[groupId].group.lua_funcs))
+        {
+            free(groupSet->groups[groupId].group.lua_funcs);
+            groupSet->groups[groupId].group.lua_funcs = NULL;
+        }
     }
-    add_to_clist(&clist, "time", perfmon_getLastTimeOfGroup(groupId));
-    add_to_clist(&clist, "inverseClock", 1.0/timer_getCycleClock());
-    add_to_clist(&clist, "true", 1);
-    add_to_clist(&clist, "false", 0);
+    calc_add_dbl_var("time", perfmon_getLastTimeOfGroup(groupId), vars, varlist);
+    calc_add_dbl_var("inverseClock", 1.0/timer_getCycleClock(), vars, varlist);
     int cpu = 0, sock_cpu = 0, err = 0;
     for (e=0; e<groupSet->numberOfThreads; e++)
     {
@@ -2301,7 +2542,8 @@ perfmon_getLastMetric(int groupId, int metricId, int threadId)
             cpu = groupSet->threads[e].processorId;
         }
     }
-    sock_cpu = socket_lock[affinity_core2node_lookup[cpu]];
+    calc_add_int_var("CPU", cpu, vars, varlist);
+    sock_cpu = socket_lock[affinity_thread2socket_lookup[cpu]];
     if (cpu != sock_cpu)
     {
         for (e=0; e<groupSet->numberOfThreads; e++)
@@ -2311,26 +2553,37 @@ perfmon_getLastMetric(int groupId, int metricId, int threadId)
                 sock_cpu = groupSet->threads[e].thread_id;
             }
         }
+        calc_add_int_var("SOCKET_CPU", sock_cpu, vars, varlist);
         for (e=0;e<groupSet->groups[groupId].numberOfEvents;e++)
         {
             if (perfmon_isUncoreCounter(groupSet->groups[groupId].group.counters[e]) &&
                 !perfmon_isUncoreCounter(groupSet->groups[groupId].group.metricformulas[metricId]))
             {
-                err = update_clist(&clist,groupSet->groups[groupId].group.counters[e], perfmon_getLastResult(groupId, e, sock_cpu));
-                if (err < 0)
+                if (groupSet->groups[groupId].events[e].type != NOTYPE)
                 {
-                    DEBUG_PRINT(DEBUGLEV_DEVELOP, Cannot add socket result of counter %s for thread %d, groupSet->groups[groupId].group.counters[e], threadId);
+                    char *ctr = strtok(groupSet->groups[groupId].group.counters[e], split);
+                    double res = perfmon_getLastResult(groupId, e, sock_cpu);
+                    err = calc_add_dbl_var(ctr, res, vars, varlist);
+                    if (err < 0)
+                    {
+                        DEBUG_PRINT(DEBUGLEV_DEVELOP, Cannot add socket result of counter %s for thread %d, groupSet->groups[groupId].group.counters[e], threadId);
+                    }
                 }
             }
         }
     }
-    e = calc_metric(groupSet->groups[groupId].group.metricformulas[metricId], &clist, &result);
+    else
+    {
+        calc_add_int_var("SOCKET_CPU", cpu, vars, varlist);
+    }
+    
+    e = calc_metric(cpu, f, vars, varlist, &result);
+    bdestroy(vars);
+    bdestroy(varlist);
     if (e < 0)
     {
-        result = 0.0;
-        //ERROR_PRINT(Cannot calculate formula %s, groupSet->groups[groupId].group.metricformulas[metricId]);
+        result = NAN;
     }
-    destroy_clist(&clist);
     return result;
 }
 
@@ -2909,47 +3162,62 @@ perfmon_getMetricOfRegionThread(int region, int metricId, int threadId)
 {
     int e = 0, err = 0;
     double result = 0.0;
-    CounterList clist;
+    char split[2] = ":";
+    bstring vars = bformat("");
+    bstring varlist = bformat("");
     if (perfmon_initialized != 1)
     {
         ERROR_PLAIN_PRINT(Perfmon module not properly initialized);
-        return -EINVAL;
+        return NAN;
     }
     if (region < 0 || region >= markerRegions)
     {
-        return -EINVAL;
+        return NAN;
     }
     if (markerResults == NULL)
     {
-        return 0.0;
+        return NAN;
     }
     if (threadId < 0 || threadId >= markerResults[region].threadCount)
     {
-        return -EINVAL;
+        return NAN;
     }
     if (metricId < 0 || metricId >= groupSet->groups[markerResults[region].groupID].group.nmetrics)
     {
-        return -EINVAL;
+        return NAN;
     }
-    timer_init();
-    init_clist(&clist);
+
+    char* f = groupSet->groups[markerResults[region].groupID].group.metricformulas[metricId];
     for (e=0;e<markerResults[region].eventCount;e++)
     {
-        err = add_to_clist(&clist,
-                     groupSet->groups[markerResults[region].groupID].group.counters[e],
-                     perfmon_getResultOfRegionThread(region, e, threadId));
-        if (err)
+        if (groupSet->groups[markerResults[region].groupID].events[e].type != NOTYPE)
         {
-            printf("Cannot add counter %s to counter list for metric calculation\n",
-                    counter_map[groupSet->groups[markerResults[region].groupID].events[e].index].key);
-            destroy_clist(&clist);
-            return 0;
+            char* ctr = strtok(groupSet->groups[markerResults[region].groupID].group.counters[e], split);
+            if (ctr)
+            {
+                double res = perfmon_getResultOfRegionThread(region, e, threadId);
+                calc_add_dbl_var(ctr, res, vars, varlist);
+            }
+        }
+        else
+        {
+            char *ctr = strtok(groupSet->groups[markerResults[region].groupID].group.counters[e], split);
+            if (ctr && strstr(f, ctr) != NULL)
+            {
+                calc_add_int_var(ctr, 0, vars, varlist);
+            }
+        }
+    }
+    if (groupSet->groups[markerResults[region].groupID].group.lua_funcs)
+    {
+        if (calc_set_user_funcs(groupSet->groups[markerResults[region].groupID].group.lua_funcs))
+        {
+            free(groupSet->groups[markerResults[region].groupID].group.lua_funcs);
+            groupSet->groups[markerResults[region].groupID].group.lua_funcs = NULL;
         }
     }
-    add_to_clist(&clist, "time", perfmon_getTimeOfRegion(region, threadId));
-    add_to_clist(&clist, "inverseClock", 1.0/timer_getCycleClock());
-    add_to_clist(&clist, "true", 1);
-    add_to_clist(&clist, "false", 0);
+    calc_add_dbl_var("time", perfmon_getTimeOfRegion(region, threadId), vars, varlist);
+    calc_add_dbl_var("inverseClock", 1.0/timer_getCycleClock(), vars, varlist);
     int cpu = 0, sock_cpu = 0;
     for (e=0; e<groupSet->numberOfThreads; e++)
     {
@@ -2958,7 +3226,8 @@ perfmon_getMetricOfRegionThread(int region, int metricId, int threadId)
             cpu = groupSet->threads[e].processorId;
         }
     }
-    sock_cpu = socket_lock[affinity_core2node_lookup[cpu]];
+    
+    sock_cpu = socket_lock[affinity_thread2socket_lookup[cpu]];
     if (cpu != sock_cpu)
     {
         for (e=0; e<groupSet->numberOfThreads; e++)
@@ -2968,25 +3237,38 @@ perfmon_getMetricOfRegionThread(int region, int metricId, int threadId)
                 sock_cpu = groupSet->threads[e].thread_id;
             }
         }
+        calc_add_int_var("SOCKET_CPU", sock_cpu, vars, varlist);
         for (e=0;e<markerResults[region].eventCount;e++)
         {
             if (perfmon_isUncoreCounter(groupSet->groups[markerResults[region].groupID].group.counters[e]) &&
                 !perfmon_isUncoreCounter(groupSet->groups[markerResults[region].groupID].group.metricformulas[metricId]))
             {
-                err = update_clist(&clist,groupSet->groups[markerResults[region].groupID].group.counters[e], perfmon_getResultOfRegionThread(region, e, sock_cpu));
-                if (err < 0)
+                if (groupSet->groups[markerResults[region].groupID].events[e].type != NOTYPE)
                 {
-                    DEBUG_PRINT(DEBUGLEV_DEVELOP, Cannot add socket result of counter %s for thread %d, groupSet->groups[markerResults[region].groupID].group.counters[e], threadId);
+                    char *ctr = strtok(groupSet->groups[markerResults[region].groupID].group.counters[e], split);
+                    double res = perfmon_getResultOfRegionThread(region, e, sock_cpu);
+                    err = calc_add_dbl_var(ctr, res, vars, varlist);
+                    if (err < 0)
+                    {
+                        DEBUG_PRINT(DEBUGLEV_DEVELOP, Cannot add socket result of counter %s for thread %d, groupSet->groups[markerResults[region].groupID].group.counters[e], threadId);
+                    }
                 }
             }
         }
     }
-    err = calc_metric(groupSet->groups[markerResults[region].groupID].group.metricformulas[metricId], &clist, &result);
+    else
+    {
+        calc_add_int_var("SOCKET_CPU", cpu, vars, varlist);
+    }
+    
+    err = calc_metric(cpu, f, vars, varlist, &result);
+    bdestroy(vars);
+    bdestroy(varlist);
     if (err < 0)
     {
-        ERROR_PRINT(Cannot calculate formula %s, groupSet->groups[markerResults[region].groupID].group.metricformulas[metricId]);
+        ERROR_PRINT(Cannot calculate formula %s, f);
+        return NAN;
     }
-    destroy_clist(&clist);
     return result;
 }
 
diff --git a/src/perfmon_perf.c b/src/perfmon_perf.c
deleted file mode 100644
index 8414548..0000000
--- a/src/perfmon_perf.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * =======================================================================================
- *
- *      Filename:  perfmon_perf.c
- *
- *      Description:  Example perfmon module for software events through perf_event
- *                    Currently not integrated in perfmon.
- *
- *      Version:   4.2
- *      Released:  22.12.2016
- *
- *      Author:   Thomas Roehl (tr), thomas.roehl at googlemail.com
- *      Project:  likwid
- *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
- *
- *      This program is free software: you can redistribute it and/or modify it under
- *      the terms of the GNU General Public License as published by the Free Software
- *      Foundation, either version 3 of the License, or (at your option) any later
- *      version.
- *
- *      This program is distributed in the hope that it will be useful, but WITHOUT ANY
- *      WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- *      PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- *      You should have received a copy of the GNU General Public License along with
- *      this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- * =======================================================================================
- */
-
-/* #####   HEADER FILE INCLUDES   ######################################### */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <linux/perf_event.h>
-#include <asm/unistd.h>
-
-#include <topology.h>
-#include <error.h>
-#include <perfmon.h>
-#include <perfmon_perf.h>
-
-/* #####   LOCAL VARIABLES   ############################################## */
-
-static int* cpu_event_fds[MAX_NUM_THREADS] = { NULL };
-
-
-/* #####   EXPORTED VARIABLES   ########################################### */
-
-const uint64_t configList[MAX_SW_EVENTS] = {
-    [0x00] = PERF_COUNT_SW_CPU_CLOCK,
-    [0x01] = PERF_COUNT_SW_TASK_CLOCK,
-    [0x02] = PERF_COUNT_SW_PAGE_FAULTS,
-    [0x03] = PERF_COUNT_SW_CONTEXT_SWITCHES,
-    [0x04] = PERF_COUNT_SW_CPU_MIGRATIONS,
-    [0x05] = PERF_COUNT_SW_PAGE_FAULTS_MIN,
-    [0x06] = PERF_COUNT_SW_PAGE_FAULTS_MAJ,
-    [0x07] = PERF_COUNT_SW_ALIGNMENT_FAULTS,
-    [0x08] = PERF_COUNT_SW_EMULATION_FAULTS,
-};
-
-/* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
-
-static long
-perf_event_open(
-        struct perf_event_attr *hw_event,
-        pid_t pid,
-        int cpu,
-        int group_fd,
-        unsigned long flags)
-{
-    int ret;
-
-    ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
-                   group_fd, flags);
-    return ret;
-}
-
-/* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
-
-int
-init_perf_event(int cpu_id)
-{
-    if (cpu_event_fds[cpu_id] == NULL)
-    {
-        cpu_event_fds[cpu_id] = (int*) malloc(MAX_SW_EVENTS * sizeof(int));
-        if (cpu_event_fds[cpu_id] == NULL)
-        {
-            return -ENOMEM;
-        }
-        memset(cpu_event_fds[cpu_id], -1, MAX_SW_EVENTS * sizeof(int));
-    }
-    return 0;
-}
-
-int
-setup_perf_event(int cpu_id, PerfmonEvent* event)
-{
-    struct perf_event_attr attr;
-    if (event == NULL)
-    {
-        return -EINVAL;
-    }
-    if (cpu_event_fds[cpu_id] == NULL)
-    {
-        return -EFAULT;
-    }
-    if (cpu_event_fds[cpu_id][event->umask] != -1)
-    {
-        return 0;
-    }
-    memset(&attr, 0, sizeof(struct perf_event_attr));
-    attr.type = PERF_TYPE_SOFTWARE;
-    attr.size = sizeof(struct perf_event_attr);
-    attr.config = configList[event->umask];
-    attr.exclude_kernel = 1;
-    attr.exclude_hv = 1;
-    attr.disabled = 1;
-    attr.inherit = 1;
-    if (event->numberOfOptions > 0)
-    {
-        for(int j = 0; j < event->numberOfOptions; j++)
-        {
-            switch (event->options[j].type)
-            {
-                case EVENT_OPTION_COUNT_KERNEL:
-                    attr.exclude_kernel = 0;
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-    cpu_event_fds[cpu_id][event->umask] = perf_event_open(&attr, 0, cpu_id, -1, 0);
-    if (cpu_event_fds[cpu_id][event->umask] < 0)
-    {
-        printf("Setup of event %llu failed\n", event->umask);
-        return -EFAULT;
-    }
-    return 0;
-}
-
-int
-read_perf_event(int cpu_id, uint64_t eventID, uint64_t *data)
-{
-    int ret = 0;
-    long long tmp = 0;
-    *data = 0x0ULL;
-    if ((cpu_event_fds[cpu_id] != NULL) && (cpu_event_fds[cpu_id][eventID] != -1))
-    {
-        ret = read(cpu_event_fds[cpu_id][eventID], &tmp, sizeof(long long));
-        if (ret == sizeof(long long))
-        {
-            *data = (uint64_t) tmp;
-        }
-    }
-    else
-    {
-        printf("FD for event %llu not initialized\n", eventID);
-        return -ENODEV;
-    }
-    return 0;
-}
-
-int
-stop_perf_event(int cpu_id, uint64_t eventID)
-{
-    if ((cpu_event_fds[cpu_id] != NULL) && (cpu_event_fds[cpu_id][eventID] != -1))
-    {
-        ioctl(cpu_event_fds[cpu_id][eventID], PERF_EVENT_IOC_DISABLE, 0);
-    }
-    else
-    {
-        return -ENODEV;
-    }
-    return 0;
-}
-
-int
-stop_all_perf_event(int cpu_id)
-{
-    if (cpu_event_fds[cpu_id] != NULL)
-    {
-        for (int i = 0; i< MAX_SW_EVENTS; i++)
-        {
-            if (cpu_event_fds[cpu_id][i] != -1)
-            {
-                stop_perf_event(cpu_id, i);
-            }
-        }
-    }
-    return 0;
-}
-
-int
-clear_perf_event(int cpu_id, uint64_t eventID)
-{
-    if ((cpu_event_fds[cpu_id] != NULL) && (cpu_event_fds[cpu_id][eventID] != -1))
-    {
-        ioctl(cpu_event_fds[cpu_id][eventID], PERF_EVENT_IOC_RESET, 0);
-    }
-    else
-    {
-        return -ENODEV;
-    }
-    return 0;
-}
-
-int
-clear_all_perf_event(int cpu_id)
-{
-    if (cpu_event_fds[cpu_id] != NULL)
-    {
-        for (int i = 0; i< MAX_SW_EVENTS; i++)
-        {
-            if (cpu_event_fds[cpu_id][i] != -1)
-            {
-                clear_perf_event(cpu_id, i);
-            }
-        }
-    }
-    return 0;
-}
-
-int
-start_perf_event(int cpu_id, uint64_t eventID)
-{
-    if ((cpu_event_fds[cpu_id] != NULL) && (cpu_event_fds[cpu_id][eventID] != -1))
-    {
-        ioctl(cpu_event_fds[cpu_id][eventID], PERF_EVENT_IOC_ENABLE, 0);
-    }
-    else
-    {
-        return -ENODEV;
-    }
-    return 0;
-}
-
-int
-start_all_perf_event(int cpu_id)
-{
-    if (cpu_event_fds[cpu_id] != NULL)
-    {
-        for (int i = 0; i< MAX_SW_EVENTS; i++)
-        {
-            if (cpu_event_fds[cpu_id][i] != -1)
-            {
-                start_perf_event(cpu_id, i);
-            }
-        }
-    }
-    return 0;
-}
-
-int
-close_perf_event(int cpu_id, uint64_t eventID)
-{
-    if ((cpu_event_fds[cpu_id] != NULL) && (cpu_event_fds[cpu_id][eventID] != -1))
-    {
-        close(cpu_event_fds[cpu_id][eventID]);
-        cpu_event_fds[cpu_id][eventID] = -1;
-    }
-    return 0;
-}
-
-int
-finalize_perf_event(int cpu_id)
-{
-    if (cpu_event_fds[cpu_id] != NULL)
-    {
-        for (int i = 0; i< MAX_SW_EVENTS; i++)
-        {
-            if (cpu_event_fds[cpu_id][i] != -1)
-            {
-                close_perf_event(cpu_id, i);
-            }
-        }
-        free(cpu_event_fds[cpu_id]);
-    }
-    return 0;
-}
-
diff --git a/src/power.c b/src/power.c
index 7276353..8daac72 100644
--- a/src/power.c
+++ b/src/power.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Module implementing Intel RAPL interface
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -55,6 +55,8 @@ power_init(int cpuId)
     uint64_t flags;
     int i;
     int err;
+    uint32_t unit_reg = MSR_RAPL_POWER_UNIT;
+    int numDomains = NUM_POWER_DOMAINS;
 
     /* determine Turbo Mode features */
     double busSpeed;
@@ -74,43 +76,75 @@ power_init(int cpuId)
     power_info.uncoreMaxFreq = 0;
     power_info.perfBias = 0;
 
-    switch (cpuid_info.model)
+    switch (cpuid_info.family)
     {
-        case SANDYBRIDGE:
-        case IVYBRIDGE:
-        case HASWELL:
-        case SANDYBRIDGE_EP:
-        case IVYBRIDGE_EP:
-        case HASWELL_EP:
-        case ATOM_SILVERMONT_E:
-        case ATOM_SILVERMONT_Z1:
-        case ATOM_SILVERMONT_Z2:
-        case ATOM_SILVERMONT_F:
-        case ATOM_SILVERMONT_AIR:
-        case ATOM_SILVERMONT_GOLD:
-        case BROADWELL:
-        case BROADWELL_E3:
-        case BROADWELL_E:
-        case BROADWELL_D:
-        case HASWELL_M1:
-        case HASWELL_M2:
-        case SKYLAKE1:
-        case SKYLAKE2:
-        case KABYLAKE1:
-        case KABYLAKE2:
-        case XEON_PHI_KNL:
-            power_info.hasRAPL = 1;
-            break;
-        case ATOM_SILVERMONT_C:
-            power_info.hasRAPL = 1;
-            /* The info_regs list needs an update for Silvermont Type C
-               because it uses another info register */
-            info_regs[PKG] = MSR_PKG_POWER_INFO_SILVERMONT;
-            break;
-        default:
-            DEBUG_PLAIN_PRINT(DEBUGLEV_INFO, NO RAPL SUPPORT);
-            return 0;
+        case P6_FAMILY:
+            switch (cpuid_info.model)
+            {
+                case SANDYBRIDGE:
+                case IVYBRIDGE:
+                case HASWELL:
+                case SANDYBRIDGE_EP:
+                case IVYBRIDGE_EP:
+                case HASWELL_EP:
+                case ATOM_SILVERMONT_E:
+                case ATOM_SILVERMONT_Z1:
+                case ATOM_SILVERMONT_Z2:
+                case ATOM_SILVERMONT_F:
+                case ATOM_SILVERMONT_AIR:
+                case ATOM_SILVERMONT_GOLD:
+                case BROADWELL:
+                case BROADWELL_E:
+                case BROADWELL_D:
+                case BROADWELL_E3:
+                case HASWELL_M1:
+                case HASWELL_M2:
+                case XEON_PHI_KNL:
+                    power_info.hasRAPL = 1;
+                    numDomains = NUM_POWER_DOMAINS - 1;
+                    break;
+                case SKYLAKE1:
+                case SKYLAKE2:
+                case SKYLAKEX:
+                case KABYLAKE1:
+                case KABYLAKE2:
+                    power_info.hasRAPL = 1;
+                    numDomains = NUM_POWER_DOMAINS;
+                    break;
+                case ATOM_SILVERMONT_C:
+                    power_info.hasRAPL = 1;
+                    /* The info_regs list needs an update for Silvermont Type C
+                       because it uses another info register */
+                    info_regs[PKG] = MSR_PKG_POWER_INFO_SILVERMONT;
+                    numDomains = NUM_POWER_DOMAINS - 1;
+                    break;
+
+                default:
+                    DEBUG_PLAIN_PRINT(DEBUGLEV_INFO, NO RAPL SUPPORT);
+                    return 0;
+                    break;
+            }
             break;
+        case ZEN_FAMILY:
+            if (cpuid_info.model == ZEN_RYZEN)
+            {
+                cpuid_info.turbo = 0;
+                power_info.hasRAPL = 1;
+                numDomains = 2;
+                unit_reg = MSR_AMD17_RAPL_POWER_UNIT;
+                power_names[0] = "CORE";
+                power_names[1] = "PKG";
+                power_regs[0] = MSR_AMD17_RAPL_CORE_STATUS;
+                power_regs[1] = MSR_AMD17_RAPL_PKG_STATUS;
+
+                for (i = 0; i< NUM_POWER_DOMAINS; i++)
+                {
+                    limit_regs[i] = 0x0;
+                    policy_regs[i] = 0x0;
+                    perf_regs[i] = 0x0;
+                    info_regs[i] = 0x0;
+                }
+            }
     }
 
     perfmon_init_maps();
@@ -134,91 +168,112 @@ power_init(int cpuId)
     {
         busSpeed = 133.33;
     }
-    if (cpuid_info.turbo)
-    {
-        err = HPMread(cpuId, MSR_DEV, MSR_PLATFORM_INFO, &flags);
-        if (err == 0)
-        {
-            power_info.baseFrequency = busSpeed * (double) extractBitField(flags,8,8);
-            power_info.minFrequency  = busSpeed * (double) extractBitField((flags>>(32)),8,8);
 
-            power_info.turbo.numSteps = cpuid_topology.numCoresPerSocket;
-            if (cpuid_info.model == WESTMERE_EX)
-            {
-                power_info.turbo.numSteps = 4;
-            }
-            power_info.turbo.steps = (double*) malloc(power_info.turbo.numSteps * sizeof(double));
-            if (!power_info.turbo.steps)
-            {
-                return -ENOMEM;
-            }
+    err = HPMread(cpuId, MSR_DEV, MSR_PLATFORM_INFO, &flags);
+    if (err == 0)
+    {
+        power_info.baseFrequency = busSpeed * (double) extractBitField(flags,8,8);
+        power_info.minFrequency  = busSpeed * (double) extractBitField((flags>>(32)),8,8);
 
-            err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT, &flags);
-            if (err)
-            {
-                fprintf(stderr,"Cannot gather values from MSR_TURBO_RATIO_LIMIT,\n");
-            }
-            else
+        power_info.turbo.numSteps = cpuid_topology.numCoresPerSocket;
+        if (cpuid_info.model == WESTMERE_EX)
+        {
+            power_info.turbo.numSteps = 4;
+        }
+        power_info.turbo.steps = (double*) malloc(power_info.turbo.numSteps * sizeof(double));
+        if (!power_info.turbo.steps)
+        {
+            return -ENOMEM;
+        }
+        memset(power_info.turbo.steps, 0, power_info.turbo.numSteps * sizeof(double));
+        err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT, &flags);
+        if (err)
+        {
+            fprintf(stderr,"Cannot gather values from MSR_TURBO_RATIO_LIMIT\n");
+        }
+        else
+        {
+            if (cpuid_info.model != SKYLAKEX)
             {
-                for (int i=0; i < power_info.turbo.numSteps; i++)
+                unsigned long flag_vals[4];
+                int flag_idx = 0;
+                int reg_idx = 1;
+                int valid_idx = 0;
+                flag_vals[0] = flags;
+                if (power_info.turbo.numSteps > 8)
                 {
-                    if (i < 8)
+                    err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT1, &flag_vals[1]);
+                    if (err)
                     {
-                        power_info.turbo.steps[i] = busSpeed * (double) field64(flags,i*8, 8);
+                        flag_vals[1] = 0;
                     }
-                    else
+                }
+                if (power_info.turbo.numSteps > 16)
+                {
+                    err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT2, &flag_vals[2]);
+                    if (err)
                     {
-                        power_info.turbo.steps[i] = power_info.turbo.steps[7];
+                        flag_vals[2] = 0;
                     }
                 }
-            }
-            if (power_info.turbo.numSteps > 8)
-            {
-                err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT1, &flags);
-                if (!err)
+                if (power_info.turbo.numSteps > 24)
                 {
-                    for (int i=8; i < power_info.turbo.numSteps; i++)
+                    err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT3, &flag_vals[3]);
+                    if (err)
                     {
-                        if (i < 16)
-                        {
-                            power_info.turbo.steps[i] = busSpeed * (double) field64(flags,i*8, 8);
-                        }
-                        else
-                        {
-                            power_info.turbo.steps[i] = power_info.turbo.steps[15];
-                        }
+                        flag_vals[3] = 0;
+                    }
+                }
+                power_info.turbo.steps[0] = busSpeed * (double) field64(flags,0, 8);
+                for (int i=1; i < power_info.turbo.numSteps; i++)
+                {
+                    if (i % 8 == 0)
+                    {
+                        flag_idx++;
+                        reg_idx = 0;
                     }
+                    power_info.turbo.steps[i] = busSpeed * (double) field64(flag_vals[flag_idx],(i%8)*8, 8);
+                    if (power_info.turbo.steps[i] > 0)
+                        valid_idx = i;
+                    else
+                        power_info.turbo.steps[i] = power_info.turbo.steps[valid_idx];
                 }
             }
-            if (power_info.turbo.numSteps > 16)
+            else
             {
-                err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT2, &flags);
-                if (!err)
+                uint64_t flags_cores = 0;
+                int insert = 0;
+                err = HPMread(cpuId, MSR_DEV, MSR_TURBO_RATIO_LIMIT_CORES, &flags_cores);
+                if (err)
+                {
+                    ERROR_PLAIN_PRINT(Cannot read MSR TURBO_RATIO_LIMIT_CORES);
+                    flags_cores = 0;
+                }
+                for (int i = 0; i < 8; i++)
                 {
-                    for (int i=16; i < power_info.turbo.numSteps; i++)
+                    int num_cores_befores = 0;
+                    if (i > 0)
+                        num_cores_befores = field64(flags_cores,(i-1)*8, 8);
+                    int num_cores = field64(flags_cores,i*8, 8);
+                    double freq = busSpeed * (double) field64(flags, i*8, 8);
+                    for (int j = num_cores_befores; j < num_cores && insert < power_info.turbo.numSteps; j++)
                     {
-                        if (i < 24)
-                        {
-                            power_info.turbo.steps[i] = busSpeed * (double) field64(flags,i*8, 8);
-                        }
-                        else
-                        {
-                            power_info.turbo.steps[i] = power_info.turbo.steps[23];
-                        }
+                        power_info.turbo.steps[insert] = freq;
+                        insert++;
                     }
                 }
             }
         }
-        else
-        {
-            fprintf(stderr,"Cannot gather values from MSR_PLATFORM_INFO,\n");
-        }
+    }
+    else
+    {
+        fprintf(stderr,"Cannot gather values from MSR_PLATFORM_INFO\n");
     }
 
     /* determine RAPL parameters */
     if ( power_info.hasRAPL )
     {
-        err = HPMread(cpuId, MSR_DEV, MSR_RAPL_POWER_UNIT, &flags);
+        err = HPMread(cpuId, MSR_DEV, unit_reg, &flags);
         if (err == 0)
         {
             double energyUnit;
@@ -232,7 +287,7 @@ power_init(int cpuId)
             {
                 energyUnit = 1.0 * (1 << ((flags >> 8) & 0x1F)) / 1000000;
             }
-            for (i = 0; i < NUM_POWER_DOMAINS; i++)
+            for (i = 0; i < numDomains; i++)
             {
                 power_info.domains[i].energyUnit = energyUnit;
                 power_info.domains[i].type = i;
@@ -247,12 +302,13 @@ power_init(int cpuId)
                 (cpuid_info.model == HASWELL_M2) ||
                 (cpuid_info.model == BROADWELL_D) ||
                 (cpuid_info.model == BROADWELL_E) ||
+                (cpuid_info.model == SKYLAKEX) ||
                 (cpuid_info.model == XEON_PHI_KNL))
             {
                 power_info.domains[DRAM].energyUnit = 15.3E-6;
             }
 
-            for(i = 0; i < NUM_POWER_DOMAINS; i++)
+            for(i = 0; i < numDomains; i++)
             {
                 err = HPMread(cpuId, MSR_DEV, power_regs[i], &flags);
                 if (err == 0)
@@ -288,6 +344,8 @@ power_init(int cpuId)
                         {
                             power_info.domains[i].minPower = (double) extractBitField(flags,15,16) * power_info.powerUnit;
                             power_info.domains[i].maxPower = (double) extractBitField(flags,15,32) * power_info.powerUnit;
+                            if (power_info.domains[i].minPower > power_info.domains[i].maxPower)
+                                power_info.domains[i].minPower = 0;
                             power_info.domains[i].maxTimeWindow = (double) extractBitField(flags,7,48) * power_info.timeUnit;
                         }
                     }
@@ -327,20 +385,23 @@ power_init(int cpuId)
         }
         else
         {
-            fprintf(stderr,"Cannot gather values from MSR_RAPL_POWER_UNIT, deactivating RAPL support\n");
+            fprintf(stderr,"Cannot gather values from unit register 0x%X, deactivating RAPL support\n", unit_reg);
             power_info.hasRAPL =  0;
         }
 
-        err = HPMread(cpuId, MSR_DEV, MSR_UNCORE_FREQ, &flags);
-        if (err == 0)
+        if (cpuid_info.isIntel)
         {
-            power_info.uncoreMinFreq = ((double)((flags >> 8) & 0xFFULL)) * busSpeed;
-            power_info.uncoreMaxFreq = ((double)(flags & 0xFF)) * busSpeed;
-        }
-        err = HPMread(cpuId, MSR_DEV, MSR_ENERGY_PERF_BIAS, &flags);
-        if (err == 0)
-        {
-            power_info.perfBias = flags & 0xF;
+            err = HPMread(cpuId, MSR_DEV, MSR_UNCORE_FREQ, &flags);
+            if (err == 0)
+            {
+                power_info.uncoreMinFreq = ((double)((flags >> 8) & 0xFFULL)) * busSpeed;
+                power_info.uncoreMaxFreq = ((double)(flags & 0xFF)) * busSpeed;
+            }
+            err = HPMread(cpuId, MSR_DEV, MSR_ENERGY_PERF_BIAS, &flags);
+            if (err == 0)
+            {
+                power_info.perfBias = flags & 0xF;
+            }
         }
         power_initialized = 1;
         return power_info.hasRAPL;
diff --git a/src/pthread-overload/Makefile b/src/pthread-overload/Makefile
index 57452c9..bbcd5c1 100644
--- a/src/pthread-overload/Makefile
+++ b/src/pthread-overload/Makefile
@@ -4,15 +4,15 @@
 #
 #      Description:  pthread-overload Makefile
 #
-#      Version:   4.2
-#      Released:  22.12.2016
+#      Version:   4.3.1
+#      Released:  04.01.2018
 #
 #      Author:  Jan Treibig (jt), jan.treibig at gmail.com
 #               Thomas Roehl (tr), thomas.roehl at googlemail.com
 #
 #      Project:  likwid
 #
-#      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+#      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
 #
 #      This program is free software: you can redistribute it and/or modify it under
 #      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/pthread-overload/pthread-overload.c b/src/pthread-overload/pthread-overload.c
index 377588b..b89472f 100644
--- a/src/pthread-overload/pthread-overload.c
+++ b/src/pthread-overload/pthread-overload.c
@@ -6,13 +6,13 @@
  *      Description:  Overloaded library for pthread_create call. 
  *                    Implements pinning of threads together with likwid-pin.
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -40,6 +40,8 @@
 #include <dirent.h>
 #include <unistd.h>
 #include <string.h>
+#include <unistd.h>
+#include <sys/syscall.h>
 
 #ifdef COLOR
 #include <textcolor.h>
@@ -49,6 +51,8 @@
 #define TOSTRING(x) STRINGIFY(x)
 #define LLU_CAST  (unsigned long long)
 
+#define gettid() syscall(SYS_gettid)
+
 extern int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
 
 static char * sosearchpaths[] = {
@@ -73,6 +77,47 @@ static char * sosearchpaths[] = {
     } while(0)
 #endif
 
+static int *pin_ids = NULL;
+static int ncpus = 0;
+static uint64_t skipMask = 0x0;
+static int silent = 0;
+void __attribute__((constructor (103))) init_pthread_overload(void)
+{
+    char *str = NULL;
+    char *token = NULL, *saveptr = NULL;
+    char *delimiter = ",";
+    int i = 0;
+    static long avail_cpus = 0;
+    avail_cpus = sysconf(_SC_NPROCESSORS_CONF);
+    pin_ids = malloc(avail_cpus * sizeof(int));
+    memset(pin_ids, 0, avail_cpus * sizeof(int));
+    str = getenv("LIKWID_PIN");
+    if (str != NULL)
+    {
+        token = str;
+        while (token)
+        {
+            token = strtok_r(str,delimiter,&saveptr);
+            str = NULL;
+            if (token)
+            {
+                ncpus++;
+                pin_ids[i++] = strtoul(token, &token, 10);
+            }
+        }
+    }
+    str = getenv("LIKWID_SKIP");
+    if (str != NULL)
+    {
+        skipMask = strtoul(str, &str, 16);
+    }
+
+    if (getenv("LIKWID_SILENT") != NULL)
+    {
+        silent = 1;
+    }
+}
+
 int __attribute__ ((visibility ("default") ))
 pthread_create(pthread_t* thread,
         const pthread_attr_t* attr,
@@ -88,44 +133,16 @@ pthread_create(pthread_t* thread,
     static int ncalled = 0;
     static int overflow = 0;
     static int overflowed = 0;
-    static int silent = 0;
-    static int pin_ids[MAX_NUM_THREADS];
-    static uint64_t skipMask = 0x0;
-    static int ncpus = 0;
-    static int shepard = 0;
     static long online_cpus = 0;
+    static int shepard = 0;
     online_cpus = sysconf(_SC_NPROCESSORS_ONLN);
 
     /* On first entry: Get Evironment Variable and initialize pin_ids */
-    if (ncalled == 0)
+    if (ncalled == 0 && pin_ids != NULL)
     {
-        char *str;
-        char *token, *saveptr;
-        char *delimiter = ",";
-        int i = 0;
+        char* str = NULL;
         cpu_set_t cpuset;
 
-        str = getenv("LIKWID_SKIP");
-        if (str != NULL)
-        {
-            skipMask = strtoul(str, &str, 16);
-        }
-        else if ( skipMask == 0x0 )
-        {
-            dlerror();    /* Clear any existing error */
-            dlsym(RTLD_DEFAULT,"__kmpc_begin");
-
-            if (( dlerror()) == NULL)  {
-                skipMask = 0x1;
-            }
-        }
-
-
-        if (getenv("LIKWID_SILENT") != NULL)
-        {
-            silent = 1;
-        }
-
         if (!silent)
         {
             color_print("[pthread wrapper] \n");
@@ -134,17 +151,6 @@ pthread_create(pthread_t* thread,
         str = getenv("LIKWID_PIN");
         if (str != NULL)
         {
-            token = str;
-            while (token)
-            {
-                token = strtok_r(str,delimiter,&saveptr);
-                str = NULL;
-                if (token)
-                {
-                    ncpus++;
-                    pin_ids[i++] = strtoul(token, &token, 10);
-                }
-            }
             CPU_ZERO(&cpuset);
             CPU_SET(pin_ids[ncpus-1], &cpuset);
             ret = sched_setaffinity(getpid(), sizeof(cpu_set_t), &cpuset);
@@ -178,20 +184,39 @@ pthread_create(pthread_t* thread,
         FILE* fpipe;
         char cmd[512];
         char buff[512];
+        char file[256];
+        unsigned int ptr = ((void*)start_routine) - info.dli_fbase;
+
         buff[0] = '\0';
-        sprintf(cmd, "nm %s 2>/dev/null | grep %x ", info.dli_fname, ((void*)start_routine) - info.dli_fbase);
-        if ( !(fpipe = (FILE*)popen(cmd,"r")) )
-        {  // If fpipe is NULL
-            fprintf(stderr, "Problems");
+        snprintf(file, 255, "/tmp/likwidpin.%d", gettid());
+        snprintf(cmd, 511, "rm -f %s; nm %s 2>/dev/null | grep %x > %s",
+                 file, info.dli_fname, ptr, file);
+        ret = system(cmd);
+        if (!access(file, R_OK))
+        {
+            fpipe = fopen(file, "r");
+            if (!fpipe)
+            {
+                fprintf(stderr, "Problems reading symbols for shepard thread detection\n");
+            }
+            else
+            {
+                char* t = fgets(buff, 512, fpipe);
+                char* tmp = strstr(buff, "monitor");
+                if (tmp != NULL)
+                {
+                    shepard = 1;
+                    skipMask |= 1ULL<<(ncalled);
+                }
+                fclose(fpipe);
+                snprintf(cmd, 511, "rm -f %s 2>/dev/null", file);
+                ret = system(cmd);
+            }
         }
-        char* t = fgets(buff, 512, fpipe);
-        char* tmp = strstr(buff, "monitor");
-        if (tmp != NULL)
+        else
         {
-            shepard = 1;
-            skipMask |= 1ULL<<(ncalled);
+            fprintf(stderr, "Problems reading symbols for shepard thread detection\n");
         }
-        pclose(fpipe);
     }
 
     /* Handle dll related stuff */
@@ -288,3 +313,8 @@ pthread_create(pthread_t* thread,
     return ret;
 }
 
+void __attribute__((destructor (103))) close_pthread_overload(void)
+{
+    free(pin_ids);
+}
+
diff --git a/src/thermal.c b/src/thermal.c
index 5f42b10..d489abf 100644
--- a/src/thermal.c
+++ b/src/thermal.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Module implementing Intel TM/TM2 interface
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/timer.c b/src/timer.c
index 36157ff..609f62d 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Implementation of timer module
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:  Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -448,13 +448,14 @@ timer_sleep(unsigned long usec)
     int status = -1;
     struct timespec req;
     struct timespec rem = {0,0};
+
     if (sleepbase == 0x0ULL)
     {
         init_sleep();
     }
     if (usec >= 1000000)
     {
-        status = sleep(usec / 1000000);
+        status = sleep(((usec-sleepbase)+500000) / 1000000);
     }
     else
     {
diff --git a/src/topology.c b/src/topology.c
index 4f7a95c..1bcd8da 100644
--- a/src/topology.c
+++ b/src/topology.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Interface to the topology backends
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -60,6 +60,7 @@ static char* atom_22_str = "Intel Atom 22nm processor";
 static char* atom_silvermont_str = "Intel Atom (Silvermont) processor";
 static char* atom_airmont_str = "Intel Atom (Airmont) processor";
 static char* atom_goldmont_str = "Intel Atom (Goldmont) processor";
+static char* atom_goldmontplus_str = "Intel Atom (Goldmont Plus) processor";
 static char* nehalem_bloom_str = "Intel Core Bloomfield processor";
 static char* nehalem_lynn_str = "Intel Core Lynnfield processor";
 static char* nehalem_west_str = "Intel Core Westmere processor";
@@ -70,20 +71,24 @@ static char* sandybridge_ep_str = "Intel Xeon SandyBridge EN/EP processor";
 static char* haswell_str = "Intel Core Haswell processor";
 static char* haswell_ep_str = "Intel Xeon Haswell EN/EP/EX processor";
 static char* broadwell_str = "Intel Core Broadwell processor";
-static char* broadwell_e3_str = "Intel Xeon E3 Broadwell processor";
 static char* broadwell_d_str = "Intel Xeon D Broadwell processor";
+static char* broadwell_e3_str = "Intel Xeon E3 Broadwell processor";
 static char* broadwell_ep_str = "Intel Xeon Broadwell EN/EP/EX processor";
 static char* skylake_str = "Intel Skylake processor";
+static char* skylakeX_str = "Intel Skylake SP processor";
 static char* kabylake_str = "Intel Kabylake processor";
+static char* cannonlake_str = "Intel Cannonlake processor";
 static char* nehalem_ex_str = "Intel Nehalem EX processor";
 static char* westmere_ex_str = "Intel Westmere EX processor";
 static char* xeon_mp_string = "Intel Xeon MP processor";
 static char* xeon_phi_string = "Intel Xeon Phi (Knights Corner) Coprocessor";
 static char* xeon_phi2_string = "Intel Xeon Phi (Knights Landing) (Co)Processor";
-static char* barcelona_str = "AMD Barcelona processor";
-static char* shanghai_str = "AMD Shanghai processor";
-static char* istanbul_str = "AMD Istanbul processor";
-static char* magnycours_str = "AMD Magny Cours processor";
+static char* xeon_phi3_string = "Intel Xeon Phi (Knights Mill) (Co)Processor";
+static char* barcelona_str = "AMD K10 (Barcelona) processor";
+static char* shanghai_str = "AMD K10 (Shanghai) processor";
+static char* istanbul_str = "AMD K10 (Istanbul) processor";
+static char* magnycours_str = "AMD K10 (Magny Cours) processor";
+static char* thuban_str = "AMD K10 (Thuban) processor";
 static char* interlagos_str = "AMD Interlagos processor";
 static char* kabini_str = "AMD Family 16 model - Kabini processor";
 static char* opteron_sc_str = "AMD Opteron single core 130nm processor";
@@ -94,6 +99,7 @@ static char* athlon64_f_str = "AMD Athlon64 (AM2) Rev F 90nm processor";
 static char* athlon64_X2_g_str = "AMD Athlon64 X2 (AM2) Rev G 65nm processor";
 static char* athlon64_g_str = "AMD Athlon64 (AM2) Rev G 65nm processor";
 static char* amd_k8_str = "AMD K8 architecture";
+static char* amd_zen_str = "AMD K17 (Zen) architecture";
 static char* unknown_intel_str = "Unknown Intel Processor";
 static char* unknown_amd_str = "Unknown AMD Processor";
 
@@ -102,6 +108,7 @@ static char* short_atom = "atom";
 static char* short_pm = "pentiumm";
 static char* short_silvermont = "silvermont";
 static char* short_goldmont = "goldmont";
+static char* short_goldmontplus = "goldmontplus";
 static char* short_nehalem = "nehalem";
 static char* short_nehalemEX = "nehalemEX";
 static char* short_westmere = "westmere";
@@ -116,20 +123,23 @@ static char* short_ivybridge_ep = "ivybridgeEP";
 static char* short_sandybridge = "sandybridge";
 static char* short_sandybridge_ep = "sandybridgeEP";
 static char* short_skylake = "skylake";
+static char* short_skylakeX = "skylakeX";
 static char* short_kabylake = "skylake";
+static char* short_cannonlake = "cannonlake";
 static char* short_phi = "phi";
 static char* short_phi2 = "knl";
+static char* short_phi3 = "kml";
 static char* short_k8 = "k8";
 static char* short_k10 = "k10";
 static char* short_k15 = "interlagos";
 static char* short_k16 = "kabini";
+static char* short_zen = "zen";
 static char* short_unknown = "unknown";
 
 /* #####  EXPORTED VARIABLES  ########################################## */
 
 CpuInfo cpuid_info;
 CpuTopology cpuid_topology;
-int affinity_thread2tile_lookup[MAX_NUM_THREADS];
 
 /* #####   FUNCTION DEFINITIONS  -  LOCAL TO THIS SOURCE FILE   ########### */
 
@@ -174,7 +184,6 @@ initTopologyFile(FILE* file)
         if (!tree_nodeExists(currentNode, i))
         {
             tree_insertNode(currentNode, i);
-            affinity_thread2tile_lookup[hwThreadPool[i].apicId] = hwThreadPool[i].coreId;
         }
     }
 }
@@ -637,18 +646,34 @@ topology_setName(void)
                     cpuid_info.short_name = short_skylake;
                     break;
 
+                case SKYLAKEX:
+                    cpuid_info.name = skylakeX_str;
+                    cpuid_info.short_name = short_skylakeX;
+                    break;
+
                 case KABYLAKE1:
                 case KABYLAKE2:
                     cpuid_info.name = kabylake_str;
                     cpuid_info.short_name = short_skylake;
                     break;
 
+                case CANNONLAKE:
+                    cpuid_info.name = cannonlake_str;
+                    cpuid_info.short_name = short_cannonlake;
+                    break;
+
                 case XEON_PHI_KNL:
                     cpuid_info.supportUncore = 1;
                     cpuid_info.name = xeon_phi2_string;
                     cpuid_info.short_name = short_phi2;
                     break;
 
+                case XEON_PHI_KML:
+                    cpuid_info.supportUncore = 1;
+                    cpuid_info.name = xeon_phi3_string;
+                    cpuid_info.short_name = short_phi3;
+                    break;
+
                 case NEHALEM_EX:
                     cpuid_info.name = nehalem_ex_str;
                     cpuid_info.short_name = short_nehalemEX;
@@ -694,9 +719,15 @@ topology_setName(void)
                     cpuid_info.short_name = short_silvermont;
                     break;
                 case ATOM_SILVERMONT_GOLD:
+                case ATOM_DENVERTON:
                     cpuid_info.name = atom_goldmont_str;
                     cpuid_info.short_name = short_goldmont;
                     break;
+                
+                case ATOM_GOLDMONT_PLUS:
+                    cpuid_info.name = atom_goldmontplus_str;
+                    cpuid_info.short_name = short_goldmontplus;
+                    break;
 
                 default:
                     cpuid_info.name = unknown_intel_str;
@@ -785,6 +816,10 @@ topology_setName(void)
                     cpuid_info.name = magnycours_str;
                     break;
 
+                case THUBAN:
+                    cpuid_info.name = thuban_str;
+                    break;
+
                 default:
                     cpuid_info.name = unknown_amd_str;
                     break;
@@ -802,6 +837,11 @@ topology_setName(void)
             cpuid_info.short_name = short_k16;
             break;
 
+        case ZEN_FAMILY:
+            cpuid_info.name = amd_zen_str;
+            cpuid_info.short_name = short_zen;
+            break;
+
         default:
             return EXIT_FAILURE;
             break;
@@ -812,10 +852,10 @@ topology_setName(void)
 const struct
 topology_functions topology_funcs = {
 #ifndef LIKWID_USE_HWLOC
-    .init_cpuInfo = cpuid_init_cpuInfo,
-    .init_cpuFeatures = cpuid_init_cpuFeatures,
-    .init_nodeTopology = cpuid_init_nodeTopology,
-    .init_cacheTopology = cpuid_init_cacheTopology,
+    .init_cpuInfo = proc_init_cpuInfo,
+    .init_cpuFeatures = proc_init_cpuFeatures,
+    .init_nodeTopology = proc_init_nodeTopology,
+    .init_cacheTopology = proc_init_cacheTopology,
     .close_topology = NULL,
 #else
     .init_cpuInfo = hwloc_init_cpuInfo,
@@ -860,7 +900,6 @@ void topology_setupTree(void)
                */
             //printf("Insert HWThread %d from Core %d at Socket %d\n", hwThreadPool[i].apicId, hwThreadPool[i].coreId, hwThreadPool[i].packageId);
             tree_insertNode(currentNode, hwThreadPool[i].apicId);
-            affinity_thread2tile_lookup[hwThreadPool[i].apicId] = hwThreadPool[i].coreId;
         }
 
     }
@@ -903,10 +942,6 @@ standard_init:
         sched_getaffinity(0,sizeof(cpu_set_t), &cpuSet);
         if (cpu_count(&cpuSet) < sysconf(_SC_NPROCESSORS_CONF))
         {
-            funcs.init_cpuInfo = proc_init_cpuInfo;
-            funcs.init_cpuFeatures = proc_init_cpuFeatures;
-            funcs.init_nodeTopology = proc_init_nodeTopology;
-            funcs.init_cacheTopology = proc_init_cacheTopology;
             cpuid_topology.activeHWThreads =
                 ((cpu_count(&cpuSet) < sysconf(_SC_NPROCESSORS_CONF)) ?
                 cpu_count(&cpuSet) :
@@ -1043,6 +1078,7 @@ print_supportedCPUs (void)
     printf("\t%s\n",skylake_str);
     printf("\t%s\n",atom_goldmont_str);
     printf("\t%s\n",xeon_phi2_string);
+    printf("\t%s\n",skylakeX_str);
     printf("\n");
     printf("Supported AMD processors:\n");
     printf("\t%s\n",opteron_sc_str);
@@ -1054,6 +1090,7 @@ print_supportedCPUs (void)
     printf("\t%s\n",magnycours_str);
     printf("\t%s\n",interlagos_str);
     printf("\t%s\n",kabini_str);
+    printf("\t%s\n",amd_zen_str);
     printf("\n");
 }
 
diff --git a/src/topology_cpuid.c b/src/topology_cpuid.c
index de80b1a..722bfcd 100644
--- a/src/topology_cpuid.c
+++ b/src/topology_cpuid.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Interface to the cpuid based topology backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/src/topology_hwloc.c b/src/topology_hwloc.c
index 2e128bc..a678cb7 100644
--- a/src/topology_hwloc.c
+++ b/src/topology_hwloc.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Interface to the hwloc based topology backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Thomas Roehl (tr), thomas.roehl at googlemail.com
  *
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -37,6 +37,7 @@
 
 #include <topology.h>
 #include <affinity.h>
+#include <cpuid.h>
 #ifdef LIKWID_USE_HWLOC
 #include <hwloc.h>
 #include <topology_hwloc.h>
@@ -48,6 +49,25 @@ hwloc_topology_t hwloc_topology = NULL;
 
 /* #####   FUNCTION DEFINITIONS  -  EXPORTED FUNCTIONS   ################## */
 
+static int
+readCacheInclusiveIntel(int level)
+{
+    uint32_t eax = 0x0U, ebx = 0x0U, ecx = 0x0U, edx = 0x0U;
+    eax = 0x04;
+    ecx = level;
+    CPUID(eax, ebx, ecx, edx);
+    return edx & 0x2;
+}
+
+static int readCacheInclusiveAMD(int level)
+{
+    uint32_t eax = 0x0U, ebx = 0x0U, ecx = 0x0U, edx = 0x0U;
+    eax = 0x8000001D;
+    ecx = level;
+    CPUID(eax, ebx, ecx, edx);
+    return (edx & (0x1<<1));
+}
+
 #ifdef LIKWID_USE_HWLOC
 int
 likwid_hwloc_record_objs_of_type_below_obj(
@@ -87,9 +107,12 @@ hwloc_init_cpuInfo(cpu_set_t cpuSet)
     {
         setenv("HWLOC_HIDE_ERRORS", "1", 1);
     }
-    likwid_hwloc_topology_init(&hwloc_topology);
-    likwid_hwloc_topology_set_flags(hwloc_topology, HWLOC_TOPOLOGY_FLAG_WHOLE_IO );
-    likwid_hwloc_topology_load(hwloc_topology);
+    if (!hwloc_topology)
+    {
+        likwid_hwloc_topology_init(&hwloc_topology);
+        likwid_hwloc_topology_set_flags(hwloc_topology, HWLOC_TOPOLOGY_FLAG_WHOLE_IO );
+        likwid_hwloc_topology_load(hwloc_topology);
+    }
     obj = likwid_hwloc_get_obj_by_type(hwloc_topology, HWLOC_OBJ_SOCKET, 0);
 
     cpuid_info.model = 0;
@@ -206,7 +229,6 @@ hwloc_init_nodeTopology(cpu_set_t cpuSet)
             {
                 hwThreadPool[id].coreId = 0;
                 hwThreadPool[id].packageId = 0;
-                affinity_thread2core_lookup[hwThreadPool[id].apicId] = hwThreadPool[id].coreId;
                 continue;
             }
         }
@@ -238,7 +260,6 @@ hwloc_init_nodeTopology(cpu_set_t cpuSet)
             }
         }
 #endif
-        affinity_thread2core_lookup[hwThreadPool[id].apicId] = hwThreadPool[id].coreId;
         while (obj->type != socket_type) {
             obj = obj->parent;
             if (!obj)
@@ -339,18 +360,31 @@ hwloc_init_cacheTopology(void)
         cachePool[id].threads = likwid_hwloc_record_objs_of_type_below_obj(
                         hwloc_topology, obj, HWLOC_OBJ_PU, NULL, NULL);
 #if defined(__x86_64) || defined(__i386__)
-        while (!(info = likwid_hwloc_obj_get_info_by_name(obj, "inclusiveness")) && obj->next_cousin)
+        if (obj->infos_count > 0)
         {
-            obj = obj->next_cousin; // If some PU/core are not bindable because of cgroup, hwloc may not know the inclusiveness of some of their cache.
-        }
-        if(info)
-        {
-            cachePool[id].inclusive = info[0]=='t';
+            while (!(info = likwid_hwloc_obj_get_info_by_name(obj, "inclusiveness")) && obj->next_cousin)
+            {
+                // If some PU/core are not bindable because of cgroup, hwloc may
+                // not know the inclusiveness of some of their cache.
+                obj = obj->next_cousin;
+            }
+            if(info)
+            {
+                cachePool[id].inclusive = info[0]=='t';
+            }
+            else if (cpuid_info.isIntel)
+            {
+                cachePool[id].inclusive = readCacheInclusiveIntel(obj->attr->cache.depth);
+            }
         }
-        else if (cpuid_info.isIntel)
+        else
         {
-            DEBUG_PLAIN_PRINT(DEBUGLEV_ONLY_ERROR, Cannot read cache inclusiveness);
-            cachePool[id].inclusive = 0;
+            // If a CPU is already pinned, it might not get the cache infos,
+            // so we get the inclusiveness through CPUID
+            if (cpuid_info.isIntel)
+                cachePool[id].inclusive = readCacheInclusiveIntel(obj->attr->cache.depth);
+            else
+                cachePool[id].inclusive = readCacheInclusiveAMD(obj->attr->cache.depth);
         }
 #endif
 #if defined(_ARCH_PPC)
@@ -372,7 +406,8 @@ hwloc_close(void)
 {
     if (hwloc_topology)
     {
-        hwloc_topology_destroy(hwloc_topology);
+        likwid_hwloc_topology_destroy(hwloc_topology);
+        hwloc_topology = NULL;
     }
 }
 #else
diff --git a/src/topology_proc.c b/src/topology_proc.c
index 8ceb64d..09e3b29 100644
--- a/src/topology_proc.c
+++ b/src/topology_proc.c
@@ -5,14 +5,14 @@
  *
  *      Description:  Interface to the procfs/sysfs based topology backend
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Authors:  Jan Treibig (jt), jan.treibig at gmail.com,
  *                Thomas Roehl (tr), thomas.roehl at googlemail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
@@ -392,6 +392,11 @@ proc_init_cpuFeatures(void)
             cpuid_info.featureFlags |= (1<<HTT);
             strcat(cpuid_info.features, "HTT ");
         }
+        else if (strncmp(cptr,"avx512", 6) == 0 && !(cpuid_info.featureFlags & (1<<AVX512)))
+        {
+            cpuid_info.featureFlags |= (1<<AVX512);
+            strcat(cpuid_info.features, "AVX512 ");
+        }
         cptr = strtok(NULL, delimiter);
     }
 
@@ -433,7 +438,6 @@ proc_init_nodeTopology(cpu_set_t cpuSet)
         {
             bstring src = bread ((bNread) fread, fp);
             hwThreadPool[i].coreId = ownatoi(bdata(src));
-            affinity_thread2core_lookup[hwThreadPool[i].apicId] = hwThreadPool[i].coreId;
             fclose(fp);
         }
         bdestroy(file);
@@ -622,6 +626,7 @@ proc_init_cacheTopology(void)
                 break;
             case K16_FAMILY:
             case K15_FAMILY:
+            case ZEN_FAMILY:
                 cachePool[i].inclusive = readCacheInclusiveAMD(cachePool[i].level);
                 break;
             /* For K8 and K10 it is known that they are inclusive */
diff --git a/src/tree.c b/src/tree.c
index bbf8668..c857004 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -5,13 +5,13 @@
  *
  *      Description:  Module implementing a tree data structure
  *
- *      Version:   4.2
- *      Released:  22.12.2016
+ *      Version:   4.3.1
+ *      Released:  04.01.2018
  *
  *      Author:   Jan Treibig (jt), jan.treibig at gmail.com
  *      Project:  likwid
  *
- *      Copyright (C) 2016 RRZE, University Erlangen-Nuremberg
+ *      Copyright (C) 2018 RRZE, University Erlangen-Nuremberg
  *
  *      This program is free software: you can redistribute it and/or modify it under
  *      the terms of the GNU General Public License as published by the Free Software
diff --git a/test/Makefile b/test/Makefile
index 6442444..a186039 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -4,7 +4,7 @@ LIKWID_LIB ?= -L$(PREFIX)/lib -llikwid
 LIKWID_INCLUDE ?= -I$(PREFIX)/include
 LIKWID_DEFINES ?= -DLIKWID_PERFMON
 
-all:  streamGCC
+all:  streamGCC jacobi-2D-5pt-gcc
 
 GCC_C11_SUPPORT_MAJOR=$(shell /bin/bash -c "g++ -v 2>&1 | grep -o -E '([0-9])\.' | head -n 1 | tr -d '[:punct:]'")
 GCC_C11_SUPPORT_MINOR=$(shell /bin/bash -c "g++ -v 2>&1 | grep -o -E '\.([0-9])\.' | head -n 1 | tr -d '[:punct:]'")
@@ -12,6 +12,9 @@ ICC_AVAILABLE=$(shell /bin/bash -c "which icc | wc -l")
 ICPC_AVAILABLE=$(shell /bin/bash -c "which icpc | wc -l")
 TBB_AVAILABLE=$(shell /bin/bash -c "ldconfig -v 2>/dev/null | grep libtbb.so | wc -l")
 
+jacobi-2D-5pt-gcc: jacobi-2D-5pt.c
+	gcc -O3 -std=c99 $(LIKWID_INCLUDE) $(LIKWID_DEFINES) -fopenmp  -o $@  jacobi-2D-5pt.c $(LIKWID_LIB) -lm -llikwid
+
 streamGCC: stream.c
 	gcc -O3 -std=c99 $(LIKWID_INCLUDE) $(LIKWID_DEFINES) -fopenmp  -o $@  stream.c $(LIKWID_LIB) -lm -llikwid
 
@@ -30,6 +33,9 @@ test-msr-access: test-msr-access.c
 streamICC: stream.c
 	if [ $(ICC_AVAILABLE) -ne 0 ]; then icc -O3 -xHost -std=c99 $(LIKWID_INCLUDES) -openmp  -o $@  $(LIKWID_DEFINES) stream.c $(LIKWID_LIB) -lm -llikwid; fi
 
+jacobi-2D-5pt-icc: jacobi-2D-5pt.c
+	if [ $(ICC_AVAILABLE) -ne 0 ]; then icc -O3 -xHost -std=c99 $(LIKWID_INCLUDES) -openmp  -o $@  $(LIKWID_DEFINES) jacobi-2D-5pt.c $(LIKWID_LIB) -lm -llikwid; fi
+
 streamGCC_C11: stream.cc
 	@if [ $(GCC_C11_SUPPORT_MAJOR) -eq 4  -a  $(GCC_C11_SUPPORT_MINOR) -gt 8 ]; then g++ -O3 -std=c++11 -pthread -o $@ $(LIKWID_DEFINES) stream.cc $(LIKWID_LIB) -lm -llikwid; fi
 	@if [ $(GCC_C11_SUPPORT_MAJOR) -gt 4 ]; then g++ -O3 -std=c++11 -pthread -o $@ $(LIKWID_DEFINES) stream.cc $(LIKWID_LIB) -lm -llikwid; fi
@@ -58,9 +64,9 @@ testTBBGCC:
 testTBBICC:
 	@if [ $(TBB_AVAILABLE) -ne 0 -a $(ICPC_AVAILABLE) -ne 0 ]; then icpc -O3 $(LIKWID_DEFINES) $(LIKWID_INCLUDES) -o $@ testTBB.cc -ltbb $(LIKWID_LIB) -llikwid; else echo "Either TBB or ICPC missing"; fi
 
-.PHONY: clean streamGCC streamICC streamGCC_C11 streamICC_C11 testmarker-cnt testmarker-omp testmarkerF90 test-mpi stream_cilk serial test-likwidAPI streamAPIGCC test-msr-access testTBBGCC testTBBICC
+.PHONY: clean streamGCC streamICC streamGCC_C11 streamICC_C11 testmarker-cnt testmarker-omp testmarkerF90 test-mpi stream_cilk serial test-likwidAPI streamAPIGCC test-msr-access testTBBGCC testTBBICC jacobi-2D-5pt-icc jacobi-2D-5pt-gcc
 
 clean:
-	rm -f streamGCC streamICC streamGCC_C11 streamICC_C11 stream_cilk testmarker-cnt testmarkerF90 test-mpi testmarker-omp serial test-likwidAPI streamAPIGCC test-msr-access testTBBGCC testTBBICC
+	rm -f streamGCC streamICC streamGCC_C11 streamICC_C11 stream_cilk testmarker-cnt testmarkerF90 test-mpi testmarker-omp serial test-likwidAPI streamAPIGCC test-msr-access testTBBGCC testTBBICC jacobi-2D-5pt-icc jacobi-2D-5pt-gcc
 
 
diff --git a/test/check_Event_Counters.py b/test/check_Event_Counters.py
new file mode 100644
index 0000000..20b1455
--- /dev/null
+++ b/test/check_Event_Counters.py
@@ -0,0 +1,156 @@
+#!/usr/bin/env/python3
+
+# ===========================================================================================================
+#
+#      Filename:  check_Event_Counters.py
+#
+#      Description:  Check an event for each counter
+#
+# ===========================================================================================================
+
+from subprocess import *
+import os, re, csv, argparse, sys
+
+
+event_counter = []
+counters = []
+eventlist = []
+cwd = os.getcwd()
+core = ['-c 1','-C 1','-c M:scatter','-C M:scatter','-c E:N:2','-C E:N:2','-c E:N:2:1:2','-C E:N:2:1:2']
+
+
+# ===========================================================================================================
+# Getting execution options
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-d", "--directory", help = "Location of the program")
+parser.add_argument("-E", "--executable", help = "The executable to test")
+args = parser.parse_args()
+
+if args.executable:
+	exe = args.executable
+else:
+	exe = "hostname"
+
+if args.directory:
+	if os.path.isdir(args.directory):
+		PATH = args.directory
+		if PATH[-1] != '/':
+			PATH = PATH + '/'
+	else:
+		sys.exit("Exit with NON-Zero code: The given directory is not valid")
+else:
+	PATH = ""
+
+
+# ===========================================================================================================
+# Executing "likwid-perfctr -e" and storing the results in "outstr" and errors in "outerr"	
+
+try:
+	EventList = PATH + "likwid-perfctr -e"
+	p = Popen(EventList, stdout = PIPE, stderr = PIPE, universal_newlines = True, shell = True)
+	outstr, outerr = p.communicate()
+	if p.returncode != 0:
+		raise Exception
+except Exception:
+	print("unable to execute: %s" %EventList)
+	outerr = "unable to execute: %s" %EventList
+
+	
+# ===========================================================================================================	
+#	store the events and corresponding counters in a list of tuples named "event_counter"
+
+lines = outstr.split('\n')
+idx_counter = lines.index("")
+
+for c in lines[2:idx_counter]:
+	args = c.split(',')
+	counters.append(args[0].strip())
+for e in lines[idx_counter + 5:-1]:
+	args = e.split(',')
+	temp = args[3].split('|')
+	if len(temp) > 1:
+		for i in range(0,len(temp)):
+			event_counter.append((args[0].strip(), temp[i].strip()))
+	else:
+		event_counter.append((args[0].strip(), temp[0].strip()))	
+
+# ===========================================================================================================		
+#	create a list of counters (one of each kind) in a list named "count_set"
+
+count_set = [item for item in counters if "FIXC" in item]
+for item in counters:
+	if item[:3] not in ''.join(count_set):
+		count_set.append(item)
+temp = [entry for entry in counters if 'FIX' in entry and 'FIXC' not in entry]
+count_set = count_set + temp
+
+# ===========================================================================================================		
+#	create a list containing commands to be called with "-g" in a list named "eventlist"
+			
+for count in count_set:
+	for e in event_counter:
+		if count.startswith(e[1]):
+			eventlist.append(e[0]+':'+count.strip())
+			break
+
+# ===========================================================================================================
+#	Extracting Header 
+
+cmd = PATH + "likwid-perfctr -c 0 -g BRANCH -V 2 -f hostname"
+p = Popen(cmd, stdout = PIPE, stderr = PIPE, universal_newlines = True, shell = True)
+outstr, outerr = p.communicate()
+if p.returncode == 0:
+	divider = '-'*80
+	header = re.search(r'%s\n.*?%s' %(divider, divider), outstr, re.DOTALL).group()
+else:
+	print("ERROR: Likwid-perfctr is not loaded.")
+	exit(1)
+# ===========================================================================================================
+#	Execute Likwid commands in commandline and store the result in "out.txt"
+#	and error messages in "err.txt"
+
+
+with open(cwd + '/out.csv', 'w', newline = '') as out,\
+	open(cwd + '/err.csv','w', newline = '') as err:
+	outwr = csv.writer(out, delimiter = '\t',quoting = csv.QUOTE_NONE, quotechar = '', escapechar = '\t')
+	errwr = csv.writer(err, quoting = csv.QUOTE_NONE, quotechar = '',escapechar = '\t')
+	outwr.writerow([header, '\n'*3])
+	errwr.writerow([header, '\n'*3])
+
+	counter = 0
+	
+	for c in core[0:1]:
+		EventList = PATH + "likwid-pin %s -p"%c
+		p = Popen(EventList, stdout = PIPE, stderr = PIPE, universal_newlines = True, shell = True)
+		pinOut, pinErr = p.communicate()
+
+		for e in eventlist:
+			cmd = PATH + "likwid-perfctr %s\t -g %s -V 2 -f %s" %(c, e, exe)
+			print(cmd)
+			p = Popen(cmd, stdout = PIPE, stderr = PIPE, universal_newlines = True, shell = True)
+			outstr, outeImmarr = p.communicate()
+			if p.returncode == 0:
+				for i in outstr.split("\n"):
+					if "Runtime" in i:
+						outwr.writerow(['%-35s' %e,'%-10s' %c,'Exit 0','\n'])
+						pinPrint = PATH + "likwid-pin %s -p:"%c
+						out.write('%-35s %-10s\n'%(pinPrint, (pinOut + pinErr)))
+						out.write(outstr[outstr.find('+'):outstr.rfind('+') + 1] + '\n\n')
+						out.write(('#'*80 + '\n')*3 + '\n')
+						break					
+			else:
+				outwr.writerow(['%-35s' %e,'%-10s' %c, 'Exit 1', '\n'])
+				pinPrint = PATH + "likwid-pin %s -p:" %c
+				err.write('%-35s %-10s\n' %(pinPrint, str(pinOut+pinErr)))
+				errwr.writerow([outerr + '\n\n'])
+				out.write(('#'*80 + '\n')*3 + '\n')
+
+
+				counter += 1
+
+# ===========================================================================================================
+# Delete Error file if There exists no Error
+
+if counter == 0:
+	os.remove(cwd + "/err.csv", dir_fd = None)
diff --git a/test/executable_tests/Makefile b/test/executable_tests/Makefile
index 11b12b7..2dd44bf 100644
--- a/test/executable_tests/Makefile
+++ b/test/executable_tests/Makefile
@@ -1,22 +1,24 @@
 
 
-all: topology pin markerAPI perfctr memsweeper powermeter bench genTopoCfg setFrequencies
+all: likwid-topology likwid-pin likwid-markerAPI likwid-perfctr likwid-memsweeper likwid-powermeter likwid-bench likwid-genTopoCfg likwid-setFrequencies
 
-topology:
+likwid-topology:
 	./tester.sh likwid-topology
-pin:
+likwid-pin:
 	./tester.sh likwid-pin
-perfctr:
+likwid-perfctr:
 	./tester.sh likwid-perfctr
-memsweeper:
+likwid-memsweeper:
 	./tester.sh likwid-memsweeper
-powermeter:
+likwid-powermeter:
 	./tester.sh likwid-powermeter
-bench:
+likwid-bench:
 	./tester.sh likwid-bench
-genTopoCfg:
+likwid-mpirun:
+	./tester.sh likwid-mpirun
+likwid-genTopoCfg:
 	./tester.sh likwid-genTopoCfg
-setFrequencies:
+likwid-setFrequencies:
 	./tester.sh likwid-setFrequencies
-markerAPI:
+likwid-markerAPI:
 	make -s -C .. streamGCC
diff --git a/test/executable_tests/likwid-perfctr.txt b/test/executable_tests/likwid-perfctr.txt
index c52de96..103697f 100644
--- a/test/executable_tests/likwid-perfctr.txt
+++ b/test/executable_tests/likwid-perfctr.txt
@@ -3,25 +3,25 @@
 -v | EXIT 0 | GREP likwid-perfctr
 -i | EXIT 0 | GREP CPU family
 -V 1 -c 0 hostname | EXIT 0 | GREP Option(s) -g <string> must be given on commandline
--V 1 | EXIT 1 | GREP Option -c <list> or -C <list> must be given on commandline
+-V 1 | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -V | EXIT 1 | GREP Option requires an argument
 -g | EXIT 1 | GREP Option requires an argument
 -g BRANCH -H | EXIT 0 | GREP Group BRANCH:
 -a | EXIT 0 | GREP Group Name | GREP Description
 -e | EXIT 0 | GREP This architecture
--t 200ms | EXIT 1 | GREP Option -c <list> or -C <list> must be given on commandline
+-t 200ms | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -c | EXIT 1 | GREP Option requires an argument
 -c 0 | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -t 200ms -c 0 | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -S | EXIT 1 | GREP Option requires an argument
 -o | EXIT 1 | GREP Option requires an argument
--o /tmp/test | EXIT 1 | GREP Option -c <list> or -C <list> must be given on commandline
+-o /tmp/test | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -c 0 -o /tmp/test | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -C 0 -g BRANCH -o /tmp/test | EXIT 1 | GREP No Executable can be found on commandline
 -C 0 -g BRANCH -o /tmp/test hostname | EXIT 0
--o /tmp/test.txt | EXIT 1 | GREP Option -c <list> or -C <list> must be given on commandline
+-o /tmp/test.txt | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -C 0 -g BRANCH -o /tmp/test.txt hostname | EXIT 0 | NGREP Cannot find filter script, save output in CSV format
--S 1s | EXIT 1 | GREP Option -c <list> or -C <list> must be given on commandline
+-S 1s | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -S 1s -c 0 | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -S 1s -C 0 | EXIT 1 | GREP Option(s) -g <string> must be given on commandline
 -S 1s -c 0 -g BRANCH -f | EXIT 0 | GREP Group 1: BRANCH | GREP Branch
diff --git a/test/executable_tests/likwid-pin.txt b/test/executable_tests/likwid-pin.txt
index 54b62b4..b6dcc9a 100644
--- a/test/executable_tests/likwid-pin.txt
+++ b/test/executable_tests/likwid-pin.txt
@@ -1,13 +1,17 @@
 -h | EXIT 0 | GREP Help message
 -v | EXIT 0 | GREP likwid-pin
 -i | EXIT 1 | GREP Executable must be given on commandline
--i hostname | EXIT 0 | GREP Set mem_policy to interleaved
+-i hostname | EXIT 0 | GREP set mem_policy to interleaved
 -S | EXIT 1 |GREP Executable must be given on commandline
--S hostname | EXIT 0 | GREP Sweeping memory
+-S hostname | EXIT 0 | GREP Sweeping domain
 -c | EXIT 1 |GREP Option requires an argument
 -p | EXIT 0 | GREP Domain
 -c 0 | EXIT 1 | GREP Executable must be given on commandline
 -c 0 -p | EXIT 0 | GREP 0
+-c N -p | EXIT 0 | GREP 0
+-c C0 -p | EXIT 0 | GREP 0
+-c S0 -p | EXIT 0 | GREP 0
+-c M0 -p | EXIT 0 | GREP 0
 -c N:0 -p | EXIT 0 | GREP 0
 -c S0:0-1 -p | EXIT 0 | GREP 0,1
 -c N:0 at N:1 -p | EXIT 0 | GREP 0,1
diff --git a/test/executable_tests/likwid-setFrequencies.txt b/test/executable_tests/likwid-setFrequencies.txt
index 821f925..d2b4af3 100644
--- a/test/executable_tests/likwid-setFrequencies.txt
+++ b/test/executable_tests/likwid-setFrequencies.txt
@@ -10,5 +10,5 @@
 -f | EXIT 1 | GREP Option requires an argument
 -g performance | EXIT 0
 -f FREQ | EXIT 0
--c 0 -g conservative | EXIT 0
+-c 0 -g powersave | EXIT 0
 -c 0 -f FREQ | EXIT 0
diff --git a/test/executable_tests/tester.sh b/test/executable_tests/tester.sh
index ec02bda..b0ae5ed 100755
--- a/test/executable_tests/tester.sh
+++ b/test/executable_tests/tester.sh
@@ -7,6 +7,7 @@ fi
 EXECPATH=/usr/local/bin
 EXEC=$1
 TMPFILE=/tmp/testout
+
 FREQ="2.3"
 
 f_grep() {
@@ -41,6 +42,8 @@ if [ ! -e ${EXEC}.txt ]; then
     echo "Cannot find testfile ${EXEC}.txt"
     exit 1
 fi
+LOGFILE=/tmp/tester-${EXEC}.log
+rm -f ${LOGFILE}
 if [ "${EXEC}" == "likwid-setFrequencies" ]; then
     FREQ=$(${EXECPATH}/likwid-setFrequencies -l | grep -v frequencies | awk '{print $2}')
     CURFREQ=$(${EXECPATH}/likwid-setFrequencies -p | head -n2 | tail -n 1 | rev | awk '{print $2}' | rev | awk -F'/' '{print $2}')
@@ -80,16 +83,25 @@ while read -r LINE || [[ -n $LINE ]]; do
             STATE=$?
         fi
     done
+    
+    
     if [ $STATE -eq 0 ]; then
         echo "SUCCESS : ${EXEC}" "${OPTIONS}"
     else
         echo "FAIL : ${EXEC}" "${OPTIONS}"
+        echo "######################################################################" >> ${LOGFILE}
+        echo "${EXEC}" "${OPTIONS}" >> ${LOGFILE}
+        cat ${TMPFILE} >> ${LOGFILE}
+        echo "EXITCODE: ${EXITCODE}" >> ${LOGFILE}
+        echo "FAIL : ${EXEC}" "${OPTIONS}" >> ${LOGFILE}
+        echo "######################################################################" >> ${LOGFILE}
     fi
+    
 done < ${EXEC}.txt
 
 
 if [ "${EXEC}" == "likwid-setFrequencies" ]; then
-    ${EXECPATH}/${EXEC} -f "${CURFREQ}"
+    ${EXECPATH}/${EXEC} -reset
 fi
 
 rm -f /tmp/topo.txt /tmp/test /tmp/test.txt /tmp/out.txt /tmp/out
diff --git a/test/jacobi-2D-5pt.c b/test/jacobi-2D-5pt.c
new file mode 100644
index 0000000..7f392ac
--- /dev/null
+++ b/test/jacobi-2D-5pt.c
@@ -0,0 +1,116 @@
+#include<stdlib.h>
+#include<stdio.h>
+#include<omp.h>
+#include<sys/time.h>
+
+#ifdef LIKWID_PERFMON
+#include <likwid.h>
+#endif
+
+int main()
+{
+    //this is minimum iteration;
+    //total iteration is a multiple of
+    //this, depending on runtime
+    int niter = 10;
+
+    int startSize = 1000;
+    int endSize = 20000;
+    int incSize = 1000;
+
+    printf("%5s\t%7s\t\t%10s\n","Thread", "Size", "MLUPS");
+
+    int thread_num = 1;
+#ifdef LIKWID_PERFMON
+    LIKWID_MARKER_INIT;
+#endif
+
+#pragma omp parallel
+    {
+#pragma omp single
+        {
+            thread_num = omp_get_num_threads();
+        }
+    }
+
+    for(int Size= startSize; Size<endSize; Size+=incSize)
+    {
+        double *phi = (double*) malloc(Size*Size*sizeof(double));
+        double *phi_new = (double*) malloc(Size*Size*sizeof(double));
+        char regname[100];
+        snprintf(regname, 99, "size-%d", Size);
+
+#pragma omp parallel for schedule(runtime)
+        for(int i=0;i<Size;++i)
+        {
+            for(int j=0;j<Size;++j)
+            {
+                phi[i*Size+j]=1;
+                phi_new[i*Size+j]=1;
+            }
+        }
+
+        int ctr = 0;
+
+        struct timeval tym;
+        gettimeofday(&tym,NULL);
+        double wcs=tym.tv_sec+(tym.tv_usec*1e-6);
+        double wce=wcs;
+
+#ifdef LIKWID_PERFMON
+#pragma omp parallel
+{
+        LIKWID_MARKER_START(regname);
+}
+#endif
+        while((wce-wcs) < 0.1)
+        {
+            for(int iter=1;iter<=niter;++iter)
+            {
+
+#pragma omp parallel for schedule(runtime)
+                for(int i=1;i<Size-1;++i)
+                {
+#pragma simd
+                    for(int j=1;j<Size-1;++j)
+                    {
+                        phi_new[i*Size+j]=phi[i*Size+j] + phi[(i+1)*Size+j]+phi[(i-1)*Size+j]+phi[i*Size+j+1] +phi[i*Size+j-1];
+                    }
+                }
+                //swap arrays
+                double* temp = phi_new;
+                phi_new = phi;
+                phi = temp;
+            }
+            ++ctr;
+            gettimeofday(&tym,NULL);
+            wce=tym.tv_sec+(tym.tv_usec*1e-6);
+        }
+#ifdef LIKWID_PERFMON
+#pragma omp parallel
+{
+
+        LIKWID_MARKER_STOP(regname);
+}
+#endif
+
+        double size_d = Size;
+        double mlups = (size_d*size_d*niter*ctr*1.0e-6)/(wce-wcs);
+
+        char thread_num_str[5];
+        sprintf(thread_num_str, "%d", thread_num);
+        char Size_str[7];
+        sprintf(Size_str, "%d", Size);
+        char mlup_str[10];
+        sprintf(mlup_str, "%6.4f", mlups);
+        printf("%5s\t%7s\t\t%10s\n",thread_num_str, Size_str, mlup_str);
+
+        free(phi);
+        free(phi_new);
+
+    }
+#ifdef LIKWID_PERFMON
+    LIKWID_MARKER_CLOSE;
+#endif
+    return 0;
+}
diff --git a/test/serial.c b/test/serial.c
index 3debf10..45a37e0 100644
--- a/test/serial.c
+++ b/test/serial.c
@@ -8,9 +8,13 @@ int main(int argc, char* argv[])
 {
     int i, j;
     int size;
+    int iters = 10;
     double* vector;
     if (argc != 2)
+    {
+        printf("Number of elements for vector must be given on command line.\n");
         return 1;
+    }
 
     size = atoi(argv[1]);
     vector = (double*) malloc(size * sizeof(double));
@@ -23,15 +27,17 @@ int main(int argc, char* argv[])
     for (i=0;i<size;i++)
         vector[i] = 2.0;
     LIKWID_MARKER_STOP("init");
+    printf("Initialized %d elements\n", size);
 
 
     LIKWID_MARKER_START("pow");
-    for (j=0;j<10;j++)
+    for (j=0;j<iters;j++)
     {
         for (i=0;i<size;i++)
             vector[i] = vector[i] * vector[i];
     }
     LIKWID_MARKER_STOP("pow");
+    printf("Calculated power of %d for all %d elements\n", iters*2, size);
 
     LIKWID_MARKER_CLOSE;
 
diff --git a/test/test-likwidAPI.c b/test/test-likwidAPI.c
index 6d723f0..3e5f4b0 100644
--- a/test/test-likwidAPI.c
+++ b/test/test-likwidAPI.c
@@ -432,34 +432,47 @@ int test_perfmoninit_faulty()
     int cpu = 0;
     int ret = perfmon_init(1, &cpu);
     if (ret != 0)
+    {
+        if (verbose) fprintf(stderr, "perfmon_init failed with %d: %s\n", ret, strerror(errno));
         goto fail;
+    }
     perfmon_finalize();
-    return 0;
+    return 1;
 fail:
     perfmon_finalize();
-    return 1;
+    return 0;
 }
 
 int test_perfmoninit_valid()
 {
     int cpu = 0;
-    topology_init();
-    affinity_init();
+    init_configuration();
+
     int ret = perfmon_init(1, &cpu);
     if (ret != 0)
+    {
+        if (verbose) fprintf(stderr, "perfmon_init failed with %d: %s\n", ret, strerror(errno));
         goto fail;
+    }
     if (perfmon_getNumberOfGroups() != 0)
+    {
+        if (verbose) fprintf(stderr, "perfmon_getNumberOfGroups() unequal to zero\n");
         goto fail;
+    }
     if (perfmon_getNumberOfThreads() != 1)
+    {
+        if (verbose) fprintf(stderr, "perfmon_getNumberOfThreads() unequal to 1\n");
         goto fail;
+    }
     perfmon_finalize();
-    affinity_finalize();
-    topology_finalize();
+
+    destroy_configuration();
     return 1;
 fail:
     perfmon_finalize();
     affinity_finalize();
     topology_finalize();
+    destroy_configuration();
     return 0;
 }
 
@@ -677,13 +690,22 @@ int test_perfmongetgroups()
     char** slist = NULL;
     char** llist = NULL;
     int ret = perfmon_getGroups(&glist, &slist, &llist);
-
+    fprintf(stderr, "perfmon_getGroups() returned %d groups\n", ret);
     if (ret <= 0)
     {
         goto fail;
     }
+
     for (i=0; i< ret; i++)
     {
+        if (!glist[i])
+            fprintf(stderr, "No group name");
+        if (!slist[i])
+            fprintf(stderr, "No short info for group name %s\n", glist[i]);
+        if (!llist[i])
+            fprintf(stderr, "No long info for group name %s\n", glist[i]);
+        if (!llist[i] || !glist[i] || !slist[i])
+            goto fail;
         if (strcmp(glist[i], "") == 0)
         {
             goto fail;
@@ -1157,9 +1179,10 @@ fail:
 int test_perfmonresult_noinit()
 {
     double result = perfmon_getResult(0,0,0);
-    if (result != 0)
-        goto fail;
-    return 1;
+    if (isnan(result));
+    {
+        return 1;
+    }
 fail:
     return 0;
 }
@@ -1180,7 +1203,7 @@ int test_perfmonresult_noadd()
     if (ret != 0)
         goto fail;
     double result = perfmon_getResult(0,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1523,7 +1546,7 @@ fail:
 int test_perfmonmetric_noinit()
 {
     double result = perfmon_getMetric(0,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     return 1;
 fail:
@@ -1546,7 +1569,7 @@ int test_perfmonmetric_noadd()
     if (ret != 0)
         goto fail;
     double result = perfmon_getMetric(0,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1577,7 +1600,7 @@ int test_perfmonmetric_nosetup()
         goto fail;
     group = ret;
     double result = perfmon_getMetric(group,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1611,7 +1634,7 @@ int test_perfmonmetric_nostart()
     if (ret != 0)
         goto fail;
     double result = perfmon_getMetric(group,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1648,7 +1671,7 @@ int test_perfmonmetric_nostop()
     if (ret != 0)
         goto fail;
     double result = perfmon_getMetric(group,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1705,7 +1728,7 @@ fail:
 int test_perfmonlastmetric_noinit()
 {
     double result = perfmon_getLastMetric(0,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     return 1;
 fail:
@@ -1728,7 +1751,7 @@ int test_perfmonlastmetric_noadd()
     if (ret != 0)
         goto fail;
     double result = perfmon_getLastMetric(0,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1759,7 +1782,7 @@ int test_perfmonlastmetric_nosetup()
         goto fail;
     group = ret;
     double result = perfmon_getLastMetric(group,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1793,7 +1816,7 @@ int test_perfmonlastmetric_nostart()
     if (ret != 0)
         goto fail;
     double result = perfmon_getLastMetric(group,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -1830,7 +1853,7 @@ int test_perfmonlastmetric_nostop()
     if (ret != 0)
         goto fail;
     double result = perfmon_getLastMetric(group,0,0);
-    if (result != 0)
+    if (!(isnan(result)))
         goto fail;
     perfmon_finalize();
     topology_finalize();
@@ -2132,15 +2155,17 @@ static test testlist[] = {
 int main()
 {
     int i = 0;
+    int ret = 0;
     //fclose(stderr);
     if (verbose > 0) perfmon_setVerbosity(3);
     while (testlist[i].testfunc != NULL)
     {
         printf("%s:\t", testlist[i].testname);
         if (verbose > 0) printf("\n");
-        if (testlist[i].testfunc() != testlist[i].result)
+        ret = testlist[i].testfunc();
+        if (ret != testlist[i].result)
         {
-            printf("FAILED\n");
+            printf("FAILED with return code %d instead of expected %d\n", ret, testlist[i].result);
             return 1;
         }
         printf("OK\n");
diff --git a/test/testmarker-cnt.c b/test/testmarker-cnt.c
index 3a32a7f..d25f387 100644
--- a/test/testmarker-cnt.c
+++ b/test/testmarker-cnt.c
@@ -9,7 +9,7 @@
 
 double sum = 0, a[SIZE], b[SIZE], c[SIZE];
 
-main()
+int main(int argc, char* argv[])
 {
     int i, j ;
     double alpha = 3.14;
@@ -21,11 +21,11 @@ main()
         b[i] = 1.0;
         c[i] = (double) i;
     }
+    LIKWID_MARKER_INIT;
 
 //    likwid_pinProcess(2);
-    printf("Running on core %d\n", likwid_getProcessorId());
+    printf("Main running on core %d\n", likwid_getProcessorId());
 
-    LIKWID_MARKER_INIT;
 
 /****************************************************/
 #pragma omp parallel
@@ -34,7 +34,7 @@ main()
         char* label = malloc(40*sizeof(char));
         int threadId = omp_get_thread_num();
 //        likwid_pinThread(threadId);
-        printf("Running on core %d\n", likwid_getProcessorId());
+        printf("Thread running on core %d\n", likwid_getProcessorId());
 
         for (int counter=1; counter< 3; counter++)
         {
diff --git a/test/testmarker-nested.c b/test/testmarker-nested.c
index 37c5f7a..784623a 100644
--- a/test/testmarker-nested.c
+++ b/test/testmarker-nested.c
@@ -1,9 +1,11 @@
+#define _GNU_SOURCE
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <omp.h>
+#include <sched.h>
 
-#ifdef PERFMON
 #include <likwid.h>
-#endif
 
 #define SIZE 1000000
 #define N1   1000
@@ -12,9 +14,10 @@
 
 double sum = 0, a[SIZE], b[SIZE], c[SIZE];
 
-main()
+int main(int argc, char* argv[])
 {
     double alpha = 3.14;
+    int num_dels = 1;
 
     /* Initialize */
     for (int i=0; i<SIZE; i++)
@@ -25,30 +28,31 @@ main()
     }
 
     LIKWID_MARKER_INIT;
-
-#pragma omp parallel for num_threads(num_tasks) 
-        for (int task = 0; task<num_dels+1; task++) { 
-            if (task==0) { 
-#pragma omp parallel for num_threads(num_threads) 
-                for (thread_num=0; thread_num < num_threads; thread_num++) { 
-                    cpu_set_t set; 
-                    CPU_ZERO(&set); 
-                    CPU_SET(...) 
-                    sched_setaffinity(0, sizeof(cpu_set_t), &set); 
-
-                    /**... work ...**/ 
-                } //barrier 
-
-                /**...unmeasured work **/ 
-            } else { //task==1,2 
-                cpu_set_t set; 
-                CPU_ZERO(&set); 
-                CPU_SET(...) 
-                sched_setaffinity(0, sizeof(cpu_set_t), &set); 
-
-                /**... work... **/ 
-            } 
-        } 
+    int num_threads = omp_get_num_threads();
+
+#pragma omp parallel for num_threads(num_tasks)
+    for (int task = 0; task<num_dels+1; task++) {
+        if (task==0) {
+#pragma omp parallel for num_threads(num_threads)
+            for (int thread_num=0; thread_num < num_threads; thread_num++) {
+                cpu_set_t set;
+                CPU_ZERO(&set);
+                CPU_SET(thread_num, &set);
+                sched_setaffinity(0, sizeof(cpu_set_t), &set);
+
+                /**... work ...**/
+            } //barrier
+
+        /**...unmeasured work **/
+        } else { //task==1,2
+            cpu_set_t set;
+            CPU_ZERO(&set);
+            CPU_SET(0, &set);
+            sched_setaffinity(0, sizeof(cpu_set_t), &set);
+
+            /**... work... **/
+        }
+    }
 
     LIKWID_MARKER_CLOSE;
     printf( "OK, dofp result = %e\n", sum);
diff --git a/test/testmarker-omp.c b/test/testmarker-omp.c
index 5581a49..e5bc4db 100644
--- a/test/testmarker-omp.c
+++ b/test/testmarker-omp.c
@@ -1,5 +1,8 @@
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <omp.h>
+#include <unistd.h>
 
 #include <likwid.h>
 
@@ -7,7 +10,7 @@
 
 double sum = 0, a[SIZE], b[SIZE], c[SIZE];
 
-main()
+int main(int argc, char* argv[])
 {
     double alpha = 3.14;
 
@@ -35,7 +38,7 @@ main()
         for (int j = 0; j < 10; j++)
         {
 
-        LIKWID_MARKER_START("plain");
+            LIKWID_MARKER_START("plain");
             for (int k = 0; k < (threadId+1); k++)  {
                 for (int i = 0; i < SIZE; i++) 
                 {
@@ -44,7 +47,7 @@ main()
                 }
             }
 
-        LIKWID_MARKER_STOP("plain");
+            LIKWID_MARKER_STOP("plain");
         }
         printf("Flops performed plain: %g\n",(double)10*SIZE*3);
         /****************************************************/

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/likwid/likwid.git



More information about the Likwid-commit mailing list