diff --git a/NEWS b/NEWS
index bb4989ccc8e5afe3a38259fa433befacd2e26eb3..5b728bd1ae548b9b695cd5cc2f444aa42aada6fc 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,8 @@ documents those changes that are of interest to users and administrators.
  -- Add new RPC (REQUEST_EVENT_LOG) so that slurmd and slurmstepd can log events
     through the slurmctld daemon.
  -- Remove sbatch --bb option. That option was never supported.
+ -- Automically cleanup task/cgroup cpuset and devices cgroups after steps are
+    done.
 
 * Changes in Slurm 17.02.0pre1
 ==============================
diff --git a/src/plugins/task/cgroup/task_cgroup_cpuset.c b/src/plugins/task/cgroup/task_cgroup_cpuset.c
index 0bcbb38ceac393320eb6cd65f336823541255500..5fa99f516b75cb462fb88ff4d105b75860ad44d9 100644
--- a/src/plugins/task/cgroup/task_cgroup_cpuset.c
+++ b/src/plugins/task/cgroup/task_cgroup_cpuset.c
@@ -1056,6 +1056,32 @@ extern int task_cgroup_cpuset_init(slurm_cgroup_conf_t *slurm_cgroup_conf)
 
 extern int task_cgroup_cpuset_fini(slurm_cgroup_conf_t *slurm_cgroup_conf)
 {
+	xcgroup_t cpuset_cg;
+
+	/* Similarly to task_cgroup_memory_fini(), we must lock the
+	 * root cgroup so we don't race with another job step that is
+	 * being started.  */
+        if (xcgroup_create(&cpuset_ns, &cpuset_cg,"",0,0) == XCGROUP_SUCCESS) {
+                if (xcgroup_lock(&cpuset_cg) == XCGROUP_SUCCESS) {
+			/* First move slurmstepd to the root cpuset cg
+			 * so we can remove the step/job/user cpuset
+			 * cg's.  */
+			xcgroup_move_process(&cpuset_cg, getpid());
+                        if (xcgroup_delete(&step_cpuset_cg) != SLURM_SUCCESS)
+                                debug2("task/cgroup: unable to remove step "
+                                       "cpuset : %m");
+                        if (xcgroup_delete(&job_cpuset_cg) != XCGROUP_SUCCESS)
+                                debug2("task/cgroup: not removing "
+                                       "job cpuset : %m");
+                        if (xcgroup_delete(&user_cpuset_cg) != XCGROUP_SUCCESS)
+                                debug2("task/cgroup: not removing "
+                                       "user cpuset : %m");
+                        xcgroup_unlock(&cpuset_cg);
+                } else
+                        error("task/cgroup: unable to lock root cpuset : %m");
+                xcgroup_destroy(&cpuset_cg);
+        } else
+                error("task/cgroup: unable to create root cpuset : %m");
 
 	if (user_cgroup_path[0] != '\0')
 		xcgroup_destroy(&user_cpuset_cg);
diff --git a/src/plugins/task/cgroup/task_cgroup_devices.c b/src/plugins/task/cgroup/task_cgroup_devices.c
index 2a5c00e9e5461e331d7fef83999f15a9621c6af1..583721449eac9ba3d546159fb322e2cc18510c57 100644
--- a/src/plugins/task/cgroup/task_cgroup_devices.c
+++ b/src/plugins/task/cgroup/task_cgroup_devices.c
@@ -113,6 +113,34 @@ error:
 
 extern int task_cgroup_devices_fini(slurm_cgroup_conf_t *slurm_cgroup_conf)
 {
+	xcgroup_t devices_cg;
+
+	/* Similarly to task_cgroup_{memory,cpuset}_fini(), we must lock the
+	 * root cgroup so we don't race with another job step that is
+	 * being started.  */
+        if (xcgroup_create(&devices_ns, &devices_cg,"",0,0)
+	    == XCGROUP_SUCCESS) {
+                if (xcgroup_lock(&devices_cg) == XCGROUP_SUCCESS) {
+			/* First move slurmstepd to the root devices cg
+			 * so we can remove the step/job/user devices
+			 * cg's.  */
+			xcgroup_move_process(&devices_cg, getpid());
+                        if (xcgroup_delete(&step_devices_cg) != SLURM_SUCCESS)
+                                debug2("task/cgroup: unable to remove step "
+                                       "devices : %m");
+                        if (xcgroup_delete(&job_devices_cg) != XCGROUP_SUCCESS)
+                                debug2("task/cgroup: not removing "
+                                       "job devices : %m");
+                        if (xcgroup_delete(&user_devices_cg)
+			    != XCGROUP_SUCCESS)
+                                debug2("task/cgroup: not removing "
+                                       "user devices : %m");
+                        xcgroup_unlock(&devices_cg);
+                } else
+                        error("task/cgroup: unable to lock root devices : %m");
+                xcgroup_destroy(&devices_cg);
+        } else
+                error("task/cgroup: unable to create root devices : %m");
 
 	if ( user_cgroup_path[0] != '\0' )
 		xcgroup_destroy(&user_devices_cg);