Populate seed code

Add seed code for sli/core repository

Issue: CCSDK-6
Change-Id: Iaeb54c6135a94a6ffec0c7fd96505d72d18aeb00
Signed-off-by: Dan Timoney <dtimoney@att.com>
diff --git a/sliPluginUtils/.gitignore b/sliPluginUtils/.gitignore
new file mode 100755
index 0000000..b73caf3
--- /dev/null
+++ b/sliPluginUtils/.gitignore
@@ -0,0 +1,34 @@
+#####standard .git ignore entries#####
+
+## IDE Specific Files ##
+org.eclipse.core.resources.prefs
+.classpath
+.project
+.settings
+.idea
+.externalToolBuilders
+maven-eclipse.xml
+workspace
+
+## Compilation Files ##
+*.class
+**/target
+target
+target-ide
+MANIFEST.MF
+
+## Misc Ignores (OS specific etc) ##
+bin/
+dist
+*~
+*.ipr
+*.iml
+*.iws
+classes
+out/
+.DS_STORE
+.metadata
+
+## Folders which contain auto generated source code ##
+yang-gen-config
+yang-gen-sal
diff --git a/sliPluginUtils/.sonar/checkstyle.xml b/sliPluginUtils/.sonar/checkstyle.xml
new file mode 100755
index 0000000..3fa2315
--- /dev/null
+++ b/sliPluginUtils/.sonar/checkstyle.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.2//EN" "http://www.puppycrawl.com/dtds/configuration_1_2.dtd"><!-- Generated by Sonar --><module name="Checker"><module name="SuppressionCommentFilter"/><module name="TreeWalker"><module name="FileContentsHolder"/> <module name="ClassFanOutComplexity"><property name="severity" value="warning"/></module><module name="NestedForDepth"><property name="severity" value="warning"/><property name="max" value="1"/></module><module name="ClassDataAbstractionCoupling"><property name="severity" value="warning"/></module></module></module>
\ No newline at end of file
diff --git a/sliPluginUtils/.sonar/pmd.xml b/sliPluginUtils/.sonar/pmd.xml
new file mode 100755
index 0000000..80343b3
--- /dev/null
+++ b/sliPluginUtils/.sonar/pmd.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<ruleset>

+  <rule ref="rulesets/java/naming.xml/BooleanGetMethodName">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/j2ee.xml/StaticEJBFieldShouldBeFinal">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/coupling.xml/CouplingBetweenObjects">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/codesize.xml/TooManyMethods">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingTypeName">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/basic.xml/DoubleCheckedLocking">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingMethodName">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/coupling.xml/ExcessiveImports">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/basic.xml/OverrideBothEqualsAndHashcode">

+    <priority>2</priority>

+  </rule>

+  <rule ref="rulesets/java/naming.xml/ShortMethodName">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/basic.xml/BooleanInstantiation">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/codesize.xml/TooManyFields">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/controversial.xml/AvoidUsingNativeCode">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/optimizations.xml/UseStringBufferForStringAppends">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/coupling.xml/LooseCoupling">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/design.xml/NonThreadSafeSingleton">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/j2ee.xml/DoNotUseThreads">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/sunsecure.xml/ArrayIsStoredDirectly">

+    <priority>5</priority>

+  </rule>

+  <rule ref="rulesets/java/sunsecure.xml/MethodReturnsInternalArray">

+    <priority>2</priority>

+  </rule>

+  <rule ref="rulesets/java/design.xml/AssignmentToNonFinalStatic">

+    <priority>3</priority>

+  </rule>

+  <rule ref="rulesets/java/strictexception.xml/AvoidCatchingGenericException">

+    <priority>3</priority>

+  </rule>

+</ruleset>

+

