diff --git a/master/product/Vifib/Tool/VifibRestApiV1Tool.py b/master/product/Vifib/Tool/VifibRestApiV1Tool.py
index 4704eb026969c4aac81dc2ca3c54cad73b180e06..fa1de0df4c077c7af3c296e31a258e77e2aacbf4 100644
--- a/master/product/Vifib/Tool/VifibRestApiV1Tool.py
+++ b/master/product/Vifib/Tool/VifibRestApiV1Tool.py
@@ -190,37 +190,41 @@ def responseSupport(anonymous=False):
     return wrapperResponseSupport
   return outer
 
-def extractInstance(fn):
-  def wrapperExtractInstance(self, *args, **kwargs):
-    if not self.REQUEST['traverse_subpath']:
-      self.REQUEST.response.setStatus(404)
+def extractDocument(portal_type):
+  if not isinstance(portal_type, (list, tuple)):
+    portal_type = [portal_type]
+  def outer(fn):
+    def wrapperExtractDocument(self, *args, **kwargs):
+      if not self.REQUEST['traverse_subpath']:
+        self.REQUEST.response.setStatus(404)
+        return self.REQUEST.response
+      path = self.REQUEST['traverse_subpath'][:2]
+      try:
+        document = self.getPortalObject().restrictedTraverse(path)
+        if getattr(document, 'getPortalType', None) is None or \
+          document.getPortalType() not in portal_type:
+          raise WrongRequest('%r is neiter of %s' % (path, ', '.join(
+            portal_type)))
+        self.document_url = document.getRelativeUrl()
+      except WrongRequest:
+        LOG('VifibRestApiV1Tool', ERROR,
+          'Problem while trying to find document:', error=True)
+        self.REQUEST.response.setStatus(404)
+      except (Unauthorized, KeyError):
+        self.REQUEST.response.setStatus(404)
+      except Exception:
+        LOG('VifibRestApiV1Tool', ERROR,
+          'Problem while trying to find instance:', error=True)
+        self.REQUEST.response.setStatus(500)
+        self.REQUEST.response.setBody(jsonify({'error':
+          'There is system issue, please try again later.'}))
+      else:
+        self.REQUEST['traverse_subpath'] = self.REQUEST['traverse_subpath'][2:]
+        return fn(self, *args, **kwargs)
       return self.REQUEST.response
-    instance_path = self.REQUEST['traverse_subpath'][:2]
-    try:
-      software_instance = self.getPortalObject().restrictedTraverse(instance_path)
-      if getattr(software_instance, 'getPortalType', None) is None or \
-        software_instance.getPortalType() not in ('Software Instance',
-          'Slave Instance'):
-        raise WrongRequest('%r is not an instance' % instance_path)
-      self.software_instance_url = software_instance.getRelativeUrl()
-    except WrongRequest:
-      LOG('VifibRestApiV1Tool', ERROR,
-        'Problem while trying to find instance:', error=True)
-      self.REQUEST.response.setStatus(404)
-    except (Unauthorized, KeyError):
-      self.REQUEST.response.setStatus(404)
-    except Exception:
-      LOG('VifibRestApiV1Tool', ERROR,
-        'Problem while trying to find instance:', error=True)
-      self.REQUEST.response.setStatus(500)
-      self.REQUEST.response.setBody(jsonify({'error':
-        'There is system issue, please try again later.'}))
-    else:
-      self.REQUEST['traverse_subpath'] = self.REQUEST['traverse_subpath'][2:]
-      return fn(self, *args, **kwargs)
-    return self.REQUEST.response
-  wrapperExtractInstance.__doc__ = fn.__doc__
-  return wrapperExtractInstance
+    wrapperExtractDocument.__doc__ = fn.__doc__
+    return wrapperExtractDocument
+  return outer
 
 class GenericPublisher(Implicit):
   @responseSupport(True)
@@ -246,13 +250,13 @@ class InstancePublisher(GenericPublisher):
     title=(unicode, encode_utf8),
     connection=dict
   ), ['title', 'connection'])
-  @extractInstance
+  @extractDocument(['Software Instance', 'Slave Instance'])
   def PUT(self):
     """Instance PUT support"""
     d = {}
     try:
       self.REQUEST.response.setStatus(204)
-      software_instance = self.restrictedTraverse(self.software_instance_url)
+      software_instance = self.restrictedTraverse(self.document_url)
       if 'title' in self.jbody and \
           software_instance.getTitle() != self.jbody['title']:
         software_instance.setTitle(self.jbody['title'])
@@ -279,10 +283,10 @@ class InstancePublisher(GenericPublisher):
   @requireHeader({'Accept': 'application/json',
     'Content-Type': 'application/json'})
   @requireJson(dict(log=unicode))
-  @extractInstance
+  @extractDocument(['Software Instance', 'Slave Instance'])
   def __bang(self):
     try:
-      self.restrictedTraverse(self.software_instance_url
+      self.restrictedTraverse(self.document_url
         ).reportComputerPartitionBang(comment=self.jbody['log'])
     except Exception:
       LOG('VifibRestApiV1Tool', ERROR,
@@ -340,11 +344,11 @@ class InstancePublisher(GenericPublisher):
     return self.REQUEST.response
 
   @requireHeader({'Accept': 'application/json'})
-  @extractInstance
-  @supportModifiedSince('software_instance_url')
+  @extractDocument(['Software Instance', 'Slave Instance'])
+  @supportModifiedSince('document_url')
   def __instance_info(self):
     certificate = False
-    software_instance = self.restrictedTraverse(self.software_instance_url)
+    software_instance = self.restrictedTraverse(self.document_url)
     if self.REQUEST['traverse_subpath'] and self.REQUEST[
         'traverse_subpath'][-1] == 'certificate':
       certificate = True