diff --git a/02-UML/ST_BUTTON.uxf b/02-UML/ST_BUTTON.uxf
new file mode 100644
index 0000000..7dc6a10
--- /dev/null
+++ b/02-UML/ST_BUTTON.uxf
@@ -0,0 +1,179 @@
+
+
+  14
+  
+    UMLSpecialState
+    
+      546
+      140
+      28
+      28
+    
+    type=initial
+    
+  
+  
+    UMLState
+    
+      210
+      364
+      196
+      56
+    
+    ST_PBPRESSED
+    
+  
+  
+    UMLState
+    
+      714
+      364
+      196
+      56
+    
+    ST_PBRELEASED
+    
+  
+  
+    Relation
+    
+      798
+      406
+      126
+      168
+    
+    lt=->
+evPBPoll
+    10.0;10.0;10.0;100.0
+  
+  
+    Relation
+    
+      546
+      154
+      126
+      126
+    
+    lt=->
+evPBInit
+    10.0;10.0;10.0;70.0
+  
+  
+    UMLSpecialState
+    
+      532
+      252
+      56
+      56
+    
+    type=decision
+    
+  
+  
+    Relation
+    
+      294
+      266
+      266
+      126
+    
+    lt=->
+m1=[pB==1]
+    170.0;10.0;10.0;10.0;10.0;70.0
+  
+  
+    Relation
+    
+      294
+      406
+      126
+      126
+    
+    lt=->
+evPBPoll
+    10.0;10.0;10.0;70.0
+  
+  
+    Relation
+    
+      574
+      266
+      266
+      126
+    
+    lt=->
+m1=[pB==0]
+    10.0;10.0;170.0;10.0;170.0;70.0
+  
+  
+    UMLSpecialState
+    
+      280
+      504
+      56
+      56
+    
+    type=decision
+    
+  
+  
+    UMLSpecialState
+    
+      784
+      546
+      56
+      56
+    
+    type=decision
+    
+  
+  
+    Relation
+    
+      350
+      308
+      462
+      308
+    
+    lt=->
+m1=[pB==1] / pbPress()
+    310.0;190.0;260.0;190.0;40.0;10.0;10.0;10.0;10.0;40.0
+  
+  
+    Relation
+    
+      322
+      308
+      462
+      266
+    
+    lt=->
+
+m1=[pB==0] / pbRelease()
+    10.0;160.0;60.0;160.0;280.0;10.0;310.0;10.0;310.0;40.0
+  
+  
+    Relation
+    
+      154
+      308
+      154
+      266
+    
+    lt=->
+m1=[else]
+    90.0;160.0;10.0;160.0;10.0;10.0;70.0;10.0;70.0;40.0
+  
+  
+    Relation
+    
+      826
+      308
+      154
+      308
+    
+    lt=->
+m1=[else]
+    10.0;190.0;90.0;190.0;90.0;10.0;30.0;10.0;30.0;40.0
+  
+
diff --git a/03-software/ch/kb28/blinkerProject/app/factory/factory.c b/03-software/ch/kb28/blinkerProject/app/factory/factory.c
index 7330ef5..76a2065 100755
--- a/03-software/ch/kb28/blinkerProject/app/factory/factory.c
+++ b/03-software/ch/kb28/blinkerProject/app/factory/factory.c
@@ -86,9 +86,16 @@ void Factory_init() {
     BUTTON_initHW(b3());
 }
 
+void lON(){
+    LED_on(l9());
+}
+void lOFF() {
+    LED_off(l9());
+}
+
 //connect objects if required
 void Factory_build() {
-    
+    BUTTON_setEventFunctions(b1(), &lON, &lOFF);
 }
 
 //start all state machines
diff --git a/03-software/ch/kb28/blinkerProject/app/factory/factory.h b/03-software/ch/kb28/blinkerProject/app/factory/factory.h
index 1021168..baed0e7 100755
--- a/03-software/ch/kb28/blinkerProject/app/factory/factory.h
+++ b/03-software/ch/kb28/blinkerProject/app/factory/factory.h
@@ -1,8 +1,8 @@
 /* this is the Factory class */
 
 
-#ifndef FACTORY_ONCE
-#define FACTORY_ONCE
+#ifndef FACTORY_H
+#define FACTORY_H
 
 #include 
 #include 
diff --git a/03-software/ch/kb28/blinkerProject/app/main.c b/03-software/ch/kb28/blinkerProject/app/main.c
index 1a5b342..23b0e52 100644
--- a/03-software/ch/kb28/blinkerProject/app/main.c
+++ b/03-software/ch/kb28/blinkerProject/app/main.c
@@ -1,9 +1,7 @@
 
 #include "../mcc_generated_files/mcc.h"
