diff --git a/api/api.py b/api/api.py
index e8efc3156f3761f5d69ccbde96c7d4e9ae86ed23..355e78f0713acd4820c0613acf1ef2ba5b3f84ee 100644
--- a/api/api.py
+++ b/api/api.py
@@ -47,8 +47,8 @@ routes = [
     ]),
     webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/tags',                                 listhandler.ListHandler, methods=['POST'], name='tags_post', defaults={'list_name': 'tags'}),
     webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/tags/<value:[^/]{3,24}>',              listhandler.ListHandler, name='tags', defaults={'list_name': 'tags'}),
-    webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/file',                                 listhandler.FileListHandler, name='files_post', methods=['POST'], defaults={'list_name': 'files'}),
-    webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/file/<filename:[^/]{3,60}>',           listhandler.FileListHandler, name='files', defaults={'list_name': 'files'}),
+    webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/files',                                 listhandler.FileListHandler, name='files_post', methods=['POST'], defaults={'list_name': 'files'}),
+    webapp2.Route(r'/api/<cont_name:[0-9a-z]{3,24}>/<cid:[0-9a-z]{3,24}>/files/<filename:[^/]{3,60}>',           listhandler.FileListHandler, name='files', defaults={'list_name': 'files'}),
     webapp2.Route(r'/api/<cont_name:collections|projects>/<cid:[0-9a-z]{3,24}>/permissions',                    listhandler.PermissionsListHandler, name='perms_post', methods=['POST'], defaults={'list_name': 'permissions'}),
     webapp2.Route(r'/api/<cont_name:collections|projects>/<cid:[0-9a-z]{3,24}>/permissions/<site:[0-9a-z]{3,24}>/<_id:[\w\@\-\.]{3,60}>',
                                                                                                                 listhandler.PermissionsListHandler, name='perms', defaults={ 'list_name': 'permissions'}),
