diff --git a/.gitignore b/.gitignore
index 7b31b2f..233d5eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 .checkstyle
 .classpath
 .project
+.fbExcludeFilterFile
 .settings/
 target/
 target-ide/
diff --git a/sdnr/wt/websocketmanager2/model/pom.xml b/sdnr/wt/websocketmanager2/model/pom.xml
index 02b210c..6a9ffb9 100644
--- a/sdnr/wt/websocketmanager2/model/pom.xml
+++ b/sdnr/wt/websocketmanager2/model/pom.xml
@@ -35,6 +35,4 @@
     <version>1.2.1-SNAPSHOT</version>
     <relativePath />
   </parent>
-  <dependencies>
-  </dependencies>
 </project>
diff --git a/sdnr/wt/websocketmanager2/provider/pom.xml b/sdnr/wt/websocketmanager2/provider/pom.xml
index 4bf6805..6fc46b4 100644
--- a/sdnr/wt/websocketmanager2/provider/pom.xml
+++ b/sdnr/wt/websocketmanager2/provider/pom.xml
@@ -1,116 +1,157 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- ============LICENSE_START======================================================= 
-	ONAP : ccsdk feature sdnr wt websocketmanager2 ================================================================================ 
-	Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All 
-	rights reserved. ================================================================================ 
-	Licensed under the Apache License, Version 2.0 (the "License"); you may not 
-	use this file except in compliance with the License. You may obtain a copy 
-	of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
-	by applicable law or agreed to in writing, software distributed under the 
-	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
-	OF ANY KIND, either express or implied. See the License for the specific 
-	language governing permissions and limitations under the License. ============LICENSE_END========================================================= -->
+<!-- ============LICENSE_START=======================================================
+    ONAP : ccsdk feature sdnr wt websocketmanager2 ================================================================================
+    Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All
+    rights reserved. ================================================================================
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not
+    use this file except in compliance with the License. You may obtain a copy
+    of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+    by applicable law or agreed to in writing, software distributed under the
+    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+    OF ANY KIND, either express or implied. See the License for the specific
+    language governing permissions and limitations under the License. ============LICENSE_END========================================================= -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
-	<artifactId>sdnr-wt-websocketmanager2-provider</artifactId>
-	<version>0.4.1-SNAPSHOT</version>
-	<name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name>
-	<packaging>bundle</packaging>
-	<parent>
-		<groupId>org.onap.ccsdk.parent</groupId>
-		<artifactId>binding-parent</artifactId>
-		<version>1.2.1-SNAPSHOT</version>
-		<relativePath></relativePath>
-	</parent>
-	<properties>
-		<maven.javadoc.skip>true</maven.javadoc.skip>
-		<checkstyle.skip>true</checkstyle.skip>
-	</properties>
-	<licenses>
-		<license>
-			<name>Apache License, Version 2.0</name>
-			<url>http://www.apache.org/licenses/LICENSE-2.0</url>
-		</license>
-	</licenses>
-	<dependencies>
-		<dependency>
-			<groupId>${project.groupId}</groupId>
-			<artifactId>sdnr-wt-websocketmanager2-model</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>servlet-api</artifactId>
-			<version>2.5</version>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.jetty.websocket</groupId>
-			<artifactId>websocket-api</artifactId>
-			<version>9.3.21.v20170918</version>
-		</dependency>
-		<dependency>
-			<groupId>org.eclipse.jetty.websocket</groupId>
-			<artifactId>websocket-servlet</artifactId>
-			<version>9.3.21.v20170918</version>
-		</dependency>
-		<dependency>
-			<groupId>io.netty</groupId>
-			<artifactId>netty-transport</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>io.netty</groupId>
-			<artifactId>netty-all</artifactId>
-			<!-- <version>${netty.version}</version> -->
-		</dependency>
-		<dependency>
-			<groupId>org.json</groupId>
-			<artifactId>json</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.typesafe.akka</groupId>
-			<artifactId>akka-actor_2.12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.typesafe.akka</groupId>
-			<artifactId>akka-cluster_2.12</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.java-websocket</groupId>
-			<artifactId>Java-WebSocket</artifactId>
-			<version>1.3.8</version>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<!-- <version>2.23.4</version> -->
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.opendaylight.controller</groupId>
-			<artifactId>sal-binding-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.osgi</groupId>
-			<artifactId>org.osgi.core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.osgi</groupId>
-			<artifactId>org.osgi.compendium</artifactId>
-		</dependency>
-	</dependencies>
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.8</source>
-					<target>1.8</target>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.onap.ccsdk.features.sdnr.wt</groupId>
+  <artifactId>sdnr-wt-websocketmanager2-provider</artifactId>
+  <version>0.4.1-SNAPSHOT</version>
+  <name>ccsdk-features-sdnr-wt :: ${project.artifactId}</name>
+  <packaging>bundle</packaging>
+  <parent>
+    <groupId>org.onap.ccsdk.parent</groupId>
+    <artifactId>binding-parent</artifactId>
+    <version>1.2.1-SNAPSHOT</version>
+    <relativePath></relativePath>
+  </parent>
+  <properties>
+    <maven.javadoc.skip>true</maven.javadoc.skip>
+    <checkstyle.skip>true</checkstyle.skip>
+  </properties>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+    </license>
+  </licenses>
+<!--     <dependencyManagement> -->
+<!--         <dependencies> -->
+<!--             <dependency> -->
+<!--                 <groupId>org.opendaylight.controller</groupId> -->
+<!--                 <artifactId>mdsal-artifacts</artifactId> -->
+<!--                 <version>1.6.1</version> -->
+<!--                 <type>pom</type> -->
+<!--                 <scope>import</scope> -->
+<!--             </dependency> -->
+<!--         </dependencies> -->
+<!--     </dependencyManagement> -->
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>sdnr-wt-websocketmanager2-model</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <version>2.5</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-api</artifactId>
+      <version>9.3.24.v20180605</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>websocket-servlet</artifactId>
+      <version>9.3.24.v20180605</version>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-all</artifactId>
+            <!-- <version>${netty.version}</version> -->
+    </dependency>
+    <dependency>
+      <groupId>org.json</groupId>
+      <artifactId>json</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.typesafe.akka</groupId>
+      <artifactId>akka-actor_2.12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.typesafe.akka</groupId>
+      <artifactId>akka-cluster_2.12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.java-websocket</groupId>
+      <artifactId>Java-WebSocket</artifactId>
+      <version>1.3.8</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+            <!-- <version>2.23.4</version> -->
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.controller</groupId>
+      <artifactId>sal-binding-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>9.3.24.v20180605</version>
+      <scope>test</scope>
+    </dependency>
+<!--     <dependency> -->
+<!--       <groupId>org.eclipse.jetty.websocket</groupId> -->
+<!--       <artifactId>websocket-api</artifactId> -->
+<!--       <version>9.3.24.v20180605</version> -->
+<!--     </dependency> -->
+        <!-- To run websockets in embedded server -->
+        <!-- <dependency> -->
+        <!-- <groupId>org.eclipse.jetty.websocket</groupId> -->
+        <!-- <artifactId>websocket-server</artifactId> -->
+        <!-- <version>9.3.24.v20180605</version> -->
+        <!-- </dependency> -->
+        <!-- <dependency> -->
+        <!-- <groupId>org.eclipse.jetty.websocket</groupId> -->
+        <!-- <artifactId>websocket-server</artifactId> -->
+        <!-- <version>9.3.24.v20180605</version> -->
+        <!-- <scope>test</scope> -->
+        <!-- </dependency> -->
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+    </plugins>
+
+  </build>
 </project>
