diff --git a/README.md b/README.md
index f21c5556cd807876a57700830608dd67513178be..3c0453fd2d4c19a3d78f6ef02b69403e7eb2eec9 100644
--- a/README.md
+++ b/README.md
@@ -31,13 +31,14 @@ Software Requirements
     apt-get install binutils-dev build-essential clang-3.4 cmake \
         g++-multilib gcc-multilib git grub-common grub-pc-bin    \
         llvm-3.3-dev llvm-3.3-runtime python-minimal python3     \
-        python3-lxml python3-pip qemu-system-x86 xorriso         \
+        python3-lxml python3-pyparsing python3-pip               \
+        qemu-system-x86 xorriso
 
     LLVM_CONFIG_PATH=/usr/bin/llvm-config-3.3 pip3 install llvmpy
 
 For the ARM version, you will  additionally need
 
-    gcc-arm-none-eabi gdb-arm-none-eabi
+    gcc-arm-none-eabi gdb-arm-none-eabi qemu-system-arm
 
 Building
 --------
diff --git a/app/bcc1/alarm1/CMakeLists.txt b/app/bcc1/alarm1/CMakeLists.txt
index db468ef7874175567eca4af41b8a2eb38b53dc53..d5a06fc9995a49d86bd6bc7bc9377109d753e550 100644
--- a/app/bcc1/alarm1/CMakeLists.txt
+++ b/app/bcc1/alarm1/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_alarm1a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm1b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_b.py
   LIBS libtest
   TEST_ISO
@@ -18,7 +18,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm1c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_c.py
   LIBS libtest
   TEST_ISO
@@ -27,7 +27,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm1d
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_d.py
   LIBS libtest
   TEST_ISO
@@ -36,7 +36,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm1e
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_e.py
   LIBS libtest
   TEST_ISO
@@ -46,7 +46,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm1f
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   # VERIFY verify_f.py
   LIBS libtest
   TEST_ISO
