diff --git a/README.md b/README.md
index 965f922757f356f0646f419054d2e20f375c1a2a..4d25c1e27569959c5d155286d66ce459be2252c5 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,9 @@ https://www.arduino.cc/en/guide/libraries section "Importing a .zip Library"
 ### Client
 
 ```cpp
-#Anlegen der Client-Instanz 
+#Anlegen der Client-Instanz
+// Anlegen des didacticPSNetClient-Objekts
+// psnClient -> möglicher Name für Objekt
 didacticPSNetClient psnClient;
 
 #Starten der Client-Instanz
@@ -63,14 +65,53 @@ bool psnClient.unsubscribe(char* topic, int length);
 // return true wenn Daten versendet / false wenn nicht
 
 #Daten unter Topic veroeffentlichen
+Daten direkt veröffentlichen
 int psnClient.publish(char* topic, char* payload); 
-// param1: Topic String/char-Array; param2: payload-char-Array
+// param1: Topic String/char-Array; 
+// param2: payload-char-Array
+// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, 
+//                     DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), 
+//                     DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten)
+
+int psnClient.publish(char* topic, bool payload); 
+// param1: Topic String/char-Array; 
+// param2: payload vom Datentyp bool (wird in char-Array gewandelt)
+// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, 
+//                     DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), 
+//                     DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten)
+
+int psnClient.publish(char* topic, int payload); 
+// param1: Topic String/char-Array; 
+// param2: payload vom Datentyp int (wird in char-Array gewandelt)
+// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, 
+//                     DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), 
+//                     DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten)
+
 int psnClient.publish(char* topic, int topicLength, char* payload, int payloadLength); 
 // param1: Topic String/char-Array
 // param2: Anzahl Zeichen des Topics
 // param3: payload-char-Array
 // param4: Anzahl Zeichen der Payload
-// return: ERROR-Wert: DN_ERROR_NO_ERROR, 
+// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL, 
+//                     DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), 
+//                     DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten)
+
+//Daten werden beim Zustandswechsel von payload (0->1 / 1->0) veröffentlicht
+int psnClient.publishOnChange(char* topic, bool payload);
+// param1: Topic String/char-Array; 
+// param2: payload vom Datentyp bool (wird in char-Array gewandelt)
+// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL,
+//                     DN_ERROR_NO_ERROR (Keine Daten veröffentlicht und keine Fehler), 
+//                     DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), 
+//                     DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten)
+
+// Daten werden veröffentlicht, wenn Veränderung von payload größer als threshold ist 
+int psnClient.publishOnChange(char* topic, int payload, int threshold);
+// param1: Topic String/char-Array; 
+// param2: payload vom Datentyp bool (wird in char-Array gewandelt)
+// param1: Topic String/char-Array; 
+// return: ERROR-Wert: DN_PUBLISH_SUCCESSULL,
+//                     DN_ERROR_NO_ERROR (Keine Daten veröffentlicht und keine Fehler), 
 //                     DN_ERROR_TOPIC_LEN (Topic zu lang - wird abgeschnitten), 
 //                     DN_ERROR_PAYLOAD_LEN (Payload zu lange - wird abgeschnitten)
 
@@ -79,13 +120,15 @@ void clientCallback(char* topic, int topicLength, char* payload, int payloadLeng
 // param1: Topic der Nachricht
 // param2: Lange des Topics
 // param3: Nutdaten der Nachricht
-// param4: Laenge der
+// param4: Laenge der Nachricht
 ```
 
 ### Broker
 
 ```cpp
 #Anlegen der Broker-Instanz
+// Anlegen des Borker-Objekts
+// psnBroker -> möglicher Name für Objekt
 didacticPSNetBroker psnBroker; 
 
 #Starten der Broker-Instanz 
@@ -97,30 +140,44 @@ bool psnBroker.handleNetwork();
 ```
 
 ### Hilfreiche Funktionen
