diff --git a/.gitattributes b/.gitattributes
index eb1a1acda2721c3aaddbedaee8c79571e8bd89e0..14b9c42f2b420af2c5e1c5a80f38d5ec53901a60 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -4248,15 +4248,12 @@ SAS/LSMR/src/lsmr/lsmrapp/migrations/0001_initial.py -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180705_0736.py -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt -text
 SAS/LSMR/src/lsmr/lsmrapp/migrations/__init__.py -text
-SAS/LSMR/src/lsmr/lsmrapp/models.py -text
 SAS/LSMR/src/lsmr/lsmrapp/models/CMakeLists.txt -text
 SAS/LSMR/src/lsmr/lsmrapp/models/__init__.py -text
 SAS/LSMR/src/lsmr/lsmrapp/models/specification.py -text
-SAS/LSMR/src/lsmr/lsmrapp/serializers.py -text
 SAS/LSMR/src/lsmr/lsmrapp/serializers/CMakeLists.txt -text
 SAS/LSMR/src/lsmr/lsmrapp/serializers/__init__.py -text
 SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py -text
-SAS/LSMR/src/lsmr/lsmrapp/viewsets.py -text
 SAS/LSMR/src/lsmr/lsmrapp/viewsets/CMakeLists.txt -text
 SAS/LSMR/src/lsmr/lsmrapp/viewsets/__init__.py -text
 SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py -text
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models.py b/SAS/LSMR/src/lsmr/lsmrapp/models.py
deleted file mode 100644
index a7c28a13ef263cb12eb5a7d230bc8647d473d029..0000000000000000000000000000000000000000
--- a/SAS/LSMR/src/lsmr/lsmrapp/models.py
+++ /dev/null
@@ -1,161 +0,0 @@
-"""
-This file contains the database models
-"""
-
-from django.db.models import Model, CharField, DateTimeField, BooleanField, ForeignKey, CASCADE, Field
-from django.contrib.postgres.fields import ArrayField, JSONField
-from django.contrib.postgres.indexes import GinIndex
-from enum import Enum
-
-
-#
-# Common
-#
-
-# abstract models
-
-class BasicCommon(Model):
-    # todo: we cannot use foreign keys in the array here, so we have to keep the Tags table up to date by trigger or so.
-    # todo: we could switch to a manytomany field instead?
-    tags = ArrayField(CharField(max_length=30), size=8, blank=True)
-    creation = DateTimeField(auto_now_add=True)
-    update = DateTimeField(auto_now=True)
-
-    class Meta:
-        abstract = True
-        indexes = [GinIndex(fields=['tags'])]
-
-
-class UserDefinedCommon(BasicCommon):
-    name = CharField(max_length=30)
-
-    class Meta:
-        abstract = True
-
-
-class SystemDefinedCommon(BasicCommon):
-
-    class Meta:
-        abstract = True
-
-
-# concrete models
-
-class Tags(Model):
-    # todo: figure out how to keep this in sync with tags columns (->BasicCommon)
-    # todo: Or remove this altogether without keeping track of tags?
-    title = CharField(max_length=30)
-    description = CharField(max_length=255)
-
-
-#
-# I/O
-#
-
-# enums
-
-class RoleChoice(Enum):
-    CORRELATOR = "correlator"
-    BEAMFORMER = "beamformer"
-    INSPECTION_PLOTS = "inspection plots"
-    CALIBRATOR = "calibrator"
-    TARGET = "target"
-    INPUT_OUTPUT = "input, output"
-
-
-class DatatypeChoice(Enum):
-    VISIBILITIES = "visibilities"
-    TIME_SERIES = "time series"
-    INSTRUMENT_MODEL = "instrument model"
-    IMAGE = "image"
-    QUALITY = "quality"
-
-
-class DataformatChoice(Enum):
-    MEASUREMENTSET = "MeasurementSet"
-    HDF5 = "HDF5"
-
-
-# todo: fix this!
-#class EnumField(Field):  # todo: Test if CharField works better e.g. for forms
-#    """
-#    Django does not support creating db enums, so we got to do that ourselves here
-#    """
-#    def __init__(self, *args, **kwargs):
-#        super(EnumField, self).__init__(*args, **kwargs)
-#
-#    def db_type(self, connection):
-#        return "enum(%s)" % ','.join("'%s'" % key for (key, _) in self.choices)
-# # todo: unfortunately this won't work for Postgres since a CREATE TYPE is required first...
-
-
-# concrete models
-
-class WorkIORoles(Model):
-    # todo: Choices do not translate to a Postgres ENUM type currently, but are only enforced on the Django level.
-    # todo: If we are not happy with this as is, I see two options:
-    # todo: 1. Wait to see if they implement that EnumField in the meantime (https://code.djangoproject.com/ticket/24342)
-    # todo: 2. Build this ourselves. I tried to achieve that with the EnumField above, but it won't be that easy, I guess
-    role = CharField(
-        max_length=30,
-        choices=[(item.name, item.value) for item in RoleChoice]
-    )
-    datatype = CharField(
-        max_length=30,
-        choices=[(item.name, item.value) for item in DatatypeChoice]
-    )
-    dataformat = ArrayField(CharField(
-        max_length=30,
-        choices=[(item.name, item.value) for item in DataformatChoice]
-    ), size=8, blank=True)
-    outputs = ForeignKey("WorkRequestTemplate", related_name='role_output', on_delete=CASCADE, null=True)
-    inputs = ForeignKey("WorkRequestTemplate", related_name='role_input', on_delete=CASCADE, null=True)
-
-
-#
-# Templates
-#
-
-# abstract models
-
-class Template(SystemDefinedCommon):
-    name = CharField(max_length=30)         # todo: check if this should go in SystemDefinedCommon or BasicCommon
-    description = CharField(max_length=255) # todo: check if this should go in SystemDefinedCommon or BasicCommon
-    default_version = BooleanField()
-    version = CharField(max_length=30)
-    schema = JSONField()
-
-    class Meta:
-        abstract = True
-        #unique_together = ("name", "default_version") # todo: We only want this for default_version=True, find a way to do so
-
-
-# concrete models
-
-class GeneratorTemplate(Template):
-    create_func = CharField(max_length=30)
-
-
-class RunTemplate(Template):
-    pass
-
-
-class WorkRequestTemplate(Template):
-    validation_code_js = CharField(max_length=30)
-    # outputs = ForeignKey("WorkIORoles", related_name='role_output', on_delete=CASCADE)     # todo: removed in latest draft, delete?
-    # inputs = ForeignKey("WorkIORoles", related_name='role_input', on_delete=CASCADE)       # todo: removed in latest draft, delete?
-
-
-class WorkRelationSelectionTemplate(Template):
-    pass
-
-
-
-
-#
-# Instance Objects
-#
-
-# todo: the blue stuff
-# run / work request / work request relation -> SystemDefinedCommon
-# others -> UserDefinedCommon
\ No newline at end of file
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py
index a7c28a13ef263cb12eb5a7d230bc8647d473d029..477e780ed128d1262eae8febe48956a5f007a627 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py
@@ -2,7 +2,7 @@
 This file contains the database models
 """
 
-from django.db.models import Model, CharField, DateTimeField, BooleanField, ForeignKey, CASCADE, Field
+from django.db.models import Model, CharField, DateTimeField, BooleanField, ForeignKey, CASCADE, IntegerField, SET_NULL
 from django.contrib.postgres.fields import ArrayField, JSONField
 from django.contrib.postgres.indexes import GinIndex
 from enum import Enum
@@ -150,12 +150,24 @@ class WorkRelationSelectionTemplate(Template):
     pass
 
 
-
-
 #
 # Instance Objects
 #
 
 # todo: the blue stuff
 # run / work request / work request relation -> SystemDefinedCommon
-# others -> UserDefinedCommon
\ No newline at end of file
+# others -> UserDefinedCommon
+class Cycle(UserDefinedCommon):
+    start = DateTimeField()
+
+
+class Project(UserDefinedCommon):
+    cycle = ForeignKey(Cycle, on_delete=CASCADE)
+    priority = IntegerField(default=0)  # todo: define a value for the default priority
+    can_trigger = BooleanField(default=False)
+    private_data = BooleanField(default=True)
+
+
+class RunSet(UserDefinedCommon):
+    generator_paramets_doc = JSONField()
+    generator_template = ForeignKey(GeneratorTemplate, on_delete=SET_NULL)
\ No newline at end of file
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers.py
deleted file mode 100644
index 9b70a05d1b004a7a08724f19c54df16d6b741b94..0000000000000000000000000000000000000000
--- a/SAS/LSMR/src/lsmr/lsmrapp/serializers.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-This file contains the serializers (for the elsewhere defined data models)
-"""
-
-from rest_framework import serializers
-from lsmr.lsmrapp import models
-
-
-class TagsSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = models.Tags
-        fields = '__all__'
-
-
-class GeneratorTemplateSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = models.GeneratorTemplate
-        fields = '__all__'
-
-
-class RunTemplateSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = models.RunTemplate
-        fields = '__all__'
-
-
-class WorkRequestTemplateSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = models.WorkRequestTemplate
-        fields = '__all__'
-
-
-class WorkRelationSelectionTemplateSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = models.WorkRelationSelectionTemplate
-        fields = '__all__'
-
-
-class WorkIORolesSerializer(serializers.HyperlinkedModelSerializer):
-    class Meta:
-        model = models.WorkIORoles
-        fields = '__all__'
-
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py
index 9b70a05d1b004a7a08724f19c54df16d6b741b94..2c7c550358c1e44e171d531de5b14e7b2af757cb 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/serializers/specification.py
@@ -41,3 +41,20 @@ class WorkIORolesSerializer(serializers.HyperlinkedModelSerializer):
         model = models.WorkIORoles
         fields = '__all__'
 
