diff --git a/modules/CACC/CACC-Module-Test.py b/modules/CACC/CACC-Module-Test.py
index 412a2b0f50a1cac80439fb31c1dd56be776a6b75..74a8579b90eabc9fc965180affb5cd2f26957608 100644
--- a/modules/CACC/CACC-Module-Test.py
+++ b/modules/CACC/CACC-Module-Test.py
@@ -1,3 +1,4 @@
+import random
 import matplotlib
 matplotlib.use('TkAgg')
 from matplotlib import pyplot as plt
@@ -7,17 +8,24 @@ class Car(object):
     cPos = None
     cDist = None
 
+    cIPD = None
     IPD = None
     PS = None
 
-    def __init__(self, prev, speed, position, distance, IPD, PS):
+    def __init__(self, prev, speed, position, IPD, PS):
         self.plattonPrev = prev
         self.cSpeed = speed
         self.cPos = position
-        self.cDist = distance
+        self.updateDis()
+        self.cIPD = 0.01*IPD                                    # noch keine cIPD definition existent
         self.IPD = IPD
         self.PS = PS
+
+        self.bcIPD = False
         return None
+
+    def getCIPD(self):
+        return self.cIPD
     
     def getPos(self):
         return self.cPos
@@ -29,96 +37,135 @@ class Car(object):
         return self.cDist
 
     def updatePos(self):
-        self.cPos = self.cPos + self.cSpeed
+        self.cPos = self.cPos + self.cSpeed/16                  #Ticklaenge. Kann zusammen mit dem i in den Updates angepasst werden. Das Produkt beider muss 1 sein
 
     def updateDis(self):
         if not self.plattonPrev == None:
-            self.cDist = self.plattonPrev.getPos() - self.cPos
+            self.cDist = - self.cPos + self.plattonPrev.getPos()#* random.uniform(0.999, 1.001)     # bis zu 0.001 relative Abweichung auf die Entfernungsmessung
 
     def updateSpeed(self):
-        v_c = self.cSpeed
-        v_v = None
-        PS = self.PS
-        c = None
-        if not self.plattonPrev ==  None:
-            v_v = self.plattonPrev.getSpeed()
-            c = ((v_c - v_v)/v_c)**(v_c/v_v)
-            print(c, v_v/v_c)
-
-            v_z = v_v + (v_v - PS)*c
-            self.cSpeed = (1-c)*v_c + c * v_z
+        if not self.bcIPD:
+            d_c = self.cDist
+            v_c = self.cSpeed
+            IPD = self.IPD
+            PS = self.PS
+            v_n = None
+
+            if not self.plattonPrev ==  None:
+                v_v = self.plattonPrev.getSpeed() #* random.uniform(0.9, 1.1)    # bis zu 0.1 relative Abweichung auf die Geschwindigkeitsmessung
+                if self.checkInbound(d_c, IPD, 0.01*IPD):
+                    if self.checkInbound (v_c, v_v, 0.01*v_v):
+                        if self.checkInbound(v_c, PS, 0.01*PS):
+                            v_n = PS
+                        else:
+                            if v_c > PS:
+                                v_n = v_v - abs(PS-v_v)/4
+                            else:
+                                v_n = v_v + abs(PS-v_v)/4
+                    else:
+                        if v_c > v_v:
+                            v_n = v_v - abs(PS-v_v)/4
+                        else:
+                            v_n = v_v + abs(PS-v_v)/4
+                else:
+                    v_n = (v_v * (d_c/IPD)**2)      #Der Exponent gibt an, wie schnell die Aenderung umgesetzt werden soll
+                self.cSpeed = v_n
+                
+                self.cIPD = self.IPD * 0.01         #too low
+                if self.cIPD > self.cDist:
+                    self.cSpeed = 0
+                    self.bcIPD = True
+                    self.cIPD = -10                 #Zur Visualisierung
+            else:
+                v_v = self.cSpeed
+                c = 0.8
+                self.cSpeed = c * v_c + (1-c) * PS
+
+    def checkInbound(self, argument, target, delta):    #Ueberall ist ein delta von 0.01 hinterlegt
+        if argument > target + delta:
+            return False
+        elif argument < target - delta:
+            return False
         else:
-            v_v = self.cSpeed
-            c = 0.5
-            v_z = v_v - (v_v - PS) * c
-            self.cSpeed = (1-c) * v_c + c * v_z
+            return True
+
+
+def broadcastPlattonSettings(carList, newIPD, newPS):
+    for item in carList:
+        item.PS = newPS
+        item.IPD = newIPD
 
 def update(carList):
     for item in carList:
         item.updatePos()
         item.updateDis()
+    for item in reversed(carList):
         item.updateSpeed()
 
 if __name__ == "__main__":
-    IPD = 60.0
-    PS = 40.0
-
-    v_0 = 78.0
-    v_1 = 80.0
+    maxT = [20, 40, 80, 110, 130,150,170]           # times for events
+    setIPD = [40, 40, 40, 60, 45, 30, 15]           # event of IPD (activ until time event)
+    setPS  = [20, 30, 10, 10, 10, 10, 10]           # event of PS (activ until time event)
 
-    pos_0 = IPD
-    pos_1 = 0.0
+    v   = [52.0, 50.0, 10.0]                        # startvektor (Startgeschwindikeit)
+    pos = [70, 30, 0]                               # startvektor (Startposition)
     
-    dist0 = 0
-    dist1 = pos_0 - pos_1
+    cars = []
+    cars.append(Car(None, v[0], pos[0], setIPD[0], setPS[0]))
+    cars.append(Car(cars[0], v[1], pos[1], setIPD[0], setPS[0]))
+    cars.append(Car(cars[1], v[2], pos[2], setIPD[0], setPS[0]))
 
-    car0 = Car(None, v_0, pos_0, dist0, IPD, PS)
-    car1 = Car(car0, v_1, pos_1, dist1, IPD, PS)
-
-    i = 0
     t = []
-    maxT = 40
+    mesIPD= []
+    mesPS = []
+   
+    y_pos = [[],[],[]]
+    y_speed = [[],[],[]]
+    y_dist  = [[],[],[]]
+    y_cdist = [[],[],[]]
     
-    y_pos0 =[]
-    y_pos1 = []
-
-    y_speed0 = []
-    y_speed1 = []
-
-    y_dist0 = []
-    y_dist1 = []
-
-    carList = [car0, car1]
-
-    while i <= maxT:
-        t.append(i)
-
-        y_pos0.append(car0.getPos())
-        y_pos1.append(car1.getPos())
+    i = 0.0
+    for j in range(0, len(maxT)):
+        IPD = setIPD[j]
+        PS = setPS[j]
+        broadcastPlattonSettings(cars, IPD, PS)
+        
+        while i < maxT[j]:
+            t.append(i)
+            mesIPD.append(IPD)
+            mesPS.append(PS)
 
-        y_speed0.append(car0.getSpeed())
-        y_speed1.append(car1.getSpeed())
+            for k in range(0, len(cars)):
+                y_pos[k].append(cars[k].getPos())
+                y_speed[k].append(cars[k].getSpeed())
 
-        y_dist1.append(car1.getDistance())
+            for k in range(1, len(cars)):
+                y_dist[k].append(cars[k].getDistance())
+                y_cdist[k].append(cars[k].getCIPD())
 
-        i = i+1
-        update(carList)
+            i = i+0.0625
+            update(cars)
 
 
     plt.subplot(131)
-    plt.plot(t, y_pos1)
-    plt.plot(t, y_pos0)
+    plt.plot(t, y_pos[0], 'r')
+    plt.plot(t, y_pos[1], 'b')
+    plt.plot(t, y_pos[2], 'g')
     plt.title("Position")
 
     plt.subplot(132)
-    plt.plot([0,maxT],[PS, PS], 'r--')
-    plt.plot(t, y_speed1)
-    plt.plot(t, y_speed0)
+    plt.plot(t, mesPS, 'r--')
+    plt.plot(t, y_speed[0], 'r-')
+    plt.plot(t, y_speed[1], 'b')
+    plt.plot(t, y_speed[2], 'g')
     plt.title("Speed")
     
     plt.subplot(133)
-    plt.plot([0,maxT],[IPD, IPD], 'r--')
-    plt.plot(t, y_dist1)
+    plt.plot(t, mesIPD, 'r--')
+    plt.plot(t, y_dist[1], 'b-')
+    plt.plot(t, y_cdist[1], 'b--')
+    plt.plot(t, y_dist[2], 'g-')
+    plt.plot(t, y_cdist[2], 'g--')
     plt.title("Distance")
 
     plt.show()