-
-Wichtiger Hinweis: 
-Diese Funktionen koennen derzeit nur einmal pro Programm/Client-Instanz eingesetzt werden.
-Werden diese an verschiedenen Stellen mit verschiedenen Werten verwendet, werden Werte u. U. ueberschrieben.
+Die Hiflsfunktionen sind als eigenständige Klassen implementiert und können so mehrfach (unter verschiedenen Namen) angelegt werden.
+So können die Funktionen mehrfach, mit unterschiedlichen Parametern, verwendet werden.
 
 ```cpp
 #Flankenerkennung z.B. fuer Taster
-int psnClient.edgeDetected(bool currentState);
+// Anlegen des EdgeDetector-Objekts
+// eDetector -> möglicher Name für Objekt
+EdgeDetector eDetector;
+
+int eDetector.edgeDetected(bool currentState);
 // param: aktueller binärer Zustand
 // return: 0 -> keine Flanke, RISING, FALLING
 
 #Auf Wertaenderung groeßer Schwellwert pruefen
-bool psnClient.valueChanged(int currentvalue, int threshold);
+// Anlegen des ChangeDetector-Objekts
+// cDetector -> möglicher Name für Objekt
+ChangeDetector cDetector
+
+bool cDetector.valueChanged(int currentvalue, int threshold);
 // param1: aktueller Wert
 // param2: Schwellwert
 // return: true -> Aenderung groeßer als Schwellwert; sonst false
 
 #Nicht blockierendes Warten
-bool psnClient.timeElapsed(long);
+// Anlegen des UnblockingTimer-Objekts
+// uTimer -> möglicher Name für Objekt
+UnblockingTimer uTimer;
+
+bool uTimer.timeElapsed(long);
 // param: zu wartende Zeit in Millisekunden
 // return: true, wenn Zeit Wartezeit abgelaufen; sonst false
 
 #Einlesen von Text ueber Serialle Schnittstelle bis Endezeichen empfangen wird
-int psnClient.readSerialData(Stream&, char*, char);
+// Anlegen des SerialReader-Objekts
+// sReader -> möglicher Name für Objekt
+SerialReader sReader;
+
+int sReader.readSerialData(Stream&, char*, char);
 // param1: Schnittstelle (Serial | SoftSerial)
 // param2: Array in das die Zeichen eingelesen werden
 // param3: Endezeichen (char)
@@ -129,7 +186,7 @@ int psnClient.readSerialData(Stream&, char*, char);
 
 ### Konstanten
 
-Konstanten aus der Library die fuer die Programmierung genutzt werden und teilweise angepasst werden koennen.
+Konstanten aus der Library die fuer die Programmierung genutzt werden und angepasst werden koennen.
 ```cpp
 #ASCII Endezeichen
 DN_ASCII_CR "carriage return CR" (int) 13
@@ -143,7 +200,12 @@ MAX_LEN_PAYLOAD  default: 20
 MAX_NR_TOPICS_CLIENT  default: 5
 MAX_NR_TOPICS_BROKER  default: 20
 
-#ERRORs
+#Mindestwartezeiten zwischen Sendevorgängen (anpassen über psnClient.setInterval())
+INTERVAL_CLIENT	 default: 500 ms
+INTERVAL_BROKER	 default:   0 ms
+
+#ERRORs (nicht verändern)
+DN_PUBLISH_SUCCESSULL 1
 DN_ERROR_NO_ERROR     0
 DN_ERROR_TOPIC_LEN   -1
 DN_ERROR_PAYLOAD_LEN -2
diff --git a/library.properties b/library.properties
index fb194340583c56434140063784b0e64c7c172c3e..b103e4391dcb62375688e34d444308578b4aa79b 100644
--- a/library.properties
+++ b/library.properties
@@ -6,4 +6,4 @@ sentence=Library for implementing didactic reduced networks on Arduino boards.
 category=Communication
 paragraph=Library for implementing networks on Arduino boards. The functionalities correspond to state of the art technologies, which are didactically reduced.
 url=https://gitlab.reutlingen-university.de/letsgoing/libraries/didacticnetwork
