diff --git a/controlloop/common/msb/pom.xml b/controlloop/common/msb/pom.xml
new file mode 100644
index 0000000..9b66a11
--- /dev/null
+++ b/controlloop/common/msb/pom.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+    <parent>
+        <artifactId>model-impl</artifactId>
+        <groupId>org.onap.policy.drools-applications</groupId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>msb</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.msb.java-sdk</groupId>
+            <artifactId>msb-java-sdk</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-module-junit4</artifactId>
+            <version>1.6.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-mockito</artifactId>
+            <version>1.6.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.2.3</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceException.java b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceException.java
new file mode 100644
index 0000000..f5bbdb5
--- /dev/null
+++ b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceException.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright 2017 ZTE, Inc. and others.
+ *
+ * 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.
+ ******************************************************************************/
+
+package org.onap.policy.msb.client;
+
+public class MSBServiceException extends Exception {
+
+	public MSBServiceException() {
+		super();
+	}
+
+	public MSBServiceException(String message, Throwable cause, boolean enableSuppression,
+                               boolean writableStackTrace) {
+		super(message, cause, enableSuppression, writableStackTrace);
+	}
+
+	public MSBServiceException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+	public MSBServiceException(String message) {
+		super(message);
+	}
+
+	public MSBServiceException(Throwable cause) {
+		super(cause);
+	}
+
+}
diff --git a/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceFactory.java b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceFactory.java
new file mode 100644
index 0000000..cc3ff71
--- /dev/null
+++ b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceFactory.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright 2017 ZTE, Inc. and others.
+ *
+ * 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.
+ ******************************************************************************/
+package org.onap.policy.msb.client;
+
+import org.onap.msb.sdk.discovery.common.RouteException;
+import org.onap.msb.sdk.discovery.entity.MicroServiceFullInfo;
+import org.onap.msb.sdk.discovery.entity.NodeInfo;
+import org.onap.msb.sdk.httpclient.msb.MSBServiceClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Iterator;
+import java.util.Properties;
+
+
+public class MSBServiceFactory {
+    private static final Logger logger = LoggerFactory.getLogger(MSBServiceFactory.class);
+    private static final String msbPropertyFile = "msb.policy.properties";
+    private static final String MSB_IP = "msb.ip";
+    private static final String MSB_PORT = "msb.port";
+    private MSBServiceClient msbClient;
+    private Properties properties;
+
+    public MSBServiceFactory() throws MSBServiceException,IOException{
+        this.init();
+        this.msbClient = new MSBServiceClient(properties.getProperty(MSB_IP), Integer.parseInt(properties.getProperty(MSB_PORT)));
+    }
+    public MSBServiceFactory (MSBServiceClient msbClient) {
+        this.msbClient = msbClient;
+    }
+
+    private void init() throws MSBServiceException,IOException  {
+        properties = new Properties();
+        Path file = Paths.get(System.getProperty(msbPropertyFile));
+        if (file == null) {
+            throw new MSBServiceException("No msb.policy.properties specified.");
+        }
+        if (Files.notExists(file)) {
+            throw new MSBServiceException("No msb.policy.properties specified.");
+        }
+
+        if (Files.isReadable(file) == false) {
+            throw new MSBServiceException ("Repository is NOT readable: " + file.toAbsolutePath());
+        }
+        try(InputStream is = new FileInputStream(file.toFile())){
+            properties.load(is);
+        }
+    }
+
+
+    public Node getNode(String serviceName,String version){
+        return this.build(serviceName,version);
+    }
+
+    public Node getNode(String actor){
+        Node node = null;
+        switch (actor) {
+            case "AAI":
+                node = this.build("aai-search","v11");
+                return node;
+            case "SO":
+                node = this.build("so","v2");
+                return node;
+            case "VFC":
+                node = this.build("nfvo-nslcm","v1");
+                return node;
+            default:
+                logger.info("MSBServiceManager: policy has an unknown actor.");
+        }
+        return node;
+    }
+
+    private Node build(String serviceName,String version){
+        Node node = new Node();
+        node.setName(serviceName);
+        try {
+            MicroServiceFullInfo serviceInfo = msbClient.queryMicroServiceInfo(serviceName,version);
+            Iterator iterator = serviceInfo.getNodes().iterator();
+            while(iterator.hasNext()) {
+                NodeInfo nodeInfo = (NodeInfo)iterator.next();
+                node.setIp(nodeInfo.getIp());
+                node.setPort(nodeInfo.getPort());
+            }
+        } catch (RouteException e) {
+            logger.info("MSBServiceManager:",e);
+        }
+        return node;
+    }
+}
diff --git a/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceManager.java b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceManager.java
new file mode 100644
index 0000000..cbff8d8
--- /dev/null
+++ b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/MSBServiceManager.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright 2017 ZTE, Inc. and others.
+ *
+ * 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.
+ ******************************************************************************/
+package org.onap.policy.msb.client;
+
+import org.onap.msb.sdk.httpclient.msb.MSBServiceClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+public class MSBServiceManager implements Serializable {
+    private static final Logger logger = LoggerFactory.getLogger(MSBServiceManager.class);
+    private static final long serialVersionUID = -2517971308551895215L;
+    private MSBServiceFactory factory;
+
+    public MSBServiceManager() throws MSBServiceException,IOException {
+        this.factory = new MSBServiceFactory();
+    }
+
+    public MSBServiceManager(MSBServiceClient msbClient){
+
+        this.factory = new MSBServiceFactory(msbClient);
+    }
+
+    /**
+     * Get the IP and port of the components registered in the MSB
+     * @param actor  AAI or SO or VFC
+     * @return
+     */
+    public Node getNode(String actor){
+
+        return factory.getNode(actor);
+    }
+
+    /**
+     * Get the IP and port of the components registered in the MSB
+     * @param serviceName  the service name registered in the MSB
+     * @param version the service version registered in the MSB
+     * @return
+     */
+    public Node getNode(String serviceName,String version){
+
+        return factory.getNode(serviceName,version);
+    }
+
+}
diff --git a/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/Node.java b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/Node.java
new file mode 100644
index 0000000..5c06939
--- /dev/null
+++ b/controlloop/common/msb/src/main/java/org/onap/policy/msb/client/Node.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright 2017 ZTE, Inc. and others.
+ *
+ * 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.
+ ******************************************************************************/
+package org.onap.policy.msb.client;
+
+import java.io.Serializable;
+
+public class Node implements Serializable {
+    private static final long serialVersionUID = -5028618045561310837L;
+    private String name;
+    private String ip;
+    private String port;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public String getPort() {
+        return port;
+    }
+
+    public void setPort(String port) {
+        this.port = port;
+    }
+
+    @Override
+    public String toString() {
+        return "Node{" +
+                "name='" + name + '\'' +
+                ", ip='" + ip + '\'' +
+                ", port='" + port + '\'' +
+                '}';
+    }
+}
diff --git a/controlloop/common/msb/src/main/resources/msb.policy.properties b/controlloop/common/msb/src/main/resources/msb.policy.properties
new file mode 100644
index 0000000..bb372ec
--- /dev/null
+++ b/controlloop/common/msb/src/main/resources/msb.policy.properties
@@ -0,0 +1,22 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP-PDP
+# ================================================================================
+# Copyright (C) 2017 AT&T 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=========================================================
+###
+
+msb.ip=127.0.0.1
+msb.port=10081
\ No newline at end of file
diff --git a/controlloop/common/msb/src/test/java/org/onap/policy/msb/client/MSBServiceManagerTest.java b/controlloop/common/msb/src/test/java/org/onap/policy/msb/client/MSBServiceManagerTest.java
new file mode 100644
index 0000000..9ab54f7
--- /dev/null
+++ b/controlloop/common/msb/src/test/java/org/onap/policy/msb/client/MSBServiceManagerTest.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright 2017 ZTE, Inc. and others.
+ *
+ * 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.
+ ******************************************************************************/
+package org.onap.policy.msb.client;
+
+import org.junit.*;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.msb.sdk.discovery.common.RouteException;
+import org.onap.msb.sdk.discovery.entity.MicroServiceFullInfo;
+import org.onap.msb.sdk.discovery.entity.NodeInfo;
+import org.onap.msb.sdk.httpclient.msb.MSBServiceClient;
+import org.onap.policy.msb.client.MSBServiceManager;
+import org.onap.policy.msb.client.Node;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
+public class MSBServiceManagerTest {
+    @Mock
+    private MSBServiceClient msbClient;
+
+    private MSBServiceManager msbManager;
+
+    public MSBServiceManagerTest(){}
+
+    @BeforeClass
+    public static void setUpClass(){}
+
+    @AfterClass
+    public static void tearDownClass(){}
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        msbManager = new MSBServiceManager(msbClient);
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+    @Test
+    public void testByActor () throws RouteException,UnknownHostException {
+        MicroServiceFullInfo serviceInfo = this.build(InetAddress.getLocalHost().getHostAddress(),"8843");
+        when(msbClient.queryMicroServiceInfo("aai-search","v11")).thenReturn(serviceInfo);
+        Node node = msbManager.getNode("AAI");
+        assertNotNull(node);
+        serviceInfo = this.build(InetAddress.getLocalHost().getHostAddress(),"8840");
+        when(msbClient.queryMicroServiceInfo("so","v2")).thenReturn(serviceInfo);
+        node = msbManager.getNode("SO");
+        assertNotNull(node);
+
+        serviceInfo = this.build(InetAddress.getLocalHost().getHostAddress(),"8082");
+        when(msbClient.queryMicroServiceInfo("nfvo-nslcm","v1")).thenReturn(serviceInfo);
+        node = msbManager.getNode("VFC");
+        assertNotNull(node);
+
+    }
+
+    @Test
+    public void testByActor_when_actorNotExist_returnNull () throws RouteException,UnknownHostException {
+        MicroServiceFullInfo serviceInfo = this.build(InetAddress.getLocalHost().getHostAddress(),"8843");
+        when(msbClient.queryMicroServiceInfo("aai-search","v11")).thenReturn(serviceInfo);
+        Node node = msbManager.getNode("DDD");
+        assertNull(node);
+    }
+
+    @Test
+    public void testByServiceNameAndVersion () throws RouteException,UnknownHostException {
+        MicroServiceFullInfo serviceInfo = this.build(InetAddress.getLocalHost().getHostAddress(),"8843");
+        when(msbClient.queryMicroServiceInfo("aai-search","v11")).thenReturn(serviceInfo);
+        Node node = msbManager.getNode("aai-search","v11");
+        assertNotNull(node);
+    }
+
+    @Test
+    public void testByServiceNameAndVersion_when_serice_notRegistedToMSB () throws RouteException,UnknownHostException {
+        MicroServiceFullInfo serviceInfo = this.build(InetAddress.getLocalHost().getHostAddress(),"8843");
+        when(msbClient.queryMicroServiceInfo("aai-search","v11")).thenThrow(new RouteException());
+        Node node = msbManager.getNode("aai-search","v11");
+        assertNotNull(node);
+        assertTrue(node.getName() == "aai-search");
+        assertTrue(node.getIp() == null);
+        assertTrue(node.getPort() == null);
+    }
+
+    public static MicroServiceFullInfo build(String ip,String port){
+        MicroServiceFullInfo serviceInfo = new MicroServiceFullInfo();
+        Set<NodeInfo> nodes = new HashSet<NodeInfo>();
+        NodeInfo node= new NodeInfo();
+        node.setPort(port);
+        node.setIp(ip);
+        nodes.add(node);
+        serviceInfo.setNodes(nodes);
+        return serviceInfo;
+    }
+
+}
diff --git a/controlloop/common/pom.xml b/controlloop/common/pom.xml
index 39f1b70..8725d79 100644
--- a/controlloop/common/pom.xml
+++ b/controlloop/common/pom.xml
@@ -40,6 +40,7 @@
     	<module>policy-yaml</module>
     	<module>simulators</module>
     	<module>feature-controlloop-utils</module>
+		<module>msb</module>
     </modules>
 
 