diff --git a/api/files.py b/api/files.py
index 24917eae1a6473b528e3009c0b936682a51df3cb..c05aa79e66af5ff16f0ede96445c3c3e35490163 100644
--- a/api/files.py
+++ b/api/files.py
@@ -22,7 +22,7 @@ class FileRequest(object):
     The operations could be safely interleaved with other actions like permission checks or database updates.
     """
 
-    def __init__(self, client_addr, filename, body, received_md5, metadata, tags, flavor):
+    def __init__(self, client_addr, filename, body, received_md5, metadata, tags):
         self.client_addr = client_addr
         self.filename = filename
         self.body = body
@@ -31,7 +31,6 @@ class FileRequest(object):
         self.tags = tags
         self.mimetype = util.guess_mimetype(filename)
         self.filetype = util.guess_filetype(filename, self.mimetype)
-        self.flavor = flavor
 
     def save_temp_file(self, tempdir_path):
         self.tempdir_path = tempdir_path
@@ -137,8 +136,5 @@ class FileRequest(object):
             except ValueError:
                 handler.abort(400, 'invalid "metadata" parameter')
             body = handler.request.body_file
-        flavor = handler.get_param('flavor', 'data') # TODO: flavor should go away
-        if flavor not in ['data', 'attachment']:
-            handler.abort(400, 'Query must contain flavor parameter: "data" or "attachment".')
         md5 = handler.request.headers.get('Content-MD5')
-        return cls(handler.request.client_addr, filename, body, md5, metadata, tags, flavor)
+        return cls(handler.request.client_addr, filename, body, md5, metadata, tags)
diff --git a/api/handlers/listhandler.py b/api/handlers/listhandler.py
index 9e0f092ca3f466871dabbb35a888bd2c374b5c3a..cf7e4b3b9a3d09e8a6c13b7dc5f6aeec1dcdb50b 100644
--- a/api/handlers/listhandler.py
+++ b/api/handlers/listhandler.py
@@ -28,7 +28,9 @@ def initialize_list_configurations():
         'files': {
             'storage': liststorage.ListStorage,
             'permchecker': listauth.default_sublist,
-            'use_oid': True
+            'use_oid': True,
+            'mongo_schema_file': 'mongo/file.json',
+            'input_schema_file': 'input/file.json'
         },
         'permissions': {
             'storage': liststorage.ListStorage,
@@ -354,38 +356,34 @@ class FileListHandler(ListHandler):
             file_request.save_temp_file(tempdir_path)
             file_datetime = datetime.datetime.utcnow()
             file_properties = {
-                'filename': file_request.filename,
-                'filesize': file_request.filesize,
-                'filehash': file_request.sha1,
-                'filetype': file_request.filetype,
-                'flavor': file_request.flavor,
-                'mimetype': file_request.mimetype,
+                'name': file_request.filename,
+                'size': file_request.filesize,
+                'hash': file_request.sha1,
+                'type': file_request.mimetype,
                 'tags': file_request.tags,
                 'metadata': file_request.metadata,
                 'created': file_datetime,
                 'modified': file_datetime,
-                'dirty': True
+                'unprocessed': True
             }
+            file_properties['tags'] = file_properties.get('tags', [])
             dest_path = os.path.join(self.app.config['data_path'], str(_id)[-3:] + '/' + str(_id))
             if not force:
                 method = 'POST'
             else:
                 filepath = os.path.join(file_request.tempdir_path, filename)
                 for f in container['files']:
-                    if f['filename'] == filename:
-                        if file_request.check_identical(os.path.join(data_path, filename), f['filehash']):
+                    if f['name'] == filename:
+                        if file_request.check_identical(os.path.join(data_path, filename), f['hash']):
                             log.debug('Dropping    %s (identical)' % filename)
                             os.remove(filepath)
                             self.abort(409, 'identical file exists')
                         else:
                             log.debug('Replacing   %s' % filename)
-                            payload_validator(payload, 'PUT')
-                            payload.update(file_properties)
                             method = 'PUT'
                         break
                 else:
                     method = 'POST'
-
             payload_validator(payload, method)
             payload.update(file_properties)
             result = keycheck(mongo_validator(permchecker(storage.exec_op)))(method, _id=_id, payload=payload)
diff --git a/api/schemas/input/file.json b/api/schemas/input/file.json
index 4295309f089918484905b37fcd04b4e6766820d9..7ad120129d140b62a5ba515103dee7f1c9e9bf58 100644
--- a/api/schemas/input/file.json
+++ b/api/schemas/input/file.json
@@ -2,13 +2,6 @@
   "$schema": "http://json-schema.org/draft-04/schema#",
   "type": "object",
   "properties": {
-    "_id": {
-        "maxLength": 32,
-        "minLength": 2,
-        "pattern": "^[0-9a-z][0-9a-z.@_-]{0,30}[0-9a-z]$",
-        "title": "ID",
-        "type": "string"
-    },
     "name":           { "type": "string" },
     "created":        {"type": "string", "format": "date-time"},
     "modified":       {"type": "string", "format": "date-time"},
@@ -31,6 +24,5 @@
       "type": "object"
     }
   },
-  "required": ["_id"],
   "additionalProperties": false
 }
diff --git a/api/schemas/mongo/file.json b/api/schemas/mongo/file.json
index 93aba0ed2b0237b8ce9912ea3321fd018dcea260..2645ba7c76b14ab72c3033911d8f2d9ea7d3806e 100644
--- a/api/schemas/mongo/file.json
+++ b/api/schemas/mongo/file.json
@@ -2,7 +2,6 @@
   "$schema": "http://json-schema.org/draft-04/schema#",
   "type": "object",
   "properties": {
-    "_id":            { "type": "string"},
     "name":           { "type": "string" },
     "created":        {},
     "modified":       {},
@@ -25,6 +24,6 @@
       "type": "object"
     }
   },
-  "required": ["_id", "user", "text"],
+  "required": ["name", "created", "modified", "type", "size", "hash", "unprocessed"],
   "additionalProperties": false
 }
diff --git a/api/util.py b/api/util.py
index 7dfb20ebfa2e6d775ab271811cc6f9746d2f7aa8..57f1d6631db7463d17f4e900e1ce0d3dde6d6830 100644
--- a/api/util.py
+++ b/api/util.py
@@ -54,7 +54,7 @@ def parse_file(filepath, digest):
             'filehash': digest,
             'modality': dataset.nims_file_domain,
             'datatypes': dataset.nims_file_kinds,
-            'flavor': 'data',
+            'tags': ['data'],
             }
     datainfo = {
             'acquisition_id': dataset.nims_acquisition_id,