-includes=didacticNetwork.h
+includes=didacticNet.h
diff --git a/src/didacticNet.cpp b/src/didacticNet.cpp
index 11a06e1008ed1453143e48f2b61d74139a2e0e80..f14ace21992e70b7d533ffd00d95831966f92b66 100644
--- a/src/didacticNet.cpp
+++ b/src/didacticNet.cpp
@@ -206,7 +206,7 @@ int DidacticPSNetClient::publish(char* topic,  bool data){
 
 int DidacticPSNetClient::publishOnChange(char* topic, bool input){
   if(!_dataToSend){
-    if(edgeDetected(input)){
+    if(eDetector.edgeDetected(input)){
       return publish(topic, input);
     }
   }
@@ -215,7 +215,7 @@ int DidacticPSNetClient::publishOnChange(char* topic, bool input){
 
 int DidacticPSNetClient::publishOnChange(char* topic, int input, int threshold){
   if(!_dataToSend){
-    if(valueChanged(input, threshold)){
+    if(cDetector.valueChanged(input, threshold)){
       return publish(topic, input);
     }
   }
@@ -323,30 +323,6 @@ int DidacticPSNetClient::getFreeTopicNr() {
   return -1;
 }
 
-int DidacticPSNetClient::edgeDetected(bool currentState){
-  static bool lastState = false;
-  int edEdge = 0;
-
-  if(currentState && !lastState){
-    edEdge = RISING;
-  }
-  else if(!currentState && lastState){
-    edEdge = FALLING;
-  }
-  lastState = currentState;
-  return edEdge;
-}
-
-bool DidacticPSNetClient::valueChanged(int value, int threshold){
-  static int lastValue = 0;
-
-  if(abs(value-lastValue) > threshold){
-    lastValue = value;
-    return true;
-  }
-  return false;
-}
-
 
 //**************************************************************************
 //Broker
@@ -451,6 +427,37 @@ int DidacticPSNetBroker::getFreeTopicNr() {
 //LITTLE HELPERS FOR CLIENTS ;-)
 //*************************************************************************
 
+EdgeDetector::EdgeDetector(){};
+EdgeDetector::~EdgeDetector(){};
+
+int EdgeDetector::edgeDetected(bool currentState){
+  static bool lastState = false;
+  int edEdge = 0;
+
+  if(currentState && !lastState){
+    edEdge = RISING;
+  }
+  else if(!currentState && lastState){
+    edEdge = FALLING;
+  }
+  lastState = currentState;
+  return edEdge;
+}
+
+ChangeDetector::ChangeDetector(){}
+ChangeDetector::~ChangeDetector(){}
+
+bool ChangeDetector::valueChanged(int value, int threshold){
+  static int lastValue = 0;
+
+  if(abs(value-lastValue) > threshold){
+    lastValue = value;
+    return true;
+  }
+  return false;
+}
+
+
 UnblockingTimer::UnblockingTimer(){}
 UnblockingTimer::~UnblockingTimer(){}
 
diff --git a/src/didacticNet.h b/src/didacticNet.h
index ec6883b870195199eb20a6b0c4928bbaf5663aa0..596db882857b225191ab1d86fa05712d91df8856 100644
--- a/src/didacticNet.h
+++ b/src/didacticNet.h
@@ -49,6 +49,54 @@
 #define DN_ASCII_CR 13
 #define DN_ASCII_NL 10
 
+
+class EdgeDetector
+{
+	private:
+
+	public:
+		EdgeDetector();
+		~EdgeDetector();
+		int edgeDetected(bool);
+
+};
+
+class ChangeDetector
+{
+	private:
+
+	public:
+		ChangeDetector();
+		~ChangeDetector();
+		bool valueChanged(int, int);
+
+};
+
+class UnblockingTimer
+{
+	private:
+		long lastTime = 0L;
+
+	public:
+		UnblockingTimer();
+		~UnblockingTimer();
+		bool timeElapsed(long);
+
+};
+class SerialReader
+{
+	private:
+		Stream* _port;
+		int charCounter = 0;
+
+	public:
+		SerialReader();
+		~SerialReader();
+		void begin(Stream&);
+		int readSerialData(char*, char);
+
+};
+
 class DidacticPSNet
 {
 	protected:
@@ -97,6 +145,9 @@ class DidacticPSNet
 class DidacticPSNetClient : public  DidacticPSNet
 {
 	private:
+	EdgeDetector 	eDetector;
+	ChangeDetector  cDetector;
+
 	char _topic[MAX_NR_TOPICS_CLIENT][MAX_LEN_TOPICS+1] = { { 0 } };
 	char _payload[MAX_NR_TOPICS_CLIENT][MAX_LEN_PAYLOAD+1] = { { 0 } };
 
@@ -149,28 +200,4 @@ class DidacticPSNetBroker: public  DidacticPSNet
 };
 
 
-class UnblockingTimer
-{
-	private:
-		long lastTime = 0L;
-
-	public:
-		UnblockingTimer();
-		~UnblockingTimer();
-		bool timeElapsed(long);
-
-};
-class SerialReader
-{
-	private:
-		Stream* _port;
-		int charCounter = 0;
-
-	public:
-		SerialReader();
-		~SerialReader();
-		void begin(Stream&);
-		int readSerialData(char*, char);
-
-};
 #endif