diff --git a/contribs/README b/contribs/README
index f55e62196c7726e5a2d4d9e1dd27ce1fc7d3bc38..22ff8b2035e44b05927a713d1b42a3cd65db9600 100644
--- a/contribs/README
+++ b/contribs/README
@@ -8,6 +8,13 @@ Slurm as their documentation. A quick description of the subdirectories
 of the Slurm contribs distribution follows:
 
   cray/               [Tools for use on Cray systems]
+     capmc                 - Script used to emulate some capmc functionality
+                             for testing without access to a Cray system
+     capmc_resume.c        - Program used to reboot Cray nodes. Resets KNL node
+                             MCDRAM and/or NUMA mode as requested.
+     capmc_suspend.c       - Program used to power dowen Cray nodes.
+     cnselect              - Script used to emulate some cnselect functionality
+                             for testing without access to a Cray system.
      etc_sysconfig_slurm   - /etc/sysconfig/slurm for Cray XT/XE systems
      libalps_test_programs.tar.gz - set of tools to verify ALPS/BASIL support
 			     logic. Note that this currently requires:
diff --git a/contribs/cray/capmc b/contribs/cray/capmc
new file mode 100755
index 0000000000000000000000000000000000000000..0c2866137da17648f5c7d239e9eae37aaa76a2af
--- /dev/null
+++ b/contribs/cray/capmc
@@ -0,0 +1,507 @@
+#!/bin/bash
+echo $* >>/var/tmp/capmc.log
+if [ $# -lt 1 ] ; then
+echo 'no argument'
+exit 1
+fi
+
+if [ "$1" = "get_power_cap_capabilities" ] ; then
+echo '{
+    "groups":[
+        {
+            "name":"01:000d:306e:0082:000a:0020:3a34:8300",
+            "desc":"ComputeANC_IVB_130W_10c_32GB_14900_IntelKNCAccel",
+            "supply":425,
+            "host_limit_min":100,
+            "host_limit_max":200,
+            "static":0,
+            "powerup":120,
+            "controls":[
+                {
+                    "name":"accel",
+                    "desc":"Accelerator control",
+                    "min":220,
+                    "max":260
+                },
+                {
+                    "name":"node",
+                    "desc":"Node manager control",
+                    "min":320,
+                    "max":460
+                }
+            ],
+            "nids":[
+                44,
+                45,
+                46,
+                47,
+                60,
+                61,
+                62,
+                63
+            ]
+        },
+        {
+            "name":"01:000d:306e:00e6:0014:0040:3a34:0000",
+            "desc":"ComputeANC_IVB_230W_20c_64GB_14900_NoAccel",
+            "supply":425,
+            "host_limit_min":200,
+            "host_limit_max":350,
+            "static":0,
+            "powerup":150,
+            "controls":[{
+                    "name":"node",
+                    "desc":"Node manager control",
+                    "min":200,
+                    "max":350
+                }],
+            "nids":[
+                52,
+                53,
+                54,
+                55
+            ]
+        },
+        {
+            "name":"01:000d:206d:0073:0008:0020:3a34:8100",
+            "desc":"ComputeANC_SNB_115W_8c_32GB_14900_KeplerK20XAccel",
+            "supply":425,
+            "host_limit_min":95,
+            "host_limit_max":185,
+            "static":0,
+            "powerup":120,
+            "controls":[
+                {
+                    "name":"accel",
+                    "desc":"Accelerator control",
+                    "min":180,
+                    "max":225
+                },
+                {
+                    "name":"node",
+                    "desc":"Node manager control",
+                    "min":275,
+                    "max":410
+                }
+            ],
+            "nids":[
+                4,
+                5,
+                6,
+                7
+            ]
+        },
+        {
+            "name":"01:000d:206d:00e6:0010:0040:3200:0000",
+            "desc":"ComputeANC_SNB_230W_16c_64GB_12800_NoAccel",
+            "supply":425,
+            "host_limit_min":200,
+            "host_limit_max":350,
+            "static":0,
+            "powerup":150,
+            "controls":[{
+                    "name":"node",
+                    "desc":"Node manager control",
+                    "min":200,
+                    "max":350
+                }],
+            "nids":[
+                32,
+                33,
+                34,
+                35,
+                48,
+                49,
+                50,
+                51
+            ]
+        },
+        {
+            "name":"01:000d:206d:00e6:0010:0020:3200:0000",
+            "desc":"ComputeANC_SNB_230W_16c_32GB_12800_NoAccel",
+            "supply":425,
+            "host_limit_min":200,
+            "host_limit_max":350,
+            "static":0,
+            "powerup":150,
+            "controls":[{
+                    "name":"node",
+                    "desc":"Node manager control",
+                    "min":200,
+                    "max":350
+                }],
+            "nids":[
+                36,
+                37,
+                38,
+                39,
+                40,
+                41,
+                42,
+                43
+            ]
+        },
+        {
+            "name":"01:000d:306e:00e6:0018:0020:3200:0000",
+            "desc":"ComputeANC_IVB_230W_24c_32GB_12800_NoAccel",
+            "supply":425,
+            "host_limit_min":200,
+            "host_limit_max":350,
+            "static":0,
+            "powerup":150,
+            "controls":[{
+                    "name":"node",
+                    "desc":"Node manager control",
+                    "min":200,
+                    "max":350
+                }],
+            "nids":[
+                56,
+                57,
+                58,
+                59
+            ]
+        },
+        {
+            "name":"01:000a:206d:0073:0008:0020:3200:0000",
+            "desc":"Service_SNB_115W_8c_32GB_12800_NoAccel",
+            "supply":425,
+            "host_limit_min":95,
+            "host_limit_max":185,
+            "static":0,
+            "powerup":120,
+            "controls":[{
+                    "name":"node",
+                    "desc":"Node manager control",
+                    "min":95,
+                    "max":185
+                }],
+            "nids":[
+                1,
+                2,
+                3,
+                10,
+                13,
+                14,
+                17,
+                18,
+                21,
+                22,
+                25,
+                26,
+                29,
+                30
+            ]
+        }
+    ],
+    "e":0,
+    "err_msg":""
+}'
+exit 0
+fi
+
+if [ "$1" = "get_node_energy_counter" ] ; then
+echo '{
+    "e": 0, 
+    "err_msg": "", 
+    "nid_count": 3, 
+    "nodes": [
+        {
+            "energy_ctr": 4761800, 
+            "nid": 1, 
+            "time": "2015-02-19 15:50:18.581552-06"
+        }, 
+        {
+            "energy_ctr": 4821800, 
+            "nid": 2, 
+            "time": "2015-02-19 15:50:18.581652-06"
+        },
+        {
+            "energy_ctr": 4821800, 
+            "nid": 3, 
+            "time": "2015-02-19 15:50:19.981752-06"
+        }
+    ]
+}'
+exit 0
+fi
+
+if [ "$1" = "node_off" ] ; then
+echo '{
+    "e":0,
+    "err_msg":"uccess"
+}'
+exit 0
+fi
+
+if [ "$1" = "node_offx" ] ; then
+echo '{
+    "e":22,
+    "err_msg":"Invalid nids"
+
+}'
+exit 0
+fi
+
+if [ "$1" = "node_on" ] ; then
+echo '{
+    "e":0,
+    "err_msg":"Success"
+}'
+exit 0
+fi
+
+if [ "$1" = "node_onx" ] ; then
+echo '{
+    "e":22,
+    "err_msg":"Invalid nids"
+
+}'
+exit 0
+fi
+
+if [ "$1" = "node_reinit" ] ; then
+echo '{
+    "e":0,
+    "err_msg":"uccess"
+}'
+exit 0
+fi
+
+if [ "$1" = "node_reinitx" ] ; then
+echo '{
+    "e":22,
+    "err_msg":"Invalid nids"
+
+}'
+exit 0
+fi
+
+if [ "$1" = "node_status" ] ; then
+echo '{
+    "e": 0, 
+    "err_msg": "", 
+    "off": [
+        1,
+        2,
+        3,
+        14, 
+        15
+    ], 
+    "on": [
+        1,
+        2,
+        3,
+        4, 
+        5,
+	6
+    ], 
+    "ready": [
+        16, 
+        27, 
+        18
+    ]
+}'
+exit 0
+fi
+
+if [ "$1" = "get_power_cap" ]; then
+echo '{
+    "e":0,
+    "err_msg":"",
+    "nids":[
+	{
+            "nid":1,
+            "controls":[
+                {
+                    "name":"accel",
+                    "val":101
+                },
+                {
+                    "name":"node",
+                    "val":101
+                }
+            ]
+        },
+	{
+            "nid":2,
+            "controls":[
+                {
+                    "name":"node",
+                    "val":102
+                },
+                {
+                    "name":"accel",
+                    "val":102
+                }
+            ]
+        },
+	{
+            "nid":3,
+            "controls":[
+                {
+                    "name":"node",
+                    "val":103
+                }
+            ]
+        },
+	{
+            "nid":4,
+            "controls":[
+                {
+                    "name":"node",
+                    "val":304
+                },
+                {
+                    "name":"node-biased",
+                    "val":411
+                },
+                {
+                    "name":"bias-factor",
+                    "val":1.0
+                },
+                {
+                    "name":"accel",
+                    "val":230
+                }
+            ]
+        }
+     ]
+}'
+exit 0
+fi
+
+if [ "$1" = "set_power_cap" ]; then
+echo '{
+    "e":0,
+    "err_msg":""
+}'
+exit 0
+fi
+
+if [ "$1" = "get_mcdram_capabilities" ] ; then
+echo '{
+    "nids": [
+        {
+            "mcdram_cfg": "flat,0,split,25,equal,50,cache,100", 
+            "nid": 1
+        }, 
+        {
+            "mcdram_cfg": "flat,0,split,25,equal,50,cache,100", 
+            "nid": 2
+        }, 
+        {
+            "mcdram_cfg": "flat,0,split,25,equal,50,cache,100", 
+            "nid": 3
+        },
+        {
+            "mcdram_cfg": "flat,0,split,25,equal,50,cache,100", 
+            "nid": 4
+        }
+    ], 
+    "err_msg": "Success; nids not eligible for mcdram operations were ignored", 
+    "e": 0
+}'
+exit 0
+fi
+
+if [ "$1" = "get_mcdram_cfg" ]; then
+echo '{
+    "nids": [
+        {
+            "mcdram_cfg": "flat", 
+            "mcdram_pct": "0", 
+            "mcdram_size": "8192MB", 
+            "nid": 1, 
+            "dram_size": "96GB"
+        }, 
+        {
+            "mcdram_cfg": "flat", 
+            "mcdram_pct": "0", 
+            "mcdram_size": "8192MB", 
+            "nid": 2, 
+            "dram_size": "96GB"
+        }, 
+        {
+            "mcdram_cfg": "flat", 
+            "mcdram_pct": "0", 
+            "mcdram_size": "8192MB", 
+            "nid": 3, 
+            "dram_size": "96GB"
+        },
+        {
+            "mcdram_cfg": "flat", 
+            "mcdram_pct": "0", 
+            "mcdram_size": "8192MB", 
+            "nid": 4, 
+            "dram_size": "96GB"
+        }
+    ], 
+    "err_msg": "Success; nids not eligible for mcdram operations were ignored", 
+    "e": 0
+}'
+exit 0
+fi
+
+if [ "$1" = "get_numa_capabilities" ]; then
+echo '{
+    "nids": [
+        {
+            "numa_cfg": "a2a,snc2,snc4,hemi,quad", 
+            "nid": 1
+        }, 
+        {
+            "numa_cfg": "a2a,snc2,snc4,hemi,quad", 
+            "nid": 2
+        }, 
+        {
+            "numa_cfg": "a2a,snc2,snc4,hemi,quad", 
+            "nid": 3
+        },
+        {
+            "numa_cfg": "a2a,snc2,snc4,hemi,quad", 
+            "nid": 4
+        }
+    ], 
+    "err_msg": "Success; nids not eligible for numa operations were ignored", 
+    "e": 0
+}'
+exit 0
+fi
+
+if [ "$1" = "get_numa_cfg" ]; then
+echo '{
+    "nids": [
+        {
+            "numa_cfg": "a2a", 
+            "nid": 1
+        }, 
+        {
+            "numa_cfg": "a2a", 
+            "nid": 2
+        }, 
+        {
+            "numa_cfg": "a2a", 
+            "nid": 3
+        }
+    ], 
+    "err_msg": "Success; nids not eligible for numa operations were ignored", 
+    "e": 0
+}'
+exit 0
+fi
+
+if [ "$1" = "json" ]; then
+echo '{
+    "e":0,
+    "err_msg":""
+}'
+exit 0
+fi
+
+# DEFAULT
+echo '{
+    "e":0,
+    "err_msg":"Success"
+}'
+exit 0
diff --git a/contribs/cray/cnselect b/contribs/cray/cnselect
new file mode 100755
index 0000000000000000000000000000000000000000..ac0b1676931e428f3e4dda6c82ad2533a261ac1d
--- /dev/null
+++ b/contribs/cray/cnselect
@@ -0,0 +1,37 @@
+#!/bin/bash
+if [ $# -lt 2 ] ; then
+echo 'no argument'
+exit 1
+fi
+
+if [ "$2" = "numa_cfg.eq.a2a" ] ; then
+echo '1-3'
+exit 0
+fi
+
+if [ "$2" = "numa_cfg.eq.quad" ] ; then
+echo ''
+exit 0
+fi
+
+# cache
+if [ "$2" = "hbmcachepct.eq.100" ] ; then
+echo ''
+exit 0
+fi
+
+# equal
+if [ "$2" = "hbmcachepct.eq.50" ] ; then
+echo ''
+exit 0
+fi
+
+# flat
+if [ "$2" = "hbmcachepct.eq.0" ] ; then
+echo '1-3'
+exit 0
+fi
+
+# DEFAULT
+echo ''
+exit 0