diff --git a/NEWS b/NEWS
index c5b53f16ba4e1d331883cc57ef05188224d975e9..d1bd6e6fe050d296e01235eea85d021c4f711622 100644
--- a/NEWS
+++ b/NEWS
@@ -140,6 +140,7 @@ documents those changes that are of interest to users and administrators.
  -- slurmd - do not print ClusterName when using 'slurmd -C'.
  -- Correct a bitmap test function (used only by the select/bluegene plugin).
  -- Do not propagate SLURM_UMASK environment variable to batch script.
+ -- Added node_features/knl_generic plugin for KNL support on non-Cray systems.
 
 * Changes in Slurm 16.05.5
 ==========================
diff --git a/configure b/configure
index 406561d972873d483d841e13e6e5e2b5a110e1ff..87b1317cc754f2e7d09baa2a25016d09445ae046 100755
--- a/configure
+++ b/configure
@@ -24378,7 +24378,7 @@ fi
 
 
 
-ac_config_files="$ac_config_files Makefile auxdir/Makefile contribs/Makefile contribs/cray/Makefile contribs/cray/csm/Makefile contribs/lua/Makefile contribs/mic/Makefile contribs/pam/Makefile contribs/pam_slurm_adopt/Makefile contribs/perlapi/Makefile contribs/perlapi/libslurm/Makefile contribs/perlapi/libslurm/perl/Makefile.PL contribs/perlapi/libslurmdb/Makefile contribs/perlapi/libslurmdb/perl/Makefile.PL contribs/seff/Makefile contribs/torque/Makefile contribs/openlava/Makefile contribs/phpext/Makefile contribs/phpext/slurm_php/config.m4 contribs/sgather/Makefile contribs/sgi/Makefile contribs/sjobexit/Makefile contribs/slurmdb-direct/Makefile contribs/pmi2/Makefile doc/Makefile doc/man/Makefile doc/man/man1/Makefile doc/man/man3/Makefile doc/man/man5/Makefile doc/man/man8/Makefile doc/html/Makefile doc/html/configurator.html doc/html/configurator.easy.html etc/Makefile src/Makefile src/api/Makefile src/bcast/Makefile src/common/Makefile src/db_api/Makefile src/layouts/Makefile src/layouts/power/Makefile src/layouts/unit/Makefile src/database/Makefile src/sacct/Makefile src/sacctmgr/Makefile src/sreport/Makefile src/salloc/Makefile src/sbatch/Makefile src/sbcast/Makefile src/sattach/Makefile src/scancel/Makefile src/scontrol/Makefile src/sdiag/Makefile src/sinfo/Makefile src/slurmctld/Makefile src/slurmd/Makefile src/slurmd/common/Makefile src/slurmd/slurmd/Makefile src/slurmd/slurmstepd/Makefile src/slurmdbd/Makefile src/smap/Makefile src/smd/Makefile src/sprio/Makefile src/squeue/Makefile src/srun/Makefile src/srun/libsrun/Makefile src/srun_cr/Makefile src/sshare/Makefile src/sstat/Makefile src/strigger/Makefile src/sview/Makefile src/plugins/Makefile src/plugins/accounting_storage/Makefile src/plugins/accounting_storage/common/Makefile src/plugins/accounting_storage/filetxt/Makefile src/plugins/accounting_storage/mysql/Makefile src/plugins/accounting_storage/none/Makefile src/plugins/accounting_storage/slurmdbd/Makefile src/plugins/acct_gather_energy/Makefile src/plugins/acct_gather_energy/cray/Makefile src/plugins/acct_gather_energy/rapl/Makefile src/plugins/acct_gather_energy/ibmaem/Makefile src/plugins/acct_gather_energy/ipmi/Makefile src/plugins/acct_gather_energy/none/Makefile src/plugins/acct_gather_infiniband/Makefile src/plugins/acct_gather_infiniband/ofed/Makefile src/plugins/acct_gather_infiniband/none/Makefile src/plugins/acct_gather_filesystem/Makefile src/plugins/acct_gather_filesystem/lustre/Makefile src/plugins/acct_gather_filesystem/none/Makefile src/plugins/acct_gather_profile/Makefile src/plugins/acct_gather_profile/hdf5/Makefile src/plugins/acct_gather_profile/hdf5/sh5util/Makefile src/plugins/acct_gather_profile/hdf5/sh5util/libsh5util_old/Makefile src/plugins/acct_gather_profile/none/Makefile src/plugins/auth/Makefile src/plugins/auth/munge/Makefile src/plugins/auth/none/Makefile src/plugins/burst_buffer/Makefile src/plugins/burst_buffer/common/Makefile src/plugins/burst_buffer/cray/Makefile src/plugins/burst_buffer/generic/Makefile src/plugins/checkpoint/Makefile src/plugins/checkpoint/blcr/Makefile src/plugins/checkpoint/blcr/cr_checkpoint.sh src/plugins/checkpoint/blcr/cr_restart.sh src/plugins/checkpoint/none/Makefile src/plugins/checkpoint/ompi/Makefile src/plugins/checkpoint/poe/Makefile src/plugins/core_spec/Makefile src/plugins/core_spec/cray/Makefile src/plugins/core_spec/none/Makefile src/plugins/crypto/Makefile src/plugins/crypto/munge/Makefile src/plugins/crypto/openssl/Makefile src/plugins/ext_sensors/Makefile src/plugins/ext_sensors/rrd/Makefile src/plugins/ext_sensors/none/Makefile src/plugins/gres/Makefile src/plugins/gres/gpu/Makefile src/plugins/gres/nic/Makefile src/plugins/gres/mic/Makefile src/plugins/jobacct_gather/Makefile src/plugins/jobacct_gather/common/Makefile src/plugins/jobacct_gather/linux/Makefile src/plugins/jobacct_gather/cgroup/Makefile src/plugins/jobacct_gather/none/Makefile src/plugins/jobcomp/Makefile src/plugins/jobcomp/elasticsearch/Makefile src/plugins/jobcomp/filetxt/Makefile src/plugins/jobcomp/none/Makefile src/plugins/jobcomp/script/Makefile src/plugins/jobcomp/mysql/Makefile src/plugins/job_container/Makefile src/plugins/job_container/cncu/Makefile src/plugins/job_container/none/Makefile src/plugins/job_submit/Makefile src/plugins/job_submit/all_partitions/Makefile src/plugins/job_submit/cray/Makefile src/plugins/job_submit/defaults/Makefile src/plugins/job_submit/logging/Makefile src/plugins/job_submit/lua/Makefile src/plugins/job_submit/partition/Makefile src/plugins/job_submit/pbs/Makefile src/plugins/job_submit/require_timelimit/Makefile src/plugins/job_submit/throttle/Makefile src/plugins/launch/Makefile src/plugins/launch/aprun/Makefile src/plugins/launch/poe/Makefile src/plugins/launch/runjob/Makefile src/plugins/launch/slurm/Makefile src/plugins/mcs/Makefile src/plugins/mcs/none/Makefile src/plugins/mcs/group/Makefile src/plugins/mcs/user/Makefile src/plugins/node_features/Makefile src/plugins/node_features/knl_cray/Makefile src/plugins/power/Makefile src/plugins/power/common/Makefile src/plugins/power/cray/Makefile src/plugins/power/none/Makefile src/plugins/preempt/Makefile src/plugins/preempt/job_prio/Makefile src/plugins/preempt/none/Makefile src/plugins/preempt/partition_prio/Makefile src/plugins/preempt/qos/Makefile src/plugins/priority/Makefile src/plugins/priority/basic/Makefile src/plugins/priority/multifactor/Makefile src/plugins/proctrack/Makefile src/plugins/proctrack/cray/Makefile src/plugins/proctrack/cgroup/Makefile src/plugins/proctrack/pgid/Makefile src/plugins/proctrack/linuxproc/Makefile src/plugins/proctrack/sgi_job/Makefile src/plugins/proctrack/lua/Makefile src/plugins/route/Makefile src/plugins/route/default/Makefile src/plugins/route/topology/Makefile src/plugins/sched/Makefile src/plugins/sched/backfill/Makefile src/plugins/sched/builtin/Makefile src/plugins/sched/hold/Makefile src/plugins/sched/wiki/Makefile src/plugins/sched/wiki2/Makefile src/plugins/select/Makefile src/plugins/select/alps/Makefile src/plugins/select/alps/libalps/Makefile src/plugins/select/alps/libemulate/Makefile src/plugins/select/bluegene/Makefile src/plugins/select/bluegene/ba_bgq/Makefile src/plugins/select/bluegene/bl_bgq/Makefile src/plugins/select/bluegene/sfree/Makefile src/plugins/select/cons_res/Makefile src/plugins/select/cray/Makefile src/plugins/select/linear/Makefile src/plugins/select/other/Makefile src/plugins/select/serial/Makefile src/plugins/slurmctld/Makefile src/plugins/slurmctld/nonstop/Makefile src/plugins/slurmd/Makefile src/plugins/switch/Makefile src/plugins/switch/cray/Makefile src/plugins/switch/generic/Makefile src/plugins/switch/none/Makefile src/plugins/switch/nrt/Makefile src/plugins/switch/nrt/libpermapi/Makefile src/plugins/mpi/Makefile src/plugins/mpi/mpich1_p4/Makefile src/plugins/mpi/mpich1_shmem/Makefile src/plugins/mpi/mpichgm/Makefile src/plugins/mpi/mpichmx/Makefile src/plugins/mpi/mvapich/Makefile src/plugins/mpi/lam/Makefile src/plugins/mpi/none/Makefile src/plugins/mpi/openmpi/Makefile src/plugins/mpi/pmi2/Makefile src/plugins/mpi/pmix/Makefile src/plugins/task/Makefile src/plugins/task/affinity/Makefile src/plugins/task/cgroup/Makefile src/plugins/task/cray/Makefile src/plugins/task/none/Makefile src/plugins/topology/Makefile src/plugins/topology/3d_torus/Makefile src/plugins/topology/hypercube/Makefile src/plugins/topology/node_rank/Makefile src/plugins/topology/none/Makefile src/plugins/topology/tree/Makefile testsuite/Makefile testsuite/expect/Makefile testsuite/slurm_unit/Makefile testsuite/slurm_unit/api/Makefile testsuite/slurm_unit/api/manual/Makefile testsuite/slurm_unit/common/Makefile"
+ac_config_files="$ac_config_files Makefile auxdir/Makefile contribs/Makefile contribs/cray/Makefile contribs/cray/csm/Makefile contribs/lua/Makefile contribs/mic/Makefile contribs/pam/Makefile contribs/pam_slurm_adopt/Makefile contribs/perlapi/Makefile contribs/perlapi/libslurm/Makefile contribs/perlapi/libslurm/perl/Makefile.PL contribs/perlapi/libslurmdb/Makefile contribs/perlapi/libslurmdb/perl/Makefile.PL contribs/seff/Makefile contribs/torque/Makefile contribs/openlava/Makefile contribs/phpext/Makefile contribs/phpext/slurm_php/config.m4 contribs/sgather/Makefile contribs/sgi/Makefile contribs/sjobexit/Makefile contribs/slurmdb-direct/Makefile contribs/pmi2/Makefile doc/Makefile doc/man/Makefile doc/man/man1/Makefile doc/man/man3/Makefile doc/man/man5/Makefile doc/man/man8/Makefile doc/html/Makefile doc/html/configurator.html doc/html/configurator.easy.html etc/Makefile src/Makefile src/api/Makefile src/bcast/Makefile src/common/Makefile src/db_api/Makefile src/layouts/Makefile src/layouts/power/Makefile src/layouts/unit/Makefile src/database/Makefile src/sacct/Makefile src/sacctmgr/Makefile src/sreport/Makefile src/salloc/Makefile src/sbatch/Makefile src/sbcast/Makefile src/sattach/Makefile src/scancel/Makefile src/scontrol/Makefile src/sdiag/Makefile src/sinfo/Makefile src/slurmctld/Makefile src/slurmd/Makefile src/slurmd/common/Makefile src/slurmd/slurmd/Makefile src/slurmd/slurmstepd/Makefile src/slurmdbd/Makefile src/smap/Makefile src/smd/Makefile src/sprio/Makefile src/squeue/Makefile src/srun/Makefile src/srun/libsrun/Makefile src/srun_cr/Makefile src/sshare/Makefile src/sstat/Makefile src/strigger/Makefile src/sview/Makefile src/plugins/Makefile src/plugins/accounting_storage/Makefile src/plugins/accounting_storage/common/Makefile src/plugins/accounting_storage/filetxt/Makefile src/plugins/accounting_storage/mysql/Makefile src/plugins/accounting_storage/none/Makefile src/plugins/accounting_storage/slurmdbd/Makefile src/plugins/acct_gather_energy/Makefile src/plugins/acct_gather_energy/cray/Makefile src/plugins/acct_gather_energy/rapl/Makefile src/plugins/acct_gather_energy/ibmaem/Makefile src/plugins/acct_gather_energy/ipmi/Makefile src/plugins/acct_gather_energy/none/Makefile src/plugins/acct_gather_infiniband/Makefile src/plugins/acct_gather_infiniband/ofed/Makefile src/plugins/acct_gather_infiniband/none/Makefile src/plugins/acct_gather_filesystem/Makefile src/plugins/acct_gather_filesystem/lustre/Makefile src/plugins/acct_gather_filesystem/none/Makefile src/plugins/acct_gather_profile/Makefile src/plugins/acct_gather_profile/hdf5/Makefile src/plugins/acct_gather_profile/hdf5/sh5util/Makefile src/plugins/acct_gather_profile/hdf5/sh5util/libsh5util_old/Makefile src/plugins/acct_gather_profile/none/Makefile src/plugins/auth/Makefile src/plugins/auth/munge/Makefile src/plugins/auth/none/Makefile src/plugins/burst_buffer/Makefile src/plugins/burst_buffer/common/Makefile src/plugins/burst_buffer/cray/Makefile src/plugins/burst_buffer/generic/Makefile src/plugins/checkpoint/Makefile src/plugins/checkpoint/blcr/Makefile src/plugins/checkpoint/blcr/cr_checkpoint.sh src/plugins/checkpoint/blcr/cr_restart.sh src/plugins/checkpoint/none/Makefile src/plugins/checkpoint/ompi/Makefile src/plugins/checkpoint/poe/Makefile src/plugins/core_spec/Makefile src/plugins/core_spec/cray/Makefile src/plugins/core_spec/none/Makefile src/plugins/crypto/Makefile src/plugins/crypto/munge/Makefile src/plugins/crypto/openssl/Makefile src/plugins/ext_sensors/Makefile src/plugins/ext_sensors/rrd/Makefile src/plugins/ext_sensors/none/Makefile src/plugins/gres/Makefile src/plugins/gres/gpu/Makefile src/plugins/gres/nic/Makefile src/plugins/gres/mic/Makefile src/plugins/jobacct_gather/Makefile src/plugins/jobacct_gather/common/Makefile src/plugins/jobacct_gather/linux/Makefile src/plugins/jobacct_gather/cgroup/Makefile src/plugins/jobacct_gather/none/Makefile src/plugins/jobcomp/Makefile src/plugins/jobcomp/elasticsearch/Makefile src/plugins/jobcomp/filetxt/Makefile src/plugins/jobcomp/none/Makefile src/plugins/jobcomp/script/Makefile src/plugins/jobcomp/mysql/Makefile src/plugins/job_container/Makefile src/plugins/job_container/cncu/Makefile src/plugins/job_container/none/Makefile src/plugins/job_submit/Makefile src/plugins/job_submit/all_partitions/Makefile src/plugins/job_submit/cray/Makefile src/plugins/job_submit/defaults/Makefile src/plugins/job_submit/logging/Makefile src/plugins/job_submit/lua/Makefile src/plugins/job_submit/partition/Makefile src/plugins/job_submit/pbs/Makefile src/plugins/job_submit/require_timelimit/Makefile src/plugins/job_submit/throttle/Makefile src/plugins/launch/Makefile src/plugins/launch/aprun/Makefile src/plugins/launch/poe/Makefile src/plugins/launch/runjob/Makefile src/plugins/launch/slurm/Makefile src/plugins/mcs/Makefile src/plugins/mcs/none/Makefile src/plugins/mcs/group/Makefile src/plugins/mcs/user/Makefile src/plugins/node_features/Makefile src/plugins/node_features/knl_cray/Makefile src/plugins/node_features/knl_generic/Makefile src/plugins/power/Makefile src/plugins/power/common/Makefile src/plugins/power/cray/Makefile src/plugins/power/none/Makefile src/plugins/preempt/Makefile src/plugins/preempt/job_prio/Makefile src/plugins/preempt/none/Makefile src/plugins/preempt/partition_prio/Makefile src/plugins/preempt/qos/Makefile src/plugins/priority/Makefile src/plugins/priority/basic/Makefile src/plugins/priority/multifactor/Makefile src/plugins/proctrack/Makefile src/plugins/proctrack/cray/Makefile src/plugins/proctrack/cgroup/Makefile src/plugins/proctrack/pgid/Makefile src/plugins/proctrack/linuxproc/Makefile src/plugins/proctrack/sgi_job/Makefile src/plugins/proctrack/lua/Makefile src/plugins/route/Makefile src/plugins/route/default/Makefile src/plugins/route/topology/Makefile src/plugins/sched/Makefile src/plugins/sched/backfill/Makefile src/plugins/sched/builtin/Makefile src/plugins/sched/hold/Makefile src/plugins/sched/wiki/Makefile src/plugins/sched/wiki2/Makefile src/plugins/select/Makefile src/plugins/select/alps/Makefile src/plugins/select/alps/libalps/Makefile src/plugins/select/alps/libemulate/Makefile src/plugins/select/bluegene/Makefile src/plugins/select/bluegene/ba_bgq/Makefile src/plugins/select/bluegene/bl_bgq/Makefile src/plugins/select/bluegene/sfree/Makefile src/plugins/select/cons_res/Makefile src/plugins/select/cray/Makefile src/plugins/select/linear/Makefile src/plugins/select/other/Makefile src/plugins/select/serial/Makefile src/plugins/slurmctld/Makefile src/plugins/slurmctld/nonstop/Makefile src/plugins/slurmd/Makefile src/plugins/switch/Makefile src/plugins/switch/cray/Makefile src/plugins/switch/generic/Makefile src/plugins/switch/none/Makefile src/plugins/switch/nrt/Makefile src/plugins/switch/nrt/libpermapi/Makefile src/plugins/mpi/Makefile src/plugins/mpi/mpich1_p4/Makefile src/plugins/mpi/mpich1_shmem/Makefile src/plugins/mpi/mpichgm/Makefile src/plugins/mpi/mpichmx/Makefile src/plugins/mpi/mvapich/Makefile src/plugins/mpi/lam/Makefile src/plugins/mpi/none/Makefile src/plugins/mpi/openmpi/Makefile src/plugins/mpi/pmi2/Makefile src/plugins/mpi/pmix/Makefile src/plugins/task/Makefile src/plugins/task/affinity/Makefile src/plugins/task/cgroup/Makefile src/plugins/task/cray/Makefile src/plugins/task/none/Makefile src/plugins/topology/Makefile src/plugins/topology/3d_torus/Makefile src/plugins/topology/hypercube/Makefile src/plugins/topology/node_rank/Makefile src/plugins/topology/none/Makefile src/plugins/topology/tree/Makefile testsuite/Makefile testsuite/expect/Makefile testsuite/slurm_unit/Makefile testsuite/slurm_unit/api/Makefile testsuite/slurm_unit/api/manual/Makefile testsuite/slurm_unit/common/Makefile"
 
 
 cat >confcache <<\_ACEOF