diff --git a/app/bcc1/alarm1/system.oil b/app/bcc1/alarm1/system.oil
new file mode 100644
index 0000000000000000000000000000000000000000..eeb47d9b5d9a05b3a2a8f3b43159466587b97aeb
--- /dev/null
+++ b/app/bcc1/alarm1/system.oil
@@ -0,0 +1,53 @@
+CPU TestSystem {
+
+    OS TestSystem {
+        STATUS = STANDARD;
+        ERRORHOOK = FALSE;
+        STARTUPHOOK = FALSE;
+        SHUTDOWNHOOK = FALSE;
+        PRETASKHOOK = FALSE;
+        POSTTASKHOOK = FALSE;
+    };
+
+    TASK H1 {
+        SCHEDULE = FULL;
+        PRIORITY = 5;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    TASK H2 {
+        SCHEDULE = FULL;
+        PRIORITY = 4;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    TASK H3 {
+        SCHEDULE = FULL;
+        PRIORITY = 3;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    ALARM A1 {
+        COUNTER = C1;
+        ACTION = ACTIVATETASK {
+            TASK = H2;
+        };
+        AUTOSTART = TRUE {
+            ALARMTIME = 100;
+            CYCLETIME = 100;
+        };
+    };
+
+
+    COUNTER C1 {
+        MAXALLOWEDVALUE = 1000;
+        TICKSPERBASE = 1;
+        MINCYCLE = 1;
+    };
+
+
+};
+
diff --git a/app/bcc1/alarm2/CMakeLists.txt b/app/bcc1/alarm2/CMakeLists.txt
index bd1e849b36ae63d4f7dfca929695b04762e56da7..d6740bd6b5387e9bbab3bbdec5f1b10ca07e0d7e 100644
--- a/app/bcc1/alarm2/CMakeLists.txt
+++ b/app/bcc1/alarm2/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_alarm2a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   TEST_ISO
   a.cc
@@ -8,7 +8,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm2b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   TEST_ISO
   b.cc
@@ -16,7 +16,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm2c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   TEST_ISO
   c.cc
diff --git a/app/bcc1/alarm3/CMakeLists.txt b/app/bcc1/alarm3/CMakeLists.txt
index 45cdaa993bf9158ed4c3bd8b2d9e7d1fa5d476ab..15b8011a3ca80cc04d2e5dd3df870297038cc9d2 100644
--- a/app/bcc1/alarm3/CMakeLists.txt
+++ b/app/bcc1/alarm3/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_alarm3a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm3b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_b.py
   LIBS libtest
   TEST_ISO
@@ -18,7 +18,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm3c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_c.py
   LIBS libtest
   TEST_ISO
@@ -27,7 +27,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm3d
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_d.py
   LIBS libtest
   TEST_ISO
@@ -36,7 +36,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_alarm3e
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_e.py
   LIBS libtest
   TEST_ISO
diff --git a/app/bcc1/complex1/CMakeLists.txt b/app/bcc1/complex1/CMakeLists.txt
index 3c381f3f46a44d51d813315305773b8cff5f19f4..6d8add57742146eaee4e1e4986c57012a5d99507 100644
--- a/app/bcc1/complex1/CMakeLists.txt
+++ b/app/bcc1/complex1/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_complex1a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_complex1b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_b.py
   LIBS libtest
   TEST_ISO
@@ -18,7 +18,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_complex1c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_c.py
   LIBS libtest
   TEST_ISO
@@ -27,7 +27,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_complex1d
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   TEST_ISO
   d.cc
diff --git a/app/bcc1/complex2/CMakeLists.txt b/app/bcc1/complex2/CMakeLists.txt
index 2591632b03a318915b71b9416d51287bc2a44413..b7df38da3c81e0bd12cf1b8e336907f76b74aec3 100644
--- a/app/bcc1/complex2/CMakeLists.txt
+++ b/app/bcc1/complex2/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_complex2a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
diff --git a/app/bcc1/hoffmann/CMakeLists.txt b/app/bcc1/hoffmann/CMakeLists.txt
index 8c979565f0c552d9005bfd3c076935e7bbe1613d..c68c03de5d78081df147423550e7b3754ff2b165 100644
--- a/app/bcc1/hoffmann/CMakeLists.txt
+++ b/app/bcc1/hoffmann/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME hoffmann_task1a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   a.cc
 )
 
diff --git a/app/bcc1/isr2/CMakeLists.txt b/app/bcc1/isr2/CMakeLists.txt
index 870c1053abe19dd0fc7cdfc8188cca59b6ada5c9..b024fc82160b2e46f413d070d86ef4128eb0c04a 100644
--- a/app/bcc1/isr2/CMakeLists.txt
+++ b/app/bcc1/isr2/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_isr2a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_isr2b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_b.py
   LIBS libtest
   TEST_ISO
@@ -18,7 +18,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_isr2c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_c.py
   LIBS libtest
   TEST_ISO
@@ -27,7 +27,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_isr2d
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_d.py
   LIBS libtest
   TEST_ISO
diff --git a/app/bcc1/isr2/system.oil b/app/bcc1/isr2/system.oil
new file mode 100644
index 0000000000000000000000000000000000000000..7674d3acf85e77ccffc89e11ce587d303e6d9fb1
--- /dev/null
+++ b/app/bcc1/isr2/system.oil
@@ -0,0 +1,40 @@
+CPU TestSystem {
+
+    OS TestSystem {
+        STATUS = STANDARD;
+        ERRORHOOK = FALSE;
+        STARTUPHOOK = FALSE;
+        SHUTDOWNHOOK = FALSE;
+        PRETASKHOOK = FALSE;
+        POSTTASKHOOK = FALSE;
+    };
+
+    TASK H1 {
+        SCHEDULE = FULL;
+        PRIORITY = 5;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    TASK H2 {
+        SCHEDULE = FULL;
+        PRIORITY = 4;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    TASK H3 {
+        SCHEDULE = FULL;
+        PRIORITY = 3;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    ISR ISR1 {
+        CATEGORY = 2;
+        PRIORITY = 10;
+        DEVICE = 37;
+    };
+
+};
+
diff --git a/app/bcc1/lukas/CMakeLists.txt b/app/bcc1/lukas/CMakeLists.txt
index f7638616b855015e3298dc0e82d242bbe2d2d281..3939ef7389c370f054e4a29da23960dbd318d862 100644
--- a/app/bcc1/lukas/CMakeLists.txt
+++ b/app/bcc1/lukas/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_lukas_dispatch
-  SYSTEM_XML dispatch.xml
+  SYSTEM_DESC dispatch.xml
   LIBS libtest
   TEST_ISO
   dispatch.cc
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_lukas_alarmstress
-  SYSTEM_XML alarmstress.xml
+  SYSTEM_DESC alarmstress.xml
   LIBS libtest
   TEST_ISO
   alarmstress.cc
@@ -17,7 +17,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_lukas_isr2
-  SYSTEM_XML isr2.xml
+  SYSTEM_DESC isr2.xml
   LIBS libtest
   TEST_ISO
   isr2.cc
diff --git a/app/bcc1/resource1/CMakeLists.txt b/app/bcc1/resource1/CMakeLists.txt
index aaa16070bdf045f26c20c099deed0070fdf0427e..889794b76b7c000c17ac0db0047128204b6f6ec1 100644
--- a/app/bcc1/resource1/CMakeLists.txt
+++ b/app/bcc1/resource1/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_resource1a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_a.py
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_b.py
   TEST_ISO
@@ -18,7 +18,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_a.py # Same constraints as A
   TEST_ISO
@@ -27,7 +27,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1d
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_d.py
   TEST_ISO
@@ -36,7 +36,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1e
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_e.py
   TEST_ISO
@@ -45,7 +45,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1f
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_f.py
   TEST_ISO
@@ -55,7 +55,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1g
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_g.py
   TEST_ISO
@@ -64,7 +64,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1h
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_h.py
   TEST_ISO
@@ -73,7 +73,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1j
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   #VERIFY verify_j.py
   TEST_ISO
@@ -82,7 +82,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource1k
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_k.py
   TEST_ISO
diff --git a/app/bcc1/resource1/system.oil b/app/bcc1/resource1/system.oil
new file mode 100644
index 0000000000000000000000000000000000000000..b2fda36b6e760b08bb0b8750e4499075487d7b3f
--- /dev/null
+++ b/app/bcc1/resource1/system.oil
@@ -0,0 +1,67 @@
+
+CPU TestSystem {
+    OS TestSystem {
+        STATUS = STANDARD;
+        ERRORHOOK = FALSE;
+        STARTUPHOOK = FALSE;
+        SHUTDOWNHOOK = FALSE;
+        PRETASKHOOK = FALSE;
+        POSTTASKHOOK = FALSE;
+        USERESSCHEDULER = TRUE;
+    };
+
+    TASK H1 {
+        SCHEDULE = FULL;
+        PRIORITY = 5;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    TASK H2 {
+        SCHEDULE = FULL;
+        PRIORITY = 4;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+        RESOURCE = R234;
+    };
+
+    TASK H3 {
+        SCHEDULE = FULL;
+        PRIORITY = 3;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+        RESOURCE = R234;
+        RESOURCE = R345;
+    };
+
+    TASK H4 {
+        SCHEDULE = FULL;
+        PRIORITY = 2;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+        RESOURCE = R234;
+        RESOURCE = R345;
+    };
+
+    TASK H5 {
+        SCHEDULE = FULL;
+        PRIORITY = 1;
+        ACTIVATION = 1;
+        AUTOSTART = TRUE {
+            APPMODE = OSDEFAULTAPPMODE;
+        };
+        RESOURCE = R345;
+    };
+
+    APPMODE OSDEFAULTAPPMODE;
+
+    RESOURCE R234 {
+        RESOURCEPROPERTY = STANDARD;
+    };
+
+    RESOURCE R345 {
+        RESOURCEPROPERTY = STANDARD;
+    };
+
+
+};
diff --git a/app/bcc1/resource2/CMakeLists.txt b/app/bcc1/resource2/CMakeLists.txt
index 7169869a7704bb474cf7b098db2ff4bfc7e35d2b..5886013de8f779eedf65b9ebfea9f93a46bf1960 100644
--- a/app/bcc1/resource2/CMakeLists.txt
+++ b/app/bcc1/resource2/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_resource2a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_resource2b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_b.py
   LIBS libtest
   TEST_ISO
diff --git a/app/bcc1/sse1/CMakeLists.txt b/app/bcc1/sse1/CMakeLists.txt
index b76b18b87d8601ae6d059388be98df447665748c..81d67647e45f70c8e57d45440c43424df035e644 100644
--- a/app/bcc1/sse1/CMakeLists.txt
+++ b/app/bcc1/sse1/CMakeLists.txt
@@ -2,7 +2,7 @@
 
 DOSEK_BINARY(
   NAME bcc1_sse1a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_a.py
   TEST_ISO
@@ -11,7 +11,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_sse1b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_b.py
   TEST_ISO
@@ -21,7 +21,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_sse1c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   LIBS libtest
   VERIFY verify_c.py
   TEST_ISO
diff --git a/app/bcc1/task1/CMakeLists.txt b/app/bcc1/task1/CMakeLists.txt
index 90af46325c81d70dc41b10d21cb98f48195c5483..6259f5acc56de1e103c3d266ad9585b33ee3ef68 100644
--- a/app/bcc1/task1/CMakeLists.txt
+++ b/app/bcc1/task1/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_task1a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.oil
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task1a_sse
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   GENERATOR_ARGS -fgen-asserts -fsse
@@ -19,7 +19,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task1b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_b.py
   LIBS libtest
   TEST_ISO
@@ -28,7 +28,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task1c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_c.py
   LIBS libtest
   TEST_ISO
@@ -37,7 +37,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task1d
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_d.py
   LIBS libtest
   TEST_ISO
@@ -46,7 +46,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task1e
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_e.py
   LIBS libtest
   TEST_ISO
@@ -55,7 +55,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task1f
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_f.py
   LIBS libtest
   TEST_ISO
@@ -64,7 +64,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task1g
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_g.py
   LIBS libtest
   TEST_ISO
diff --git a/app/bcc1/task1/system.oil b/app/bcc1/task1/system.oil
new file mode 100644
index 0000000000000000000000000000000000000000..762091f4bcfab812999901ae2af27602fd06e4a6
--- /dev/null
+++ b/app/bcc1/task1/system.oil
@@ -0,0 +1,35 @@
+CPU TestSystem {
+
+    OS TestSystem {
+        STATUS = STANDARD;
+        ERRORHOOK = FALSE;
+        STARTUPHOOK = FALSE;
+        SHUTDOWNHOOK = FALSE;
+        PRETASKHOOK = FALSE;
+        POSTTASKHOOK = FALSE;
+    };
+
+    TASK Handler11 {
+        SCHEDULE = FULL;
+        PRIORITY = 4;
+        ACTIVATION = 1;
+        AUTOSTART = TRUE;
+    };
+
+    TASK Handler12 {
+        SCHEDULE = FULL;
+        PRIORITY = 3;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+    TASK Handler13 {
+        SCHEDULE = FULL;
+        PRIORITY = 5;
+        ACTIVATION = 1;
+        AUTOSTART = FALSE;
+    };
+
+
+};
+
diff --git a/app/bcc1/task2/CMakeLists.txt b/app/bcc1/task2/CMakeLists.txt
index c211f1f754e2173e8f2798d26b3897efe14bff98..9350f597a31a27b564d4a8a3692df47e65002e35 100644
--- a/app/bcc1/task2/CMakeLists.txt
+++ b/app/bcc1/task2/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bcc1_task2a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task2b
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_b.py
   LIBS libtest
   TEST_ISO
@@ -18,7 +18,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME bcc1_task2c
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
diff --git a/app/benchmark/CMakeLists.txt b/app/benchmark/CMakeLists.txt
index 3551dc8864b17ea13786d33382e8a908a7f5a7c3..acf20988f531f04692b5fe917414f30b24db24da 100644
--- a/app/benchmark/CMakeLists.txt
+++ b/app/benchmark/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bench-task1a
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   FAIL
   a.cc
 )
diff --git a/app/benchmark/complex1/CMakeLists.txt b/app/benchmark/complex1/CMakeLists.txt
index a0bf876151e6f24b0a215237fd1826af7c9df18d..832e37cbe2b169f6d692ae8389abe2a7bc92d1bb 100644
--- a/app/benchmark/complex1/CMakeLists.txt
+++ b/app/benchmark/complex1/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bench-complex1d
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   FAIL
   d.cc
 )
diff --git a/app/benchmark/coptermock/CMakeLists.txt b/app/benchmark/coptermock/CMakeLists.txt
index 13a4ff6e4c5463419a78d07d3b6cdc7498e07b11..8c4d92392c24ad70a25d7904f2d12865f4fae845 100644
--- a/app/benchmark/coptermock/CMakeLists.txt
+++ b/app/benchmark/coptermock/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME bench-coptermock
-  SYSTEM_XML system.xml
+  SYSTEM_DESC system.xml
   FAIL
   dosek.cc
 )
@@ -8,6 +8,6 @@ DOSEK_BINARY(
 ## Should result in 1579971 system states for SSE
 #DOSEK_BINARY(
 #  NAME bench-coptermock-no-annotation
-#  SYSTEM_XML system-no-annotation.xml
+#  SYSTEM_DESC system-no-annotation.xml
 #  dosek.cc
 #)
diff --git a/app/sysmodel/1alarm/CMakeLists.txt b/app/sysmodel/1alarm/CMakeLists.txt
index b61d57152cd373d29436f0958c083c7554a4b5eb..bb1ca7d5bf383de34f5e864f00304db7c1b093c5 100644
--- a/app/sysmodel/1alarm/CMakeLists.txt
+++ b/app/sysmodel/1alarm/CMakeLists.txt
@@ -1,6 +1,6 @@
 DOSEK_BINARY(
   NAME sysmodel_1alarm_a
-  SYSTEM_XML a.xml
+  SYSTEM_DESC a.xml
   VERIFY verify_a.py
   LIBS libtest
   TEST_ISO
@@ -9,7 +9,7 @@ DOSEK_BINARY(
 
 DOSEK_BINARY(
   NAME sysmodel_1alarm_aa
-  SYSTEM_XML aa.xml # OTHER XML!
+  SYSTEM_DESC aa.xml # OTHER XML!
   VERIFY verify_aa.py
   LIBS libtest
   TEST_ISO
diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt
index 1f720d61d74ae1750d0f45eed413ef89e5ff437a..5afbc690d71f1615014c10933c411d74f1bd6e46 100644
--- a/generator/CMakeLists.txt
+++ b/generator/CMakeLists.txt
@@ -1,6 +1,6 @@
 
 set(PYTHON_MODULES_TEST
-  SystemDescription
+  RTSCSystemDescription
   RTSCAnalysis
 )
 
diff --git a/generator/OILSystemDescription.py b/generator/OILSystemDescription.py
new file mode 100755
index 0000000000000000000000000000000000000000..69453c1774618bce1a2d907a4e79c8532b881106
--- /dev/null
+++ b/generator/OILSystemDescription.py
@@ -0,0 +1,498 @@
+#!/usr/bin/env python3
+"""Parse OIL (OSEK Implementation Language) files.
+   see: http://portal.osek-vdx.org/files/pdf/specs/oil25.pdf
+"""
+from pyparsing import (Word, alphanums, alphas, hexnums,
+        nums, Optional, Keyword, QuotedString, Suppress,
+        Group, Forward, ZeroOrMore, cStyleComment, restOfLine)
+
+""" This is an example oil description:
+CPU Josek_x86 {
+        OS JOSEK {
+                USEPARAMETERACCESS = FALSE;
+                STATUS = STANDARD;
+                USERESSCHEDULER = FALSE;
+                USEGETSERVICEID = FALSE;
+                POSTTASKHOOK = TRUE;
+                STARTUPHOOK = TRUE;
+                PRETASKHOOK = TRUE;
+        };
+
+        TASK task1 {
+                AUTOSTART = TRUE {
+                        APPMODE = OSDEFAULTAPPMODE;
+                };
+                ACTIVATION = 1;
+                PRIORITY = 1;
+                SCHEDULE = NON;
+        };
+
+        APPMODE OSDEFAULTAPPMODE { };
+
+        APPMODE OSDEFAULTAPPMODE { };
+
+};
+"""
+
+class OILObject:
+
+    def __init__(self, name=""):
+        self.name = name
+
+    def evaluate(self, oil):
+        self.name = oil[0][1]
+        for param in oil[1]:
+            if hasattr(self, param[0]):
+                setattr(self, param[0], param[1])
+
+    def __str__(self):
+        ret = self.__class__.__name__ + " : " + self.name
+        for k,v in vars(self).items():
+            if k.isupper():  # if it it a uppercase OIL Keyword
+                # lowercase members are special sets or lists
+                ret += "\n\t\t" + str(k) + ": " + str(v)
+        return ret
+
+class AppMode(OILObject):
+
+    def __init__(self, name=""):
+        super(AppMode, self).__init__(name)
+
+
+class Resource(OILObject):
+
+    def __init__(self, name=""):
+        super(Resource, self).__init__(name)
+        self.RESOURCEPROPERTY = ""
+        self.tasks = dict()
+
+    def __str__(self):
+        ret = super(Resource, self).__str__()
+        if self.tasks:
+            ret += "\n\t\tUsed by task(s): " + str(self.tasks)
+        return ret
+
+
+class ISR(OILObject):
+
+    def __init__(self, name=""):
+        super(ISR, self).__init__(name)
+        self.CATEGORY = ""
+        self.PRIORITY = -1
+        self.resources = dict()
+        self.messages = dict()
+        self.DEVICE = None
+
+    def get_device(self):
+        assert self.DEVICE, "No device number set for ISR '" + self.name + "'"
+        return self.DEVICE
+
+    device = property(get_device, None, None, "Returns the ISRs device number")
+
+    def evaluate(self, oil):
+        super(ISR, self).evaluate(oil)
+        for param in oil[1]:
+            if param[0] == "RESOURCE":
+                self.resources[param[1]] = param[1]
+
+
+    def __str__(self):
+        ret = super(ISR, self).__str__()
+        if self.resources:
+            ret += "\n\t\tUses resource(s)" + str(self.resources)
+        return ret
+
+
+class Event(OILObject):
+
+    def __init__(self, name=""):
+        super(Event, self).__init__(name)
+        self.MASK = ""
+
+
+class Counter(OILObject):
+
+    def __init__(self, name=""):
+        super(Counter, self).__init__(name)
+        self.MAXALLOWEDVALUE = ""
+        self.TICKSPERBASE = ""
+        self.MINCYCLE = ""
+
+
+class Alarm(OILObject):
+
+    class ActionParam:
+        def __str__(self):
+            ret = self.__class__.__name__
+            for k,v in vars(self).items():
+                if k.isupper():
+                    ret += "\n\t\t\t" + str(k) + ": " + str(v)
+            return ret
+
+    class ACTIVATETASK(ActionParam):
+        def __init__(self, task=""):
+            self.TASK = task
+
+    class SETEVENT(ActionParam):
+        def __init__(self, task="", event=""):
+            self.TASK = task
+            self.EVENT = event
+
+    class ALARMCALLBACK(ActionParam):
+        def __init__(self, cb=""):
+            self.ALARMCALLBACKNAME = cb
+
+    class AutostartParams(ActionParam):
+        def __init__(self):
+            self.ALARMTIME = 0
+            self.CYCLETIME = 0
+            self.APPMODE = set()
+
+    def __init__(self, name=""):
+        super(Alarm, self).__init__(name)
+        self.COUNTER = ""
+        self.ACTION = ""
+        self.action_params = ""
+        self.AUTOSTART = ""
+        self.autostart_params = None
+
+    def evaluate(self, oil):
+        super(Alarm, self).evaluate(oil)
+        ''' read out alarm actions '''
+        for param in oil[1]:
+            if param[0] == "ACTION" and len(param) > 2:
+               if param[1] == "SETEVENT":
+                   self.action_params = self.SETEVENT()
+               elif param[1] == "ACTIVATETASK":
+                   self.action_params = self.ACTIVATETASK()
+               elif param[1] == "ALARMCALLBACK":
+                   self.action_params = self.ALARMCALLBACK()
+
+               for acp in param[2:]:
+                         if hasattr(self.action_params, acp[0]):
+                             setattr(self.action_params, acp[0], acp[1])
+            ''' read out autostart parameters '''
+            if param[0] == "AUTOSTART" and len(param) > 2 and param[1] == True:
+               self.autostart_params = self.AutostartParams()
+               for acp in param[2:]:
+                   if acp[0] == "ALARMTIME":
+                       self.autostart_params.ALARMTIME = int(acp[1])
+                   elif acp[0] == "CYCLETIME":
+                       self.autostart_params.CYCLETIME = int(acp[1])
+                   elif acp[0] == "APPMODE":
+                       self.autostart_params.APPMODE.add(acp[1])
+
+    @property
+    def counter(self):
+        return self.COUNTER.name
+
+    @property
+    def event(self):
+        return None
+
+    @property
+    def armed(self):
+        return self.AUTOSTART
+
+    @property
+    def cycletime(self):
+        return self.autostart_params.CYCLETIME
+
+    @property
+    def reltime(self):
+        return self.autostart_params.ALARMTIME
+
+    def activated_task(self):
+        if self.action_params.TASK:
+            return self.action_params.TASK.name
+        else:
+            return None
+
+
+    def __str__(self):
+        ret = super(Alarm, self).__str__()
+        ret += "\n\t\tAction Params: " + str(self.action_params)
+        if self.autostart_params:
+            ret += "\n\t\tAutostart Params: " + str(self.autostart_params)
+        return ret
+
+
+class Task(OILObject):
+
+    def __init__(self, name=""):
+        super(Task, self).__init__(name)
+        self.AUTOSTART = False
+        self.autostart_appmodes = dict()
+        self.ACTIVATION = 0
+        self.PRIORITY = 0
+        self.SCHEDULE = "NON"
+        self.resources = dict()
+
+    def evaluate(self, oil):
+        super(Task, self).evaluate(oil)
+
+        ''' read out appmodes for autostart '''
+        for param in oil[1]:
+            if param[0] == "AUTOSTART":
+                if len(param) > 2 and param[1] == "TRUE":
+                    ''' if AUTOSTART = TRUE, there should be appmodes to start in '''
+                    for appmode in param[2:]:
+                        if appmode[0] == "APPMODE":
+                            self.autostart_appmodes[appmode[1]] = appmode[1]
+            if param[0] == "RESOURCE":
+                self.resources[param[1]] = param[1];
+    @property
+    def is_autostarted(self):
+        return self.AUTOSTART
+
+    @property
+    def preemptable(self):
+        return self.SCHEDULE.upper() == "FULL"
+
+    @property
+    def max_activations(self):
+        return self.ACTIVATION
+
+    @property
+    def autostart(self):
+        return self.AUTOSTART
+
+    @property
+    def priority(self):
+        return self.PRIORITY
+
+    def __str__(self):
+        ret = super(Task, self).__str__()
+        if self.AUTOSTART:
+            ret += "\n\t\tAUTOSTART APPMODES: " + str(self.autostart_appmodes)
+        if len(self.resources) > 0:
+            ret += "\n\t\tRESOURCES: " + str(self.resources)
+        return ret
+
+
+class OS(OILObject):
+
+    def __init__(self, name=""):
+        super(OS, self).__init__(name)
+        self.name = name
+        self.USEPARAMETERACCESS = False
+        self.STATUS = "STANDARD"
+        self.USERESSCHEDULER = False
+        self.USEGETSERVICEID = False
+        self.POSTTASKHOOK = False
+        self.STARTUPHOOK = False
+        self.PRETASKHOOK = False
+
+
+class CPU:
+
+    def __init__(self, name=""):
+        self.name = name
+        self.description = ""
+        self.os = OS()
+        self.tasks = dict()
+        self.appmodes = dict()
+        self.resources = dict()
+        self.counters = dict()
+        self.events = dict()
+        self.isrs = dict()
+
+    def evaluate(self, oil):
+        self.name = oil[1]
+
+    def interconnect(self):
+        for task in self.tasks.values():
+            #  Interconnect resources
+            new_taskresources = dict()
+            for tres in task.resources:
+                assert tres in self.resources, "Resource '" + tres + "' used by Task '" + task.name + "' not found"
+                new_taskresources[tres] = self.resources[tres]
+                self.resources[tres].tasks[task.name] = task
+            task.resources = new_taskresources
+
+            #  Interconnect appmodes
+            new_appmodes = dict()
+            for tappm in task.autostart_appmodes:
+                assert tappm in self.appmodes, "Appmode '" + tappm + "' used by Task '" + task.name + "' not found"
+                new_appmodes[tappm] = self.appmodes[tappm]
+            task.autostart_appmodes = new_appmodes
+
+        for alarm in self.alarms.values():
+            # Interconnect alarm counters
+            assert alarm.COUNTER in self.counters, "Counter '" + alarm.COUNTER + "' used by Alarm '" + alarm.name + "' not found"
+            alarm.COUNTER = self.counters[alarm.COUNTER]
+
+            if alarm.ACTION == "SETEVENT":
+                assert isinstance(alarm.action_params, Alarm.SETEVENT), "Alarm action parameter mismatch"
+                altask = alarm.action_params.TASK
+                alevent = alarm.action_params.EVENT
+                assert altask in self.tasks, "Alarm action task '" + altask + "' not found"
+                assert alevent in self.events, "Alarm action event '" + alevent + "' not found"
+                alarm.action_params.TASK = self.tasks[altask]
+                alarm.action_params.EVENT = self.events[alevent]
+            elif alarm.ACTION == "ACTIVATETASK":
+                assert isinstance(alarm.action_params, Alarm.ACTIVATETASK), "Alarm action parameter mismatch"
+                altask = alarm.action_params.TASK
+                assert altask in self.tasks, "Alarm action task '" + altask + "' not found"
+                alarm.action_params.TASK = self.tasks[altask]
+            elif alarm.ACTION == "ALARMCALLBACK":
+                assert isinstance(alarm.action_params, Alarm.ALARMCALLBACK), "Alarm action parameter mismatch"
+                # intentionally left blank, there is no callback object defined in oil
+
+            if alarm.autostart_params:
+                new_appmodes = dict()
+                for appm in alarm.autostart_params.APPMODE:
+                    assert appm in self.appmodes, "Appmode '" + appm + "' used by Alarm '" + alarm.name + "' not found"
+                    new_appmodes[appm] = self.appmodes[appm]
+                alarm.autostart_params.APPMODE = new_appmodes
+
+        for isr in self.isrs.values():
+            new_isrresources = dict()
+            for isrres in isr.resources:
+                assert isrres in self.resources, "ISR uses undefined resource '" + isrres + "'"
+                new_isrresources[isrres] = self.resources[isrres]
+            isr.resources = new_isrresources
+
+
+    def __str__(self):
+        ret = "CPU " + self.name + "\n\t" + str(self.os)
+        for x in [obj.values() for obj in [self.tasks, self.appmodes, self.resources, self.counters, self.alarms, self.events, self.isrs]]:
+          for xi in x:
+            ret += "\n\t" + str(xi)
+
+        return ret
+
+
+class OILSystemDescription:
+
+    """  This is the pyparsing OIL syntax description  """
+    name = Word(alphas+"_", alphanums + "_")  # Only Alphas as starting character
+    hexnumber = ("0x" + Word(hexnums)).setParseAction(lambda t : int("".join(t),16))
+    decnumber = (Optional("-") + Word(nums)).setParseAction(lambda t : int("".join(t)))
+    number = hexnumber ^ decnumber
+    boolean = (Keyword("TRUE") | Keyword("FALSE")).setParseAction(lambda t : True if t[0] == "TRUE" else False)
+    oilstring = QuotedString('"')
+
+    description = Optional(Suppress(":") + oilstring)
+    semi = Suppress(";")
+    ob = Suppress("{")
+    cb = Suppress("}")
+
+    oobject = Keyword("OS") ^ Keyword("TASK") ^ Keyword("COUNTER") ^ Keyword("ALARM") \
+        ^ Keyword("RESOURCE") ^ Keyword("EVENT") ^ Keyword("ISR") ^ Keyword("MESSAGE") \
+        ^ Keyword("COM") ^ Keyword("NM") ^ Keyword("APPMODE") ^ Keyword("IPDU")
+    object_name = Group(oobject + name)  # e.g., OS myOs, COUNTER mycounter
+
+    attribute_name = name ^ oobject
+    attribute_value = boolean ^ name ^ oilstring ^ number #  longest match wins 'TRUEtask' wins against 'TRUE'
+    parameter_list = Forward()  # Forward declaration...
+    parameter_decl = attribute_name + Suppress("=") + attribute_value
+    parameter = Group(parameter_decl + description("parameter_description")
+                      + Optional(ob + parameter_list + cb) + semi)
+
+    parameter_list << (ZeroOrMore(parameter))
+
+    object_definiton = object_name + description + semi ^ object_name + ob \
+        + Group(Optional(parameter_list)) + cb + description + semi
+
+    object_definiton_list = ZeroOrMore(Group(object_definiton))
+
+    oil_def = Group("CPU" + name("cpu_name")) + ob + object_definiton_list("cpu_objects") \
+        + cb + description + semi
+
+    singleLineComment = "//" + restOfLine
+    oil_def.ignore(singleLineComment)  # Ignore // comments until end of line
+    oil_def.ignore(cStyleComment)  # Ignore /* */ comments
+
+
+    def __init__(self, oilfile):
+        self.oil = self.oil_def.parseFile(oilfile)
+        print("evaluating: " + oilfile)
+        self.refined = self.refine(self.oil)
+
+    def refine(self, oil):
+        ''' Read out parsed oil file '''
+        cpu = CPU()
+        os = OS()
+        tasks = dict()
+        appmodes = dict()
+        resources = dict()
+        counters = dict()
+        alarms = dict()
+        events = dict()
+        isrs = dict()
+        #  Read out CPU
+        for x in oil:
+            if x[0] == "CPU":
+                cpu.evaluate(x)
+            elif x[0][0] == "OS":
+                os.evaluate(x)
+            elif x[0][0] == "TASK":
+                task = Task()
+                task.evaluate(x)
+                tasks[task.name] = task
+            elif x[0][0] == "APPMODE":
+                appmode = AppMode(x[0][1])
+                appmodes[appmode.name] = appmode
+            elif x[0][0] == "RESOURCE":
+                resource = Resource()
+                resource.evaluate(x)
+                resources[resource.name] = resource
+            elif x[0][0] == "COUNTER":
+                counter = Counter()
+                counter.evaluate(x)
+                counters[counter.name] = counter
+            elif x[0][0] == "ALARM":
+                alarm = Alarm()
+                alarm.evaluate(x)
+                alarms[alarm.name] = alarm
+            elif x[0][0] == "EVENT" :
+                event = Event()
+                event.evaluate(x)
+                events[event.name] = event
+            elif x[0][0] == "ISR" :
+                isr = ISR()
+                isr.evaluate(x)
+                isrs[isr.name] = isr
+
+
+        cpu.os = os
+        cpu.tasks = tasks
+        cpu.appmodes = appmodes
+        cpu.resources = resources
+        cpu.counters = counters
+        cpu.alarms = alarms
+        cpu.events = events
+        cpu.isrs = isrs
+
+        cpu.interconnect()
+        return cpu
+
+
+    def getOS(self):
+        return self.refined.os
+
+    def getTasks(self):
+        return self.refined.tasks.values()
+
+    def getCounters(self):
+        return self.refined.counters.values()
+
+    def getAlarms(self):
+        return self.refined.alarms.values()
+
+    def getResources(self):
+        return self.refined.resources.values()
+
+    def getISRs(self):
+        return self.refined.isrs.values()
+
+
+    def __str__(self):
+        return str(self.refined)
+
+if __name__ == "__main__":
+    oil = OILSystemDescription('test/example.oil')
+    print(oil)
+
+
diff --git a/generator/SystemDescription.py b/generator/RTSCSystemDescription.py
similarity index 98%
rename from generator/SystemDescription.py
rename to generator/RTSCSystemDescription.py
index 03242ba760e7f715686030f566fad13e94d236b4..761b88439ad69c2fdd9e2b0bf113089746fc208e 100644
--- a/generator/SystemDescription.py
+++ b/generator/RTSCSystemDescription.py
@@ -3,7 +3,7 @@ import os
 from collections import namedtuple
 
 
-class SystemDescription:
+class RTSCSystemDescription:
     """The system description represents the system.xml, that describes
     the elements within the application (tasks, alarms, etc...). 
 
@@ -191,9 +191,9 @@ class SystemDescription:
 ################################################################
 import unittest
 
-class TestSystemDescription(unittest.TestCase):
+class TestRTSCSystemDescription(unittest.TestCase):
     def setUp(self):
-        self.desc = SystemDescription("test/system.xml")
+        self.desc = RTSCSystemDescription("test/system.xml")
     def test_osek_attributes(self):
         self.assertEqual(self.desc.getName(), "TestSystem")
         self.assertFalse(self.desc.isExtended())
diff --git a/generator/graph/SystemGraph.py b/generator/graph/SystemGraph.py
index fafe1feada8c9bd313169f95970b0a20db238302..c3a0fd2c2c27740b294ef8c8584798d7a4ab1d13 100644
--- a/generator/graph/SystemGraph.py
+++ b/generator/graph/SystemGraph.py
@@ -8,6 +8,7 @@ from generator.graph.Sporadic import Alarm, ISR
 from generator.graph.Resource import Resource
 from generator.graph.common import GraphObject
 from generator.statistics import Statistics
+from collections import namedtuple
 
 
 class SystemGraph(GraphObject, PassManager):
@@ -93,8 +94,107 @@ class SystemGraph(GraphObject, PassManager):
         """The scheduler priority is higher than the highest task"""
         return max([x.static_priority for x in self.get_subtasks()]) + 1
 
-    def read_system_description(self, system):
-        """Reads in the system description and builds the tasks and subtask
+
+    def read_oil_system_description(self, system):
+        """Reads in the system description out of an OIL file and builds the tasks and subtask
+        objects and connects them"""
+        maxprio = 0  #  Maximum task prio according to OIL file
+        for task_desc in system.getTasks():
+            taskname = task_desc.name
+            task = Task(self, "Task:" + taskname)
+            self.tasks.append(task)
+            self.stats.add_child(self, "task", task)
+            subtask = Subtask(self, taskname, "OSEKOS_TASK_" + taskname)
+            # Every subtask belongs to a task
+            task.add_subtask(subtask)
+            # Every subtask is also a function
+            self.functions[subtask.function_name] = subtask
+            self.stats.add_child(task, "subtask", subtask)
+            assert task_desc.priority != 0, \
+                    "No user thread can have the priority 0, reserved for the idle thread"
+            subtask.set_static_priority(task_desc.priority)
+
+            if task_desc.priority > maxprio:
+                maxprio = task_desc.priority
+
+            subtask.set_preemptable(task_desc.preemptable)
+            subtask.set_basic_task(True)
+            subtask.set_max_activations(task_desc.max_activations)
+            subtask.set_autostart(task_desc.autostart)
+            subtask.set_is_isr(False)
+            self.stats.add_data(subtask, "is_isr", False, scalar = True)
+
+        #  ISR
+        isr_prio = maxprio + 1  # ISR get priorities above maximum task prio
+        for isr_desc in system.getISRs():
+            task = Task(self, "ISRTask:" + isr_desc.name)
+            self.tasks.append(task)
+            self.stats.add_child(self, "task", task)
+            subtask = Subtask(self, isr_desc.name, "OSEKOS_ISR_" + isr_desc.name)
+            task.add_subtask(subtask)
+            self.functions[subtask.function_name] = subtask
+            self.stats.add_child(task, "subtask", subtask)
+
+            prio = isr_desc.PRIORITY
+            if prio == -1:
+                prio = isr_prio
+                isr_prio = isr_prio + 1 # increment isr prio
+
+            subtask.set_static_priority(prio)
+
+            # Assumption: Our subtasks are non-preemptable basic-tasks
+            subtask.set_preemptable(False)
+            subtask.set_basic_task(True)
+            subtask.set_max_activations(1)
+            subtask.set_autostart(False)
+            subtask.set_is_isr(True, isr_desc.device)
+            self.stats.add_data(subtask, "is_isr", True, scalar = True)
+
+            self.isrs.append(ISR(self, subtask))
+
+        #  Counters
+        Counter = namedtuple("Counter", ["name", "maxallowedvalue", "ticksperbase", "mincycle"])
+        for ctr in system.getCounters():
+            self.counters.append(Counter(name = ctr.name,
+                                         maxallowedvalue = ctr.MAXALLOWEDVALUE,
+                                         ticksperbase = ctr.TICKSPERBASE,
+                                         mincycle = ctr.MINCYCLE))
+
+        #  Alarms
+        for alarm in system.getAlarms():
+            assert alarm.activated_task() != None, "Alarm does not activate any task! (maybe callback?)"
+            activated_subtask = self.functions["OSEKOS_TASK_" + alarm.activated_task()]
+            belongs_to_task = activated_subtask.task
+
+            #  Generate an Alarm Handler SubTask
+            name = "OSEKOS_ALARM_HANDLER_" + alarm.name
+            subtask = Subtask(self, alarm.name, name)
+            subtask.set_static_priority(1<<31)
+            subtask.set_preemptable(False)
+            subtask.set_basic_task(True)
+            subtask.set_max_activations(1)
+            subtask.set_autostart(False)
+            subtask.set_is_isr(True)
+
+            #  And add it to the task where the activated task belongs to
+            belongs_to_task.add_subtask(subtask)
+            self.functions[subtask.function_name] = subtask
+
+            self.alarms.append(Alarm(self, subtask, alarm, activated_subtask))
+
+        #  Resources
+        for res in system.getResources():
+            self.resources[res.name] = Resource(self, res.name, res.tasks)
+
+        if not "RES_SCHEDULER" in self.resources:
+            sched = "RES_SCHEDULER"
+            subtasks = [x.name for x in self.get_subtasks()
+                        if not x.is_isr]
+            self.resources[sched] = Resource(self, sched, subtasks)
+
+
+    def read_xml_system_description(self, system):
+        """Reads in the system description out of an XML file and builds the tasks and subtask
         objects and connects them"""
 
         for task_desc in system.getTasks():
@@ -174,6 +274,7 @@ class SystemGraph(GraphObject, PassManager):
                        if not x.is_isr]
             self.resources[sched] = Resource(self, sched, subtasks)
 
+
     def read_llvmpy_analysis(self, llvmpy):
         self.llvmpy = llvmpy
         self.max_abb_id = 0
diff --git a/generator/main.py b/generator/main.py
index e6b181734d904363fc2926c0f42ebd4b1f866fd3..67285161accc833bea27765535662252a1692c2a 100755
--- a/generator/main.py
+++ b/generator/main.py
@@ -35,7 +35,7 @@ if __name__ == "__main__":
     source_dir = os.path.dirname(os.path.abspath(__file__))
     sys.path.insert(0, os.path.abspath(os.path.join(source_dir, "..")))
 
-    from generator import SystemDescription, RTSCAnalysis, LLVMPYAnalysis, Generator
+    from generator import LLVMPYAnalysis, Generator, RTSCAnalysis, RTSCSystemDescription, OILSystemDescription
     from generator.rules import *
     from generator.graph import *
     from generator.tools import panic, wrap_typecheck_functions
@@ -45,8 +45,8 @@ if __name__ == "__main__":
 
     usage = "usage: %prog [options]"
     parser = optparse.OptionParser(usage=usage)
-    parser.add_option("", "--system-xml",
-                      metavar="SYSTEM_XML", help="the system description file")
+    parser.add_option("", "--system-desc",
+                      metavar="SYSTEM_DESC", help="the system description file (.xml or .oil)")
     parser.add_option("", "--rtsc-analyze-xml",
                       metavar="RTSC_ANALYZE_XML", help="the RTSC Analyze file")
     parser.add_option("-p", "--prefix",
@@ -88,14 +88,26 @@ if __name__ == "__main__":
         sys.exit(-1)
 
     setup_logging(options.verbose)
-
-    system_description = SystemDescription.SystemDescription(options.system_xml)
-
-
     graph = SystemGraph()
     pass_manager = graph
     pass_manager.read_verify_script(options.verify)
-    graph.read_system_description(system_description)
+
+    if options.system_desc:
+        if options.system_desc.lower().endswith(".xml"):
+            system_description = RTSCSystemDescription.RTSCSystemDescription(options.system_desc)
+            graph.read_xml_system_description(system_description)
+        elif options.system_desc.lower().endswith(".oil"):
+            system_description = OILSystemDescription.OILSystemDescription(options.system_desc)
+            graph.read_oil_system_description(system_description)
+        else:
+            print("No valid system description file")
+            parser.print_help()
+            sys.exit(-1)
+    else:
+        print("No system description file passed")
+        parser.print_help()
+        sys.exit(-1)
+
 
     systemanalysis = None
 
diff --git a/generator/test/example.oil b/generator/test/example.oil
new file mode 100644
index 0000000000000000000000000000000000000000..d110b7959f372f5b73952ddd2e8ec59027fb77b3
--- /dev/null
+++ b/generator/test/example.oil
@@ -0,0 +1,99 @@
+
+CPU Josek_x86 {
+	OS JOSEK {
+		USEPARAMETERACCESS = FALSE;
+		STATUS = STANDARD;
+		USERESSCHEDULER = TRUE;
+		USEGETSERVICEID = FALSE;
+		POSTTASKHOOK = TRUE : "Description of posttaskhook";
+		STARTUPHOOK = TRUE;
+		PRETASKHOOK = TRUE;
+	};
+
+	TASK task1 {
+		AUTOSTART = TRUE {
+		APPMODE = appmode1;
+		APPMODE = appmode2;
+		};
+		ACTIVATION = 1;
+		PRIORITY = 1;
+		SCHEDULE = NON;
+	};
+
+	TASK task2 {
+		AUTOSTART = FALSE;
+		ACTIVATION = 1;
+		PRIORITY = 1;
+		SCHEDULE = NON;
+		RESOURCE = res1;
+		RESOURCE = res2;
+	} : "This is the second task";
+
+
+	APPMODE appmode1 { };
+	APPMODE appmode2 { };
+
+	RESOURCE res1 {
+		RESOURCEPROPERTY = STANDARD;
+	};
+
+	RESOURCE res2 {
+		RESOURCEPROPERTY = STANDARD;
+	};
+
+	COUNTER Timer {
+		MINCYCLE = 16; MAXALLOWEDVALUE = 127; TICKSPERBASE = 90;
+	};
+
+	ALARM WakeTaskA {
+		COUNTER = Timer;
+		ACTION = SETEVENT {
+			TASK = task2;
+			EVENT = event1;
+		};
+		AUTOSTART = FALSE;
+	 };
+
+	COUNTER SysCounter {
+		MINCYCLE = 16; MAXALLOWEDVALUE = 127; TICKSPERBASE = 90;
+	};
+
+
+
+	ALARM WakeTaskB {
+		COUNTER = SysCounter;
+		ACTION = ACTIVATETASK {
+			TASK = task1;
+		};
+		AUTOSTART = TRUE {
+			 ALARMTIME = 50;
+			 CYCLETIME = 100;
+			 APPMODE = appmode1;
+			 APPMODE = appmode2;
+		};
+	};
+
+	EVENT event1 {
+		MASK = 0xf2; // TODO: hex allow to parse hex digits
+	};
+
+	EVENT event2 {
+		MASK = AUTO;
+	};
+
+
+	ALARM RunCallbackC {
+		COUNTER = SysCounter;
+		ACTION = ALARMCALLBACK {
+			ALARMCALLBACKNAME = "CallbackC";
+		 };
+		AUTOSTART = FALSE;
+	};
+
+	ISR isr1 {
+		CATEGORY = 2;
+		RESOURCE = res1;
+		DEVICE = 32;
+	};
+
+} : "Das ist eine Beschreibung der CPU" ;
diff --git a/how-to-build.txt b/how-to-build.txt
index b71762f5a70c4417de888c7ccd45b930b0a91029..98afd224d28167c47197946081d64f9cabfb6de0 100644
--- a/how-to-build.txt
+++ b/how-to-build.txt
@@ -2,6 +2,7 @@
 cmake
 python
 python3-pip
+python3-pyparsing
 
 # for llvmpy, currently only llvm-3.3 is supported, so
 llvm-3.3 llvm-3.3-runtime
@@ -30,7 +31,10 @@ gcc-arm-none-eabi
 gdb-arm-none-eabi
 
 # TLDR; just works out of the box with Ubuntu Utopic Unicorn (14.10)
-sudo apt-get install llvm-3.3 llvm-3.3-runtime clang-3.4 gcc-arm-none-eabi gdb-arm-none-eabi python python3-pip cmake grub-common xorriso gcc-multilib g++-multilib qemu-system-i386 \
+sudo apt-get install llvm-3.3 llvm-3.3-runtime clang-3.4 \
+gcc-arm-none-eabi gdb-arm-none-eabi python3 python3-pip \
+python3-pyparsing cmake grub-common xorriso \
+gcc-multilib g++-multilib qemu-system-i386 \
  && \
 sudo sh -c "LLVM_CONFIG_PATH=/usr/bin/llvm-config-3.3 pip3 install llvmpy"
 
diff --git a/scripts/docker/dosek-base/Dockerfile b/scripts/docker/dosek-base/Dockerfile
index f4ba9b30a695a36ab1781d1bc6dee05686c67127..3e4753611f8c3af6a63594b75adbf04a6e338e82 100644
--- a/scripts/docker/dosek-base/Dockerfile
+++ b/scripts/docker/dosek-base/Dockerfile
@@ -18,6 +18,7 @@ RUN apt-get update; apt-get install -y \
     python3             \
     python3-lxml        \
     python3-pip         \
+    python3-pyparsing   \
     qemu-system-x86     \
     screen              \
     vim                 \
diff --git a/toolchain/app.cmake b/toolchain/app.cmake
index 2959e9431048436fa5f8e7454701d9f709aefe12..9969df153a0ab4939e755f6d02947c0f4bbe9c0b 100644
--- a/toolchain/app.cmake
+++ b/toolchain/app.cmake
@@ -1,13 +1,11 @@
 include(CMakeParseArguments)
 include(rtsc)
 
-
-MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS LIBS GENERATOR_ARGS)
+MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_DESC VERIFY_SCRIPT DEFINITIONS LIBS GENERATOR_ARGS)
   SET(DOSEK_ANNOTATE_SOURCE "${DOSEK_GENERATOR_DIR}/annotate/cored_annotate.cc")
   SET(DOSEK_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${NAME}")
   file(MAKE_DIRECTORY "${DOSEK_OUTPUT_DIR}")
   SET(DOSEK_ANNOTATE_OBJECT "${DOSEK_OUTPUT_DIR}/cored_annotate.ll")
-
   # compile annotate file
   set(ISA_CXX_FLAGS_LIST ${ISA_CXX_FLAGS})
   separate_arguments(ISA_CXX_FLAGS_LIST)
@@ -40,8 +38,6 @@ MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS
   string(REPLACE " " ";" COMPILER_FLAGS ${CMAKE_CXX_FLAGS})
 
   # First we have to compile all source files with clang
-
-  #COMMAND ${CLANGPP_BINARY} -S -emit-llvm -O0 -std=c++11 ${ISA_CXX_FLAGS_LIST} ${DEFINITON_FLAGS} ${INCLUDEDIRS_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${src} -o ${llvm_bytecode}
   foreach(src ${SOURCES})
     set(llvm_bytecode "${DOSEK_OUTPUT_DIR}/${src}.ll")
     add_custom_command(OUTPUT ${llvm_bytecode}
@@ -56,25 +52,6 @@ MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS
     list(APPEND DOSEK_BINARY_LLVM_BYTECODE ${llvm_bytecode})
   endforeach(src)
 
-  #  # Use RTSC to analyze and merge the source system bytecode
-  #  add_custom_command(OUTPUT "${DOSEK_SOURCE_SYSTEM}"
-  #  DEPENDS ${DOSEK_ANNOTATE_OBJECT}
-  #            ${DOSEK_BINARY_LLVM_BYTECODE}
-  #            ${CMAKE_CURRENT_SOURCE_DIR}/*.xml
-  #  COMMAND ${EAG_BINARY} -data-deps=explicit -verify
-  #     -sysann=${DOSEK_ANNOTATE_OBJECT}
-  #     -sourcesystem=${SYSTEM_XML}
-  #     -out=${DOSEK_OUTPUT_DIR}
-  #     -analyze-tasks -dump-source-system
-  #       -dump-graphs
-  #     ${DOSEK_BINARY_LLVM_BYTECODE}
-  #    COMMENT "[${PROJECT_NAME}/${NAME}] Analyzing application with RTSC")
-  #
-  #  # Add Target for the analysis step
-  #  add_custom_target(${NAME}-rtsc-analyze
-  #  DEPENDS ${DOSEK_SOURCE_SYSTEM})
-
-
   # All python source files are a dependency
   SET(DOSEK_GENERATOR_ARGS "${GENERATOR_ARGS}")
   file(GLOB_RECURSE PYTHON_SOURCE "${DOSEK_GENERATOR_DIR}/*.py")
@@ -97,14 +74,18 @@ MACRO(DOSEK_BINARY_EXECUTABLE NAME SOURCES SYSTEM_XML VERIFY_SCRIPT DEFINITIONS
     set(DOSEK_GENERATOR_ARGS ${DOSEK_GENERATOR_ARGS} --specialize-systemcalls)
   endif()
 
+  # Check system description file
+  file(GLOB XMLDESCS "${CMAKE_CURRENT_SOURCE_DIR}/*.xml")
+  file(GLOB OILDESCS "${CMAKE_CURRENT_SOURCE_DIR}/*.oil")
+  set(SYSDESCS ${XMLDESCS} ${OILDESCS})
+
   # Generating DOSEK System
   add_custom_command(OUTPUT "${DOSEK_GENERATED_SOURCE}"  "${DOSEK_GENERATED_LINKER}" "${DOSEK_SOURCE_SYSTEM}"
-  DEPENDS ${PYTHON_SOURCE} "${SYSTEM_XML}" ${DOSEK_BINARY_LLVM_BYTECODE} 
-             ${CMAKE_CURRENT_SOURCE_DIR}/*.xml
+  DEPENDS ${PYTHON_SOURCE} "${SYSTEM_DESC}" ${DOSEK_BINARY_LLVM_BYTECODE} ${SYSDESCS}
              ${VERIFY_SCRIPT} ${OS_TEMPLATES} ${LINKER_TEMPLATE}
     COMMAND ${CMAKE_COMMAND} -E remove -f ${DOSEK_OUTPUT_DIR}/gen_*.dot
     COMMAND ${DOSEK_GENERATOR}
-     --system-xml "${SYSTEM_XML}"
+     --system-desc "${SYSTEM_DESC}"
      --source-bytecode "${DOSEK_BINARY_LLVM_BYTECODE}"
      --merged-bytecode "${DOSEK_SOURCE_SYSTEM}"
        --prefix ${DOSEK_OUTPUT_DIR}
@@ -147,17 +128,16 @@ ENDMACRO()
 
 MACRO(DOSEK_BINARY)
   set(options TEST_ISO FAIL)
-  set(oneValueArgs SYSTEM_XML NAME VERIFY)
+  set(oneValueArgs SYSTEM_DESC NAME VERIFY)
   set(multiValuedParameters SOURCES LIBS GENERATOR_ARGS)
   cmake_parse_arguments(DOSEK_BINARY "${options}" "${oneValueArgs}" "${multiValuedParameters}" ${ARGN} )
   set(DOSEK_BINARY_SOURCES "${DOSEK_BINARY_UNPARSED_ARGUMENTS};${DOSEK_BINARY_SOURCES}")
-  SET(DOSEK_SYSTEM_XML "${CMAKE_CURRENT_SOURCE_DIR}/${DOSEK_BINARY_SYSTEM_XML}")
+  SET(DOSEK_SYSTEM_DESC "${CMAKE_CURRENT_SOURCE_DIR}/${DOSEK_BINARY_SYSTEM_DESC}")
   set(DOSEK_VERIFY_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/${DOSEK_BINARY_VERIFY}")
   SET(NAME "${DOSEK_BINARY_NAME}")
 
-  DOSEK_BINARY_EXECUTABLE(${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_XML} ${DOSEK_VERIFY_SCRIPT} 
+  DOSEK_BINARY_EXECUTABLE(${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_DESC} ${DOSEK_VERIFY_SCRIPT} 
     "" "${DOSEK_BINARY_LIBS}" "${DOSEK_BINARY_GENERATOR_ARGS}")
-
   add_custom_command(TARGET ${NAME} POST_BUILD
     COMMENT "Gathering binary statistics for ${NAME}"
     COMMAND ${DOSEK_GENERATOR_DIR}/stats_binary.py
@@ -165,7 +145,7 @@ MACRO(DOSEK_BINARY)
     --elf ${PROJECT_BINARY_DIR}/${NAME})
 
   if((${DOSEK_BINARY_FAIL} STREQUAL "TRUE") OR FAIL_TRACE_ALL)
-    DOSEK_BINARY_EXECUTABLE(fail-${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_XML} ${DOSEK_VERIFY_SCRIPT} 
+    DOSEK_BINARY_EXECUTABLE(fail-${NAME} "${DOSEK_BINARY_SOURCES}" ${DOSEK_SYSTEM_DESC} ${DOSEK_VERIFY_SCRIPT} 
       "FAIL=1" "${DOSEK_BINARY_LIBS}" "${DOSEK_BINARY_GENERATOR_ARGS}")
 
     fail_test(${NAME} fail-${NAME})