+
+class CycleSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = models.Cycle
+        fields = '__all__'
+
+
+class ProjectSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = models.Project
+        fields = '__all__'
+
+
+class RunSetSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = models.RunSet
+        fields = '__all__'
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py b/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py
deleted file mode 100644
index ce4aff6ec8c51d277246783ecfe2efc21a3bf23d..0000000000000000000000000000000000000000
--- a/SAS/LSMR/src/lsmr/lsmrapp/viewsets.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"""
-This file contains the viewsets (based on the elsewhere defined data models and serializers)
-"""
-
-from rest_framework import viewsets
-from lsmr.lsmrapp import models, serializers
-
-
-class TagsViewSet(viewsets.ModelViewSet):
-    queryset = models.Tags.objects.all()
-    serializer_class = serializers.TagsSerializer
-
-
-class GeneratorTemplateViewSet(viewsets.ModelViewSet):
-    queryset = models.GeneratorTemplate.objects.all()
-    serializer_class = serializers.GeneratorTemplateSerializer
-
-
-class RunTemplateViewSet(viewsets.ModelViewSet):
-    queryset = models.RunTemplate.objects.all()
-    serializer_class = serializers.RunTemplateSerializer
-
-
-class WorkRequestTemplateViewSet(viewsets.ModelViewSet):
-    queryset = models.WorkRequestTemplate.objects.all()
-    serializer_class = serializers.WorkRequestTemplateSerializer
-
-
-class WorkRelationSelectionTemplateViewSet(viewsets.ModelViewSet):
-    queryset = models.WorkRelationSelectionTemplate.objects.all()
-    serializer_class = serializers.WorkRelationSelectionTemplateSerializer
-
-
-class WorkIORolesViewSet(viewsets.ModelViewSet):
-    queryset = models.WorkIORoles.objects.all()
-    serializer_class = serializers.WorkIORolesSerializer
diff --git a/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py
index ce4aff6ec8c51d277246783ecfe2efc21a3bf23d..56d4e437124cde07c7564f6f8de0bb40064656e6 100644
--- a/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py
+++ b/SAS/LSMR/src/lsmr/lsmrapp/viewsets/specification.py
@@ -34,3 +34,19 @@ class WorkRelationSelectionTemplateViewSet(viewsets.ModelViewSet):
 class WorkIORolesViewSet(viewsets.ModelViewSet):
     queryset = models.WorkIORoles.objects.all()
     serializer_class = serializers.WorkIORolesSerializer
