diff --git a/common/python/rift/mano/dts/subscriber/core.py b/common/python/rift/mano/dts/subscriber/core.py
index a2181e8..63cb321 100644
--- a/common/python/rift/mano/dts/subscriber/core.py
+++ b/common/python/rift/mano/dts/subscriber/core.py
@@ -163,8 +163,16 @@
 
         def on_apply(dts, acg, xact, action, scratch):
             """Apply the  configuration"""
-            is_recovery = xact.xact is None and action == rwdts.AppconfAction.INSTALL
-
+            if xact.xact is None:
+                if action == rwdts.AppconfAction.INSTALL:
+                    try:
+                        for cfg in self.reg.elements:
+                            if self.callback:
+                                self.callback(cfg, rwdts.QueryAction.CREATE)
+                    except Exception as e:
+                        self._log.exception("Adding config {} during restart failed: {}".
+                                            format(cfg, e))
+                return
 
             add_cfgs, delete_cfgs, update_cfgs = get_add_delete_update_cfgs(
                     dts_member_reg=self.reg,
diff --git a/common/python/rift/mano/utils/project.py b/common/python/rift/mano/utils/project.py
index 96d1de5..9d607ff 100644
--- a/common/python/rift/mano/utils/project.py
+++ b/common/python/rift/mano/utils/project.py
@@ -422,13 +422,13 @@
         return self._dts
 
     def add_project(self, name):
-        self.log.info("Adding project: {}".format(name))
+        self._log.info("Adding project: {}".format(name))
 
         if name not in self.projects:
             self._callbacks.on_add_apply(name)
             self.projects.append(name)
         else:
-            self.log.error("Project already present: {}".
+            self._log.error("Project already present: {}".
                            format(name))
 
     def delete_project(self, name):
@@ -437,7 +437,7 @@
             self._callbacks.on_delete_apply(name)
             self.projects.remove(name)
         else:
-            self.log.error("Unrecognized project: {}".
+            self._log.error("Unrecognized project: {}".
                            format(name))
 
     def update_project(self, name):
@@ -474,12 +474,11 @@
                 if action == rwdts.AppconfAction.INSTALL:
                     curr_cfg = self._reg.elements
                     for cfg in curr_cfg:
-                        self._log.debug("Project being re-added after restart.")
-                        self.add_project(cfg.name_ref)
+                        self._log.error("NOT IMPLEMENTED: Project being re-added after restart: {}".
+                                        format(cfg))
+                        # self.add_project(cfg.name)
+                        raise NotImplementedError("Tasklet restart not supported")
                 else:
-                    # When RIFT first comes up, an INSTALL is called with the current config
-                    # Since confd doesn't actally persist data this never has any data so
-                    # skip this for now.
                     self._log.debug("No xact handle.  Skipping apply config")
 
                 return
@@ -636,6 +635,18 @@
                                 format(name, self._get_tasklet_name(), e))
 
     def on_project_added(self, name):
+        if name not in self._tasklet.projects:
+            # Restart case, directly calling apply
+            try:
+                self._tasklet.projects[name] = \
+                                self._class(name, self._tasklet, **(self._kw))
+                self._loop.create_task(self._get_project(name).register())
+
+            except Exception as e:
+                self._log.exception("Project {} create for {} failed: {}".
+                                    format(name, self._get_tasklet_name(), e))
+                raise e
+
         self._log.debug("Project {} added to tasklet {}".
                         format(name, self._get_tasklet_name()))
         self._get_project(name)._apply = True
