diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py
index d11e2c17d7e83f4208ae356fd00d20218b247389..908d6a59b4d7b651b72b38a52bba9f213aaa7ba9 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py
+++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py
@@ -636,8 +636,26 @@ class RADatabase:
 
         raise KeyError('No such resource_claim_property_type: %s Valid values are: %s' % (type_name, ', '.join(self.getResourceClaimPropertyTypeNames())))
 
+    def getResourceClaimPropertyIOTypes(self):
+        query = '''SELECT * from resource_allocation.resource_claim_property_io_type;'''
+
+        return list(self._executeQuery(query, fetch=_FETCH_ALL))
+
+    def getResourceClaimPropertyIOTypeNames(self):
+        return [x['name'] for x in self.getResourceClaimPropertyIOTypes()]
+
+    def getResourceClaimPropertyIOTypeId(self, io_type_name):
+        query = '''SELECT id from resource_allocation.resource_claim_property_io_type
+                   WHERE name = %s;'''
+        result = self._executeQuery(query, [io_type_name], fetch=_FETCH_ONE)
+
+        if result:
+            return result['id']
+
+        raise KeyError('No such resource_claim_property_io_type: %s Valid values are: %s' % (io_type_name, ', '.join(self.getResourceClaimPropertyIOTypeNames())))
+
     def getResourceClaimProperties(self, claim_ids=None, task_id=None):
-        query = '''SELECT rcpv.id, rcpv.resource_claim_id, rcpv.value, rcpv.type_id, rcpv.type_name, sap.number as sap_nr
+        query = '''SELECT rcpv.id, rcpv.resource_claim_id, rcpv.value, rcpv.type_id, rcpv.type_name, rcpv.io_type_id, rcpv.io_type_name, sap.number as sap_nr
                    FROM resource_allocation.resource_claim_property_view rcpv
                    LEFT JOIN resource_allocation.sap sap on rcpv.sap_id = sap.id'''
 
@@ -667,15 +685,19 @@ class RADatabase:
 
         return properties
 
-    def insertResourceClaimProperty(self, claim_id, property_type, value, commit=True):
-        return self.insertResourceClaimProperties([(claim_id, property_type, value)], commit)
+    def insertResourceClaimProperty(self, claim_id, property_type, value, io_type, commit=True):
+        return self.insertResourceClaimProperties([(claim_id, property_type, value, io_type)], commit)
 
     def insertResourceClaimProperties(self, props, commit=True):
         if not props:
             return []
 
+        # props is a list of tuples
+        # each tuple prop is encoded as: (claim_id, type, value, io_type, sap_nr)
+        #                         index: (0       , 1   , 2    , 3      , 4     )
+
         # first insert unique sap numbers
-        claim_sap_nrs = list(set([(p[0], p[3]) for p in props if p[3] is not None]))
+        claim_sap_nrs = list(set([(p[0], p[4]) for p in props if p[4] is not None]))
         sap_ids = self.insertSAPNumbers(claim_sap_nrs, False)
 
         if sap_ids == None:
@@ -696,19 +718,25 @@ class RADatabase:
         type_strings = set([p[1] for p in props if isinstance(p[1], basestring)])
         type_string2id = {t:self.getResourceClaimPropertyTypeId(t) for t in type_strings}
 
+        # convert all property io_type strings to id's
+        io_type_strings = set([p[3] for p in props if isinstance(p[3], basestring)])
+        io_type_string2id = {t:self.getResourceClaimPropertyIOTypeId(t) for t in io_type_strings}
+
         # finally we have all the info we need,
         # so we can build the bulk property insert query
-        insert_values = ','.join(self.cursor.mogrify('(%s, %s, %s, %s)',
+        insert_values = ','.join(self.cursor.mogrify('(%s, %s, %s, %s, %s)',
                                                      (p[0],
                                                       type_string2id[p[1]] if
                                                       isinstance(p[1], basestring) else p[1],
                                                       p[2],
-                                                      claim_id2sap_nr2sap_id[p[0]].get(p[3]) if
+                                                      io_type_string2id[p[3]] if
+                                                      isinstance(p[3], basestring) else p[3],
+                                                      claim_id2sap_nr2sap_id[p[0]].get(p[4]) if
                                                       p[0] in claim_id2sap_nr2sap_id else None))
                                                      for p in props)
 
         query = '''INSERT INTO resource_allocation.resource_claim_property
