Merge branch 'sprint127'
diff --git a/org.eclipse.osee.client.ote.feature/.pmd b/org.eclipse.osee.client.ote.feature/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>WhileLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfElseStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanReturns</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanExpressions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchStmtsShouldHaveDefault</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDeeplyNestedIfStmts</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidReassigningParameters</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchDensity</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConstructorCallsOverridableMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AccessorClassGeneration</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalFieldCouldBeStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloseResource</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonStaticInitializer</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultLabelNotLastInSwitchStmt</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonCaseLabelInSwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OptimizableToArrayCall</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BadComparison</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EqualsNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConfusingTernary</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InstantiationToGetClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IdempotentOperations</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimpleDateFormatNeedsLocale</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImmutableField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseLocaleWithCaseConversions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidProtectedFieldInFinalClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentToNonFinalStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingStaticMethodInNonInstantiatableClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidSynchronizedAtMethodLevel</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingBreakInSwitch</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseNotifyAllInsteadOfNotify</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstanceofChecksInCatchClause</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAbstractMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyConditional</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CompareObjectsWithEquals</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PositionLiteralsFirstInComparisons</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryLocalBeforeReturn</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonThreadSafeSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyConstructor</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidConstantsInterface</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnsynchronizedStaticDateFormatter</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PreserveStackTrace</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCollectionIsEmpty</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SingularField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnEmptyArrayRatherThanNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAnyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooFewBranchesForASwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingThrowable</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExceptionAsFlowControl</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingNPE</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingRawExceptionTypes</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNullPointerException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidRethrowingException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotExtendJavaLangError</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotThrowExceptionInFinally</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNewInstanceOfSameException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateField</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedLocalVariable</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateMethod</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedFormalParameter</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MoreThanOneLogger</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LoggerIsNotStaticFinal</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SystemPrintln</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidPrintStackTrace</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDuplicateLiterals</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringInstantiation</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringToString</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientStringBuffering</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryCaseChange</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferLength</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AppendCharacterWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConsecutiveLiteralAppends</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseIndexOfChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientEmptyStringCheck</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InsufficientStringBufferDeclaration</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessStringValueOf</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringBufferInstantiationWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseEqualsToCompareStrings</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidStringBufferField</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceVectorWithList</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceHashtableWithMap</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceEnumerationWithIterator</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidEnumAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAssertAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IntegerInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ByteInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LongInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseBeforeAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseAfterAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseTestAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitUseExpected</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseProperClassLoader</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MDBAndSessionBeanNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteSessionInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalInterfaceSessionNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalHomeNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallSystemExit</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StaticEJBFieldShouldBeFinal</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotUseThreads</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstantiatingObjectsInLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArrayListInsteadOfVector</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyStartsWith</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferForStringAppends</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArraysAsList</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidArrayLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryWrapperObjectCreation</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AddEmptyString</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyCatchBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyIfStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyWhileStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyTryBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySwitchStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JumbledIncrementer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopShouldBeWhileLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConversionTemporary</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OverrideBothEqualsAndHashcode</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoubleCheckedLocking</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnFromFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySynchronizedBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryReturn</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStaticInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnconditionalIfStatement</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStatementNotInLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryFinalModifier</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CollapsibleIfStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOverridingMethod</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassCastExceptionWithToArray</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOperationOnImmutable</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisplacedNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedNullCheckInEquals</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThreadGroup</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BrokenNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BigIntegerInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingOctalValues</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingHardCodedIP</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CheckResultSet</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidMultipleUnaryOperators</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodReturnsInternalArray</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>ArrayIsStoredDirectly</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>CouplingBetweenObjects</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveImports</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DuplicateImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportJavaLang</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImportFromSamePackage</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyStaticImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitStaticSuite</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitSpelling</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitAssertionsShouldIncludeMessage</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitTestsShouldIncludeAssert</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TestClassWithoutTestCases</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertEqualsInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertSameInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertNullInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NullAssignment</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedModifier</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentInOperand</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AtLeastOneConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportSun</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousOctalEscape</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CallSuperInConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryParentheses</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultPackage</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInversion</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DataflowAnomalyAnalysis</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFinalLocalVariable</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingShortType</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingVolatile</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingNativeCode</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAccessibilityAlteration</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallGarbageCollectionExplicitly</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractNaming</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDollarSigns</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodWithSameNameAsEnclosingClass</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousHashcodeMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousConstantFieldName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousEqualsMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingTypeName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NoPackage</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PackageCase</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisleadingVariableName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanGetMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NPathComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveMethodLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveParameterList</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveClassLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CyclomaticComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessivePublicCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyFields</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssMethodCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssTypeCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssConstructorCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyMethods</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinalizer</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOnlyCallsSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOverloaded</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeDoesNotCallSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeShouldBeProtected</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCallingFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCorrectExceptionLogging</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperLogger</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingSerialVersionUID</name>
+            <ruleset>JavaBean Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperCloneImplementation</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneThrowsCloneNotSupportedException</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+    </rules>
+    <includeDerivedFiles>false</includeDerivedFiles>
+    <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.client.ote.feature/.project b/org.eclipse.osee.client.ote.feature/.project
new file mode 100644
index 0000000..08dc78f
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.client.ote.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.client.ote.feature/build.properties b/org.eclipse.osee.client.ote.feature/build.properties
new file mode 100644
index 0000000..f55cce2
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+               epl-v10.html,\
+               feature.properties,\
+               license.html
+generate.feature@org.eclipse.osee.client.ote.feature.source = org.eclipse.osee.client.ote.feature
\ No newline at end of file
diff --git a/org.eclipse.osee.client.ote.feature/epl-v10.html b/org.eclipse.osee.client.ote.feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+  <o:Revision>2</o:Revision>
+  <o:TotalTime>3</o:TotalTime>
+  <o:Created>2004-03-05T23:03:00Z</o:Created>
+  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+  <o:Pages>4</o:Pages>
+  <o:Words>1626</o:Words>
+  <o:Characters>9270</o:Characters>
+   <o:Lines>77</o:Lines>
+  <o:Paragraphs>18</o:Paragraphs>
+  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+  <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+  <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+@font-face
+	{font-family:Tahoma;
+	panose-1:2 11 6 4 3 5 4 4 2 4;
+	mso-font-charset:0;
+	mso-generic-font-family:swiss;
+	mso-font-pitch:variable;
+	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+	{mso-style-parent:"";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	font-family:"Times New Roman";
+	mso-fareast-font-family:"Times New Roman";}
+p
+	{margin-right:0in;
+	mso-margin-top-alt:auto;
+	mso-margin-bottom-alt:auto;
+	margin-left:0in;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	font-family:"Times New Roman";
+	mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+	{mso-style-name:"Balloon Text";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:8.0pt;
+	font-family:Tahoma;
+	mso-fareast-font-family:"Times New Roman";}
+@page Section1
+	{size:8.5in 11.0in;
+	margin:1.0in 1.25in 1.0in 1.25in;
+	mso-header-margin:.5in;
+	mso-footer-margin:.5in;
+	mso-paper-source:0;}
+div.Section1
+	{page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor (&quot;Commercial
+Contributor&quot;) hereby agrees to defend and indemnify every other
+Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
+costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.client.ote.feature/feature.properties b/org.eclipse.osee.client.ote.feature/feature.properties
new file mode 100644
index 0000000..aea9438
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/feature.properties
@@ -0,0 +1,141 @@
+###############################################################################
+# Copyright (c) 2004, 2007 Boeing and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     Boeing - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse OSEE Test Environment Feature (Incubation)
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "description" property - description of the feature
+description=Open System Engineering Environment - Test Environment
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2004, 2009 Boeing and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+    Boeing - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
+March 17, 2005\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse.org CVS\n\
+repository ("Repository") in CVS modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+   - Content may be structured and packaged into modules to facilitate delivering,\n\
+     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+     plug-in fragments ("Fragments"), and features ("Features").\n\
+   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
+     in a directory named "plugins".\n\
+   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+Features may also include other Features ("Included Features"). Files named\n\
+"feature.xml" may contain a list of the names and version numbers of\n\
+Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+   - The top-level (root) directory\n\
+   - Plug-in and Fragment directories\n\
+   - Inside Plug-ins and Fragments packaged as JARs\n\
+   - Sub-directories of the directory named "src" of certain Plug-ins\n\
+   - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Eclipse Update Manager, you must agree to a license ("Feature Update\n\
+License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties". Such Abouts,\n\
+Feature Licenses and Feature Update Licenses contain the terms and\n\
+conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.osee.client.ote.feature/feature.xml b/org.eclipse.osee.client.ote.feature/feature.xml
new file mode 100644
index 0000000..44cb6ed
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/feature.xml
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.osee.client.ote.feature"
+      label="%featureName"
+      version="0.25.3.qualifier"
+      provider-name="%providerName">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import plugin="org.eclipse.osee.framework.jdk.core"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.apache.commons.net"/>
+      <import plugin="org.eclipse.osee.framework.logging"/>
+      <import plugin="net.jini" version="2.1.0" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.osgi"/>
+      <import plugin="org.apache.xerces"/>
+      <import plugin="org.eclipse.osee.framework.core"/>
+      <import plugin="org.eclipse.osee.framework.plugin.core"/>
+      <import plugin="org.eclipse.osgi.services"/>
+      <import plugin="org.eclipse.ui" version="3.5.1" match="greaterOrEqual"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.core.jobs"/>
+      <import plugin="org.eclipse.jface"/>
+      <import plugin="org.eclipse.osee.framework.ui.plugin"/>
+      <import plugin="org.eclipse.osee.framework.ui.swt"/>
+      <import plugin="org.eclipse.swt"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.ui.workbench.texteditor"/>
+      <import plugin="org.eclipse.jface.text"/>
+      <import plugin="org.eclipse.nebula.widgets.xviewer"/>
+      <import plugin="org.eclipse.osee.framework.ui.ws"/>
+      <import plugin="org.eclipse.jdt.core"/>
+      <import plugin="org.eclipse.osee.framework.jini"/>
+      <import plugin="org.eclipse.jdt.ui"/>
+      <import plugin="org.eclipse.ui.workbench"/>
+      <import plugin="jms.libraries"/>
+      <import plugin="org.apache.felix.gogo.runtime"/>
+      <import plugin="org.eclipse.jgit"/>
+      <import plugin="org.eclipse.team.svn.core"/>
+      <import plugin="javax.servlet"/>
+      <import plugin="javax.ws.rs" version="2.0.0" match="greaterOrEqual"/>
+      <import plugin="org.apache.commons.lang"/>
+      <import plugin="org.eclipse.core.net"/>
+      <import plugin="org.apache.cxf.core"/>
+      <import plugin="org.apache.cxf.jaxrs.client"/>
+      <import plugin="org.apache.cxf.jaxrs.frontend"/>
+      <import plugin="org.apache.cxf.jaxrs.model.wadl"/>
+      <import plugin="org.apache.cxf.jaxrs.provider"/>
+      <import plugin="org.apache.cxf.rs.security.oauth2"/>
+      <import plugin="org.apache.cxf.transport.http"/>
+      <import plugin="org.apache.aries.blueprint"/>
+      <import plugin="org.apache.aries.blueprint.annotation"/>
+      <import plugin="org.apache.aries.proxy"/>
+      <import plugin="org.apache.aries.quiesce"/>
+      <import plugin="org.apache.aries.util"/>
+      <import plugin="org.osgi.service.blueprint"/>
+      <import plugin="javax.wsdl"/>
+      <import plugin="javax.validation" version="1.1.0" match="greaterOrEqual"/>
+      <import plugin="javax.annotation" version="1.2.0" match="greaterOrEqual"/>
+      <import plugin="org.codehaus.jackson.core"/>
+      <import plugin="org.codehaus.jackson.jaxrs"/>
+      <import plugin="org.codehaus.jackson.mapper"/>
+      <import plugin="org.codehaus.jackson.xc"/>
+      <import plugin="com.sun.xml.fastinfoset"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.osee.ote.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.messaging.dds"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.ui.test.manager"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.ui.markers"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.client"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.connection.jini"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.connection.service"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.client.msg"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.runtimeManager"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.framework.ui.workspacebundleloader"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.server"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.jms"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.version"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.version.git"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.version.svn"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.rest.client"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.rest.model"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.master.rest.client"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.master.rest.model"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.ui.builder"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.io"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.properties"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.client.ote.feature/license.html b/org.eclipse.osee.client.ote.feature/license.html
new file mode 100644
index 0000000..c6af966
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+   
+<h3>Applicable Licenses</h3>   
+   
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
+   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+   
+<ul>
+	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>   
+ 
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+	<li>The top-level (root) directory</li>
+	<li>Plug-in and Fragment directories</li>
+	<li>Inside Plug-ins and Fragments packaged as JARs</li>
+	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+	<li>Feature directories</li>
+</ul>
+		
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
+	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+   
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+</body>
+</html>
diff --git a/org.eclipse.osee.client.ote.feature/pom.xml b/org.eclipse.osee.client.ote.feature/pom.xml
new file mode 100644
index 0000000..9c66205
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/pom.xml
@@ -0,0 +1,17 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.ote.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../org.eclipse.osee.ote.parent</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.osee.client.ote.feature</artifactId>
+	<packaging>eclipse-feature</packaging>
+	<name>OSEE OTE Feature (Incubation)</name>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/feature.properties b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/feature.properties
new file mode 100644
index 0000000..f6cd6d4
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/feature.properties
@@ -0,0 +1,144 @@
+###############################################################################
+# Copyright (c) 2004, 2007 Boeing and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+# 
+# Contributors:
+#     Boeing - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse OSEE Test Environment Feature Source (Incubation)
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+updateSiteName=OSEE Update Site
+
+# "description" property - description of the feature
+description=Open System Engineering Environment
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2004, 2009 Boeing and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+    Boeing - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
+March 17, 2005\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse.org CVS\n\
+repository ("Repository") in CVS modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+   - Content may be structured and packaged into modules to facilitate delivering,\n\
+     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+     plug-in fragments ("Fragments"), and features ("Features").\n\
+   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
+     in a directory named "plugins".\n\
+   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+Features may also include other Features ("Included Features"). Files named\n\
+"feature.xml" may contain a list of the names and version numbers of\n\
+Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+   - The top-level (root) directory\n\
+   - Plug-in and Fragment directories\n\
+   - Inside Plug-ins and Fragments packaged as JARs\n\
+   - Sub-directories of the directory named "src" of certain Plug-ins\n\
+   - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Eclipse Update Manager, you must agree to a license ("Feature Update\n\
+License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties". Such Abouts,\n\
+Feature Licenses and Feature Update Licenses contain the terms and\n\
+conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/license.html b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/license.html
new file mode 100644
index 0000000..c6af966
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+   
+<h3>Applicable Licenses</h3>   
+   
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
+   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+   
+<ul>
+	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>   
+ 
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+	<li>The top-level (root) directory</li>
+	<li>Plug-in and Fragment directories</li>
+	<li>Inside Plug-ins and Fragments packaged as JARs</li>
+	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+	<li>Feature directories</li>
+</ul>
+		
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
+	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+   
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+</body>
+</html>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader.test/.project b/org.eclipse.osee.framework.ui.workspacebundleloader.test/.project
new file mode 100644
index 0000000..7fc7fc7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.framework.ui.workspacebundleloader.test</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath b/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/.pmd b/org.eclipse.osee.framework.ui.workspacebundleloader/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>WhileLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfElseStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanReturns</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanExpressions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchStmtsShouldHaveDefault</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDeeplyNestedIfStmts</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidReassigningParameters</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchDensity</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConstructorCallsOverridableMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AccessorClassGeneration</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalFieldCouldBeStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloseResource</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonStaticInitializer</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultLabelNotLastInSwitchStmt</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonCaseLabelInSwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OptimizableToArrayCall</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BadComparison</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EqualsNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConfusingTernary</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InstantiationToGetClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IdempotentOperations</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimpleDateFormatNeedsLocale</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImmutableField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseLocaleWithCaseConversions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidProtectedFieldInFinalClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentToNonFinalStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingStaticMethodInNonInstantiatableClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidSynchronizedAtMethodLevel</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingBreakInSwitch</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseNotifyAllInsteadOfNotify</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstanceofChecksInCatchClause</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAbstractMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyConditional</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CompareObjectsWithEquals</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PositionLiteralsFirstInComparisons</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryLocalBeforeReturn</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonThreadSafeSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyConstructor</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidConstantsInterface</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnsynchronizedStaticDateFormatter</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PreserveStackTrace</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCollectionIsEmpty</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SingularField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnEmptyArrayRatherThanNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAnyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooFewBranchesForASwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingThrowable</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExceptionAsFlowControl</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingNPE</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingRawExceptionTypes</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNullPointerException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidRethrowingException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotExtendJavaLangError</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotThrowExceptionInFinally</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNewInstanceOfSameException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateField</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedLocalVariable</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateMethod</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedFormalParameter</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MoreThanOneLogger</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LoggerIsNotStaticFinal</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SystemPrintln</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidPrintStackTrace</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDuplicateLiterals</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringInstantiation</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringToString</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientStringBuffering</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryCaseChange</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferLength</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AppendCharacterWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConsecutiveLiteralAppends</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseIndexOfChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientEmptyStringCheck</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InsufficientStringBufferDeclaration</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessStringValueOf</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringBufferInstantiationWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseEqualsToCompareStrings</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidStringBufferField</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceVectorWithList</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceHashtableWithMap</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceEnumerationWithIterator</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidEnumAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAssertAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IntegerInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ByteInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LongInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseBeforeAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseAfterAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseTestAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitUseExpected</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseProperClassLoader</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MDBAndSessionBeanNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteSessionInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalInterfaceSessionNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalHomeNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallSystemExit</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StaticEJBFieldShouldBeFinal</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotUseThreads</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstantiatingObjectsInLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArrayListInsteadOfVector</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyStartsWith</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferForStringAppends</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArraysAsList</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidArrayLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryWrapperObjectCreation</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AddEmptyString</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyCatchBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyIfStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyWhileStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyTryBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySwitchStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JumbledIncrementer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopShouldBeWhileLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConversionTemporary</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OverrideBothEqualsAndHashcode</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoubleCheckedLocking</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnFromFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySynchronizedBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryReturn</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStaticInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnconditionalIfStatement</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStatementNotInLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryFinalModifier</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CollapsibleIfStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOverridingMethod</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassCastExceptionWithToArray</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOperationOnImmutable</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisplacedNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedNullCheckInEquals</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThreadGroup</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BrokenNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BigIntegerInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingOctalValues</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingHardCodedIP</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CheckResultSet</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidMultipleUnaryOperators</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodReturnsInternalArray</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>ArrayIsStoredDirectly</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>CouplingBetweenObjects</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveImports</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DuplicateImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportJavaLang</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImportFromSamePackage</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyStaticImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitStaticSuite</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitSpelling</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitAssertionsShouldIncludeMessage</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitTestsShouldIncludeAssert</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TestClassWithoutTestCases</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertEqualsInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertSameInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertNullInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NullAssignment</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedModifier</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentInOperand</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AtLeastOneConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportSun</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousOctalEscape</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CallSuperInConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryParentheses</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultPackage</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInversion</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DataflowAnomalyAnalysis</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFinalLocalVariable</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingShortType</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingVolatile</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingNativeCode</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAccessibilityAlteration</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallGarbageCollectionExplicitly</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractNaming</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDollarSigns</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodWithSameNameAsEnclosingClass</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousHashcodeMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousConstantFieldName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousEqualsMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingTypeName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NoPackage</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PackageCase</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisleadingVariableName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanGetMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NPathComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveMethodLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveParameterList</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveClassLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CyclomaticComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessivePublicCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyFields</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssMethodCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssTypeCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssConstructorCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyMethods</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinalizer</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOnlyCallsSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOverloaded</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeDoesNotCallSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeShouldBeProtected</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCallingFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCorrectExceptionLogging</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperLogger</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingSerialVersionUID</name>
+            <ruleset>JavaBean Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperCloneImplementation</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneThrowsCloneNotSupportedException</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+    </rules>
+    <includeDerivedFiles>false</includeDerivedFiles>
+    <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/.project b/org.eclipse.osee.framework.ui.workspacebundleloader/.project
new file mode 100644
index 0000000..25afc8e
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.framework.ui.workspacebundleloader</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..84e9a50
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Workspacebundlelodaer Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.workspacebundleloader;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.framework.ui.plugin.util,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.eclipse.ui.views,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.ui.workspacebundleloader
+Require-Bundle: org.eclipse.osgi
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/build.properties b/org.eclipse.osee.framework.ui.workspacebundleloader/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/plugin.xml b/org.eclipse.osee.framework.ui.workspacebundleloader/plugin.xml
new file mode 100644
index 0000000..65c9e06
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/plugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+  
+   <extension
+         id="WorkspaceStarterNature"
+         name="Workspace Starter Nature"
+         point="org.eclipse.core.resources.natures">
+      <runtime>
+         <run
+               class="org.eclipse.osee.framework.ui.workspacebundleloader.WorkspaceStarterNature">
+            <parameter
+                  name="org.eclipse.osee.benchWorkspaceStarter.parameter1"
+                  value="org.eclipse.osee.benchWorkspaceStarter.parameter1">
+            </parameter>
+         </run>
+      </runtime>
+   </extension>
+
+   
+   <extension
+         point="org.eclipse.ui.startup">
+      <startup
+            class="org.eclipse.osee.framework.ui.workspacebundleloader.EarlyStartup">
+      </startup>
+   </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/pom.xml b/org.eclipse.osee.framework.ui.workspacebundleloader/pom.xml
new file mode 100644
index 0000000..195fecf
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/pom.xml
@@ -0,0 +1,17 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.ote.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../org.eclipse.osee.ote.parent</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.osee.framework.ui.workspacebundleloader</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OSEE UI Workspace Bundle Loader (Incubation)</name>
+  
+</project>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleCollection.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleCollection.java
new file mode 100644
index 0000000..98d7304
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleCollection.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class BundleCollection {
+
+	Map<String, List<BundleInfoLite>> bundleByName = new HashMap<>();
+	Map<URL, BundleInfoLite> bundleByURL = new HashMap<>();
+
+	public BundleCollection(){
+		
+	}
+	
+	public void add(BundleInfoLite bundle){
+		List<BundleInfoLite> bundles = bundleByName.get(bundle.getSymbolicName());
+		if(bundles == null){
+			bundles = new ArrayList<>();
+			bundleByName.put(bundle.getSymbolicName(), bundles);
+		}
+		bundles.add(bundle);
+		bundleByURL.put(bundle.getSystemLocation(), bundle);
+	}
+	
+	public List<BundleInfoLite> getByBundleName(String name){
+		return bundleByName.get(name);
+	}
+	
+	public BundleInfoLite getByURL(URL url){
+		return bundleByURL.get(url);
+	}
+
+	public List<BundleInfoLite> getInstalledBundles() {
+		List<BundleInfoLite> bundles = new ArrayList<>();
+		for(BundleInfoLite info: bundleByURL.values()){
+			if(info.isInstalled()){
+				bundles.add(info);
+			}
+		}
+		return bundles;
+	}
+
+	public List<BundleInfoLite> getLatestBundles() {
+		List<BundleInfoLite> latest = new ArrayList<>();
+		for(List<BundleInfoLite> infolist:this.bundleByName.values()){
+			if(infolist.size() == 1){
+				latest.add(infolist.get(0));
+			} else {
+				long lastModified = 0;
+				BundleInfoLite newest = null;
+				for(BundleInfoLite lite:infolist){
+					long newLastModified = new File(lite.getSystemLocation().getFile()).lastModified();
+					if(newLastModified > lastModified){
+						lastModified = newLastModified;
+						newest = lite;
+					}
+				}
+				latest.add(newest);
+			}
+		}
+		return latest;
+	}
+	
+	
+	
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleInfoLite.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleInfoLite.java
new file mode 100644
index 0000000..9da2802
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleInfoLite.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.NoSuchAlgorithmException;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+public class BundleInfoLite {
+
+   private final String symbolicName;
+   private final String version;
+   private final URL systemLocation;
+   private final File file;
+   private final Manifest manifest;
+   private byte[] md5Digest;
+   private Bundle bundle;
+
+   
+   public BundleInfoLite(URL systemLocation) throws IOException {
+      File tmpFile;
+      try {
+         tmpFile = new File(systemLocation.toURI());
+      } catch (URISyntaxException ex) {
+         tmpFile = new File(systemLocation.getPath());
+      }
+      this.file = tmpFile;
+
+      JarFile jarFile = new JarFile(file);
+      this.manifest = jarFile.getManifest();
+      this.symbolicName = generateBundleName(manifest);
+      this.version = manifest.getMainAttributes().getValue("Bundle-Version");
+
+      this.systemLocation = systemLocation;
+      this.md5Digest = null;
+   }
+
+   /**
+    * @return the name of the bundle
+    */
+   private String generateBundleName(Manifest jarManifest) {
+      String nameEntry = jarManifest.getMainAttributes().getValue("Bundle-SymbolicName");
+	  if(nameEntry == null){
+	     return "unknown";
+	  }
+      // Sometimes there's a semicolon then extra info - ignore this
+      int index = nameEntry.indexOf(';');
+      if (index != -1) {
+         nameEntry = nameEntry.substring(0, index);
+      }
+
+      return nameEntry;
+   }
+
+   /**
+    * @return the symbolicName
+    */
+   public String getSymbolicName() {
+      return symbolicName;
+   }
+
+   /**
+    * @return the version
+    */
+   public String getVersion() {
+      return version;
+   }
+
+   /**
+    * @return the location
+    */
+   public URL getSystemLocation() {
+      return systemLocation;
+   }
+
+   @Override
+   public String toString() {
+      return getSymbolicName() + ":" + getVersion();
+   }
+
+   /**
+    * @return the md5Digest
+    */
+   public byte[] getMd5Digest() {
+      // Do lazy calculation of this since it can be costly
+      // and does not get read for all bundle info's
+      if (md5Digest == null) {
+         try {
+            InputStream in = systemLocation.openStream();
+
+            md5Digest = ChecksumUtil.createChecksum(in, "MD5");
+
+            in.close();
+         } catch (NoSuchAlgorithmException ex) {
+            throw new IllegalStateException("Always expect MD5 to be available", ex);
+         } catch (IOException ex) {
+            throw new IllegalStateException("Always expect local jar file to be available", ex);
+         }
+      }
+      return md5Digest;
+   }
+   
+   public void install(BundleContext context) throws BundleException, IOException{
+	   bundle = context.installBundle("reference:" + this.getSystemLocation().toExternalForm());
+   }
+   
+   public Bundle uninstall() throws BundleException{
+	   if(isInstalled()){
+		   bundle.uninstall();
+	   }
+	   return bundle;
+   }
+   
+   public boolean isInstalled() {
+	   if(bundle == null){
+		   return false;
+	   } else {
+		   int state = bundle.getState();
+		   return state != Bundle.UNINSTALLED;
+	   }
+   }
+   
+   public boolean isStarted() {
+	   if(isInstalled()){
+		   int state = bundle.getState();
+		   return state == Bundle.ACTIVE || state == Bundle.STARTING;
+	   } else {
+		   return false;
+	   }
+   }
+   
+   public void start(BundleContext context) throws BundleException{
+	   if(bundle == null){
+		  for(Bundle findit:context.getBundles()){
+			  if(findit.getSymbolicName().equals(getSymbolicName())){
+				  findit.start();
+				  return;
+			  }
+		  }
+	      OseeLog.log(BundleInfoLite.class, Level.WARNING, String.format("Tried to start bundle [%s] that is not installed.", getSymbolicName()));  
+	   } else if (bundle.getState() == Bundle.INSTALLED || bundle.getState() == Bundle.RESOLVED){
+		   bundle.start();
+	   } 
+   }
+   
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/EarlyStartup.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/EarlyStartup.java
new file mode 100644
index 0000000..27397ad
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/EarlyStartup.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.eclipse.ui.IStartup;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EarlyStartup implements IStartup {
+
+   private SafeWorkspaceTracker workspaceTracker;
+
+   @Override
+   public void earlyStartup() {
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            try {
+               Bundle bundle = Platform.getBundle("org.eclipse.osee.framework.ui.workspacebundleloader");
+               bundle.start();
+               workspaceTracker = new SafeWorkspaceTracker(bundle.getBundleContext());
+               workspaceTracker.open(true);
+            } catch (BundleException ex) {
+               OseeLog.log(Activator.class, Level.SEVERE, ex);
+            }
+         }
+      });
+
+   }
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/FileChangeDetector.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/FileChangeDetector.java
new file mode 100644
index 0000000..976ebf7
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/FileChangeDetector.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class FileChangeDetector {
+
+   private final ConcurrentHashMap<URL, byte[]> bundleNameToMd5Map;
+
+   public FileChangeDetector() {
+      bundleNameToMd5Map = new ConcurrentHashMap<>();
+   }
+
+   public boolean isChanged(URL url) {
+      byte[] digest = getMd5Checksum(url);
+      if (bundleNameToMd5Map.containsKey(url)) {
+         // check for bundle binary equality
+         if (!Arrays.equals(bundleNameToMd5Map.get(url), digest)) {
+            bundleNameToMd5Map.put(url, digest);
+            return true;
+         } else {
+            return false;
+         }
+      } else {
+         bundleNameToMd5Map.put(url, digest);
+         return true;
+      }
+   }
+
+   private byte[] getMd5Checksum(URL url) {
+      InputStream in = null;
+      byte[] digest = new byte[0];
+      try {
+         in = url.openStream();
+         digest = ChecksumUtil.createChecksum(url.openStream(), "MD5");
+      } catch (IOException ex) {
+         OseeLog.log(FileChangeDetector.class, Level.SEVERE, ex);
+      } catch (NoSuchAlgorithmException ex) {
+         OseeLog.log(FileChangeDetector.class, Level.SEVERE, ex);
+      } finally {
+         if (in != null) {
+            try {
+               in.close();
+            } catch (IOException ex) {
+               OseeLog.log(FileChangeDetector.class, Level.SEVERE, ex);
+            }
+         }
+      }
+      return digest;
+   }
+
+   public boolean remove(URL url) {
+      bundleNameToMd5Map.remove(url);
+      return true;
+   }
+
+   public void clear() {
+      bundleNameToMd5Map.clear();
+   }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java
new file mode 100644
index 0000000..db15946
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.net.URL;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IJarChangeListener<T extends JarCollectionNature> {
+
+   /**
+    * Called for each addition of bundle
+    */
+   public void handleBundleAdded(URL url);
+
+   /**
+    * Called for each change of bundle
+    */
+   public void handleBundleChanged(URL url);
+
+   /**
+    * Called for each removal of bundle
+    */
+   public void handleBundleRemoved(URL url);
+
+   /**
+    * Called after all add/change/remove methods have been invoked for a given delta.
+    */
+   public void handlePostChange();
+
+   /**
+    * Called just before a project with the nature is closed
+    */
+   public void handleNatureClosed(T nature);
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java
new file mode 100644
index 0000000..910ffab
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Handler for IResourceChangeEvent.POST_CHANGE and IResourceChangeEvent.PRE_CLOSE events for projects with a given
+ * nature ID that extends JarCollectionNature. POST_CHANGE events against the jars in projects with the nature, and
+ * close events on the projects with the nature are detected and offered to an IJarChangeListener.
+ * 
+ * @author Robert A. Fisher
+ */
+public class JarChangeResourceListener<T extends JarCollectionNature> implements IResourceChangeListener {
+   private final String natureId;
+   private final IJarChangeListener<T> listener;
+
+   public JarChangeResourceListener(String natureId, IJarChangeListener<T> listener) {
+      if (natureId == null) {
+         throw new IllegalArgumentException("natureId must not be null");
+      }
+      if (listener == null) {
+         throw new IllegalArgumentException("listener must not be null");
+      }
+      this.natureId = natureId;
+      this.listener = listener;
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public void resourceChanged(IResourceChangeEvent event) {
+      try {
+         if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
+            handleChangeEvent(event);
+         } else if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
+            IResource resource = event.getResource();
+            if (resource != null && resource instanceof IProject) {
+               IProject project = (IProject) resource;
+
+               IProjectNature nature = project.getNature(natureId);
+               if (nature != null) {
+                  listener.handleNatureClosed((T) nature);
+               }
+            }
+         }
+      } catch (CoreException ex) {
+      } catch (MalformedURLException ex) {
+      }
+   }
+
+   private void handleChangeEvent(IResourceChangeEvent event) throws CoreException, MalformedURLException {
+      IResourceDelta rootDelta = event.getDelta();
+      if (rootDelta != null) {
+         boolean triggered = false;
+         for (IResourceDelta child : rootDelta.getAffectedChildren()) {
+            IResource resource = child.getResource();
+            if (resource != null && resource instanceof IProject) {
+               IProject project = (IProject) resource;
+
+               IProjectNature nature = project.getNature(natureId);
+               if (nature != null) {
+                  JarCollectionNature starterNature = (JarCollectionNature) nature;
+                  IPath[] paths = starterNature.getProjectRelativeBundlePaths();
+                  for (IPath path : paths) {
+                     IResourceDelta pluginDelta = child.findMember(path);
+                     if (pluginDelta != null && isModifyingChange(pluginDelta)) {
+                        handlePluginChanges(project.getLocation().removeLastSegments(1),
+                           pluginDelta.getAffectedChildren());
+                        triggered = true;
+                     }
+                  }
+               }
+            }
+         }
+
+         if (triggered) {
+            listener.handlePostChange();
+         }
+      }
+   }
+
+   private boolean isModifyingChange(IResourceDelta pluginDelta) {
+      boolean synch = (pluginDelta.getFlags() & IResourceDelta.SYNC) != 0;
+      //		boolean content = (pluginDelta.getFlags() & IResourceDelta.CONTENT) != 0;
+      //		boolean REPLACED = (pluginDelta.getFlags() & IResourceDelta.REPLACED) != 0;
+      //		boolean MARKERS = (pluginDelta.getFlags() & IResourceDelta.MARKERS) != 0;
+      //		boolean TYPE = (pluginDelta.getFlags() & IResourceDelta.TYPE) != 0;
+      //		boolean MOVED_FROM = (pluginDelta.getFlags() & IResourceDelta.MOVED_FROM) != 0;
+      //		boolean MOVED_TO = (pluginDelta.getFlags() & IResourceDelta.MOVED_TO) != 0;
+      //		boolean OPEN = (pluginDelta.getFlags() & IResourceDelta.OPEN) != 0;
+      //		boolean ENCODING = (pluginDelta.getFlags() & IResourceDelta.ENCODING) != 0;
+      //		boolean DESCRIPTION = (pluginDelta.getFlags() & IResourceDelta.DESCRIPTION) != 0;
+
+      //		boolean ADDED = (pluginDelta.getKind() & IResourceDelta.ADDED) != 0;
+      //		boolean CHANGED = (pluginDelta.getKind() & IResourceDelta.CHANGED) != 0;
+      //		boolean ADDED_PHANTOM = (pluginDelta.getKind() & IResourceDelta.ADDED_PHANTOM) != 0;
+      //		boolean REMOVED_PHANTOM = (pluginDelta.getKind() & IResourceDelta.REMOVED_PHANTOM) != 0;
+      return !synch;
+   }
+
+   protected void handlePluginChanges(IPath workspacePath, IResourceDelta[] affectedChildren) throws MalformedURLException {
+      for (IResourceDelta affectedPluginDelta : affectedChildren) {
+         URL url = workspacePath.append(affectedPluginDelta.getFullPath()).toFile().toURI().toURL();
+         if (affectedPluginDelta.getFullPath().getFileExtension().equals("jar")) {
+            try {
+               switch (affectedPluginDelta.getKind()) {
+                  case IResourceDelta.ADDED:
+                     listener.handleBundleAdded(url);
+                     break;
+                  case IResourceDelta.CHANGED:
+                     listener.handleBundleChanged(url);
+                     break;
+                  case IResourceDelta.REMOVED:
+                     listener.handleBundleRemoved(url);
+                     break;
+
+                  default:
+                     System.err.println("Do not expect change kind of " + generateKindString(affectedPluginDelta.getKind()));
+               }
+            } catch (RuntimeException ex) {
+               ex.printStackTrace();
+               throw ex;
+            }
+         }
+      }
+   }
+
+   private String generateKindString(int kind) {
+      switch (kind) {
+         case IResourceDelta.ADDED:
+            return "Added";
+         case IResourceDelta.CHANGED:
+            return "Changed";
+         case IResourceDelta.REMOVED:
+            return "Removed";
+         default:
+            return "Unexpected Kind: " + kind;
+      }
+   }
+
+   protected String generateEventString(int type) {
+      switch (type) {
+         case IResourceChangeEvent.POST_BUILD:
+            return "Post Build";
+         case IResourceChangeEvent.POST_CHANGE:
+            return "Post Change";
+         case IResourceChangeEvent.PRE_BUILD:
+            return "Pre Build";
+         case IResourceChangeEvent.PRE_CLOSE:
+            return "Pre Close";
+         case IResourceChangeEvent.PRE_DELETE:
+            return "Pre Delete";
+         case IResourceChangeEvent.PRE_REFRESH:
+            return "Pre Refresh";
+         default:
+            return "Unknown Code: " + type;
+      }
+   }
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java
new file mode 100644
index 0000000..e6b694f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.jar.Attributes;
+import java.util.jar.Attributes.Name;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class JarCollectionNature implements IProjectNature {
+
+   private final Name BUNDLE_PATH_ATTRIBUTE;
+   private boolean isClosing;
+
+   protected IProject project;
+
+   /**
+    * @param BUNDLE_PATH_ATTRIBUTE the name of the attribute in the MANIFEST.MF to look at when looking for the path to
+    * the jars being provided.
+    */
+   public JarCollectionNature(String BUNDLE_PATH_ATTRIBUTE) {
+      super();
+      this.BUNDLE_PATH_ATTRIBUTE = new Name(BUNDLE_PATH_ATTRIBUTE);
+      this.isClosing = false;
+   }
+
+   /**
+    * @return the isClosing
+    */
+   public boolean isClosing() {
+      return isClosing;
+   }
+
+   /**
+    * @param isClosing the isClosing to set
+    */
+   public void setClosing(boolean isClosing) {
+      this.isClosing = isClosing;
+   }
+
+   @Override
+   public void configure() {
+   }
+
+   @Override
+   public void deconfigure() {
+   }
+
+   @Override
+   public IProject getProject() {
+      return project;
+   }
+
+   @Override
+   public void setProject(IProject project) {
+      this.project = project;
+   }
+
+   public Collection<URL> getBundles() {
+      Collection<URL> urls = new ArrayList<>();
+
+      if (isClosing) {
+         return urls;
+      }
+
+      IPath[] paths = getProjectRelativeBundlePaths();
+      for (IPath path : paths) {
+         IPath pluginsPath = project.getLocation().append(path);
+         File pluginDir = pluginsPath.toFile();
+         File[] jars = pluginDir.listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+               return name.endsWith(".jar");
+            }
+         });
+
+         if (jars != null) {
+            for (File jar : jars) {
+               try {
+                  urls.add(jar.toURI().toURL());
+               } catch (MalformedURLException ex) {
+                  OseeLog.log(JarCollectionNature.class, Level.SEVERE, ex);
+               }
+            }
+         }
+      }
+      return urls;
+   }
+
+   public IPath[] getProjectRelativeBundlePaths() {
+      Manifest manifest = getManifestFile();
+      Path[] paths;
+      Attributes mainAttributes = manifest.getMainAttributes();
+      String pathString;
+      if (mainAttributes.containsKey(BUNDLE_PATH_ATTRIBUTE)) {
+         pathString = mainAttributes.getValue(BUNDLE_PATH_ATTRIBUTE);
+         String[] tempPaths = pathString.split(",");
+         paths = new Path[tempPaths.length];
+         for (int i = 0; i < paths.length; i++) {
+            paths[i] = new Path(tempPaths[i].trim());
+         }
+      } else {
+         paths = new Path[1];
+         paths[0] = new Path("plugins");
+      }
+      return paths;
+   }
+
+   private Manifest getManifestFile() {
+      try {
+         File manifestFile = project.getLocation().append("META-INF").append("MANIFEST.MF").toFile();
+         if (manifestFile.exists()) {
+            return new Manifest(new FileInputStream(manifestFile));
+         } else {
+            return null;
+         }
+      } catch (Exception ex) {
+         ex.printStackTrace();
+         return null;
+      }
+   }
+
+   @SuppressWarnings("unchecked")
+   protected static <T extends JarCollectionNature> Collection<T> getWorkspaceProjects(String natureId, Class<T> clazz) throws CoreException {
+      IWorkspace workspace = ResourcesPlugin.getWorkspace();
+      IWorkspaceRoot workspaceRoot = workspace.getRoot();
+      IProject[] projects = workspaceRoot.getProjects();
+
+      Collection<T> natures = new LinkedList<>();
+
+      for (IProject project : projects) {
+         if (project.isOpen()) {
+            IProjectNature nature = project.getNature(natureId);
+            if (nature != null) {
+               JarCollectionNature jarNature = (JarCollectionNature) nature;
+               natures.add((T) jarNature);
+            }
+         }
+      }
+
+      return natures;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
new file mode 100644
index 0000000..d966ce8
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.net.URL;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SafeWorkspaceTracker extends ServiceTracker implements IJarChangeListener<WorkspaceStarterNature>, WorkspaceLoader, IWorkbenchListener {
+
+   private JarChangeResourceListener<WorkspaceStarterNature> workspaceListener;
+   private SafeWorkspaceAccess service;
+   private final WorkspaceBundleLoadCoordinator bundleCoordinator;
+
+   public SafeWorkspaceTracker(BundleContext context) {
+      super(context, SafeWorkspaceAccess.class.getName(), null);
+      bundleCoordinator = new WorkspaceBundleLoadCoordinator(new File(OseeData.getPath().toFile(), "loadedbundles"));
+      context.registerService(WorkspaceLoader.class.getName(), this, null);
+      PlatformUI.getWorkbench().addWorkbenchListener(this);
+   }
+
+   @Override
+   public Object addingService(ServiceReference reference) {
+      service = (SafeWorkspaceAccess) context.getService(reference);
+      setupWorkspaceBundleLoadingAfterBenchStartup();
+      return super.addingService(reference);
+   }
+
+   void setupWorkspaceBundleLoadingAfterBenchStartup() {
+      Jobs.runInJob(new PrecompileStartup("Loading Precompiled Libraries", Activator.BUNDLE_ID), false);
+   }
+
+   private class PrecompileStartup extends AbstractOperation {
+      public PrecompileStartup(String operationName, String pluginId) {
+         super(operationName, pluginId);
+      }
+
+      @Override
+      protected void doWork(IProgressMonitor monitor) throws Exception {
+         IWorkspace workspace = service.getWorkspace();
+         workspaceListener =
+            new JarChangeResourceListener<WorkspaceStarterNature>(WorkspaceStarterNature.NATURE_ID,
+               SafeWorkspaceTracker.this);
+         try {
+            loadBundles(monitor);
+         } catch (CoreException ex) {
+            OseeLog.log(Activator.class, Level.SEVERE, ex);
+         }
+         workspace.addResourceChangeListener(workspaceListener);
+
+      }
+   }
+
+   @Override
+   public synchronized void close() {
+      IWorkspace workspace = service.getWorkspace();
+      workspace.removeResourceChangeListener(workspaceListener);
+      super.close();
+   }
+
+   @Override
+   public void handleBundleAdded(URL url) {
+      String urlString = url.toString();
+      bundleCoordinator.addBundleToCheck(urlString);
+   }
+
+   @Override
+   public void handleBundleChanged(URL url) {
+      String urlString = url.toString();
+      bundleCoordinator.addBundleToCheck(urlString);
+   }
+
+   @Override
+   public void handleBundleRemoved(URL url) {
+      String urlString = url.toString();
+      bundleCoordinator.addBundleToCheck(urlString);
+   }
+
+   @Override
+   public void handlePostChange() {
+   }
+
+   @Override
+   public void handleNatureClosed(WorkspaceStarterNature nature) {
+      for (URL url : nature.getBundles()) {
+         handleBundleRemoved(url);
+      }
+   }
+
+   @Override
+   public void loadBundles(IProgressMonitor monitor) throws CoreException {
+      for (WorkspaceStarterNature starterNature : WorkspaceStarterNature.getWorkspaceProjects()) {
+         for (URL url : starterNature.getBundles()) {
+            try {
+               handleBundleAdded(url);
+            } catch (Exception ex) {
+               OseeLog.log(SafeWorkspaceTracker.class, Level.INFO, ex);
+               ex.printStackTrace();
+            }
+         }
+      }
+      bundleCoordinator.updateBundles(monitor);
+      bundleCoordinator.installLatestBundles(monitor);
+   }
+
+   @Override
+   public void unloadBundles() {
+      bundleCoordinator.uninstallBundles();
+   }
+
+   @Override
+   public boolean preShutdown(IWorkbench workbench, boolean forced) {
+      try{
+         bundleCoordinator.uninstallBundles();
+      } catch (Throwable th){
+            th.printStackTrace();
+      }
+      return true;
+   }
+
+   @Override
+   public void postShutdown(IWorkbench workbench) {
+   }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java
new file mode 100644
index 0000000..70b35f2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java
@@ -0,0 +1,649 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.ManagedFolderArea;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.WorkbenchException;
+import org.eclipse.ui.XMLMemento;
+import org.eclipse.ui.views.IViewDescriptor;
+import org.eclipse.ui.views.IViewRegistry;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.wiring.FrameworkWiring;
+
+public class WorkspaceBundleLoadCoordinator {
+
+	private static final String TAG_VIEW = "view";
+	private static final String TAG_PERSPECTIVE = "perspective";
+	private static final String TAG_OTE_PRECOMPILED = "OTEPrecompiled";
+	private static final String OTE_MEMENTO = "OTEMemento";
+	
+	private ManagedFolderArea managedFolderArea;
+	private Set<String> bundlesToCheck;
+	private BundleCollection managedArea = new BundleCollection();
+	private FrameworkWiring wiring;
+	
+	public WorkspaceBundleLoadCoordinator(File temporaryBundleLocationFolder) {
+		bundlesToCheck = new HashSet<>();
+		this.managedFolderArea = new ManagedFolderArea(temporaryBundleLocationFolder);
+		managedFolderArea.initialize();
+		this.wiring = getFrameworkWiring();
+		
+		Thread th = new Thread(new Runnable() {
+			@Override
+			public void run() {
+				int lastSize = 0;
+				boolean extraWait = false;
+				while(true){
+					try {
+					   if(extraWait){
+					      Thread.sleep(15000);
+					      extraWait = false;
+					   } else {
+					      Thread.sleep(5000);
+					   }
+					} catch (InterruptedException e) {
+					}
+					if(lastSize == bundlesToCheck.size()){
+						if(lastSize != 0){
+							if(bundlesToCheck.size() > 0){
+								lastSize = 0;
+								Operations.executeAsJob(new RefreshWorkspaceBundles(), false);
+								try {
+									Thread.sleep(1000*60); //give time to load so we don't get called twice
+								} catch (InterruptedException e) {
+								}
+							}
+						}
+					} else {
+					   if(bundlesToCheck.size() - lastSize > 5){
+					      extraWait = true;//big import allow for extra time for file imports
+					   }
+						lastSize = bundlesToCheck.size();
+					}
+				}
+			}
+		});
+		th.setName("OTE BundleLoad Check");
+		th.setDaemon(true);
+		th.start();
+	}
+	
+	private FrameworkWiring getFrameworkWiring() {
+	   FrameworkWiring frameworkWiring = null;
+	   Bundle bundle = FrameworkUtil.getBundle(getClass());
+      for(Bundle findit:bundle.getBundleContext().getBundles()){
+         frameworkWiring = findit.adapt(FrameworkWiring.class);
+         if(frameworkWiring != null){
+            break;
+         }
+      }
+      return frameworkWiring;
+   }
+
+
+	
+	private class RefreshWorkspaceBundles  extends AbstractOperation  {
+
+		public RefreshWorkspaceBundles() {
+			super("Update Precompiled", Activator.BUNDLE_ID);
+		}
+
+		@Override
+		protected void doWork(IProgressMonitor monitor) throws Exception {
+			updateBundles(monitor);
+			installLatestBundles(monitor);
+		}
+		
+	}
+
+	public void saveAndCloseViews(){
+		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
+			@Override
+			public void run() {
+				saveAndCloseManagedViews(determineManagedViews(), true);
+			}
+		});
+	}
+	
+	private void closeUpdatedViews(final List<BundleInfoLite> uninstallList){
+		PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
+			@Override
+			public void run() {
+				saveAndCloseManagedViews(determineManagedViews(uninstallList), true);
+			}
+		});
+	}
+	
+	
+	
+	public synchronized void uninstallBundles(){
+	   if(managedArea.getInstalledBundles().size() > 0){
+	      saveAndCloseViews();
+	      for(BundleInfoLite info:managedArea.getInstalledBundles()){
+	         try {
+	            info.uninstall();
+	         } catch (BundleException e) {
+	            OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+	         }
+	      }
+	      if(wiring != null){
+	         wiring.refreshBundles(null);
+	      }
+	      IWorkbench workbench = PlatformUI.getWorkbench();     
+	      if (workbench != null && workbench.getActiveWorkbenchWindow() != null){
+	         IViewRegistry registry = workbench.getViewRegistry();
+	         forceViewRegistryReload(workbench, registry);
+	      }
+	      waitForViewsToBeRegistered(null);
+	   }
+	}
+
+	
+	private void saveAndCloseManagedViews(Set<String> managedViewIds, boolean save) {
+		
+		IWorkbench workbench = PlatformUI.getWorkbench();     
+		if (managedArea.getInstalledBundles().size() > 0 && workbench != null){
+			IWorkbenchPage page = null;
+			if(PlatformUI.getWorkbench().getActiveWorkbenchWindow() == null){
+				IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
+				for(IWorkbenchWindow win :windows){
+					page = win.getActivePage();
+					if(page != null){
+						break;
+					} 
+				}
+			} else {
+				page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+			}
+			if(page == null){
+				return;
+			}
+			IPerspectiveDescriptor originalPerspective = page.getPerspective();
+			XMLMemento memento = XMLMemento.createWriteRoot(TAG_OTE_PRECOMPILED);
+			//find the view in other perspectives
+			IPerspectiveDescriptor[] pd = page.getOpenPerspectives();
+			for (int i = 0; i < pd.length; i++) {
+				try {
+					page.setPerspective(pd[i]);
+				} catch (Exception ex) {
+					// Ignore, this can get an NPE in Eclipse, see bug 4454
+				} 
+				IMemento perspectiveMemento = null;
+				try{
+					perspectiveMemento = memento.createChild(TAG_PERSPECTIVE);
+					perspectiveMemento.putString("id", pd[i].getId());
+				} catch (Exception ex){
+					//Ignore, the perspective id is invalid xml
+				}
+				IViewReference[] activeReferences = page.getViewReferences();
+				for (IViewReference viewReference : activeReferences) {
+				   int index = viewReference.getId().indexOf(":");
+				   String id = null;
+				   if(index>0){
+				      id = viewReference.getId().substring(0, index);
+				   } else {
+				      id = viewReference.getId();
+				   }
+					if (managedViewIds.contains(id)){
+						if(perspectiveMemento != null){
+							try{
+								IMemento viewMemento = perspectiveMemento.createChild(TAG_VIEW);
+								viewMemento.putString("id", id);
+								String secondaryId = viewReference.getSecondaryId();
+								if(secondaryId != null){
+									viewMemento.putString("secondId", secondaryId);
+								}
+								IWorkbenchPart part = viewReference.getPart(false);
+								if(part instanceof IViewPart){
+									IViewPart viewPart = (IViewPart)part;
+									viewPart.saveState(viewMemento);
+								}
+							} catch (Exception ex){
+								//Ignore, we failed during view save
+							}
+						}
+						try{
+						   page.hideView(viewReference);
+						} catch (Throwable th){
+						}
+					}
+				}
+			}
+			if(save){
+				saveMementoToFile(memento);
+			}
+			page.setPerspective(originalPerspective);
+		}
+	}
+
+	private Set<String> determineManagedViews() {
+		return determineManagedViews(null);
+	}
+	
+	private Set<String> determineManagedViews(List<BundleInfoLite> uninstallList){
+		Set<String> managedViewIds = new HashSet<>();
+		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint("org.eclipse.ui.views");
+		IExtension[] extensions = extensionPoint.getExtensions();
+		for(IExtension ex:extensions){
+			String name = ex.getContributor().getName();
+			if(managedArea.getByBundleName(name) != null){
+				IConfigurationElement[] elements = ex.getConfigurationElements();
+				for(IConfigurationElement el:elements){
+					if(el.getName().equals(TAG_VIEW)){
+						String id = el.getAttribute("id");
+						if(id != null){
+							if(uninstallList != null){
+								for(BundleInfoLite infoLite:uninstallList){
+									if(name.equals(infoLite.getSymbolicName())){
+										managedViewIds.add(id);
+										break;
+									}
+								}
+							} else  {
+								managedViewIds.add(id);
+							}
+						}
+					}
+				}
+			}
+		}
+		return managedViewIds;
+	}
+	
+	private boolean saveMementoToFile(XMLMemento memento) {
+		File stateFile = OseeData.getFile(OTE_MEMENTO);
+		if (stateFile == null) {
+			return false;
+		}
+		try {
+			FileOutputStream stream = new FileOutputStream(stateFile);
+			OutputStreamWriter writer = new OutputStreamWriter(stream, "utf-8"); //$NON-NLS-1$
+			memento.save(writer);
+			writer.close();
+		} catch (IOException e) {
+			stateFile.delete();
+			return false;
+		}
+		return true;
+	}
+	
+	 public static void copyFile(File source, File destination) throws IOException {
+	      final FileChannel in = new FileInputStream(source).getChannel();
+	      try {
+	         final FileChannel out;
+	         if (destination.isDirectory()) {
+	            out = new FileOutputStream(new File(destination, source.getName())).getChannel();
+	         } else {
+	            if (destination.exists()) {
+	               destination.delete(); // to work around some file permission problems
+	            }
+	            out = new FileOutputStream(destination).getChannel();
+	         }
+	         try {
+	            long position = 0;
+	            long size = in.size();
+	            while (position < size) {
+	               position += in.transferTo(position, size, out);
+	            }
+	         } finally {
+	            Lib.close(out);
+	         }
+	      } finally {
+	         Lib.close(in);
+	      }
+	   }
+	
+	
+	
+	private List<BundleInfoLite> determineDeltasBetweenBundlesToLoad() {
+		List<BundleInfoLite> bundlesToOperateOn = new ArrayList<>();
+		for(String urlString:bundlesToCheck){
+			try {
+				URL newURL;
+				try{
+					newURL = new URL(urlString);
+				} catch(MalformedURLException ex){
+					newURL = new File(urlString).toURI().toURL();	
+				}
+				
+				BundleInfoLite bundleInfo = new BundleInfoLite(newURL);
+				List<BundleInfoLite> bundleList = managedArea.getByBundleName(bundleInfo.getSymbolicName());
+				if(bundleList == null){
+					bundlesToOperateOn.add(bundleInfo);
+				} else {
+					boolean newBundle=true;
+					if(bundleList != null && bundleList.size() > 0){
+						byte[] digest1 = bundleInfo.getMd5Digest();
+						for(BundleInfoLite bundle:bundleList){
+							byte[] digest2 = bundle.getMd5Digest();
+							if (Arrays.equals(digest1, digest2)) {
+								newBundle = false;
+								new File(bundle.getSystemLocation().getFile()).setLastModified(System.currentTimeMillis());
+							}
+						}
+					} 
+					if(newBundle){
+						bundlesToOperateOn.add(bundleInfo);
+					}
+				}
+			} catch (MalformedURLException e) {
+				OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+			} catch (IOException e) {
+				OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+			}
+		}
+		bundlesToCheck.clear();
+		return bundlesToOperateOn;
+	}
+
+	public synchronized void addBundleToCheck(String urlString){
+		this.bundlesToCheck.add(urlString);
+	}
+	
+	public synchronized void updateBundles(IProgressMonitor monitor){
+		List<BundleInfoLite> deltas = determineDeltasBetweenBundlesToLoad();
+		monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.15));
+		List<BundleInfoLite> bundlesToAdd = managedFolderArea.copyDeltasToManagedFolder(deltas);
+		monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.30));
+		for(BundleInfoLite bundle:bundlesToAdd){
+		   managedArea.add(bundle);
+		}
+	    monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.05));
+	}
+	
+	public synchronized void installLatestBundles(final IProgressMonitor subMonitor){
+		final List<BundleInfoLite> bundles = managedArea.getLatestBundles();
+		Collection<Bundle> bundlesToRefresh = new ArrayList<>();
+		List<BundleInfoLite> uninstallListAll = new ArrayList<>();
+		for(BundleInfoLite info:bundles){
+			if(!info.isInstalled()){
+			   List<BundleInfoLite> uninstallList = managedArea.getByBundleName(info.getSymbolicName());
+			   if(uninstallList.size() > 1){
+			      for(BundleInfoLite toUninstall:uninstallList){
+			         if(toUninstall.isInstalled()){
+			            uninstallListAll.add(toUninstall);
+			         }
+			      }
+			   }
+			}
+		}
+		
+		closeUpdatedViews(uninstallListAll);
+		for(BundleInfoLite toUninstall:uninstallListAll){
+         try {
+            Bundle bundle = toUninstall.uninstall();
+            bundlesToRefresh.add(bundle);
+         } catch (BundleException e) {
+            OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+         }
+      }
+		
+		if(wiring != null && bundlesToRefresh.size() > 0){
+			final Object waitForLoad = new Object();
+			wiring.refreshBundles(bundlesToRefresh, new FrameworkListener(){
+				@Override
+				public void frameworkEvent(FrameworkEvent event) {
+					if(FrameworkEvent.PACKAGES_REFRESHED == event.getType()){
+						startBundles(bundles, subMonitor);
+						waitForViewsToBeRegistered(subMonitor);
+						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
+							@Override
+							public void run() {
+								restoreStateFromMemento(subMonitor);
+							}
+						});
+						synchronized (waitForLoad) {
+							waitForLoad.notifyAll();
+						}
+					}
+				}
+			});
+			synchronized (waitForLoad) {
+				try {
+					waitForLoad.wait(20000);
+				} catch (InterruptedException e) {
+				}
+			}
+		} else {
+			startBundles(bundles, subMonitor);
+			waitForViewsToBeRegistered(subMonitor);
+			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
+				@Override
+				public void run() {
+					restoreStateFromMemento(subMonitor);
+				}
+			});
+		}
+	}
+	
+	private boolean waitForViewsToBeRegistered(IProgressMonitor monitor){
+	   if(monitor != null)
+	      monitor.setTaskName("Waiting for views to register.");
+		for(int i = 0; i < 10; i++){
+		   if(monitor != null)
+		      monitor.worked(1);
+			CheckViewsRegistered check = new CheckViewsRegistered();
+			PlatformUI.getWorkbench().getDisplay().syncExec(check);
+			if(check.isLoaded()){
+				return true;
+			} else {
+				try {
+					Thread.sleep(5000);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return false;
+	}
+
+	private class CheckViewsRegistered implements Runnable {
+
+		private volatile boolean isLoaded = false;
+		
+		@Override
+		public void run() {
+			IWorkbench workbench = PlatformUI.getWorkbench();     
+			if (managedArea.getInstalledBundles().size() > 0 && workbench != null && workbench.getActiveWorkbenchWindow() != null){
+				IViewRegistry registry = workbench.getViewRegistry();
+				forceViewRegistryReload(workbench, registry);
+				Set<String> managedViews = determineManagedViews();
+				for(String viewId:managedViews){
+					try{
+						IViewDescriptor desc = registry.find(viewId);
+						if(desc == null){
+							return;
+						}
+					} catch (Exception ex){
+						return;
+					}
+				}
+				isLoaded = true;
+			} else { //no workspace bundles to load, so don't wait
+				isLoaded = true;
+			}
+
+		}
+		
+		public boolean isLoaded(){
+			return isLoaded;
+		}
+	}
+	
+	@SuppressWarnings({ "rawtypes" })
+   private void forceViewRegistryReload(IWorkbench workbench, IViewRegistry registry){
+      try{
+         Field field1 = registry.getClass().getDeclaredField("descriptors");
+         Field field2 = registry.getClass().getDeclaredField("stickyDescriptors");
+         Field field3 = registry.getClass().getDeclaredField("categories");
+         
+         field1.setAccessible(true);
+         field2.setAccessible(true);
+         field3.setAccessible(true);
+         
+         ((Map)field1.get(registry)).clear();
+         ((List)field2.get(registry)).clear();
+         ((Map)field3.get(registry)).clear();
+         
+         field1.setAccessible(false);
+         field2.setAccessible(false);
+         field3.setAccessible(false);
+         
+         Method[] methods = registry.getClass().getDeclaredMethods();
+         Method method = null;
+         for(Method m:methods){
+            if(m.getName().equals("postConstruct")){
+               method = m;
+               break;
+            }
+         }
+         if(method != null){
+            boolean access = method.isAccessible();
+            method.setAccessible(true);
+            try{
+               method.invoke(registry);
+            } finally {
+               method.setAccessible(access);
+            }
+         }
+      } catch (Throwable th){
+         OseeLog.log(this.getClass(), Level.SEVERE, th);
+      }
+   }
+	
+
+	private void restoreStateFromMemento(IProgressMonitor restore) {
+		File mementoFile = OseeData.getFile(OTE_MEMENTO);
+		if(mementoFile.exists()){
+			try {
+				IWorkbench workbench = PlatformUI.getWorkbench();     
+				if (managedArea.getInstalledBundles().size() > 0 && workbench != null && workbench.getActiveWorkbenchWindow() != null){
+					IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+					IPerspectiveDescriptor originalPerspective = page.getPerspective();
+					IPerspectiveDescriptor[] pds = page.getOpenPerspectives();
+
+					XMLMemento memento = XMLMemento.createReadRoot(new FileReader(mementoFile));
+					IMemento[] perspectives = memento.getChildren(TAG_PERSPECTIVE);
+					if(perspectives != null){
+						for(IMemento perspective:perspectives){
+							IMemento[] views = perspective.getChildren(TAG_VIEW);
+							if(views != null && views.length > 0){
+								String perspectiveId = perspective.getString("id");
+								for(IPerspectiveDescriptor pd:pds){
+									if(pd.getId().equals(perspectiveId)){
+										page.setPerspective(pd);
+										for(IMemento view:views){
+											String viewId = view.getString("id");
+											String secondId = view.getString("secondId");
+											if(viewId != null){
+												//show view
+												try {
+													page.showView(viewId, secondId, IWorkbenchPage.VIEW_ACTIVATE);
+												} catch (PartInitException ex) {
+													System.err.println("COULD NOT FIND " + viewId + ", with ID # = " + secondId);
+													ex.printStackTrace();
+												}
+											}
+										}
+										break;
+									}
+								}
+							}
+						}
+					}
+
+					page.setPerspective(originalPerspective);
+				}
+
+			} catch (WorkbenchException e) {
+				e.printStackTrace();
+			} catch (FileNotFoundException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private void startBundles(Collection<BundleInfoLite> bundles, IProgressMonitor subMonitor){
+		BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+		subMonitor.setTaskName("Installing Bundles");
+		double workPercentage = 0.50 / (bundles.size()*2);
+		int workAmount = Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, workPercentage);
+		for(BundleInfoLite info:bundles){
+			if(!info.isInstalled()){
+				try {
+					info.install(context);					
+				} catch (BundleException e) {
+				} catch (IOException e) {
+				} 
+			}
+			subMonitor.worked(workAmount*2);
+		}
+		for(BundleInfoLite info:bundles){
+			if(!info.isStarted()){
+				try {
+					info.start(context);
+				} catch (BundleException e) {
+				} 
+			}
+			subMonitor.worked(workAmount);
+		}
+	}
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceLoader.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceLoader.java
new file mode 100644
index 0000000..3bebf60
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceLoader.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.osgi.framework.BundleException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface WorkspaceLoader {
+   public void loadBundles(IProgressMonitor monitor) throws CoreException, BundleException;
+
+   public void unloadBundles();
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceStarterNature.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceStarterNature.java
new file mode 100644
index 0000000..eeb2cd2
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceStarterNature.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ */
+public class WorkspaceStarterNature extends JarCollectionNature {
+   public static final String NATURE_ID = "org.eclipse.osee.framework.ui.workspacebundleloader.WorkspaceStarterNature";
+   static final String BUNDLE_PATH_ATTRIBUTE = "WorkspaceBundlePath";
+
+   public WorkspaceStarterNature() {
+      super(BUNDLE_PATH_ATTRIBUTE);
+   }
+
+   public static Collection<WorkspaceStarterNature> getWorkspaceProjects() throws CoreException {
+      return getWorkspaceProjects(NATURE_ID, WorkspaceStarterNature.class);
+   }
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java
new file mode 100644
index 0000000..ed427d4
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader.internal;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Activator implements BundleActivator {
+
+   public static final String BUNDLE_ID = "org.eclipse.osee.framework.ui.workspacebundleloader";
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+   }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java
new file mode 100644
index 0000000..5e0c83a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java
@@ -0,0 +1,113 @@
+package org.eclipse.osee.framework.ui.workspacebundleloader.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.workspacebundleloader.BundleInfoLite;
+import org.eclipse.osee.framework.ui.workspacebundleloader.WorkspaceBundleLoadCoordinator;
+
+public class ManagedFolderArea {
+
+   private File bundleLocationFolder;
+
+   public ManagedFolderArea(File temporaryBundleLocationFolder) {
+      this.bundleLocationFolder = temporaryBundleLocationFolder;
+   }
+   
+   public void initialize(){
+      bundleLocationFolder = setupTemporaryBundle(this.bundleLocationFolder);
+   }
+
+   private File setupTemporaryBundle(final File folder){
+      File folderToReturn = folder;
+      if(!folderToReturn.exists()){
+         if(!folderToReturn.mkdirs()){
+            folderToReturn = makeTempFolder();
+         }
+      } else if(folderToReturn.exists() && !folderToReturn.isDirectory()){
+         folderToReturn = makeTempFolder();
+      } else if(folderToReturn.exists()){
+         cleanOutDirectory(folderToReturn);
+      }
+      return folderToReturn;
+   }
+   
+   /**
+    * should be a flat list of folders with the symbolic name of the bundle and then a version for each jar underneath each folder.
+    * @param folderToReturn 
+    */
+   private void cleanOutDirectory(File folderRoot) {
+      File[] symbolicNameFolders = folderRoot.listFiles();
+      for(File folder:symbolicNameFolders){
+         if(folder.isDirectory()){
+            for(File file :folder.listFiles()){
+               file.delete();
+            }
+            folder.delete();
+         }
+      }
+   }
+   
+   private File makeTempFolder(){
+      File folder = new File(System.getProperty("java.io.tmpdir"));
+      File oteFolder = new File(folder, "otebundleload");
+      if(!oteFolder.exists()){
+         oteFolder.mkdirs();
+      }
+      return oteFolder;
+   }
+   
+   public List<BundleInfoLite> copyDeltasToManagedFolder(List<BundleInfoLite> copies) {
+      List<BundleInfoLite> bundlesAdded = new ArrayList<>();
+      for(BundleInfoLite info: copies){
+         File folder = new File(bundleLocationFolder, info.getSymbolicName());
+         folder.mkdirs();
+         File newFile = new File(folder, info.getVersion() + ".jar");
+         if(newFile.exists()){
+            newFile.delete();
+         }
+         FileChannel out = null;
+         FileChannel in = null;
+         try {
+            out = new FileOutputStream(newFile).getChannel();
+            String path = info.getSystemLocation().toURI().getPath();
+            in = new FileInputStream(new File(path)).getChannel();
+
+            long position = 0;
+            long size = in.size();
+            while (position < size) {
+               position += in.transferTo(position, size, out);
+            }
+            BundleInfoLite newBundle = new BundleInfoLite(newFile.toURI().toURL());
+            bundlesAdded.add(newBundle);
+         } catch (IOException e) {
+            OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+         } catch (URISyntaxException e) {
+            OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+         } finally {
+            try {
+               if(in != null){
+                  in.close();
+               }
+            } catch (IOException e) {
+            }
+            try {
+               if(out != null){
+                  out.close();
+               }
+            } catch (IOException e) {
+            }
+         }
+      }
+      return bundlesAdded;
+   }
+   
+}
diff --git a/org.eclipse.osee.logback.config/.classpath b/org.eclipse.osee.logback.config/.classpath
new file mode 100644
index 0000000..acad1c2
--- /dev/null
+++ b/org.eclipse.osee.logback.config/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.logback.config/.project b/org.eclipse.osee.logback.config/.project
new file mode 100644
index 0000000..8e304fd
--- /dev/null
+++ b/org.eclipse.osee.logback.config/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.logback.config</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.logback.config/META-INF/MANIFEST.MF b/org.eclipse.osee.logback.config/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..204c7f7
--- /dev/null
+++ b/org.eclipse.osee.logback.config/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Logback Config (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.logback.config
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Fragment-Host: ch.qos.logback.classic;bundle-version="0.9.27"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.logback.config/build.properties b/org.eclipse.osee.logback.config/build.properties
new file mode 100644
index 0000000..72bcc2a
--- /dev/null
+++ b/org.eclipse.osee.logback.config/build.properties
@@ -0,0 +1,3 @@
+bin.includes = META-INF/,\
+               .,\
+               logback.xml
diff --git a/org.eclipse.osee.logback.config/logback-test.xml b/org.eclipse.osee.logback.config/logback-test.xml
new file mode 100644
index 0000000..f0425fb
--- /dev/null
+++ b/org.eclipse.osee.logback.config/logback-test.xml
@@ -0,0 +1,29 @@
+<configuration debug="true">
+	<!-- See documentation at http://logback.qos.ch/manual/joran.html -->
+
+	<!-- To select this configuration add -Dlogback.configurationFile=logback-dev.xml -->
+	<!-- Set attribute debug="true" to configuration xml element to trace logback configuration -->
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+		<encoder>
+			<pattern>%-40(%d{HH:mm:ss.SSS} [%-25.25logger{26}] %-5level) - %msg%n</pattern>
+			<outputPatternAsHeader>true</outputPatternAsHeader>
+		</encoder>
+	</appender>
+
+	<!-- Configure OSEE log messages -->
+	<logger name="org.eclipse.osee.jdbc" level="TRACE" />
+	
+	<logger name="org.eclipse.osee.orcs.db" level="TRACE" />
+	<logger name="org.eclipse.osee.database" level="TRACE" />
+	<!-- <logger name="org.eclipse.osee.orcs.core" level="TRACE" /> -->
+	<logger name="org.eclipse.osee.framework.core.server" level="INFO" />
+
+	<!-- <logger name="org.apache.cxf" level="INFO" /> -->
+	<!-- <logger name="org.eclipse.osee.hsqldb" level="DEBUG" /> -->
+
+	<root level="WARN">
+		<appender-ref ref="STDOUT" />
+	</root>
+</configuration>
\ No newline at end of file
diff --git a/org.eclipse.osee.logback.config/logback.xml b/org.eclipse.osee.logback.config/logback.xml
new file mode 100644
index 0000000..dff7317
--- /dev/null
+++ b/org.eclipse.osee.logback.config/logback.xml
@@ -0,0 +1,23 @@
+<configuration debug="true">
+	<!-- See documentation at http://logback.qos.ch/manual/joran.html -->
+
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder 
+			by default -->
+		<encoder>
+			<pattern>%-50(%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-25.25logger{26}] %-5level) - %msg%n</pattern>
+			<outputPatternAsHeader>true</outputPatternAsHeader>
+		</encoder>
+	</appender>
+
+	<!-- Configure OSEE log messages -->
+	<logger name="org.eclipse.osee" level="WARN" />
+	<logger name="org.eclipse.osee.framework.core.server" level="INFO" />
+	
+	<!-- <logger name="org.eclipse.osee.orcs.db" level="DEBUG" /> -->
+	<!-- <logger name="org.apache.cxf" level="INFO" />-->
+
+	<root level="WARN">
+		<appender-ref ref="STDOUT" />
+	</root>
+</configuration>
\ No newline at end of file
diff --git a/org.eclipse.osee.logback.config/pom.xml b/org.eclipse.osee.logback.config/pom.xml
new file mode 100644
index 0000000..0ed3c10
--- /dev/null
+++ b/org.eclipse.osee.logback.config/pom.xml
@@ -0,0 +1,17 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.x.server.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../../plugins/org.eclipse.osee.x.server.parent</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.osee.logback.config</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OSEE Logback Config - (Incubation)</name>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.logger.slf4j/.classpath b/org.eclipse.osee.logger.slf4j/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.logger.slf4j/.project b/org.eclipse.osee.logger.slf4j/.project
new file mode 100644
index 0000000..af3299e
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.logger.slf4j</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ds.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.logger.slf4j/META-INF/MANIFEST.MF b/org.eclipse.osee.logger.slf4j/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1081f5b
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Osee Logger Slf4j (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.logger.slf4j
+Bundle-Version: 0.25.3.qualifier
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.logger,
+ org.osgi.framework,
+ org.osgi.service.component,
+ org.osgi.service.log,
+ org.slf4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.logger.slf4j/OSGI-INF/log.impl.provider.xml b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.impl.provider.xml
new file mode 100644
index 0000000..72fdbd6
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.impl.provider.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="false" name="org.eclipse.osee.logger.slf4j.internal.Sfl4jLogImpl">
+   <implementation class="org.eclipse.osee.logger.slf4j.internal.Sfl4jLogImpl"/>
+   
+      <service servicefactory="true">
+         <provide interface="org.eclipse.osee.logger.Log"/>
+      </service>
+      
+</scr:component>
diff --git a/org.eclipse.osee.logger.slf4j/OSGI-INF/log.service.reader.xml b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.service.reader.xml
new file mode 100644
index 0000000..0651074
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.service.reader.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.osee.logger.slf4j.internal.OsgiSlf4jLogger">
+   <implementation class="org.eclipse.osee.logger.slf4j.internal.OsgiSlf4jLogger"/>
+
+   <reference bind="setLoggingService" 
+   cardinality="1..1" 
+   interface="org.osgi.service.log.LogReaderService" 
+   name="LogReaderService" 
+   policy="static" 
+   target="(objectClass=org.osgi.service.log.LogReaderService)"/>
+    
+    
+</scr:component>
diff --git a/org.eclipse.osee.logger.slf4j/build.properties b/org.eclipse.osee.logger.slf4j/build.properties
new file mode 100644
index 0000000..c58ea21
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
diff --git a/org.eclipse.osee.logger.slf4j/pom.xml b/org.eclipse.osee.logger.slf4j/pom.xml
new file mode 100644
index 0000000..e8b9a8a
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/pom.xml
@@ -0,0 +1,34 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.x.core.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../../plugins/org.eclipse.osee.x.core.parent</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.osee.logger.slf4j</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OSEE Logger SLF4J - (Incubation)</name>
+
+	<build>
+		<!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+		<resources>
+			<resource>
+				<directory>src</directory>
+				<excludes>
+					<exclude>**/*.java</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/OsgiSlf4jLogger.java b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/OsgiSlf4jLogger.java
new file mode 100644
index 0000000..e37ebdb
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/OsgiSlf4jLogger.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger.slf4j.internal;
+
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OsgiSlf4jLogger {
+
+   private LogListener listener;
+   private LogReaderService logService;
+
+   public void setLoggingService(LogReaderService logService) {
+      this.logService = logService;
+   }
+
+   public synchronized void activate() {
+      listener = new Slf4jLogListener();
+      logService.addLogListener(listener);
+   }
+
+   public synchronized void deactivate() {
+      logService.removeLogListener(listener);
+      listener = null;
+      logService = null;
+   }
+}
diff --git a/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Sfl4jLogImpl.java b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Sfl4jLogImpl.java
new file mode 100644
index 0000000..2795e86
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Sfl4jLogImpl.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger.slf4j.internal;
+
+import org.eclipse.osee.logger.Log;
+import org.osgi.framework.Bundle;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Sfl4jLogImpl implements Log {
+
+   private static final int LOG_ERROR = 1;
+   private static final int LOG_WARNING = 2;
+   private static final int LOG_INFO = 3;
+   private static final int LOG_DEBUG = 4;
+   private static final int LOG_TRACE = 5;
+
+   private Logger logger;
+   private Marker marker;
+
+   public void start(ComponentContext context) {
+      if (logger == null) {
+         Bundle usingBundle = context.getUsingBundle();
+         String symbolicName = null;
+         if (usingBundle != null) {
+            symbolicName = usingBundle.getSymbolicName();
+         } else {
+            symbolicName = "Osee Log";
+         }
+         logger = LoggerFactory.getLogger(symbolicName);
+         marker = MarkerFactory.getMarker(symbolicName);
+         debug("Logger setup for [%s]", logger.getName());
+      }
+   }
+
+   public void stop() {
+      logger = null;
+      marker = null;
+   }
+
+   private Logger getLogger() {
+      return logger;
+   }
+
+   @Override
+   public boolean isTraceEnabled() {
+      return isEnabled(LOG_TRACE);
+   }
+
+   @Override
+   public void trace(String format, Object... args) {
+      trace(null, format, args);
+   }
+
+   @Override
+   public void trace(Throwable th, String format, Object... args) {
+      logHelper(LOG_TRACE, th, format, args);
+   }
+
+   @Override
+   public boolean isDebugEnabled() {
+      return isEnabled(LOG_DEBUG);
+   }
+
+   @Override
+   public void debug(String format, Object... args) {
+      debug(null, format, args);
+   }
+
+   @Override
+   public void debug(Throwable th, String format, Object... args) {
+      logHelper(LOG_DEBUG, th, format, args);
+   }
+
+   @Override
+   public boolean isInfoEnabled() {
+      return isEnabled(LOG_INFO);
+   }
+
+   @Override
+   public void info(String format, Object... args) {
+      info(null, format, args);
+   }
+
+   @Override
+   public void info(Throwable th, String format, Object... args) {
+      logHelper(LOG_INFO, th, format, args);
+   }
+
+   @Override
+   public boolean isWarnEnabled() {
+      return isEnabled(LOG_WARNING);
+   }
+
+   @Override
+   public void warn(String format, Object... args) {
+      warn(null, format, args);
+   }
+
+   @Override
+   public void warn(Throwable th, String format, Object... args) {
+      logHelper(LOG_WARNING, th, format, args);
+   }
+
+   @Override
+   public boolean isErrorEnabled() {
+      return isEnabled(LOG_ERROR);
+   }
+
+   @Override
+   public void error(String format, Object... args) {
+      error(null, format, args);
+   }
+
+   @Override
+   public void error(Throwable th, String format, Object... args) {
+      logHelper(LOG_ERROR, th, format, args);
+   }
+
+   private boolean isEnabled(int level) {
+      boolean result = false;
+      final Logger logger = getLogger();
+      if (logger != null) {
+         switch (level) {
+            case LOG_DEBUG:
+               result = logger.isDebugEnabled();
+               break;
+            case LOG_ERROR:
+               result = logger.isErrorEnabled();
+               break;
+            case LOG_WARNING:
+               result = logger.isWarnEnabled();
+               break;
+            case LOG_INFO:
+               result = logger.isInfoEnabled();
+               break;
+            default:
+               result = logger.isTraceEnabled();
+               break;
+         }
+      }
+      return result;
+   }
+
+   private void logHelper(int level, Throwable th, String format, Object... args) {
+      logHelper(null, level, th, format, args);
+   }
+
+   private void logHelper(Object context, int level, Throwable th, String format, Object... args) {
+      final Logger logger = getLogger();
+      if (isEnabled(level)) {
+         String message = safeFormat(format, args);
+         if (message != null) {
+            switch (level) {
+               case LOG_DEBUG:
+                  logger.debug(marker, message, th);
+                  break;
+               case LOG_ERROR:
+                  logger.error(marker, message, th);
+                  break;
+               case LOG_WARNING:
+                  logger.warn(marker, message, th);
+                  break;
+               case LOG_INFO:
+                  logger.info(marker, message, th);
+                  break;
+               default:
+                  logger.trace(marker, message, th);
+                  break;
+            }
+         }
+      }
+   }
+
+   private static String safeFormat(String message, Object... args) {
+      String toReturn;
+      try {
+         toReturn = String.format(message, args);
+      } catch (RuntimeException ex) {
+         StringBuilder builder = new StringBuilder();
+         builder.append("Log message could not be formatted:");
+         builder.append(message);
+         builder.append(" with the following arguments [");
+         builder.append(org.eclipse.osee.framework.jdk.core.util.Collections.toString(",", args));
+         builder.append("].  Cause [");
+         builder.append(ex.toString());
+         builder.append("]");
+         toReturn = builder.toString();
+      }
+      return toReturn;
+   }
+
+}
diff --git a/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Slf4jLogListener.java b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Slf4jLogListener.java
new file mode 100644
index 0000000..8b72c7c
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Slf4jLogListener.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger.slf4j.internal;
+
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Slf4jLogListener implements LogListener {
+   private static final Logger logger = LoggerFactory.getLogger(Slf4jLogListener.class);
+   private static final String[] remapMessages = new String[] {"Bundle Event", "Service Event"};
+
+   @Override
+   public void logged(LogEntry entry) {
+      try {
+         String symbolicName = entry.getBundle().getSymbolicName();
+         Logger logger = LoggerFactory.getLogger(symbolicName);
+         Marker marker = MarkerFactory.getMarker(symbolicName);
+         logLogEntry(logger, entry.getLevel(), marker, entry.getMessage(), entry.getException());
+      } catch (Exception ex) {
+         logger.error("Error during log listening", ex);
+      }
+   }
+
+   private void logLogEntry(Logger logger, int level, Marker marker, String message, Throwable throwable) {
+      int theLevel = level;
+      if (throwable == null || isOSGIMessage(message)) {
+         theLevel = LogService.LOG_DEBUG;
+      }
+      String originalName = Thread.currentThread().getName();
+      try {
+         Thread.currentThread().setName("Osgi Log Service");
+         switch (theLevel) {
+            case LogService.LOG_DEBUG:
+               logger.debug(marker, message, throwable);
+               break;
+            case LogService.LOG_ERROR:
+               logger.error(marker, message, throwable);
+               break;
+            case LogService.LOG_WARNING:
+               logger.warn(marker, message, throwable);
+               break;
+            case LogService.LOG_INFO:
+               logger.info(marker, message, throwable);
+               break;
+            default:
+               logger.trace(marker, message, throwable);
+               break;
+         }
+      } finally {
+         Thread.currentThread().setName(originalName);
+      }
+   }
+
+   private boolean isOSGIMessage(String message) {
+      for (String toCheck : remapMessages) {
+         if (message.startsWith(toCheck)) {
+            return true;
+         }
+      }
+      return false;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.logger/.classpath b/org.eclipse.osee.logger/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.logger/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.logger/.project b/org.eclipse.osee.logger/.project
new file mode 100644
index 0000000..d629e9f
--- /dev/null
+++ b/org.eclipse.osee.logger/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.logger</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.logger/META-INF/MANIFEST.MF b/org.eclipse.osee.logger/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b297e49
--- /dev/null
+++ b/org.eclipse.osee.logger/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Osee Logger (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.logger
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.logger
diff --git a/org.eclipse.osee.logger/build.properties b/org.eclipse.osee.logger/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.logger/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.logger/pom.xml b/org.eclipse.osee.logger/pom.xml
new file mode 100644
index 0000000..f29c172
--- /dev/null
+++ b/org.eclipse.osee.logger/pom.xml
@@ -0,0 +1,34 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.x.core.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../../plugins/org.eclipse.osee.x.core.parent</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.osee.logger</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OSEE Logger - (Incubation)</name>
+
+	<build>
+		<!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+		<resources>
+			<resource>
+				<directory>src</directory>
+				<excludes>
+					<exclude>**/*.java</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.logger/src/org/eclipse/osee/logger/Log.java b/org.eclipse.osee.logger/src/org/eclipse/osee/logger/Log.java
new file mode 100644
index 0000000..8ff2124
--- /dev/null
+++ b/org.eclipse.osee.logger/src/org/eclipse/osee/logger/Log.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface Log {
+
+   boolean isTraceEnabled();
+
+   void trace(String format, Object... args);
+
+   void trace(Throwable th, String format, Object... args);
+
+   boolean isDebugEnabled();
+
+   void debug(String format, Object... args);
+
+   void debug(Throwable th, String format, Object... args);
+
+   boolean isInfoEnabled();
+
+   void info(String format, Object... args);
+
+   void info(Throwable th, String format, Object... args);
+
+   boolean isWarnEnabled();
+
+   void warn(String format, Object... args);
+
+   void warn(Throwable th, String format, Object... args);
+
+   boolean isErrorEnabled();
+
+   void error(String format, Object... args);
+
+   void error(Throwable th, String format, Object... args);
+}
diff --git a/org.eclipse.osee.ote.client.msg/.classpath b/org.eclipse.osee.ote.client.msg/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.client.msg/.pmd b/org.eclipse.osee.ote.client.msg/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>WhileLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfElseStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanReturns</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanExpressions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchStmtsShouldHaveDefault</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDeeplyNestedIfStmts</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidReassigningParameters</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchDensity</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConstructorCallsOverridableMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AccessorClassGeneration</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalFieldCouldBeStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloseResource</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonStaticInitializer</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultLabelNotLastInSwitchStmt</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonCaseLabelInSwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OptimizableToArrayCall</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BadComparison</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EqualsNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConfusingTernary</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InstantiationToGetClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IdempotentOperations</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimpleDateFormatNeedsLocale</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImmutableField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseLocaleWithCaseConversions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidProtectedFieldInFinalClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentToNonFinalStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingStaticMethodInNonInstantiatableClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidSynchronizedAtMethodLevel</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingBreakInSwitch</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseNotifyAllInsteadOfNotify</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstanceofChecksInCatchClause</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAbstractMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyConditional</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CompareObjectsWithEquals</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PositionLiteralsFirstInComparisons</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryLocalBeforeReturn</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonThreadSafeSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyConstructor</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidConstantsInterface</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnsynchronizedStaticDateFormatter</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PreserveStackTrace</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCollectionIsEmpty</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SingularField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnEmptyArrayRatherThanNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAnyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooFewBranchesForASwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingThrowable</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExceptionAsFlowControl</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingNPE</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingRawExceptionTypes</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNullPointerException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidRethrowingException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotExtendJavaLangError</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotThrowExceptionInFinally</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNewInstanceOfSameException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateField</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedLocalVariable</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateMethod</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedFormalParameter</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MoreThanOneLogger</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LoggerIsNotStaticFinal</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SystemPrintln</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidPrintStackTrace</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDuplicateLiterals</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringInstantiation</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringToString</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientStringBuffering</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryCaseChange</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferLength</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AppendCharacterWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConsecutiveLiteralAppends</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseIndexOfChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientEmptyStringCheck</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InsufficientStringBufferDeclaration</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessStringValueOf</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringBufferInstantiationWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseEqualsToCompareStrings</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidStringBufferField</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceVectorWithList</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceHashtableWithMap</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceEnumerationWithIterator</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidEnumAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAssertAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IntegerInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ByteInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LongInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseBeforeAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseAfterAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseTestAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitUseExpected</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseProperClassLoader</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MDBAndSessionBeanNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteSessionInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalInterfaceSessionNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalHomeNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallSystemExit</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StaticEJBFieldShouldBeFinal</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotUseThreads</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstantiatingObjectsInLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArrayListInsteadOfVector</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyStartsWith</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferForStringAppends</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArraysAsList</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidArrayLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryWrapperObjectCreation</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AddEmptyString</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyCatchBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyIfStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyWhileStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyTryBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySwitchStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JumbledIncrementer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopShouldBeWhileLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConversionTemporary</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OverrideBothEqualsAndHashcode</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoubleCheckedLocking</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnFromFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySynchronizedBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryReturn</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStaticInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnconditionalIfStatement</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStatementNotInLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryFinalModifier</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CollapsibleIfStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOverridingMethod</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassCastExceptionWithToArray</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOperationOnImmutable</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisplacedNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedNullCheckInEquals</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThreadGroup</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BrokenNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BigIntegerInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingOctalValues</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingHardCodedIP</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CheckResultSet</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidMultipleUnaryOperators</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodReturnsInternalArray</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>ArrayIsStoredDirectly</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>CouplingBetweenObjects</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveImports</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DuplicateImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportJavaLang</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImportFromSamePackage</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyStaticImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitStaticSuite</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitSpelling</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitAssertionsShouldIncludeMessage</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitTestsShouldIncludeAssert</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TestClassWithoutTestCases</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertEqualsInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertSameInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertNullInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NullAssignment</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedModifier</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentInOperand</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AtLeastOneConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportSun</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousOctalEscape</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CallSuperInConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryParentheses</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultPackage</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInversion</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DataflowAnomalyAnalysis</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFinalLocalVariable</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingShortType</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingVolatile</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingNativeCode</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAccessibilityAlteration</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallGarbageCollectionExplicitly</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractNaming</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDollarSigns</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodWithSameNameAsEnclosingClass</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousHashcodeMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousConstantFieldName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousEqualsMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingTypeName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NoPackage</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PackageCase</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisleadingVariableName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanGetMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NPathComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveMethodLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveParameterList</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveClassLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CyclomaticComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessivePublicCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyFields</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssMethodCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssTypeCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssConstructorCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyMethods</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinalizer</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOnlyCallsSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOverloaded</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeDoesNotCallSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeShouldBeProtected</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCallingFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCorrectExceptionLogging</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperLogger</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingSerialVersionUID</name>
+            <ruleset>JavaBean Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperCloneImplementation</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneThrowsCloneNotSupportedException</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+    </rules>
+    <includeDerivedFiles>false</includeDerivedFiles>
+    <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.client.msg/.project b/org.eclipse.osee.ote.client.msg/.project
new file mode 100644
index 0000000..f678ca8
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.client.msg</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ds.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0c530f7
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Msg Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.client.msg;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.client.msg.core.internal.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.client,
+ org.eclipse.osee.ote.connection.service,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.ote.messaging.dds,
+ org.eclipse.osee.framework.plugin.core
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.client.msg,
+ org.eclipse.osee.ote.client.msg.core,
+ org.eclipse.osee.ote.client.msg.core.db
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Service-Component: OSGI-INF/*.xml
+Import-Package: org.osgi.service.event
diff --git a/org.eclipse.osee.ote.client.msg/OSGI-INF/MessageSubscriptionServiceComponent.xml b/org.eclipse.osee.ote.client.msg/OSGI-INF/MessageSubscriptionServiceComponent.xml
new file mode 100644
index 0000000..948f537
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/OSGI-INF/MessageSubscriptionServiceComponent.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.eclipse.osee.ote.client.msg">
+   <implementation class="org.eclipse.osee.ote.client.msg.core.internal.MessageSubscriptionService"/>
+   <reference bind="addMessageDefinitionProvider" cardinality="0..n" interface="org.eclipse.osee.ote.message.MessageDefinitionProvider" name="MessageDefinitionProvider" policy="dynamic" unbind="removeMessageDefinitionProvider"/>
+   <reference bind="bindOteClientService" cardinality="1..1" interface="org.eclipse.osee.ote.service.IOteClientService" name="IOteClientService" policy="static" unbind="unbindOteClientService"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.client.msg.IOteMessageService"/>
+      <provide interface="org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient"/>
+      <provide interface="org.osgi.service.event.EventHandler"/>
+   </service>
+   <property name="event.topics" type="String" value="ote/message/recordingComplete"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.client.msg/build.properties b/org.eclipse.osee.ote.client.msg/build.properties
new file mode 100644
index 0000000..6210e84
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.client.msg/pom.xml b/org.eclipse.osee.ote.client.msg/pom.xml
new file mode 100644
index 0000000..fe2ba6e
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/pom.xml
@@ -0,0 +1,35 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.ote.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../org.eclipse.osee.ote.parent</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.osee.ote.client.msg</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Client Message (Incubation)</name>
+
+   <build>
+     <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+     <resources>
+      <resource>
+        <directory>src</directory>
+        <excludes>
+          <exclude>**/*.java</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-source-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+  
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java
new file mode 100644
index 0000000..8ba1114
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.IFileTransferHandle;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IOteMessageService {
+   IMessageSubscription subscribe(String name);
+
+   IMessageSubscription subscribe(String name, MessageMode mode);
+   
+   IMessageSubscription subscribe(String name, DataType dataType, MessageMode mode);
+
+   IMessageSubscription subscribe(String name, String dataType, MessageMode mode);
+
+   IFileTransferHandle startRecording(String fileName, List<RecordCommand.MessageRecordDetails> list) throws FileNotFoundException, IOException;
+
+   void stopRecording() throws Exception;
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java
new file mode 100644
index 0000000..bfbc1c1
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractMessageListener implements ISubscriptionListener, IOSEEMessageListener {
+
+   private final IMessageSubscription subscription;
+
+   protected AbstractMessageListener(IMessageSubscription subscription) {
+      this.subscription = subscription;
+   }
+
+   @Override
+   public void subscriptionCanceled(IMessageSubscription subscription) {
+      if (subscription.isResolved()) {
+         subscription.getMessage().removeListener(this);
+      }
+   }
+
+   @Override
+   public void subscriptionResolved(IMessageSubscription subscription) {
+      if (subscription.isResolved()) {
+         subscription.getMessage().addListener(this);
+      }
+   }
+
+   @Override
+   public void subscriptionUnresolved(IMessageSubscription subscription) {
+   }
+
+   @Override
+   public void onInitListener() throws MessageSystemException {
+   }
+
+   public IMessageSubscription getSubscription() {
+      return subscription;
+   }
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java
new file mode 100644
index 0000000..d6954f6
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageDbFactory {
+
+   AbstractMessageDataBase createMessageDataBase();
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java
new file mode 100644
index 0000000..cfd3442
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageSubscription {
+   Message getMessage();
+
+   void cancel();
+
+   String getMessageClassName();
+
+   MessageMode getMessageMode();
+
+   DataType getMemType();
+
+   /**
+    * returns whether or not the subscription has been activated. A subscription is considered activated if and only if
+    * a proper connection to a test server has been established and a successful registration of the subscription is
+    * made. A subscription is not bound to any instance of a test server. A subscription is honored even when switching
+    * between different test servers.
+    */
+   boolean isActive();
+
+   boolean isResolved();
+
+   void changeMemType(DataType type);
+
+   void send() throws Exception;
+
+   void setElementValue(List<Object> path, String value) throws Exception;
+   void setElementValueNoSend(List<Object> path, String value) throws Exception;
+   void zeroize(List<Object> path) throws Exception;
+
+   void changeMessageMode(MessageMode mode);
+
+   Set<DataType> getAvailableTypes();
+
+   boolean addSubscriptionListener(ISubscriptionListener listener);
+
+   boolean removeSubscriptionListener(ISubscriptionListener listener);
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java
new file mode 100644
index 0000000..1d3afd6
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import org.eclipse.osee.ote.message.Message;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISubscriptionListener {
+   /**
+    * called when a subscription can no longer be fulfilled by the message service. this occurs when runtime libraries
+    * are changed and the message does not exist. Can be called when a message exist in the libraries but is not
+    * supported by the test environment. all references and event listeners must be removed
+    */
+   void subscriptionInvalidated(IMessageSubscription subscription);
+
+   /**
+    * called upon a successful acquisition of a {@link Message} instance. At this point, no message traffic is being
+    * transmitted but operations on the message are allowed. Subclasses should register any event listeners on
+    * {@link Message} upon this method being invoked.
+    */
+   void subscriptionResolved(IMessageSubscription subscription);
+
+   /**
+    * called when the message library has been unloaded. The subscription will still be honored by the system and can be
+    * reactivated upon a reload of a library assuming the library has a definition for the message. Subclasses should
+    * <B>must no longer reference</B> the ({@link Message} related to the subscription. Subclasses do not need to
+    * de-register any event listeners since all listeners will be cleared. The message is still in a valid state during
+    * this method invocation but not after.
+    */
+   void subscriptionUnresolved(IMessageSubscription subscription);
+
+   /**
+    * called upon successful registration with the test server. Message traffic is now possible
+    */
+   void subscriptionActivated(IMessageSubscription subscription);
+
+   /**
+    * called when the {@link IMessageSubscription#cancel()} method is called. Any references and event listeners must be
+    * removed.
+    */
+   void subscriptionCanceled(IMessageSubscription subscription);
+
+   /**
+    * called when the subscription is resolved but a connected environment does not support this type of message. The
+    * message can still be referenced but no updates will be delivered.
+    */
+   void subscriptionNotSupported(IMessageSubscription subscription);
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java
new file mode 100644
index 0000000..da18e02
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.db;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.client.msg.core.internal.MessageReference;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.EntityFactory;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractMessageDataBase {
+
+	private final HashMap<MessageReference, MessageInstance> referenceToMsgMap =
+			new HashMap<MessageReference, MessageInstance>();
+	private final ConcurrentHashMap<Integer, MessageInstance> idToMsgMap =
+			new ConcurrentHashMap<Integer, MessageInstance>();
+
+	private Executor worker = Executors.newSingleThreadExecutor();
+	
+	private IMsgToolServiceClient client;
+	private volatile boolean connected = false;
+	private final DataReader reader = new DataReader(null, null, true, null, new EntityFactory() {
+
+		@Override
+		public boolean isEnabled() {
+			return true;
+		}
+
+	});
+
+	protected AbstractMessageDataBase(IMsgToolServiceClient service) {
+	   client = service;
+	}
+
+	public MessageInstance findInstance(String name, MessageMode mode, DataType type) {
+		MessageReference reference = new MessageReference(type, mode, name);
+		return referenceToMsgMap.get(reference);
+	}
+
+	public MessageInstance acquireInstance(String name) throws Exception {
+		return acquireInstance(name, MessageMode.READER, (DataType) null);
+	}
+
+	public MessageInstance acquireInstance(String name, MessageMode mode, DataType type) throws Exception {
+		if (type == null) {
+			Class<? extends Message> msgClass = ExportClassLoader.getInstance().loadClass(name).asSubclass(Message.class);
+
+			type = msgClass.newInstance().getDefaultMessageData().getType();
+		}
+		MessageReference reference = new MessageReference(type, mode, name);
+		MessageInstance instance = referenceToMsgMap.get(reference);
+		if (instance == null) {
+			Class<? extends Message> msgClass = ExportClassLoader.getInstance().loadClass(name).asSubclass(Message.class);
+			Message msg = createMessage(msgClass);
+			for (ArrayList<MessageData> dataList : (Collection<ArrayList<MessageData>>) msg.getAllData()) {
+				for (MessageData data : dataList) {
+					data.setReader(reader);
+				}
+			}
+			msg.setMemSource(type);
+			instance = new MessageInstance(msg, mode, type);
+			referenceToMsgMap.put(reference, instance);
+		}
+		instance.incrementReferenceCount();
+		if (connected && !instance.isAttached()) {
+			doInstanceAttach(instance);
+		}
+		return instance;
+	}
+
+	public MessageInstance acquireInstance(String name, MessageMode mode, String dataType) throws Exception {
+		Class<? extends Message> msgClass = ExportClassLoader.getInstance().loadClass(name).asSubclass(Message.class);
+		Message msg = msgClass.newInstance();
+
+		//Set<DataType> available = msg.getAvailableMemTypes();
+		Set<DataType> available = msg.getAssociatedMessages().keySet();
+		DataType requestDataType = msg.getDefaultMessageData().getType();
+		for (DataType type : available) {
+			if (type.name().equals(dataType)) {
+				requestDataType = type;
+				break;
+			}
+
+		}
+		MessageReference reference = new MessageReference(requestDataType, mode, name);
+		MessageInstance instance = referenceToMsgMap.get(reference);
+		if (instance == null) {
+			msg = createMessage(msgClass);
+			msg.setMemSource(requestDataType);
+			for (ArrayList<MessageData> dataList : (Collection<ArrayList<MessageData>>) msg.getAllData()) {
+				for (MessageData data : dataList) {
+					data.setReader(reader);
+				}
+			}
+			instance = new MessageInstance(msg, mode, requestDataType);
+			referenceToMsgMap.put(reference, instance);
+		}
+		instance.incrementReferenceCount();
+		if (connected && !instance.isAttached()) {
+			doInstanceAttach(instance);
+		}
+		return instance;
+	}
+
+
+	public void releaseInstance(MessageInstance instance) throws Exception {
+		instance.decrementReferenceCount();
+		if (!instance.hasReferences()) {
+			if (instance.isAttached()) {
+				doInstanceDetach(instance);
+			}
+			MessageReference reference =
+					new MessageReference(instance.getType(), instance.getMode(), instance.getMessage().getClass().getName());
+			referenceToMsgMap.remove(reference);
+			destroyMessage(instance.getMessage());
+		}
+
+	}
+
+	protected abstract Message createMessage(Class<? extends Message> msgClass) throws Exception;
+
+	protected abstract void destroyMessage(Message message) throws Exception;
+
+	public void attachToService(IMsgToolServiceClient client) {
+	   connected = true;
+		this.client = client;
+		for (MessageInstance instance : referenceToMsgMap.values()) {
+			try {
+				doInstanceAttach(instance);
+			} catch (Exception e) {
+				OseeLog.log(AbstractMessageDataBase.class, Level.SEVERE,
+						"could not attach instance for " + instance.toString(), e);
+			}
+		}
+	}
+
+	public void detachService() {
+		for (MessageInstance instance : referenceToMsgMap.values()) {
+			doInstanceDetach(instance);
+		}
+		connected = false;
+		this.client = null;
+	}
+
+	public MessageInstance findById(int id) {
+		return idToMsgMap.get(id);
+	}
+
+	private boolean doInstanceAttach(MessageInstance instance) throws Exception {
+	   worker.execute(new Runnable() {
+         @Override
+         public void run() {
+            Integer id;
+            try {
+               id = instance.attachToService(client);
+               if (id != null) {
+                  idToMsgMap.put(id, instance);
+               }
+            } catch (Exception e) {
+               e.printStackTrace();
+            }
+         }
+      });
+		return true;
+	}
+
+	private void doInstanceDetach(MessageInstance instance) {
+		try {
+			Integer id = instance.getId();
+			if (id != null) {
+				idToMsgMap.remove(id);
+			}
+			instance.detachService(client);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java
new file mode 100644
index 0000000..4800f40
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.db;
+
+import java.net.InetSocketAddress;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.osee.ote.client.msg.core.internal.MessageServiceSupport;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.message.tool.SubscriptionKey;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageInstance {
+
+   private final DataType type;
+   private final MessageMode mode;
+   private final Message msg;
+   private SubscriptionKey serverSubscriptionKey = null;
+   private int refcount = 0;
+   private boolean supported = true;
+   private volatile boolean connected = false;
+   private HashSet<DataType> availableTypes = new HashSet<>();
+
+   public MessageInstance(Message msg, MessageMode mode, DataType type) {
+      this.msg = msg;
+      this.mode = mode;
+      this.type = type;
+   }
+
+   public Message getMessage() {
+      return msg;
+   }
+
+   public SubscriptionKey getServerSubscriptionKey() {
+      return serverSubscriptionKey;
+   }
+
+   public void setServerSubscriptionKey(SubscriptionKey serverSubscriptionKey) {
+      this.serverSubscriptionKey = serverSubscriptionKey;
+   }
+
+   public boolean isAttached() {
+      return serverSubscriptionKey != null;
+   }
+
+   public Integer attachToService(IMsgToolServiceClient client) throws Exception {
+      InetSocketAddress address = client.getAddressByType(msg.getClass().getName(), type);
+      SubscriptionDetails details;
+      if(address == null){
+         details = null;
+      } else {
+         details = MessageServiceSupport.subscribeToMessage(new SubscribeToMessage(msg.getClass().getName(), type, mode,
+               client.getAddressByType(msg.getClass().getName(), type), client.getTestSessionKey()));
+         
+      }
+      if (details == null) {
+         supported = false;
+         return null;
+      }
+      supported = true;
+      msg.setData(details.getCurrentData());
+      connected = true;
+      //determine types for message
+      Set<? extends DataType> envSet = MessageServiceSupport.getAvailablePhysicalTypes();
+      Set<DataType> available = msg.getAssociatedMessages().keySet();
+      for(DataType type : available.toArray(new DataType[available.size()])){
+         if(envSet.contains(type)){
+            availableTypes.add(type);
+         }
+      }
+      
+      serverSubscriptionKey = details.getKey();
+      return serverSubscriptionKey.getId();
+   }
+
+   public void detachService(IMsgToolServiceClient client) throws Exception {
+      if (supported) {
+         MessageServiceSupport.unsubscribeToMessage(new UnSubscribeToMessage(msg.getClass().getName(), mode, type,
+            client.getAddressByType(msg.getClass().getName(), type)));
+      }
+      availableTypes.clear();
+      connected = false;
+      serverSubscriptionKey = null;
+   }
+
+   public Integer getId() {
+      return serverSubscriptionKey != null ? serverSubscriptionKey.getId() : null;
+   }
+
+   public void incrementReferenceCount() {
+      refcount++;
+   }
+
+   public void decrementReferenceCount() {
+      refcount--;
+   }
+
+   public boolean hasReferences() {
+      return refcount > 0;
+   }
+
+   public DataType getType() {
+      return type;
+   }
+
+   public MessageMode getMode() {
+      return mode;
+   }
+
+   public Set<DataType> getAvailableTypes() {
+     return availableTypes;
+   }
+
+   public boolean isSupported() {
+      return supported;
+   }
+
+   @Override
+   public String toString() {
+      return String.format("Message Instance(type=%s, mode=%s, ref=%d, supported=%b)", type.name(), mode.name(),
+         refcount, supported);
+   }
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java
new file mode 100644
index 0000000..80c3120
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+   // The plug-in ID
+   public static final String PLUGIN_ID = "org.eclipse.ote.client.msg";
+
+   // The shared instance
+   private static Activator plugin;
+
+   private BundleContext context;
+
+//   private OteClientServiceTracker tracker;
+
+   /**
+    * The constructor
+    */
+   public Activator() {
+   }
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      super.start(context);
+      this.context = context;
+      plugin = this;
+
+//      ExtensionDefinedObjects<IMessageDbFactory> definedObjects =
+//         new ExtensionDefinedObjects<IMessageDbFactory>("org.eclipse.osee.ote.client.msg.dBFactory", "DatabaseFactory",
+//            "className");
+//      try {
+//         List<IMessageDbFactory> providers = definedObjects.getObjects();
+//         if (!providers.isEmpty()) {
+//            tracker = new OteClientServiceTracker(providers.get(0));
+//            tracker.open(true);
+//         } else {
+//            OseeLog.log(Activator.class, Level.WARNING,
+//               "No message database factory (IMessageDbFactory) found. Message Subscription Service not started");
+//         }
+//      } catch (Exception ex) {
+//         OseeLog.log(Activator.class, Level.SEVERE, "failed to process message database factory extensions", ex);
+//      }
+
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      plugin = null;
+//      tracker.close();
+      super.stop(context);
+      this.context = null;
+   }
+
+   /**
+    * Returns the shared instance
+    *
+    * @return the shared instance
+    */
+   public static Activator getDefault() {
+      return plugin;
+   }
+
+   BundleContext getBundleContext() {
+      return context;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java
new file mode 100644
index 0000000..a09f096
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Arrays;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * Handles processing of updates from a channel. The channel processor maintains an internal queue whose max size
+ * dictates the maximum number of concurrent updates. All updates are submitted to the given thread pool for execution.
+ * 
+ * @author Ken J. Aguilar
+ */
+final public class ChannelProcessor {
+   private final ArrayBlockingQueue<Task> queue;
+   private final ExecutorService threadPool;
+   private final AbstractMessageDataBase msgDb;
+   private final DataType memType;
+
+   /**
+    * A task allows each channel to have multiple updates processed concurrently. Each task has its own buffers.
+    * 
+    * @author Ken J. Aguilar
+    */
+   private final class Task implements Runnable {
+      private final ByteBuffer buffer;
+
+      public Task(ByteBuffer buffer) {
+         this.buffer = buffer;
+      }
+
+      public void prepTask(ReadableByteChannel channel) throws IOException {
+         buffer.clear();
+         // read the data from the channel into the buffer
+         channel.read(buffer);
+         buffer.flip();
+      }
+
+      @Override
+      public void run() {
+         try {
+            final int id = buffer.getInt();
+            final long time = buffer.getLong();
+            final MessageInstance instance = msgDb.findById(id);
+            if (instance != null) {
+               onUpdate(instance, buffer, time);
+            }
+            // return to the queue
+            queue.put(this);
+         } catch (InterruptedException e) {
+            // do nothing
+         } catch (Exception ex) {
+            OseeLog.log(Activator.class, Level.SEVERE, "failed to process message update", ex);
+         }
+      }
+   }
+
+   public ChannelProcessor(int depth, int bufferSize, ExecutorService threadPool, AbstractMessageDataBase msgDb, DataType memType) {
+      this.queue = new ArrayBlockingQueue<>(depth);
+      try {
+         // fill the queue with pre-allocated tasks
+         for (int i = 0; i < depth; i++) {
+            queue.put(new Task(ByteBuffer.allocateDirect(bufferSize)));
+         }
+      } catch (InterruptedException ex) {
+         throw new Error("should never happen", ex);
+      }
+      this.threadPool = threadPool;
+      this.msgDb = msgDb;
+      this.memType = memType;
+   }
+
+   public final void process(final ReadableByteChannel channel) throws InterruptedException, IOException {
+      // get a free task
+      final Task task = queue.take();
+
+      // prep the task
+      task.prepTask(channel);
+
+      // the task is now ready for execution, submit it to the thread pool
+      threadPool.submit(task);
+   }
+
+   /**
+    * called when there is data to be processed from a channel. Can be called by one or more threads for the same data
+    * concurrently to so implementors need to be thread safe
+    */
+   protected void onUpdate(MessageInstance instance, ByteBuffer buffer, long time) {
+      MessageData msgData = instance.getMessage().getActiveDataSource(memType);
+      if (msgData != null) {
+         msgData.setTime(time);
+         byte[] data = msgData.getMem().getData();
+         int remaining = buffer.remaining();
+         if (data.length < remaining) {
+            OseeLog.logf(Activator.class, Level.WARNING,
+                  "Message [%s] changed it's backing data size from [%d] to [%d].", instance.getMessage().getName(),
+                  data.length, remaining);
+            data = new byte[remaining];
+            buffer.get(data, 0, remaining);
+            msgData.setNewBackingBuffer(data);
+            msgData.incrementActivityCount();
+            msgData.notifyListeners();
+            return;
+         }
+
+         if (remaining < data.length) {
+            Arrays.fill(data, remaining, data.length, (byte) 0);
+            // msg.getActiveDataSource().setCurrentLength(remaining);
+         }
+         buffer.get(data, 0, remaining);
+         msgData.setCurrentLength(remaining);
+         msgData.incrementActivityCount();
+         msgData.notifyListeners();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageDatabase.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageDatabase.java
new file mode 100644
index 0000000..0bc23d3
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageDatabase.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageDatabase extends AbstractMessageDataBase {
+
+   public MessageDatabase(IMsgToolServiceClient service) {
+      super(service);
+   }
+
+   @Override
+   protected Message createMessage(Class<? extends Message> msgClass) throws Exception {
+      Message msg = msgClass.newInstance();
+      LinkedList<MessageData> source = new LinkedList<>();
+      Map<DataType, Class<? extends Message>[]> messages = msg.getAssociatedMessages();
+      Set<Entry<DataType, Class<? extends Message>[]>> entrySet = messages.entrySet();
+      for (Entry<DataType, Class<? extends Message>[]> entry : entrySet) {
+         for (Class<? extends Message> clazz : entry.getValue()) {
+            MessageInstance instance = acquireInstance(clazz.getName());
+            Message newMsg = instance.getMessage();
+            source.add(newMsg.getActiveDataSource());
+            msg.addMessageTypeAssociation(entry.getKey(), newMsg);
+         }
+      }
+      if (!source.isEmpty()) {
+         msg.addMessageDataSource(source);
+      }
+      return msg;
+   }
+
+   @Override
+   protected void destroyMessage(Message message) throws Exception {
+      try {
+         Map<DataType, Class<? extends Message>[]> messages = message.getAssociatedMessages();
+         Set<Entry<DataType, Class<? extends Message>[]>> entrySet = messages.entrySet();
+         for (Entry<DataType, Class<? extends Message>[]> entry : entrySet) {
+            for (Class<? extends Message> clazz : entry.getValue()) {
+               MessageInstance instance = findInstance(clazz.getName(), MessageMode.READER, entry.getKey());
+               if (instance != null) {
+                  releaseInstance(instance);
+               }
+            }
+         }
+      } finally {
+         message.destroy();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java
new file mode 100644
index 0000000..5f78dfc
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageReference {
+
+   private final DataType type;
+   private final MessageMode mode;
+   private final String msgClassName;
+
+   public MessageReference(DataType type, MessageMode mode, String msgClassName) {
+      this.type = type;
+      this.mode = mode;
+      this.msgClassName = msgClassName;
+   }
+
+   public MessageReference(Message msg) {
+      this.type = msg.getDefaultMessageData().getType();
+      this.mode = MessageMode.READER;
+      this.msgClassName = msg.getMessageName();
+   }
+
+   public String getMsgClass() {
+      return msgClassName;
+   }
+
+   public DataType getType() {
+      return type;
+   }
+
+   public MessageMode getMode() {
+      return mode;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (obj == null) {
+         return false;
+      }
+      MessageReference otherRef = (MessageReference) obj;
+      return msgClassName.equals(otherRef.msgClassName) && type == otherRef.type && mode == otherRef.mode;
+   }
+
+   @Override
+   public int hashCode() {
+      return msgClassName.hashCode() ^ mode.hashCode() ^ type.hashCode();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageServiceSupport.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageServiceSupport.java
new file mode 100644
index 0000000..325afa7
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageServiceSupport.java
@@ -0,0 +1,191 @@
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteSendEventMessage;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.remote.messages.AVAILABLE_PHYSICAL_TYPES_REQ;
+import org.eclipse.osee.ote.remote.messages.GET_INET_ADDRESS_REQ;
+import org.eclipse.osee.ote.remote.messages.GET_INET_ADDRESS_RESP;
+import org.eclipse.osee.ote.remote.messages.SOCKET_ID;
+import org.eclipse.osee.ote.remote.messages.STOP_RECORDING_CMD;
+import org.eclipse.osee.ote.remote.messages.SerializedAvailablePhysicalTypesMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedRecordCommandMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSetElementMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscribeToMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscriptionDetailsMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedUnSubscribeMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedZeroizeElementMessage;
+import org.osgi.service.event.EventAdmin;
+
+public class MessageServiceSupport {
+
+   private static EventAdmin admin;
+   private static OteSendEventMessage send;
+   private static Executor worker = Executors.newSingleThreadExecutor();
+   
+   private static EventAdmin getEventAdmin(){
+      if(admin == null){
+         admin = ServiceUtility.getService(EventAdmin.class);
+      }
+      return admin;
+   }
+   
+   private static OteSendEventMessage get(){
+      if(send == null){
+         send = new OteSendEventMessage(getEventAdmin());
+      }
+      return send;
+   }
+   
+   /**
+    * @deprecated use {@link #subscribeToMessage(SubscribeToMessage, SubscriptionHandler)}
+    * @param subscribeToMessage
+    * @return
+    */
+   @Deprecated
+   public static SubscriptionDetails subscribeToMessage(SubscribeToMessage subscribeToMessage) {
+      SerializedSubscriptionDetailsMessage resp = new SerializedSubscriptionDetailsMessage();
+      try{
+         SerializedSubscribeToMessage cmd = new SerializedSubscribeToMessage(subscribeToMessage);
+         resp = get().synchSendAndResponse(resp, cmd, 10000);
+         if(resp == null){
+            throw new OTEException("Timed out waiting for message response");
+         } 
+         SubscriptionDetails details = resp.getObject();
+         return details;
+      } catch (IOException ex){
+         throw new OTEException("Serialization Error", ex);
+      } catch (ClassNotFoundException e) {
+         throw new OTEException("Serialization Error", e);
+      }
+   }
+   
+   /**
+    * Subscribes to a message and notifies the user in a callback so that we do not block any UI threads.
+    * 
+    * @param subscribeToMessage
+    * @param handler
+    */
+   public static void subscribeToMessage(SubscribeToMessage subscribeToMessage, SubscriptionHandler handler) {
+      worker.execute(new Runnable(){
+         @Override
+         public void run() {
+            SerializedSubscriptionDetailsMessage resp = new SerializedSubscriptionDetailsMessage();
+            try{
+               SerializedSubscribeToMessage cmd = new SerializedSubscribeToMessage(subscribeToMessage);
+               resp = get().synchSendAndResponse(resp, cmd, 10000);
+               if(resp == null){
+                  throw new OTEException("Timed out waiting for message response");
+               } 
+               SubscriptionDetails details = resp.getObject();
+               handler.onSubscriptionComplete(details);
+            } catch (IOException ex){
+               throw new OTEException("Serialization Error", ex);
+            } catch (ClassNotFoundException e) {
+               throw new OTEException("Serialization Error", e);
+            }
+         }
+         
+      });
+     
+   }
+
+   public static void unsubscribeToMessage(UnSubscribeToMessage unSubscribeToMessage) {
+      SerializedUnSubscribeMessage cmd;
+      try {
+         cmd = new SerializedUnSubscribeMessage(unSubscribeToMessage);
+         OteEventMessageUtil.postEvent(cmd);
+      } catch (IOException e) {
+         throw new OTEException("Serialization Error", e);
+      }
+   }
+
+   public static Set<? extends DataType> getAvailablePhysicalTypes() throws OTEException {
+      AVAILABLE_PHYSICAL_TYPES_REQ req = new AVAILABLE_PHYSICAL_TYPES_REQ();
+      try{
+         SerializedAvailablePhysicalTypesMessage types = new SerializedAvailablePhysicalTypesMessage();
+         types = get().synchSendAndResponse(types, req, 10000);
+         if(types == null){
+            throw new OTEException("Timed out waiting for message response");
+         } 
+         return types.getObject();
+      } catch (IOException ex){
+         throw new OTEException("Serialization Error", ex);
+      } catch (ClassNotFoundException e) {
+         throw new OTEException("Serialization Error", e);
+      }
+   }
+
+   public static InetSocketAddress getMsgUpdateSocketAddress() throws OTEException {
+      return getCommonAddress(SOCKET_ID.MSG_UPDATES);
+   }
+
+   public static InetSocketAddress getRecorderSocketAddress() throws OTEException {
+      return getCommonAddress(SOCKET_ID.RECORDER);
+   }
+
+   private static InetSocketAddress getCommonAddress(SOCKET_ID id){
+      GET_INET_ADDRESS_REQ req = new GET_INET_ADDRESS_REQ();
+      req.SOCKET_ID.setValue(id);
+      GET_INET_ADDRESS_RESP resp = get().synchSendAndResponse(GET_INET_ADDRESS_RESP.class, GET_INET_ADDRESS_RESP.TOPIC, req, 10000);//todo retry?
+      InetSocketAddress address;
+      if(resp == null){
+         throw new OTEException("Timed out waiting for message response");
+      } else {
+         try {
+            address = new InetSocketAddress(resp.ADDRESS.getAddress(), resp.ADDRESS.getPort());
+         } catch (UnknownHostException e) {
+            throw new OTEException(e);
+         } 
+      }
+      return address;
+   }
+   
+   public static void startRecording(RecordCommand cmd) {
+      try {
+         SerializedRecordCommandMessage msg = new SerializedRecordCommandMessage(cmd);
+         OteEventMessageUtil.postEvent(msg);
+      } catch (IOException e) {
+         throw new OTEException("Error starting recording", e);
+      }
+   }
+
+   public static void stopRecording() {
+      STOP_RECORDING_CMD cmd = new STOP_RECORDING_CMD();
+      OteEventMessageUtil.postEvent(cmd);
+   }
+
+   public static void setElementValue(SetElementValue cmd) {
+      try {
+         SerializedSetElementMessage msg = new SerializedSetElementMessage(cmd);
+         OteEventMessageUtil.postEvent(msg);
+      } catch (IOException e) {
+         throw new OTEException(e);
+      }
+   }
+
+   public static void zeroizeElement(ZeroizeElement cmd) {
+      try {
+         SerializedZeroizeElementMessage msg = new SerializedZeroizeElementMessage(cmd);
+         OteEventMessageUtil.postEvent(msg);
+      } catch (IOException e) {
+         throw new OTEException(e);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java
new file mode 100644
index 0000000..8b57939
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java
@@ -0,0 +1,257 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
+import org.eclipse.osee.ote.client.msg.core.ISubscriptionListener;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState;
+import org.eclipse.osee.ote.client.msg.core.internal.state.UnresolvedState;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageSubscription implements IMessageSubscription {
+
+   private ISubscriptionState currentState = null;
+   private final MessageSubscriptionService msgService;
+   private final CopyOnWriteArraySet<ISubscriptionListener> listeners = new CopyOnWriteArraySet<>();
+
+   private String requestedDataType;
+   
+   
+   /**
+    * creates a subscription with no reference to a message
+    */
+   public MessageSubscription(MessageSubscriptionService msgService) {
+      this.msgService = msgService;
+   }
+
+   public synchronized void bind(String name) {
+      bind(name, (DataType)null, MessageMode.READER);
+   }
+
+   public synchronized void bind(String name, DataType type, MessageMode mode) {
+      currentState = new UnresolvedState(name, this, type, mode);
+   }
+
+   public synchronized void bind(String name, String type, MessageMode mode) {
+	   requestedDataType = type;
+	   currentState = new UnresolvedState(name, this, null, mode);
+   }
+
+   @Override
+   public synchronized boolean isActive() {
+      return currentState != null ? currentState.isActive() : false;
+   }
+
+   @Override
+   public synchronized boolean isResolved() {
+      return currentState != null ? currentState.isResolved() : false;
+   }
+
+   @Override
+   public synchronized DataType getMemType() {
+      return currentState.getMemType();
+   }
+
+   @Override
+   public synchronized MessageMode getMessageMode() {
+      return currentState.getMode();
+   }
+
+   @Override
+   public synchronized String getMessageClassName() {
+      return currentState.getMsgClassName();
+   }
+
+   @Override
+   public synchronized Message getMessage() {
+      return currentState.getMessage();
+   }
+
+   public synchronized void attachMessageDb(AbstractMessageDataBase msgDb) {
+      currentState = currentState.onMessageDbFound(msgDb);
+   }
+
+   public synchronized void detachMessageDb(AbstractMessageDataBase msgDb) {
+      currentState = currentState.onMessageDbClosing(msgDb);
+   }
+
+   public synchronized void attachService() {
+      currentState = currentState.onActivated();
+   }
+
+   public synchronized void detachService() {
+      currentState = currentState.onDeactivated();
+   }
+
+   private void doCancel() {
+      if (currentState != null) {
+         currentState.onCanceled();
+         currentState = null;
+      }
+   }
+
+   @Override
+   public synchronized Set<DataType> getAvailableTypes() {
+      return currentState.getAvailableTypes();
+   }
+
+   @Override
+   public synchronized void changeMessageMode(MessageMode mode) {
+      if (mode == getMessageMode()) {
+         return;
+      }
+      String name = getMessageClassName();
+      DataType type = getMemType();
+      notifyCanceled();
+      doCancel();
+      bind(name, type, mode);
+      progressState();
+   }
+
+   @Override
+   public synchronized void cancel() {
+      if (currentState == null) {
+         return;
+      }
+      try {
+         notifyCanceled();
+      } finally {
+         doCancel();
+         msgService.removeSubscription(this);
+      }
+   }
+
+   @Override
+   public synchronized void changeMemType(DataType type) {
+      if (type == getMemType()) {
+         return;
+      }
+      String name = getMessageClassName();
+      MessageMode mode = getMessageMode();
+      doCancel();
+      bind(name, type, mode);
+      progressState();
+   }
+
+   private void progressState() {
+      if (msgService.getMsgDatabase() != null) {
+         attachMessageDb(msgService.getMsgDatabase());
+         if(msgService.isConnected()){
+            attachService();
+         }
+      }
+   }
+
+   @Override
+   public void setElementValue(List<Object> path, String value) throws Exception {
+      final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), path, value, true);
+      MessageServiceSupport.setElementValue(cmd);
+   }
+
+   @Override
+   public void setElementValueNoSend(List<Object> path, String value)
+		   throws Exception {
+	   final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), path, value, false);
+	   MessageServiceSupport.setElementValue(cmd);
+   }
+
+   @Override
+   public void send() throws Exception {
+      final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), null, null, true);
+      MessageServiceSupport.setElementValue(cmd);
+   }
+
+   @Override
+   public void zeroize(List<Object> path) throws Exception {
+      final ZeroizeElement cmd = new ZeroizeElement(getMessageClassName(), getMemType(), path);
+      MessageServiceSupport.zeroizeElement(cmd);
+   }
+
+   public void notifyCanceled() {
+      for (ISubscriptionListener listener : listeners) {
+         listener.subscriptionCanceled(MessageSubscription.this);
+      }
+   }
+
+   public void notifyActivated() {
+      for (ISubscriptionListener listener : listeners) {
+         listener.subscriptionActivated(MessageSubscription.this);
+      }
+   }
+
+   public void notifyInvalidated() {
+      for (ISubscriptionListener listener : listeners) {
+         listener.subscriptionInvalidated(MessageSubscription.this);
+      }
+   }
+
+   public void notifyResolved() {
+      for (ISubscriptionListener listener : listeners) {
+         listener.subscriptionResolved(MessageSubscription.this);
+      }
+   }
+
+   public void notifyUnresolved() {
+      for (ISubscriptionListener listener : listeners) {
+         listener.subscriptionUnresolved(MessageSubscription.this);
+      }
+   }
+
+   @Override
+   public synchronized boolean addSubscriptionListener(ISubscriptionListener listener) {
+      boolean result = listeners.add(listener);
+      if (currentState == null) {
+         listener.subscriptionCanceled(this);
+      } else {
+         if (msgService.getMsgDatabase() != null) {
+            // a database is available
+            if (currentState.isResolved()) {
+               listener.subscriptionResolved(this);
+            } else {
+               listener.subscriptionInvalidated(this);
+            }
+            if (currentState.isActive()) {
+               listener.subscriptionActivated(this);
+            }
+         }
+
+      }
+
+      return result;
+   }
+
+   @Override
+   public boolean removeSubscriptionListener(ISubscriptionListener listener) {
+      return listeners.remove(listener);
+   }
+
+   public String getRequestedDataType() {
+	   return requestedDataType;
+   }
+
+   public void setRequestedDataType(String requestedDataType) {
+	   this.requestedDataType = requestedDataType;
+   }
+   
+   
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java
new file mode 100644
index 0000000..8b2018f
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java
@@ -0,0 +1,371 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.channels.DatagramChannel;
+import java.rmi.RemoteException;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.client.msg.IOteMessageService;
+import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageDefinitionProvider;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.RecordCommand.MessageRecordDetails;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystem;
+import org.eclipse.osee.ote.message.tool.IFileTransferHandle;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.eclipse.osee.ote.message.tool.TransferConfig;
+import org.eclipse.osee.ote.message.tool.UdpFileTransferHandler;
+import org.eclipse.osee.ote.remote.messages.RECORDING_COMPLETE;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageSubscriptionService implements IOteMessageService, ITestConnectionListener, IMsgToolServiceClient, EventHandler {
+
+   /** * Static Fields ** */
+   private static final int MAX_CONCURRENT_WORKER_THREADS = Math.min(Runtime.getRuntime().availableProcessors() + 1, 4);
+
+   private final InetAddress localAddress;
+   private final List<MessageSubscription> subscriptions = new CopyOnWriteArrayList<>();
+   private volatile AbstractMessageDataBase msgDatabase;
+   private UdpFileTransferHandler fileTransferHandler;
+   private volatile boolean connected = false;
+
+   private final ExecutorService threadPool = Executors.newFixedThreadPool(MAX_CONCURRENT_WORKER_THREADS,
+      new ThreadFactory() {
+         private final ThreadGroup group =
+            new ThreadGroup(Thread.currentThread().getThreadGroup(), "Msg Watch Workers");
+         private int count = 1;
+
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread thread = new Thread(group, arg0, "Msg Watch Wrkr - " + count++);
+            thread.setDaemon(false);
+            return thread;
+         }
+      });
+
+   /**
+    * Monitors a set of channels for message updates and dispatches the updates to worker threads
+    */
+   private UpdateDispatcher dispatcher = null;
+//   private volatile IRemoteMessageService service;
+
+   private volatile IOteClientService clientService;
+
+   public void start(){
+	   clientService.addConnectionListener(this);
+   }
+   
+   public void stop(){
+	   clientService.removeConnectionListener(this);
+   }
+   
+   public void bindOteClientService(IOteClientService clientService){
+	   this.clientService = clientService;
+   }
+   
+   public void unbindOteClientService(IOteClientService clientService){
+	   this.clientService = null;
+   }
+   
+   public MessageSubscriptionService() throws IOException {
+      localAddress = InetAddress.getLocalHost();
+      msgDatabase = new MessageDatabase(this);
+      OseeLog.log(Activator.class, Level.INFO,
+         "OTE client message service started on: " + localAddress.getHostAddress());
+   }
+
+   @Override
+   public synchronized IMessageSubscription subscribe(String name) {
+      MessageSubscription subscription = new MessageSubscription(this);
+      subscription.bind(name);
+      if (msgDatabase != null) {
+         subscription.attachMessageDb(msgDatabase);
+         if(connected){
+            subscription.attachService();
+         }
+      }
+      subscriptions.add(subscription);
+      return subscription;
+   }
+   
+   @Override
+   public IMessageSubscription subscribe(String name, MessageMode mode) {
+	      return subscribe(name, (DataType)null, mode);
+   }
+
+   @Override
+   public IMessageSubscription subscribe(String name, DataType dataType,
+		   MessageMode mode) {
+	   MessageSubscription subscription = new MessageSubscription(this);
+	   subscription.bind(name, dataType, mode);
+	   if (msgDatabase != null) {
+		   subscription.attachMessageDb(msgDatabase);
+		   if(connected){
+		      subscription.attachService();
+		   }
+	   }
+	   subscriptions.add(subscription);
+	   return subscription;
+   }
+   
+   @Override
+   public IMessageSubscription subscribe(String name, String dataType,
+		   MessageMode mode) {
+	   MessageSubscription subscription = new MessageSubscription(this);
+	   subscription.bind(name, dataType, mode);
+	   if (msgDatabase != null) {
+		   subscription.attachMessageDb(msgDatabase);
+		   if(connected) {
+		      subscription.attachService();
+		   }
+	   }
+	   subscriptions.add(subscription);
+	   return subscription;
+   }
+
+   /**
+    * Shuts down the client message service. All worker threads will be terminated and all IO resources will be closed.
+    */
+   public void shutdown() {
+      OseeLog.log(MessageSubscriptionService.class, Level.INFO, "shutting down subscription service");
+      clientService.removeConnectionListener(this);
+      shutdownDispatcher();
+      threadPool.shutdown();
+      try {
+         threadPool.awaitTermination(5, TimeUnit.SECONDS);
+      } catch (InterruptedException ex1) {
+         OseeLog.log(Activator.class, Level.WARNING, ex1.toString(), ex1);
+      }
+   }
+
+   @Override
+   public synchronized void onConnectionLost(IServiceConnector connector) {
+      OseeLog.log(Activator.class, Level.INFO, "connection lost: ote client message service halted");
+      shutdownDispatcher();
+      msgDatabase.detachService();
+      for (MessageSubscription subscription : subscriptions) {
+         subscription.detachService();
+      }
+      connected = false;
+   }
+
+   @Override
+   public synchronized void onPostConnect(ConnectionEvent event) {
+      assert msgDatabase != null;
+      connected = true;
+      OseeLog.log(Activator.class, Level.INFO, "connecting OTE client message service");
+      if (event.getEnvironment() instanceof ITestEnvironmentMessageSystem) {
+         ITestEnvironmentMessageSystem env = (ITestEnvironmentMessageSystem) event.getEnvironment();
+         try{
+            dispatcher = new UpdateDispatcher(MessageServiceSupport.getMsgUpdateSocketAddress());
+            try {
+               createProccessors();
+            } catch (Exception e) {
+               OseeLog.log(MessageSubscriptionService.class, Level.SEVERE, "failed to create update processors", e);
+               return;
+            }
+
+            msgDatabase.attachToService(this);
+            for (MessageSubscription subscription : subscriptions) {
+               subscription.attachService();
+            }
+            dispatcher.start();
+         } catch (IOException ex){
+            OseeLog.log(MessageSubscriptionService.class, Level.SEVERE, "failed to create update processors", ex);
+         }
+      }
+   }
+
+   private void createProccessors() throws IOException {
+      Set<? extends DataType> availableTypes = MessageServiceSupport.getAvailablePhysicalTypes();
+
+      for (DataType type : availableTypes) {
+         final ChannelProcessor handler =
+            new ChannelProcessor(1, type.getToolingBufferSize(), threadPool, msgDatabase, type);
+         dispatcher.addChannel(localAddress, 0, type, handler);
+      }
+   }
+
+   private void shutdownDispatcher() {
+      if (dispatcher != null && dispatcher.isRunning()) {
+         try {
+            dispatcher.close();
+         } catch (Throwable ex) {
+            OseeLog.log(MessageSubscriptionService.class, Level.WARNING, "exception while closing down dispatcher", ex);
+         } finally {
+            dispatcher = null;
+         }
+      }
+   }
+
+   @Override
+   public synchronized void onPreDisconnect(ConnectionEvent event) {
+      msgDatabase.detachService();
+      for (MessageSubscription subscription : subscriptions) {
+         subscription.detachService();
+      }
+      shutdownDispatcher();
+      connected = false;
+   }
+
+   @Override
+   public void changeIsScheduled(String msgName, boolean isScheduled) throws RemoteException {
+
+   }
+
+   @Override
+   public void changeRate(String msgName, double rate) throws RemoteException {
+
+   }
+
+   @Override
+   public InetSocketAddress getAddressByType(String messageName, DataType dataType) throws RemoteException {
+      if(dispatcher == null){
+         return null;
+      }
+      final DatagramChannel channel = dispatcher.getChannel(dataType);
+      if(channel == null){
+         return null;
+      }
+      return new InetSocketAddress(localAddress, channel.socket().getLocalPort());
+   }
+
+   @Override
+   public UUID getTestSessionKey() throws RemoteException {
+      return clientService.getSessionKey();
+   }
+
+   public void addMessageDefinitionProvider(MessageDefinitionProvider provider){
+	   for (MessageSubscription subscription : subscriptions) {
+		   if(!subscription.isResolved()){
+			   subscription.attachMessageDb(msgDatabase);
+		   }
+	   }
+   }
+   
+   public void removeMessageDefinitionProvider(MessageDefinitionProvider provider){
+	   for (MessageSubscription subscription : subscriptions) {
+		   if(subscription.isResolved()){
+			   Class<? extends Message> msg = null;
+			   Bundle hostBundle = null;
+			   try {
+				   msg = ExportClassLoader.getInstance().loadClass(subscription.getMessageClassName()).asSubclass(Message.class);
+				   hostBundle = FrameworkUtil.getBundle(msg.getClass());
+			   } catch (ClassNotFoundException e) {
+			   } finally{
+				   if(msg == null || hostBundle == null){
+					   subscription.detachMessageDb(msgDatabase);
+				   }
+			   }
+		   }
+	   }
+   }
+   
+   @Override
+   public synchronized IFileTransferHandle startRecording(String fileName, List<MessageRecordDetails> list) throws FileNotFoundException, IOException {
+      if(!connected){
+         throw new IllegalStateException("can't record: not connected to test server");
+      }
+      if (fileTransferHandler == null) {
+         fileTransferHandler = new UdpFileTransferHandler();
+         fileTransferHandler.start();
+      }
+      int port = PortUtil.getInstance().getValidPort();
+      // get the address of the socket the message recorder is going to write
+      // data to
+      InetSocketAddress recorderOutputAddress = MessageServiceSupport.getRecorderSocketAddress();
+
+      // setup a transfer from a socket to a file
+      TransferConfig config =
+         new TransferConfig(fileName, recorderOutputAddress, new InetSocketAddress(InetAddress.getLocalHost(), port),
+            TransferConfig.Direction.SOCKET_TO_FILE, 128000);
+      IFileTransferHandle handle = fileTransferHandler.registerTransfer(config);
+
+      // send the command to start recording
+      RecordCommand cmd =
+         new RecordCommand(this.getTestSessionKey(), new InetSocketAddress(InetAddress.getLocalHost(), port), list);
+      MessageServiceSupport.startRecording(cmd);
+      OseeLog.log(
+         Activator.class,
+         Level.INFO,
+         "recording started with " + list.size() + " entries, recorder output socket=" + recorderOutputAddress.toString());
+      return handle;
+   }
+
+   @Override
+   public synchronized void stopRecording() throws RemoteException, IOException {
+      MessageServiceSupport.stopRecording();
+   }
+   
+   /* (non-Javadoc)
+    * @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event)
+    */
+   @Override
+   public void handleEvent(Event event) {
+      if(event.getTopic().equals(RECORDING_COMPLETE.TOPIC)) {
+
+         if (fileTransferHandler != null && fileTransferHandler.hasActiveTransfers()) {
+            try {
+               fileTransferHandler.stopAllTransfers();
+            }
+            catch (IOException ex) {
+               System.err.println(ex.getMessage());
+               ex.printStackTrace(System.err);
+            }
+         }
+         fileTransferHandler = null;
+      }
+      
+   }
+
+   public AbstractMessageDataBase getMsgDatabase() {
+      return msgDatabase;
+   }
+
+   public void removeSubscription(MessageSubscription subscription) {
+      subscriptions.remove(subscription);
+   }
+
+   public boolean isConnected() {
+      return connected;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java
new file mode 100644
index 0000000..b784310
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.osee.ote.client.msg.core.IMessageDbFactory;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class OteClientServiceTracker extends ServiceTracker {
+
+   private final IMessageDbFactory factory;
+
+   private MessageSubscriptionService messageSubscriptionService;
+
+   private ServiceRegistration registration;
+
+   OteClientServiceTracker(IMessageDbFactory factory) {
+      super(Activator.getDefault().getBundleContext(), IOteClientService.class.getName(), null);
+      this.factory = factory;
+   }
+
+   @Override
+   public Object addingService(ServiceReference reference) {
+      IOteClientService service = (IOteClientService) super.addingService(reference);
+//      try {
+//         messageSubscriptionService = new MessageSubscriptionService(service, factory);
+//         registration = context.registerService(IOteMessageService.class.getName(), messageSubscriptionService, null);
+//      } catch (IOException e) {
+//         OseeLog.log(OteClientServiceTracker.class, Level.SEVERE, "could not start Message Service", e);
+//      }
+      return service;
+   }
+
+   @Override
+   public void removedService(ServiceReference reference, Object service) {
+      shutdownMessageService();
+      super.removedService(reference, service);
+   }
+
+   private void shutdownMessageService() {
+      if (registration != null) {
+         registration.unregister();
+         registration = null;
+      }
+      if (messageSubscriptionService != null) {
+         messageSubscriptionService.shutdown();
+         messageSubscriptionService = null;
+      }
+   }
+
+   @Override
+   public void close() {
+      shutdownMessageService();
+      super.close();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/SubscriptionHandler.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/SubscriptionHandler.java
new file mode 100644
index 0000000..a9ddc64
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/SubscriptionHandler.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+
+public interface SubscriptionHandler {
+
+   void onSubscriptionComplete(SubscriptionDetails details);
+   
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java
new file mode 100644
index 0000000..489dda1
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.channels.DatagramChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * A thread that listens for activity on a set of channels and then dispatches any recieved UDP packets to the
+ * appropriate worker threads
+ * 
+ * @author Ken J. Aguilar
+ */
+public final class UpdateDispatcher {
+   private static final int RECEIVE_BUFFER_SIZE = 1024 * 512;
+
+   /** * Class Instance Fields ** */
+   private final Map<DataType, DatagramChannel> channelMap = new HashMap<>();
+
+   private final InetSocketAddress remoteAddress;
+   private final Object gate = new Object();
+   private final Selector channelSelector;
+   private volatile boolean running = false;
+
+   private final Runnable runner = new Runnable() {
+
+      @Override
+      public void run() {
+
+         running = true;
+         try {
+            while (running) {
+               /* check to see if something has interrupted this thread */
+               if (Thread.interrupted()) {
+                  OseeLog.log(Activator.class, Level.FINE, "Channel Listener Thread interrupted");
+                  running = false;
+               } else {
+                  /*
+                   * wait for channel activity on all channels registered with this selector
+                   */
+                  final int readyCount = channelSelector.select();
+                  if (readyCount != 0) {
+                     /* get the set of readable channels */
+                     final Set<SelectionKey> readyChannels = channelSelector.selectedKeys();
+
+                     /* iterate through the set of readable channels */
+                     final Iterator<SelectionKey> keys = readyChannels.iterator();
+                     while (keys.hasNext()) {
+                        final SelectionKey key = keys.next();
+                        /* make sure the channel is still valid */
+                        if (key.isValid() && key.isReadable()) {
+                           ((ChannelProcessor) key.attachment()).process((DatagramChannel) key.channel());
+                        }
+                        keys.remove();
+                     }
+                  }
+                  synchronized (gate) {
+                     /*
+                      * do this to prevent the current thread from entering the channelSelector.select() method during
+                      * registration of channels with the selector. Not doing this will cause deadlock
+                      */
+                  }
+               }
+            }
+         } catch (InterruptedException ie) {
+            /*
+             * something has interrupted us, most likely we need to shut down. Catching the exception clears the
+             * interrupted flag
+             */
+            OseeLog.log(Activator.class, Level.INFO, "Channel Listener Interrupted... Shutting down");
+         } catch (IOException ioe) {
+            OseeLog.log(Activator.class, Level.INFO,
+               "IOException occurred in channel listening thread... shutting down ", ioe);
+         } catch (Throwable t) {
+            OseeLog.log(Activator.class, Level.SEVERE,
+               "Unusual exception occurred in channel listening thread... shutting down ", t);
+         }
+         running = false;
+         OseeLog.log(Activator.class, Level.INFO, "Channel Listener thread has terminated");
+      }
+
+   };
+
+   private final Thread thread = new Thread(runner, "Message Update Dispatcher Thread");
+
+   public UpdateDispatcher(InetSocketAddress remoteAddress) throws IOException {
+      this.remoteAddress = remoteAddress;
+      thread.setDaemon(false);
+      channelSelector = Selector.open();
+   }
+
+   public void start() {
+      thread.start();
+   }
+
+   public boolean isRunning() {
+      return running;
+   }
+
+   public DatagramChannel getChannel(DataType type) {
+      return channelMap.get(type);
+   }
+
+   public SelectionKey addChannel(InetAddress localAddress, int port, DataType type, ChannelProcessor processor) throws IOException {
+      final DatagramChannel channel = DatagramChannel.open();
+      channel.configureBlocking(false);
+      channel.socket().bind(new InetSocketAddress(localAddress, port));
+      if (channel.socket().getReceiveBufferSize() < RECEIVE_BUFFER_SIZE) {
+         channel.socket().setReceiveBufferSize(RECEIVE_BUFFER_SIZE);
+      }
+      channel.connect(remoteAddress);
+      if (channelMap.put(type, channel) != null) {
+         OseeLog.log(UpdateDispatcher.class, Level.WARNING, "A previous channel was replaced");
+      }
+      synchronized (gate) {
+         channelSelector.wakeup();
+         return channel.register(channelSelector, SelectionKey.OP_READ, processor);
+      }
+   }
+
+   /**
+    * terminates this thread in a graceful manner and attempts to release resources
+    */
+   public void close() {
+      thread.interrupt();
+      try {
+         thread.join();
+      } catch (InterruptedException ex) {
+         OseeLog.log(Activator.class, Level.WARNING, "Interrupted while joining", ex);
+      } finally {
+         OseeLog.log(Activator.class, Level.INFO, "clearing pool");
+         /* release IO resources */
+         try {
+            channelSelector.close();
+         } catch (Exception ex) {
+            OseeLog.log(Activator.class, Level.WARNING, "Exception closing selector", ex);
+         } finally {
+            for (final DataType type : channelMap.keySet()) {
+               try {
+                  final DatagramChannel channel = channelMap.get(type);
+                  if (channel != null) {
+                     channel.close();
+                  }
+
+               } catch (Throwable ex) {
+                  OseeLog.log(Activator.class, Level.WARNING, "could not close channel for " + type, ex);
+               }
+            }
+            channelMap.clear();
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java
new file mode 100644
index 0000000..45fe82b
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import org.eclipse.osee.ote.client.msg.core.internal.MessageSubscription;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractSubscriptionState implements ISubscriptionState {
+
+   private final DataType type;
+   private final MessageMode mode;
+   private final MessageSubscription subscription;
+
+   protected AbstractSubscriptionState(MessageSubscription subscription, DataType type, MessageMode mode) {
+      this.subscription = subscription;
+      this.type = type;
+      this.mode = mode;
+   }
+
+   protected AbstractSubscriptionState(AbstractSubscriptionState otherState) {
+      this.subscription = otherState.getSubscription();
+      this.type = otherState.getMemType();
+      this.mode = otherState.getMode();
+   }
+
+   @Override
+   public DataType getMemType() {
+      return type;
+   }
+
+   @Override
+   public MessageMode getMode() {
+      return mode;
+   }
+
+   protected MessageSubscription getSubscription() {
+      return subscription;
+   }
+
+   @Override
+   public void onCanceled() {
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java
new file mode 100644
index 0000000..a5939b6
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ActivateState extends AbstractSubscriptionState {
+
+   private final MessageInstance instance;
+   private final AbstractMessageDataBase msgDb;
+
+   public ActivateState(MessageInstance instance, AbstractMessageDataBase msgDb, AbstractSubscriptionState otherState) {
+      super(otherState);
+      this.instance = instance;
+      this.msgDb = msgDb;
+   }
+
+   @Override
+   public Message getMessage() {
+      return instance.getMessage();
+   }
+
+   @Override
+   public String getMsgClassName() {
+      return instance.getMessage().getClass().getName();
+   }
+
+   @Override
+   public ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb) {
+      getSubscription().notifyUnresolved();
+      try {
+         msgDb.releaseInstance(instance);
+      } catch (Exception e) {
+         OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+      }
+      return new UnresolvedState(getMsgClassName(), this);
+   }
+
+   @Override
+   public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+      throw new Error("Unexpected input for this state");
+   }
+
+   @Override
+   public ISubscriptionState onActivated() {
+      throw new Error("Unexpected input for this state");
+   }
+
+   @Override
+   public ISubscriptionState onDeactivated() {
+      return new InactiveState(instance, msgDb, this);
+   }
+
+   @Override
+   public void onCanceled() {
+      super.onCanceled();
+      try {
+         msgDb.releaseInstance(instance);
+      } catch (Exception e) {
+         OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+      }
+   }
+
+   @Override
+   public Set<DataType> getAvailableTypes() {
+      return instance.getAvailableTypes();
+   }
+
+   @Override
+   public boolean isActive() {
+      return true;
+   }
+
+   @Override
+   public boolean isResolved() {
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java
new file mode 100644
index 0000000..19b6a43
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.Set;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISubscriptionState {
+   DataType getMemType();
+
+   MessageMode getMode();
+
+   String getMsgClassName();
+
+   Message getMessage();
+
+   Set<DataType> getAvailableTypes();
+
+   ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB);
+
+   ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb);
+
+   ISubscriptionState onActivated();
+
+   ISubscriptionState onDeactivated();
+
+   void onCanceled();
+
+   boolean isActive();
+
+   boolean isResolved();
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java
new file mode 100644
index 0000000..4f87f6d
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class InactiveState extends AbstractSubscriptionState {
+
+   private final MessageInstance instance;
+   private final AbstractMessageDataBase msgDb;
+
+   public InactiveState(MessageInstance instance, AbstractMessageDataBase msgDb, AbstractSubscriptionState previousState) {
+      super(previousState);
+      this.instance = instance;
+      this.msgDb = msgDb;
+   }
+
+   @Override
+   public Message getMessage() {
+      return instance.getMessage();
+   }
+
+   @Override
+   public String getMsgClassName() {
+      return instance.getMessage().getClass().getName();
+   }
+
+   @Override
+   public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+      throw new Error("Unexpected input for this state");
+   }
+
+   @Override
+   public ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb) {
+      assert this.msgDb == msgDb;
+      getSubscription().notifyUnresolved();
+      try {
+         msgDb.releaseInstance(instance);
+      } catch (Exception e) {
+         OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+      }
+      return new UnresolvedState(getMsgClassName(), this);
+   }
+
+   @Override
+   public void onCanceled() {
+      super.onCanceled();
+      try {
+         msgDb.releaseInstance(instance);
+      } catch (Exception e) {
+         OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+      }
+   }
+
+   @Override
+   public ISubscriptionState onActivated() {
+      if (instance.isSupported()) {
+         getSubscription().notifyActivated();
+         return new ActivateState(instance, msgDb, this);
+      } else {
+         return this;
+      }
+
+   }
+
+   @Override
+   public ISubscriptionState onDeactivated() {
+      return this;
+   }
+
+   @Override
+   public Set<DataType> getAvailableTypes() {
+      return new HashSet<DataType>();
+   }
+
+   @Override
+   public boolean isActive() {
+      return false;
+   }
+
+   @Override
+   public boolean isResolved() {
+      return true;
+   }
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java
new file mode 100644
index 0000000..dc99a6b
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.client.msg.core.internal.MessageSubscription;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class UnresolvedState extends AbstractSubscriptionState {
+
+   private DataType type;
+
+   private final String msgClassName;
+   private MessageInstance instance = null;
+
+   public UnresolvedState(String msgClassName, MessageSubscription subscription, DataType type, MessageMode mode) {
+      super(subscription, type, mode);
+      this.type = type;
+      this.msgClassName = msgClassName;
+   }
+
+   public UnresolvedState(String msgClassName, AbstractSubscriptionState previousState) {
+      super(previousState);
+      this.msgClassName = msgClassName;
+   }
+
+   @Override
+   public Message getMessage() {
+      return instance != null ? instance.getMessage() : null;
+   }
+
+   @Override
+   public String getMsgClassName() {
+      return msgClassName;
+   }
+
+   @Override
+   public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+      try {
+    	  DataType requestedType = getMemType();
+          if (requestedType == null && getSubscription().getRequestedDataType() != null) {
+        	  instance = msgDB.acquireInstance(msgClassName, getMode(), getSubscription().getRequestedDataType());        	           	 
+          } else {
+        	  instance = msgDB.acquireInstance(msgClassName, getMode(), requestedType);        	  
+          }
+
+         this.type = instance.getType();
+         getSubscription().notifyResolved();
+         return new InactiveState(instance, msgDB, this);
+      } catch (Exception e) {
+    	 // Yes we do need to log this
+         OseeLog.log(UnresolvedState.class, Level.SEVERE, "problems acquring instance for " + getMsgClassName());
+         getSubscription().notifyInvalidated();
+         return this;
+      }
+
+   }
+
+   @Override
+   public DataType getMemType() {
+      return type;
+   }
+
+   @Override
+   public ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb) {
+      return this;
+   }
+
+   @Override
+   public ISubscriptionState onActivated() {
+      return this;
+   }
+
+   @Override
+   public ISubscriptionState onDeactivated() {
+      return this;
+   }
+
+   @Override
+   public Set<DataType> getAvailableTypes() {
+      return new HashSet<DataType>();
+   }
+
+   @Override
+   public boolean isActive() {
+      return false;
+   }
+
+   @Override
+   public boolean isResolved() {
+      return instance != null;
+   }
+}
diff --git a/org.eclipse.osee.ote.client/.classpath b/org.eclipse.osee.ote.client/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.client/.pmd b/org.eclipse.osee.ote.client/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>WhileLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfElseStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanReturns</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanExpressions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchStmtsShouldHaveDefault</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDeeplyNestedIfStmts</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidReassigningParameters</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchDensity</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConstructorCallsOverridableMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AccessorClassGeneration</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalFieldCouldBeStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloseResource</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonStaticInitializer</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultLabelNotLastInSwitchStmt</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonCaseLabelInSwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OptimizableToArrayCall</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BadComparison</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EqualsNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConfusingTernary</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InstantiationToGetClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IdempotentOperations</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimpleDateFormatNeedsLocale</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImmutableField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseLocaleWithCaseConversions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidProtectedFieldInFinalClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentToNonFinalStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingStaticMethodInNonInstantiatableClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidSynchronizedAtMethodLevel</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingBreakInSwitch</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseNotifyAllInsteadOfNotify</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstanceofChecksInCatchClause</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAbstractMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyConditional</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CompareObjectsWithEquals</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PositionLiteralsFirstInComparisons</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryLocalBeforeReturn</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonThreadSafeSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyConstructor</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidConstantsInterface</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnsynchronizedStaticDateFormatter</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PreserveStackTrace</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCollectionIsEmpty</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SingularField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnEmptyArrayRatherThanNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAnyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooFewBranchesForASwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingThrowable</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExceptionAsFlowControl</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingNPE</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingRawExceptionTypes</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNullPointerException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidRethrowingException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotExtendJavaLangError</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotThrowExceptionInFinally</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNewInstanceOfSameException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateField</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedLocalVariable</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateMethod</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedFormalParameter</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MoreThanOneLogger</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LoggerIsNotStaticFinal</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SystemPrintln</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidPrintStackTrace</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDuplicateLiterals</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringInstantiation</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringToString</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientStringBuffering</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryCaseChange</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferLength</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AppendCharacterWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConsecutiveLiteralAppends</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseIndexOfChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientEmptyStringCheck</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InsufficientStringBufferDeclaration</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessStringValueOf</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringBufferInstantiationWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseEqualsToCompareStrings</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidStringBufferField</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceVectorWithList</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceHashtableWithMap</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceEnumerationWithIterator</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidEnumAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAssertAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IntegerInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ByteInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LongInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseBeforeAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseAfterAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseTestAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitUseExpected</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseProperClassLoader</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MDBAndSessionBeanNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteSessionInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalInterfaceSessionNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalHomeNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallSystemExit</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StaticEJBFieldShouldBeFinal</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotUseThreads</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstantiatingObjectsInLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArrayListInsteadOfVector</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyStartsWith</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferForStringAppends</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArraysAsList</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidArrayLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryWrapperObjectCreation</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AddEmptyString</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyCatchBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyIfStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyWhileStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyTryBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySwitchStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JumbledIncrementer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopShouldBeWhileLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConversionTemporary</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OverrideBothEqualsAndHashcode</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoubleCheckedLocking</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnFromFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySynchronizedBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryReturn</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStaticInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnconditionalIfStatement</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStatementNotInLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryFinalModifier</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CollapsibleIfStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOverridingMethod</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassCastExceptionWithToArray</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOperationOnImmutable</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisplacedNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedNullCheckInEquals</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThreadGroup</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BrokenNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BigIntegerInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingOctalValues</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingHardCodedIP</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CheckResultSet</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidMultipleUnaryOperators</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodReturnsInternalArray</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>ArrayIsStoredDirectly</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>CouplingBetweenObjects</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveImports</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DuplicateImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportJavaLang</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImportFromSamePackage</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyStaticImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitStaticSuite</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitSpelling</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitAssertionsShouldIncludeMessage</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitTestsShouldIncludeAssert</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TestClassWithoutTestCases</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertEqualsInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertSameInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertNullInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NullAssignment</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedModifier</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentInOperand</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AtLeastOneConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportSun</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousOctalEscape</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CallSuperInConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryParentheses</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultPackage</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInversion</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DataflowAnomalyAnalysis</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFinalLocalVariable</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingShortType</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingVolatile</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingNativeCode</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAccessibilityAlteration</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallGarbageCollectionExplicitly</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractNaming</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDollarSigns</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodWithSameNameAsEnclosingClass</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousHashcodeMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousConstantFieldName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousEqualsMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingTypeName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NoPackage</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PackageCase</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisleadingVariableName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanGetMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NPathComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveMethodLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveParameterList</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveClassLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CyclomaticComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessivePublicCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyFields</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssMethodCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssTypeCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssConstructorCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyMethods</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinalizer</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOnlyCallsSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOverloaded</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeDoesNotCallSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeShouldBeProtected</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCallingFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCorrectExceptionLogging</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperLogger</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingSerialVersionUID</name>
+            <ruleset>JavaBean Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperCloneImplementation</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneThrowsCloneNotSupportedException</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+    </rules>
+    <includeDerivedFiles>false</includeDerivedFiles>
+    <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.client/.project b/org.eclipse.osee.ote.client/.project
new file mode 100644
index 0000000..582419a
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.client</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.client/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.client/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0668fa5
--- /dev/null
+++ b/org.eclipse.osee.ote.client/META-INF/MANIFEST.MF
@@ -0,0 +1,71 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Service (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.client;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.service.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Import-Package: net.jini.activation,
+ net.jini.admin,
+ net.jini.config,
+ net.jini.constraint,
+ net.jini.core.constraint,
+ net.jini.core.discovery,
+ net.jini.core.entry,
+ net.jini.core.event,
+ net.jini.core.lease,
+ net.jini.core.lookup,
+ net.jini.core.transaction,
+ net.jini.core.transaction.server,
+ net.jini.discovery,
+ net.jini.entry,
+ net.jini.event,
+ net.jini.export,
+ net.jini.id,
+ net.jini.iiop,
+ net.jini.io,
+ net.jini.io.context,
+ net.jini.jeri,
+ net.jini.jeri.connection,
+ net.jini.jeri.http,
+ net.jini.jeri.kerberos,
+ net.jini.jeri.ssl,
+ net.jini.jeri.tcp,
+ net.jini.jrmp,
+ net.jini.lease,
+ net.jini.loader,
+ net.jini.loader.pref,
+ net.jini.lookup,
+ net.jini.lookup.entry,
+ net.jini.security,
+ net.jini.security.policy,
+ net.jini.security.proxytrust,
+ net.jini.space,
+ net.jini.url.file,
+ net.jini.url.httpmd,
+ net.jini.url.https,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.ote,
+ org.eclipse.osee.ote.connection.jini,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.enums,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.core.environment.status,
+ org.eclipse.osee.ote.core.framework,
+ org.eclipse.osee.ote.core.framework.prompt,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.message,
+ org.osgi.framework,
+ org.osgi.service.packageadmin,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.ote.service,
+ org.eclipse.osee.ote.service.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.ote.client/build.properties b/org.eclipse.osee.ote.client/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.client/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.client/pom.xml b/org.eclipse.osee.ote.client/pom.xml
new file mode 100644
index 0000000..b2a0606
--- /dev/null
+++ b/org.eclipse.osee.ote.client/pom.xml
@@ -0,0 +1,35 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.ote.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../org.eclipse.osee.ote.parent</relativePath>
+	</parent>
+
+	<artifactId>org.eclipse.osee.ote.client</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Client (Incubation)</name>
+
+   <build>
+     <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+     <resources>
+      <resource>
+        <directory>src</directory>
+        <excludes>
+          <exclude>**/*.java</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-source-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+  
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java
new file mode 100644
index 0000000..9da6206
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.service.core.ConnectionServiceTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+   private ConnectionServiceTracker connectionServiceTracker;
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      connectionServiceTracker = new ConnectionServiceTracker(context);
+      connectionServiceTracker.open(true);
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+
+      // close the service tracker
+      connectionServiceTracker.close();
+      connectionServiceTracker = null;
+
+   }
+
+   public static void log(Level level, String message, Throwable t) {
+      OseeLog.log(Activator.class, level, message, t);
+   }
+
+   public static void log(Level level, String message) {
+      log(level, message, null);
+   }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java
new file mode 100644
index 0000000..f9f2f17
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.util.UUID;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * This event contains information regarding a change in connectivity between a client and a test host
+ * 
+ * @author Ken J. Aguilar
+ */
+public final class ConnectionEvent {
+
+   private final ITestEnvironment environment;
+   private final IServiceConnector connector;
+   private final UUID sessionKey;
+   private final OteServiceProperties props;
+   private final IHostTestEnvironment hostTestEnvironment;
+
+   public ConnectionEvent(IHostTestEnvironment hostTestEnvironment, IServiceConnector connector, ITestEnvironment environment, UUID sessionKey) {
+      if (connector == null) {
+         throw new NullPointerException("connector cannot be null");
+      }
+      this.environment = environment;
+      this.connector = connector;
+      this.sessionKey = sessionKey;
+      this.hostTestEnvironment = hostTestEnvironment;
+      props = new OteServiceProperties(connector);
+   }
+
+   /**
+    * returns the test environment in which the connection event applies to
+    * 
+    * @return the environment
+    */
+   public ITestEnvironment getEnvironment() {
+      return environment;
+   }
+
+   /**
+    * returns the {@link IServiceConnector} that provides the communication interface to the remote service
+    * 
+    * @return the connector
+    */
+   public IServiceConnector getConnector() {
+      return connector;
+   }
+
+   /**
+    * gets the test environment session key
+    * 
+    * @return the sessionKey
+    */
+   public UUID getSessionKey() {
+      return sessionKey;
+   }
+
+   public OteServiceProperties getProperties() {
+      return props;
+   }
+
+   public IHostTestEnvironment getHostEnvironment() {
+      return hostTestEnvironment;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java
new file mode 100644
index 0000000..5950b16
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IEnvironmentConfigurer {
+   boolean configure(IHostTestEnvironment event, SubProgressMonitor subProgressMonitor) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java
new file mode 100644
index 0000000..d29a224
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.net.InetAddress;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * This service provides the means to find all available test servers and connect to them.
+ * 
+ * @author Ken J. Aguilar
+ */
+public interface IOteClientService {
+   /**
+    * registers a {@link ITestEnvironmentAvailibilityListener} that will be notified whenever a test host changes its
+    * availability status. <BR>
+    * <B>NOTE: </B>The newly registered listener's
+    * {@link ITestEnvironmentAvailibilityListener#environmentAvailable(IHostTestEnvironment, org.eclipse.osee.connection.service.IServiceConnector, ServiceProperty)}
+    * method will be called immediately for each test host currently available
+    */
+   void addEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener);
+
+   void removeEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener);
+
+   /**
+    * adds the {@link ITestConnectionListener} that will be notified of connection events. <B>NOTE:</B> that if a
+    * connection has already been made prior to calling this method then the listener's
+    * {@link ITestConnectionListener#onPostConnect(ITestEnvironment)} method will be immediately called.
+    */
+   void addConnectionListener(ITestConnectionListener listener);
+
+   void removeConnectionListener(ITestConnectionListener listener);
+
+   /**
+    * sets the user that will logged into the OTE client service. A user must be set prior to connecting to an OTE test
+    * environment. If a connection is already established it will be broken prior to setting the new user.
+    */
+   void setUser(OSEEPerson1_4 user, InetAddress address) throws TestSessionException;
+
+   /**
+    * gets the current user as set by the {@link #setUser(OSEEPerson1_4, InetAddress)} method
+    * 
+    * @return the current user or null if no user has been set
+    */
+   OSEEPerson1_4 getUser();
+
+   /**
+    * creates a connection to a test server. <B>NOTE: </B><I>A user must be logged in prior to calling this method.>/I>
+    * @param monitor 
+    * 
+    * @see #setUser(OSEEPerson1_4, InetAddress)
+    */
+   ConnectionEvent connect(IHostTestEnvironment env, IEnvironmentConfigurer configurer, TestEnvironmentConfig config, IProgressMonitor monitor) throws TestSessionException;
+
+   /**
+    * breaks the current connection to a test server. This will call the
+    * {@link ITestConnectionListener#onPreDisconnect(ConnectionEvent)} method for each registered
+    * {@link ITestConnectionListener} before the connection is actually broken.
+    */
+   void disconnect() throws TestSessionException;
+
+   /**
+    * gets the currently connected test environment
+    * 
+    * @return returns the connected {@link ITestEnvironment} or null if no connection exists
+    */
+   ITestEnvironment getConnectedEnvironment();
+
+   /**
+    * returns the connector for the currently connected test environment
+    */
+   IServiceConnector getConnector();
+
+   IHostTestEnvironment getConnectedHost();
+
+   OteServiceProperties getProperties(IHostTestEnvironment testHost);
+
+   boolean isConnected();
+
+   /**
+    * sets a {@link SessionDelegate} who will handle certain aspects of the client session A successful call to
+    * {@link #setUser(OSEEPerson1_4, InetAddress)} must have occurred prior to calling this method.
+    */
+   void setSessionDelegate(SessionDelegate sessionDelegate);
+
+   /**
+    * returns a collection of all the {@link IHostTestEnvironment} that are currently available.
+    */
+   List<IServiceConnector> getAvailableTestHosts();
+
+   IServiceConnector getConnector(IHostTestEnvironment host);
+
+   UUID getSessionKey();
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java
new file mode 100644
index 0000000..f382149
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ITestConnectionListener {
+
+   void onPostConnect(ConnectionEvent event);
+
+   /**
+    * the connection to the service is broken unexpectedly. The service is not considered valid and thus clients should
+    * not try to communicate in any way with the OTE server. Clients are free to modify any local state.
+    */
+   void onConnectionLost(IServiceConnector connector);
+
+   /**
+    * this method is called when a disconnect request is initiated by the client. The connector and the service are
+    * still valid. This allows clients to remove any listeners on the remote OTE server or set some state prior to the
+    * actual disconnect.
+    */
+   void onPreDisconnect(ConnectionEvent event);
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java
new file mode 100644
index 0000000..20b557d
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * This listener will be notified of test host availability events. Clients must register implementations of this
+ * listener by calling {@link IOteClientService#addEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener)}
+ * 
+ * @author Ken J. Aguilar
+ */
+public interface ITestEnvironmentAvailibilityListener {
+
+   /**
+    * this method will be called when a {@link IHostTestEnvironment} becomes available for use.
+    */
+   void environmentAvailable(IServiceConnector connector, OteServiceProperties properties);
+
+   /**
+    * this method will be called whenever a {@link IHostTestEnvironment} becomes unavailable.
+    */
+   void environmentUnavailable(IServiceConnector connector, OteServiceProperties properties);
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentFilter.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentFilter.java
new file mode 100644
index 0000000..9d92412
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentFilter.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ITestEnvironmentFilter {
+   boolean accept(IHostTestEnvironment env, OteServiceProperties properties);
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/JmsToJiniBridgeConnector.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/JmsToJiniBridgeConnector.java
new file mode 100644
index 0000000..3db200f
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/JmsToJiniBridgeConnector.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import net.jini.export.Exporter;
+import net.jini.jeri.BasicILFactory;
+import net.jini.jeri.BasicJeriExporter;
+import net.jini.jeri.tcp.TcpServerEndpoint;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.connection.service.IServicePropertyChangeListener;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class JmsToJiniBridgeConnector implements IServiceConnector {
+   public static final String TYPE = "jmstojini";
+   private static final class ExportInfo {
+      private final Exporter exporter;
+      private final Object exportedObject;
+
+      private ExportInfo(Exporter exporter, Object exportedObject) {
+         this.exportedObject = exportedObject;
+         this.exporter = exporter;
+      }
+   }
+
+   private EnhancedProperties properties;
+   private final HashMap<Object, ExportInfo> exports = new HashMap<>();
+   private final ExportClassLoader exportClassLoader;
+   private final Object service;
+   private final List<IServicePropertyChangeListener> propertyChangeListeners =
+      new CopyOnWriteArrayList<IServicePropertyChangeListener>();
+   private final String uniqueServerId;
+   private boolean connected = false;
+
+   public JmsToJiniBridgeConnector(ExportClassLoader exportClassLoader, Object service, String id) {
+      this.uniqueServerId = id;
+      this.exportClassLoader = exportClassLoader;
+      this.service = service;
+      if (service instanceof IHostTestEnvironment) {
+         try {
+            this.properties = ((IHostTestEnvironment) service).getProperties();
+         } catch (RemoteException ex) {
+            this.properties = new EnhancedProperties();
+            ex.printStackTrace();
+         }
+      } else {
+         this.properties = new EnhancedProperties();
+      }
+   }
+
+   @Override
+   public Object export(Object callback) throws ExportException {
+      try {
+         Exporter exporter = createExporter();
+         Object exportedObject = exporter.export((Remote) callback);
+         exports.put(callback, new ExportInfo(exporter, exportedObject));
+         return exportedObject;
+      } catch (UnknownHostException e) {
+         throw new ExportException("failed to export", e);
+      }
+   }
+
+   @Override
+   public void unexport(Object callback) throws Exception {
+      ExportInfo info = exports.remove(callback);
+      if (info != null) {
+         info.exporter.unexport(false);
+      }
+   }
+
+   @Override
+   public Object findExport(Object callback) {
+      ExportInfo info = exports.get(callback);
+      if (info != null) {
+         return info.exportedObject;
+      }
+      return null;
+   }
+
+   @Override
+   public void stop() throws Exception {
+      for (ExportInfo info : exports.values()) {
+         info.exporter.unexport(false);
+      }
+      exports.clear();
+   }
+
+   private Exporter createExporter() throws UnknownHostException {
+      return new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+         new BasicILFactory(null, null, exportClassLoader), false, false);
+   }
+
+   @Override
+   public String getConnectorType() {
+      return TYPE;
+   }
+
+   @Override
+   public Serializable getProperty(String property, Serializable defaultValue) {
+      return properties.getProperty(property, defaultValue);
+   }
+
+   @Override
+   public Object getService() {
+      return service;
+   }
+
+   @Override
+   public boolean ping() {
+      if (getService() != null && getService() instanceof IHostTestEnvironment) {
+         try {
+            ((IHostTestEnvironment) getService()).getProperties();
+            return true;
+         } catch (Throwable th) {
+            return false;
+         }
+      }
+      return false;
+   }
+
+   @Override
+   public void addPropertyChangeListener(IServicePropertyChangeListener listener) {
+      propertyChangeListeners.add(listener);
+   }
+
+   @Override
+   public void removePropertyChangeListener(IServicePropertyChangeListener listener) {
+      propertyChangeListeners.remove(listener);
+   }
+
+   @Override
+   public void setProperty(String key, Serializable value) {
+      properties.setProperty(key, value);
+      for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+         listener.propertyChanged(this, key, value);
+      }
+   }
+
+   @Override
+   public URI upload(File file) throws Exception {
+      return null;
+   }
+
+   @Override
+   public String getUniqueServerId() {
+      return uniqueServerId;
+   }
+
+   @Override
+   public EnhancedProperties getProperties() {
+      return properties;
+   }
+
+   @Override
+   public void init(Object service) throws UnknownHostException, ExportException {
+
+   }
+   
+   public void setConnected(boolean connected){
+      this.connected = connected;
+   }
+   
+   public boolean isConnected() {
+      return this.connected;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java
new file mode 100644
index 0000000..853d239
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.io.Serializable;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class OteServiceProperties {
+   private IServiceConnector connector;
+
+   private static final String NA = "N.A.";
+   private final boolean debug = false;
+
+   private EnhancedProperties properties;
+
+   public OteServiceProperties(IServiceConnector connector) {
+      this.connector = connector;
+   }
+
+   public OteServiceProperties(EnhancedProperties properties) {
+      this.properties = properties;
+   }
+
+   private String getLocalProperty(String name) {
+      if (connector != null) {
+         return (String) connector.getProperty(name, NA);
+      } else if (properties != null) {
+         return (String) properties.getProperty(name, NA);
+      }
+      return NA;
+   }
+
+   /**
+    * @return the name
+    */
+   public String getName() {
+      return getLocalProperty("name");
+   }
+
+   /**
+    * @return the station
+    */
+   public String getStation() {
+      return getLocalProperty("station");
+   }
+
+   /**
+    * @return the type
+    */
+   public String getType() {
+      return getLocalProperty("type");
+   }
+
+   /**
+    * @return the mode
+    */
+   public String getMode() {
+      return getLocalProperty("mode");
+   }
+
+   /**
+    * @return the version
+    */
+   public String getVersion() {
+      return getLocalProperty("version");
+   }
+
+   /**
+    * @return the group
+    */
+   public String getGroup() {
+      return getLocalProperty("groups");
+   }
+
+   /**
+    * @return the comment
+    */
+   public String getComment() {
+      return getLocalProperty("comment");
+   }
+
+   /**
+    * @return the dateStart
+    */
+   public String getDateStarted() {
+      return getLocalProperty("date").toString();
+   }
+
+   public String getUserList() {
+      return getLocalProperty("user_list").toString();
+   }
+
+   public void printStats() {
+      if (debug) {
+         System.out.printf("test service found:\n\tname: %s\n\tstation: %s\n\ttype: %s\n\tcomment: %s\n\t%s\n",
+            getName(), getStation(), getType(), getComment(), getGroup());
+      }
+   }
+
+   public Serializable getProperty(String name) {
+      return connector.getProperty(name, null);
+   }
+
+   public String getOwner() {
+      return (String) connector.getProperty("owner", NA);
+   }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java
new file mode 100644
index 0000000..f198064
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IResumeResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IYesNoPromptResponse;
+
+/**
+ * Test sessions will delegate responsibilities to sub classes of this interface.
+ * 
+ * @author Ken J. Aguilar
+ */
+public interface SessionDelegate {
+   void handlePassFail(IPassFailPromptResponse prompt) throws Exception;
+
+   void handleYesNo(IYesNoPromptResponse prompt) throws Exception;
+
+   void handlePause(IResumeResponse prompt) throws Exception;
+
+   void handleInformationPrompt(String message) throws Exception;
+
+   void handleUserInput(final IUserInputPromptResponse prompt) throws Exception;
+
+   /**
+    * When connected to a {@link IHostTestEnvironment}, it is possible for the environment to request files from the
+    * client. This method will be called by the {@link IHostTestEnvironment} with a path that should make sense to the
+    * client.
+    * 
+    * @return an array bytes that represent the content of the requested file
+    */
+   byte[] getFile(String path) throws Exception;
+
+   long getFileDate(String path) throws Exception;
+
+   void cancelPrompts() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java
new file mode 100644
index 0000000..9ba557e
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class TestSessionException extends Exception {
+
+   private static final long serialVersionUID = -2013110839832896588L;
+
+   public TestSessionException(String message, Throwable cause) {
+      super(message, cause);
+   }
+
+   public TestSessionException(String message) {
+      super(message);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
new file mode 100644
index 0000000..c850a25
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.net.InetAddress;
+import java.rmi.RemoteException;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.AbstractRemoteSession;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IResumeResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IYesNoPromptResponse;
+import org.eclipse.osee.ote.service.Activator;
+import org.eclipse.osee.ote.service.SessionDelegate;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ClientSession extends AbstractRemoteSession {
+   private static final int TIMEOUT = 1; // 1 minute timeout
+   private static final String LOCK_ERROR_MSG = "could not acquire lock";
+   private final InetAddress address;
+   private SessionDelegate sessionDelegate = null;
+   private final ReentrantLock lock = new ReentrantLock();
+//   private final OteClientEndpointReceive receive;
+   private UUID id;
+
+   public ClientSession(OSEEPerson1_4 user, InetAddress address) {
+      super(user);
+      this.address = address;
+//      this.receive = receive;
+      this.id = UUID.randomUUID();
+      Activator.log(Level.INFO,
+         String.format("Created OTE session for %s. Address=%s\n ", user.getName(), address.toString()));
+   }
+
+   @Override
+   public String getAddress() throws RemoteException {
+      return address.getHostAddress();
+   }
+
+   @Override
+   public byte[] getFile(String workspacePath) throws RemoteException {
+      if (sessionDelegate != null) {
+         try {
+            return sessionDelegate.getFile(workspacePath);
+         } catch (Exception ex) {
+            throw new RemoteException("failed to get the file " + workspacePath, ex);
+         }
+      }
+      throw new IllegalStateException("session delegate not set");
+   }
+
+   @Override
+   public long getFileDate(String workspacePath) throws RemoteException {
+      if (sessionDelegate != null) {
+         try {
+            return sessionDelegate.getFileDate(workspacePath);
+         } catch (Exception ex) {
+            throw new RemoteException("failed to get the file date" + workspacePath, ex);
+         }
+      }
+      throw new IllegalStateException("session delegate not set");
+   }
+
+   @Override
+   public boolean isAlive() throws RemoteException {
+      try {
+         if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
+            try {
+               return true;
+            } finally {
+               lock.unlock();
+            }
+         }
+         return false;
+      } catch (InterruptedException ex) {
+         throw new RemoteException(LOCK_ERROR_MSG, ex);
+      }
+   }
+
+   @Override
+   public void initiateInformationalPrompt(String message) throws RemoteException {
+      assert sessionDelegate != null : "delegate is null";
+      try {
+         sessionDelegate.handleInformationPrompt(message);
+      } catch (Exception ex) {
+         System.out.println(message);
+      }
+   }
+
+   @Override
+   public void initiatePassFailPrompt(IPassFailPromptResponse prompt) throws RemoteException {
+      assert sessionDelegate != null : "delegate is null";
+      try {
+         sessionDelegate.handlePassFail(prompt);
+      } catch (Exception ex) {
+         throw new RemoteException("exception initiating prompt", ex);
+      }
+   }
+
+   @Override
+   public void initiateResumePrompt(IResumeResponse prompt) throws RemoteException {
+      assert sessionDelegate != null : "delegate is null";
+      try {
+         sessionDelegate.handlePause(prompt);
+      } catch (Exception ex) {
+         throw new RemoteException("exception initiating prompt", ex);
+      }
+   }
+
+   @Override
+   public void cancelPrompts() throws RemoteException {
+      assert sessionDelegate != null : "delegate is null";
+      try {
+         sessionDelegate.cancelPrompts();
+      } catch (Exception ex) {
+         throw new RemoteException("exception canceling prompt", ex);
+      }
+   }
+
+   @Override
+   public void initiateUserInputPrompt(IUserInputPromptResponse prompt) throws RemoteException {
+      assert sessionDelegate != null : "delegate is null";
+      try {
+         sessionDelegate.handleUserInput(prompt);
+      } catch (Exception ex) {
+         throw new RemoteException("exception initiating prompt", ex);
+      }
+   }
+
+   /**
+    * this must be called prior to establishing a test host connection
+    */
+   synchronized void setSessionDelegate(SessionDelegate sessionDelegate) {
+      // intentionally package-private
+      this.sessionDelegate = sessionDelegate;
+   }
+
+   /**
+    * closes this session
+    */
+   void close() {
+
+   }
+
+   TestHostConnection connect(IServiceConnector connector, IHostTestEnvironment testHost, TestEnvironmentConfig config) throws Exception {
+      // intentionally package-private
+      if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
+         try {
+            IRemoteUserSession exportedSession = (IRemoteUserSession) connector.export(this);
+            UUID id = UUID.randomUUID();
+            Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+            ConnectionRequestResult result = testHost.requestEnvironment(exportedSession, id, config);
+            if (result != null && result.getStatus().getStatus()) {
+               connector.setConnected(true);
+               return new TestHostConnection(connector, testHost, result.getEnvironment(), result.getSessionKey());
+            } else {
+               OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, "Error Connecting to the OTE Test Server.",
+                  new Exception(result.getStatus().getMessage()));
+            }
+            return null;
+         } finally {
+            lock.unlock();
+         }
+      }
+      throw new IllegalStateException(LOCK_ERROR_MSG);
+
+   }
+
+   void disconnect(TestHostConnection connection) throws InterruptedException, RemoteException {
+      // intentionally package-private
+      if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
+         try {
+            connection.getServiceConnector().setConnected(false);
+            connection.endConnection();
+            return;
+         } finally {
+            lock.unlock();
+         }
+      }
+      throw new IllegalStateException(LOCK_ERROR_MSG);
+   }
+
+   @Override
+   public void initiateYesNoPrompt(IYesNoPromptResponse prompt) throws Exception {
+      assert sessionDelegate != null : "delegate is null";
+      try {
+         sessionDelegate.handleYesNo(prompt);
+      } catch (Exception ex) {
+         throw new RemoteException("exception initiating prompt", ex);
+      }
+   }
+
+   @Override
+   public UUID getUserId() throws Exception {
+      return id;
+   }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ConnectionServiceTracker.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ConnectionServiceTracker.java
new file mode 100644
index 0000000..7a82a8b
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ConnectionServiceTracker.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.TestSessionException;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class ConnectionServiceTracker extends ServiceTracker {
+
+//   private final OteClientEndpointReceive endpointReceive = new OteClientEndpointReceive();
+//   private final OteClientEndpointSend endpointSend = new OteClientEndpointSend();
+//   private final MessagingGatewayBindTracker messagingGatewayTracker;
+
+   private ServiceRegistration registration;
+   private TestClientServiceImpl testClientService;
+
+   public ConnectionServiceTracker(BundleContext context) {
+      super(context, IConnectionService.class.getName(), null);
+//      messagingGatewayTracker = new MessagingGatewayBindTracker(context, endpointSend, endpointReceive);
+//      messagingGatewayTracker.open(true);
+   }
+
+   @Override
+   public Object addingService(ServiceReference reference) {
+      IConnectionService connectionService = (IConnectionService) super.addingService(reference);
+      testClientService = new TestClientServiceImpl(connectionService);
+      testClientService.init();
+      // register the service
+      registration = context.registerService(IOteClientService.class.getName(), testClientService, null);
+      return connectionService;
+   }
+
+   private void shutdownClientService() {
+      if (testClientService != null) {
+         // we should fire off all disconnect listeners before we unregister the service
+         if (testClientService.isConnected()) {
+            try {
+               testClientService.disconnect();
+            } catch (TestSessionException ex) {
+               OseeLog.log(ConnectionServiceTracker.class, Level.SEVERE, "failed to disconnect", ex);
+            }
+         }
+         registration.unregister();
+         try {
+            testClientService.stop();
+         } catch (Exception e) {
+            OseeLog.log(ConnectionServiceTracker.class, Level.SEVERE, "failed to properly stop OTE client service", e);
+
+         }
+         testClientService = null;
+      }
+   }
+
+   @Override
+   public void close() {
+      shutdownClientService();
+//      messagingGatewayTracker.close();
+      super.close();
+   }
+
+   @Override
+   public void removedService(ServiceReference reference, Object service) {
+      shutdownClientService();
+      super.removedService(reference, service);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java
new file mode 100644
index 0000000..61490b5
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.service.Activator;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class ListenerNotifier {
+   private final ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() {
+      private int count = 0;
+      @Override
+      public Thread newThread(Runnable r) {
+         Thread th = new Thread(r);
+         th.setName(String.format("OTE listener notifier [%d]", count++));
+         return th;
+      }
+   });
+   private final CopyOnWriteArraySet<ITestConnectionListener> testConnectionListeners =
+      new CopyOnWriteArraySet<ITestConnectionListener>();
+
+   boolean addTestConnectionListener(ITestConnectionListener listener) {
+      return testConnectionListeners.add(listener);
+   }
+
+   boolean removeTestConnectionListener(ITestConnectionListener listener) {
+      return testConnectionListeners.remove(listener);
+   }
+
+   void notifyPostConnection(final ConnectionEvent event) {
+      executor.submit(new Runnable() {
+
+         @Override
+         public void run() {
+            for (ITestConnectionListener listener : testConnectionListeners) {
+               try {
+                  listener.onPostConnect(event);
+               } catch (Throwable ex) {
+                  OseeLog.log(Activator.class, Level.SEVERE, "exception notifying listener of post connect event", ex);
+               }
+            }
+         }
+
+      });
+   }
+
+   void notifyDisconnect(final ConnectionEvent event) {
+      for (ITestConnectionListener listener : testConnectionListeners) {
+         try {
+            listener.onPreDisconnect(event);
+         } catch (Throwable ex) {
+            OseeLog.log(Activator.class, Level.SEVERE, "exception notifying listener of disconnect event", ex);
+         }
+      }
+   }
+
+   void notifyConnectionLost(final IServiceConnector connector) {
+      executor.submit(new Runnable() {
+
+         @Override
+         public void run() {
+            for (ITestConnectionListener listener : testConnectionListeners) {
+               try {
+                  listener.onConnectionLost(connector);
+               } catch (Throwable ex) {
+                  OseeLog.log(Activator.class, Level.SEVERE, "exception notifying listener of connection error event",
+                     ex);
+               }
+            }
+         }
+      });
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
new file mode 100644
index 0000000..176d3d3
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.net.InetAddress;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IConnectorListener;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.service.Activator;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.IEnvironmentConfigurer;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.service.ITestEnvironmentAvailibilityListener;
+import org.eclipse.osee.ote.service.OteServiceProperties;
+import org.eclipse.osee.ote.service.SessionDelegate;
+import org.eclipse.osee.ote.service.TestSessionException;
+
+public class TestClientServiceImpl implements IOteClientService, IConnectorListener {
+
+	private static final String NO_USER_MSG = "a user has not been set";
+	private final IConnectionService connectionService;
+	private final HashMap<String, IServiceConnector> testHosts = new HashMap<>();
+	private final ListenerNotifier listenerNotifier = new ListenerNotifier();
+	private final HashSet<ITestEnvironmentAvailibilityListener> hostAvailabilityListeners =
+			new HashSet<ITestEnvironmentAvailibilityListener>();
+	private ClientSession session = null;
+	private volatile boolean stopped = false;
+	private TestHostConnection testConnection;
+
+//	private final OteClientEndpointSend endpointSend;
+//	private final OteClientEndpointReceive endpointReceive;
+
+	public TestClientServiceImpl(IConnectionService connectionService) {
+		this.connectionService = connectionService;
+//		this.endpointReceive = endpointReceive;
+//		this.endpointSend = endpointSend;
+//		endpointSend.setTestClientService(this);
+	}
+
+	public void init() {
+		connectionService.addListener(this);
+	}
+
+	@Override
+	public void addEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener) {
+		checkState();
+		final Set<Entry<String, IServiceConnector>> entrySet;
+		synchronized (this) {
+			if (hostAvailabilityListeners.add(listener)) {
+				entrySet = new HashSet<>(testHosts.entrySet());
+			} else {
+				entrySet = Collections.emptySet();
+			}
+		}
+		for (Entry<String, IServiceConnector> entry : entrySet) {
+			listener.environmentAvailable(entry.getValue(),
+					new OteServiceProperties(entry.getValue()));
+		}
+	}
+
+	@Override
+	public  ConnectionEvent connect(IHostTestEnvironment testHost, IEnvironmentConfigurer configurer, TestEnvironmentConfig config, IProgressMonitor monitor) throws IllegalArgumentException, TestSessionException {
+		checkState();
+		final IServiceConnector connector;
+		final ClientSession localSession;
+		synchronized (this) {
+			if (session == null) {
+				throw new IllegalArgumentException("a user has not been set");
+			}
+			if (testConnection != null) {
+				throw new IllegalStateException("already connected");
+			}
+			if (testHost == null) {
+				throw new IllegalArgumentException("test host cannot be null");
+			}
+			connector = getConnector(testHost);
+			localSession = session;
+		}
+		try {
+			if (connector == null) {
+				throw new IllegalStateException("Unable to find a connection.");
+			}
+			if(configurer.configure(testHost, new SubProgressMonitor(monitor, 95)) && !monitor.isCanceled()){
+			   testConnection = localSession.connect(connector, testHost, config);
+			   if (testConnection != null) {
+			      // success
+			      ConnectionEvent event = new ConnectionEvent(testHost, connector, testConnection.getConnectEnvironment(), testConnection.getSessionKey());
+			      listenerNotifier.notifyPostConnection(event);
+			      return event;
+			   }
+			}
+		} catch (Exception e) {
+			Activator.log(Level.SEVERE, "failed to establish connection", e);
+			testConnection = null;
+		}
+		return null;
+	}
+
+	@Override
+	public synchronized IServiceConnector getConnector(IHostTestEnvironment host) {
+		try {
+			EnhancedProperties properties = host.getProperties();
+			if(properties != null){
+			   String passedInId = (String) properties.getProperty("id");
+			   for (IServiceConnector connector : testHosts.values()) {
+			      String loopId = (String) connector.getProperty("id", "no");
+			      if (passedInId != null && loopId != null && loopId.equals(passedInId)) {
+			         return connector;
+			      }
+			   }
+			}
+		} catch (RemoteException ex) {
+			ex.printStackTrace();
+		}
+		return null;
+	}
+
+	@Override
+	public void disconnect() throws TestSessionException {
+		checkState();
+		synchronized (this) {
+			if (session == null) {
+				throw new IllegalStateException(NO_USER_MSG);
+			}
+			if (testConnection == null) {
+				return;
+			}
+			Activator.log(Level.INFO,
+					"disconnecting from " + new OteServiceProperties(testConnection.getServiceConnector()).getStation());
+			ITestEnvironment envirnonment = testConnection.getConnectEnvironment();
+
+			if (!testConnection.getServiceConnector().ping()) {
+				listenerNotifier.notifyConnectionLost(testConnection.getServiceConnector());
+				testConnection = null;
+			} else {
+				ConnectionEvent event =
+						new ConnectionEvent(this.getConnectedHost(), testConnection.getConnectedTestHost(), envirnonment,
+								testConnection.getSessionKey());
+				listenerNotifier.notifyDisconnect(event);
+				try {
+					session.disconnect(testConnection);
+				} catch (Exception e) {
+					throw new TestSessionException("could not properly disconnect from test environment", e);
+				} finally {
+					testConnection = null;
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * stops this service
+	 */
+	public synchronized void stop() {
+		connectionService.removeListener(this);
+		if (session != null) {
+			try {
+				if (testConnection != null) {
+					disconnect();
+				}
+			} catch (Exception e) {
+				Activator.log(Level.SEVERE, "exception trying to disconnect during stop()", e);
+			} finally {
+				session.close();
+			}
+		}
+		stopped = true;
+		hostAvailabilityListeners.clear();
+	}
+
+	@Override
+	public void addConnectionListener(ITestConnectionListener listener) {
+		checkState();
+		if (listenerNotifier.addTestConnectionListener(listener)) {
+			if (session == null) {
+				return;
+			}
+			try {
+				final ConnectionEvent event;
+				// we want to avoid holding a lock when we call onPostConnect due to potential deadlock. so lets do what we can
+				// in a small synchronized block prior to calling onPostConnect
+				synchronized (this) {
+					// check to see if a connection already established
+					if (testConnection  != null) {
+						event = new ConnectionEvent(this.getConnectedHost(),
+								testConnection.getServiceConnector(), testConnection.getConnectEnvironment(),
+								testConnection.getSessionKey());
+					} else {
+						event = null;
+					}
+				}
+				if (event != null) {
+					listener.onPostConnect(event);
+				}
+			} catch (Exception e) {
+				Activator.log(Level.SEVERE, "Exception notifying listener of connection event", e);
+			}
+		}
+	}
+
+	@Override
+	public void removeConnectionListener(ITestConnectionListener listener) {
+		listenerNotifier.removeTestConnectionListener(listener);
+	}
+
+	@Override
+	public synchronized void removeEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener) {
+		checkState();
+		hostAvailabilityListeners.remove(listener);
+	}
+
+	private void checkState() {
+		if (stopped) {
+			throw new IllegalStateException("service stopped");
+		}
+	}
+
+	@Override
+	public synchronized void setUser(OSEEPerson1_4 user, InetAddress address) throws TestSessionException {
+		checkState();
+		if (testConnection != null) {
+			disconnect();
+		}
+		if (session != null) {
+			session.close();
+		}
+		session = new ClientSession(user, address);
+	}
+
+	@Override
+	public synchronized OSEEPerson1_4 getUser() {
+		if (session != null) {
+			return session.getUser();
+		}
+		return null;
+	}
+
+	@Override
+	public synchronized UUID getSessionKey() {
+		return testConnection != null ? testConnection.getSessionKey() : null;
+
+	}
+
+	@Override
+	public synchronized void setSessionDelegate(SessionDelegate sessionDelegate) {
+		checkState();
+		if (session == null) {
+			throw new IllegalStateException(NO_USER_MSG);
+		}
+		session.setSessionDelegate(sessionDelegate);
+	}
+
+
+	private void notifyHostAvailable(IServiceConnector connector, OteServiceProperties props) {
+		for (ITestEnvironmentAvailibilityListener listener : hostAvailabilityListeners) {
+			listener.environmentAvailable(connector, props);
+		}
+	}
+
+	private void notifyHostUnavailable(IServiceConnector connector, OteServiceProperties props) {
+		for (ITestEnvironmentAvailibilityListener listener : hostAvailabilityListeners) {
+			try {
+				listener.environmentUnavailable(connector, props);
+			} catch (Exception e) {
+				Activator.log(Level.SEVERE, "exception in listener during host unavailable event notification", e);
+			}
+		}
+	}
+
+	@Override
+	public synchronized ITestEnvironment getConnectedEnvironment() throws IllegalStateException {
+		checkState();
+		return testConnection == null ? null : testConnection.getConnectEnvironment();
+	}
+
+	@Override
+	public synchronized IHostTestEnvironment getConnectedHost() throws IllegalStateException {
+		checkState();
+		return testConnection == null ? null : (IHostTestEnvironment) testConnection.getConnectedTestHost().getService();
+
+	}
+
+	@Override
+	public synchronized IServiceConnector getConnector() {
+		checkState();
+		return testConnection == null ? null : testConnection.getServiceConnector();
+	}
+
+	@Override
+	public synchronized List<IServiceConnector> getAvailableTestHosts() {
+		List<IServiceConnector> envs = new ArrayList<>();
+		for (IServiceConnector conn : testHosts.values()) {
+			envs.add(conn);
+		}
+		return envs;
+	}
+
+	@Override
+	public synchronized boolean isConnected() {
+		return testConnection != null;
+	}
+
+	@Override
+	public OteServiceProperties getProperties(IHostTestEnvironment testHost) {
+
+		IServiceConnector connector = getConnector(testHost);
+		if (connector != null) {
+			return new OteServiceProperties(connector);
+		}
+		try {
+			return new OteServiceProperties(testHost.getProperties());
+		} catch (RemoteException ex) {
+			return null;
+		}
+	}
+
+	@Override
+	public void onConnectionServiceStopped() {
+	}
+
+	@Override
+	public synchronized void onConnectorsAdded(Collection<IServiceConnector> connectors) {
+		for (IServiceConnector connector : connectors) {
+			OteServiceProperties props = new OteServiceProperties(connector);
+			props.printStats();
+			testHosts.put(connector.getUniqueServerId(), connector);
+			notifyHostAvailable(connector, props);
+		}
+	}
+
+	@Override
+	public synchronized void onConnectorRemoved(IServiceConnector connector) {
+		String id = connector.getUniqueServerId();
+		testHosts.remove(id);
+		notifyHostUnavailable(connector, new OteServiceProperties(connector));
+		IHostTestEnvironment connectedHost = getConnectedHost();
+		if (testConnection != null && testConnection.getId().equals(id)) {
+			testConnection = null;
+			listenerNotifier.notifyConnectionLost(connector);
+			OteUdpEndpoint endpoint = ServiceUtility.getService(OteUdpEndpoint.class);
+			if(endpoint != null){
+			   endpoint.removeBroadcast(null);
+			}
+		}
+	}
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java
new file mode 100644
index 0000000..6680b6b
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.rmi.RemoteException;
+import java.util.UUID;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * Encapsulated all information regarding the current connection between a client and a test server.
+ * 
+ * @author Ken J. Aguilar
+ */
+class TestHostConnection {
+   // intentionally package-private
+
+   private final IServiceConnector serviceConnector;
+   private final ITestEnvironment connectEnvironment;
+   private final UUID sessionKey;
+   private final IHostTestEnvironment host;
+   private String serverId;
+
+   TestHostConnection(IServiceConnector connector, IHostTestEnvironment host, ITestEnvironment connectEnvironment, UUID uuid) {
+      // intentionally package-private
+      if (connector == null) {
+         throw new NullPointerException("service connector cannot be null");
+      }
+      if (connectEnvironment == null) {
+         throw new NullPointerException("test environment cannot be null");
+      }
+      if (uuid == null) {
+         throw new NullPointerException("session key cannot be null");
+      }
+      this.serviceConnector = connector;
+      this.host = host;
+      this.connectEnvironment = connectEnvironment;
+      this.sessionKey = uuid;
+      try {
+		this.serverId = (String) host.getProperties().getProperty("id");
+      } catch (RemoteException e) {
+    	  this.serverId = "";
+      }
+   }
+
+   /**
+    * @return the connectedTestHost
+    */
+   public IServiceConnector getConnectedTestHost() {
+      return serviceConnector;
+   }
+
+   /**
+    * @return the connectEnvironment
+    */
+   public ITestEnvironment getConnectEnvironment() {
+      return connectEnvironment;
+   }
+
+   /**
+    * @return the sessionKey
+    */
+   public UUID getSessionKey() {
+      return sessionKey;
+   }
+
+   /**
+    * @return the serviceConnector
+    */
+   public IServiceConnector getServiceConnector() {
+      return serviceConnector;
+   }
+
+   public String getId(){
+	   return serverId;
+   }
+   
+   void endConnection() throws RemoteException {
+      // intentionally package-private
+
+      host.disconnect(sessionKey);
+   }
+}
diff --git a/org.eclipse.osee.ote.connection.jini/.classpath b/org.eclipse.osee.ote.connection.jini/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.connection.jini/.pmd b/org.eclipse.osee.ote.connection.jini/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>WhileLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfElseStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanReturns</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanExpressions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchStmtsShouldHaveDefault</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDeeplyNestedIfStmts</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidReassigningParameters</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchDensity</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConstructorCallsOverridableMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AccessorClassGeneration</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalFieldCouldBeStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloseResource</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonStaticInitializer</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultLabelNotLastInSwitchStmt</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonCaseLabelInSwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OptimizableToArrayCall</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BadComparison</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EqualsNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConfusingTernary</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InstantiationToGetClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IdempotentOperations</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimpleDateFormatNeedsLocale</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImmutableField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseLocaleWithCaseConversions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidProtectedFieldInFinalClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentToNonFinalStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingStaticMethodInNonInstantiatableClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidSynchronizedAtMethodLevel</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingBreakInSwitch</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseNotifyAllInsteadOfNotify</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstanceofChecksInCatchClause</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAbstractMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyConditional</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CompareObjectsWithEquals</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PositionLiteralsFirstInComparisons</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryLocalBeforeReturn</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonThreadSafeSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyConstructor</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidConstantsInterface</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnsynchronizedStaticDateFormatter</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PreserveStackTrace</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCollectionIsEmpty</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SingularField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnEmptyArrayRatherThanNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAnyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooFewBranchesForASwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingThrowable</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExceptionAsFlowControl</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingNPE</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingRawExceptionTypes</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNullPointerException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidRethrowingException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotExtendJavaLangError</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotThrowExceptionInFinally</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNewInstanceOfSameException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateField</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedLocalVariable</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateMethod</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedFormalParameter</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MoreThanOneLogger</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LoggerIsNotStaticFinal</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SystemPrintln</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidPrintStackTrace</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDuplicateLiterals</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringInstantiation</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringToString</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientStringBuffering</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryCaseChange</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferLength</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AppendCharacterWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConsecutiveLiteralAppends</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseIndexOfChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientEmptyStringCheck</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InsufficientStringBufferDeclaration</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessStringValueOf</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringBufferInstantiationWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseEqualsToCompareStrings</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidStringBufferField</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceVectorWithList</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceHashtableWithMap</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceEnumerationWithIterator</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidEnumAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAssertAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IntegerInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ByteInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LongInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseBeforeAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseAfterAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseTestAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitUseExpected</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseProperClassLoader</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MDBAndSessionBeanNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteSessionInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalInterfaceSessionNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalHomeNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallSystemExit</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StaticEJBFieldShouldBeFinal</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotUseThreads</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstantiatingObjectsInLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArrayListInsteadOfVector</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyStartsWith</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferForStringAppends</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArraysAsList</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidArrayLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryWrapperObjectCreation</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AddEmptyString</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyCatchBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyIfStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyWhileStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyTryBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySwitchStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JumbledIncrementer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopShouldBeWhileLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConversionTemporary</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OverrideBothEqualsAndHashcode</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoubleCheckedLocking</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnFromFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySynchronizedBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryReturn</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStaticInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnconditionalIfStatement</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStatementNotInLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryFinalModifier</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CollapsibleIfStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOverridingMethod</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassCastExceptionWithToArray</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOperationOnImmutable</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisplacedNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedNullCheckInEquals</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThreadGroup</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BrokenNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BigIntegerInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingOctalValues</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingHardCodedIP</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CheckResultSet</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidMultipleUnaryOperators</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodReturnsInternalArray</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>ArrayIsStoredDirectly</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>CouplingBetweenObjects</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveImports</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DuplicateImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportJavaLang</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImportFromSamePackage</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyStaticImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitStaticSuite</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitSpelling</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitAssertionsShouldIncludeMessage</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitTestsShouldIncludeAssert</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TestClassWithoutTestCases</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertEqualsInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertSameInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertNullInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NullAssignment</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedModifier</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentInOperand</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AtLeastOneConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportSun</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousOctalEscape</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CallSuperInConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryParentheses</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultPackage</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInversion</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DataflowAnomalyAnalysis</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFinalLocalVariable</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingShortType</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingVolatile</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingNativeCode</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAccessibilityAlteration</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallGarbageCollectionExplicitly</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractNaming</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDollarSigns</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodWithSameNameAsEnclosingClass</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousHashcodeMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousConstantFieldName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousEqualsMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingTypeName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NoPackage</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PackageCase</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisleadingVariableName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanGetMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NPathComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveMethodLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveParameterList</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveClassLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CyclomaticComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessivePublicCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyFields</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssMethodCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssTypeCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssConstructorCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyMethods</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinalizer</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOnlyCallsSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOverloaded</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeDoesNotCallSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeShouldBeProtected</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCallingFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCorrectExceptionLogging</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperLogger</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingSerialVersionUID</name>
+            <ruleset>JavaBean Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperCloneImplementation</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneThrowsCloneNotSupportedException</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+    </rules>
+    <includeDerivedFiles>false</includeDerivedFiles>
+    <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.connection.jini/.project b/org.eclipse.osee.ote.connection.jini/.project
new file mode 100644
index 0000000..42f4d65
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.connection.jini</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.connection.jini/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.connection.jini/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7933715
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: JINI Connector provider (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.connection.jini;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.connection.jini.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jini,
+ net.jini,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.logging
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.network
+Export-Package: org.eclipse.osee.ote.connection.jini
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.ote.connection.jini/build.properties b/org.eclipse.osee.ote.connection.jini/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.osee.ote.connection.jini/plugin.xml b/org.eclipse.osee.ote.connection.jini/plugin.xml
new file mode 100644
index 0000000..9523eb4
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension
+         point="org.eclipse.osee.connection.service.ext">
+      <ConnectorContribution
+            className="org.eclipse.osee.ote.connection.jini.ConnectorContribution">
+      </ConnectorContribution>
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.connection.jini/pom.xml b/org.eclipse.osee.ote.connection.jini/pom.xml
new file mode 100644
index 0000000..4b5e4cc
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/pom.xml
@@ -0,0 +1,35 @@
+<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">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.eclipse.osee</groupId>
+		<artifactId>org.eclipse.osee.ote.parent</artifactId>
+		<version>0.25.3-SNAPSHOT</version>
+		<relativePath>../org.eclipse.osee.ote.parent</relativePath>
+	</parent>
+	
+	<artifactId>org.eclipse.osee.ote.connection.jini</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Connection JINI (Incubation)</name>
+
+   <build>
+     <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+     <resources>
+      <resource>
+        <directory>src</directory>
+        <excludes>
+          <exclude>**/*.java</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-source-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+  
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.java
new file mode 100644
index 0000000..d73c094
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+   // The plug-in ID
+   public static final String PLUGIN_ID = "org.eclipse.osee.ote.connection.jini";
+
+   // The shared instance
+   private static Activator plugin;
+
+
+   private ExportClassLoader exportClassLoader;
+
+   /**
+    * The constructor
+    */
+   public Activator() {
+   }
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      super.start(context);
+      plugin = this;
+
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      super.stop(context);
+      exportClassLoader = null;
+      plugin = null;
+   }
+
+   /**
+    * Returns the shared instance
+    * 
+    * @return the shared instance
+    */
+   public static Activator getDefault() {
+      return plugin;
+   }
+
+   ClassLoader getExportClassLoader() {
+      return exportClassLoader;
+   }
+
+   public static void log(Level level, String message, Throwable t) {
+      OseeLog.log(Activator.class, level, message, t);
+   }
+
+   public static void log(Level level, String message) {
+      log(level, message, null);
+   }
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java
new file mode 100644
index 0000000..17d6fe9
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import org.eclipse.osee.connection.service.IConnectorContributor;
+
+public class ConnectorContribution implements IConnectorContributor {
+
+   public ConnectorContribution() {
+   }
+
+   @Override
+   public void init() throws Exception {
+   }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorLink.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorLink.java
new file mode 100644
index 0000000..bd858a8
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorLink.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IJiniConnectorLink extends Remote {
+   boolean ping() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.java
new file mode 100644
index 0000000..b241869
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import net.jini.core.discovery.LookupLocator;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IJiniConnectorRegistrar {
+   void addLocators(String... hosts) throws MalformedURLException, ClassNotFoundException, IOException;
+
+   LookupLocator[] getLocators();
+
+   void addGroup(String... groups) throws IOException;
+
+   String[] getGroups();
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java
new file mode 100644
index 0000000..10ff1b6
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.File;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import net.jini.core.lookup.ServiceItem;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class JiniClientSideConnector extends JiniConnector {
+   public static final String TYPE = "jini.client-end";
+   private final ServiceItem serviceItem;
+   private final IJiniConnectorLink link;
+
+   JiniClientSideConnector(ServiceItem serviceItem) {
+      super();
+      this.serviceItem = serviceItem;
+      link = (IJiniConnectorLink) getProperties().getProperty(LINK_PROPERTY);
+   }
+
+   @Override
+   public Object getService() {
+      return serviceItem.service;
+   }
+
+   @Override
+   public String getConnectorType() {
+      return TYPE;
+   }
+
+   @Override
+   public URI upload(File file) throws Exception {
+      return null;
+   }
+
+   @Override
+   public boolean ping() {
+      try {
+         return link.ping();
+      } catch (RemoteException e) {
+         return false;
+      }
+   }
+
+   @Override
+   public void init(Object service) throws UnknownHostException, ExportException {
+
+   }
+
+   @Override
+   public String getUniqueServerId() {
+      return serviceItem.serviceID.toString();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java
new file mode 100644
index 0000000..276d77e
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.Serializable;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.server.ExportException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import net.jini.core.entry.Entry;
+import net.jini.export.Exporter;
+import net.jini.jeri.BasicILFactory;
+import net.jini.jeri.BasicJeriExporter;
+import net.jini.jeri.tcp.TcpServerEndpoint;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.connection.service.IServicePropertyChangeListener;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class JiniConnector implements IServiceConnector {
+   protected final static String LINK_PROPERTY = "JINI_CONNECTOR_LINK";
+   private final HashMap<Object, ExportInfo> exports = new HashMap<>();
+   private final EnhancedProperties properties;
+   private final HashSet<IServicePropertyChangeListener> propertyChangeListeners =
+      new HashSet<IServicePropertyChangeListener>();
+   private boolean connected = false;
+
+   private static final class ExportInfo {
+      private final Exporter exporter;
+      private final Object exportedObject;
+
+      private ExportInfo(Exporter exporter, Object exportedObject) {
+         this.exportedObject = exportedObject;
+         this.exporter = exporter;
+      }
+   }
+
+   protected JiniConnector() {
+      this(new EnhancedProperties());
+   }
+
+   protected JiniConnector(EnhancedProperties properties) {
+      this.properties = properties;
+   }
+
+   @Override
+   public Object export(Object callback) throws ExportException {
+      try {
+         Exporter exporter = createExporter();
+         Object exportedObject = exporter.export((Remote) callback);
+         exports.put(callback, new ExportInfo(exporter, exportedObject));
+         return exportedObject;
+      } catch (UnknownHostException e) {
+         throw new ExportException("failed to export", e);
+      }
+   }
+
+   @Override
+   public void unexport(Object callback) throws Exception {
+      ExportInfo info = exports.remove(callback);
+      if (info != null) {
+         info.exporter.unexport(false);
+      }
+   }
+
+   @Override
+   public Object findExport(Object callback) {
+      ExportInfo info = exports.get(callback);
+      if (info != null) {
+         return info.exportedObject;
+      }
+      return null;
+   }
+
+   @Override
+   public void stop() throws Exception {
+      for (ExportInfo info : exports.values()) {
+         info.exporter.unexport(false);
+      }
+      exports.clear();
+   }
+
+   private Exporter createExporter() throws UnknownHostException {
+      return new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+         new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+   }
+
+   protected Entry[] createEntries() {
+      LinkedList<Entry> entries = new LinkedList<>();
+      return entries.toArray(new Entry[entries.size()]);
+   }
+
+   @Override
+   public Serializable getProperty(String property, Serializable defaultValue) {
+      return properties.getProperty(property, defaultValue);
+   }
+
+   @Override
+   public void addPropertyChangeListener(IServicePropertyChangeListener listener) {
+      propertyChangeListeners.add(listener);
+   }
+
+   @Override
+   public void removePropertyChangeListener(IServicePropertyChangeListener listener) {
+      propertyChangeListeners.remove(listener);
+   }
+
+   @Override
+   public void setProperty(String key, Serializable value) {
+      properties.setProperty(key, value);
+      for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+         listener.propertyChanged(this, key, value);
+      }
+   }
+
+   @Override
+   public EnhancedProperties getProperties() {
+      return properties;
+   }
+
+   public void entriesChanged(Entry[] entries) {
+      EnhancedProperties newProps = new EnhancedProperties();
+      for (String key : properties.differences(newProps)) {
+         for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+            listener.propertyChanged(this, key, properties.getProperty(key));
+         }
+      }
+   }
+   
+   public void setConnected(boolean connected){
+      this.connected = connected;
+   }
+   
+   public boolean isConnected() {
+      return this.connected;
+   }
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java
new file mode 100644
index 0000000..22d9dd9
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.server.ExportException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Timer;
+import java.util.logging.Level;
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceItem;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceRegistration;
+import net.jini.id.Uuid;
+import net.jini.id.UuidFactory;
+import net.jini.jeri.BasicILFactory;
+import net.jini.jeri.BasicJeriExporter;
+import net.jini.jeri.tcp.TcpServerEndpoint;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+import org.eclipse.osee.ote.connection.jini.util.LeaseRenewTask;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class JiniServiceSideConnector extends JiniConnector implements IJiniConnectorLink {
+   public static final String TYPE = "jini.service-end";
+   private final HashMap<ServiceRegistration, LeaseRenewTask> registrations =
+      new HashMap<ServiceRegistration, LeaseRenewTask>();
+   private Remote service;
+   private Remote serviceProxy;
+   private BasicJeriExporter serviceExporter;
+   private ServiceID serviceId;
+   private final Timer timer = new Timer();
+   private ServiceItem serviceItem;
+   private BasicJeriExporter linkExporter;
+   private IJiniConnectorLink exportedThis;
+   private boolean stopped = false;
+
+   public JiniServiceSideConnector() {
+      super();
+   }
+
+   @Override
+   public void init(Object service) throws UnknownHostException, ExportException {
+
+      this.service = (Remote) service;
+      serviceId = generateServiceId();
+      serviceExporter =
+         new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+            new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+      linkExporter =
+         new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+            new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+      serviceProxy = serviceExporter.export(this.service);
+      exportedThis = (IJiniConnectorLink) linkExporter.export(this);
+      setProperty(LINK_PROPERTY, (Serializable) exportedThis);
+      serviceItem = new ServiceItem(serviceId, serviceProxy, createEntries());
+   }
+
+   public JiniServiceSideConnector(Remote service, EnhancedProperties props) throws UnknownHostException, ExportException {
+      super(props);
+      this.service = service;
+      serviceId = generateServiceId();
+      serviceExporter =
+         new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+            new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+      linkExporter =
+         new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+            new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+      serviceProxy = serviceExporter.export(service);
+      exportedThis = (IJiniConnectorLink) linkExporter.export(this);
+      props.setProperty(LINK_PROPERTY, (Serializable) exportedThis);
+      serviceItem = new ServiceItem(serviceId, serviceProxy, createEntries());
+   }
+
+   @Override
+   public Remote getService() {
+      return serviceProxy;
+   }
+
+   @Override
+   public synchronized void stop() throws Exception {
+      if (stopped) {
+         return;
+      }
+      stopped = true;
+      super.stop();
+      removeAllRegistrations();
+      serviceExporter.unexport(true);
+      linkExporter.unexport(true);
+   }
+
+   /**
+    * this method will cancel all current registrations of this connector
+    */
+   synchronized void removeAllRegistrations() {
+      for (ServiceRegistration registration : registrations.keySet()) {
+         try {
+            LeaseRenewTask task = registrations.get(registration);
+            if (task != null) {
+               task.cancel();
+            }
+         } catch (Exception e) {
+            Activator.log(Level.SEVERE, "exception removing registration", e);
+         }
+      }
+      registrations.clear();
+   }
+
+   private ServiceID generateServiceId() {
+      Uuid uuid = UuidFactory.generate();
+      Long lsb = new Long(uuid.getLeastSignificantBits());
+      Long msb = new Long(uuid.getMostSignificantBits());
+      return new ServiceID(msb.longValue(), lsb.longValue());
+   }
+
+   synchronized void addRegistration(ServiceRegistration registration, ServiceRegistrar registrar) {
+      registrations.put(registration, new LeaseRenewTask(timer, registration, registrar));
+   }
+
+   ServiceItem getServiceItem() {
+      return serviceItem;
+   }
+
+   private synchronized void setAttributes(Entry[] entry) {
+      Iterator<ServiceRegistration> iter = registrations.keySet().iterator();
+      while (iter.hasNext()) {
+         ServiceRegistration registration = iter.next();
+         try {
+            registration.setAttributes(entry);
+         } catch (Exception ex) {
+            Activator.log(Level.SEVERE, "exception setting attributes", ex);
+            registrations.remove(registration);
+         }
+      }
+   }
+
+   @Override
+   public String getConnectorType() {
+      return TYPE;
+   }
+
+   @Override
+   public void setProperty(String key, Serializable value) {
+      super.setProperty(key, value);
+      setAttributes(createEntries());
+   }
+
+   @Override
+   public URI upload(File file) throws Exception {
+      return null;
+   }
+
+   @Override
+   public boolean ping() {
+      return true;
+   }
+
+   @Override
+   public String getUniqueServerId() {
+      return serviceId.toString();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java
new file mode 100644
index 0000000..4bcc3f6
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import net.jini.entry.AbstractEntry;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class TestEntry extends AbstractEntry {
+   private static final long serialVersionUID = -2239353039479522642L;
+   public final String data;
+
+   public TestEntry() {
+      data = "<none>";
+   }
+
+   public TestEntry(String data) {
+      super();
+      this.data = data;
+   }
+
+   /**
+    * @return the data
+    */
+   public String getData() {
+      return data;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java
new file mode 100644
index 0000000..49feede
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini.util;
+
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+import net.jini.core.lease.Lease;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceRegistration;
+import org.eclipse.osee.ote.connection.jini.Activator;
+
+public class LeaseRenewTask extends TimerTask {
+   /**
+    * The amount of time before a lease expires to first attempt renewal. This amount of time should be sufficiently
+    * large to account for delays in communication (i.e. network delays), and allow for at least a few retries in the
+    * event the service is not reachable. This time is specified in milliseconds.
+    */
+   private static final long RENEWAL_TIME = 1 * 60 * 1000; // 1 minute
+
+   private final ServiceRegistration registration;
+   private volatile boolean canceled = false;
+   private final ServiceRegistrar registrar;
+
+   public LeaseRenewTask(Timer timer, ServiceRegistration registration, ServiceRegistrar registrar) {
+      this.registration = registration;
+      timer.scheduleAtFixedRate(this, 0, RENEWAL_TIME);
+      this.registrar = registrar;
+   }
+
+   @Override
+   public void run() {
+      if (canceled) {
+         return;
+      }
+      try {
+         // Renew for the maximum amount of time allowed
+         registration.getLease().renew(Lease.FOREVER);
+      } catch (Throwable ex) {
+         handleLeaseRenewException(ex);
+         try {
+            registration.getLease().renew(Lease.FOREVER);
+         } catch (Throwable ex1) {
+            handleLeaseRenewException(ex1);
+         }
+      }
+   }
+
+   private void handleLeaseRenewException(Throwable th) {
+      String host = "unknown";
+      int port = 0;
+      try {
+         host = registrar.getLocator().getHost();
+         port = registrar.getLocator().getPort();
+      } catch (Throwable th2) {
+         th2.printStackTrace();
+      }
+      System.out.printf("lookup serviceId[%s] host[%s] port[%d]\n", registrar.getServiceID().toString(), host, port);
+      Activator.log(Level.SEVERE, "error renewing lease", th);
+   }
+
+   @Override
+   public boolean cancel() {
+      canceled = true;
+      boolean result = super.cancel();
+      try {
+         System.out.println("Canceling lookup lease");
+         registration.getLease().cancel();
+      } catch (Exception ex) {
+         throw new RuntimeException("failed to cancel lease", ex);
+      }
+      return result;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.connection.service.test/.classpath b/org.eclipse.osee.ote.connection.service.test/.classpath
new file mode 100644
index 0000000..751c8f2
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.connection.service.test/.pmd b/org.eclipse.osee.ote.connection.service.test/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>