@@ -25822,6 +25822,7 @@ do
     "src/plugins/mcs/user/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/mcs/user/Makefile" ;;
     "src/plugins/node_features/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/node_features/Makefile" ;;
     "src/plugins/node_features/knl_cray/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/node_features/knl_cray/Makefile" ;;
+    "src/plugins/node_features/knl_generic/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/node_features/knl_generic/Makefile" ;;
     "src/plugins/power/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/power/Makefile" ;;
     "src/plugins/power/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/power/common/Makefile" ;;
     "src/plugins/power/cray/Makefile") CONFIG_FILES="$CONFIG_FILES src/plugins/power/cray/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index 8cef689d2b82efa96d12a0a3b985c080cad0ccbb..384e48b269f446bd4cbcda0259dc11af6f3d52c7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -558,6 +558,7 @@ AC_CONFIG_FILES([Makefile
 		 src/plugins/mcs/user/Makefile
 		 src/plugins/node_features/Makefile
 		 src/plugins/node_features/knl_cray/Makefile
+		 src/plugins/node_features/knl_generic/Makefile
 		 src/plugins/power/Makefile
 		 src/plugins/power/common/Makefile
 		 src/plugins/power/cray/Makefile
diff --git a/doc/html/intel_knl.shtml b/doc/html/intel_knl.shtml
index 64d2aaa1a21e28a3f27aed53b20eac94783edaa4..1630a020e0a812bc942381470e8e4b56d3cb8078 100644
--- a/doc/html/intel_knl.shtml
+++ b/doc/html/intel_knl.shtml
@@ -148,6 +148,7 @@ man page for more information.</li>
 <li>A mechanism is required to boot nodes in the desired configuration. This
 mechanism must be integrated with existing Slurm infrastructure for
 <a href="sbatch.html">rebooting nodes on user request (--reboot)</a> plus
+<u>(for Cray systems only)</u>
 <a href="power_save.html">power saving</a> (powering down idle nodes and
 restarting them on demand).</li>
 </ol>
@@ -155,9 +156,14 @@ restarting them on demand).</li>
 <p>In addition, there is a DebugFlags option of "NodeFeatures" which will
 generate detailed information about KNL operations.</p>
 
-<p>Note that a node's KNL-specific available and active features are not
-included in the "slurm.conf" configuration file, but are set and the managed
-by the NodeFeatures plugin.
+<p>The KNL-specific available and active features are configured differently
+based upon the plugin configured.<br>
+<u>For the knl_cray plugin</u>, KNL-specific available and active features are
+not included in the "slurm.conf" configuration file, but are set and the managed
+by the NodeFeatures plugin when the slurmctld daemon starts.<br>
+<u>For the knl_generic plugin</u>, KNL-specific features should be defined
+in the "slurm.conf" configuration file. When the slurmd daemon starts on each
+compute node, it will update the available and active features as needed.<br>
 Features which are not KNL-specific (e.g. rack number, "knl", etc.) will be
 copied from the node's "Features" configuration in "slurm.conf" to both the
 available and active feature fields and not modified by the NodeFeatures
@@ -225,7 +231,23 @@ The amount of HBM on each node should not be configured in a Slurm configuration
 file, but that information will be loaded by the knl_cray plugin using
 information provided by the capmc program.</p>
 
-<h3>Sample knl_cray.conf File</h3>
+<h3>Sample slurm.conf file for knl_cray plugin</h3>
+
+<pre>
+# Sample slurm.conf
+NodeFeaturesPlugins=knl_cray
+DebugFlags=NodeFeatures
+GresTypes=hbm
+#
+ResumeProgram=/opt/slurm/default/sbin/capmc_resume
+SuspendTime=30000000
+ResumeTimeout=1800
+...
+Nodename=default Sockets=1 CoresPerSocket=68 ThreadsPerCore=4 RealMemory=128000 Feature=knl
+NodeName=nid[00000-00127] State=UNKNOWN
+</pre>
+
+<h3>Sample knl_cray.conf file</h3>
 
 <pre>
 # Sample knl_cray.conf
@@ -261,18 +283,30 @@ This plugin performs all operations directly on the compute nodes using Intel's
 <i>syscfg</i> program to get and modify the node's MCDRAM and NUMA mode and
 uses the Linux <i>reboot</i> program to reboot the compute node in order for
 modifications in MCDRAM and/or NUMA mode to take effect.