-#include "../board/led/led.h"
 #include "../app/factory/factory.h"
 #include "../xf/xf.h"
-#include "../board/button/button.h"
 
 
 
diff --git a/03-software/ch/kb28/blinkerProject/board/button/button.c b/03-software/ch/kb28/blinkerProject/board/button/button.c
index 7b960c8..0c08cde 100644
--- a/03-software/ch/kb28/blinkerProject/board/button/button.c
+++ b/03-software/ch/kb28/blinkerProject/board/button/button.c
@@ -8,7 +8,6 @@
 
 #include "button.h"
 #include "../../mcc_generated_files/pin_manager.h"
-#include "../led/led.h"
 #include "../../app/factory/factory.h"
 
 /**
@@ -82,31 +81,29 @@ bool BUTTON_processEvent(Event * ev) {
     switch(me->state){
         case ST_PBINIT:
             if (evid == evPBInit) {
+                POST(me, &BUTTON_processEvent, evPBPoll, 0, 0);
                 if(BUTTON_isPressed(me)) {
                     me->state = ST_PBPRESSED;
                 } else {
                     me->state = ST_PBRELEASED;
                 }
-                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
             }
             break;
-        case ST_PBPOLL:
-            break;
         case ST_PBRELEASED:
             if(evid == evPBPoll) {
+                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
                 if(BUTTON_isPressed(me)) {
                     me->state = ST_PBPRESSED;
                 }
-                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);
             }
             
             break;
         case ST_PBPRESSED:
             if(evid == evPBPoll) {
+                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);                
                 if(!BUTTON_isPressed(me)){
                     me->state = ST_PBRELEASED;
                 }
-                POST(me, &BUTTON_processEvent, evPBPoll, PB_POLL_TIME, 0);                
                     
             }
             break;
@@ -116,16 +113,19 @@ bool BUTTON_processEvent(Event * ev) {
         switch(me->state){
             case ST_PBINIT:
                 break;
-            case ST_PBPOLL:
-                break;
             case ST_PBRELEASED:
-                LED_off(l10());
+                if(me->fButtonRelease != NULL) me->fButtonRelease();
                 break;
             case ST_PBPRESSED:
-                LED_on(l10());
+                if(me->fButtonPress != NULL) me->fButtonPress();
                 break;
         }
         processed = true;
     }
     return processed;
+}
+
+void BUTTON_setEventFunctions(BUTTON* me, void (*fPress)(void), void (*fRelease)(void)) {
+    me->fButtonPress = fPress;
+    me->fButtonRelease = fRelease;
 }
\ No newline at end of file
diff --git a/03-software/ch/kb28/blinkerProject/board/button/button.h b/03-software/ch/kb28/blinkerProject/board/button/button.h
index 96bc106..0db6698 100644
--- a/03-software/ch/kb28/blinkerProject/board/button/button.h
+++ b/03-software/ch/kb28/blinkerProject/board/button/button.h
@@ -6,7 +6,7 @@
  * 
  */
 #ifndef BUTTON_H
-#define	BUTTON_H
+#define BUTTON_H
 
 #include 
 #include 
@@ -14,13 +14,14 @@
 
 #define PB_POLL_TIME 20
 
-typedef enum {ST_PBINIT, ST_PBWAIT, ST_PBPOLL, ST_PBRELEASED, ST_PBPRESSED} BUTTON_STATES;
+typedef enum {ST_PBINIT,  ST_PBRELEASED, ST_PBPRESSED} BUTTON_STATES;
 typedef enum {evPBInit=100, evPBPoll} BUTTON_EVENTS;
 
 typedef struct {
     uint8_t id;
     BUTTON_STATES state;
-
+    void (*fButtonPress)(void);
+    void (*fButtonRelease)(void);
 } BUTTON;
 
 void BUTTON_init(BUTTON* me, uint8_t id);
@@ -28,5 +29,6 @@ void BUTTON_initHW(BUTTON* me);
 bool BUTTON_isPressed(BUTTON* me);
 void BUTTON_startBehaviour(BUTTON* me);
 bool BUTTON_processEvent(Event* ev);
+void BUTTON_setEventFunctions(BUTTON* me, void (*fPress)(void), void (*fRelease)(void));
 
 #endif	/* BUTTON_H */
\ No newline at end of file
diff --git a/03-software/ch/kb28/blinkerProject/board/led/led.h b/03-software/ch/kb28/blinkerProject/board/led/led.h
index 63f3e3f..e05b2b7 100644
--- a/03-software/ch/kb28/blinkerProject/board/led/led.h
+++ b/03-software/ch/kb28/blinkerProject/board/led/led.h
@@ -6,7 +6,7 @@
  */
 
 #ifndef LED_H
-#define	LED_H
+#define LED_H
 
 #include