-        (resource_claim_id, type_id, value, sap_id)
+        (resource_claim_id, type_id, value, io_type_id, sap_id)
         VALUES {values}
         RETURNING id;'''.format(values=insert_values)
 
@@ -929,7 +957,7 @@ class RADatabase:
         properties = []
         for claim_id, claim in zip(claimIds, claims):
             if 'properties' in claim and len(claim['properties']) > 0:
-                claim_props = [(claim_id, p['type'], p['value'], p.get('sap_nr')) for p in claim['properties']]
+                claim_props = [(claim_id, p['type'], p['value'], p.get('io_type', 0), p.get('sap_nr')) for p in claim['properties']]
                 properties += claim_props
 
         if properties:
@@ -1396,25 +1424,6 @@ if __name__ == '__main__':
         print '\n-- ' + str(method.__name__) + ' --'
         print '\n'.join([str(x) for x in method()])
 
-    resultPrint(db.getTasks)
-
-    for t in db.getTasks():
-        print db.getTask(t['id'])
-
-    exit()
-
-    #print db.getResourceClaims(task_id=440)
-    #print
-    #print db.getResourceClaims(lower_bound=datetime.utcnow() + timedelta(days=9))
-    #print
-    #print db.getResourceClaims(upper_bound=datetime.utcnow() + timedelta(days=19))
-    #print
-    #print db.getResourceClaims(status='allocated')
-    #print
-    #print db.getResourceClaims(status='claimed')
-    #print
-    #print db.getResourceClaims(resource_type='storage')
-
     #resultPrint(db.getTaskStatuses)
     #resultPrint(db.getTaskStatusNames)
     #resultPrint(db.getTaskTypes)
@@ -1435,82 +1444,57 @@ if __name__ == '__main__':
     #print db.getTaskSuccessorIds()
     #resultPrint(db.getSpecifications)
     #resultPrint(db.getResourceClaims)
-
-    #claims = db.getResourceClaims()
-    #db.updateTaskAndResourceClaims(claims[0]['task_id'], starttime=claims[1]['starttime'], endtime=claims[1]['endtime'])
-    #print
-    #print db.getResourceClaims()
-
-    #resultPrint(db.getResourceClaims)
-
-
-    db.updateResourceAvailability(0, available_capacity=2)
-    exit(0)
-
-    import pprint
-    pprint.pprint(db.getTaskConflictReasons())
-    db.updateTask(21, task_status='conflict')
-    db.insertTaskConflicts(21, [1, 2, 3])
-    pprint.pprint(db.getTaskConflictReasons())
-    db.updateTask(21, task_status='scheduled')
-    pprint.pprint(db.getTaskConflictReasons())
-    db.insertTaskConflicts(21, [1, 2, 3])
-    pprint.pprint(db.getTaskConflictReasons())
-
-    pprint.pprint(db.getResourceClaimConflictReasons(task_ids=22))
-    #pprint.pprint(db.getResourceUsages())
-
-    exit(0)
-
-    for s in db.getSpecifications():
-        db.deleteSpecification(s['id'])
+    resultPrint(db.getResourceClaimProperties)
 
     resources = db.getResources()
 
-    #task_id = db.insertSpecificationAndTask(1234, 5678, 600, 0, datetime.utcnow(), datetime.utcnow() + timedelta(hours=1), "", False)['task_id']
-    #task = db.getTask(task_id)
-
-    #claim = {'resource_id':resources[0]['id'],
-            #'starttime':task['starttime'],
-            #'endtime':task['endtime'],
-            #'status':'claimed',
-            #'claim_size':1}
-    #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
-
-    #claim = {'resource_id':resources[1]['id'],
-            #'starttime':task['starttime'],
-            #'endtime':task['endtime'],
-            #'status':'claimed',
-            #'claim_size':1,
-            #'properties':[{'type':'nr_of_is_files', 'value':10},{'type':'nr_of_cs_files', 'value':20}]}
-    #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
-
-    #claim = {'resource_id':resources[2]['id'],
-            #'starttime':task['starttime'],
-            #'endtime':task['endtime'],
-            #'status':'claimed',
-            #'claim_size':1,
-            #'properties':[{'type':'nr_of_is_files', 'value':10, 'sap_nr':0 },
-                          #{'type':'nr_of_cs_files', 'value':20, 'sap_nr':0},
-                          #{'type':'nr_of_uv_files', 'value':30, 'sap_nr':1},]}
-    #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
-
-    #claim = {'resource_id':resources[3]['id'],
-            #'starttime':task['starttime'],
-            #'endtime':task['endtime'],
-            #'status':'claimed',
-            #'claim_size':1,
-            #'properties':[{'type':'nr_of_is_files', 'value':15 },
-                          #{'type':'nr_of_cs_files', 'value':25 },
-                          #{'type':'nr_of_is_files', 'value':10, 'sap_nr':0 },
-                          #{'type':'nr_of_cs_files', 'value':20, 'sap_nr':0},
-                          #{'type':'nr_of_uv_files', 'value':30, 'sap_nr':1},]}
-    #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
+    task_id = db.insertSpecificationAndTask(1234, 5678, 600, 0, datetime.utcnow(), datetime.utcnow() + timedelta(hours=1), "", False)['task_id']
+    task = db.getTask(task_id)
+
+    claim = {'resource_id':resources[0]['id'],
+            'starttime':task['starttime'],
+            'endtime':task['endtime'],
+            'status':'claimed',
+            'claim_size':1}
+    db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
+
+    claim = {'resource_id':resources[1]['id'],
+            'starttime':task['starttime'],
+            'endtime':task['endtime'],
+            'status':'claimed',
+            'claim_size':1,
+            'properties':[{'type':'nr_of_is_files', 'value':10},{'type':'nr_of_cs_files', 'value':20}]}
+    db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
+
+    claim = {'resource_id':resources[2]['id'],
+            'starttime':task['starttime'],
+            'endtime':task['endtime'],
+            'status':'claimed',
+            'claim_size':1,
+            'properties':[{'type':'nr_of_is_files', 'value':10, 'sap_nr':0 },
+                          {'type':'nr_of_cs_files', 'value':20, 'sap_nr':0},
+                          {'type':'nr_of_uv_files', 'value':30, 'sap_nr':1},]}
+    db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
+
+    claim = {'resource_id':resources[3]['id'],
+            'starttime':task['starttime'],
+            'endtime':task['endtime'],
+            'status':'claimed',
+            'claim_size':1,
+            'properties':[{'type':'nr_of_is_files', 'value':15 },
+                          {'type':'nr_of_cs_files', 'value':25 },
+                          {'type':'nr_of_is_files', 'value':10, 'sap_nr':0 },
+                          {'type':'nr_of_cs_files', 'value':20, 'sap_nr':0},
+                          {'type':'nr_of_uv_files', 'value':30, 'sap_nr':1},]}
+    db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False)
+
+    db.commit()
+    import pprint
+    pprint.pprint(db.getResourceClaims(include_properties=True))
+    print '\n'.join(str(x) for x in db.getResourceClaims(include_properties=True))
 
-    #db.commit()
-    #import pprint
-    #pprint.pprint(db.getResourceClaims(include_properties=True))
-    #print '\n'.join(str(x) for x in db.getResourceClaims(include_properties=True))
+    db.deleteSpecification(task['specification_id'])
+    exit()
 
 
     #c = db.cursor
diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql
index 47919fcdfa31b10631461d470ddad578bc7e6752..8c2ba9cfcaf08bc082d19cc560245431aa9e3962 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql
+++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql
@@ -8,6 +8,7 @@ INSERT INTO resource_allocation.task_status VALUES (200, 'prepared'), (300, 'app
 INSERT INTO resource_allocation.task_type VALUES (0, 'observation'),(1, 'pipeline'); -- We'll need more types
 INSERT INTO resource_allocation.resource_claim_status VALUES (0, 'claimed'), (1, 'allocated'), (2, 'conflict');
 INSERT INTO resource_allocation.resource_claim_property_type VALUES (0, 'nr_of_is_files'),(1, 'nr_of_cs_files'),(2, 'nr_of_uv_files'),(3, 'nr_of_im_files'),(4, 'nr_of_img_files'),(5, 'nr_of_pulp_files'),(6, 'nr_of_cs_stokes'),(7, 'nr_of_is_stokes'),(8, 'is_file_size'),(9, 'cs_file_size'),(10, 'uv_file_size'),(11, 'im_file_size'),(12, 'img_file_size'),(13, 'nr_of_pulp_files'),(14, 'nr_of_tabs');
+INSERT INTO resource_allocation.resource_claim_property_io_type VALUES (0, 'output'),(1, 'input');
 INSERT INTO resource_allocation.config VALUES (0, 'max_fill_percentage_cep4', '85.00'), (1, 'claim_timeout', '172800'), (2, 'min_inter_task_delay', '60'); -- Just some values 172800 is two days in seconds
 INSERT INTO resource_allocation.conflict_reason
 VALUES
diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql
index 5002a2e19c13d8db906f5acef3b7dc43f558c274..be6f730c23a8878340a83754540b4c6ede44e081 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql
+++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql
@@ -31,6 +31,7 @@ DROP TABLE IF EXISTS resource_monitoring.resource_availability CASCADE;
 DROP TABLE IF EXISTS resource_monitoring.resource_capacity CASCADE;
 DROP TABLE IF EXISTS resource_allocation.resource_claim_property CASCADE;
 DROP TABLE IF EXISTS resource_allocation.resource_claim_property_type CASCADE;
+DROP TABLE IF EXISTS resource_allocation.resource_claim_property_io_type CASCADE;
 DROP TABLE IF EXISTS resource_allocation.sap CASCADE;
 DROP TABLE IF EXISTS resource_allocation.conflict_reason CASCADE;
 DROP TABLE IF EXISTS resource_allocation.resource_claim_conflict_reason CASCADE;
@@ -242,11 +243,20 @@ CREATE TABLE resource_allocation.resource_claim_property_type (
 ALTER TABLE resource_allocation.resource_claim_property_type
   OWNER TO resourceassignment;
 
+CREATE TABLE resource_allocation.resource_claim_property_io_type (
+  id serial NOT NULL,
+  name text NOT NULL,
+  PRIMARY KEY (id)
+) WITH (OIDS=FALSE);
+ALTER TABLE resource_allocation.resource_claim_property_io_type
+  OWNER TO resourceassignment;
+
 CREATE TABLE resource_allocation.resource_claim_property (
   id serial NOT NULL,
   resource_claim_id integer NOT NULL REFERENCES resource_allocation.resource_claim ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE,
   sap_id integer REFERENCES resource_allocation.sap ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE,
   type_id integer NOT NULL REFERENCES resource_allocation.resource_claim_property_type DEFERRABLE INITIALLY IMMEDIATE,
+  io_type_id integer NOT NULL DEFAULT 0 REFERENCES resource_allocation.resource_claim_property_io_type DEFERRABLE INITIALLY IMMEDIATE,
   value bigint NOT NULL DEFAULT 1,
   PRIMARY KEY (id)
 ) WITH (OIDS=FALSE);
@@ -345,14 +355,16 @@ COMMENT ON VIEW resource_allocation.resource_claim_extended_view
   IS 'extended view on resource_claim table, including resource_claim_status.name and the resource itself';
 
 CREATE OR REPLACE VIEW resource_allocation.resource_claim_property_view AS
- SELECT rcp.id, rcp.resource_claim_id, rcp.value, rcp.type_id,
-    rcpt.name AS type_name, rcp.sap_id
+ SELECT rcp.id, rcp.resource_claim_id, rcp.value, rcp.sap_id,
+    rcp.type_id, rcpt.name AS type_name,
+    rcp.io_type_id, rcpiot.name AS io_type_name
    FROM resource_allocation.resource_claim_property rcp
-   JOIN resource_allocation.resource_claim_property_type rcpt ON rcpt.id = rcp.type_id;
+   JOIN resource_allocation.resource_claim_property_type rcpt ON rcpt.id = rcp.type_id
+   JOIN resource_allocation.resource_claim_property_io_type rcpiot ON rcpiot.id = rcp.io_type_id;
 ALTER VIEW resource_allocation.resource_claim_property_view
   OWNER TO resourceassignment;
 COMMENT ON VIEW resource_allocation.resource_claim_property_view
-  IS 'plain view on resource_claim_property table, including resource_claim_property_type.name';
+  IS 'plain view on resource_claim_property table, including resource_claim_property_type.name and resource_claim_property_io_type.name';
 
 CREATE OR REPLACE VIEW resource_monitoring.resource_view AS
   SELECT rv.*,