diff --git a/sliPluginUtils/features/pom.xml b/sliPluginUtils/features/pom.xml
new file mode 100755
index 0000000..9d18917
--- /dev/null
+++ b/sliPluginUtils/features/pom.xml
@@ -0,0 +1,127 @@
+<?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">
+
+	<artifactId>sliPluginUtils-features</artifactId>
+	<packaging>jar</packaging>
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<artifactId>sliPluginUtils</artifactId>
+		<groupId>org.openecomp.sdnc.core</groupId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+
+	<name>SliPluginUtils Plugin - Features</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.openecomp.sdnc.core</groupId>
+			<artifactId>sliPluginUtils-provider</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.6</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.opendaylight.mdsal</groupId>
+			<artifactId>features-mdsal</artifactId>
+			<version>${odl.mdsal.features.version}</version>
+			<classifier>features</classifier>
+			<type>xml</type>
+			<scope>runtime</scope>
+		</dependency>
+		<!-- dependency for opendaylight-karaf-empty for use by testing -->
+		<dependency>
+			<groupId>org.opendaylight.odlparent</groupId>
+			<artifactId>opendaylight-karaf-empty</artifactId>
+			<version>${odl.karaf.empty.distro.version}</version>
+			<type>zip</type>
+		</dependency>
+		<dependency>
+			<!-- Required for launching the feature tests -->
+			<groupId>org.opendaylight.odlparent</groupId>
+			<artifactId>features-test</artifactId>
+			<version>${odl.commons.opendaylight.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.opendaylight.yangtools</groupId>
+			<artifactId>features-yangtools</artifactId>
+			<version>${odl.yangtools.version}</version>
+			<classifier>features</classifier>
+			<type>xml</type>
+			<scope>runtime</scope>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<resources>
+			<resource>
+				<filtering>true</filtering>
+				<directory>src/main/resources</directory>
+			</resource>
+		</resources>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-resources-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>filter</id>
+						<goals>
+							<goal>resources</goal>
+						</goals>
+						<phase>generate-resources</phase>
+					</execution>
+				</executions>
+			</plugin>
+
+					<!-- launches the feature test, which validates that your karaf feature
+					can be installed inside of a karaf container. It doesn't validate that your
+					functionality works correctly, just that you have all of the dependent bundles
+					defined correctly.
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>2.16</version>
+				<configuration>
+					<systemPropertyVariables>
+						<karaf.distro.groupId>org.opendaylight.odlparent</karaf.distro.groupId>
+						<karaf.distro.artifactId>opendaylight-karaf-empty</karaf.distro.artifactId>
+						<karaf.distro.version>${odl.karaf.empty.distro.version}</karaf.distro.version>
+					</systemPropertyVariables>
+					<dependenciesToScan>
+						<dependency>org.opendaylight.yangtools:features-test</dependency>
+					</dependenciesToScan>
+				</configuration>
+			</plugin>
+			-->
+
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>build-helper-maven-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>attach-artifacts</id>
+						<goals>
+							<goal>attach-artifact</goal>
+						</goals>
+						<phase>package</phase>
+						<configuration>
+							<artifacts>
+								<artifact>
+									<file>${project.build.directory}/classes/${features.file}</file>
+									<type>xml</type>
+									<classifier>features</classifier>
+								</artifact>
+							</artifacts>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/sliPluginUtils/features/src/main/resources/features.xml b/sliPluginUtils/features/src/main/resources/features.xml
new file mode 100644
index 0000000..c7dca2e
--- /dev/null
+++ b/sliPluginUtils/features/src/main/resources/features.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  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=========================================================
+  -->
+
+
+<features name="sdnc-sliPluginUtils-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
+
+    <repository>mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features</repository>
+
+
+    <feature name='sdnc-sliPluginUtils' description="sdnc-sliPluginUtils" version='${project.version}'>
+        <!-- Most applications will have a dependency on the ODL MD-SAL Broker -->
+        <feature version="${odl.mdsal.version}">odl-mdsal-broker</feature>
+        <feature>sdnc-sli</feature>
+        <bundle>mvn:org.openecomp.sdnc.core/sliPluginUtils-provider/${project.version}</bundle>
+        <bundle>mvn:mysql/mysql-connector-java/${mysql.connector.version}</bundle>
+    </feature>
+
+</features>
diff --git a/sliPluginUtils/installer/pom.xml b/sliPluginUtils/installer/pom.xml
new file mode 100755
index 0000000..6520867
--- /dev/null
+++ b/sliPluginUtils/installer/pom.xml
@@ -0,0 +1,138 @@
+<?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">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>sliPluginUtils</artifactId>
+		<groupId>org.openecomp.sdnc.core</groupId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<artifactId>sliPluginUtils-installer</artifactId>
+	<name>SLI Plugin Utilities - Karaf  Installer</name>
+	<packaging>pom</packaging>
+
+	<properties>
+		<application.name>sdnc-sliPluginUtils</application.name>
+		<features.boot>sdnc-sliPluginUtils</features.boot>
+		<features.repositories>mvn:org.openecomp.sdnc.core/sliPluginUtils-features/${project.version}/xml/features</features.repositories>
+		<include.transitive.dependencies>false</include.transitive.dependencies>
+	</properties>
+
+	<dependencies>
+
+		<dependency>
+			<groupId>org.openecomp.sdnc.core</groupId>
+			<artifactId>sliPluginUtils-features</artifactId>
+			<version>${project.version}</version>
+			<classifier>features</classifier>
+			<type>xml</type>
+			<exclusions>
+				<exclusion>
+					<groupId>*</groupId>
+					<artifactId>*</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<dependency>
+			<groupId>org.openecomp.sdnc.core</groupId>
+			<artifactId>sliPluginUtils-provider</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+
+
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>maven-repo-zip</id>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<phase>package</phase>
+						<configuration>
+							<attach>false</attach>
+							<finalName>stage/${application.name}-${project.version}</finalName>
+							<descriptors>
+								<descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor>
+							</descriptors>
+							<appendAssemblyId>false</appendAssemblyId>
+						</configuration>
+					</execution>
+					<execution>
+						<id>installer-zip</id>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<phase>package</phase>
+						<configuration>
+							<attach>true</attach>
+							<finalName>${application.name}-${project.version}-installer</finalName>
+							<descriptors>
+								<descriptor>src/assembly/assemble_installer_zip.xml</descriptor>
+							</descriptors>
+							<appendAssemblyId>false</appendAssemblyId>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<phase>prepare-package</phase>
+						<configuration>
+							<transitive>false</transitive>
+							<outputDirectory>${project.build.directory}/assembly/system</outputDirectory>
+							<overWriteReleases>false</overWriteReleases>
+							<overWriteSnapshots>true</overWriteSnapshots>
+							<overWriteIfNewer>true</overWriteIfNewer>
+							<useRepositoryLayout>true</useRepositoryLayout>
+							<addParentPoms>false</addParentPoms>
+							<copyPom>false</copyPom>
+							<includeGroupIds>org.openecomp.sdnc</includeGroupIds>
+							<excludeArtifactIds>sli-common,sli-provider,dblib-provider</excludeArtifactIds>
+							<scope>provided</scope>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-resources-plugin</artifactId>
+				<version>2.6</version>
+				<executions>
+					<execution>
+						<id>copy-version</id>
+						<goals>
+							<goal>copy-resources</goal>
+						</goals><!-- here the phase you need -->
+						<phase>validate</phase>
+						<configuration>
+							<outputDirectory>${basedir}/target/stage</outputDirectory>
+							<resources>
+								<resource>
+									<directory>src/main/resources/scripts</directory>
+									<includes>
+										<include>install-feature.sh</include>
+									</includes>
+									<filtering>true</filtering>
+								</resource>
+							</resources>
+						</configuration>
+					</execution>
+
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+
+</project>
diff --git a/sliPluginUtils/installer/src/assembly/assemble_installer_zip.xml b/sliPluginUtils/installer/src/assembly/assemble_installer_zip.xml
new file mode 100644
index 0000000..85e2e1e
--- /dev/null
+++ b/sliPluginUtils/installer/src/assembly/assemble_installer_zip.xml
@@ -0,0 +1,59 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  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=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>bin</id>
+	<formats>
+		<format>zip</format>
+	</formats>
+
+	<!--  we want "system" and related files right at the root level
+		  as this file is suppose to be unzip on top of a karaf
+		  distro. -->
+	<includeBaseDirectory>false</includeBaseDirectory>
+
+	<fileSets>
+		<fileSet>
+			<directory>target/stage/</directory>
+			<outputDirectory>${application.name}</outputDirectory>
+			<fileMode>755</fileMode>
+			<includes>
+				<include>*.sh</include>
+			</includes>
+		</fileSet>
+		<fileSet>
+			<directory>target/stage/</directory>
+			<outputDirectory>${application.name}</outputDirectory>
+			<fileMode>644</fileMode>
+			<excludes>
+				<exclude>*.sh</exclude>
+			</excludes>
+		</fileSet>
+	</fileSets>
+
+
+
+</assembly>
diff --git a/sliPluginUtils/installer/src/assembly/assemble_mvnrepo_zip.xml b/sliPluginUtils/installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644
index 0000000..bf7805f
--- /dev/null
+++ b/sliPluginUtils/installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -0,0 +1,49 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  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=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>bin</id>
+	<formats>
+		<format>zip</format>
+	</formats>
+
+	<!--  we want "system" and related files right at the root level
+		  as this file is suppose to be unzip on top of a karaf
+		  distro. -->
+	<includeBaseDirectory>false</includeBaseDirectory>
+
+	<fileSets>
+		<fileSet>
+			<directory>target/assembly/</directory>
+			<outputDirectory>.</outputDirectory>
+			<excludes>
+			</excludes>
+		</fileSet>
+	</fileSets>
+
+
+
+</assembly>
diff --git a/sliPluginUtils/installer/src/main/resources/scripts/install-feature.sh b/sliPluginUtils/installer/src/main/resources/scripts/install-feature.sh
new file mode 100644
index 0000000..93236c5
--- /dev/null
+++ b/sliPluginUtils/installer/src/main/resources/scripts/install-feature.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# openECOMP : SDN-C
+# ================================================================================
+# 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=========================================================
+###
+
+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
+ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
+ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"}
+INSTALLERDIR=$(dirname $0)
+
+REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip
+
+if [ -f ${REPOZIP} ]
+then
+	unzip -d ${ODL_HOME} ${REPOZIP}
+else
+	echo "ERROR : repo zip ($REPOZIP) not found"
+	exit 1
+fi
+
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories}
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot}
diff --git a/sliPluginUtils/pom.xml b/sliPluginUtils/pom.xml
new file mode 100755
index 0000000..a14b41f
--- /dev/null
+++ b/sliPluginUtils/pom.xml
@@ -0,0 +1,41 @@
+<?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/maven-v4_0_0.xsd">
+
+	<groupId>org.openecomp.sdnc.core</groupId>
+	<artifactId>sliPluginUtils</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>pom</packaging>
+	<modelVersion>4.0.0</modelVersion>
+
+
+	<parent>
+		<groupId>org.openecomp.sdnc.core</groupId>
+		<artifactId>sdnc-core</artifactId>
+        	<version>0.0.1-SNAPSHOT</version>
+	</parent>
+	<name>Service Logic Interface Plugin Utilities</name>
+	<description>A package of static utility functions to be used when developing SLI plugins</description>
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.openecomp.sdnc.core</groupId>
+				<artifactId>SliPluginUtils-features</artifactId>
+				<classifier>features</classifier>
+				<type>xml</type>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.openecomp.sdnc.core</groupId>
+				<artifactId>SliPluginUtils-provider</artifactId>
+				<version>${project.version}</version>
+				</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<modules>
+		<module>provider</module>
+		<module>features</module>
+		<module>installer</module>
+	</modules>
+</project>
diff --git a/sliPluginUtils/provider/pom.xml b/sliPluginUtils/provider/pom.xml
new file mode 100755
index 0000000..cad7a0b
--- /dev/null
+++ b/sliPluginUtils/provider/pom.xml
@@ -0,0 +1,85 @@
+<?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">
+
+	<artifactId>sliPluginUtils-provider</artifactId>
+	<packaging>bundle</packaging>
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.openecomp.sdnc.core</groupId>
+		<artifactId>sliPluginUtils</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+
+	<name>SliPluginUtils Plugin - Provider</name>
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.11</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.openecomp.sdnc.core</groupId>
+			<artifactId>sli-common</artifactId>
+			<version>${project.version}</version>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>equinoxSDK381</groupId>
+			<artifactId>org.eclipse.osgi</artifactId>
+			<version>${equinox.osgi.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>${slf4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jcl-over-slf4j</artifactId>
+			<version>${slf4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+			<version>1.3</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<plugins>
+
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<version>${bundle.plugin.version}</version>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Bundle-SymbolicName>org.openecomp.sdnc.sli.SliPluginUtils</Bundle-SymbolicName>
+						<Bundle-Activator>org.openecomp.sdnc.sli.SliPluginUtils.SliPluginUtilsActivator</Bundle-Activator>
+						<Export-Package>org.openecomp.sdnc.sli.SliPluginUtils</Export-Package>
+						<Import-Package>org.openecomp.sdnc.*,org.osgi.framework.*,org.slf4j.*,java.net.*</Import-Package>
+						<Embed-Dependency>*;scope=compile|runtime;artifactId=!sli-common|org.eclipse.osgi|mysql-connector-java|slf4j-api|jcl-over-slf4j</Embed-Dependency>
+						<Embed-Transitive>true</Embed-Transitive>
+					</instructions>
+				</configuration>
+			</plugin>
+
+		</plugins>
+
+	</build>
+</project>
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java
new file mode 100644
index 0000000..3961271
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/DME2.java
@@ -0,0 +1,111 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import java.util.Map;
+
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+
+/**
+ * A SvcLogicJavaPlugin that generates DME2 proxy urls using parameters from context memory.
+ */
+public class DME2 implements SvcLogicJavaPlugin {
+    String aafUserName;
+    String aafPassword;
+    String envContext;
+    String routeOffer;
+    String[] proxyUrls;
+    Integer index;
+    String commonServiceVersion;
+    String partner;
+
+    private static final Logger LOG = LoggerFactory.getLogger(DME2.class);
+
+    public void setPartner(String partner) {
+        if (partner != null && partner.length() > 0) {
+            this.partner = partner;
+        }
+    }
+
+    public DME2(String aafUserName, String aafPassword, String envContext, String routeOffer, String[] proxyUrls, String commonServiceVersion) {
+        this.aafUserName = aafUserName;
+        this.aafPassword = aafPassword;
+        this.envContext = envContext;
+        this.routeOffer = routeOffer;
+        this.proxyUrls = proxyUrls;
+        this.index = 0;
+        this.commonServiceVersion = commonServiceVersion;
+    }
+
+    // constructs a URL to contact the proxy which contacts a DME2 service
+    public String constructUrl(String service, String version, String subContext) {
+        StringBuilder sb = new StringBuilder();
+
+        // The hostname is assigned in a round robin fashion
+        sb.append(acquireHostName());
+        sb.append("/service=" + service);
+
+        //If the directedGraph passes an explicit version use that, if not use the commonServiceVersion found in the properties file
+        if (version == null) {
+            version = this.commonServiceVersion;
+        }
+        sb.append("/version=" + version);
+
+        sb.append("/envContext=" + this.envContext);
+        if (this.routeOffer != null && this.routeOffer.length() > 0) {
+            sb.append("/routeOffer=" + this.routeOffer);
+        }
+        if (subContext != null && subContext.length() > 0) {
+            sb.append("/subContext=" + subContext);
+        }
+        sb.append("?dme2.password=" + this.aafPassword);
+        sb.append("&dme2.username=" + this.aafUserName);
+        if (this.partner != null) {
+            sb.append("&dme2.partner=" + this.partner);
+        }
+        sb.append("&dme2.allowhttpcode=true");
+        return (sb.toString());
+    }
+
+    public synchronized String acquireHostName() {
+        String retVal = proxyUrls[index];
+        index++;
+        if (index == this.proxyUrls.length) {
+            index = 0;
+        }
+        return retVal;
+    }
+
+    // Node entry point
+    public void constructUrl(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[] { "service", "outputPath" }, LOG);
+        String completeProxyUrl = constructUrl(parameters.get("service"), parameters.get("version"), parameters.get("subContext"));
+        ctx.setAttribute(parameters.get("outputPath"), completeProxyUrl);
+    }
+
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils.java
new file mode 100644
index 0000000..c73315f
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils.java
@@ -0,0 +1,754 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A utility class used to streamline the interface between Java plugins,
+ * the Service Logic Context, and Directed Graphs.
+ * @version 7.0.1
+ * @see org.openecomp.sdnc.sli.SvcLogicContext
+ */
+public class SliPluginUtils implements SvcLogicJavaPlugin {
+	public enum LogLevel {
+		TRACE, DEBUG, INFO, WARN, ERROR;
+	}
+
+	private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils.class);
+
+
+	// ========== CONSTRUCTORS ==========
+
+	public SliPluginUtils() {}
+
+	public SliPluginUtils( Properties props ) {}
+
+
+
+	// ========== CONTEXT MEMORY FUNCTIONS ==========
+
+	/**
+	 * Removes 1 or more elements from a list in context memory.
+	 * <p>
+	 * Values are removed based on either the index in the list, a key-value
+	 * pair, or a list of key-value pairs that all must match in the element.
+	 * @param parameters
+	 * @param ctx Reference to context memory
+	 * @throws SvcLogicException All exceptions are wrapped in
+	 * SvcLogicException for compatibility with SLI.
+	 * @since 7.0.1
+	 */
+	public void ctxListRemove( Map<String,String> parameters, SvcLogicContext ctx ) throws SvcLogicException {
+		try{
+			LOG.debug( "ENTERING Execute Node \"ctxListRemove\"" );
+
+			// Validate, Log, & read parameters
+			checkParameters(parameters, new String[]{"list_pfx"}, LOG);
+			logExecuteNodeParameters(parameters, LOG, LogLevel.DEBUG);
+			String list_pfx = parameters.get("list_pfx");
+			String param_index = parameters.get("index");
+			String param_key = parameters.get("key");
+			String param_value = parameters.get("value");
+			String param_keys_length = parameters.get("keys_length");
+
+			// Initialize context memory list mimic
+			SvcLogicContextList list;
+
+			// Process based on input parameters:
+			//   index: remove object at specific index
+			//   key & value: remove all objects with key-value pair
+			//   keys_length: remove all objects that match all key-value pairs
+			//                in list
+			if( param_index != null ) {
+				// Parse index
+				LOG.trace("executing remove by index logic");
+				int index;
+				try {
+					index = Integer.parseInt(param_index);
+				}
+				catch( NumberFormatException e ) {
+					throw new IllegalArgumentException("\"index\" parameter is not a number. index = " + param_index, e);
+				}
+
+				// Extract list from context memory & remove object @ index
+				LOG.trace("extracting list from context memory");
+				list = SvcLogicContextList.extract(ctx, list_pfx);
+				LOG.trace("removing elements from list");
+				list.remove(index);
+			}
+			else if( param_value != null ) {
+				if( param_key == null ) { param_key = ""; }
+
+				// Extract list from context memory & remove objects with
+				// key-value pair
+				LOG.trace("executing remove by key-value pair logic");
+				LOG.trace("extracting list from context memory");
+				list = SvcLogicContextList.extract(ctx, list_pfx);
+				LOG.trace("removing elements from list");
+				list.remove( param_key, param_value );
+			}
+			else if( param_keys_length != null ) {
+				// Parse keys_length
+				LOG.trace("executing remove by key-value pair list logic");
+				int keys_length;
+				try {
+					keys_length = Integer.parseInt(param_keys_length);
+				}
+				catch( NumberFormatException e ) {
+					throw new IllegalArgumentException("\"keys_length\" parameters is not a number. keys_length = " + param_keys_length, e);
+				}
+
+				// Obtain key-value pairs to check from parameters
+				LOG.trace("reading keys parameter list");
+				HashMap<String,String> keys_values = new HashMap<String,String>();
+				for( int i = 0; i < keys_length; i++ ) {
+					keys_values.put(parameters.get("keys[" + i + "].key"), parameters.get("keys[" + i + "].value"));
+				}
+
+				// Extract list from context memory & remove objects with all
+				// key-value pairs matching
+				LOG.trace("extracting list from context memory");
+				list = SvcLogicContextList.extract(ctx, list_pfx);
+				LOG.trace("removing elements from list");
+				list.remove(keys_values);
+			}
+			else {
+				throw new IllegalArgumentException("Required parameters missing. Requires one of: index, key & value, or keys_length array");
+			}
+
+			// Remove index from list
+			LOG.trace("writing list back into context memory");
+			list.writeToContext(ctx);
+		}
+		catch( Exception e ) {
+			throw new SvcLogicException( "An error occurred in the ctxListRemove Execute node", e );
+		}
+		finally {
+			LOG.debug( "EXITING Execute Node \"ctxListRemove\"" );
+		}
+	}
+
+    /**
+     * ctxSortList
+     * @param parameters - the set of required parameters must contain list and delimiter.
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException if a required parameter is missing an exception is thrown
+     */
+	public void ctxSortList( Map<String, String> parameters, SvcLogicContext ctx ) throws SvcLogicException {
+		checkParameters(parameters, new String[]{"list","delimiter"}, LOG);
+		ArrayList<SortableCtxListElement> list = new ArrayList<SortableCtxListElement>();
+
+		String[] sort_fields = null;
+		if( parameters.containsKey("sort-fields") ) {
+			sort_fields = parameters.get("sort-fields").split(parameters.get("delimiter"), 0);
+		}
+
+		String ctx_list_str = parameters.get("list");
+		int listSz = getArrayLength(ctx, ctx_list_str);
+
+
+
+		for( int i = 0; i < listSz; i++ ) {
+			list.add( new SortableCtxListElement(ctx, ctx_list_str + '[' + i + ']', sort_fields) );
+		}
+		Collections.sort(list);
+
+		ctxBulkErase(ctx, ctx_list_str);
+		int i = 0;
+		for( SortableCtxListElement list_element : list ) {
+			for( Map.Entry<String,String> entry : list_element.child_elements.entrySet() ) {
+				if( sort_fields == null ) {
+					ctx.setAttribute(ctx_list_str + '[' + i + ']', entry.getValue());
+				}
+				else {
+					ctx.setAttribute(ctx_list_str + '[' + i + "]." + entry.getKey(), entry.getValue());
+				}
+			}
+			i++;
+		}
+		// Reset list length (removed by ctxBulkErase above)
+		ctx.setAttribute(ctx_list_str+"_length",  ""+listSz);
+	}
+
+    /**
+     * generates a UUID and writes it to context memory
+     * @param parameters - ctx-destination is a required parameter
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException thrown if a UUID cannot be generated or if ctx-destination is missing or null
+     */
+	public void generateUUID( Map<String, String> parameters, SvcLogicContext ctx )  throws SvcLogicException {
+		checkParameters(parameters, new String[]{"ctx-destination"}, LOG);
+		ctx.setAttribute(parameters.get("ctx-destination"), UUID.randomUUID().toString() );
+	}
+
+	/**
+	 * Provides substring functionality to Directed Graphs.
+	 * <p>
+	 * Calls either String.substring(String beginIndex) or
+	 * String.substring(String beginInded, String endIndex) if the end-index
+	 * is present or not.
+	 * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+	 * <table border="1">
+	 * 	<thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+	 * 	<tbody>
+	 * 		<tr><td>string</td><td>Mandatory</td><td>String to perform substring on</td></tr>
+	 * 		<tr><td>result</td><td>Mandatory</td><td>Key in context memory to populate the resulting string in</td></tr>
+	 * 		<tr><td>begin-index</td><td>Mandatory</td><td>Beginning index to pass to Java substring function</td></tr>
+	 * 		<tr><td>end-index</td><td>Optional</td><td>Ending index to pass to Java substring function. If not included, String.substring(begin) will be called.</td></tr>
+	 * 	</tbody>
+	 * </table>
+	 * @param ctx Reference to context memory
+	 * @throws SvcLogicException
+	 * @since 8.0.1
+	 * @see SliPluginUtils#substring(Map, SvcLogicContext)
+	 */
+	@Deprecated
+	public void substring( Map<String, String> parameters, SvcLogicContext ctx ) throws SvcLogicException {
+		try {
+			checkParameters( parameters, new String[]{"string","begin-index","result"}, LOG );
+			final String string = parameters.get("string");
+			final String result = parameters.get("result");
+			final String begin = parameters.get("begin-index");
+			final String end = parameters.get("end-index");
+
+			if( StringUtils.isEmpty(end) ) {
+				ctx.setAttribute( result, string.substring(Integer.parseInt(begin)) );
+			}
+			else {
+				ctx.setAttribute( result, string.substring(Integer.parseInt(begin), Integer.parseInt(end)) );
+			}
+		}
+		catch( Exception e ) {
+			throw new SvcLogicException( "An error occurred while the Directed Graph was performing a substring", e );
+		}
+	}
+
+
+
+	// ========== PUBLIC STATIC UTILITY FUNCTIONS ==========
+
+	/**
+	 * Throws an exception and writes an error to the log file if a required
+	 * parameters is not found in the parametersMap.
+	 * <p>
+	 * Use at the beginning of functions that can be called by Directed Graphs
+	 * and can take parameters to verify that all parameters have been provided
+	 * by the Directed Graph.
+	 * @param parametersMap parameters Map passed to this node
+	 * @param requiredParams Array of parameters required by the calling function
+	 * @param log Reference to Logger to log to
+	 * @throws SvcLogicException if a String in the requiredParams array is
+	 * not a key in parametersMap.
+	 * @since 1.0
+	 */
+        public static final void checkParameters(Map<String, String> parametersMap, String[] requiredParams, Logger log) throws SvcLogicException {
+        if( requiredParams == null || requiredParams.length < 1){
+            log.debug("required parameters was empty, exiting early.");
+            return;
+        }
+        if (parametersMap == null || parametersMap.keySet().size() < 1){
+            String errorMessage = "This method requires the parameters [" +   StringUtils.join(requiredParams,",") + "], but no parameters were passed in.";
+            log.error(errorMessage);
+            throw new SvcLogicException(errorMessage);
+        }
+
+    	for (String param : requiredParams) {
+    	    if (!parametersMap.containsKey(param)) {
+    		String errorMessage = "Required parameter \"" + param + "\" was not found in parameter list.";
+    		log.error(errorMessage);
+    		log.error("Total list of required parameters is [" + StringUtils.join(requiredParams, ",") + "].");
+    		throw new SvcLogicException(errorMessage);
+    	    }
+    	}
+        }
+
+	/**
+	 * Removes all key-value pairs with keys that begin with pfx
+	 * @param ctx Reference to context memory
+	 * @param pfx Prefix of key-value pairs to remove
+	 * @since 1.0
+	 */
+	public static final void ctxBulkErase( SvcLogicContext ctx, String pfx ) {
+		ArrayList<String> Keys = new ArrayList<String>( ctx.getAttributeKeySet() );
+		for( String key : Keys ) {
+			if( key.startsWith( pfx ) ) {
+				ctx.setAttribute( pfx + key.substring(pfx.length()) , null);
+			}
+		}
+	}
+
+	/**
+	 * Copies all context memory key-value pairs that start with src_pfx to
+	 * the keys that start with dest_pfx + suffix, where suffix is the result
+	 * of {@code key.substring(src_pfx.length())}.
+	 * <p>
+	 * Does NOT guarantee removal of all keys at the destination before
+	 * copying, but will overwrite any destination keys that have a
+	 * corresponding source key. Use {@link #ctxBulkErase(SvcLogicContext, String) ctxBulkErase}
+	 * before copy to erase destination root before copying from source.
+	 * @param ctx Reference to context memory.
+	 * @param src_pfx Prefix of the keys to copy values from.
+	 * @param dest_pfx Prefix of the keys to copy values to.
+	 * @since 1.0
+	 */
+	public static final void ctxBulkCopy( SvcLogicContext ctx, String src_pfx, String dest_pfx ) {
+		// Remove trailing period from dest_pfx
+		if( dest_pfx.charAt(dest_pfx.length()-1) == '.' ) {
+			dest_pfx = dest_pfx.substring(0,dest_pfx.length()-1);
+		}
+
+		// For each context key that begins with src_pfx, set the value of the
+		// key dest_pfx + the suffix of the key to the key's value
+		ArrayList<String> Keys = new ArrayList<String>(ctx.getAttributeKeySet());
+		for( String key : Keys ) {
+			if( key.startsWith(src_pfx) ) {
+				// Get suffix (no leading period)
+				String suffix = key.substring(src_pfx.length());
+				if( suffix.charAt(0) == '.') {
+					suffix = suffix.substring(1);
+				}
+
+				// Set destination's value to key's value
+				ctx.setAttribute(dest_pfx + '.' + suffix, ctx.getAttribute(key));
+			}
+		}
+	}
+
+	/**
+	 * Creates and returns a {@code Map<String, String>} that is a subset of
+	 * context memory where all keys begin with the prefix.
+	 * @param ctx Reference to context memory.
+	 * @param prefix Returned map's keys should all begin with this value.
+	 * @return A {@code Map<String, String>} containing all the key-value pairs
+	 * in ctx whose key begins with prefix.
+	 */
+	public static final Map<String, String> ctxGetBeginsWith( SvcLogicContext ctx, String prefix ) {
+		Map<String, String> prefixMap = new HashMap<String, String>();
+
+		for( String key : ctx.getAttributeKeySet() ) {
+			if( key.startsWith(prefix) ) {
+				prefixMap.put( key, ctx.getAttribute(key) );
+			}
+		}
+
+		return prefixMap;
+	}
+
+	/**
+	 * Returns true if key's value in context memory is "" or if it doesn't
+	 * exist in context memory.
+	 * @param ctx Reference to context memory.
+	 * @param key Key to search for.
+	 * @return true if key's value in context memory is "" or if it doesn't
+	 * exist in context memory.
+	 * @since 1.0
+	 */
+	public static final boolean ctxKeyEmpty( SvcLogicContext ctx, String key ) {
+		String value = ctx.getAttribute(key);
+		return value == null || value.isEmpty();
+	}
+
+	/**
+	 * Adds all key-value pairs in the entries Map to context memory.
+	 * @param ctx Reference to context memory. Value's {@code toString()}
+	 * function is used to add it.
+	 * @param entries {@code Map<String, ?>} of key-value pairs to add to
+	 * context memory. Value's {@code toString()} function is used to add it.
+	 * @return Reference to context memory to be used for function chaining.
+	 */
+	public static final SvcLogicContext ctxPutAll( SvcLogicContext ctx, Map<String, ?> entries ) {
+		for( Map.Entry<String, ?> entry : entries.entrySet() ) {
+			ctxSetAttribute( ctx, entry.getKey(), entry.getValue() );
+			//ctx.setAttribute(entry.getKey(), entry.getValue().toString());
+		}
+
+		return ctx;
+	}
+
+	/**
+	 * Sets a key in context memory to the output of object's toString(). The
+	 * key is deleted from context memory if object is null.
+	 * @param ctx Reference to context memory.
+	 * @param key Key to set.
+	 * @param object Object whose toString() will be the value set
+	 */
+	public static final void ctxSetAttribute( SvcLogicContext ctx, String key, Object object ) {
+		if( object == null ) {
+			ctx.setAttribute(key, null);
+		}
+		else {
+			ctx.setAttribute(key, object.toString());
+		}
+	}
+
+	/**
+	 * Sets a key in context memory to the output of object's toString().
+	 * <p>
+	 * The key is deleted from context memory if object is null. The key and
+	 * value set in context memory are logged to the Logger at the provided
+	 * logLevel level.
+	 * @param <O> Any Java object
+	 * @param ctx Reference to context memory.
+	 * @param key Key to set.
+	 * @param obj Object whose toString() will be the value set
+	 * @param LOG Logger to log to
+	 * @param logLevel level to log at in Logger
+	 */
+	public static final <O extends Object> void ctxSetAttribute( SvcLogicContext ctx, String key, O obj, Logger LOG, LogLevel logLevel ) {
+		String value = Objects.toString( obj, null );
+		ctx.setAttribute( key, value );
+		if( logLevelIsEnabled(LOG, logLevel ) ) {
+			if( value == null ) {
+				logMessageAtLevel( LOG, logLevel, "Deleting " + key );
+			}
+			else {
+				logMessageAtLevel( LOG, logLevel, "Setting " + key + " = " + value );
+			}
+		}
+	}
+
+	/**
+	 * Utility function used to get an array's length from context memory.
+	 * Will return 0 if key doesn't exist in context memory or isn't numeric.
+	 * <p>
+	 * Use to obtain a context memory array length without having to worry
+	 * about throwing a NumberFormatException.
+	 * @param ctx Reference to context memory
+	 * @param key Key in context memory whose value is the array's length. If
+	 * the key doesn't end in "_length", then "_length is appended.
+	 * @param log Reference to Logger to log to
+	 * @return The array length or 0 if the key is not found in context memory.
+	 * @since 1.0
+	 */
+	public static final int getArrayLength( SvcLogicContext ctx, String key ) {
+		return getArrayLength(ctx, key, null, null, null);
+	}
+
+	/**
+	 * Utility function used to get an array's length from context memory.
+	 * Will return 0 if key doesn't exist in context memory or isn't numeric
+	 * and print the provided log message to the configured log file.
+	 * <p>
+	 * Use to obtain a context memory array length without having to worry
+	 * about throwing a NumberFormatException.
+	 * @param ctx Reference to context memory.
+	 * @param key Key in context memory whose value is the array's length. If
+	 * the key doesn't end in "_length", then "_length is appended.
+	 * @param log Reference to Logger to log to. Doesn't log if null.
+	 * @param logLevel Logging level to log the message at if the context
+	 * memory key isn't found. Doesn't log if null.
+	 * @param log_message Message to log if the context memory key isn't found.
+	 * Doesn't log if null.
+	 * @return The array length or 0 if the key is not found in context memory.
+	 * @since 1.0
+	 */
+	public static final int getArrayLength( SvcLogicContext ctx, String key, Logger log, LogLevel logLevel, String log_message ) {
+		String ctxKey = ( key.endsWith("_length") ) ? key : key + "_length";
+		try {
+			return Integer.parseInt(ctx.getAttribute(ctxKey));
+		}
+		catch( NumberFormatException e ) {
+			if( log != null && logLevel != null && log_message != null ) {
+				switch( logLevel ) {
+					case TRACE:
+						log.trace(log_message);
+					case DEBUG:
+						log.debug(log_message);
+						break;
+					case INFO:
+						log.info(log_message);
+						break;
+					case WARN:
+						log.warn(log_message);
+						break;
+					case ERROR:
+						log.error(log_message);
+						break;
+				}
+			}
+		}
+
+		return 0;
+	}
+
+	/**
+	 * Prints sorted context memory key-value pairs to the log file at the log
+	 * level. Returns immediately if the log level isn't enabled.
+	 * <p>
+	 * O(n log(n)) time where n = size of context memory
+	 * @param ctx Reference to context memory
+	 * @param log Reference to Logger to log to
+	 * @param logLevel Logging level to log the context memory key-value pairs
+	 * at.
+	 * @since 1.0
+	 */
+	public static final void logContextMemory( SvcLogicContext ctx, Logger log, LogLevel logLevel ) {
+		logLevelIsEnabled( log, logLevel );
+
+		// Print sorted context memory key-value pairs to the log
+		ArrayList<String> keys = new ArrayList<String>(ctx.getAttributeKeySet());
+		Collections.sort(keys);
+		for( String key : keys ) {
+			logMessageAtLevel( log, logLevel, key + " = " + ctx.getAttribute(key) );
+		}
+	}
+
+
+
+	// ========== PRIVATE FUNCTIONS ==========
+
+	// TODO: javadoc
+	/**
+	 *
+	 * @param parameters
+	 * @param log
+	 * @param loglevel
+	 * @since 7.0.1
+	 */
+	public static final void logExecuteNodeParameters( Map<String,String> parameters, Logger log, LogLevel loglevel ) {
+		logLevelIsEnabled( log, loglevel );
+
+		for( Map.Entry<String,String> param : parameters.entrySet() ) {
+			logMessageAtLevel( log, loglevel, "PARAM: " + param.getKey() + " = " + param.getValue() );
+		}
+	}
+
+	// TODO: javadoc
+	/**
+	 * Returns true if the loglevel is enabled. Otherwise, returns false.
+	 * @param log Reference to logger
+	 * @param loglevel Log level to check if enabled
+	 * @return True if the loglevel is enabled. Otherwise, false
+	 * @since 7.0.1
+	 */
+	private static final boolean logLevelIsEnabled( Logger log, LogLevel loglevel ) {
+		// Return immediately if logging level isn't enabled
+		switch( loglevel ) {
+			case TRACE:
+				if( log.isTraceEnabled() ) { return true; }
+				return false;
+			case DEBUG:
+				if( log.isDebugEnabled() ) { return true; }
+				return false;
+			case INFO:
+				if( log.isInfoEnabled() ) { return true; }
+				return false;
+			case WARN:
+				if( log.isWarnEnabled() ) { return true; }
+				return false;
+			case ERROR:
+				if( log.isErrorEnabled() ) { return true; }
+				return false;
+			default:
+				throw new IllegalArgumentException("Unknown LogLevel: " + loglevel.toString());
+		}
+	}
+
+	// TODO: javadoc
+	/**
+	 *
+	 * @param log
+	 * @param loglevel
+	 * @param msg
+	 * @since 7.0.1
+	 */
+	private static final void logMessageAtLevel( Logger log, LogLevel loglevel, String msg ) {
+		switch( loglevel ) {
+			case TRACE:
+				log.trace(msg);
+				return;
+			case DEBUG:
+				log.debug(msg);
+				return;
+			case INFO:
+				log.info(msg);
+				return;
+			case WARN:
+				log.warn(msg);
+				return;
+			case ERROR:
+				log.error(msg);
+				return;
+		}
+	}
+
+
+
+	// ========== LOCAL CLASSES ==========
+
+	private class SortableCtxListElement implements Comparable<SortableCtxListElement> {
+		HashMap<String,String> child_elements = new HashMap<String,String>();
+		String[] sort_fields;
+
+		public SortableCtxListElement( SvcLogicContext ctx, String root, String[] sort_fields ) {
+			this.sort_fields = sort_fields;
+
+			for( String key : ctx.getAttributeKeySet() ) {
+				if( key.startsWith(root) ) {
+					if( key.length() == root.length() ) {
+						child_elements.put("", ctx.getAttribute(key));
+						break;
+					}
+					else {
+						child_elements.put(key.substring(root.length()+1), ctx.getAttribute(key));
+					}
+				}
+			}
+		}
+
+		@Override
+		public int compareTo(SortableCtxListElement arg0) {
+			if( sort_fields == null ) {
+				return this.child_elements.get("").compareTo(arg0.child_elements.get(""));
+			}
+
+			for( String field : this.sort_fields ) {
+				int result = this.child_elements.get(field).compareTo(arg0.child_elements.get(field));
+				if( result != 0 ) {
+					return result;
+				}
+			}
+
+			return 0;
+		}
+	}
+
+	/**
+     * Creates a file that contains the content of context memory.
+     * @param parameters - must contain the parameter filename
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException thrown if file cannot be created or if parameters are missing
+     */
+	public static void printContext(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+		if (parameters == null || parameters.isEmpty()) {
+			throw new SvcLogicException("no parameters passed");
+		}
+
+		checkParameters(parameters, new String[]{"filename"}, LOG);
+
+		String fileName = parameters.get("filename");
+
+
+		try (FileOutputStream fstr = new FileOutputStream(new File(fileName));
+			 PrintStream pstr = new PrintStream(fstr, true);)
+		{
+			pstr.println("#######################################");
+			for (String attr : ctx.getAttributeKeySet()) {
+				pstr.println(attr + " = " + ctx.getAttribute(attr));
+			}
+		} catch (Exception e) {
+			throw new SvcLogicException("Cannot write context to file " + fileName, e);
+		}
+
+
+	}
+
+	 /**
+     * Checks context memory for a set of required parameters
+     * Every parameter aside from prefix will be treated as mandatory
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>prefix</td><td>Optional</td><td>the prefix will be added to each parameter</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+	public static void requiredParameters(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+		if (parameters == null || parameters.keySet().size() < 1) {
+            String errorMessage = "requiredParameters should not be called if the parameters hashmap is null or empty!";
+            LOG.error(errorMessage);
+            throw new SvcLogicException(errorMessage);
+		}
+		String prefixValue = null;
+		String prefix = "prefix";
+		if(parameters.containsKey(prefix)){
+		    prefixValue = parameters.get(prefix);
+		    parameters.remove(prefix);
+		}
+		checkParameters(prefixValue, ctx.getAttributeKeySet(), parameters.keySet(), LOG);
+	}
+
+    private static void checkParameters(String prefixValue, Set<String> ctx, Set<String> parameters, Logger log) throws SvcLogicException {
+        for (String param : parameters) {
+            if (prefixValue != null) {
+                param = prefixValue + param;
+            }
+            if (!ctx.contains(param)) {
+                String errorMessage = "This method requires the parameters [" + StringUtils.join(parameters, ",")
+                        + "], but " + param + " was not passed in.";
+                log.error(errorMessage);
+                throw new SvcLogicException(errorMessage);
+            }
+        }
+    }
+
+    /**
+     *  is in a different DG invocation just before/after we call NCS and set the state to InProgress
+     */
+    /**
+    * setTime write the current date time to a string located at outputPath
+    * @param parameters - requires outputPath to not be null
+    * @param ctx Reference to context memory
+    * @throws SvcLogicException if a required parameter is missing an exception is thrown
+    */
+    public static void setTime(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException
+    {
+        checkParameters(parameters, new String[] { "outputPath" }, LOG);
+
+        // Set the DateFormat
+        // "2015-03-16T12:18:35.138Z"
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+
+        // Parse the date
+        String ctxVariable = parameters.get("outputPath");
+        try {
+            String dateTime = format.format(new Date());
+            ctx.setAttribute(ctxVariable, dateTime);
+        } catch (Exception ex) {
+            throw new SvcLogicException("problem with setTime", ex);
+        }
+    }
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtilsActivator.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtilsActivator.java
new file mode 100644
index 0000000..e0568ab
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtilsActivator.java
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SliPluginUtilsActivator implements BundleActivator {
+    @SuppressWarnings("rawtypes") private List<ServiceRegistration> registrations = new LinkedList<ServiceRegistration>();
+
+    private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtilsActivator.class);
+    private static final String SDNC_ROOT_DIR = "SDNC_CONFIG_DIR";
+    private static final String DME2_PROPERTIES_FILE_NAME = "dme2.properties";
+
+    @Override
+    public void start(BundleContext ctx) throws Exception {
+        SliPluginUtils plugin = new SliPluginUtils(new Properties());
+        LOG.info("Registering service " + plugin.getClass().getName());
+        registrations.add(ctx.registerService(plugin.getClass().getName(), plugin, null));
+
+        SliStringUtils sliStringUtils_Plugin = new SliStringUtils();
+        LOG.info("Registering service " + sliStringUtils_Plugin.getClass().getName());
+        registrations.add(ctx.registerService(sliStringUtils_Plugin.getClass().getName(), sliStringUtils_Plugin, null));
+
+        try {
+            String path = System.getenv(SDNC_ROOT_DIR) + File.separator + DME2_PROPERTIES_FILE_NAME;
+            DME2 dmePlugin = initDme2(path);
+            if (dmePlugin != null) {
+                LOG.info("Registering service " + dmePlugin.getClass().getName());
+                registrations.add(ctx.registerService(dmePlugin.getClass().getName(), dmePlugin, null));
+            }
+        } catch (Exception e) {
+            LOG.error("DME2 plugin could not be started", e);
+        }
+    }
+
+    public DME2 initDme2(String pathToDmeProperties) {
+        Properties dme2properties = new Properties();
+        String loadPropertiesErrorMessage = "Couldn't load DME2 properties at path " + pathToDmeProperties;
+        File dme2propertiesFile = new File(pathToDmeProperties);
+
+        try {
+            dme2properties.load(new FileReader(dme2propertiesFile));
+            String proxyUrlProperty = dme2properties.getProperty("proxyUrl");
+            String[] proxyUrls = proxyUrlProperty.split(",");
+            DME2 dmePlugin = new DME2(dme2properties.getProperty("aafUserName"), dme2properties.getProperty("aafPassword"), dme2properties.getProperty("envContext"), dme2properties.getProperty("routeOffer"), proxyUrls, dme2properties.getProperty("commonServiceVersion"));
+            dmePlugin.setPartner(dme2properties.getProperty("partner"));
+            return dmePlugin;
+        } catch (FileNotFoundException e) {
+            LOG.error(loadPropertiesErrorMessage);
+        } catch (IOException e) {
+            LOG.error(loadPropertiesErrorMessage);
+        }
+        LOG.error("Couldn't create DME2 plugin");
+        return null;
+    }
+
+    @Override
+    public void stop(BundleContext ctx) throws Exception {
+        for (@SuppressWarnings("rawtypes") ServiceRegistration registration : registrations) {
+            registration.unregister();
+            registration = null;
+        }
+    }
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtils.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtils.java
new file mode 100644
index 0000000..43af6f5
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtils.java
@@ -0,0 +1,396 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A SvcLogicJavaPlugin that exposes java.lang.String functions to DirectedGraph
+ */
+public class SliStringUtils implements SvcLogicJavaPlugin {
+	private static final Logger LOG = LoggerFactory.getLogger(SliStringUtils.class);
+
+	public SliStringUtils() {}
+
+	/**
+	 * Provides split functionality to Directed Graphs.
+	 * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+	 * <table border="1">
+	 * 	<thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+	 * 	<tbody>
+	 * 		<tr><td>original_string</td><td>Mandatory</td><td>String to perform split on</td></tr>
+	 * 		<tr><td>regex</td><td>Mandatory</td><td>the delimiting regular expression</td></tr>
+	 * 		<tr><td>limit</td><td>Optional</td><td>result threshold. See String.split method for further description. Defaults to 0</td></tr>
+	 * 		<tr><td>ctx_memory_result_key</td><td>Mandatory</td><td>Key in context memory to populate the resulting array of strings under</td></tr>
+	 * 	</tbody>
+	 * </table>
+	 * @param ctx Reference to context memory
+	 * @throws SvcLogicException
+	 * @since 11.0.2
+	 * @see String#split(String, int)
+	 */
+	public void split( Map<String, String> parameters, SvcLogicContext ctx ) throws SvcLogicException {
+		final String original_string = parameters.get("original_string");
+		LOG.trace("original_string = " + original_string);
+		final String regex = parameters.get("regex");
+		LOG.trace("regex = " + regex);
+		final String limit_str = parameters.get("limit");
+		LOG.trace("limit_str = " + limit_str);
+		final String ctx_memory_result_key = parameters.get("ctx_memory_result_key");
+		LOG.trace("ctx_memory_result_key = " + ctx_memory_result_key);
+
+		try {
+			// Validation that parameters are not null
+			SliPluginUtils.checkParameters( parameters, new String[]{"original_string","regex","ctx_memory_result_key"}, LOG );
+
+			// Read limit from context memory. Default to 0 if null/empty
+			int limit = 0;
+			if( StringUtils.isNotEmpty(limit_str) ) {
+				try {
+					limit = Integer.parseInt(limit_str);
+				}
+				catch( NumberFormatException e ) {
+					throw new IllegalArgumentException( "The limit parameter of the SliStringUtils.split() function must be a number, empty string, or null", e );
+				}
+			}
+
+			// Call String.split(regex,limit) on string passed in
+			String[] split_string = original_string.split(regex, limit);
+
+			// Populate context memory with results
+			for( int i = 0; i < split_string.length; i++ ) {
+				SliPluginUtils.ctxSetAttribute(ctx, ctx_memory_result_key + '[' + i + ']', split_string[i], LOG, SliPluginUtils.LogLevel.DEBUG);
+			}
+			SliPluginUtils.ctxSetAttribute(ctx, ctx_memory_result_key + "_length", new Integer(split_string.length), LOG, SliPluginUtils.LogLevel.DEBUG);
+		}
+		catch( Exception e ) {
+			// Have error message print parameters
+			throw new SvcLogicException( "An error occurred during SliStringUtils.split() where original_string = " + quotedOrNULL(regex) +
+					" regex = " + quotedOrNULL(regex) +
+					" limit = " + quotedOrNULL(regex) +
+					" ctx_memory_result_key = " + quotedOrNULL(regex), e );
+		}
+	}
+
+	private static String quotedOrNULL( String str ) {
+		return (str == null) ? "NULL" : '"' + str + '"';
+	}
+
+    /**
+     * exposes equalsIgnoreCase to directed graph
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * emits a true or false outcome
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>target</td><td>Mandatory</td><td>target string</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static String equalsIgnoreCase(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG);
+        if(parameters.get("source").equalsIgnoreCase(parameters.get("target"))){
+            return "true";
+        }
+        return "false";
+    }
+
+    /**
+     * exposes toUpperCase to directed graph
+     * writes an upperCase version of source to outputPath
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>outputPath</td><td>Mandatory</td><td>the location in context memory the result is written to</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static void toUpper(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG);
+        ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").toUpperCase());
+    }
+
+    /**
+     * exposes toLowerCase to directed graph
+     * writes a lowerCase version of source to outputPath
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>outputPath</td><td>Mandatory</td><td>the location in context memory the result is written to</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static void toLower(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG);
+        ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").toLowerCase());
+    }
+
+    /**
+     * exposes contains to directed graph to test if one string contains another
+     * tests if the source contains the target
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * emits a true or false outcome
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>target</td><td>Mandatory</td><td>target string</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static String contains(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG);
+        if(parameters.get("source").contains(parameters.get("target"))){
+            return "true";
+        }
+        return "false";
+    }
+
+    /**
+     * exposes endsWith to directed graph to test if one string endsWith another string
+     * tests if the source ends with the target
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * emits a true or false outcome
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>target</td><td>Mandatory</td><td>target string</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static String endsWith(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG);
+        if(parameters.get("source").endsWith(parameters.get("target"))){
+            return "true";
+        }
+        return "false";
+    }
+
+    /**
+     * exposes startsWith to directed graph to test if one string endsWith another string
+     * tests if the source ends with the target
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * emits a true or false outcome
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>target</td><td>Mandatory</td><td>target string</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static String startsWith(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","target"}, LOG);
+        if(parameters.get("source").startsWith(parameters.get("target"))){
+            return "true";
+        }
+        return "false";
+    }
+
+    /**
+     * exposes trim to directed graph
+     * writes a trimmed version of the string to the outputPath
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>outputPath</td><td>Mandatory</td><td>the location in context memory the result is written to</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static void trim(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG);
+        ctx.setAttribute(parameters.get("outputPath"), parameters.get("source").trim());
+    }
+
+    /**
+     * exposes String.length() to directed graph
+     * writes the length of source to outputPath
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>outputPath</td><td>Mandatory</td><td>the location in context memory the result is written to</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static void getLength(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath"}, LOG);
+        ctx.setAttribute(parameters.get("outputPath"), String.valueOf(parameters.get("source").length()));
+    }
+
+    /**
+     * exposes replace to directed graph
+     * writes the length of source to outputPath
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>target</td><td>Mandatory</td><td>The sequence of char values to be replaced</td></tr>
+     *      <tr><td>replacement</td><td>Mandatory</td><td>The replacement sequence of char values</td></tr>
+     *      <tr><td>outputPath</td><td>Mandatory</td><td>the location in context memory the result is written to</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static void replace(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[]{"source","outputPath","target","replacement"}, LOG);
+        ctx.setAttribute(parameters.get("outputPath"), (parameters.get("source").replace(parameters.get("target"), parameters.get("replacement"))));
+    }
+
+    /**
+     * Provides substring functionality to Directed Graphs.
+     * <p>
+     * Calls either String.substring(String beginIndex) or
+     * String.substring(String beginInded, String endIndex) if the end-index
+     * is present or not.
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>string</td><td>Mandatory</td><td>String to perform substring on</td></tr>
+     *      <tr><td>result</td><td>Mandatory</td><td>Key in context memory to populate the resulting string in</td></tr>
+     *      <tr><td>begin-index</td><td>Mandatory</td><td>Beginning index to pass to Java substring function</td></tr>
+     *      <tr><td>end-index</td><td>Optional</td><td>Ending index to pass to Java substring function. If not included, String.substring(begin) will be called.</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public void substring( Map<String, String> parameters, SvcLogicContext ctx ) throws SvcLogicException {
+        try {
+            SliPluginUtils.checkParameters( parameters, new String[]{"string","begin-index","result"}, LOG );
+            final String string = parameters.get("string");
+            final String result = parameters.get("result");
+            final String begin = parameters.get("begin-index");
+            final String end = parameters.get("end-index");
+            if( StringUtils.isEmpty(end) ) {
+                ctx.setAttribute( result, string.substring(Integer.parseInt(begin)) );
+            }
+            else {
+                ctx.setAttribute( result, string.substring(Integer.parseInt(begin), Integer.parseInt(end)) );
+            }
+        }
+        catch( Exception e ) {
+            throw new SvcLogicException( "An error occurred while the Directed Graph was performing a substring", e );
+        }
+    }
+
+    /**
+     * Provides concat functionality to Directed Graphs.
+     * <p>
+     * Will concat target to source and write the result to outputPath
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>target</td><td>Mandatory</td><td>The sequence of char values to be replaced</td></tr>
+     *      <tr><td>outputPath</td><td>Mandatory</td><td>the location in context memory the result is written to</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     */
+    public static void concat( Map<String, String> parameters, SvcLogicContext ctx ) throws SvcLogicException {
+            SliPluginUtils.checkParameters( parameters, new String[]{"source","target","outputPath"}, LOG );
+            String result = parameters.get("source").concat(parameters.get("target"));
+            ctx.setAttribute(parameters.get("outputPath"), result);
+    }
+
+    /**
+     * Provides url encoding functionality to Directed Graphs.
+     * <p>
+     * Will url encode the source and write the result to outputPath
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th></thead>
+     *  <tbody>
+     *      <tr><td>source</td><td>Mandatory</td><td>source string</td></tr>
+     *      <tr><td>encoding</td><td>Optional</td><td>the name of a supported character encoding, defaulted to UTF-8 if not supplied</td></tr>
+     *      <tr><td>outputPath</td><td>Mandatory</td><td>the location in context memory the result is written to</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     */
+    public static void urlEncode(Map<String, String> parameters, SvcLogicContext ctx) throws SvcLogicException {
+        SliPluginUtils.checkParameters(parameters, new String[] { "source", "outputPath" }, LOG);
+        String encoding = parameters.get("encoding");
+        if (encoding == null) {
+            encoding = "UTF-8";
+        }
+        try {
+            String result = URLEncoder.encode(parameters.get("source"), encoding);
+            ctx.setAttribute(parameters.get("outputPath"), result);
+        } catch (UnsupportedEncodingException e) {
+            throw new SvcLogicException("Url encode failed.", e);
+        }
+    }
+
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextList.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextList.java
new file mode 100644
index 0000000..89a4a98
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextList.java
@@ -0,0 +1,210 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.ListIterator;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+/**
+ * A utility class used to manage list manipulation in the context memory.
+ * @see org.openecomp.sdnc.sli.SvcLogicContext
+ */
+public class SvcLogicContextList {
+    /**
+     * Internal flag indicating if list should be deleted from context memory
+     * when it is copied into the SvcLogicContextList object.
+     */
+    private enum OperType {
+        COPY, EXTRACT
+    }
+
+    // TODO: javadoc
+    protected final String prefix;
+    // TODO: javadoc
+    protected final ArrayList<HashMap<String,String>> list;
+
+
+    // TODO: javadoc
+    public SvcLogicContextList( SvcLogicContext ctx, String list_prefix ) {
+        this(ctx, list_prefix, OperType.COPY);
+    }
+
+    // TODO: javadoc
+    private SvcLogicContextList( SvcLogicContext ctx, String list_prefix, OperType operation ) {
+        this.prefix = list_prefix;
+
+        // Initialize list
+        int capacity = getCtxListLength(ctx, prefix);
+        this.list = new ArrayList<HashMap<String, String>>(capacity);
+        for( int i = 0; i < capacity; i++ ) {
+            this.list.add(i, new HashMap<String,String>());
+        }
+
+        // Populate "elements" in list
+        String prefix_bracket = this.prefix + '[';
+        for (String key : new HashSet<String>(ctx.getAttributeKeySet())) {
+            if( key.startsWith(prefix_bracket) ) {
+                // Extract the index of the list
+                int index = getCtxListIndex(key, this.prefix, capacity);
+
+                // Store the
+                String suffix = key.substring((prefix_bracket + index + ']').length());
+                suffix = suffix.isEmpty() ? suffix : suffix.substring(1);
+                this.list.get(index).put( suffix, ctx.getAttribute(key));
+
+                // If flag to extract set, remove data from context memory as
+                // it is read into this list
+                if( operation == OperType.EXTRACT ) {
+                    ctx.setAttribute(key, null);
+                }
+            }
+        }
+
+        // If flag to extract set, remove list _length value from cxt mem
+        if( operation == OperType.EXTRACT ) {
+            ctx.setAttribute(this.prefix + "_length", null);
+        }
+    }
+
+    // TODO: javadoc
+    public static SvcLogicContextList extract( SvcLogicContext ctx, String list_prefix ) {
+        return new SvcLogicContextList(ctx, list_prefix, OperType.EXTRACT);
+    }
+
+
+    // ========== PUBLIC FUNCTIONS ==========
+
+    // TODO: javadoc
+    public HashMap<String,String> get( int index ) {
+        return this.list.get(index);
+    }
+
+    // TODO: javadoc
+    public HashMap<String,String> remove( int index ) {
+        return this.list.remove(index);
+    }
+
+    // TODO: javadoc
+    public void remove( String value ) {
+        remove( "", value );
+    }
+
+    // TODO: javadoc
+    public void remove( String key, String value ) {
+        if( value == null ) {
+            throw new IllegalArgumentException("value cannot be null");
+        }
+
+        ListIterator<HashMap<String,String>> itr = this.list.listIterator();
+        while( itr.hasNext() ) {
+            if( value.equals(itr.next().get(key)) ) {
+                itr.remove();
+            }
+        }
+    }
+
+    // TODO javadoc
+    public void remove( Map<String,String> primary_key ) {
+        ListIterator<HashMap<String,String>> itr = this.list.listIterator();
+        while( itr.hasNext() ) {
+            boolean found = true;
+            HashMap<String,String> list_element = itr.next();
+            for( Map.Entry<String,String> key : primary_key.entrySet() ) {
+                if( !key.getValue().equals(list_element.get(key.getKey())) ) {
+                    found = false;
+                    break;
+                }
+            }
+
+            if( found ) {
+                itr.remove();
+            }
+        }
+    }
+
+    // TODO: javadoc
+    public int size() {
+        return list.size();
+    }
+
+    // TODO: javadoc
+    public void writeToContext( SvcLogicContext ctx ) {
+        ctx.setAttribute( prefix + "_length", Integer.toString(this.list.size()) );
+
+        for( int i = 0; i < this.list.size(); i++ ) {
+            for( Map.Entry<String,String> entry : this.list.get(i).entrySet() ) {
+                if( entry.getKey().equals("") ) {
+                    ctx.setAttribute(prefix + '[' + i + ']', entry.getValue());
+                } else {
+                    ctx.setAttribute(prefix + '[' + i + "]." + entry.getKey(), entry.getValue());
+                }
+            }
+        }
+    }
+
+
+
+    // ========== PRIVATE STATIC FUNCTIONS ==========
+
+    // TODO: javadoc
+    private static int getCtxListIndex( String key, String prefix, int list_size ) {
+        int index = getCtxListIndex( key, prefix );
+        if( index >= list_size ) {
+            throw new IllegalArgumentException("Context memory list \"" + prefix + "[]\" contains an index >= the size of the list", new ArrayIndexOutOfBoundsException("index \"" + index + "\" is outside the bounds of the context memory list \"" + prefix + "[]. List Length = " + list_size));
+        } else if (index < 0) {
+            throw new IllegalArgumentException("Context memory list \"" + prefix + "[]\" contains a negative index", new NegativeArraySizeException("index \"" + index + "\" of context memory list is negative"));
+        }
+
+        return index;
+    }
+
+    // TODO: javadoc
+    private static int getCtxListIndex( String key, String prefix ) {
+        String ctx_index_str = StringUtils.substringBetween(key.substring(prefix.length()), "[", "]");
+        try {
+            return Integer.parseInt( ctx_index_str );
+        } catch (NumberFormatException e) {
+            throw new IllegalStateException("Could not parse index value \"" + ctx_index_str + "\" in context memory key \"" + key + "\"", e);
+        }
+    }
+
+    // TODO: javadoc
+    private static int getCtxListLength( SvcLogicContext ctx, String prefix ) {
+        String _length_key = prefix + "_length";
+        String _length_val_str = ctx.getAttribute(_length_key);
+        try {
+            return Integer.parseInt(_length_val_str);
+        } catch (NumberFormatException e) {
+            if( _length_val_str == null ) {
+                throw new IllegalStateException( "Could not find list length \"" + _length_key + "\" in context memory." );
+            } else {
+                throw new IllegalStateException( "Could not parse index value \"" + _length_val_str + "\" of context memory list length \"" + _length_key + "\"" , e );
+            }
+        }
+    }
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextObject.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextObject.java
new file mode 100644
index 0000000..d79522f
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextObject.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+public interface SvcLogicContextObject {
+	public void writeToContext( SvcLogicContext ctx, String root );
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/YesNo.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/YesNo.java
new file mode 100644
index 0000000..4d2fb4c
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/YesNo.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+/**
+ *
+ */
+package org.openecomp.sdnc.sli.SliPluginUtils.commondatastructures;
+
+/**
+ * An enum found in many Yang models. It is commonly used as a
+ * substitute for boolean.
+ */
+public enum YesNo {
+    N, Y;
+
+    /**
+     * Method overload for {@link #valueOf(String)} for the char primative
+     */
+    public static YesNo valueOf( final char name ) {
+        return YesNo.valueOf( Character.toString(name) );
+    }
+
+    /**
+     * Method overload for {@link #valueOf(String)} for the Character object
+     */
+    public static YesNo valueOf( final Character name ) {
+        if( name == null ) {
+            return null;
+        }
+
+        return YesNo.valueOf( name.toString() );
+    }
+}
diff --git a/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/package-info.java b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/package-info.java
new file mode 100644
index 0000000..4a81d9a
--- /dev/null
+++ b/sliPluginUtils/provider/src/main/java/org/openecomp/sdnc/sli/SliPluginUtils/commondatastructures/package-info.java
@@ -0,0 +1,28 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+/**
+ *
+ */
+/**
+ *
+ */
+package org.openecomp.sdnc.sli.SliPluginUtils.commondatastructures;
diff --git a/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/CheckParametersTest.java b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/CheckParametersTest.java
new file mode 100644
index 0000000..318e464
--- /dev/null
+++ b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/CheckParametersTest.java
@@ -0,0 +1,116 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CheckParametersTest {
+
+    @Test
+    public void nullRequiredParameters() throws Exception {
+        Map<String, String> parametersMap = new HashMap<String, String>();
+        String[] requiredParams = null;
+        Logger Log = LoggerFactory.getLogger(SliPluginUtils.class);
+        SliPluginUtils.checkParameters(parametersMap, requiredParams, Log);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void emptyParametersMap() throws Exception {
+        Map<String, String> parametersMap = new HashMap<String, String>();
+        String[] requiredParams = new String[] { "param1", "param2", "param3" };
+        Logger Log = LoggerFactory.getLogger(SliPluginUtils.class);
+        SliPluginUtils.checkParameters(parametersMap, requiredParams, Log);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void paramNotFound() throws Exception {
+        Map<String, String> parametersMap = new HashMap<String, String>();
+        parametersMap.put("tst", "me");
+        String[] requiredParams = new String[] { "param1", "parm2", "param3" };
+        Logger Log = LoggerFactory.getLogger(SliPluginUtils.class);
+        SliPluginUtils.checkParameters(parametersMap, requiredParams, Log);
+    }
+
+    @Test
+    public void testSunnyRequiredParameters() throws Exception {
+        SvcLogicContext ctx = new SvcLogicContext();
+        ctx.setAttribute("param1", "hello");
+        ctx.setAttribute("param2", "world");
+        ctx.setAttribute("param3", "!");
+
+        Map<String, String> parameters = new HashMap<String, String>();
+        parameters.put("param1", "dog");
+        parameters.put("param2", "cat");
+        parameters.put("param3", "fish");
+
+        SliPluginUtils.requiredParameters(parameters, ctx);
+    }
+
+    @Test
+    public void testSunnyRequiredParametersWithPrefix() throws Exception {
+        String prefixValue = "my.unique.path.";
+        SvcLogicContext ctx = new SvcLogicContext();
+        ctx.setAttribute(prefixValue + "param1", "hello");
+        ctx.setAttribute(prefixValue + "param2", "world");
+        ctx.setAttribute(prefixValue + "param3", "!");
+
+        Map<String, String> parameters = new HashMap<String, String>();
+        parameters.put("prefix", prefixValue);
+        parameters.put("param1", "dog");
+        parameters.put("param2", "cat");
+        parameters.put("param3", "fish");
+
+        SliPluginUtils.requiredParameters(parameters, ctx);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void testRainyMissingRequiredParameters() throws Exception {
+        SvcLogicContext ctx = new SvcLogicContext();
+        ctx.setAttribute("param1", "hello");
+        ctx.setAttribute("param3", "!");
+
+        Map<String, String> parameters = new HashMap<String, String>();
+        parameters.put("param1", null);
+        parameters.put("param2", null);
+        parameters.put("param3", null);
+
+        SliPluginUtils.requiredParameters(parameters, ctx);
+    }
+
+    @Test(expected = SvcLogicException.class)
+    public void testEmptyRequiredParameters() throws Exception {
+        SvcLogicContext ctx = new SvcLogicContext();
+        ctx.setAttribute("param1", "hello");
+        ctx.setAttribute("param3", "!");
+
+        Map<String, String> parameters = new HashMap<String, String>();
+
+        SliPluginUtils.requiredParameters(parameters, ctx);
+    }
+}
diff --git a/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/Dme2Test.java b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/Dme2Test.java
new file mode 100644
index 0000000..d66b011
--- /dev/null
+++ b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/Dme2Test.java
@@ -0,0 +1,109 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.sdnc.sli.SliPluginUtils.DME2;
+import org.openecomp.sdnc.sli.SliPluginUtils.SliPluginUtilsActivator;
+
+public class Dme2Test {
+
+    @Test
+    public void createInstarUrl() {
+        String instarUrl = "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com";
+        DME2 dme = new DME2("user@sample.com", "fake", "TEST", "DEFAULT", new String[] { "http://localhost:25055" }, "common");
+        String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(instarUrl, constructedUrl);
+    }
+
+    @Test
+    public void createInstarUrlNoSubContext() {
+        String instarUrl = "http://localhost:25055/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT?dme2.password=fake&dme2.username=user@sample.com";
+        DME2 dme = new DME2("user@sample.com", "fake", "TEST", "DEFAULT", new String[] { "http://localhost:25055" }, "common");
+        Map<String, String> parameters = new HashMap<String, String>();
+        String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", parameters.get(null));
+        assertEquals(instarUrl, constructedUrl);
+    }
+
+    @Test
+    public void testRoundRobin() {
+        String[] proxyHostNames = new String[] { "http://one:25055", "http://two:25055", "http://three:25055" };
+        String urlSuffix = "/service=sample.com/services/eim/v1/rest/version=1702.0/envContext=TEST/routeOffer=DEFAULT/subContext=/enterpriseConnection/getEnterpriseConnectionDetails/v1?dme2.password=fake&dme2.username=user@sample.com";
+        DME2 dme = new DME2("user@sample.com", "fake", "TEST", "DEFAULT", proxyHostNames, "common");
+        String constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl);
+        constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl);
+        constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl);
+        constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl);
+        constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(proxyHostNames[1] + urlSuffix, constructedUrl);
+        constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(proxyHostNames[2] + urlSuffix, constructedUrl);
+        constructedUrl = dme.constructUrl("sample.com/services/eim/v1/rest", "1702.0", "/enterpriseConnection/getEnterpriseConnectionDetails/v1");
+        assertEquals(proxyHostNames[0] + urlSuffix, constructedUrl);
+    }
+
+    @Test
+    public void createDme2EndtoEnd() {
+        SliPluginUtilsActivator activator = new SliPluginUtilsActivator();
+        DME2 dme2 = activator.initDme2("src/test/resources/dme2.e2e.properties");
+        assertEquals("user@sample.com", dme2.aafUserName);
+        assertEquals("fake", dme2.aafPassword);
+        assertEquals("UAT", dme2.envContext);
+        assertEquals("UAT", dme2.routeOffer);
+        Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls);
+        assertEquals("1702.0", dme2.commonServiceVersion);
+        assertEquals(null, dme2.partner);
+
+        String constructedUrl = dme2.constructUrl("sample.com/restservices/instar/v1/assetSearch", null, "/mySubContext");
+        assertNotNull(constructedUrl);
+        System.out.println(constructedUrl);
+    }
+
+    @Test
+    public void createDme2Prod() {
+        SliPluginUtilsActivator activator = new SliPluginUtilsActivator();
+        DME2 dme2 = activator.initDme2("src/test/resources/dme2.prod.properties");
+        assertEquals("user@sample.com", dme2.aafUserName);
+        assertEquals("fake", dme2.aafPassword);
+        assertEquals("PROD", dme2.envContext);
+        assertEquals("", dme2.routeOffer);
+        Assert.assertArrayEquals("http://sample.com:25055,http://sample.com:25055".split(","), dme2.proxyUrls);
+        assertEquals("1.0", dme2.commonServiceVersion);
+        assertEquals("LPP_PROD", dme2.partner);
+
+        String constructedUrl = dme2.constructUrl("sample.com/restservices/instar/v1/assetSearch", null, "/mySubContext");
+        assertNotNull(constructedUrl);
+        System.out.println(constructedUrl);
+    }
+
+}
diff --git a/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_StaticFunctionsTest.java b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_StaticFunctionsTest.java
new file mode 100644
index 0000000..e69d086
--- /dev/null
+++ b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_StaticFunctionsTest.java
@@ -0,0 +1,250 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SliPluginUtils_StaticFunctionsTest {
+    private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils_StaticFunctionsTest.class);
+    SliPluginUtils utils = new SliPluginUtils();
+    private SvcLogicContext ctx;
+    private HashMap<String, String> parameters;
+
+    @Before
+    public void setUp() throws Exception {
+        this.ctx = new SvcLogicContext();
+        parameters = new HashMap<String, String>();
+    }
+
+    // TODO: javadoc
+    @Test
+    public final void testCtxGetBeginsWith() {
+        ctx.setAttribute("service-data.oper-status.order-status", "InProgress");
+        ctx.setAttribute("service-data.service-information.service-instance-id", "my-instance");
+        ctx.setAttribute("service-data.service-information.service-type", "my-service");
+
+        Map<String, String> entries = SliPluginUtils.ctxGetBeginsWith(ctx, "service-data.service-information");
+
+        assertEquals("my-instance", entries.get("service-data.service-information.service-instance-id"));
+        assertEquals("my-service", entries.get("service-data.service-information.service-type"));
+        assertFalse(entries.containsKey("service-data.oper-status.order-status"));
+    }
+
+    // TODO: javadoc
+    @Test
+    public final void testCtxListRemove_index() throws SvcLogicException {
+        LOG.trace("=== testCtxListRemove_index ===");
+        ctx.setAttribute("service-data.vnf-l3[0].vnf-host-name", "vnf-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[0].device-host-name", "device-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[1].vnf-host-name", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[1].device-host-name", "device-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[2].vnf-host-name", "vnf-host-name_2");
+        ctx.setAttribute("service-data.vnf-l3[2].device-host-name", "device-host-name_2");
+        ctx.setAttribute("service-data.vnf-l3_length", "3");
+
+        parameters.put("index", "1");
+        parameters.put("list_pfx", "service-data.vnf-l3");
+
+        utils.ctxListRemove(parameters, ctx);
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        assertEquals("2", ctx.getAttribute("service-data.vnf-l3_length"));
+        assertEquals("vnf-host-name_0", ctx.getAttribute("service-data.vnf-l3[0].vnf-host-name"));
+        assertEquals("device-host-name_0", ctx.getAttribute("service-data.vnf-l3[0].device-host-name"));
+        assertEquals("vnf-host-name_2", ctx.getAttribute("service-data.vnf-l3[1].vnf-host-name"));
+        assertEquals("device-host-name_2", ctx.getAttribute("service-data.vnf-l3[1].device-host-name"));
+    }
+
+    // TODO: javadoc
+    @Test
+    public final void textCtxListRemove_keyValue() throws SvcLogicException {
+        LOG.trace("=== textCtxListRemove_keyValue ===");
+        ctx.setAttribute("service-data.vnf-l3[0].vnf-host-name", "vnf-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[0].device-host-name", "device-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[1].vnf-host-name", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[1].device-host-name", "device-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[2].vnf-host-name", "vnf-host-name_2");
+        ctx.setAttribute("service-data.vnf-l3[2].device-host-name", "device-host-name_2");
+        // 2nd entry
+        ctx.setAttribute("service-data.vnf-l3[3].vnf-host-name", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[3].device-host-name", "device-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3_length", "4");
+
+        parameters.put("list_pfx", "service-data.vnf-l3");
+        parameters.put("key", "vnf-host-name");
+        parameters.put("value", "vnf-host-name_1");
+
+        utils.ctxListRemove(parameters, ctx);
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        assertEquals("2", ctx.getAttribute("service-data.vnf-l3_length"));
+        assertEquals("vnf-host-name_0", ctx.getAttribute("service-data.vnf-l3[0].vnf-host-name"));
+        assertEquals("device-host-name_0", ctx.getAttribute("service-data.vnf-l3[0].device-host-name"));
+        assertEquals("vnf-host-name_2", ctx.getAttribute("service-data.vnf-l3[1].vnf-host-name"));
+        assertEquals("device-host-name_2", ctx.getAttribute("service-data.vnf-l3[1].device-host-name"));
+    }
+
+    // TODO: javadoc
+    @Test
+    public final void textCtxListRemove_keyValue_nullkey() throws SvcLogicException {
+        LOG.trace("=== textCtxListRemove_keyValue_nullkey ===");
+        ctx.setAttribute("service-data.vnf-l3[0]", "vnf-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[1]", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[2]", "vnf-host-name_2");
+        ctx.setAttribute("service-data.vnf-l3_length", "3");
+
+        parameters.put("list_pfx", "service-data.vnf-l3");
+        parameters.put("value", "vnf-host-name_1");
+
+        utils.ctxListRemove(parameters, ctx);
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        assertEquals("2", ctx.getAttribute("service-data.vnf-l3_length"));
+        assertEquals("vnf-host-name_0", ctx.getAttribute("service-data.vnf-l3[0]"));
+        assertEquals("vnf-host-name_2", ctx.getAttribute("service-data.vnf-l3[1]"));
+    }
+
+    // TODO: javadoc
+    @Test
+    public final void textCtxListRemove_keyValueList() throws SvcLogicException {
+        LOG.trace("=== textCtxListRemove_keyValueList ===");
+        ctx.setAttribute("service-data.vnf-l3[0].vnf-host-name", "vnf-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[0].device-host-name", "device-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[1].vnf-host-name", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[1].device-host-name", "device-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[2].vnf-host-name", "vnf-host-name_2");
+        ctx.setAttribute("service-data.vnf-l3[2].device-host-name", "device-host-name_2");
+        // 2nd entry
+        ctx.setAttribute("service-data.vnf-l3[3].vnf-host-name", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[3].device-host-name", "device-host-name_1");
+        // entries with only 1 of 2 key-value pairs matching
+        ctx.setAttribute("service-data.vnf-l3[4].vnf-host-name", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[4].device-host-name", "device-host-name_4");
+        ctx.setAttribute("service-data.vnf-l3[5].vnf-host-name", "vnf-host-name_5");
+        ctx.setAttribute("service-data.vnf-l3[5].device-host-name", "device-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3_length", "6");
+
+        parameters.put("list_pfx", "service-data.vnf-l3");
+        parameters.put("keys_length", "2");
+        parameters.put("keys[0].key", "vnf-host-name");
+        parameters.put("keys[0].value", "vnf-host-name_1");
+        parameters.put("keys[1].key", "device-host-name");
+        parameters.put("keys[1].value", "device-host-name_1");
+
+        utils.ctxListRemove(parameters, ctx);
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        assertEquals("4", ctx.getAttribute("service-data.vnf-l3_length"));
+        assertEquals("vnf-host-name_0", ctx.getAttribute("service-data.vnf-l3[0].vnf-host-name"));
+        assertEquals("device-host-name_0", ctx.getAttribute("service-data.vnf-l3[0].device-host-name"));
+        assertEquals("vnf-host-name_2", ctx.getAttribute("service-data.vnf-l3[1].vnf-host-name"));
+        assertEquals("device-host-name_2", ctx.getAttribute("service-data.vnf-l3[1].device-host-name"));
+        assertEquals("vnf-host-name_1", ctx.getAttribute("service-data.vnf-l3[2].vnf-host-name"));
+        assertEquals("device-host-name_4", ctx.getAttribute("service-data.vnf-l3[2].device-host-name"));
+        assertEquals("vnf-host-name_5", ctx.getAttribute("service-data.vnf-l3[3].vnf-host-name"));
+        assertEquals("device-host-name_1", ctx.getAttribute("service-data.vnf-l3[3].device-host-name"));
+    }
+
+    // TODO: javadoc
+    @Test(expected = SvcLogicException.class)
+    public final void testCtxListRemove_nullListLength() throws SvcLogicException {
+        LOG.trace("=== testCtxListRemove_nullListLength ===");
+        ctx.setAttribute("service-data.vnf-l3[0].vnf-host-name", "vnf-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[0].device-host-name", "device-host-name_0");
+        ctx.setAttribute("service-data.vnf-l3[1].vnf-host-name", "vnf-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[1].device-host-name", "device-host-name_1");
+        ctx.setAttribute("service-data.vnf-l3[2].vnf-host-name", "vnf-host-name_2");
+        ctx.setAttribute("service-data.vnf-l3[2].device-host-name", "device-host-name_2");
+
+        parameters.put("index", "1");
+        parameters.put("list_pfx", "service-data.vnf-l3");
+
+        utils.ctxListRemove(parameters, ctx);
+    }
+
+    // TODO: javadoc
+    @Test
+    public final void testCtxPutAll() {
+        HashMap<String, Object> entries = new HashMap<String, Object>();
+        entries.put("service-data.oper-status.order-status", "InProgress");
+        entries.put("service-data.service-information.service-instance-id", "my-instance");
+        entries.put("service-data.request-information.order-number", 1234);
+        entries.put("service-data.request-information.request-id", null);
+
+        SliPluginUtils.ctxPutAll(ctx, entries);
+
+        assertEquals("InProgress", ctx.getAttribute("service-data.oper-status.order-status"));
+        assertEquals("my-instance", ctx.getAttribute("service-data.service-information.service-instance-id"));
+        assertEquals("1234", ctx.getAttribute("service-data.request-information.order-number"));
+        assertFalse(ctx.getAttributeKeySet().contains("service-data.request-information.request-id"));
+    }
+
+    // TODO: javadoc
+    @Test
+    public final void testCtxSetAttribute_LOG() {
+        LOG.debug("=== testCtxSetAttribute_LOG ===");
+        Integer i = new Integer(3);
+        SliPluginUtils.ctxSetAttribute(ctx, "test", i, LOG, SliPluginUtils.LogLevel.TRACE);
+    }
+
+    /*@Test
+    public void printContext() throws SvcLogicException, IOException {
+        String filePath = "/src/test/resources/printContext.txt";
+        parameters.put("filename", filePath);
+        File f = new File(filePath);
+        assert (f.exists());
+        assert (!f.isDirectory());
+        ctx.setAttribute("hello", "world");
+        ctx.setAttribute("name", "value");
+
+        SliPluginUtils.printContext(parameters, ctx);
+        BufferedReader br = new BufferedReader(new FileReader(f));
+        String line = br.readLine();
+        assertEquals("#######################################", line);
+        line = br.readLine();
+        assertEquals("hello = world", line);
+        line = br.readLine();
+        assertEquals("name = value", line);
+        br.close();
+        Files.delete(Paths.get(filePath));
+    }*/
+
+    @Test
+    public void setTime() throws SvcLogicException {
+        String outputPath = "output";
+        parameters.put("outputPath", outputPath);
+        SliPluginUtils.setTime(parameters, ctx);
+        assertNotNull(ctx.getAttribute(outputPath));
+    }
+}
diff --git a/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_ctxSortList.java b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_ctxSortList.java
new file mode 100644
index 0000000..b1cae54
--- /dev/null
+++ b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_ctxSortList.java
@@ -0,0 +1,96 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Random;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("unused")
+public class SliPluginUtils_ctxSortList {
+	private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils_ctxSortList.class);
+	SliPluginUtils utils = new SliPluginUtils();
+	SvcLogicContext ctx;
+	HashMap<String,String> parameters;
+	Random rand = new Random();
+
+	@Before
+	public void setUp() throws Exception {
+		this.ctx = new SvcLogicContext();
+		this.parameters = new HashMap<String,String>();
+	}
+
+	@Test
+	public final void list_of_containers() throws SvcLogicException {
+		this.parameters.put("list", "input.list");
+		this.parameters.put("sort-fields", "sort-key");
+		this.parameters.put("delimiter",",");
+
+		ctx.setAttribute("input.list_length", "10");
+		for( int i = 0; i < 10; i++ ) {
+			this.ctx.setAttribute("input.list[" + i + "].sort-key", Integer.toString( rand.nextInt(10) ));
+			this.ctx.setAttribute("input.list[" + i + "].value", Integer.toString( rand.nextInt(10) ));
+		}
+
+		LOG.trace("BEFORE SORT:");
+		SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+		utils.ctxSortList(this.parameters, this.ctx);
+
+		LOG.trace("AFTER SORT:");
+		SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+		for( int i = 0; i < 9; i++ ) {
+			assertTrue(this.ctx.getAttribute("input.list[" + i + "].sort-key").compareTo(this.ctx.getAttribute("input.list[" + (i+1) + "].sort-key")) < 1 );
+		}
+	}
+
+	@Test public final void list_of_elements() throws SvcLogicException {
+		this.parameters.put("list", "input.list");
+		this.parameters.put("delimiter",",");
+
+		this.ctx.setAttribute("input.list_length", "10");
+		for( int i = 0; i < 10; i++ ) {
+			this.ctx.setAttribute("input.list[" + i + ']', Integer.toString( rand.nextInt(10) ));
+		}
+
+		LOG.trace("BEFORE SORT:");
+		SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+		utils.ctxSortList(this.parameters, this.ctx);
+
+		LOG.trace("AFTER SORT:");
+		SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+		for( int i = 0; i < 9; i++ ) {
+			assertTrue(this.ctx.getAttribute("input.list[" + i + ']').compareTo(this.ctx.getAttribute("input.list[" + (i+1) + ']')) < 1 );
+		}
+	}
+}
diff --git a/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_ctxSortListTest.java b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_ctxSortListTest.java
new file mode 100644
index 0000000..e2fcb33
--- /dev/null
+++ b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliPluginUtils_ctxSortListTest.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Random;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("unused")
+public class SliPluginUtils_ctxSortListTest {
+    private static final Logger LOG = LoggerFactory.getLogger(SliPluginUtils_ctxSortListTest.class);
+    SliPluginUtils utils = new SliPluginUtils();
+    SvcLogicContext ctx;
+    HashMap<String, String> parameters;
+    Random rand = new Random();
+
+    @Before
+    public void setUp() throws Exception {
+        this.ctx = new SvcLogicContext();
+        this.parameters = new HashMap<String, String>();
+    }
+
+    @Test
+    public final void list_of_containers() throws SvcLogicException {
+        this.parameters.put("list", "input.list");
+        this.parameters.put("sort-fields", "sort-key");
+        this.parameters.put("delimiter", ",");
+
+        ctx.setAttribute("input.list_length", "10");
+        for (int i = 0; i < 10; i++) {
+            this.ctx.setAttribute("input.list[" + i + "].sort-key", Integer.toString(rand.nextInt(10)));
+            this.ctx.setAttribute("input.list[" + i + "].value", Integer.toString(rand.nextInt(10)));
+        }
+
+        LOG.trace("BEFORE SORT:");
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        utils.ctxSortList(this.parameters, this.ctx);
+
+        LOG.trace("AFTER SORT:");
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        for (int i = 0; i < 9; i++) {
+            assertTrue(this.ctx.getAttribute("input.list[" + i + "].sort-key").compareTo(this.ctx.getAttribute("input.list[" + (i + 1) + "].sort-key")) < 1);
+        }
+    }
+
+    @Test
+    public final void list_of_elements() throws SvcLogicException {
+        this.parameters.put("list", "input.list");
+        this.parameters.put("delimiter", ",");
+
+        this.ctx.setAttribute("input.list_length", "10");
+        for (int i = 0; i < 10; i++) {
+            this.ctx.setAttribute("input.list[" + i + ']', Integer.toString(rand.nextInt(10)));
+        }
+
+        LOG.trace("BEFORE SORT:");
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        utils.ctxSortList(this.parameters, this.ctx);
+
+        LOG.trace("AFTER SORT:");
+        SliPluginUtils.logContextMemory(ctx, LOG, SliPluginUtils.LogLevel.TRACE);
+
+        for (int i = 0; i < 9; i++) {
+            assertTrue(this.ctx.getAttribute("input.list[" + i + ']').compareTo(this.ctx.getAttribute("input.list[" + (i + 1) + ']')) < 1);
+        }
+    }
+}
diff --git a/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtilsTest.java b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtilsTest.java
new file mode 100644
index 0000000..d57cefa
--- /dev/null
+++ b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SliStringUtilsTest.java
@@ -0,0 +1,244 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+/**
+ *
+ */
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+
+/**
+ * @author km991u
+ *
+ */
+public class SliStringUtilsTest {
+    private SvcLogicContext ctx;
+    private HashMap<String, String> param;
+    private SliStringUtils stringUtils = new SliStringUtils();
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        this.ctx = new SvcLogicContext();
+        param = new HashMap<String, String>();
+    }
+
+    /**
+     * @throws SvcLogicException
+     * @see SliStringUtils#split(Map, SvcLogicContext)
+     */
+    @Test
+    public final void testSplit() throws SvcLogicException {
+        param.put("original_string", "one ## two ## three");
+        param.put("regex", " ## ");
+        param.put("ctx_memory_result_key", "result");
+
+        stringUtils.split(param, ctx);
+
+        assertThat(ctx.getAttribute("result[0]"), equalTo("one"));
+        assertThat(ctx.getAttribute("result[1]"), equalTo("two"));
+        assertThat(ctx.getAttribute("result[2]"), equalTo("three"));
+        assertThat(ctx.getAttribute("result_length"), equalTo("3"));
+    }
+
+    /**
+     * @throws SvcLogicException
+     * @see SliStringUtils#split(Map, SvcLogicContext)
+     */
+    @Test
+    public final void testSplit_limit() throws SvcLogicException {
+        param.put("original_string", "one ## two ## three");
+        param.put("regex", " ## ");
+        param.put("limit", "2");
+        param.put("ctx_memory_result_key", "result");
+
+        stringUtils.split(param, ctx);
+
+        assertThat(ctx.getAttribute("result[0]"), equalTo("one"));
+        assertThat(ctx.getAttribute("result[1]"), equalTo("two ## three"));
+        assertThat(ctx.getAttribute("result_length"), equalTo("2"));
+    }
+
+    @Test
+    public void equalsIgnoreCaseTrue() throws SvcLogicException {
+        String sourceString = "HeLlOwORLD";
+        String targetSTring = "HELLOWORLD";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("true", SliStringUtils.equalsIgnoreCase(param, ctx));
+    }
+
+    @Test
+    public void equalsIgnoreCaseFalse() throws SvcLogicException {
+        String sourceString = "HeLlOwORLD";
+        String targetSTring = "goodbyeWORLD";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("false", SliStringUtils.equalsIgnoreCase(param, ctx));
+    }
+
+    @Test
+    public void toUpper() throws SvcLogicException {
+        String sourceString = "HeLlOwORLD";
+        param.put("source", sourceString);
+        String path = "my.unique.path.";
+        param.put("outputPath", path);
+        SliStringUtils.toUpper(param, ctx);
+        assertEquals(sourceString.toUpperCase(), ctx.getAttribute(path));
+    }
+
+    @Test
+    public void toLower() throws SvcLogicException {
+        String sourceString = "HeLlOwORLD";
+        param.put("source", sourceString);
+        String path = "my.unique.path.";
+        param.put("outputPath", path);
+        SliStringUtils.toLower(param, ctx);
+        assertEquals(sourceString.toLowerCase(), ctx.getAttribute(path));
+    }
+
+    @Test
+    public void containsTrue() throws SvcLogicException {
+        String sourceString = "Pizza";
+        String targetSTring = "izza";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("true", SliStringUtils.contains(param, ctx));
+    }
+
+    @Test
+    public void containsFalse() throws SvcLogicException {
+        String sourceString = "Pizza";
+        String targetSTring = "muffin";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("false", SliStringUtils.contains(param, ctx));
+    }
+
+    @Test
+    public void endsWithTrue() throws SvcLogicException {
+        String sourceString = "Pizza";
+        String targetSTring = "za";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("true", SliStringUtils.endsWith(param, ctx));
+    }
+
+    @Test
+    public void endsWithFalse() throws SvcLogicException {
+        String sourceString = "Pizza";
+        String targetSTring = "muffin";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("false", SliStringUtils.endsWith(param, ctx));
+    }
+
+    @Test
+    public void trim() throws SvcLogicException {
+        String sourceString = " H E L L O W O R L D";
+        String outputPath = "muffin";
+        param.put("source", sourceString);
+        param.put("outputPath", outputPath);
+        SliStringUtils.trim(param, ctx);
+        assertEquals(sourceString.trim(), ctx.getAttribute(outputPath));
+    }
+
+    @Test
+    public void getLength() throws SvcLogicException {
+        String sourceString = "SomeRandomString";
+        String outputPath = "muffin";
+        param.put("source", sourceString);
+        param.put("outputPath", outputPath);
+        SliStringUtils.getLength(param, ctx);
+        assertEquals(String.valueOf(sourceString.length()), ctx.getAttribute(outputPath));
+    }
+
+    @Test
+    public void startsWithFalse() throws SvcLogicException {
+        String sourceString = "Java";
+        String targetSTring = "DG";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("false", SliStringUtils.startsWith(param, ctx));
+    }
+
+    @Test
+    public void startsWithTrue() throws SvcLogicException {
+        String sourceString = "Java";
+        String targetSTring = "Ja";
+        param.put("source", sourceString);
+        param.put("target", targetSTring);
+        assertEquals("true", SliStringUtils.startsWith(param, ctx));
+    }
+
+    @Test
+    public void replace() throws SvcLogicException {
+        String sourceString = "cat Hello World cat";
+        String old = "cat";
+        String neww = "dog";
+        String outputPath = "out";
+
+        param.put("source", sourceString);
+        param.put("target", old);
+        param.put("replacement", neww);
+        param.put("outputPath", outputPath);
+        SliStringUtils.replace(param, ctx);
+        assertEquals(sourceString.replace(old, neww), ctx.getAttribute(outputPath));
+    }
+
+    @Test
+    public void concat() throws SvcLogicException {
+        String sourceString = "cat";
+        String targetString = "dog";
+        String outputPath = "out";
+
+        param.put("source", sourceString);
+        param.put("target", targetString);
+        param.put("outputPath", outputPath);
+        SliStringUtils.concat(param, ctx);
+        assertEquals(sourceString + targetString, ctx.getAttribute(outputPath));
+    }
+
+    @Test
+    public void urlEncode() throws SvcLogicException {
+        String sourceString = "102/GE100/SNJSCAMCJP8/SNJSCAMCJT4";
+        String outputPath = "out";
+
+        param.put("source", sourceString);
+        param.put("outputPath", outputPath);
+        SliStringUtils.urlEncode(param, ctx);
+        assertEquals("102%2FGE100%2FSNJSCAMCJP8%2FSNJSCAMCJT4", ctx.getAttribute(outputPath));
+    }
+
+}
diff --git a/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextListTest.java b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextListTest.java
new file mode 100644
index 0000000..5d7bb24
--- /dev/null
+++ b/sliPluginUtils/provider/src/test/java/org/openecomp/sdnc/sli/SliPluginUtils/SvcLogicContextListTest.java
@@ -0,0 +1,307 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * 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=========================================================
+ */
+
+package org.openecomp.sdnc.sli.SliPluginUtils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.util.HashMap;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+public class SvcLogicContextListTest {
+	//private static final Logger LOG = LoggerFactory.getLogger(SvcLogicContextTest.class);
+	private SvcLogicContext ctx;
+
+	@Before
+	public void setUp() throws Exception {
+		this.ctx = new SvcLogicContext();
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testSvcLogicContextList_SingleValueList() {
+		ctx.setAttribute("list[0]", "0");
+		ctx.setAttribute("list[1]", "1");
+		ctx.setAttribute("list[2]", "2");
+		ctx.setAttribute("list[3]", "3");
+		ctx.setAttribute("list[4]", "4");
+		ctx.setAttribute("list_length", "5");
+
+		SvcLogicContextList list = new SvcLogicContextList( ctx, "list" );
+
+		// Check that size of list is 5
+		assertEquals(5, list.size());
+
+		// Check that each HashMap has it's list value in the empty string key
+		// and has no other values
+		assertEquals(1, list.get(0).size());
+		assertEquals("0", list.get(0).get(""));
+		assertEquals(1, list.get(1).size());
+		assertEquals("1", list.get(1).get(""));
+		assertEquals(1, list.get(2).size());
+		assertEquals("2", list.get(2).get(""));
+		assertEquals(1, list.get(3).size());
+		assertEquals("3", list.get(3).get(""));
+		assertEquals(1, list.get(4).size());
+		assertEquals("4", list.get(4).get(""));
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testSvcLogicContextList_ObjectList() {
+		ctx.setAttribute("list[0].ipv4", "1.1.1.0");
+		ctx.setAttribute("list[0].ipv6", "2001::0");
+		ctx.setAttribute("list[1].ipv4", "1.1.1.1");
+		ctx.setAttribute("list[1].ipv6", "2001::1");
+		ctx.setAttribute("list[2].ipv4", "1.1.1.2");
+		ctx.setAttribute("list[2].ipv6", "2001::2");
+		ctx.setAttribute("list[3].ipv4", "1.1.1.3");
+		ctx.setAttribute("list[3].ipv6", "2001::3");
+		ctx.setAttribute("list[4].ipv4", "1.1.1.4");
+		ctx.setAttribute("list[4].ipv6", "2001::4");
+		ctx.setAttribute("list_length", "5");
+
+		SvcLogicContextList list = new SvcLogicContextList( ctx, "list" );
+
+		// Check that size of list is 5
+		assertEquals(5, list.size());
+
+		assertEquals(2, list.get(0).size());
+		assertEquals("1.1.1.0", list.get(0).get("ipv4"));
+		assertEquals("2001::0", list.get(0).get("ipv6"));
+		assertEquals(2, list.get(1).size());
+		assertEquals("1.1.1.1", list.get(1).get("ipv4"));
+		assertEquals("2001::1", list.get(1).get("ipv6"));
+		assertEquals(2, list.get(2).size());
+		assertEquals("1.1.1.2", list.get(2).get("ipv4"));
+		assertEquals("2001::2", list.get(2).get("ipv6"));
+		assertEquals(2, list.get(3).size());
+		assertEquals("1.1.1.3", list.get(3).get("ipv4"));
+		assertEquals("2001::3", list.get(3).get("ipv6"));
+		assertEquals(2, list.get(4).size());
+		assertEquals("1.1.1.4", list.get(4).get("ipv4"));
+		assertEquals("2001::4", list.get(4).get("ipv6"));
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testExtract() {
+		ctx.setAttribute("list[0]", "0");
+		ctx.setAttribute("list[1]", "1");
+		ctx.setAttribute("list[2]", "2");
+		ctx.setAttribute("list[3]", "3");
+		ctx.setAttribute("list[4]", "4");
+		ctx.setAttribute("list_length", "5");
+		ctx.setAttribute("Other", "other");
+
+		SvcLogicContextList list = SvcLogicContextList.extract(ctx, "list");
+
+		// Check that size of list is 5
+		assertEquals(5, list.size());
+
+		// Check that all list values exist in list object
+		assertEquals(1, list.get(0).size());
+		assertEquals("0", list.get(0).get(""));
+		assertEquals(1, list.get(1).size());
+		assertEquals("1", list.get(1).get(""));
+		assertEquals(1, list.get(2).size());
+		assertEquals("2", list.get(2).get(""));
+		assertEquals(1, list.get(3).size());
+		assertEquals("3", list.get(3).get(""));
+		assertEquals(1, list.get(4).size());
+		assertEquals("4", list.get(4).get(""));
+
+		// Check that all list values no longer exist in ctx
+		assertNull(ctx.getAttribute("list[0]"));
+		assertNull(ctx.getAttribute("list[1]"));
+		assertNull(ctx.getAttribute("list[2]"));
+		assertNull(ctx.getAttribute("list[3]"));
+		assertNull(ctx.getAttribute("list[4]"));
+		assertNull(ctx.getAttribute("list_length"));
+
+		// Check that non-list values still exist in ctx
+		assertEquals("other", ctx.getAttribute("Other"));
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testRemove_int() {
+		ctx.setAttribute("list[0]", "0");
+		ctx.setAttribute("list[1]", "1");
+		ctx.setAttribute("list[2]", "2");
+		ctx.setAttribute("list[3]", "3");
+		ctx.setAttribute("list[4]", "4");
+		ctx.setAttribute("list_length", "5");
+
+		SvcLogicContextList list = new SvcLogicContextList( ctx, "list" );
+		list.remove(2);
+
+		// Check that size of list is 4 (1 less than original)
+		assertEquals(4, list.size());
+
+		// Check that value was remove from list
+		assertEquals(1, list.get(0).size());
+		assertEquals("0", list.get(0).get(""));
+		assertEquals(1, list.get(1).size());
+		assertEquals("1", list.get(1).get(""));
+		assertEquals(1, list.get(2).size());
+		assertEquals("3", list.get(2).get(""));
+		assertEquals(1, list.get(3).size());
+		assertEquals("4", list.get(3).get(""));
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testRemove_StringString() {
+		ctx.setAttribute("list[0].ipv4", "1.1.1.0");
+		ctx.setAttribute("list[0].ipv6", "2001::0");
+		ctx.setAttribute("list[1].ipv4", "1.1.1.1");
+		ctx.setAttribute("list[1].ipv6", "2001::1");
+		ctx.setAttribute("list[2].ipv4", "1.1.1.2");
+		ctx.setAttribute("list[2].ipv6", "2001::2");
+		ctx.setAttribute("list[3].ipv4", "1.1.1.3");
+		ctx.setAttribute("list[3].ipv6", "2001::3");
+		ctx.setAttribute("list[4].ipv4", "1.1.1.4");
+		ctx.setAttribute("list[4].ipv6", "2001::4");
+		ctx.setAttribute("list[5].ipv4", "1.1.1.2");
+		ctx.setAttribute("list[5].ipv6", "2001::2");
+		ctx.setAttribute("list_length", "6");
+
+		SvcLogicContextList list = new SvcLogicContextList( ctx, "list" );
+		list.remove("ipv4", "1.1.1.2");
+
+		// Check that size of list is 4 (2 less than original)
+		assertEquals(4, list.size());
+
+		// Check that all elements with values ending in 2 were removed
+		assertEquals("1.1.1.0", list.get(0).get("ipv4"));
+		assertEquals("2001::0", list.get(0).get("ipv6"));
+		assertEquals("1.1.1.1", list.get(1).get("ipv4"));
+		assertEquals("2001::1", list.get(1).get("ipv6"));
+		assertEquals("1.1.1.3", list.get(2).get("ipv4"));
+		assertEquals("2001::3", list.get(2).get("ipv6"));
+		assertEquals("1.1.1.4", list.get(3).get("ipv4"));
+		assertEquals("2001::4", list.get(3).get("ipv6"));
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testRemove_StringString_ValueList() {
+		ctx.setAttribute("list[0]", "5");
+		ctx.setAttribute("list[1]", "6");
+		ctx.setAttribute("list[2]", "7");
+		ctx.setAttribute("list[3]", "8");
+		ctx.setAttribute("list[4]", "9");
+		ctx.setAttribute("list_length", "5");
+
+		SvcLogicContextList list = new SvcLogicContextList( ctx, "list" );
+		list.remove("", "6");
+
+		// Check that size of list is 4 (1 less than original)
+		assertEquals(4, list.size());
+
+		// Check that value was remove from list
+		assertEquals(1, list.get(0).size());
+		assertEquals("5", list.get(0).get(""));
+		assertEquals(1, list.get(1).size());
+		assertEquals("7", list.get(1).get(""));
+		assertEquals(1, list.get(2).size());
+		assertEquals("8", list.get(2).get(""));
+		assertEquals(1, list.get(3).size());
+		assertEquals("9", list.get(3).get(""));
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testRemove_Map() {
+		ctx.setAttribute("list[0].ipv4", "1.1.1.0");
+		ctx.setAttribute("list[0].ipv6", "2001::0");
+		ctx.setAttribute("list[1].ipv4", "1.1.1.1");
+		ctx.setAttribute("list[1].ipv6", "2001::1");
+		ctx.setAttribute("list[2].ipv4", "1.1.1.2");
+		ctx.setAttribute("list[2].ipv6", "2001::2");
+		ctx.setAttribute("list[3].ipv4", "1.1.1.3");
+		ctx.setAttribute("list[3].ipv6", "2001::3");
+		ctx.setAttribute("list[4].ipv4", "1.1.1.4");
+		ctx.setAttribute("list[4].ipv6", "2001::4");
+		ctx.setAttribute("list[5].ipv4", "1.1.1.2");
+		ctx.setAttribute("list[5].ipv6", "2001::2");
+		ctx.setAttribute("list_length", "6");
+
+		HashMap<String,String> remove_key = new HashMap<String,String>();
+		remove_key.put("ipv4", "1.1.1.2");
+		remove_key.put("ipv6", "2001::2");
+
+		SvcLogicContextList list = new SvcLogicContextList( ctx, "list" );
+		list.remove(remove_key);
+
+		// Check that size of list is 4 (2 less than original)
+		assertEquals(4, list.size());
+
+		// Check that all elements with values ending in 2 were removed
+		assertEquals("1.1.1.0", list.get(0).get("ipv4"));
+		assertEquals("2001::0", list.get(0).get("ipv6"));
+		assertEquals("1.1.1.1", list.get(1).get("ipv4"));
+		assertEquals("2001::1", list.get(1).get("ipv6"));
+		assertEquals("1.1.1.3", list.get(2).get("ipv4"));
+		assertEquals("2001::3", list.get(2).get("ipv6"));
+		assertEquals("1.1.1.4", list.get(3).get("ipv4"));
+		assertEquals("2001::4", list.get(3).get("ipv6"));
+	}
+
+	// TODO: javadoc
+	@Test
+	public final void testWriteToContext() {
+		ctx.setAttribute("list[0]", "0");
+		ctx.setAttribute("list[1]", "1");
+		ctx.setAttribute("list[2]", "2");
+		ctx.setAttribute("list[3]", "3");
+		ctx.setAttribute("list[4]", "4");
+		ctx.setAttribute("list_length", "5");
+		ctx.setAttribute("Other", "other");
+
+		SvcLogicContextList list = new SvcLogicContextList( ctx, "list" );
+
+		// Erase context memory
+		ctx = new SvcLogicContext();
+
+		// Write list back into context memory
+		list.writeToContext(ctx);
+
+		// Check that size of list is 5
+		assertEquals(5, list.size());
+
+		// Check that all list values exist in list object
+		assertEquals("0", ctx.getAttribute("list[0]"));
+		assertEquals("1", ctx.getAttribute("list[1]"));
+		assertEquals("2", ctx.getAttribute("list[2]"));
+		assertEquals("3", ctx.getAttribute("list[3]"));
+		assertEquals("4", ctx.getAttribute("list[4]"));
+		assertEquals("5", ctx.getAttribute("list_length"));
+
+		// Check that old list values aren't in new list
+		assertNull(ctx.getAttribute("Other"));
+	}
+}