-This plugin does <u>not</u> require the specification of ResumeProgram,
-SuspendProgram, SuspendTimem etc. in slurm.conf.</p>
-
-<p><b>NOTE:</b>Support for generic KNL clusters is planned for release in Slurm
-version 16.05.6 in October 2016. Slurm support for KNL is only available on Cray
-systems in earlier versions of Slurm.</p>
+Make sure that RebootProgram is defined in the slurm.conf file.
+This plugin currently does <u>not</u> permit the specification of ResumeProgram,
+SuspendProgram, SuspendTimem etc. in slurm.conf, however that limitation may
+be removed in the future (the ResumeProgram currently has no means of changing
+the node's MCDRAM and/or NUMA mode prior to reboot).</p>
+
+<p><b>NOTE:</b>The syscfg program reports the MCDRAM and NUMA mode to be used
+when the node is next booted. If the syscfg program is used to modify the MCDRAM
+or NUMA mode of a node, but it is not rebooted, then Slurm will be making
+scheduling decisions based upon incorrect state information. If you want to
+change node state information outside of Slurm then use the following proceedure:
+<ol>
+<li>Drain the nodes of interest</li>
+<li>Change their MCDRAM and/or NUMA mode</li>
+<li>Reboot the nodes, then</li>
+<li>Restore them to service in Slurm</li>
+</ol>
+</p>
 
 <h3>Sample knl_generic.conf File</h3>
 
 <pre>
 # Sample knl_generic.conf
-SyscfgPath=/usr/sbin/syscfg
+SyscfgPath=/usr/bin/syscfg
 DefaultNUMA=a2a         # NUMA=all2all
 AllowNUMA=a2a,snc2,hemi
 DefaultMCDRAM=cache     # MCDRAM=cache
@@ -285,6 +319,7 @@ DefaultMCDRAM=cache     # MCDRAM=cache
 NodeFeaturesPlugins=knl_generic
 DebugFlags=NodeFeatures
 GresTypes=hbm
+RebootProgram=/sbin/reboot
 ...
 Nodename=default Sockets=1 CoresPerSocket=68 ThreadsPerCore=4 RealMemory=128000 Feature=knl
 NodeName=nid[00000-00127] State=UNKNOWN
@@ -292,6 +327,6 @@ NodeName=nid[00000-00127] State=UNKNOWN
 
 <p class="footer"><a href="#top">top</a></p>
 
-<p style="text-align:center;">Last modified 25 September 2016</p>
+<p style="text-align:center;">Last modified 13 October 2016</p>
 
 <!--#include virtual="footer.txt"-->
diff --git a/doc/html/node_features_plugins.shtml b/doc/html/node_features_plugins.shtml
index 31db9d4cc292142b5800ca00fa0962308d990b3c..eae01b22134849cd8c22782dc4ff55b9bbcb8633 100644
--- a/doc/html/node_features_plugins.shtml
+++ b/doc/html/node_features_plugins.shtml
@@ -119,13 +119,6 @@ The system <span class="commandline">_init()</span> is called before the Slurm
 <p style="margin-left:.2in"><b>Returns</b>: <br>
   True if the plugin requires PowerSave mode for booting nodes.
 
-<p class="commandline"> bool node_features_p_node_reboot(void)
-<p style="margin-left:.2in"><b>Description</b>:<br>
-  Report if the RebootProgram is required to boot nodes.
-  Executed from the slurmctld daemon only.
-<p style="margin-left:.2in"><b>Returns</b>: <br>
-  True if the plugin requires RebootProgram mode for booting nodes.
-
 <p class="commandline"> void node_features_p_node_state(char **avail_modes, char **current_mode)
 <p style="margin-left:.2in"><b>Description</b>:<br>
   Get this node's available and current features (e.g. MCDRAM and NUMA
@@ -169,6 +162,6 @@ The system <span class="commandline">_init()</span> is called before the Slurm
 
 <p class="footer"><a href="#top">top</a>
 
-<p style="text-align:center;">Last modified 1 March 2016</p>
+<p style="text-align:center;">Last modified 29 August 2016</p>
 
 <!--#include virtual="footer.txt"-->
diff --git a/doc/man/man5/knl.conf.5 b/doc/man/man5/knl.conf.5
index 5489bb8e564a25dfc7903b1552bd6e08929922d1..e7425cc561ec4e3d00fb62e60fd072f599d21861 100644
--- a/doc/man/man5/knl.conf.5
+++ b/doc/man/man5/knl.conf.5
@@ -140,7 +140,8 @@ This is option is used only by the campc_suspend and campc_resume programs
 Fully qualified path to Intel's \fBsyscfg\fR program, which identifies current
 KNL configuration by viewing BIOS settings.
 If not defined, the current BIOS setting will not be available.
-This parameter is not used by the "knl_cray" plugin.
+The default value is "/usr/bin/syscfg".
+This parameter is used only by the "knl_generic" plugin.
 
 .SH "EXAMPLE"
 .LP
diff --git a/slurm.spec b/slurm.spec
index 5e9981bcb85c3218452bc2bf9ffe97d83d3309a4..bd7a43a20150f0a1720247872af7080b27b61f8a 100644
--- a/slurm.spec
+++ b/slurm.spec
@@ -696,6 +696,8 @@ test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/mpi_mvapich.so              &&
    echo %{_libdir}/slurm/mpi_mvapich.so              >> $LIST
 test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/node_features_knl_cray.so   &&
    echo %{_libdir}/slurm/node_features_knl_cray.so   >> $LIST
+test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/node_features_knl_generic.so &&
+   echo %{_libdir}/slurm/node_features_knl_generic.so   >> $LIST
 test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/power_cray.so               &&
    echo %{_libdir}/slurm/power_cray.so               >> $LIST
 test -f $RPM_BUILD_ROOT/%{_libdir}/slurm/select_bluegene.so          &&
diff --git a/src/common/node_features.c b/src/common/node_features.c
index 323434688133983f9b64ca3b937ed3effa02d19c..b92ac1a37b2fd0eb9674eba4fd4a89b7f1beac94 100644
--- a/src/common/node_features.c
+++ b/src/common/node_features.c
@@ -60,7 +60,7 @@ typedef struct node_features_ops {
 	int	(*job_valid)	(char *job_features);
 	char *	(*job_xlate)	(char *job_features);
 	bool	(*node_power)	(void);
-	bool	(*node_reboot)	(void);
+	int	(*node_set)	(char *active_features);
 	void	(*node_state)	(char **avail_modes, char **current_mode);
 	int	(*node_update)	(char *active_features, bitstr_t *node_bitmap);
 	char *	(*node_xlate)	(char *new_features, char *orig_features,
@@ -78,7 +78,7 @@ static const char *syms[] = {
 	"node_features_p_job_valid",
 	"node_features_p_job_xlate",
 	"node_features_p_node_power",
-	"node_features_p_node_reboot",
+	"node_features_p_node_set",
 	"node_features_p_node_state",
 	"node_features_p_node_update",
 	"node_features_p_node_xlate",
@@ -289,25 +289,25 @@ extern bool node_features_g_node_power(void)
 	return node_power;
 }
 
-/* Return true if the plugin requires RebootProgram for booting nodes */
-extern bool node_features_g_node_reboot(void)
+/* Set's the node's active features based upon job constraints.
+ * NOTE: Executed by the slurmd daemon.
+ * IN active_features - New active features
+ * RET error code */
+extern int node_features_g_node_set(char *active_features)
 {
 	DEF_TIMERS;
-	bool node_reboot = false;
-	int i;
+	int i, rc = SLURM_SUCCESS;
 
 	START_TIMER;
 	(void) node_features_g_init();
 	slurm_mutex_lock(&g_context_lock);
-	for (i = 0; i < g_context_cnt; i++) {
-		node_reboot = (*(ops[i].node_reboot))();
-		if (node_reboot)
-			break;
+	for (i = 0; ((i < g_context_cnt) && (rc == SLURM_SUCCESS)); i++) {
+		rc = (*(ops[i].node_set))(active_features);
 	}
 	slurm_mutex_unlock(&g_context_lock);
-	END_TIMER2("node_features_g_node_reboot");
+	END_TIMER2("node_features_g_node_set");
 
-	return node_reboot;
+	return rc;
 }
 
 /* Get this node's current and available MCDRAM and NUMA settings from BIOS.
diff --git a/src/common/node_features.h b/src/common/node_features.h
index b08d0006e7ba389534b6d783e57ef167921d6f36..4bce5af110d7eb504b1e5ea188fd65c0544cf93a 100644
--- a/src/common/node_features.h
+++ b/src/common/node_features.h
@@ -64,12 +64,15 @@ extern int node_features_g_job_valid(char *job_features);
  * RET node boot options, must be xfreed */
 extern char *node_features_g_job_xlate(char *job_features);
 
-/* Return true if the plugin requires RebootProgram for booting nodes */
-extern bool node_features_g_node_reboot(void);
-
 /* Return true if the plugin requires PowerSave mode for booting nodes */
 extern bool node_features_g_node_power(void);
 
+/* Set's the node's active features based upon job constraints.
+ * NOTE: Executed by the slurmd daemon.
+ * IN active_features - New active features
+ * RET error code */
+extern int node_features_g_node_set(char *active_features);
+
 /* Get this node's current and available MCDRAM and NUMA settings from BIOS.
  * avail_modes IN/OUT - available modes, must be xfreed
  * current_mode IN/OUT - current modes, must be xfreed */
diff --git a/src/common/slurm_protocol_api.c b/src/common/slurm_protocol_api.c
index 1d4a258fc24a51dcb4594fce2e277b7a396635ec..38ad273f905d48e090cc6b32cae5754166ce4724 100644
--- a/src/common/slurm_protocol_api.c
+++ b/src/common/slurm_protocol_api.c
@@ -961,6 +961,24 @@ uint16_t slurm_get_private_data(void)
 	return private_data;
 }
 
+/* slurm_get_resume_program
+ * returns the ResumeProgram from slurmctld_conf object
+ * RET char *    - ResumeProgram, MUST be xfreed by caller
+ */
+char *slurm_get_resume_program(void)
+{
+	char *resume_program = NULL;
+	slurm_ctl_conf_t *conf;
+
+	if (slurmdbd_conf) {
+	} else {
+		conf = slurm_conf_lock();
+		resume_program = xstrdup(conf->resume_program);
+		slurm_conf_unlock();
+	}
+	return resume_program;
+}
+
 /* slurm_get_state_save_location
  * get state_save_location from slurmctld_conf object from slurmctld_conf object
  * RET char *   - state_save_location directory, MUST be xfreed by caller
diff --git a/src/common/slurm_protocol_api.h b/src/common/slurm_protocol_api.h
index b9c8805ca168ed1db13543958c1c7c0199e7f159..4bf6b3ce70018bbf0eb93ba0386293b9497fb530 100644
--- a/src/common/slurm_protocol_api.h
+++ b/src/common/slurm_protocol_api.h
@@ -393,6 +393,12 @@ double *slurm_get_tres_weight_array(char *weights_str, int tres_cnt);
  */
 uint16_t slurm_get_private_data(void);
 
+/* slurm_get_resume_program
+ * returns the ResumeProgram from slurmctld_conf object
+ * RET char *    - ResumeProgram, MUST be xfreed by caller
+ */
+char *slurm_get_resume_program(void);
+
 /* slurm_get_state_save_location
  * get state_save_location from slurmctld_conf object from slurmctld_conf object
  * RET char *   - state_save_location directory, MUST be xfreed by caller
diff --git a/src/plugins/node_features/Makefile.am b/src/plugins/node_features/Makefile.am
index b151849bcdbf83484a56a1ea690ad51ca646954b..f5ef03630306c0ed1ceb4de208a7cfb5b10f194a 100644
--- a/src/plugins/node_features/Makefile.am
+++ b/src/plugins/node_features/Makefile.am
@@ -1,3 +1,3 @@
 # Makefile for node_features plugins
 
-SUBDIRS = knl_cray
+SUBDIRS = knl_cray knl_generic
diff --git a/src/plugins/node_features/Makefile.in b/src/plugins/node_features/Makefile.in
index 6571e8ba74e9f0809601d6dca385061ffc38e7c5..9b7f833c7863830670072293122dce7740359881 100644
--- a/src/plugins/node_features/Makefile.in
+++ b/src/plugins/node_features/Makefile.in
@@ -476,7 +476,7 @@ target_vendor = @target_vendor@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = knl_cray
+SUBDIRS = knl_cray knl_generic
 all: all-recursive
 
 .SUFFIXES:
diff --git a/src/plugins/node_features/knl_cray/node_features_knl_cray.c b/src/plugins/node_features/knl_cray/node_features_knl_cray.c
index dbf1905d62beb194fa3f2de7a1b895daa36408b6..0ccc62df949ca22289588b750f5df5cf015d5d47 100644
--- a/src/plugins/node_features/knl_cray/node_features_knl_cray.c
+++ b/src/plugins/node_features/knl_cray/node_features_knl_cray.c
@@ -2370,10 +2370,14 @@ extern bool node_features_p_node_power(void)
 	return true;
 }
 
-/* Return true if the plugin requires RebootProgram for booting nodes */
-extern bool node_features_p_node_reboot(void)
+/* Set's the node's active features based upon job constraints.
+ * NOTE: Executed by the slurmd daemon.
+ * NOTE: Not applicable for knl_cray plugin, reconfiguration done by slurmctld
+ * IN active_features - New active features
+ * RET error code */
+extern int node_features_p_node_set(char *active_features)
 {
-	return false;
+	return SLURM_SUCCESS;
 }
 
 /* Note the active features associated with a set of nodes have been updated.
diff --git a/src/plugins/node_features/knl_generic/Makefile.am b/src/plugins/node_features/knl_generic/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..11da24c075f605522fa19ceed9c88a7a5499e7ae
--- /dev/null
+++ b/src/plugins/node_features/knl_generic/Makefile.am
@@ -0,0 +1,15 @@
+# Makefile for node_features_knl_generic plugin
+
+AUTOMAKE_OPTIONS = foreign
+
+PLUGIN_FLAGS = -module -avoid-version --export-dynamic
+
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/src/common
+
+pkglib_LTLIBRARIES = node_features_knl_generic.la
+node_features_knl_generic_la_SOURCES = node_features_knl_generic.c
+node_features_knl_generic_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS)
+
+force:
+$(node_features_knl_generic_la_LIBADD) : force
+	@cd `dirname $@` && $(MAKE) `basename $@`
diff --git a/src/plugins/node_features/knl_generic/Makefile.in b/src/plugins/node_features/knl_generic/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..0dcabca8a843c2dfc5dd2f43a537b2f0aa499fd6
--- /dev/null
+++ b/src/plugins/node_features/knl_generic/Makefile.in
@@ -0,0 +1,831 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Makefile for node_features_knl_generic plugin
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = src/plugins/node_features/knl_generic
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/auxdir/ax_check_zlib.m4 \
+	$(top_srcdir)/auxdir/ax_lib_hdf5.m4 \
+	$(top_srcdir)/auxdir/ax_pthread.m4 \
+	$(top_srcdir)/auxdir/libtool.m4 \
+	$(top_srcdir)/auxdir/ltoptions.m4 \
+	$(top_srcdir)/auxdir/ltsugar.m4 \
+	$(top_srcdir)/auxdir/ltversion.m4 \
+	$(top_srcdir)/auxdir/lt~obsolete.m4 \
+	$(top_srcdir)/auxdir/slurm.m4 \
+	$(top_srcdir)/auxdir/x_ac__system_configuration.m4 \
+	$(top_srcdir)/auxdir/x_ac_affinity.m4 \
+	$(top_srcdir)/auxdir/x_ac_blcr.m4 \
+	$(top_srcdir)/auxdir/x_ac_bluegene.m4 \
+	$(top_srcdir)/auxdir/x_ac_cray.m4 \
+	$(top_srcdir)/auxdir/x_ac_curl.m4 \
+	$(top_srcdir)/auxdir/x_ac_databases.m4 \
+	$(top_srcdir)/auxdir/x_ac_debug.m4 \
+	$(top_srcdir)/auxdir/x_ac_dlfcn.m4 \
+	$(top_srcdir)/auxdir/x_ac_env.m4 \
+	$(top_srcdir)/auxdir/x_ac_freeipmi.m4 \
+	$(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \
+	$(top_srcdir)/auxdir/x_ac_hwloc.m4 \
+	$(top_srcdir)/auxdir/x_ac_iso.m4 \
+	$(top_srcdir)/auxdir/x_ac_json.m4 \
+	$(top_srcdir)/auxdir/x_ac_lua.m4 \
+	$(top_srcdir)/auxdir/x_ac_lz4.m4 \
+	$(top_srcdir)/auxdir/x_ac_man2html.m4 \
+	$(top_srcdir)/auxdir/x_ac_munge.m4 \
+	$(top_srcdir)/auxdir/x_ac_ncurses.m4 \
+	$(top_srcdir)/auxdir/x_ac_netloc.m4 \
+	$(top_srcdir)/auxdir/x_ac_nrt.m4 \
+	$(top_srcdir)/auxdir/x_ac_ofed.m4 \
+	$(top_srcdir)/auxdir/x_ac_pam.m4 \
+	$(top_srcdir)/auxdir/x_ac_pmix.m4 \
+	$(top_srcdir)/auxdir/x_ac_printf_null.m4 \
+	$(top_srcdir)/auxdir/x_ac_ptrace.m4 \
+	$(top_srcdir)/auxdir/x_ac_readline.m4 \
+	$(top_srcdir)/auxdir/x_ac_rrdtool.m4 \
+	$(top_srcdir)/auxdir/x_ac_setproctitle.m4 \
+	$(top_srcdir)/auxdir/x_ac_sgi_job.m4 \
+	$(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkglibdir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+node_features_knl_generic_la_LIBADD =
+am_node_features_knl_generic_la_OBJECTS =  \
+	node_features_knl_generic.lo
+node_features_knl_generic_la_OBJECTS =  \
+	$(am_node_features_knl_generic_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+node_features_knl_generic_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(node_features_knl_generic_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/slurm
+depcomp = $(SHELL) $(top_srcdir)/auxdir/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(node_features_knl_generic_la_SOURCES)
+DIST_SOURCES = $(node_features_knl_generic_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auxdir/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BGQ_LOADED = @BGQ_LOADED@
+BG_INCLUDES = @BG_INCLUDES@
+BG_LDFLAGS = @BG_LDFLAGS@
+BLCR_CPPFLAGS = @BLCR_CPPFLAGS@
+BLCR_HOME = @BLCR_HOME@
+BLCR_LDFLAGS = @BLCR_LDFLAGS@
+BLCR_LIBS = @BLCR_LIBS@
+BLUEGENE_LOADED = @BLUEGENE_LOADED@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_CFLAGS = @CHECK_CFLAGS@
+CHECK_LIBS = @CHECK_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CRAY_JOB_CPPFLAGS = @CRAY_JOB_CPPFLAGS@
+CRAY_JOB_LDFLAGS = @CRAY_JOB_LDFLAGS@
+CRAY_SELECT_CPPFLAGS = @CRAY_SELECT_CPPFLAGS@
+CRAY_SELECT_LDFLAGS = @CRAY_SELECT_LDFLAGS@
+CRAY_SWITCH_CPPFLAGS = @CRAY_SWITCH_CPPFLAGS@
+CRAY_SWITCH_LDFLAGS = @CRAY_SWITCH_LDFLAGS@
+CRAY_TASK_CPPFLAGS = @CRAY_TASK_CPPFLAGS@
+CRAY_TASK_LDFLAGS = @CRAY_TASK_LDFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATAWARP_CPPFLAGS = @DATAWARP_CPPFLAGS@
+DATAWARP_LDFLAGS = @DATAWARP_LDFLAGS@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DL_LIBS = @DL_LIBS@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FREEIPMI_CPPFLAGS = @FREEIPMI_CPPFLAGS@
+FREEIPMI_LDFLAGS = @FREEIPMI_LDFLAGS@
+FREEIPMI_LIBS = @FREEIPMI_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GREP = @GREP@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+H5CC = @H5CC@
+H5FC = @H5FC@
+HAVEMYSQLCONFIG = @HAVEMYSQLCONFIG@
+HAVE_MAN2HTML = @HAVE_MAN2HTML@
+HAVE_NRT = @HAVE_NRT@
+HAVE_OPENSSL = @HAVE_OPENSSL@
+HAVE_SOME_CURSES = @HAVE_SOME_CURSES@
+HDF5_CC = @HDF5_CC@
+HDF5_CFLAGS = @HDF5_CFLAGS@
+HDF5_CPPFLAGS = @HDF5_CPPFLAGS@
+HDF5_FC = @HDF5_FC@
+HDF5_FFLAGS = @HDF5_FFLAGS@
+HDF5_FLIBS = @HDF5_FLIBS@
+HDF5_LDFLAGS = @HDF5_LDFLAGS@
+HDF5_LIBS = @HDF5_LIBS@
+HDF5_TYPE = @HDF5_TYPE@
+HDF5_VERSION = @HDF5_VERSION@
+HWLOC_CPPFLAGS = @HWLOC_CPPFLAGS@
+HWLOC_LDFLAGS = @HWLOC_LDFLAGS@
+HWLOC_LIBS = @HWLOC_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JSON_CPPFLAGS = @JSON_CPPFLAGS@
+JSON_LDFLAGS = @JSON_LDFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LZ4_CPPFLAGS = @LZ4_CPPFLAGS@
+LZ4_LDFLAGS = @LZ4_LDFLAGS@
+LZ4_LIBS = @LZ4_LIBS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@
+MUNGE_DIR = @MUNGE_DIR@
+MUNGE_LDFLAGS = @MUNGE_LDFLAGS@
+MUNGE_LIBS = @MUNGE_LIBS@
+MYSQL_CFLAGS = @MYSQL_CFLAGS@
+MYSQL_LIBS = @MYSQL_LIBS@
+NCURSES = @NCURSES@
+NETLOC_CPPFLAGS = @NETLOC_CPPFLAGS@
+NETLOC_LDFLAGS = @NETLOC_LDFLAGS@
+NETLOC_LIBS = @NETLOC_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NRT_CPPFLAGS = @NRT_CPPFLAGS@
+NUMA_LIBS = @NUMA_LIBS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OFED_CPPFLAGS = @OFED_CPPFLAGS@
+OFED_LDFLAGS = @OFED_LDFLAGS@
+OFED_LIBS = @OFED_LIBS@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PAM_DIR = @PAM_DIR@
+PAM_LIBS = @PAM_LIBS@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PMIX_LIBS = @PMIX_LIBS@
+PMIX_V1_CPPFLAGS = @PMIX_V1_CPPFLAGS@
+PMIX_V1_LDFLAGS = @PMIX_V1_LDFLAGS@
+PMIX_V2_CPPFLAGS = @PMIX_V2_CPPFLAGS@
+PMIX_V2_LDFLAGS = @PMIX_V2_LDFLAGS@
+PROJECT = @PROJECT@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+RANLIB = @RANLIB@
+READLINE_LIBS = @READLINE_LIBS@
+REAL_BGQ_LOADED = @REAL_BGQ_LOADED@
+RELEASE = @RELEASE@
+RRDTOOL_CPPFLAGS = @RRDTOOL_CPPFLAGS@
+RRDTOOL_LDFLAGS = @RRDTOOL_LDFLAGS@
+RRDTOOL_LIBS = @RRDTOOL_LIBS@
+RUNJOB_LDFLAGS = @RUNJOB_LDFLAGS@
+SED = @SED@
+SEMAPHORE_LIBS = @SEMAPHORE_LIBS@
+SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SLEEP_CMD = @SLEEP_CMD@
+SLURMCTLD_PORT = @SLURMCTLD_PORT@
+SLURMCTLD_PORT_COUNT = @SLURMCTLD_PORT_COUNT@
+SLURMDBD_PORT = @SLURMDBD_PORT@
+SLURMD_PORT = @SLURMD_PORT@
+SLURM_API_AGE = @SLURM_API_AGE@
+SLURM_API_CURRENT = @SLURM_API_CURRENT@
+SLURM_API_MAJOR = @SLURM_API_MAJOR@
+SLURM_API_REVISION = @SLURM_API_REVISION@
+SLURM_API_VERSION = @SLURM_API_VERSION@
+SLURM_MAJOR = @SLURM_MAJOR@
+SLURM_MICRO = @SLURM_MICRO@
+SLURM_MINOR = @SLURM_MINOR@
+SLURM_PREFIX = @SLURM_PREFIX@
+SLURM_VERSION_NUMBER = @SLURM_VERSION_NUMBER@
+SLURM_VERSION_STRING = @SLURM_VERSION_STRING@
+SO_LDFLAGS = @SO_LDFLAGS@
+SSL_CPPFLAGS = @SSL_CPPFLAGS@
+SSL_LDFLAGS = @SSL_LDFLAGS@
+SSL_LIBS = @SSL_LIBS@
+STRIP = @STRIP@
+SUCMD = @SUCMD@
+UTIL_LIBS = @UTIL_LIBS@
+VERSION = @VERSION@
+ZLIB_CPPFLAGS = @ZLIB_CPPFLAGS@
+ZLIB_LDFLAGS = @ZLIB_LDFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+_libcurl_config = @_libcurl_config@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_have_man2html = @ac_have_man2html@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lua_CFLAGS = @lua_CFLAGS@
+lua_LIBS = @lua_LIBS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign
+PLUGIN_FLAGS = -module -avoid-version --export-dynamic
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/src/common
+pkglib_LTLIBRARIES = node_features_knl_generic.la
+node_features_knl_generic_la_SOURCES = node_features_knl_generic.c
+node_features_knl_generic_la_LDFLAGS = $(SO_LDFLAGS) $(PLUGIN_FLAGS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/plugins/node_features/knl_generic/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/plugins/node_features/knl_generic/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+	}
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+node_features_knl_generic.la: $(node_features_knl_generic_la_OBJECTS) $(node_features_knl_generic_la_DEPENDENCIES) $(EXTRA_node_features_knl_generic_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(node_features_knl_generic_la_LINK) -rpath $(pkglibdir) $(node_features_knl_generic_la_OBJECTS) $(node_features_knl_generic_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node_features_knl_generic.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkglibLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkglibLTLIBRARIES install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-pkglibLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+force:
+$(node_features_knl_generic_la_LIBADD) : force
+	@cd `dirname $@` && $(MAKE) `basename $@`
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/plugins/node_features/knl_generic/node_features_knl_generic.c b/src/plugins/node_features/knl_generic/node_features_knl_generic.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca7524a03608452b20dbdd291bfad2c3525f8853
--- /dev/null
+++ b/src/plugins/node_features/knl_generic/node_features_knl_generic.c
@@ -0,0 +1,1213 @@
+/*****************************************************************************\
+ *  node_features_knl_generic.c - Plugin for managing Intel KNL state
+ *  information on a generic Linux cluster
+ *****************************************************************************
+ *  Copyright (C) 2016 SchedMD LLC.
+ *  Written by Morris Jette <jette@schedmd.com>
+ *
+ *  This file is part of SLURM, a resource management program.
+ *  For details, see <http://slurm.schedmd.com/>.
+ *  Please also read the included file: DISCLAIMER.
+ *
+ *  SLURM 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 2 of the License, or (at your option)
+ *  any later version.
+ *
+ *  In addition, as a special exception, the copyright holders give permission
+ *  to link the code of portions of this program with the OpenSSL library under
+ *  certain conditions as described in each individual source file, and
+ *  distribute linked combinations including the two. You must obey the GNU
+ *  General Public License in all respects for all of the code used other than
+ *  OpenSSL. If you modify file(s) with this exception, you may extend this
+ *  exception to your version of the file(s), but you are not obligated to do
+ *  so. If you do not wish to do so, delete this exception statement from your
+ *  version.  If you delete this exception statement from all source files in
+ *  the program, then also delete it here.
+ *
+ *  SLURM 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 SLURM; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
+\*****************************************************************************/
+
+#include "config.h"
+
+#define _GNU_SOURCE	/* For POLLRDHUP */
+#include <ctype.h>
+#include <poll.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "slurm/slurm.h"
+
+#include "src/common/assoc_mgr.h"
+#include "src/common/bitstring.h"
+#include "src/common/fd.h"
+#include "src/common/gres.h"
+#include "src/common/list.h"
+#include "src/common/macros.h"
+#include "src/common/pack.h"
+#include "src/common/parse_config.h"
+#include "src/common/slurm_protocol_api.h"
+#include "src/common/slurm_strcasestr.h"
+#include "src/common/timers.h"
+#include "src/common/uid.h"
+#include "src/common/xmalloc.h"
+#include "src/common/xstring.h"
+#include "src/slurmctld/job_scheduler.h"
+#include "src/slurmctld/locks.h"
+#include "src/slurmctld/node_scheduler.h"
+#include "src/slurmctld/reservation.h"
+#include "src/slurmctld/slurmctld.h"
+#include "src/slurmctld/state_save.h"
+
+/* Maximum poll wait time for child processes, in milliseconds */
+#define MAX_POLL_WAIT   500
+#define SYSCFG_TIMEOUT 1000
+
+/* Intel Knights Landing Configuration Modes */
+#define KNL_NUMA_CNT	5
+#define KNL_MCDRAM_CNT	4
+#define KNL_NUMA_FLAG	0x00ff
+#define KNL_ALL2ALL	0x0001
+#define KNL_SNC2	0x0002
+#define KNL_SNC4	0x0004
+#define KNL_HEMI	0x0008
+#define KNL_QUAD	0x0010
+#define KNL_MCDRAM_FLAG	0xff00
+#define KNL_CACHE	0x0100
+#define KNL_EQUAL	0x0200
+#define KNL_HYBRID	0x0400
+#define KNL_FLAT	0x0800
+#define KNL_AUTO	0x1000
+
+/* These are defined here so when we link with something other than
+ * the slurmctld we will have these symbols defined.  They will get
+ * overwritten when linking with the slurmctld.
+ */
+#if defined (__APPLE__)
+slurmctld_config_t slurmctld_config __attribute__((weak_import));
+#else
+slurmctld_config_t slurmctld_config;
+#endif
+
+/*
+ * These variables are required by the burst buffer plugin interface.  If they
+ * are not found in the plugin, the plugin loader will ignore it.
+ *
+ * plugin_name - a string giving a human-readable description of the
+ * plugin.  There is no maximum length, but the symbol must refer to
+ * a valid string.
+ *
+ * plugin_type - a string suggesting the type of the plugin or its
+ * applicability to a particular form of data or method of data handling.
+ * If the low-level plugin API is used, the contents of this string are
+ * unimportant and may be anything.  SLURM uses the higher-level plugin
+ * interface which requires this string to be of the form
+ *
+ *      <application>/<method>
+ *
+ * where <application> is a description of the intended application of
+ * the plugin (e.g., "node_features" for SLURM node_features) and <method> is a
+ * description of how this plugin satisfies that application.  SLURM will only
+ * load a node_features plugin if the plugin_type string has a prefix of
+ * "node_features/".
+ *
+ * plugin_version - an unsigned 32-bit integer containing the Slurm version
+ * (major.minor.micro combined into a single number).
+ */
+const char plugin_name[]        = "node_features knl_generic plugin";
+const char plugin_type[]        = "node_features/knl_generic";
+const uint32_t plugin_version   = SLURM_VERSION_NUMBER;
+
+/* Configuration Paramters */
+static bool  debug_flag = false;
+static uint16_t allow_mcdram = KNL_MCDRAM_FLAG;
+static uint16_t allow_numa = KNL_NUMA_FLAG;
+static uid_t *allowed_uid = NULL;
+static int allowed_uid_cnt = 0;
+static uint16_t default_mcdram = KNL_CACHE;
+static uint16_t default_numa = KNL_ALL2ALL;
+static char *syscfg_path = NULL;
+static pthread_mutex_t config_mutex = PTHREAD_MUTEX_INITIALIZER;
+static bool reconfig = false;
+
+/* Percentage of MCDRAM used for cache by type, updated from syscfg */
+static int mcdram_pct[KNL_MCDRAM_CNT];
+static uint64_t *mcdram_per_node = NULL;
+
+static s_p_options_t knl_conf_file_options[] = {
+	{"AllowMCDRAM", S_P_STRING},
+	{"AllowNUMA", S_P_STRING},
+	{"AllowUserBoot", S_P_STRING},
+	{"DefaultMCDRAM", S_P_STRING},
+	{"DefaultNUMA", S_P_STRING},
+	{"LogFile", S_P_STRING},
+	{"SyscfgPath", S_P_STRING},
+	{NULL}
+};
+
+static s_p_hashtbl_t *_config_make_tbl(char *filename);
+static int  _knl_mcdram_bits_cnt(uint16_t mcdram_num);
+static uint16_t _knl_mcdram_parse(char *mcdram_str, char *sep);
+static char *_knl_mcdram_str(uint16_t mcdram_num);
+static uint16_t _knl_mcdram_token(char *token);
+static int _knl_numa_bits_cnt(uint16_t numa_num);
+static uint16_t _knl_numa_parse(char *numa_str, char *sep);
+static char *_knl_numa_str(uint16_t numa_num);
+static uint16_t _knl_numa_token(char *token);
+static void _log_script_argv(char **script_argv, char *resp_msg);
+static char *_run_script(char *cmd_path, char **script_argv, int *status);
+static int  _tot_wait (struct timeval *start_time);
+
+static s_p_hashtbl_t *_config_make_tbl(char *filename)
+{
+	s_p_hashtbl_t *tbl = NULL;
+
+	xassert(filename);
+
+	if (!(tbl = s_p_hashtbl_create(knl_conf_file_options))) {
+		error("knl.conf: %s: s_p_hashtbl_create error: %m", __func__);
+		return tbl;
+	}
+
+	if (s_p_parse_file(tbl, NULL, filename, false) == SLURM_ERROR) {
+		error("knl.conf: %s: s_p_parse_file error: %m", __func__);
+		s_p_hashtbl_destroy(tbl);
+		tbl = NULL;
+	}
+
+	return tbl;
+}
+
+/*
+ * Return the count of MCDRAM bits set
+ */
+static int _knl_mcdram_bits_cnt(uint16_t mcdram_num)
+{
+	int cnt = 0, i;
+	uint16_t tmp = 1;
+
+	for (i = 0; i < 16; i++) {
+		if ((mcdram_num & KNL_MCDRAM_FLAG) & tmp)
+			cnt++;
+		tmp = tmp << 1;
+	}
+	return cnt;
+}
+
+/*
+ * Translate KNL MCDRAM string to equivalent numeric value
+ * mcdram_str IN - String to scan
+ * sep IN - token separator to search for
+ * RET MCDRAM numeric value
+ */
+static uint16_t _knl_mcdram_parse(char *mcdram_str, char *sep)
+{
+	char *save_ptr = NULL, *tmp, *tok;
+	uint16_t mcdram_num = 0;
+
+	if (!mcdram_str)
+		return mcdram_num;
+
+	tmp = xstrdup(mcdram_str);
+	tok = strtok_r(tmp, sep, &save_ptr);
+	while (tok) {
+		mcdram_num |= _knl_mcdram_token(tok);
+		tok = strtok_r(NULL, sep, &save_ptr);
+	}
+	xfree(tmp);
+
+	return mcdram_num;
+}
+
+/*
+ * Translate KNL MCDRAM number to equivalent string value
+ * Caller must free return value
+ */
+static char *_knl_mcdram_str(uint16_t mcdram_num)
+{
+	char *mcdram_str = NULL, *sep = "";
+
+	if (mcdram_num & KNL_CACHE) {
+		xstrfmtcat(mcdram_str, "%scache", sep);
+		sep = ",";
+	}
+	if (mcdram_num & KNL_HYBRID) {
+		xstrfmtcat(mcdram_str, "%shybrid", sep);
+		sep = ",";
+	}
+	if (mcdram_num & KNL_FLAT) {
+		xstrfmtcat(mcdram_str, "%sflat", sep);
+		sep = ",";
+	}
+	if (mcdram_num & KNL_EQUAL) {
+		xstrfmtcat(mcdram_str, "%sequal", sep);
+		sep = ",";
+	}
+	if (mcdram_num & KNL_AUTO) {
+		xstrfmtcat(mcdram_str, "%sauto", sep);
+//		sep = ",";	/* Remove to avoid CLANG error */
+	}
+
+	return mcdram_str;
+}
+
+/*
+ * Given a KNL MCDRAM token, return its equivalent numeric value
+ * token IN - String to scan
+ * RET MCDRAM numeric value
+ */
+static uint16_t _knl_mcdram_token(char *token)
+{
+	uint16_t mcdram_num = 0;
+
+	if (!xstrcasecmp(token, "cache"))
+		mcdram_num = KNL_CACHE;
+	else if (!xstrcasecmp(token, "hybrid"))
+		mcdram_num = KNL_HYBRID;
+	else if (!xstrcasecmp(token, "flat"))
+		mcdram_num = KNL_FLAT;
+	else if (!xstrcasecmp(token, "equal"))
+		mcdram_num = KNL_EQUAL;
+	else if (!xstrcasecmp(token, "auto"))
+		mcdram_num = KNL_AUTO;
+
+	return mcdram_num;
+}
+
+/*
+ * Return the count of NUMA bits set
+ */
+static int _knl_numa_bits_cnt(uint16_t numa_num)
+{
+	int cnt = 0, i;
+	uint16_t tmp = 1;
+
+	for (i = 0; i < 16; i++) {
+		if ((numa_num & KNL_NUMA_FLAG) & tmp)
+			cnt++;
+		tmp = tmp << 1;
+	}
+	return cnt;
+}
+
+/*
+ * Translate KNL NUMA string to equivalent numeric value
+ * numa_str IN - String to scan
+ * sep IN - token separator to search for
+ * RET NUMA numeric value
+ */
+static uint16_t _knl_numa_parse(char *numa_str, char *sep)
+{
+	char *save_ptr = NULL, *tmp, *tok;
+	uint16_t numa_num = 0;
+
+	if (!numa_str)
+		return numa_num;
+
+	tmp = xstrdup(numa_str);
+	tok = strtok_r(tmp, sep, &save_ptr);
+	while (tok) {
+		numa_num |= _knl_numa_token(tok);
+		tok = strtok_r(NULL, sep, &save_ptr);
+	}
+	xfree(tmp);
+
+	return numa_num;
+}
+
+/*
+ * Translate KNL NUMA number to equivalent string value
+ * Caller must free return value
+ */
+static char *_knl_numa_str(uint16_t numa_num)
+{
+	char *numa_str = NULL, *sep = "";
+
+	if (numa_num & KNL_ALL2ALL) {
+		xstrfmtcat(numa_str, "%sa2a", sep);
+		sep = ",";
+	}
+	if (numa_num & KNL_SNC2) {
+		xstrfmtcat(numa_str, "%ssnc2", sep);
+		sep = ",";
+	}
+	if (numa_num & KNL_SNC4) {
+		xstrfmtcat(numa_str, "%ssnc4", sep);
+		sep = ",";
+	}
+	if (numa_num & KNL_HEMI) {
+		xstrfmtcat(numa_str, "%shemi", sep);
+		sep = ",";
+	}
+	if (numa_num & KNL_QUAD) {
+		xstrfmtcat(numa_str, "%squad", sep);
+//		sep = ",";	/* Remove to avoid CLANG error */
+	}
+
+	return numa_str;
+
+}
+
+/*
+ * Given a KNL NUMA token, return its equivalent numeric value
+ * token IN - String to scan
+ * RET NUMA numeric value
+ */
+static uint16_t _knl_numa_token(char *token)
+{
+	uint16_t numa_num = 0;
+
+	if (!xstrcasecmp(token, "a2a"))
+		numa_num |= KNL_ALL2ALL;
+	else if (!xstrcasecmp(token, "snc2"))
+		numa_num |= KNL_SNC2;
+	else if (!xstrcasecmp(token, "snc4"))
+		numa_num |= KNL_SNC4;
+	else if (!xstrcasecmp(token, "hemi"))
+		numa_num |= KNL_HEMI;
+	else if (!xstrcasecmp(token, "quad"))
+		numa_num |= KNL_QUAD;
+
+	return numa_num;
+}
+
+/*
+ * Return time in msec since "start time"
+ */
+static int _tot_wait (struct timeval *start_time)
+{
+	struct timeval end_time;
+	int msec_delay;
+
+	gettimeofday(&end_time, NULL);
+	msec_delay =   (end_time.tv_sec  - start_time->tv_sec ) * 1000;
+	msec_delay += ((end_time.tv_usec - start_time->tv_usec + 500) / 1000);
+	return msec_delay;
+}
+
+/* Log a command's arguments. */
+static void _log_script_argv(char **script_argv, char *resp_msg)
+{
+	char *cmd_line = NULL;
+	int i;
+
+	if (!debug_flag)
+		return;
+
+	for (i = 0; script_argv[i]; i++) {
+		if (i)
+			xstrcat(cmd_line, " ");
+		xstrcat(cmd_line, script_argv[i]);
+	}
+	info("%s", cmd_line);
+	if (resp_msg && resp_msg[0])
+		info("%s", resp_msg);
+	xfree(cmd_line);
+}
+
+/* Run a script and return its stdout plus exit status */
+static char *_run_script(char *cmd_path, char **script_argv, int *status)
+{
+	int cc, i, new_wait, resp_size = 0, resp_offset = 0;
+	pid_t cpid;
+	char *resp = NULL;
+	int pfd[2] = { -1, -1 };
+
+	if (access(cmd_path, R_OK | X_OK) < 0) {
+		error("%s: %s can not be executed: %m", __func__, cmd_path);
+		*status = 127;
+		resp = xstrdup("Slurm node_features/knl_generic configuration error");
+		return resp;
+	}
+	if (pipe(pfd) != 0) {
+		error("%s: pipe(): %m", __func__);
+		*status = 127;
+		resp = xstrdup("System error");
+		return resp;
+	}
+
+	if ((cpid = fork()) == 0) {
+		cc = sysconf(_SC_OPEN_MAX);
+		dup2(pfd[1], STDERR_FILENO);
+		dup2(pfd[1], STDOUT_FILENO);
+		for (i = 0; i < cc; i++) {
+			if ((i != STDERR_FILENO) && (i != STDOUT_FILENO))
+				close(i);
+		}
+		setpgid(0, 0);
+		execv(cmd_path, script_argv);
+		error("%s: execv(%s): %m", __func__, cmd_path);
+		exit(127);
+	} else if (cpid < 0) {
+		close(pfd[0]);
+		close(pfd[1]);
+		error("%s: fork(): %m", __func__);
+	} else {
+		struct pollfd fds;
+		struct timeval tstart;
+		resp_size = 1024;
+		resp = xmalloc(resp_size);
+		close(pfd[1]);
+		gettimeofday(&tstart, NULL);
+		while (1) {
+			if (slurmctld_config.shutdown_time) {
+				error("%s: killing %s operation on shutdown",
+				      __func__, script_argv[1]);
+				break;
+			}
+			fds.fd = pfd[0];
+			fds.events = POLLIN | POLLHUP | POLLRDHUP;
+			fds.revents = 0;
+			new_wait = SYSCFG_TIMEOUT - _tot_wait(&tstart);
+			if (new_wait <= 0) {
+				error("%s: %s poll timeout @ %d msec",
+				      __func__, script_argv[1], SYSCFG_TIMEOUT);
+				break;
+			}
+			new_wait = MIN(new_wait, MAX_POLL_WAIT);
+			i = poll(&fds, 1, new_wait);
+			if (i == 0) {
+				continue;
+			} else if (i < 0) {
+				error("%s: %s poll:%m", __func__,
+				      script_argv[1]);
+				break;
+			}
+			if ((fds.revents & POLLIN) == 0)
+				break;
+			i = read(pfd[0], resp + resp_offset,
+				 resp_size - resp_offset);
+			if (i == 0) {
+				break;
+			} else if (i < 0) {
+				if (errno == EAGAIN)
+					continue;
+				error("%s: read(%s): %m", __func__, syscfg_path);
+				break;
+			} else {
+				resp_offset += i;
+				if (resp_offset + 1024 >= resp_size) {
+					resp_size *= 2;
+					resp = xrealloc(resp, resp_size);
+				}
+			}
+		}
+		killpg(cpid, SIGTERM);
+		usleep(10000);
+		killpg(cpid, SIGKILL);
+		waitpid(cpid, status, 0);
+		close(pfd[0]);
+	}
+	return resp;
+}
+
+static void _make_uid_array(char *uid_str)
+{
+	char *save_ptr = NULL, *tmp_str, *tok;
+	int i, uid_cnt = 0;
+
+	if (!uid_str)
+		return;
+
+	/* Count the number of users */
+	for (i = 0; uid_str[i]; i++) {
+		if (uid_str[i] == ',')
+			uid_cnt++;
+	}
+	uid_cnt++;
+
+	allowed_uid = xmalloc(sizeof(uid_t) * uid_cnt);
+	allowed_uid_cnt = 0;
+	tmp_str = xstrdup(uid_str);
+	tok = strtok_r(tmp_str, ",", &save_ptr);
+	while (tok) {
+		if (uid_from_string(tok, &allowed_uid[allowed_uid_cnt++]) < 0)
+			error("knl_generic.conf: Invalid AllowUserBoot: %s", tok);
+		tok = strtok_r(NULL, ",", &save_ptr);
+	}
+	xfree(tmp_str);
+}
+
+static char *_make_uid_str(uid_t *uid_array, int uid_cnt)
+{
+	char *sep = "", *tmp_str = NULL, *uid_str = NULL;
+	int i;
+
+	if (allowed_uid_cnt == 0) {
+		uid_str = xstrdup("ALL");
+		return uid_str;
+	}
+
+	for (i = 0; i < uid_cnt; i++) {
+		tmp_str = uid_to_string(uid_array[i]);
+		xstrfmtcat(uid_str, "%s%s(%d)", sep, tmp_str, uid_array[i]);
+		xfree(tmp_str);
+		sep = ",";
+	}
+
+	return uid_str;
+}
+
+/* Load configuration */
+extern int init(void)
+{
+	char *allow_mcdram_str, *allow_numa_str, *allow_user_str;
+	char *default_mcdram_str, *default_numa_str;
+	char *knl_conf_file, *tmp_str = NULL, *resume_program;
+	s_p_hashtbl_t *tbl;
+	struct stat stat_buf;
+	int i, rc = SLURM_SUCCESS;
+
+	/* Set default values */
+	allow_mcdram = KNL_MCDRAM_FLAG;
+	allow_numa = KNL_NUMA_FLAG;
+	xfree(allowed_uid);
+	allowed_uid_cnt = 0;
+	debug_flag = false;
+	default_mcdram = KNL_CACHE;
+	default_numa = KNL_ALL2ALL;
+	for (i = 0; i < KNL_MCDRAM_CNT; i++)
+		mcdram_pct[i] = -1;
+
+	knl_conf_file = get_extra_conf_path("knl_generic.conf");
+	if ((stat(knl_conf_file, &stat_buf) == 0) &&
+	    (tbl = _config_make_tbl(knl_conf_file))) {
+		if (s_p_get_string(&tmp_str, "AllowMCDRAM", tbl)) {
+			allow_mcdram = _knl_mcdram_parse(tmp_str, ",");
+			if (_knl_mcdram_bits_cnt(allow_mcdram) < 1) {
+				fatal("knl_generic.conf: Invalid AllowMCDRAM=%s",
+				      tmp_str);
+			}
+			xfree(tmp_str);
+		}
+		if (s_p_get_string(&tmp_str, "AllowNUMA", tbl)) {
+			allow_numa = _knl_numa_parse(tmp_str, ",");
+			if (_knl_numa_bits_cnt(allow_numa) < 1) {
+				fatal("knl_generic.conf: Invalid AllowNUMA=%s",
+				      tmp_str);
+			}
+			xfree(tmp_str);
+		}
+		if (s_p_get_string(&tmp_str, "AllowUserBoot", tbl)) {
+			_make_uid_array(tmp_str);
+			xfree(tmp_str);
+		}
+		if (s_p_get_string(&tmp_str, "DefaultMCDRAM", tbl)) {
+			default_mcdram = _knl_mcdram_parse(tmp_str, ",");
+			if (_knl_mcdram_bits_cnt(default_mcdram) != 1) {
+				fatal("knl_generic.conf: Invalid DefaultMCDRAM=%s",
+				      tmp_str);
+			}
+			xfree(tmp_str);
+		}
+		if (s_p_get_string(&tmp_str, "DefaultNUMA", tbl)) {
+			default_numa = _knl_numa_parse(tmp_str, ",");
+			if (_knl_numa_bits_cnt(default_numa) != 1) {
+				fatal("knl_generic.conf: Invalid DefaultNUMA=%s",
+				      tmp_str);
+			}
+			xfree(tmp_str);
+		}
+		(void) s_p_get_string(&syscfg_path, "SyscfgPath", tbl);
+		s_p_hashtbl_destroy(tbl);
+	} else if (errno != ENOENT) {
+		error("Error opening/reading knl_generic.conf: %m");
+		rc = SLURM_ERROR;
+	}
+	xfree(knl_conf_file);
+	if (!syscfg_path)
+		syscfg_path = xstrdup("/usr/bin/syscfg");
+
+	if ((resume_program = slurm_get_resume_program())) {
+		error("Use of ResumeProgram with %s not currently supported",
+		      plugin_name);
+		xfree(resume_program);
+		rc = SLURM_ERROR;
+	}
+
+	if (slurm_get_debug_flags() & DEBUG_FLAG_NODE_FEATURES)
+		debug_flag = true;
+
+	if (slurm_get_debug_flags() & DEBUG_FLAG_NODE_FEATURES) {
+		allow_mcdram_str = _knl_mcdram_str(allow_mcdram);
+		allow_numa_str = _knl_numa_str(allow_numa);
+		allow_user_str = _make_uid_str(allowed_uid, allowed_uid_cnt);
+		default_mcdram_str = _knl_mcdram_str(default_mcdram);
+		default_numa_str = _knl_numa_str(default_numa);
+		info("AllowMCDRAM=%s AllowNUMA=%s",
+		     allow_mcdram_str, allow_numa_str);
+		info("AllowUserBoot=%s", allow_user_str);
+		info("DefaultMCDRAM=%s DefaultNUMA=%s",
+		     default_mcdram_str, default_numa_str);
+		info("SyscfgPath=%s", syscfg_path);
+		xfree(allow_mcdram_str);
+		xfree(allow_numa_str);
+		xfree(allow_user_str);
+		xfree(default_mcdram_str);
+		xfree(default_numa_str);
+	}
+	gres_plugin_add("hbm");
+
+	return rc;
+}
+
+/* Release allocated memory */
+extern int fini(void)
+{
+	xfree(allowed_uid);
+	allowed_uid_cnt = 0;
+	debug_flag = false;
+	xfree(mcdram_per_node);
+	xfree(syscfg_path);
+	return SLURM_SUCCESS;
+}
+
+/* Reload configuration */
+extern int node_features_p_reconfig(void)
+{
+	slurm_mutex_lock(&config_mutex);
+	reconfig = true;
+	slurm_mutex_unlock(&config_mutex);
+	return SLURM_SUCCESS;
+}
+
+/* Update active and available features on specified nodes,
+ * sets features on all nodes if node_list is NULL */
+extern int node_features_p_get_node(char *node_list)
+{
+	slurm_mutex_lock(&config_mutex);
+	if (reconfig) {
+		(void) init();
+		reconfig = false;
+	}
+	slurm_mutex_unlock(&config_mutex);
+	return SLURM_SUCCESS;
+}
+
+/* Get this node's current and available MCDRAM and NUMA settings from BIOS.
+ * avail_modes IN/OUT - append available modes, must be xfreed
+ * current_mode IN/OUT - append current modes, must be xfreed
+ *
+ * NOTE: Not applicable on Cray systems; can be used on other systems.
+ *
+ * NOTES about syscfg (from Intel):
+ * To display the BIOS Parameters:
+ * >> syscfg /d biossettings <"BIOS variable Name">
+ *
+ * To Set the BIOS Parameters:
+ * >> syscfg /bcs <AdminPw> <"BIOS variable Name"> <Value>
+ * Note: If AdminPw is not set use ""
+ */
+extern void node_features_p_node_state(char **avail_modes, char **current_mode)
+{
+	char *avail_states = NULL, *cur_state = NULL;
+	char *resp_msg, *argv[10], *avail_sep = "", *cur_sep = "", *tok;
+	int status = 0;
+
+	if (!syscfg_path || !avail_modes || !current_mode)
+		return;
+
+	argv[0] = "syscfg";
+	argv[1] = "/d";
+	argv[2] = "BIOSSETTINGS";
+	argv[3] = "Cluster Mode";
+	argv[4] = NULL;
+	resp_msg = _run_script(syscfg_path, argv, &status);
+	if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+		error("%s: syscfg (get cluster mode) status:%u response:%s",
+		      __func__, status, resp_msg);
+	}
+	if (resp_msg == NULL) {
+		info("%s: syscfg returned no information", __func__);
+	} else {
+		_log_script_argv(argv, resp_msg);
+		tok = strstr(resp_msg, "Current Value : ");
+		if (tok) {
+			tok += 16;
+			if (!strncasecmp(tok, "All2All", 3)) {
+				cur_state = xstrdup("a2a");
+				cur_sep = ",";
+			} else if (!strncasecmp(tok, "Hemisphere", 3)) {
+				cur_state = xstrdup("hemi");
+				cur_sep = ",";
+			} else if (!strncasecmp(tok, "Quadrant", 3)) {
+				cur_state = xstrdup("quad");
+				cur_sep = ",";
+			} else if (!strncasecmp(tok, "SNC-2", 5)) {
+				cur_state = xstrdup("snc2");
+				cur_sep = ",";
+			} else if (!strncasecmp(tok, "SNC-4", 5)) {
+				cur_state = xstrdup("snc4");
+				cur_sep = ",";
+			}
+		}
+		if (slurm_strcasestr(resp_msg, "All2All")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "a2a");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "Hemisphere")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "hemi");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "Quadrant")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "quad");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "SNC-2")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "snc2");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "SNC-4")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "snc4");
+			avail_sep = ",";
+		}
+		xfree(resp_msg);
+	}
+
+	argv[0] = "syscfg";
+	argv[1] = "/d";
+	argv[2] = "BIOSSETTINGS";
+	argv[3] = "Memory Mode";
+	argv[4] = NULL;
+	resp_msg = _run_script(syscfg_path, argv, &status);
+	if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+		error("%s: syscfg (get memory mode) status:%u response:%s",
+		      __func__, status, resp_msg);
+	}
+	if (resp_msg == NULL) {
+		info("%s: syscfg returned no information", __func__);
+	} else {
+		_log_script_argv(argv, resp_msg);
+		tok = strstr(resp_msg, "Current Value : ");
+		if (tok) {
+			tok += 16;
+			if (!strncasecmp(tok, "Cache", 3)) {
+				xstrfmtcat(cur_state, "%s%s", cur_sep, "cache");
+			} else if (!strncasecmp(tok, "Flat", 3)) {
+				xstrfmtcat(cur_state, "%s%s", cur_sep, "flat");
+			} else if (!strncasecmp(tok, "Hybrid", 3)) {
+				xstrfmtcat(cur_state, "%s%s", cur_sep, "hybrid");
+			} else if (!strncasecmp(tok, "Equal", 3)) {
+				xstrfmtcat(cur_state, "%s%s", cur_sep, "equal");
+			} else if (!strncasecmp(tok, "Auto", 3)) {
+				xstrfmtcat(cur_state, "%s%s", cur_sep, "auto");
+			}
+		}
+		if (slurm_strcasestr(resp_msg, "Cache")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "cache");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "Flat")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "flat");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "Hybrid")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "hybrid");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "Equal")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "equal");
+			avail_sep = ",";
+		}
+		if (slurm_strcasestr(resp_msg, "Auto")) {
+			xstrfmtcat(avail_states, "%s%s", avail_sep, "auto");
+			/* avail_sep = ",";	CLANG error: Dead assignment */
+		}
+		xfree(resp_msg);
+	}
+
+	if (*avail_modes) {	/* Append for multiple node_features plugins */
+		if (*avail_modes[0])
+			avail_sep = ",";
+		else
+			avail_sep = "";
+		xstrfmtcat(*avail_modes, "%s%s", avail_sep, avail_states);
+		xfree(avail_states);
+	} else {
+		*avail_modes = avail_states;
+	}
+
+	if (*current_mode) {	/* Append for multiple node_features plugins */
+		if (*current_mode[0])
+			cur_sep = ",";
+		else
+			cur_sep = "";
+		xstrfmtcat(*current_mode, "%s%s", cur_sep, cur_state);
+		xfree(cur_state);
+	} else {
+		*current_mode = cur_state;
+	}
+}
+
+/* Test if a job's feature specification is valid */
+extern int node_features_p_job_valid(char *job_features)
+{
+	uint16_t job_mcdram, job_numa;
+	int mcdram_cnt, numa_cnt;
+
+	if ((job_features == NULL) || (job_features[0] == '\0'))
+		return SLURM_SUCCESS;
+
+	if (strchr(job_features, '[') ||	/* Unsupported operator */
+	    strchr(job_features, ']') ||
+	    strchr(job_features, '|') ||
+	    strchr(job_features, '*'))
+		return ESLURM_INVALID_KNL;
+	
+	job_mcdram = _knl_mcdram_parse(job_features, "&,");
+	mcdram_cnt = _knl_mcdram_bits_cnt(job_mcdram);
+	if (mcdram_cnt > 1)			/* Multiple MCDRAM options */
+		return ESLURM_INVALID_KNL;
+
+	job_numa = _knl_numa_parse(job_features, "&,");
+	numa_cnt = _knl_numa_bits_cnt(job_numa);
+	if (numa_cnt > 1)			/* Multiple NUMA options */
+		return ESLURM_INVALID_KNL;
+
+	return SLURM_SUCCESS;
+}
+
+/* Translate a job's feature request to the node features needed at boot time */
+extern char *node_features_p_job_xlate(char *job_features)
+{
+	char *node_features = NULL;
+	char *tmp, *save_ptr = NULL, *sep = "", *tok;
+	bool has_numa = false, has_mcdram = false;
+
+	if ((job_features == NULL) || (job_features[0] ==  '\0'))
+		return node_features;
+
+	tmp = xstrdup(job_features);
+	tok = strtok_r(tmp, "&", &save_ptr);
+	while (tok) {
+		bool knl_opt = false;
+		if (_knl_mcdram_token(tok)) {
+			if (!has_mcdram) {
+				has_mcdram = true;
+				knl_opt = true;
+			}
+		}
+		if (_knl_numa_token(tok)) {
+			if (!has_numa) {
+				has_numa = true;
+				knl_opt = true;
+			}
+		}
+		if (knl_opt) {
+			xstrfmtcat(node_features, "%s%s", sep, tok);
+			sep = ",";
+		}
+		tok = strtok_r(NULL, "&", &save_ptr);
+	}
+	xfree(tmp);
+
+	/* Add default options */
+	if (!has_mcdram) {
+		tmp = _knl_mcdram_str(default_mcdram);
+		xstrfmtcat(node_features, "%s%s", sep, tmp);
+		sep = ",";
+		xfree(tmp);
+	}
+	if (!has_numa) {
+		tmp = _knl_numa_str(default_numa);
+		xstrfmtcat(node_features, "%s%s", sep, tmp);
+		// sep = ",";		Removed to avoid CLANG error
+		xfree(tmp);
+	}
+
+	return node_features;
+}
+
+static char *_find_key_val(char *key, char *resp_msg)
+{
+	char *sep = NULL, *tok, *val = NULL;
+	int i;
+
+	if ((key == NULL) || (resp_msg == NULL))
+		return NULL;
+
+	if ((tok = strstr(resp_msg, "Possible Values")))
+		tok += 15;
+	else
+		tok = resp_msg;
+	if ((tok = strstr(tok, key)))
+		sep = strchr(tok, ':');
+	if (sep) {
+		sep++;
+		while ((sep[0] != '\0')&& !isdigit(sep[0]))
+			sep++;
+		if (isdigit(sep[0])) {
+			val = xstrdup(sep);
+			for (i = 1 ; val[i]; i++) {
+				if (!isdigit(val[i])) {
+					val[i] = '\0';
+					break;
+				}
+			}
+		}
+	}
+
+	return val;
+}
+
+/* Set's the node's active features based upon job constraints.
+ * NOTE: Executed by the slurmd daemon.
+ * IN active_features - New active features
+ * RET error code */
+extern int node_features_p_node_set(char *active_features)
+{
+	char *resp_msg, *argv[10];
+	char *key;
+	int error_code = SLURM_SUCCESS, status = 0;
+	char *mcdram_mode = NULL, *numa_mode = NULL;
+
+	if ((active_features == NULL) || (active_features[0] == '\0'))
+		return SLURM_SUCCESS;
+
+	if (!syscfg_path) {
+		error("%s: SyscfgPath not configured", __func__);
+		return SLURM_ERROR;
+	}
+
+	/* Identify available Cluster/NUMA modes */
+	argv[0] = "syscfg";
+	argv[1] = "/d";
+	argv[2] = "BIOSSETTINGS";
+	argv[3] = "Cluster Mode";
+	argv[4] = NULL;
+	resp_msg = _run_script(syscfg_path, argv, &status);
+	if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+		error("%s: syscfg (get cluster mode) status:%u response:%s",
+		      __func__, status, resp_msg);
+		error_code = SLURM_ERROR;
+	}
+	if (resp_msg == NULL) {
+		info("%s: syscfg returned no information", __func__);
+	} else {
+		_log_script_argv(argv, resp_msg);
+		if (strstr(active_features, "a2a"))
+			key = "All2All";
+		else if (strstr(active_features, "hemi"))
+			key = "Hemisphere";
+		else if (strstr(active_features, "quad"))
+			key = "Quadrant";
+		else if (strstr(active_features, "snc2"))
+			key = "SNC-2";
+		else if (strstr(active_features, "snc4"))
+			key = "SNC-4";
+		else
+			key = NULL;
+		numa_mode = _find_key_val(key, resp_msg);
+		xfree(resp_msg);
+	}
+
+	/* Reset current Cluster/NUMA mode */
+	if (numa_mode) {
+		argv[0] = "syscfg";
+		argv[1] = "/bcs";
+		argv[2] = "";
+		argv[3] = "BIOSSETTINGS";
+		argv[4] = "Cluster Mode";
+		argv[5] = numa_mode;
+		argv[6] = NULL;
+		resp_msg = _run_script(syscfg_path, argv, &status);
+		if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+			error("%s: syscfg (set cluster mode) status:%u response:%s",
+			      __func__, status, resp_msg);
+			error_code = SLURM_ERROR;
+		}  else {
+			_log_script_argv(argv, resp_msg);
+		}
+		xfree(numa_mode);
+	}
+
+	/* Identify available Memory/MCDRAM modes */
+	argv[0] = "syscfg";
+	argv[1] = "/d";
+	argv[2] = "BIOSSETTINGS";
+	argv[3] = "Memory Mode";
+	argv[4] = NULL;
+	resp_msg = _run_script(syscfg_path, argv, &status);
+	if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+		error("%s: syscfg (get memory mode) status:%u response:%s",
+		      __func__, status, resp_msg);
+		error_code = SLURM_ERROR;
+	}
+	if (resp_msg == NULL) {
+		info("%s: syscfg returned no information", __func__);
+	} else {
+		_log_script_argv(argv, resp_msg);
+		if (strstr(active_features, "cache"))
+			key = "Cache";
+		else if (strstr(active_features, "flat"))
+			key = "Flat";
+		else if (strstr(active_features, "hybrid"))
+			key = "Hybrid";
+		else if (strstr(active_features, "equal"))
+			key = "Equal";
+		else if (strstr(active_features, "auto"))
+			key = "Auto";
+		else
+			key = NULL;
+		mcdram_mode = _find_key_val(key, resp_msg);
+		xfree(resp_msg);
+	}
+
+	/* Reset current Memory/MCDRAM mode */
+	if (mcdram_mode) {
+		argv[0] = "syscfg";
+		argv[1] = "/bcs";
+		argv[2] = "";
+		argv[3] = "BIOSSETTINGS";
+		argv[4] = "Memory Mode";
+		argv[5] = mcdram_mode;
+		argv[6] = NULL;
+		resp_msg = _run_script(syscfg_path, argv, &status);
+		if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+			error("%s: syscfg (set memory mode) status:%u response:%s",
+			      __func__, status, resp_msg);
+			error_code = SLURM_ERROR;
+		} else {
+			_log_script_argv(argv, resp_msg);
+		}
+		xfree(mcdram_mode);
+	}
+
+	/* Clear features, do not pass as argument to reboot program
+	 * (assuming we are calling /sbin/reboot). */
+	active_features[0] = '\0';
+
+	return error_code;
+}
+
+/* Return true if the plugin requires PowerSave mode for booting nodes */
+extern bool node_features_p_node_power(void)
+{
+	return false;
+}
+
+/* Note the active features associated with a set of nodes have been updated.
+ * Specifically update the node's "hbm" GRES value as needed.
+ * IN active_features - New active features
+ * IN node_bitmap - bitmap of nodes changed
+ * RET error code */
+extern int node_features_p_node_update(char *active_features,
+				       bitstr_t *node_bitmap)
+{
+//FIXME: Need to get HBM details for implementation.
+	int i, i_first, i_last;
+	int rc = SLURM_SUCCESS;
+	uint16_t mcdram_inx;
+	uint64_t mcdram_size;
+	struct node_record *node_ptr;
+
+	if (mcdram_per_node == NULL) {
+		error("%s: mcdram_per_node == NULL", __func__);
+		return SLURM_ERROR;
+	}
+	mcdram_inx = _knl_mcdram_parse(active_features, ",");
+	if (mcdram_inx == 0)
+		return rc;
+	for (i = 0; i < KNL_MCDRAM_CNT; i++) {
+		if ((KNL_CACHE << i) == mcdram_inx)
+			break;
+	}
+	if ((i >= KNL_MCDRAM_CNT) || (mcdram_pct[i] == -1))
+		return rc;
+	mcdram_inx = i;
+
+	xassert(node_bitmap);
+	i_first = bit_ffs(node_bitmap);
+	if (i_first >= 0)
+		i_last = bit_fls(node_bitmap);
+	else
+		i_last = i_first - 1;
+	for (i = i_first; i <= i_last; i++) {
+		if (!bit_test(node_bitmap, i))
+			continue;
+		if (i >= node_record_count) {
+			error("%s: Invalid node index (%d >= %d)",
+			      __func__, i, node_record_count);
+			rc = SLURM_ERROR;
+			break;
+		}
+		mcdram_size = mcdram_per_node[i] *
+			      (100 - mcdram_pct[mcdram_inx]) / 100;
+		node_ptr = node_record_table_ptr + i;
+		gres_plugin_node_feature(node_ptr->name, "hbm",
+					 mcdram_size, &node_ptr->gres,
+					 &node_ptr->gres_list);
+	}
+
+	return rc;
+}
+
+/* Translate a node's feature specification by replacing any features associated
+ * with this plugin in the original value with the new values, preserving any
+ * features that are not associated with this plugin
+ * RET node's new merged features, must be xfreed */
+extern char *node_features_p_node_xlate(char *new_features, char *orig_features)
+{
+	char *node_features = NULL;
+	char *tmp, *save_ptr = NULL, *sep = "", *tok;
+
+	if (new_features) {
+		tmp = xstrdup(new_features);
+		tok = strtok_r(tmp, ",", &save_ptr);
+		while (tok) {
+			if ((_knl_mcdram_token(tok) != 0) ||
+			    (_knl_numa_token(tok)   != 0)) {
+				xstrfmtcat(node_features, "%s%s", sep, tok);
+				sep = ",";
+			}
+			tok = strtok_r(NULL, ",", &save_ptr);
+		}
+		xfree(tmp);
+	}
+
+	if (!node_features) {	/* No new info from compute node */
+		node_features = xstrdup(orig_features);
+		return node_features;
+	}
+
+	tmp = xstrdup(orig_features);
+	tok = strtok_r(tmp, ",", &save_ptr);
+	while (tok) {
+		if ((_knl_mcdram_token(tok) == 0) &&
+		    (_knl_numa_token(tok)   == 0)) {
+			xstrfmtcat(node_features, "%s%s", sep, tok);
+			sep = ",";
+		}
+		tok = strtok_r(NULL, ",", &save_ptr);
+	}
+	xfree(tmp);
+
+	return node_features;
+}
+
+/* Determine if the specified user can modify the currently available node
+ * features */
+extern bool node_features_p_user_update(uid_t uid)
+{
+	int i;
+
+	if (allowed_uid_cnt == 0)   /* Default is ALL users allowed to update */
+		return true;
+
+	for (i = 0; i < allowed_uid_cnt; i++) {
+		if (allowed_uid[i] == uid)
+			return true;
+	}
+
+	return false;
+}
diff --git a/src/plugins/node_features/knl_generic/syscfg b/src/plugins/node_features/knl_generic/syscfg
new file mode 100644
index 0000000000000000000000000000000000000000..9509fd56cf904086c89e97396ee1001a8db6963b
--- /dev/null
+++ b/src/plugins/node_features/knl_generic/syscfg
@@ -0,0 +1,41 @@
+#!/bin/bash
+# Emulate syscfg (Intel's MOBO interface) for testing purposes
+# Use cases:
+# syscfg /d BIOSSETTINGS "Cluster Mode"
+# syscfg /d BIOSSETTINGS "Memory Mode"
+# syscfg /bcs "" biossettings "Cluster Mode" "01"
+# syscfg /bcs "" biossettings "Memory Mode" "02"
+#
+if [ "${1}" == "/d" -a "${3}" == "Cluster Mode" ]; then
+   echo 'Cluster Mode'
+   echo '============'
+   echo 'Current Value : All2All'
+   echo '-----------------------'
+   echo 'Possible Values'
+   echo 'All2All : 00'
+   echo 'Hemisphere : 01'
+   echo 'Quadrant : 02'
+   echo 'SNC-2 : 03'
+   echo 'SNC-4 : 04'
+   exit 0
+fi
+
+if [ "${1}" == "/d" -a "${3}" == "Memory Mode" ]; then
+   echo 'Memory Mode'
+   echo '==========='
+   echo 'Current Value : Cache'
+   echo '---------------------'
+   echo 'Possible Values'
+   echo 'Cache : 00'
+   echo 'Flat : 01'
+   echo 'Hybrid : 02'
+   echo 'Auto : 03'
+   exit 0
+fi
+
+if [ "${1}" == "/bcs" ]; then
+   exit 0
+fi
+
+echo 'Invalid argument'
+exit 1
diff --git a/src/slurmctld/job_scheduler.c b/src/slurmctld/job_scheduler.c
index bc0eaaae6f280c492665d219c09c0fa9455b7185..6ccfe1cb26e4da29dadf7e59ef2a7b0aab2af1dc 100644
--- a/src/slurmctld/job_scheduler.c
+++ b/src/slurmctld/job_scheduler.c
@@ -3242,6 +3242,7 @@ extern int job_start_data(job_desc_msg_t *job_desc_msg,
 			  &exc_core_bitmap, &resv_overlap);
 	if (i != SLURM_SUCCESS) {
 		FREE_NULL_BITMAP(avail_bitmap);
+		FREE_NULL_BITMAP(exc_core_bitmap);
 		return i;
 	}
 	bit_and(avail_bitmap, resv_bitmap);
