'''
                 Allows this iterator to be used with the "with" statement
                 '''
-                self.f.close()
+                if self.f:
+                    self.f.close()
                 self.f = None
 
             def next(self):
         Returns a tar iterator that iterates jsonized member items that contain
         an additional "member" field, used by RestoreHelper.
         '''
-        def TarPathIterator(object):
-            def __init__(self, delta_tar, index_path):
+        class TarPathIterator(object):
+            def __init__(self, delta_tar, tar_path):
                 self.delta_tar = delta_tar
-                self.index_path = index_path
+                self.tar_path = tar_path
                 self.tar_obj = None
                 self.__enter__()
 
                 Allows this iterator to be used with the "with" statement
                 '''
                 if self.tar_obj is None:
-                    self.tar_obj = self.delta_tar.open_index(self.index_path, 'r')
+                    self.tar_obj = tarfile.TarFile.open(self.tar_path,
+                        mode='r' + self.delta_tar.mode,
+                        format=tarfile.GNU_FORMAT,
+                        concat_compression='#gz' in self.delta_tar.mode,
+                        password=self.delta_tar.password,
+                        new_volume_handler=None)
                 return self
 
             def __exit__(self, type, value, tb):
                 '''
                 Allows this iterator to be used with the "with" statement
                 '''
-                self.tar_obj.close()
+                if self.tar_obj:
+                    self.tar_obj.close()
                 self.tar_obj = None
 
             def next(self):
                 Read each member and return it as a stat dict
                 '''
                 self.last_member = tarinfo = self.tar_obj.next()
+                if not tarinfo:
+                    raise StopIteration
+
                 ptype = 'unknown'
                 if tarinfo.isfile():
                     ptype = 'file'
                     u'inode': -1, # cannot restore
                     u'size': tarinfo.size,
                     u'member': tarinfo
-                }
+                }, 0
+
         return TarPathIterator(self, tar_path)
 
     def jsonize_path_iterator(self, iter, strip=0):
         if not os.path.exists(target_path):
             os.makedirs(target_path)
 
+        # make backup_tar_path absolute so that iterate_tar_path works fine
+        if backup_tar_path and not os.path.isabs(backup_tar_path):
+            backup_tar_path = os.path.abspath(backup_tar_path)
+
         cwd = os.getcwd()
+        os.chdir(target_path)
 
         if mode == 'tar':
             index_it = self.iterate_tar_path(backup_tar_path)
             helper = RestoreHelper(self, cwd, backup_path=backup_tar_path,
-                                   tarobj=index_it.tarobj)
+                                   tarobj=index_it.tar_obj)
         elif mode == "diff":
             helper = RestoreHelper(self, cwd, backup_indexes_paths)
             index_it = self.iterate_index_path(helper._data[0]["path"])
             else:
                 helper.delete(upath)
 
-            helper.restore_directories_permissions()
-            index_it.release()
-            os.chdir(cwd)
-            helper.cleanup()
+        helper.restore_directories_permissions()
+        index_it.release()
+        os.chdir(cwd)
+        helper.cleanup()
 
     def _parse_json_line(self, f, l_no):
         '''
             if not os.path.isabs(backup_path):
                 backup_path = os.path.normpath(os.path.join(cwd, backup_path))
 
+            # update the new_volume_handler of tar_obj
+            tarobj.new_volume_handler = partial(self.new_volume_handler,
+                self._deltatar, self._cwd, True, os.path.dirname(backup_path))
             s = dict(
                 curr_vol_no = None,
                 vol_fd = None,
                 iterator = None,
                 last_itelement = None,
                 last_lno = 0,
-                new_volume_handler = partial(self.new_volume_handler,
-                    self._deltatar, self._cwd, True,
-                    os.path.dirname(backup_path))
+                new_volume_handler = tarobj.new_volume_handler
             )
             self._data.append(s)
 
 
         # to preserve parent directory mtime, we save it
         parent_dir = os.path.dirname(upath)
+        if not os.path.exists(parent_dir):
+            os.makedirs(parent_dir)
         parent_dir_mtime = int(os.stat(parent_dir).st_mtime)
 
         # if path is found in the first index as to be snapshotted, deal with it