+
+
+class CycleViewSet(viewsets.ModelViewSet):
+    queryset = models.Cycle.objects.all()
+    serializer_class = serializers.CycleSerializer
+
+
+class ProjectViewSet(viewsets.ModelViewSet):
+    queryset = models.Project.objects.all()
+    serializer_class = serializers.ProjectSerializer
+
+
+class RunSetViewSet(viewsets.ModelViewSet):
+    queryset = models.RunSet.objects.all()
+    serializer_class = serializers.RunSetSerializer
+
diff --git a/SAS/LSMR/src/lsmr/urls.py b/SAS/LSMR/src/lsmr/urls.py
index 0522c96bdf3b3ef9b89f1d244b662d62c9cbf914..962a15368fe986e57883842a494729ef83b13575 100644
--- a/SAS/LSMR/src/lsmr/urls.py
+++ b/SAS/LSMR/src/lsmr/urls.py
@@ -42,5 +42,9 @@ router.register(r'run_template', viewsets.RunTemplateViewSet)
 router.register(r'work_request_template', viewsets.WorkRequestTemplateViewSet)
 router.register(r'work_relation_selection_template', viewsets.WorkRelationSelectionTemplateViewSet)
 router.register(r'work_io_roles', viewsets.WorkIORolesViewSet)
+router.register(r'cycle', viewsets.CycleViewSet)
+router.register(r'project', viewsets.ProjectViewSet)
+router.register(r'run_set', viewsets.RunSetViewSet)
+
 
 urlpatterns.extend(router.urls)