@@ -3678,8 +3679,7 @@ extern int reboot_job_nodes(struct job_record *job_ptr)
 		node_ptr->node_state |= NODE_STATE_POWER_UP;
 		bit_clear(avail_node_bitmap, i);
 		node_ptr->boot_req_time = now;
-		node_ptr->last_response = now + slurmctld_conf.resume_timeout -
-					  slurmctld_conf.slurmd_timeout;
+		node_ptr->last_response = now + slurmctld_conf.resume_timeout;
 	}
 	FREE_NULL_BITMAP(boot_node_bitmap);
 	agent_queue_request(reboot_agent_args);
diff --git a/src/slurmctld/licenses.c b/src/slurmctld/licenses.c
index e60bb02b4d15336780b1ef82dd9a12cce4c0cf6b..07e52a1a55e3f27a22163767c89008effc811cdb 100644
--- a/src/slurmctld/licenses.c
+++ b/src/slurmctld/licenses.c
@@ -136,7 +136,7 @@ static List _build_license_list(char *licenses, bool *valid)
 	tmp_str = xstrdup(licenses);
 	token = strtok_r(tmp_str, ",;", &last);
 	while (token && *valid) {
-		uint32_t num = 1;
+		int32_t num = 1;
 		for (i = 0; token[i]; i++) {
 			if (isspace(token[i])) {
 				*valid = false;
@@ -147,7 +147,7 @@ static List _build_license_list(char *licenses, bool *valid)
 			 */
 			if ((token[i] == ':') || (token[i] == '*')) {
 				token[i++] = '\0';
-				num = (uint32_t)strtol(&token[i], &end_num,10);
+				num = (int32_t)strtol(&token[i], &end_num, 10);
 			}
 		}
 		if (num < 0) {
diff --git a/src/slurmctld/node_mgr.c b/src/slurmctld/node_mgr.c
index 6fb4bf78eb02801fd044fda7690840930111b3f5..90316785f215c421d72cb3841fde7356de0bbe3c 100644
--- a/src/slurmctld/node_mgr.c
+++ b/src/slurmctld/node_mgr.c
@@ -2285,7 +2285,7 @@ extern int validate_node_specs(slurm_node_registration_status_msg_t *reg_msg,
 	int error_code, i, node_inx;
 	struct config_record *config_ptr;
 	struct node_record *node_ptr;
-	char *reason_down = NULL, *tmp_str;
+	char *reason_down = NULL, *tmp_str, *orig_act;
 	uint32_t node_flags;
 	time_t now = time(NULL);
 	bool gang_flag = false;
@@ -2323,14 +2323,6 @@ extern int validate_node_specs(slurm_node_registration_status_msg_t *reg_msg,
 	if (slurm_get_preempt_mode() != PREEMPT_MODE_OFF)
 		gang_flag = true;
 
-	if (reg_msg->features_active) {
-		tmp_str = node_features_g_node_xlate(reg_msg->features_active,
-						     node_ptr->features_act, 1);
-		xfree(node_ptr->features_act);
-		node_ptr->features_act = tmp_str;
-		(void) _update_node_active_features(node_ptr->name,
-						    node_ptr->features_act);
-	}
 	if (reg_msg->features_avail) {
 		tmp_str = node_features_g_node_xlate(reg_msg->features_avail,
 						     node_ptr->features, 1);
@@ -2339,6 +2331,18 @@ extern int validate_node_specs(slurm_node_registration_status_msg_t *reg_msg,
 		(void) _update_node_avail_features(node_ptr->name,
 						   node_ptr->features);
 	}
+	if (reg_msg->features_active) {
+		if (node_ptr->features_act)
+			orig_act = node_ptr->features_act;
+		else
+			orig_act = node_ptr->features;
+		tmp_str = node_features_g_node_xlate(reg_msg->features_active,
+						     orig_act, 1);
+		xfree(node_ptr->features_act);
+		node_ptr->features_act = tmp_str;
+		(void) _update_node_active_features(node_ptr->name,
+						    node_ptr->features_act);
+	}
 
 	if (gres_plugin_node_config_unpack(reg_msg->gres_info,
 					   node_ptr->name) != SLURM_SUCCESS) {
diff --git a/src/slurmd/slurmd/req.c b/src/slurmd/slurmd/req.c
index 36d88e1be9d24a1a72084700198cd8a100fe1fa1..f056933e80e7ecfec44eb6d89e9415de11d4faea 100644
--- a/src/slurmd/slurmd/req.c
+++ b/src/slurmd/slurmd/req.c
@@ -69,6 +69,7 @@
 #include "src/common/log.h"
 #include "src/common/macros.h"
 #include "src/common/msg_aggr.h"
+#include "src/common/node_features.h"
 #include "src/common/node_select.h"
 #include "src/common/plugstack.h"
 #include "src/common/read_config.h"
@@ -2286,10 +2287,20 @@ _rpc_reboot(slurm_msg_t *msg)
 				sp = xstrdup(reboot_program);
 			reboot_msg = (reboot_msg_t *) msg->data;
 			if (reboot_msg && reboot_msg->features) {
-				xstrfmtcat(cmd, "%s %s",
-					   sp, reboot_msg->features);
-			} else
+				info("Node reboot request with features %s being processed",
+				     reboot_msg->features);
+				(void) node_features_g_node_set(
+						reboot_msg->features);
+				if (reboot_msg->features[0]) {
+					xstrfmtcat(cmd, "%s %s",
+						   sp, reboot_msg->features);
+				} else {
+					cmd = xstrdup(sp);
+				}
+			} else {
 				cmd = xstrdup(sp);
+				info("Node reboot request being processed");
+			}
 			if (access(sp, R_OK | X_OK) < 0)
 				error("Cannot run RebootProgram [%s]: %m", sp);
 			else if ((exit_code = system(cmd)))