diff --git a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/Blueprint.java b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/Blueprint.java
index 32d9d7a..bd84043 100644
--- a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/Blueprint.java
+++ b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/Blueprint.java
@@ -17,19 +17,19 @@
  ******************************************************************************/
 package org.onap.ccsdk.features.sdnr.wt.websocketmanager2;
 
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 
 public abstract class Blueprint implements AutoCloseable {
 
-    private RpcProviderRegistry rpcProviderRegistry = null;
+    private RpcProviderService rpcProviderRegistry = null;
 
     public abstract void init();
 
-    public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
+    public void setRpcProviderRegistry(RpcProviderService rpcProviderRegistry) {
         this.rpcProviderRegistry = rpcProviderRegistry;
     }
 
-    public RpcProviderRegistry getRpcProviderRegistry() {
+    public RpcProviderService getRpcProviderRegistry() {
         return this.rpcProviderRegistry;
     }
 
diff --git a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManager.java b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManager.java
index 1806612..51554e3 100644
--- a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManager.java
+++ b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManager.java
@@ -18,9 +18,13 @@
 package org.onap.ccsdk.features.sdnr.wt.websocketmanager2;
 
 import com.google.common.util.concurrent.ListenableFuture;
+import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
 import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
 import org.json.JSONObject;
@@ -47,7 +51,7 @@
     private static final String APPLICATION_NAME = WebSocketManager.class.getName();
     private static final int PORT = 8181;
     private final EventInputCallback rpcEventInputCallback;
-
+    private final AkkaConfig akkaConfig;
     /**
      * timeout for websocket with no messages in ms
      */
@@ -56,16 +60,25 @@
     private final ArrayList<URI> clusterNodeClients = new ArrayList<>();
 
     public WebSocketManager() {
-       super();
-       rpcEventInputCallback = message -> {
-        LOG.debug("onMessagePushed: " + message);
-        SyncWebSocketClient client;
-        for (URI clientURI : WebSocketManager.this.clusterNodeClients) {
-            client = new SyncWebSocketClient(clientURI);
-            LOG.debug("try to push message to " + client.getURI());
-            client.openAndSendAndCloseSync(message);
+        this(null, null);
+    }
+
+    public WebSocketManager(AkkaConfig akkaconfig, EventInputCallback cb) {
+        super();
+        this.akkaConfig = akkaconfig;
+        if (cb != null) {
+            this.rpcEventInputCallback = cb;
+        } else {
+            this.rpcEventInputCallback = message -> {
+                LOG.debug("onMessagePushed: " + message);
+                SyncWebSocketClient client;
+                for (URI clientURI : WebSocketManager.this.clusterNodeClients) {
+                    client = new SyncWebSocketClient(clientURI);
+                    LOG.debug("try to push message to " + client.getURI());
+                    client.openAndSendAndCloseSync(message);
+                }
+            };
         }
-    };
         LOG.info("Create servlet for {}", APPLICATION_NAME);
     }
 
@@ -80,11 +93,13 @@
         // register Socket as the WebSocket to create on Upgrade
         factory.register(WebSocketManagerSocket.class);
 
-        AkkaConfig cfg = null;
-        try {
-            cfg = AkkaConfig.load();
-        } catch (Exception e) {
-            LOG.warn("problem loading akka config: " + e.getMessage());
+        AkkaConfig cfg = this.akkaConfig;
+        if (cfg == null) {
+            try {
+                cfg = AkkaConfig.load();
+            } catch (Exception e) {
+                LOG.warn("problem loading akka config: " + e.getMessage());
+            }
         }
         if (cfg != null && cfg.isCluster()) {
             this.initWSClients(cfg.getClusterConfig());
@@ -96,25 +111,30 @@
     public ListenableFuture<RpcResult<WebsocketEventOutput>> websocketEvent(WebsocketEventInput input) {
         LOG.debug("Send message '{}'", input);
         RpcResultBuilder<WebsocketEventOutput> result;
-        try {
-            WebsocketEventOutputBuilder outputBuilder = new WebsocketEventOutputBuilder();
-            final String s = input.getXmlEvent();
-            WebSocketManagerSocket.broadCast(input.getNodeName(), input.getEventType(), s);
-            outputBuilder.setResponse("OK");
+
+        final String eventAsXmlString = input.getXmlEvent();
+        if (eventAsXmlString != null) {
+            WebSocketManagerSocket.broadCast(input.getNodeName(), input.getEventType(), eventAsXmlString);
             try {
                 JSONObject o = new JSONObject();
                 o.put(WebSocketManagerSocket.KEY_NODENAME, input.getNodeName());
                 o.put(WebSocketManagerSocket.KEY_EVENTTYPE, input.getEventType());
                 o.put(WebSocketManagerSocket.KEY_XMLEVENT, input.getXmlEvent());
                 this.rpcEventInputCallback.onMessagePushed(o.toString());
+
+                WebsocketEventOutputBuilder outputBuilder = new WebsocketEventOutputBuilder();
+                outputBuilder.setResponse("OK");
+                result = RpcResultBuilder.success(outputBuilder);
             } catch (Exception err) {
                 LOG.warn("problem pushing messsage to other nodes: " + err.getMessage());
+                result = RpcResultBuilder.failed();
+                result.withError(ErrorType.APPLICATION, "Exception", err);
             }
-            result = RpcResultBuilder.success(outputBuilder);
-        } catch (Exception e) {
-            LOG.warn("Socketproblem: {}", e);
+        } else {
+            String msg = "Emtpy event received";
+            LOG.warn(msg);
             result = RpcResultBuilder.failed();
-            result.withError(ErrorType.APPLICATION, "Exception", e);
+            result.withError(ErrorType.APPLICATION, msg);
         }
         return result.buildFuture();
     }
@@ -123,6 +143,17 @@
      * Private functions
      */
 
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        if (req.getHeader("Upgrade") != null) {
+            /* Accept upgrade request */
+            resp.setStatus(101);
+            resp.setHeader("Upgrade", "XYZP");
+            resp.setHeader("Connection", "Upgrade");
+            resp.setHeader("OtherHeaderB", "Value");
+        }
+    }
+
     private void initWSClients(ClusterConfig clusterConfig) {
         for (ClusterNodeInfo nodeConfig : clusterConfig.getSeedNodes()) {
             if (clusterConfig.isMe(nodeConfig)) {
diff --git a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerProvider.java b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerProvider.java
index 737fe54..2c54d2a 100644
--- a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerProvider.java
+++ b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerProvider.java
@@ -6,9 +6,9 @@
  * =================================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  * in compliance with the License. You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software distributed under the License
  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
  * or implied. See the License for the specific language governing permissions and limitations under
@@ -18,10 +18,9 @@
 package org.onap.ccsdk.features.sdnr.wt.websocketmanager2;
 
 import javax.servlet.ServletException;
-
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketmanagerService;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.osgi.service.http.HttpService;
 import org.osgi.service.http.NamespaceException;
 import org.slf4j.Logger;
@@ -29,67 +28,73 @@
 
 public class WebSocketManagerProvider extends Blueprint {
 
-	private static final Logger LOG = LoggerFactory.getLogger(WebSocketManagerProvider.class);
-	private static final String APPLICATION_NAME = WebSocketManagerProvider.class.getName();
-	private static final String ALIAS = "/websocket";
+    private static final Logger LOG = LoggerFactory.getLogger(WebSocketManagerProvider.class);
+    private static final String APPLICATION_NAME = WebSocketManagerProvider.class.getName();
+    private static final String ALIAS = "/websocket";
 
-	private WebSocketManager wsServlet = null;
-	private RpcRegistration<WebsocketmanagerService> websocketService = null;
-	
-	public WebSocketManagerProvider() {
-		LOG.info("Creating provider for {}", APPLICATION_NAME);
-	}
+    private WebSocketManager wsServlet = null;
+    private ObjectRegistration<WebSocketManager> websocketService = null;
 
-	@Override
-	public void init() {
-		LOG.info("Init provider for {}", APPLICATION_NAME);
-		RpcProviderRegistry rpcProviderRegistry = this.getRpcProviderRegistry();
-		if (rpcProviderRegistry != null) {
-			if (wsServlet != null) {
-				this.websocketService = rpcProviderRegistry.addRpcImplementation(WebsocketmanagerService.class,
-						wsServlet);
-			} else {
-				LOG.error("wsServlet not provided");
-			}
-		} else {
-			LOG.error("rpcProviderRegistry not provided");
-		}
-	}
+    public WebSocketManagerProvider() {
+        LOG.info("Creating provider for {}", APPLICATION_NAME);
+    }
 
-	@Override
-	public void close() throws Exception {
-		LOG.info("Close provider for {}", APPLICATION_NAME);
-		if (websocketService != null) {
-			websocketService.close();
-		}
-	}
+    @Override
+    public void init() {
+        LOG.info("Init provider for {}", APPLICATION_NAME);
+        RpcProviderService rpcProviderRegistry = this.getRpcProviderRegistry();
+        if (rpcProviderRegistry != null) {
+            if (wsServlet != null) {
+                this.websocketService =
+                        rpcProviderRegistry.registerRpcImplementation(WebsocketmanagerService.class, wsServlet);
+                LOG.info("websocketservice initialized");
+            } else {
+                LOG.debug("wsServlet not yet provided");
+            }
+        } else {
+            LOG.error("rpcProviderRegistry not provided");
+        }
+    }
 
-	public void onUnbindService(HttpService httpService) {
-		httpService.unregister(ALIAS);
-		wsServlet = null;
-	}
+    @Override
+    public void close() throws Exception {
+        LOG.info("Close provider for {}", APPLICATION_NAME);
+        if (websocketService != null) {
+            websocketService.close();
+        }
+    }
 
-	public void onBindService(HttpService httpService) throws ServletException, NamespaceException {
-		if (httpService == null) {
-			LOG.warn("Unable to inject HttpService into DluxLoader. dlux modules won't work without httpService");
-		} else {
-		    
-			wsServlet = new WebSocketManager();
-			httpService.registerServlet(ALIAS, wsServlet, null, null);
-			LOG.info("websocket servlet registered.");
-			if(this.websocketService==null)
-				this.init();
-			else
-				LOG.info("websocketservice already initialized");
-		}
+    public void onUnbindService(HttpService httpService) {
+        httpService.unregister(ALIAS);
+        wsServlet = null;
+    }
 
-	}
+    public void onBindService(HttpService httpService) throws ServletException, NamespaceException {
+        if (httpService == null) {
+            LOG.warn("Unable to inject HttpService into DluxLoader. dlux modules won't work without httpService");
+        } else {
 
-	public WebSocketManager getWsServlet() {
-		return wsServlet;
-	}
+            if (wsServlet == null) {
+                wsServlet = new WebSocketManager();
+                httpService.registerServlet(ALIAS, wsServlet, null, null);
+                LOG.info("websocket servlet registered.");
+                if (this.websocketService == null) {
+                    this.init();
+                } else {
+                    LOG.info("websocketservice already initialized");
+                }
+            } else {
+                LOG.warn("Servelt ");
+            }
+        }
 
-	public void setWsServlet(WebSocketManager wsServlet) {
-		this.wsServlet = wsServlet;
-	}
+    }
+
+    public WebSocketManager getWsServlet() {
+        return wsServlet;
+    }
+
+    public void setWsServlet(WebSocketManager wsServlet) {
+        this.wsServlet = wsServlet;
+    }
 }
diff --git a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerSocket.java b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerSocket.java
index f445bcd..0fd2cae 100644
--- a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerSocket.java
+++ b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/WebSocketManagerSocket.java
@@ -21,7 +21,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Random;
+import java.util.Set;
 
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.WebSocketAdapter;
@@ -33,7 +35,6 @@
 public class WebSocketManagerSocket extends WebSocketAdapter {
 
     private static final Logger LOG = LoggerFactory.getLogger(WebSocketManagerSocket.class.getName());
-
     public static final String MSG_KEY_DATA = "data";
     public static final String MSG_KEY_SCOPES = "scopes";
     public static final String MSG_KEY_PARAM = "param";
@@ -87,16 +88,15 @@
 
     @Override
     public void onWebSocketText(String message) {
-        LOG.info(this.getRemoteAdr() + " has sent " + message);
+        LOG.info("{} has sent {}",this.getRemoteAdr(), message);
         if (!this.manageClientRequest(message)) {
             this.manageClientRequest2(message);
         }
-
     }
 
     @Override
     public void onWebSocketBinary(byte[] payload, int offset, int len) {
-
+        LOG.debug("Binary not supported");
     }
 
     @Override
@@ -114,7 +114,6 @@
 
     @Override
     public void onWebSocketError(Throwable cause) {
-
         LOG.debug("error caused on " + this.getRemoteAdr() + " :" + cause.getMessage());
         // super.onWebSocketError(cause);
     }
@@ -166,14 +165,14 @@
         try {
             JSONObject o = new JSONObject(request);
             if (o.has(KEY_NODENAME) && o.has(KEY_EVENTTYPE)) {
-                broadCast(o.getString(KEY_NODENAME), o.getString(KEY_EVENTTYPE), o.getString(KEY_XMLEVENT));
+                this.sendToAll(o.getString(KEY_NODENAME), o.getString(KEY_EVENTTYPE), o.getString(KEY_XMLEVENT));
             }
         } catch (Exception e) {
             LOG.warn("handle ws request failed:" + e.getMessage());
         }
     }
 
-    private void send(String msg) {
+    public void send(String msg) {
         try {
             LOG.trace("sending {}", msg);
             this.session.getRemote().sendString(msg);
@@ -181,18 +180,16 @@
             LOG.warn("problem sending message: " + e.getMessage());
         }
     }
-
-    private String getSessionId() {
+     public String getSessionId() {
         return this.myUniqueSessionId;
     }
 
-    public static void broadCast(String nodeName, String eventType, String xmlEvent) {
-        if (clientList != null && clientList.size() > 0) {
+    private void sendToAll(String nodeName, String eventType, String xmlEvent) {
+        if (clientList.size() > 0) {
             for (Map.Entry<String, WebSocketManagerSocket> entry : clientList.entrySet()) {
                 WebSocketManagerSocket socket = entry.getValue();
                 if (socket != null) {
                     try {
-
                         UserScopes clientScopes = userScopesList.get(socket.getSessionId());
                         if (clientScopes != null) {
                             if (clientScopes.hasScope(eventType)) {
@@ -212,5 +209,15 @@
             }
         }
     }
+    public static void broadCast(String nodeName, String eventType, String xmlEvent) {
+        if(clientList.size()>0) {
+            Set<Entry<String, WebSocketManagerSocket>> e = clientList.entrySet();
+            WebSocketManagerSocket s = e.iterator().next().getValue();
+            if(s!=null)
+            {
+                s.sendToAll(nodeName, eventType, xmlEvent);
+            }
+        }
+    }
 
 }
diff --git a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/websocket/SyncWebSocketClient.java b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/websocket/SyncWebSocketClient.java
index 0afe06e..fb2384e 100644
--- a/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/websocket/SyncWebSocketClient.java
+++ b/sdnr/wt/websocketmanager2/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/websocket/SyncWebSocketClient.java
@@ -19,6 +19,8 @@
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.java_websocket.client.WebSocketClient;
 import org.java_websocket.handshake.ServerHandshake;
@@ -27,33 +29,53 @@
 
 public class SyncWebSocketClient extends WebSocketClient {
 
+	public interface WebsocketEventHandler{
+		void onMessageReceived(String message);
+		void onOpen(ServerHandshake arg0);
+		void onClose(int arg0, String arg1, boolean arg2);
+		void onError(Exception e);
+	}
+	
 	private static final Logger LOG = LoggerFactory.getLogger(SyncWebSocketClient.class.getName());
 	private String messageToSend;
-
+	private final List<WebsocketEventHandler> handlers;
 	public SyncWebSocketClient(URI serverUri) {
 		super(serverUri);
+		this.handlers = new ArrayList<WebsocketEventHandler>();
 	}
 
 	public SyncWebSocketClient(String uri) throws URISyntaxException {
 		this(new URI(uri));
 	}
-
+	public void addEventHandler(WebsocketEventHandler h) {
+		this.handlers.add(h);
+	}
+	public void removeEventHandler(WebsocketEventHandler h) {
+		this.handlers.remove(h);
+	}
+	
 	@Override
 	public void onClose(int arg0, String arg1, boolean arg2) {
 		LOG.debug("socket closed: {} {} {}", arg0, arg1, arg2);
-
+		for(WebsocketEventHandler h:this.handlers) {
+			h.onClose(arg0,arg1,arg2);
+		}
 	}
 
 	@Override
 	public void onError(Exception arg0) {
 		LOG.warn("error on socket: {}", arg0.getMessage());
-
+		for(WebsocketEventHandler h:this.handlers) {
+			h.onError(arg0);
+		}
 	}
 
 	@Override
 	public void onMessage(String arg0) {
 		LOG.debug("received message: {}", arg0);
-
+		for(WebsocketEventHandler h:this.handlers) {
+			h.onMessageReceived(arg0);
+		}
 	}
 
 	@Override
@@ -64,7 +86,9 @@
 			this.send(this.messageToSend);
 			this.messageToSend = null;
 		}
-
+		for(WebsocketEventHandler h:this.handlers) {
+			h.onOpen(arg0);
+		}
 	}
 
 	public void openAndSendAsync(String message) {
diff --git a/sdnr/wt/websocketmanager2/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/wt/websocketmanager2/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
index 315921d..5e95b7b 100644
--- a/sdnr/wt/websocketmanager2/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
+++ b/sdnr/wt/websocketmanager2/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
@@ -7,9 +7,9 @@
   =================================================================================================
   Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
   in compliance with the License. You may obtain a copy of the License at
-  
+
   http://www.apache.org/licenses/LICENSE-2.0
-  
+
   Unless required by applicable law or agreed to in writing, software distributed under the License
   is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
   or implied. See the License for the specific language governing permissions and limitations under
@@ -20,30 +20,14 @@
   xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
   odl:use-default-for-reference-types="true">
 
-<!--   <bean id="wsServlet" -->
-<!--     class="org.onap.ccsdk.sdnr.wt.websocketmanager2.WebSocketManager"> -->
-<!--   </bean> -->
+  <reference id="rpcProviderRegistry" interface="org.opendaylight.mdsal.binding.api.RpcProviderService" odl:type="default" />
 
-  <reference id="rpcProviderRegistry"
-    interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"
-    odl:type="default" />
-
-  <bean id="provider"
-    class="org.onap.ccsdk.features.sdnr.wt.websocketmanager2.WebSocketManagerProvider"
-    init-method="init" destroy-method="close">
+  <bean id="provider" class="org.onap.ccsdk.features.sdnr.wt.websocketmanager2.WebSocketManagerProvider" init-method="init" destroy-method="close">
     <property name="rpcProviderRegistry" ref="rpcProviderRegistry" />
-<!--     <property name="wsServlet" ref="wsServlet" /> -->
   </bean>
 
-   <reference id="onBindService" availability="mandatory" activation="eager" interface="org.osgi.service.http.HttpService">
-      <reference-listener ref="provider" bind-method="onBindService" unbind-method="onUnbindService"/>
-    </reference>
-<!--   <service -->
-<!--     interface="org.eclipse.jetty.websocket.servlet.WebSocketServlet" -->
-<!--     ref="wsServlet"> -->
-<!--     <service-properties> -->
-<!--       <entry key="alias" value="/websocket" /> -->
-<!--     </service-properties> -->
-<!--   </service> -->
+  <reference id="onBindService" availability="mandatory" activation="eager" interface="org.osgi.service.http.HttpService">
+    <reference-listener ref="provider" bind-method="onBindService" unbind-method="onUnbindService" />
+  </reference>
 
 </blueprint>
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/AkkaConfigTest.java b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/AkkaConfigTest.java
index 217088b..2460ca4 100644
--- a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/AkkaConfigTest.java
+++ b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/AkkaConfigTest.java
@@ -54,11 +54,11 @@
         assertTrue("only one node detected",config.getClusterConfig().getSeedNodes().size()>1);
     }
 
-    private String loadResourceContentAsString(String resourceName) throws URISyntaxException, FileNotFoundException, IOException {
+    public static String loadResourceContentAsString(String resourceName) throws URISyntaxException, FileNotFoundException, IOException {
 
         StringBuilder sb = new StringBuilder();
 
-        ClassLoader classLoader = getClass().getClassLoader();
+        ClassLoader classLoader = AkkaConfigTest.class.getClassLoader();
         File file = Paths.get(classLoader.getResource(resourceName).toURI()).toFile();
         try(BufferedReader br = new BufferedReader(new FileReader(file))) {
             String line = br.readLine();
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/UserScopeTest.java b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/UserScopeTest.java
new file mode 100644
index 0000000..52eedb9
--- /dev/null
+++ b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/UserScopeTest.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.websocketmanager2.test;
+
+import static org.junit.Assert.*;
+
+import org.json.JSONArray;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.utils.UserScopes;
+
+public class UserScopeTest {
+
+    private static final String SCOPE1 ="scope1";
+    private static final String SCOPE2 ="scope2";
+    private static final String SCOPE3 ="scope3";
+    private static final String SCOPE4 ="scope4";
+
+    @Test
+    public void test() {
+        UserScopes scopes1 = new UserScopes();
+        JSONArray json1=new JSONArray();
+        json1.put(SCOPE1);
+        json1.put(SCOPE2);
+        json1.put(SCOPE3);
+        scopes1.setScopes(json1);
+
+        assertTrue(scopes1.hasScope(SCOPE1));
+        assertFalse(scopes1.hasScope(SCOPE4));
+    }
+
+}
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsockerProviderTest.java b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsockerProviderTest.java
new file mode 100644
index 0000000..57d7960
--- /dev/null
+++ b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsockerProviderTest.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.websocketmanager2.test;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.WebSocketManagerProvider;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.osgi.service.http.HttpService;
+
+public class WebsockerProviderTest extends Mockito {
+
+    @Test
+    public void test() {
+       RpcProviderService rpcProviderServiceMock = mock(RpcProviderService.class);
+        HttpService httpService = mock(HttpService.class);
+
+        try (WebSocketManagerProvider provider = new WebSocketManagerProvider();) {
+            provider.setRpcProviderRegistry(rpcProviderServiceMock);
+            provider.init();
+            provider.onBindService(httpService);
+            provider.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail(e.getMessage());
+        }
+
+    }
+
+}
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketClientTest.java b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketClientTest.java
new file mode 100644
index 0000000..f56e1a6
--- /dev/null
+++ b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketClientTest.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.websocketmanager2.test;
+
+import static org.junit.Assert.*;
+import org.java_websocket.handshake.ServerHandshake;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.websocket.SyncWebSocketClient;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.websocket.SyncWebSocketClient.WebsocketEventHandler;
+
+public class WebsocketClientTest extends Mockito {
+
+    @Test
+    public void test() {
+
+        WebsocketEventHandler clientHandlerMock = mock(WebsocketEventHandler.class);
+        ServerHandshake serverHandshakeMock = mock(ServerHandshake.class);
+
+        try {
+            SyncWebSocketClient client = new SyncWebSocketClient("url");
+
+            client.addEventHandler(clientHandlerMock);
+            client.onMessage("TestMessage");
+            client.onOpen(serverHandshakeMock);
+            client.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Exception "+e.getMessage());
+        }
+    }
+
+}
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketMessageTest.java b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketMessageTest.java
new file mode 100644
index 0000000..f769dd4
--- /dev/null
+++ b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketMessageTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================================================
+ * ONAP : ccsdk feature sdnr wt
+ * =================================================================================================
+ * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
+ * =================================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ * ============LICENSE_END==========================================================================
+ ******************************************************************************/
+package org.onap.ccsdk.features.sdnr.wt.websocketmanager2.test;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.*;
+
+import java.net.InetSocketAddress;
+
+import org.eclipse.jetty.websocket.api.Session;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.WebSocketManagerSocket;
+
+public class WebsocketMessageTest {
+
+    private static final String MSG1 = "{\"data\":\"scopes\",\"scopes\":[\"scope1\"]}";
+    private static final String MSG2 = "{}";
+    private static final String MSG3 = "{\""+WebSocketManagerSocket.KEY_NODENAME+":\"xy\","+WebSocketManagerSocket.KEY_EVENTTYPE+":\"zu\"}";
+    private static final String MSG4 = "{ Not correct messga}";
+
+    @Test
+    public void test() {
+        MyWebSocketManagerSocket socketToTest = new MyWebSocketManagerSocket();
+        Session sess = mock(Session.class);
+        InetSocketAddress remoteAdr = new InetSocketAddress("127.0.0.1", 4444);
+        when(sess.getRemoteAddress()).thenReturn(remoteAdr);
+        socketToTest.onWebSocketConnect(sess);
+        // message from client
+        socketToTest.setExpected(MSG1);
+        socketToTest.onWebSocketText(MSG1);
+        socketToTest.setExpected(MSG2);
+        socketToTest.onWebSocketText(MSG2);
+        socketToTest.setExpected(MSG3);
+        socketToTest.onWebSocketText(MSG3);
+        socketToTest.setExpected(MSG4);
+        socketToTest.onWebSocketText(MSG4);
+        socketToTest.onWebSocketClose(0, "by default");
+        sess.close();
+
+    }
+
+    private static class MyWebSocketManagerSocket extends WebSocketManagerSocket {
+
+        private String expected;
+
+        public MyWebSocketManagerSocket() {
+        }
+        void setExpected(String expected) {
+            this.expected = expected;
+        }
+
+        @Override
+        public void send(String msg) {
+            System.out.println(msg);
+            assertTrue("Expected '"+expected+"' answer '"+msg+"'", msg.contains(expected));
+        }
+
+    }
+}
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketServerConnectTest.java b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketServerConnectTest.java
index b380bec..e59c343 100644
--- a/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketServerConnectTest.java
+++ b/sdnr/wt/websocketmanager2/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/websocketmanager2/test/WebsocketServerConnectTest.java
@@ -6,9 +6,9 @@
  * =================================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
  * in compliance with the License. You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software distributed under the License
  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
  * or implied. See the License for the specific language governing permissions and limitations under
@@ -17,17 +17,84 @@
  ******************************************************************************/
 package org.onap.ccsdk.features.sdnr.wt.websocketmanager2.test;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jetty.websocket.api.WebSocketPolicy;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+import org.json.JSONObject;
 import org.junit.Test;
 import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.WebSocketManager;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.WebSocketManagerSocket;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.WebSocketManagerSocket.EventInputCallback;
+import org.onap.ccsdk.features.sdnr.wt.websocketmanager2.utils.AkkaConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
 
 public class WebsocketServerConnectTest {
 
-	@Test
-	public void test() {
+    private static final String XML1 = "<notification></notification>";
+    private static final String NODENAME = "abc";
+    private static final String EVENTTYPE = "test";
+    protected boolean responseReceived;
 
-		WebSocketManager servlet =new WebSocketManager();
+    @Test
+    public void test() {
+        responseReceived = false;
+        AkkaConfig config = null;
+        try {
+            // config = AkkaConfig.load("akka-singlenode.cfg", true);
+            config = AkkaConfig.loadContent(AkkaConfigTest.loadResourceContentAsString("akka-cluster-local.cfg"));
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("error loading singlenode config");
+        }
+        EventInputCallback callback = message -> {
+            JSONObject o = new JSONObject(message);
+            assertEquals("message which was pushed is not as expected", XML1,
+                    o.get(WebSocketManagerSocket.KEY_XMLEVENT));
+            assertEquals("nodename which was pushed is not as expected", NODENAME,
+                    o.get(WebSocketManagerSocket.KEY_NODENAME));
+            assertEquals("eventtype which was pushed is not as expected", EVENTTYPE,
+                    o.get(WebSocketManagerSocket.KEY_EVENTTYPE));
+            responseReceived = true;
+        };
+        WebSocketManager servlet = new WebSocketManager(config, callback);
+        WebsocketEventInput input = mock(WebsocketEventInput.class);
+        when(input.getXmlEvent()).thenReturn(XML1);
+        when(input.getNodeName()).thenReturn(NODENAME);
+        when(input.getEventType()).thenReturn(EVENTTYPE);
+        ListenableFuture<RpcResult<WebsocketEventOutput>> result = servlet.websocketEvent(input);
+        assertNotNull(result);
+        RpcResult<WebsocketEventOutput> rpc = null;
+        try {
+            rpc = result.get();
+        } catch (InterruptedException | ExecutionException e) {
+            fail(e.getMessage());
+        }
+        assertNotNull(rpc);
+        assertTrue("rpc result was not successful", rpc.isSuccessful());
+        assertTrue(rpc.getResult().getResponse().equals("OK"));
+        while (!responseReceived) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
 
+                e.printStackTrace();
+            }
+        }
 
+        WebSocketServletFactory factory = mock(WebSocketServletFactory.class);
+        WebSocketPolicy wspolicy = mock(WebSocketPolicy.class);
+        when(factory.getPolicy()).thenReturn(wspolicy);
+        servlet.configure(factory);
 
-	}
+    }
+
 }
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/resources/akka-cluster-local.cfg b/sdnr/wt/websocketmanager2/provider/src/test/resources/akka-cluster-local.cfg
new file mode 100644
index 0000000..465dcad
--- /dev/null
+++ b/sdnr/wt/websocketmanager2/provider/src/test/resources/akka-cluster-local.cfg
@@ -0,0 +1,49 @@
+odl-cluster-data {
+  akka {
+    remote {
+      artery {
+        enabled = off
+        canonical.hostname = "192.168.178.143"
+        canonical.port = 2550
+      }
+      netty.tcp {
+        hostname = "192.168.178.143"
+        port = 2550
+      }
+      # when under load we might trip a false positive on the failure detector
+      # transport-failure-detector {
+        # heartbeat-interval = 4 s
+        # acceptable-heartbeat-pause = 16s
+      # }
+    }
+
+    cluster {
+      # Remove ".tcp" when using artery.
+      seed-nodes = ["akka.tcp://opendaylight-cluster-data@192.168.178.142:2550",
+				"akka.tcp://opendaylight-cluster-data@192.168.178.143:2550",
+				"akka.tcp://opendaylight-cluster-data@192.168.178.144:2550",
+				"akka.tcp://opendaylight-cluster-data@192.168.178.145:2550"]
+
+      roles = ["member-2"]
+
+    }
+
+    persistence {
+      # By default the snapshots/journal directories live in KARAF_HOME. You can choose to put it somewhere else by
+      # modifying the following two properties. The directory location specified may be a relative or absolute path. 
+      # The relative path is always relative to KARAF_HOME.
+
+      # snapshot-store.local.dir = "target/snapshots"
+      # journal.leveldb.dir = "target/journal"
+
+      journal {
+        leveldb {
+          # Set native = off to use a Java-only implementation of leveldb.
+          # Note that the Java-only version is not currently considered by Akka to be production quality.
+
+          # native = off
+        }
+      }
+    }
+  }
+}
diff --git a/sdnr/wt/websocketmanager2/provider/src/test/resources/simplelogger.properties b/sdnr/wt/websocketmanager2/provider/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..6f38b50
--- /dev/null
+++ b/sdnr/wt/websocketmanager2/provider/src/test/resources/simplelogger.properties
@@ -0,0 +1,37 @@
+# SLF4J's SimpleLogger configuration file
+# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.
+
+# Default logging detail level for all instances of SimpleLogger.
+# Must be one of ("trace", "debug", "info", "warn", or "error").
+# If not specified, defaults to "info".
+org.slf4j.simpleLogger.defaultLogLevel=trace
+
+# Logging detail level for a SimpleLogger instance named "xxx.yyy.zzz".
+# Must be one of ("trace", "debug", "info", "warn", or "error").
+# If not specified, the default logging detail level is used.
+# org.slf4j.simpleLogger.log.xxx.yyy=debug
+org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager=debug
+org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Resources=info
+org.slf4j.simpleLogger.log.org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container=trace
+
+# Set to true if you want the current date and time to be included in output messages.
+# Default is false, and will output the number of milliseconds elapsed since startup.
+#org.slf4j.simpleLogger.showDateTime=false
+
+# The date and time format to be used in the output messages.
+# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
+# If the format is not specified or is invalid, the default format is used.
+# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
+#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
+
+# Set to true if you want to output the current thread name.
+# Defaults to true.
+#org.slf4j.simpleLogger.showThreadName=true
+
+# Set to true if you want the Logger instance name to be included in output messages.
+# Defaults to true.
+#org.slf4j.simpleLogger.showLogName=true
+
+# Set to true if you want the last component of the name to be included in output messages.
+# Defaults to false.
+#org.slf4j.simpleLogger.showShortLogName=false
