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>
+            <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.service.test/.project b/org.eclipse.osee.ote.connection.service.test/.project
new file mode 100644
index 0000000..6f398b2
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.connection.service.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.ote.connection.service.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.connection.service.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f2b7516
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.connection.service.test;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.connection.service.test.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.connection.service,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Require-Bundle: net.jini,
+ org.eclipse.osee.ote.connection.jini,
+ org.eclipse.osee.framework.jdk.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.ote.connection.service.test/build.properties b/org.eclipse.osee.ote.connection.service.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.connection.service.test/pom.xml b/org.eclipse.osee.ote.connection.service.test/pom.xml
new file mode 100644
index 0000000..340a609
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/pom.xml
@@ -0,0 +1,31 @@
+<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.service.test</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Connection Service Test (Incubation)</name>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<testSuite>org.eclipse.osee.ote.connection.service.test</testSuite>
+					<testClass>org.eclipse.osee.ote.connection.service.test.TestJiniService</testClass>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.java b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.java
new file mode 100644
index 0000000..98eb834
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.service.test;
+
+import java.rmi.Remote;
+import java.util.Collection;
+import java.util.Timer;
+import java.util.TimerTask;
+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.connection.jini.JiniServiceSideConnector;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+   private ServiceTracker connectionServiceTracker;
+   private static Activator instance = null;
+   private JiniServiceSideConnector testConnector;
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      instance = this;
+      connectionServiceTracker = new ServiceTracker(context, IConnectionService.class.getName(), null);
+      connectionServiceTracker.open();
+      final IConnectionService service = getConnectionService();
+      EnhancedProperties properties = new EnhancedProperties();
+      properties.setProperty("name", "Dummy Test Service");
+      testConnector = new JiniServiceSideConnector(new TestJiniService(), properties);
+      service.addConnector(testConnector);
+
+      service.addListener(new IConnectorListener() {
+
+         @Override
+         public void onConnectionServiceStopped() {
+         }
+
+         @Override
+         public void onConnectorsAdded(Collection<IServiceConnector> connectors) {
+            for (IServiceConnector connector : connectors) {
+               if (connector.getService() instanceof Remote) {
+                  System.out.printf("found remote service %s. connector type=%s\n",
+                     connector.getProperty("name", "N.A."), connector.getConnectorType());
+               } else {
+                  System.out.println("found a non-remote service!?. connector type=" + connector.getConnectorType());
+               }
+            }
+         }
+
+         @Override
+         public void onConnectorRemoved(IServiceConnector connector) {
+         }
+
+      });
+
+      final Timer timer = new Timer();
+      timer.schedule(new TimerTask() {
+
+         @Override
+         public void run() {
+            System.out.println("connectors:");
+            for (IServiceConnector connector : service.getAllConnectors()) {
+               System.out.printf("\ttype=%s\n", connector.getConnectorType());
+            }
+            timer.cancel();
+         }
+
+      }, 10000);
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      instance = null;
+      getConnectionService().removeConnector(testConnector);
+      connectionServiceTracker.close();
+   }
+
+   public Activator getDefault() {
+      return instance;
+   }
+
+   public IConnectionService getConnectionService() {
+      return (IConnectionService) connectionServiceTracker.getService();
+   }
+}
diff --git a/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/TestJiniService.java b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/TestJiniService.java
new file mode 100644
index 0000000..9739a2f
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/TestJiniService.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.service.test;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class TestJiniService implements Remote {
+
+   public void doSomething() throws RemoteException {
+      System.out.println("doing something...");
+   }
+}
diff --git a/org.eclipse.osee.ote.connection.service/.classpath b/org.eclipse.osee.ote.connection.service/.classpath
new file mode 100644
index 0000000..751c8f2
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/.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/.pmd b/org.eclipse.osee.ote.connection.service/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/.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.service/.project b/org.eclipse.osee.ote.connection.service/.project
new file mode 100644
index 0000000..dd83e6a
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.connection.service</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.service/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7f5f5ff
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Service Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.connection.service;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.connection.service.internal.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.connection.service
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.ote.connection.service/build.properties b/org.eclipse.osee.ote.connection.service/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.osee.ote.connection.service/plugin.xml b/org.eclipse.osee.ote.connection.service/plugin.xml
new file mode 100644
index 0000000..a652d47
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/plugin.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension-point id="org.eclipse.osee.connection.service.ext" name="Connection Service Extension" schema="schema/org.eclipse.osee.connection.service.ext.exsd"/>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.connection.service/pom.xml b/org.eclipse.osee.ote.connection.service/pom.xml
new file mode 100644
index 0000000..541b996
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/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.service</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Connection Service (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.service/schema/org.eclipse.osee.connection.service.ext.exsd b/org.eclipse.osee.ote.connection.service/schema/org.eclipse.osee.connection.service.ext.exsd
new file mode 100644
index 0000000..73f5056
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/schema/org.eclipse.osee.connection.service.ext.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.connection.service" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.osee.ote.connection.service" id="org.eclipse.osee.connection.service.ext" name="Connection Service Extension"/>
+      </appinfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="ConnectorContribution"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="ConnectorContribution">
+      <complexType>
+         <attribute name="className" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.osee.connection.service.IConnectorContributor"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="implementation"/>
+      </appinfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java
new file mode 100644
index 0000000..310b8da
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.connection.service;
+
+import java.util.Collection;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IConnectionService {
+
+   /**
+    * finds all currently existing connectors
+    */
+   Collection<IServiceConnector> getAllConnectors();
+
+   /**
+    * finds all available connectors that are accepted by all filters in the filter chain
+    */
+   Collection<IServiceConnector> findConnectors(IConnectorFilter[] filterChain);
+
+   /**
+    * registers an listener object for notification of connector events. Note that the listener object's
+    * {@link IConnectorListener#onConnectorsAdded(Collection)} will be called immediately for each active connector.
+    */
+   void addListener(IConnectorListener listener);
+
+   void removeListener(IConnectorListener listener);
+
+   void addConnector(IServiceConnector connector);
+
+   void addConnectors(Collection<IServiceConnector> connectors);
+
+   void removeConnector(IServiceConnector connector) throws Exception;
+
+   boolean isStopped();
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorContributor.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorContributor.java
new file mode 100644
index 0000000..32d2f63
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorContributor.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * 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.connection.service;
+
+public interface IConnectorContributor {
+
+   void init() throws Exception;
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorFilter.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorFilter.java
new file mode 100644
index 0000000..bab00bb
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorFilter.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.connection.service;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IConnectorFilter {
+   public boolean accept(IServiceConnector connector);
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorListener.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorListener.java
new file mode 100644
index 0000000..8b4c185
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorListener.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.connection.service;
+
+import java.util.Collection;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IConnectorListener {
+
+   void onConnectorsAdded(Collection<IServiceConnector> connectors);
+
+   void onConnectorRemoved(IServiceConnector connector);
+
+   /**
+    * this method will be called when the connect service has been commanded to stop but before it is actually stopped.
+    * this gives clients a chance to cleanup however, clients should not call any methods on the service.
+    */
+   void onConnectionServiceStopped();
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.java
new file mode 100644
index 0000000..0d2d5a8
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.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.connection.service;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IFileKey {
+
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java
new file mode 100644
index 0000000..f74ab3b
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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.connection.service;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.server.ExportException;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+
+/**
+ * Provides a communication pipe to a service.
+ * 
+ * @author Ken J. Aguilar
+ */
+public interface IServiceConnector {
+
+   String getConnectorType();
+
+   /**
+    * gets the service provided by this connector
+    */
+   Object getService();
+
+   void setProperty(String key, Serializable value);
+
+   Serializable getProperty(String property, Serializable defaultValue);
+
+   void stop() throws Exception;
+
+   /**
+    * makes the callback accessible by this connector's service
+    */
+   Object export(Object callback) throws ExportException;
+
+   void init(Object service) throws UnknownHostException, ExportException;
+
+   /**
+    * finds the matching exported representation of supplied object
+    */
+   Object findExport(Object callback);
+
+   void unexport(Object callback) throws Exception;
+
+   void addPropertyChangeListener(IServicePropertyChangeListener listener);
+
+   void removePropertyChangeListener(IServicePropertyChangeListener listener);
+
+   /**
+    * uploads a file to a service and creates an {@link URI} that the service can access.
+    */
+   URI upload(File file) throws Exception;
+
+   boolean ping();
+
+   EnhancedProperties getProperties();
+
+   public String getUniqueServerId();
+
+   void setConnected(boolean b);
+   boolean isConnected();
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServicePropertyChangeListener.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServicePropertyChangeListener.java
new file mode 100644
index 0000000..7200b1b
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServicePropertyChangeListener.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.connection.service;
+
+import java.io.Serializable;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IServicePropertyChangeListener {
+   void propertyChanged(IServiceConnector connector, String key, Serializable value);
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.java
new file mode 100644
index 0000000..bf81d7f
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * 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.connection.service;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.rmi.server.ExportException;
+import java.util.HashSet;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class LocalConnector implements IServiceConnector {
+   public static final String TYPE = "local";
+   private Object service;
+   private final EnhancedProperties properties;
+   private String id;
+
+   private final HashSet<IServicePropertyChangeListener> propertyChangeListeners =
+      new HashSet<IServicePropertyChangeListener>();
+   private boolean connected = false;
+
+   public LocalConnector() {
+      this(null, "", new EnhancedProperties());
+   }
+
+   @Override
+   public void init(Object service) {
+      this.service = service;
+   }
+
+   public LocalConnector(Object service, String id, EnhancedProperties properties) {
+      this.service = service;
+      this.properties = properties;
+   }
+
+   @Override
+   public Object getService() {
+      return service;
+   }
+
+   @Override
+   public void stop() {
+   }
+
+   @Override
+   public String getConnectorType() {
+      return TYPE;
+   }
+
+   @Override
+   public void setProperty(String key, Serializable value) {
+      properties.setProperty(key, value);
+      for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+         listener.propertyChanged(this, key, value);
+      }
+
+   }
+
+   @Override
+   public Serializable getProperty(String property, Serializable defaultValue) {
+      return properties.getProperty(property, defaultValue);
+   }
+
+   @Override
+   public Object export(Object callback) throws ExportException {
+      return callback;
+   }
+
+   @Override
+   public void unexport(Object callback) throws Exception {
+   }
+
+   @Override
+   public Object findExport(Object callback) {
+      return callback;
+   }
+
+   @Override
+   public void addPropertyChangeListener(IServicePropertyChangeListener listener) {
+      propertyChangeListeners.add(listener);
+   }
+
+   @Override
+   public void removePropertyChangeListener(IServicePropertyChangeListener listener) {
+      propertyChangeListeners.remove(listener);
+   }
+
+   @Override
+   public URI upload(File file) throws Exception {
+      return file.toURI();
+   }
+
+   @Override
+   public boolean ping() {
+      return true;
+   }
+
+   @Override
+   public EnhancedProperties getProperties() {
+      return properties;
+   }
+
+   @Override
+   public String getUniqueServerId() {
+	  if(properties == null){
+		  return id;
+	  } else { 
+		  return (String)properties.getProperty("id", id);  
+	  }  
+   }
+
+   public void setConnected(boolean connected){
+      this.connected  = connected;
+   }
+   
+   public boolean isConnected() {
+      return this.connected;
+   }
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java
new file mode 100644
index 0000000..bfe1b1b
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.connection.service;
+
+import java.io.File;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class LocalFileKey implements IFileKey {
+
+   private final File file;
+
+   LocalFileKey(File file) {
+      this.file = file;
+   }
+
+   File getFile() {
+      return file;
+   }
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/Activator.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/Activator.java
new file mode 100644
index 0000000..0a5e884
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/Activator.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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.connection.service.internal;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IConnectorContributor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+public class Activator implements BundleActivator {
+
+   private ConnectionServiceImpl service;
+   private ServiceRegistration registration;
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      service = new ConnectionServiceImpl();
+
+      // register the service
+      registration = context.registerService(IConnectionService.class.getName(), service, null);
+
+      // create a tracker and track the service
+
+      ExtensionDefinedObjects<IConnectorContributor> definedObjects =
+         new ExtensionDefinedObjects<IConnectorContributor>("org.eclipse.osee.connection.service.ext",
+            "ConnectorContribution", "className");
+      try {
+         List<IConnectorContributor> contributors = definedObjects.getObjects();
+         for (IConnectorContributor contributor : contributors) {
+            try {
+               contributor.init();
+            } catch (Exception e) {
+               log(Level.SEVERE, "exception initializing connector contributor", e);
+            }
+         }
+      } catch (Exception ex) {
+         log(Level.SEVERE, "failed to process OTE runtime library provider extensions", ex);
+      }
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      service.stop();
+      registration.unregister();
+      service = 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.connection.service/src/org/eclipse/osee/connection/service/internal/ConnectionServiceImpl.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/ConnectionServiceImpl.java
new file mode 100644
index 0000000..bb6c43d
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/ConnectionServiceImpl.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * 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.connection.service.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IConnectorFilter;
+import org.eclipse.osee.connection.service.IConnectorListener;
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+class ConnectionServiceImpl implements IConnectionService {
+
+   private final HashSet<IServiceConnector> connectors = new HashSet<>();
+   private final EventNotifier eventNotifier = new EventNotifier();
+
+   private boolean isStopped = false;
+
+   @Override
+   public void addConnector(IServiceConnector connector) {
+      addConnectors(Collections.singletonList(connector));
+   }
+
+   @Override
+   public synchronized void addConnectors(Collection<IServiceConnector> connectors) {
+      checkState();
+      this.connectors.addAll(connectors);
+      eventNotifier.notifyConnectorsAdded(connectors);
+   }
+
+   @Override
+   public synchronized void addListener(IConnectorListener listener) {
+      checkState();
+      eventNotifier.addListener(listener);
+      listener.onConnectorsAdded(connectors);
+   }
+
+   @Override
+   public synchronized List<IServiceConnector> findConnectors(IConnectorFilter[] filterChain) {
+      checkState();
+      ArrayList<IServiceConnector> matchingConnectors = new ArrayList<>();
+      for (IServiceConnector connector : connectors) {
+         boolean accepted = true;
+         for (IConnectorFilter filter : filterChain) {
+            if (!filter.accept(connector)) {
+               accepted = false;
+               break;
+            }
+         }
+         if (accepted) {
+            matchingConnectors.add(connector);
+         }
+      }
+      return matchingConnectors;
+   }
+
+   @Override
+   public synchronized Collection<IServiceConnector> getAllConnectors() {
+      checkState();
+      return connectors;
+   }
+
+   @Override
+   public synchronized void removeConnector(IServiceConnector connector) throws Exception {
+      checkState();
+      if (connectors.remove(connector)) {
+         eventNotifier.notifyConnectorRemoved(connector);
+         connector.stop();
+      }
+
+   }
+
+   @Override
+   public synchronized void removeListener(IConnectorListener listener) {
+      checkState();
+      eventNotifier.removeListener(listener);
+   }
+
+   void stop() {
+      isStopped = true;
+      eventNotifier.notifyServiceStopped();
+      for (IServiceConnector connector : connectors) {
+         try {
+            connector.stop();
+         } catch (Exception ex) {
+            Activator.log(Level.SEVERE, "Exception notifying listener of service stop", ex);
+         }
+      }
+      connectors.clear();
+   }
+
+   private void checkState() throws IllegalStateException {
+      if (isStopped) {
+         throw new IllegalStateException("service has been stopped");
+      }
+   }
+
+   @Override
+   public boolean isStopped() {
+      return isStopped;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/EventNotifier.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/EventNotifier.java
new file mode 100644
index 0000000..474d578
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/EventNotifier.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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.connection.service.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IConnectorListener;
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+public class EventNotifier {
+
+   private final ExecutorService executorService = Executors.newCachedThreadPool();
+
+   private final CopyOnWriteArrayList<IConnectorListener> connectorListener =
+      new CopyOnWriteArrayList<IConnectorListener>();
+
+   void notifyConnectorsAdded(final Collection<IServiceConnector> connectors) {
+      executorService.submit(new Runnable() {
+         // copy the collection of new connectors
+         final ArrayList<IServiceConnector> newConnectors = new ArrayList<>(connectors);
+
+         @Override
+         public void run() {
+            for (IConnectorListener listener : connectorListener) {
+               try {
+                  listener.onConnectorsAdded(newConnectors);
+               } catch (Exception e) {
+                  Activator.log(Level.SEVERE, "Error processing listeners for connector added event", e);
+               }
+            }
+         }
+      });
+
+   }
+
+   void notifyConnectorRemoved(final IServiceConnector connector) {
+      executorService.submit(new Runnable() {
+
+         @Override
+         public void run() {
+            for (IConnectorListener listener : connectorListener) {
+               try {
+                  listener.onConnectorRemoved(connector);
+               } catch (Exception e) {
+                  Activator.log(Level.SEVERE, "Error processing listeners for connector remove event", e);
+               }
+            }
+         }
+
+      });
+
+   }
+
+   void notifyServiceStopped() {
+      for (IConnectorListener listener : connectorListener) {
+         listener.onConnectionServiceStopped();
+      }
+   }
+
+   void addListener(IConnectorListener listener) {
+      connectorListener.add(listener);
+   }
+
+   void removeListener(IConnectorListener listener) {
+      connectorListener.remove(listener);
+   }
+}
diff --git a/org.eclipse.osee.ote.container/.classpath b/org.eclipse.osee.ote.container/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.container/.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.container/.pmd b/org.eclipse.osee.ote.container/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.container/.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.container/.project b/org.eclipse.osee.ote.container/.project
new file mode 100644
index 0000000..c7196c9
--- /dev/null
+++ b/org.eclipse.osee.ote.container/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.container</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.container/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.container/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..522e97f
--- /dev/null
+++ b/org.eclipse.osee.ote.container/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Classpath Container
+Bundle-SymbolicName: org.eclipse.osee.ote.container;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.container.OteContainerActivator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jdt,
+ org.eclipse.jdt.ui,
+ org.eclipse.jdt.core,
+ org.eclipse.osee.ote.runtimeManager,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.ote.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.ui.workspacebundleloader
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.container/build.properties b/org.eclipse.osee.ote.container/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.osee.ote.container/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.osee.ote.container/plugin.xml b/org.eclipse.osee.ote.container/plugin.xml
new file mode 100644
index 0000000..d428fe6
--- /dev/null
+++ b/org.eclipse.osee.ote.container/plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.jdt.core.classpathContainerInitializer">
+      <classpathContainerInitializer
+            class="org.eclipse.osee.ote.container.OteClasspathContainerInitializer"
+            id="OTE Classpath Container from the extension point">
+      </classpathContainerInitializer>
+   </extension>
+   <extension
+         point="org.eclipse.jdt.ui.classpathContainerPage">
+      <classpathContainerPage
+            class="org.eclipse.osee.ote.container.OteContainerPage"
+            id="org.eclipse.osee.ote.container.classpathContainerPage"
+            name="OTE Classpath Container please use this">
+      </classpathContainerPage>
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.container/pom.xml b/org.eclipse.osee.ote.container/pom.xml
new file mode 100644
index 0000000..3871f88
--- /dev/null
+++ b/org.eclipse.osee.ote.container/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.ote.container</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Container (Incubation)</name>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/IUserLibListener.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/IUserLibListener.java
new file mode 100644
index 0000000..3ec0a38
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/IUserLibListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * 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.container;
+
+/**
+ * @author Michael P. Masterson
+ */
+public interface IUserLibListener {
+
+   public void libraryChanged();
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/JarChangeResourceListener.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/JarChangeResourceListener.java
new file mode 100644
index 0000000..410c02b
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/JarChangeResourceListener.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * 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.container;
+
+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;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+/**
+ * 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 LibraryChangeProvider listener;
+
+   public JarChangeResourceListener(String natureId, LibraryChangeProvider 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) {
+                        handlePluginChanges(project.getLocation().removeLastSegments(1),
+                           pluginDelta.getAffectedChildren());
+                        triggered = true;
+                     }
+                  }
+               }
+            }
+         }
+
+         if (triggered) {
+            listener.handlePostChange();
+         }
+      }
+   }
+
+   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.ote.container/src/org/eclipse/osee/ote/container/LibraryChangeProvider.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/LibraryChangeProvider.java
new file mode 100644
index 0000000..4384a90
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/LibraryChangeProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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.container;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+public class LibraryChangeProvider<T extends JarCollectionNature> {
+
+   private final List<IUserLibListener> listeners;
+
+   public LibraryChangeProvider() {
+      listeners = new ArrayList<>();
+   }
+
+   public void addListener(IUserLibListener listener) {
+      if (!listeners.contains(listener)) {
+         listeners.add(listener);
+      }
+   }
+
+   public void handleBundleAdded(URL url) {
+      resetClasspath();
+   }
+
+   private void resetClasspath() {
+      for (IUserLibListener listener : listeners) {
+         listener.libraryChanged();
+         //      try {
+         //         this.oteClasspathContainer.javaProject.getPerProjectInfo().resetResolvedClasspath();
+         //      }
+         //      catch (JavaModelException ex) {
+         //         ex.printStackTrace();
+         //      }
+      }
+   }
+
+   public void handleBundleChanged(URL url) {
+   }
+
+   public void handleBundleRemoved(URL url) {
+      resetClasspath();
+   }
+
+   public void handleNatureClosed(T nature) {
+      resetClasspath();
+   }
+
+   public void handlePostChange() {
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainer.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainer.java
new file mode 100644
index 0000000..2f0ae41
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainer.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * 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.container;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.core.JavaProject;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarChangeResourceListener;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.OteBundleLocator;
+import org.eclipse.osee.ote.runtimemanager.OteUserLibsNature;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteClasspathContainer implements IClasspathContainer, IUserLibListener {
+   public final static Path ID = new Path("OTE Classpath Container from the extension point");
+
+   private Collection<ClassPathDescription> classPaths;
+
+   private List<BundleInfo> betterPaths;
+
+   private ServiceTracker tracker;
+
+   private OteBundleLocator locator;
+
+   private final JavaProject javaProject;
+
+   private LibraryChangeProvider<OteUserLibsNature> userLibListener;
+
+   private JarChangeResourceListener<OteUserLibsNature> userLibResourceListener;
+
+   public OteClasspathContainer(IPath path, IJavaProject javaProject) throws CoreException {
+      this.javaProject = (JavaProject) javaProject;
+
+      try {
+         BundleContext context = OteContainerActivator.getDefault().getContext();
+         tracker = new ServiceTracker(context, OteBundleLocator.class.getName(), null);
+         tracker.open(true);
+         Object obj = tracker.waitForService(10000);
+         locator = (OteBundleLocator) obj;
+
+         OteContainerActivator.getDefault().getLibraryChangeProvider().addListener(this);
+      } catch (Exception ex) {
+         ex.printStackTrace();
+      }
+
+   }
+
+   private String findProjectRoot(String path) {
+      File fileForPath = new File(path);
+      File projectFile = recursivelyFindProjectFile(fileForPath);
+      return projectFile.getAbsolutePath();
+   }
+
+   private File recursivelyFindProjectFile(File file) {
+
+      if (file == null) {
+         return file;
+      }
+
+      if (fileIsDirectoryWithBin(file)) {
+         return file;
+      } else {
+         return recursivelyFindProjectFile(file.getParentFile());
+      }
+   }
+
+   private boolean fileIsDirectoryWithBin(File file) {
+      if (file.isDirectory()) {
+         File binChildFile = new File(file.getAbsoluteFile() + "/bin");
+         if (binChildFile.exists()) {
+            return true;
+         }
+      }
+      return false;
+   }
+
+   private String getWorkspaceRelativePath(String absolutePath) {
+      return absolutePath;
+   }
+
+   @Override
+   public IClasspathEntry[] getClasspathEntries() {
+      List<IClasspathEntry> entries = new ArrayList<>();
+      Collection<BundleInfo> runtimeLibUrls;
+      try {
+         runtimeLibUrls = locator.getRuntimeLibs();
+         classPaths = new ArrayList<>();
+         betterPaths = new ArrayList<>();
+         for (BundleInfo info : runtimeLibUrls) {
+
+            String binaryFilePath = info.getSystemLocation().getFile();
+
+            if (info.isSystemLibrary()) {
+               entries.add(JavaCore.newLibraryEntry(new Path(binaryFilePath), new Path(binaryFilePath), new Path("/")));
+            } else {
+               File projectFilePath = recursivelyFindProjectFile(new File(binaryFilePath));
+               binaryFilePath = "/" + projectFilePath.getName();
+
+               entries.add(JavaCore.newProjectEntry(new Path(binaryFilePath)));
+            }
+         }
+
+      } catch (Exception ex) {
+         ex.printStackTrace();
+      }
+
+      IClasspathEntry[] retVal = new IClasspathEntry[entries.size()];
+      return entries.toArray(retVal);
+   }
+
+   @Override
+   public String getDescription() {
+      return "OTE Classpath Container";
+   }
+
+   @Override
+   public int getKind() {
+      return IClasspathContainer.K_APPLICATION;
+   }
+
+   @Override
+   public IPath getPath() {
+      return ID;
+   }
+
+   private class ClassPathDescription {
+      private final String sourcePath, binaryPath;
+
+      public ClassPathDescription(String binaryPath, String sourcePath) {
+         super();
+         this.sourcePath = sourcePath;
+         this.binaryPath = binaryPath;
+      }
+
+      /**
+       * @return the sourcePath
+       */
+      public String getSourcePath() {
+         return sourcePath;
+      }
+
+      /**
+       * @return the binaryPath
+       */
+      public String getBinaryPath() {
+         return binaryPath;
+      }
+
+   }
+
+   @Override
+   public void libraryChanged() {
+   }
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainerInitializer.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainerInitializer.java
new file mode 100644
index 0000000..046e959
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainerInitializer.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.container;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+public class OteClasspathContainerInitializer extends ClasspathContainerInitializer {
+
+   public OteClasspathContainerInitializer() {
+   }
+
+   @Override
+   public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
+
+      OteClasspathContainer oteClasspathContainer = new OteClasspathContainer(containerPath, project);
+      JavaCore.setClasspathContainer(containerPath, new IJavaProject[] {project},
+         new IClasspathContainer[] {oteClasspathContainer}, null);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerActivator.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerActivator.java
new file mode 100644
index 0000000..c449a72
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerActivator.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * 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.container;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.osee.ote.runtimemanager.OteUserLibsNature;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class OteContainerActivator implements BundleActivator {
+
+   // The plug-in ID
+   public static final String PLUGIN_ID = "org.eclipse.osee.ote.container";
+
+   // The shared instance
+   private static OteContainerActivator plugin;
+
+   private BundleContext context;
+
+   private JarChangeResourceListener<OteUserLibsNature> userLibResourceListener;
+
+   private LibraryChangeProvider<OteUserLibsNature> userLibListener;
+
+   /**
+    * The constructor
+    */
+   public OteContainerActivator() {
+   }
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      plugin = this;
+      this.context = context;
+      userLibListener = new LibraryChangeProvider<>();
+      this.userLibResourceListener =
+         new JarChangeResourceListener<OteUserLibsNature>(OteUserLibsNature.NATURE_ID, userLibListener);
+
+      IWorkspace workspace = ResourcesPlugin.getWorkspace();
+      workspace.addResourceChangeListener(userLibResourceListener);
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      IWorkspace workspace = ResourcesPlugin.getWorkspace();
+      workspace.removeResourceChangeListener(userLibResourceListener);
+      context = null;
+      plugin = null;
+   }
+
+   /**
+    * Returns the shared instance
+    * 
+    * @return the shared instance
+    */
+   public static OteContainerActivator getDefault() {
+      return plugin;
+   }
+
+   /**
+    * @return the context
+    */
+   public BundleContext getContext() {
+      return context;
+   }
+
+   public LibraryChangeProvider<OteUserLibsNature> getLibraryChangeProvider() {
+      return userLibListener;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerPage.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerPage.java
new file mode 100644
index 0000000..4681c2a
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerPage.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.container;
+
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+public class OteContainerPage extends WizardPage implements IClasspathContainerPage {
+
+   public OteContainerPage() {
+      super("OTE CONTAINER");
+   }
+
+   @Override
+   public boolean finish() {
+      return true;
+   }
+
+   @Override
+   public IClasspathEntry getSelection() {
+      return JavaCore.newContainerEntry(OteClasspathContainer.ID);
+   }
+
+   @Override
+   public void setSelection(IClasspathEntry containerEntry) {
+   }
+
+   @Override
+   public void createControl(Composite parent) {
+      Composite comp = new Composite(parent, SWT.None);
+      GridLayout layout = new GridLayout(1, true);
+      comp.setLayout(layout);
+
+      GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+      comp.setLayoutData(data);
+
+      Label label = new Label(comp, SWT.BORDER);
+      label.setText("JUST CLICK FINISH YOU FOOL!!!");
+
+      data = new GridData(SWT.FILL, SWT.FILL, true, true);
+      label.setLayoutData(data);
+      setControl(comp);
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/.classpath b/org.eclipse.osee.ote.core.test/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/.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.core.test/.project b/org.eclipse.osee.ote.core.test/.project
new file mode 100644
index 0000000..770c642
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.core.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.ote.core.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.core.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7821538
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Core Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.core.test
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Fragment-Host: org.eclipse.osee.ote.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit,
+ org.eclipse.equinox.ds
+Export-Package: org.eclipse.osee.ote.core.framework
+Import-Package: org.mockito,
+ org.mockito.stubbing
diff --git a/org.eclipse.osee.ote.core.test/build.properties b/org.eclipse.osee.ote.core.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.core.test/data/loading.test1.jar b/org.eclipse.osee.ote.core.test/data/loading.test1.jar
new file mode 100644
index 0000000..0e6549a
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/loading.test1.jar
Binary files differ
diff --git a/org.eclipse.osee.ote.core.test/data/loading.test2.jar b/org.eclipse.osee.ote.core.test/data/loading.test2.jar
new file mode 100644
index 0000000..dac01e7
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/loading.test2.jar
Binary files differ
diff --git a/org.eclipse.osee.ote.core.test/data/loading.test3.jar b/org.eclipse.osee.ote.core.test/data/loading.test3.jar
new file mode 100644
index 0000000..ccd4c16
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/loading.test3.jar
Binary files differ
diff --git a/org.eclipse.osee.ote.core.test/pom.xml b/org.eclipse.osee.ote.core.test/pom.xml
new file mode 100644
index 0000000..9205d59
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/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.ote.core.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+	<name>OTE Core Test</name>
+	
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEApiTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEApiTest.java
new file mode 100644
index 0000000..7662b3e
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEApiTest.java
@@ -0,0 +1,223 @@
+package org.eclipse.osee.ote;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.concurrent.Future;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+@SuppressWarnings("restriction")
+public class OTEApiTest {
+
+   private OTEApi oteApi;
+
+   @Before
+   public void setup() {
+      BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+      ServiceReference<OTEApi> ref = context.getServiceReference(OTEApi.class);
+      Assert.assertNotNull(ref);
+      oteApi = context.getService(ref);
+      Assert.assertNotNull(oteApi);
+   }
+
+   @Test
+   public void testConfigurationLoading() throws IOException, Exception {
+      clearJarCache();
+      URL bundle1 = findEntry("data/loading.test1.jar");
+      URL bundle2 = findEntry("data/loading.test2.jar");
+      URL bundle3 = findEntry("data/loading.test3.jar");
+      ConfigurationItem config1 =
+         new ConfigurationItem(bundle1.toString(), "1.0.0", "loading.test1", ChecksumUtil.createChecksumAsString(
+            bundle1.openStream(), "MD5"), true);
+      ConfigurationItem config2 =
+         new ConfigurationItem(bundle2.toString(), "1.0.0", "loading.test2", ChecksumUtil.createChecksumAsString(
+            bundle2.openStream(), "MD5"), true);
+      ConfigurationItem config3 =
+         new ConfigurationItem(bundle3.toString(), "1.0.0", "loading.test3", ChecksumUtil.createChecksumAsString(
+            bundle3.openStream(), "MD5"), true);
+
+      Configuration validConfiguration = new Configuration();
+      validConfiguration.addItem(config1);
+      validConfiguration.addItem(config2);
+      validConfiguration.addItem(config3);
+
+      OTEStatusCallback<ConfigurationStatus> callable = new OTEStatusCallbackForTests<>();
+
+      Future<ConfigurationStatus> statusFuture = oteApi.loadConfiguration(validConfiguration, callable);
+      ConfigurationStatus status = statusFuture.get();
+      Assert.assertTrue(status.isSuccess());
+      Assert.assertEquals(validConfiguration, status.getConfiguration());
+      Assert.assertEquals(validConfiguration, oteApi.getConfiguration().get().getConfiguration());
+
+      Bundle bundle = findBundle("loading.test1");
+      Assert.assertNotNull(bundle);
+      Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+      bundle = findBundle("loading.test2");
+      Assert.assertNotNull(bundle);
+      Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+      bundle = findBundle("loading.test3");
+      Assert.assertNotNull(bundle);
+      Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+      Future<ConfigurationStatus> resetFeature = oteApi.resetConfiguration(callable);
+      ConfigurationStatus resetStatus = resetFeature.get();
+      Assert.assertTrue(resetStatus.isSuccess());
+      Assert.assertNull(findBundle("loading.test1"));
+      Assert.assertNull(findBundle("loading.test2"));
+      Assert.assertNull(findBundle("loading.test3"));
+
+      Configuration invalidConfiguration = new Configuration();
+      invalidConfiguration.addItem(config1);
+      invalidConfiguration.addItem(config3);
+      Future<ConfigurationStatus> failStatusFuture = oteApi.loadConfiguration(invalidConfiguration, callable);
+      ConfigurationStatus failStatus = failStatusFuture.get();
+      Assert.assertFalse(failStatus.isSuccess());
+      System.out.println(failStatus.getMessage());
+      Assert.assertNull(findBundle("loading.test1"));
+      Assert.assertNull(findBundle("loading.test2"));
+      Assert.assertNull(findBundle("loading.test3"));
+
+      //test the doing load case
+      Future<ConfigurationStatus> good = oteApi.loadConfiguration(validConfiguration, callable);
+      Future<ConfigurationStatus> bad = oteApi.loadConfiguration(validConfiguration, callable);
+
+      ConfigurationStatus goodStatus = good.get();
+      ConfigurationStatus badStatus = bad.get();
+      Assert.assertTrue(goodStatus.isSuccess());
+      Assert.assertFalse(badStatus.isSuccess());
+      System.out.println(badStatus.getMessage());
+
+      //test already configured
+      bad = oteApi.loadConfiguration(validConfiguration, callable);
+      badStatus = bad.get();
+      Assert.assertFalse(badStatus.isSuccess());
+      System.out.println(badStatus.getMessage());
+   }
+
+   @Test
+   public void testJarAcquire() throws IOException, Exception {
+      clearJarCache();
+      URL bundle1 = findEntry("data/loading.test1.jar");
+      URL bundle2 = findEntry("data/loading.test2.jar");
+      URL bundle3 = findEntry("data/loading.test3.jar");
+      ConfigurationItem config1 =
+         new ConfigurationItem(bundle1.toString(), "1.0.0", "loading.test1", ChecksumUtil.createChecksumAsString(
+            bundle1.openStream(), "MD5"), true);
+      ConfigurationItem config2 =
+         new ConfigurationItem(bundle2.toString(), "1.0.0", "loading.test2", ChecksumUtil.createChecksumAsString(
+            bundle2.openStream(), "MD5"), true);
+      ConfigurationItem config3 =
+         new ConfigurationItem(bundle3.toString(), "1.0.0", "loading.test3", ChecksumUtil.createChecksumAsString(
+            bundle3.openStream(), "MD5"), true);
+
+      Configuration validConfiguration = new Configuration();
+      validConfiguration.addItem(config1);
+      validConfiguration.addItem(config2);
+      validConfiguration.addItem(config3);
+
+      OTEStatusCallback<ConfigurationStatus> callable = new OTEStatusCallbackForTests<>();
+
+      Future<ConfigurationStatus> statusFuture = oteApi.downloadConfigurationJars(validConfiguration, callable);
+      ConfigurationStatus status = statusFuture.get();
+      Assert.assertTrue(status.isSuccess());
+      OTEServerRuntimeCache cache = oteApi.getRuntimeCache();
+      Assert.assertNotNull(cache.get(config1.getSymbolicName(), config1.getMd5Digest()));
+      Assert.assertNotNull(cache.get(config2.getSymbolicName(), config2.getMd5Digest()));
+      Assert.assertNotNull(cache.get(config3.getSymbolicName(), config3.getMd5Digest()));
+
+      Assert.assertNull(cache.get(config1.getSymbolicName(), config2.getMd5Digest()));
+      Assert.assertNull(cache.get(config2.getSymbolicName(), config3.getMd5Digest()));
+      Assert.assertNull(cache.get(config3.getSymbolicName(), config1.getMd5Digest()));
+
+      //test failure to download
+      clearJarCache();
+      ConfigurationItem config4 =
+         new ConfigurationItem("file://this/file/does/not/exist/2351.jar", "1.0.0", "loading.test11",
+            ChecksumUtil.createChecksumAsString(bundle1.openStream(), "MD5"), true);
+      Configuration invalidConfiguration = new Configuration();
+      invalidConfiguration.addItem(config4);
+      statusFuture = oteApi.downloadConfigurationJars(invalidConfiguration, callable);
+      status = statusFuture.get();
+      Assert.assertFalse(status.isSuccess());
+
+      //      Assert.assertEquals(validConfiguration, status.getConfiguration());
+      //      Assert.assertEquals(validConfiguration, oteApi.getConfiguration().get().getConfiguration());
+
+      //      Bundle bundle = findBundle("loading.test1");
+      //      Assert.assertNotNull(bundle);
+      //      Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+      //      
+      //      bundle = findBundle("loading.test2");
+      //      Assert.assertNotNull(bundle);
+      //      Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+      //      
+      //      bundle = findBundle("loading.test3");
+      //      Assert.assertNotNull(bundle);
+      //      Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+      //      Future<ConfigurationStatus> resetFeature = oteApi.resetConfiguration(callable);
+      //      ConfigurationStatus resetStatus = resetFeature.get();
+      //      Assert.assertTrue(resetStatus.isSuccess());
+      //      Assert.assertNull(findBundle("loading.test1"));
+      //      Assert.assertNull(findBundle("loading.test2"));
+      //      Assert.assertNull(findBundle("loading.test3"));
+
+      //      Configuration invalidConfiguration = new Configuration();
+      //      invalidConfiguration.addItem(config1);
+      //      invalidConfiguration.addItem(config3);
+      //      Future<ConfigurationStatus> failStatusFuture = oteApi.loadConfiguration(invalidConfiguration, callable);
+      //      ConfigurationStatus failStatus = failStatusFuture.get();
+      //      Assert.assertFalse(failStatus.isSuccess());
+      //      System.out.println(failStatus.getMessage());
+      //      Assert.assertNull(findBundle("loading.test1"));
+      //      Assert.assertNull(findBundle("loading.test2"));
+      //      Assert.assertNull(findBundle("loading.test3"));
+      //      
+      //      //test the doing load case
+      //      Future<ConfigurationStatus> good = oteApi.loadConfiguration(validConfiguration, callable);
+      //      Future<ConfigurationStatus> bad = oteApi.loadConfiguration(validConfiguration, callable);
+      //      
+      //      ConfigurationStatus goodStatus = good.get();
+      //      ConfigurationStatus badStatus = bad.get();
+      //      Assert.assertTrue(goodStatus.isSuccess());
+      //      Assert.assertFalse(badStatus.isSuccess());
+      //      System.out.println(badStatus.getMessage());
+      //      
+      //      //test already configured
+      //      bad = oteApi.loadConfiguration(validConfiguration, callable);
+      //      badStatus = bad.get();
+      //      Assert.assertFalse(badStatus.isSuccess());
+      //      System.out.println(badStatus.getMessage());
+   }
+
+   private void clearJarCache() {
+      oteApi.getRuntimeCache().clearJarCache();
+   }
+
+   private Bundle findBundle(String symbolicName) {
+      Bundle[] bundles = FrameworkUtil.getBundle(OTEApiTest.class).getBundleContext().getBundles();
+      for (Bundle bundle : bundles) {
+         if (bundle.getSymbolicName().equals(symbolicName)) {
+            return bundle;
+         }
+      }
+      return null;
+   }
+
+   private URL findEntry(String path) {
+      URL url = null;
+      Bundle bundle = FrameworkUtil.getBundle(OTEApiTest.class);
+      url = bundle.getEntry(path);
+      Assert.assertNotNull(url);
+      return url;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEStatusCallbackForTests.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEStatusCallbackForTests.java
new file mode 100644
index 0000000..73d78ed
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEStatusCallbackForTests.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote;
+
+
+public class OTEStatusCallbackForTests<T> implements OTEStatusCallback<ConfigurationStatus> {
+
+   @Override
+   public void complete(ConfigurationStatus done) {
+      System.out.println("done");
+   }
+
+   @Override
+   public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+      System.out.println("units " + totalUnitsOfWork);
+   }
+
+   @Override
+   public void incrememtUnitsWorked(int count) {
+      System.out.println("units " + count);
+   }
+
+   @Override
+   public void log(String string) {
+      System.out.println(string);
+   }
+
+   @Override
+   public void error(String message, Throwable th) {
+      System.out.println(message);
+      th.printStackTrace();
+   }
+
+   @Override
+   public void error(String message) {
+      System.out.println(message);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/XmlSupportTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/XmlSupportTest.java
new file mode 100644
index 0000000..026bd91
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/XmlSupportTest.java
@@ -0,0 +1,36 @@
+/*
+ * Created on Jun 10, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.core;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class XmlSupportTest {
+
+   /**
+    * Test method for {@link org.eclipse.osee.ote.core.XmlSupport#convertNonPrintableCharacers(java.lang.String)}.
+    */
+   @Test
+   public void testConvertXmlCharacers() {
+      String testString = "abc\n\r\0\t 123\f&<>";
+      String expected = "abc\n\r[ASCII=0]\t 123[ASCII=12][ampersand][less-than][greater-than]";
+      String actual = XmlSupport.convertXmlCharacters(testString);
+      Assert.assertEquals(expected, actual);
+   }
+
+   @Test
+   public void testNonPrintableCharacter() {
+      String testString = "abc\n\r\0\t 123\f&<>";
+      String expected = "abc\n\r[ASCII=0]\t 123[ASCII=12]&<>";
+
+      String actual = XmlSupport.convertNonPrintableCharacers(testString);
+      Assert.assertEquals(expected, actual);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/environment/status/msg/SerializedMessageTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/environment/status/msg/SerializedMessageTest.java
new file mode 100644
index 0000000..ef03ddb
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/environment/status/msg/SerializedMessageTest.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+
+import org.eclipse.osee.ote.core.environment.status.EnvironmentError;
+import org.junit.Test;
+
+public class SerializedMessageTest {
+
+	@Test
+	public void testErrorMessage() throws IOException, ClassNotFoundException {
+		String exMessage = "MY EX TEST";
+		EnvironmentError error = new EnvironmentError(new Exception(exMessage));
+		EnvErrorMessage msg = new EnvErrorMessage();
+		msg.setObject(error);
+		EnvironmentError errorBack = msg.getObject();
+		Assert.assertEquals(errorBack.getErr().getMessage(), exMessage);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecordTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecordTest.java
new file mode 100644
index 0000000..730a4bb
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecordTest.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.core.log.record;
+
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class PropertyStoreRecordTest extends TestCase {
+
+   public void testSimpleXmlWriting() throws XMLStreamException {
+      PropertyStore store = new PropertyStore();
+      store.put("test1", "data1");
+      store.put("test2", "data2");
+      store.put("test3", "data3");
+      store.put("test4", "data4");
+      PropertyStoreRecord record = new PropertyStoreRecord(store);
+      XMLOutputFactory factory = XMLOutputFactory.newInstance();
+      Writer stringStream = new StringWriter();
+      XMLStreamWriter writer = factory.createXMLStreamWriter(stringStream);
+      record.toXml(writer);
+
+      Pattern pattern = Pattern.compile("key=\"test1\"");
+      Matcher matcher = pattern.matcher(stringStream.toString());
+      assertTrue(matcher.find());
+
+      pattern = Pattern.compile("key=\"test2\"");
+      matcher = pattern.matcher(stringStream.toString());
+      assertTrue(matcher.find());
+
+      pattern = Pattern.compile("data2");
+      matcher = pattern.matcher(stringStream.toString());
+      assertTrue(matcher.find());
+
+      System.out.println(stringStream.toString());
+
+      pattern = Pattern.compile("data4");
+      matcher = pattern.matcher(stringStream.toString());
+      assertTrue(matcher.find());
+
+      pattern = Pattern.compile("key=\"test5\"");
+      matcher = pattern.matcher(stringStream.toString());
+      assertTrue(!matcher.find());
+   }
+
+   public void testNullPropertyStore() throws XMLStreamException {
+      PropertyStoreRecord record = new PropertyStoreRecord(null);
+      XMLOutputFactory factory = XMLOutputFactory.newInstance();
+      Writer stringStream = new StringWriter();
+      XMLStreamWriter writer = factory.createXMLStreamWriter(stringStream);
+      record.toXml(writer);
+   }
+
+   public void testEmptyPropertyStore() throws XMLStreamException {
+      PropertyStoreRecord record = new PropertyStoreRecord(new PropertyStore());
+      XMLOutputFactory factory = XMLOutputFactory.newInstance();
+      Writer stringStream = new StringWriter();
+      XMLStreamWriter writer = factory.createXMLStreamWriter(stringStream);
+      record.toXml(writer);
+
+      assertTrue(stringStream.toString().length() == 31);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointTest.java
new file mode 100644
index 0000000..6caf95b
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointTest.java
@@ -0,0 +1,43 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.ote.message.event.FileAvailableRequest;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class OteUdpEndpointTest {
+
+   @Test
+   public void testCreation() throws IOException {
+      int port = PortUtil.getInstance().getValidPort();
+      OteUdpEndpointSender sender = new OteUdpEndpointSender(new InetSocketAddress(port));
+      Assert.assertNotNull(sender);
+      port = PortUtil.getInstance().getValidPort();
+      OteUdpEndpointReceiverImpl receiver = new OteUdpEndpointReceiverImpl(new InetSocketAddress(port));
+      Assert.assertNotNull(receiver);
+   }
+   
+   @Test
+   public void testSendReceive() throws IOException, InterruptedException {
+      int port = PortUtil.getInstance().getValidPort();
+      OteUdpEndpointReceiverImpl receiver = new OteUdpEndpointReceiverImpl(new InetSocketAddress(InetAddress.getLocalHost(), port));
+      receiver.setDebugOutput(true);
+      receiver.start();
+      Thread.sleep(20);
+      InetSocketAddress address = receiver.getEndpoint();
+      OteUdpEndpointSender sender = new OteUdpEndpointSender(address);
+      sender.start();
+      FileAvailableRequest request = new FileAvailableRequest();
+      sender.send(request);
+      
+      Thread.sleep(20);
+      
+      sender.stop();
+      receiver.stop();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java
new file mode 100644
index 0000000..89ecaee
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java
@@ -0,0 +1,43 @@
+package org.eclipse.osee.ote.message.data;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MemoryResourceTest {
+
+   @Test
+   public void testcopyDataByteBuffer() {
+      byte[] data = new byte[32];
+      ByteBuffer buffer = ByteBuffer.allocate(32);
+      for(int i = 0; i < 16; i++){
+         buffer.put((byte)0xDD);
+      }
+      for(int i = 0; i < 16; i++){
+         buffer.put((byte)0xFF);
+      }
+      buffer.position(16);
+      MemoryResource mem = new MemoryResource(data, 0, 64);
+      mem.copyData(0, buffer, buffer.remaining());
+      
+      byte[] answer = new byte[32];
+      for(int i = 0; i < 16; i++){
+         answer[i] = (byte)0xFF;
+      }
+      
+      Assert.assertArrayEquals(answer, mem.getData());
+      
+      buffer.position(0);
+      mem.copyData(0, buffer, buffer.remaining());
+      for(int i = 0; i < 16; i++){
+         answer[i] = (byte)0xDD;
+      }
+      for(int i = 16; i < 32; i++){
+         answer[i] = (byte)0xFF;
+      }
+      
+      Assert.assertArrayEquals(answer, mem.getData());
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/BiSci16ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/BiSci16ElementTest.java
new file mode 100644
index 0000000..c8a9428
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/BiSci16ElementTest.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class BiSci16ElementTest {
+   
+   private BiSci16Element uut;
+
+   @Before
+   public void setup() {
+      final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 2, 64));
+      uut = new BiSci16Element(null, "derp", hd, 0, 0, 15);
+   }
+
+   @Test
+   public void testLongToBiSci() {
+      
+      long logicalValue ;
+      long biSciValue;
+      
+      logicalValue = 1;
+      biSciValue = 0x10;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = 0;
+      biSciValue = 0x0;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = -1;
+      biSciValue = 0xFFF0;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = 946176;
+      biSciValue = 0xE73;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = 25624576;
+      biSciValue = 0x1874;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = -25624576;
+      biSciValue = 0xE794;
+      assertLongToBiSci(logicalValue, biSciValue);
+
+      long sixteenCubed = (long) Math.pow(16, 3);
+      logicalValue = (long) Math.pow(16, 5);
+      biSciValue = 0x1003;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = (long) (Math.pow(16, 5) + 1);
+      biSciValue = 0x1003;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = (long) (Math.pow(16, 5) - 1);
+      biSciValue = 0x1003;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = (long) (Math.pow(16, 5) + (sixteenCubed/2) - 1);
+      biSciValue = 0x1003;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = (long) (Math.pow(16, 5) + (sixteenCubed/2));
+      biSciValue = 0x1013;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = (long) (Math.pow(16, 5) - sixteenCubed/2 - 1);
+      biSciValue = 0x0FF3;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+      logicalValue = (long) (Math.pow(16, 5) - sixteenCubed/2);
+      biSciValue = 0x1003;
+      assertLongToBiSci(logicalValue, biSciValue);
+      
+   }
+
+   private void assertLongToBiSci(long input, long expected) {
+      long actual = uut.convertLogicalValueToBiSci(input);
+      Assert.assertEquals(expected, actual);
+   }
+   
+   @Test
+   public void testBiSciToLong() {
+      long biSciValue;
+      long logicalValue;
+      
+      logicalValue = 1;
+      biSciValue = 0x10;
+      assertBiSciToLong(biSciValue, logicalValue);
+      
+      logicalValue = 0;
+      biSciValue = 0x0;
+      assertBiSciToLong(biSciValue, logicalValue);
+      
+      logicalValue = -1;
+      biSciValue = 0xFFF0;
+      assertBiSciToLong(biSciValue, logicalValue);
+
+      logicalValue = 946176;
+      biSciValue = 0xE73;
+      assertBiSciToLong(biSciValue, logicalValue);
+      
+      logicalValue = 25624576;
+      biSciValue = 0x1874;
+      assertBiSciToLong(biSciValue, logicalValue);
+      
+      logicalValue = -25624576;
+      biSciValue = ((short)0xE794);
+      assertBiSciToLong(biSciValue, logicalValue);
+      
+   }
+
+   /**
+    * @param bisciValue
+    * @param logicalValue
+    */
+   private void assertBiSciToLong(long input, long expected) {
+      long actual = uut.convertBiSciToLogicalValue(input);
+      Assert.assertEquals(expected, actual);
+      
+   }
+   
+   @Test
+   public void testSetValue() {
+      checkSet(25624576);
+      checkSet(-25624576);
+      checkSet(1);
+      checkSet(0);
+      checkSet(-1);
+      
+      checkTiming(0x7FF << (4 * 15));
+   }
+
+   private void checkTiming(int input) {
+      long timeBefore, timeAfter;
+      for( int i = 0 ; i < 10000 ; i++) {
+         timeBefore = System.nanoTime();
+         checkSet(input);
+         timeAfter = System.nanoTime();
+         long runningTime = timeAfter - timeBefore;
+         Assert.assertTrue(runningTime < 500000);
+
+      }
+      
+   }
+
+   private void checkSet(long input) {
+      uut.setValue(input);
+      Assert.assertEquals(input, (long)uut.getValue());
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/CharElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/CharElementTest.java
new file mode 100644
index 0000000..78267fd
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/CharElementTest.java
@@ -0,0 +1,80 @@
+/*
+ * Created on Oct 29, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.elements;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+import java.util.Arrays;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class CharElementTest {
+
+   public class TestMessage extends Message {
+      public TestMessage(String name, int defaultByteSize, int defaultOffset, boolean isScheduled, int phase, double rate) {
+         super(name, defaultByteSize, defaultOffset, isScheduled, phase, rate);
+      }
+   }
+
+   @Mock
+   private TestMessage message;
+   @Mock
+   private MessageData msgData;
+   private final byte[] bytes = new byte[5];
+   private final MemoryResource memoryResource = new MemoryResource(bytes, 0, bytes.length);
+
+   @Before
+   public void before() {
+      MockitoAnnotations.initMocks(this);
+      when(message.getData()).thenReturn(bytes);
+      when(message.getName()).thenReturn("MSG");
+      when(msgData.getMem()).thenReturn(memoryResource);
+   }
+
+   @Test
+   public void parseAndSetWithByteAlignedElementTest() throws Exception {
+      CharElement sut = new CharElement(message, "TEST", msgData, 0, 0, 7);
+      assertEquals("Start with all zeros in the byte array", "[0, 0, 0, 0, 0]",
+         Arrays.toString(memoryResource.getData()));
+      sut.parseAndSet(null, " ");
+      assertEquals("getValue should return space character", ' ', sut.getValue().charValue());
+      sut.parseAndSet(null, "A");
+      assertEquals("getValue should return 'A'", 'A', sut.getValue().charValue());
+      sut.parseAndSet(null, "");
+      assertEquals("getValue should return null character", '\0', sut.getValue().charValue());
+      sut.parseAndSet(null, "FOO");
+      assertEquals("Decimal ASCII values for FOO", "[70, 79, 79, 0, 0]", Arrays.toString(memoryResource.getData()));
+      assertEquals("FOO should be returned by the getString method", "FOO", sut.getString(null, 5));
+   }
+
+   @Test
+   public void parseAndSetWithNonByteAlignedElementTest() throws Exception {
+      CharElement sut = new CharElement(message, "TEST", msgData, 0, 1, 7);
+      assertEquals("Start with all zeros in the byte array", "[0, 0, 0, 0, 0]",
+         Arrays.toString(memoryResource.getData()));
+      Arrays.fill(bytes, (byte) 0xFF);
+      sut.parseAndSet(null, " ");
+      assertEquals("getValue should return space character", ' ', sut.getValue().charValue());
+      sut.parseAndSet(null, "A");
+      assertEquals("getValue should return 'A'", 'A', sut.getValue().charValue());
+      sut.parseAndSet(null, "");
+      assertEquals("getValue should return null character", '\0', sut.getValue().charValue());
+      sut.parseAndSet(null, "FOO");
+      assertEquals("Unfortunately we tromple the spare bit data", "[70, 79, 79, -1, -1]",
+         Arrays.toString(memoryResource.getData()));
+   }
+
+   @Test(expected = IllegalArgumentException.class)
+   public void parseAndSetOverflowExceptionTest() throws Exception {
+      CharElement sut = new CharElement(message, "TEST", msgData, 0, 0, 7);
+      sut.parseAndSet(null, "TOOLONG");
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float32ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float32ElementTest.java
new file mode 100644
index 0000000..887e06e
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float32ElementTest.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Float32ElementTest {
+
+   @Test
+   public void testFloat32() {
+      final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 0, 64));
+      Float32Element[] e = new Float32Element[8];
+      for (int i = 0; i < e.length; i++) {
+         e[i] = new Float32Element(null, "Float32@" + i, hd, i * 4, 0, 31);
+      }
+      Random r = new Random(System.currentTimeMillis());
+      float[] vals = new float[e.length];
+      for (int i = 0; i < 1000; i++) {
+         generateAscending(r, e, vals, e.length);
+         check(e, vals, e.length);
+
+         generateDescending(r, e, vals, e.length);
+         check(e, vals, e.length);
+
+         // zeroize test
+         for (int z = 0; z < e.length; z += 2) {
+            e[z].zeroize();
+            vals[z] = 0;
+         }
+
+         check(e, vals, e.length);
+
+      }
+      Double x = new Double(r.nextFloat());
+      e[0].setValue(x);
+      Assert.assertTrue(e[0].getValue().equals(x));
+   }
+
+   private void generateAscending(Random r, Float32Element[] e, float[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         float val = r.nextFloat();
+         Float32Element el = e[i];
+         el.setValue(val);
+         expectedVals[i] = val;
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            Double.valueOf(expectedVals[i]), el.getValue());
+      }
+   }
+
+   private void generateDescending(Random r, Float32Element[] e, float[] expectedVals, int length) {
+      for (int i = length - 1; i >= 0; i--) {
+         float val = r.nextFloat();
+         Float32Element el = e[i];
+         el.setValue(val);
+         expectedVals[i] = val;
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            Double.toHexString(expectedVals[i]), Double.toHexString(el.getValue()));
+      }
+   }
+
+   private void check(Float32Element[] e, float[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         Float32Element el = e[i];
+         Assert.assertTrue(
+            String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            expectedVals[i] == el.getValue());
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float64ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float64ElementTest.java
new file mode 100644
index 0000000..8c47626
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float64ElementTest.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Float64ElementTest {
+
+   @Test
+   public void testFloat64() {
+      final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 0, 64));
+      Float64Element[] e = new Float64Element[8];
+      for (int i = 0; i < e.length; i++) {
+         e[i] = new Float64Element(null, "Float64@" + i, hd, i * 8, 0, 63);
+      }
+      Random r = new Random(System.currentTimeMillis());
+      double[] vals = new double[e.length];
+      for (int i = 0; i < 1000; i++) {
+         generateAscending(r, e, vals, e.length);
+         check(e, vals, e.length);
+
+         generateDescending(r, e, vals, e.length);
+         check(e, vals, e.length);
+
+         // zeroize test
+         for (int z = 0; z < e.length; z += 2) {
+            e[z].zeroize();
+            vals[z] = 0;
+         }
+
+         check(e, vals, e.length);
+      }
+   }
+
+   private void generateAscending(Random r, Float64Element[] e, double[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         double val = r.nextDouble();
+         Float64Element el = e[i];
+         el.setValue(val);
+         expectedVals[i] = val;
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            (Double) expectedVals[i], el.getValue());
+      }
+   }
+
+   private void generateDescending(Random r, Float64Element[] e, double[] expectedVals, int length) {
+      for (int i = length - 1; i >= 0; i--) {
+         double val = r.nextDouble();
+         Float64Element el = e[i];
+         el.setValue(val);
+         expectedVals[i] = val;
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            Double.toHexString(expectedVals[i]), Double.toHexString(el.getValue()));
+      }
+   }
+
+   private void check(Float64Element[] e, double[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         Float64Element el = e[i];
+         Assert.assertEquals(
+            String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            (Double) expectedVals[i], e[i].getValue());
+
+         String v = Double.toString(expectedVals[i]);
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()), v,
+            el.valueOf());
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java
new file mode 100644
index 0000000..f5a7b32
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class IntegerElementTest {
+
+   @Test
+   public void test1BitInts() {
+      createTest(1);
+   }
+
+   @Test
+   public void test2BitInts() {
+      createTest(2);
+   }
+
+   @Test
+   public void test3BitInts() {
+      createTest(3);
+   }
+
+   @Test
+   public void test4BitInts() {
+      createTest(4);
+   }
+
+   @Test
+   public void test5BitInts() {
+      createTest(5);
+   }
+
+   @Test
+   public void test6BitInts() {
+      createTest(6);
+   }
+
+   @Test
+   public void test7BitInts() {
+      createTest(7);
+   }
+
+   @Test
+   public void test8BitInts() {
+      createTest(8);
+   }
+
+   @Test
+   public void test9BitInts() {
+      createTest(9);
+   }
+
+   @Test
+   public void test10BitInts() {
+      createTest(10);
+   }
+
+   @Test
+   public void test11BitInts() {
+      createTest(11);
+   }
+
+   @Test
+   public void test12BitInts() {
+      createTest(12);
+   }
+
+   @Test
+   public void test13BitInts() {
+      createTest(13);
+   }
+
+   @Test
+   public void test14BitInts() {
+      createTest(14);
+   }
+
+   @Test
+   public void test15BitInts() {
+      createTest(15);
+   }
+
+   @Test
+   public void test16BitInts() {
+      createTest(16);
+   }
+
+   @Test
+   public void test17BitInts() {
+      createTest(17);
+   }
+
+   @Test
+   public void test18BitInts() {
+      createTest(18);
+   }
+
+   @Test
+   public void test19BitInts() {
+      createTest(19);
+   }
+
+   @Test
+   public void test20BitInts() {
+      createTest(20);
+   }
+
+   @Test
+   public void test21BitInts() {
+      createTest(21);
+   }
+
+   @Test
+   public void test22BitInts() {
+      createTest(22);
+   }
+
+   @Test
+   public void test23BitInts() {
+      createTest(23);
+   }
+
+   @Test
+   public void test24BitInts() {
+      createTest(24);
+   }
+
+   @Test
+   public void test25BitInts() {
+      createTest(25);
+   }
+
+   @Test
+   public void test26BitInts() {
+      createTest(26);
+   }
+
+   @Test
+   public void test27BitInts() {
+      createTest(27);
+   }
+
+   @Test
+   public void test28BitInts() {
+      createTest(28);
+   }
+
+   @Test
+   public void test29BitInts() {
+      createTest(29);
+   }
+
+   @Test
+   public void test30BitInts() {
+      createTest(30);
+   }
+
+   @Test
+   public void test32BitInts() {
+      createTest(32);
+   }
+
+   private void createTest(int width) {
+      final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 2, 64));
+      IntegerElement[] e = new IntegerElement[32];
+      for (int a = 0; a < 8; a++) {
+         for (int i = 0; i < width; i++) {
+            int count = 0;
+            int j;
+            // fill all bits before the first Integer Element with 1 bit elements
+            for (int k = 0; k < i; k++) {
+               e[count++] = new IntegerElement(null, "Element@" + k, hd, a, k, k);
+            }
+            for (j = i; j < 33 - width; j += width) {
+               e[count++] = new IntegerElement(null, "Element@" + j, hd, a, j, j + width - 1);
+            }
+            // fill remaining bits with 1 bit signals
+            for (int k = j; k < 32; k++) {
+               e[count++] = new IntegerElement(null, "Element@" + k, hd, a, k, k);
+            }
+            int[] expectedVals = new int[count];
+            Random r = new Random(System.currentTimeMillis());
+
+            for (int l = 0; l <= 255; l++) {
+               /*
+                * perform sets going through the array. We do this so that we can catch sets that modified bits before
+                * the element
+                */
+               generateAscending(r, e, expectedVals, count);
+               check(e, expectedVals, count);
+
+               /*
+                * perform sets going backwards through the array. We do this so that we can catch sets that modified
+                * bits after the element
+                */
+               generateDescending(r, e, expectedVals, count);
+               check(e, expectedVals, count);
+
+               // zeroize test
+               for (int z = 0; z < count; z += 2) {
+                  e[z].zeroize();
+                  expectedVals[z] = 0;
+               }
+
+               check(e, expectedVals, count);
+            }
+         }
+      }
+   }
+
+   private void generateAscending(Random r, IntegerElement[] e, int[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         int val = r.nextInt();
+         IntegerElement el = e[i];
+         el.setValue(val);
+         int width = el.getLsb() - el.getMsb() + 1;
+         if (width < 32) {
+            expectedVals[i] = val & (1 << width) - 1;
+         } else {
+            expectedVals[i] = val;
+         }
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            (Integer) expectedVals[i], el.getValue());
+      }
+   }
+
+   private void generateDescending(Random r, IntegerElement[] e, int[] expectedVals, int length) {
+      for (int i = length - 1; i >= 0; i--) {
+         int val = r.nextInt();
+         IntegerElement el = e[i];
+         el.setValue(val);
+         int width = el.getLsb() - el.getMsb() + 1;
+         if (width < 32) {
+            expectedVals[i] = val & (1 << width) - 1;
+         } else {
+            expectedVals[i] = val;
+         }
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            Long.toHexString(expectedVals[i]), Long.toHexString(el.getValue()));
+      }
+   }
+
+   private void check(IntegerElement[] e, int[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         IntegerElement el = e[i];
+         Assert.assertEquals(
+            String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            (Integer) expectedVals[i], el.getValue());
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java
new file mode 100644
index 0000000..6bcc5c5
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LongIntegerElementTest {
+   @Test
+   public void test1BitInts() {
+      createLongIntTest(1);
+   }
+
+   @Test
+   public void test2BitInts() {
+      createLongIntTest(2);
+   }
+
+   @Test
+   public void test3BitInts() {
+      createLongIntTest(3);
+   }
+
+   @Test
+   public void test4BitInts() {
+      createLongIntTest(4);
+   }
+
+   @Test
+   public void test5BitInts() {
+      createLongIntTest(5);
+   }
+
+   @Test
+   public void test8BitInts() {
+      createLongIntTest(8);
+   }
+
+   @Test
+   public void test10BitInts() {
+      createLongIntTest(10);
+   }
+
+   @Test
+   public void test12BitInts() {
+      createLongIntTest(12);
+   }
+
+   @Test
+   public void test16BitInts() {
+      createLongIntTest(16);
+   }
+
+   @Test
+   public void test20BitInts() {
+      createLongIntTest(20);
+   }
+
+   @Test
+   public void test22BitInts() {
+      createLongIntTest(22);
+   }
+
+   @Test
+   public void test24BitInts() {
+      createLongIntTest(24);
+   }
+
+   @Test
+   public void test25BitInts() {
+      createLongIntTest(25);
+   }
+
+   @Test
+   public void test26BitInts() {
+      createLongIntTest(26);
+   }
+
+   @Test
+   public void test27BitInts() {
+      createLongIntTest(27);
+   }
+
+   @Test
+   public void test30BitInts() {
+      createLongIntTest(30);
+   }
+
+   @Test
+   public void test31BitInts() {
+      createLongIntTest(31);
+   }
+
+   @Test
+   public void test32BitInts() {
+      createLongIntTest(32);
+   }
+
+   @Test
+   public void test40BitInts() {
+      createLongIntTest(40);
+   }
+
+   @Test
+   public void test48BitInts() {
+      createLongIntTest(48);
+   }
+
+   @Test
+   public void test50BitInts() {
+      createLongIntTest(50);
+   }
+
+   @Test
+   public void test64BitInts() {
+      createLongIntTest(64);
+   }
+
+   private void createLongIntTest(int width) {
+      LongIntegerElement[] e = new LongIntegerElement[64];
+      for (int a = 0; a < 4; a++) {
+         final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], a, 64));
+         for (int i = 0; i < width; i++) {
+            int count = 0;
+            int j;
+            for (int k = 0; k < i; k++) {
+               e[count++] = new LongIntegerElement(null, "Element@" + k, hd, 0, k, k);
+            }
+            for (j = i; j < 65 - width; j += width) {
+               e[count++] = new LongIntegerElement(null, "Element@" + j, hd, 0, j, j + width - 1);
+            }
+            // fill remaining bits with 1 bit signals
+            for (int k = j; k < 64; k++) {
+               e[count++] = new LongIntegerElement(null, "Element@" + k, hd, 0, k, k);
+            }
+            long[] expectedVals = new long[count];
+            Random r = new Random(System.currentTimeMillis());
+
+            for (int l = 0; l <= 1024; l++) {
+               /*
+                * perform sets going through the array. We do this so that we can catch sets that modified bits before
+                * the element
+                */
+               generateAscending(r, e, expectedVals, count);
+               check(e, expectedVals, count);
+
+               /*
+                * perform sets going backwards through the array. We do this so that we can catch sets that modified
+                * bits after the element
+                */
+               generateDescending(r, e, expectedVals, count);
+               check(e, expectedVals, count);
+
+               // zeroize test
+               for (int z = 0; z < count; z += 2) {
+                  e[z].zeroize();
+                  expectedVals[z] = 0;
+               }
+
+               check(e, expectedVals, count);
+            }
+         }
+      }
+   }
+
+   private void generateAscending(Random r, LongIntegerElement[] e, long[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         long val = r.nextLong();
+         LongIntegerElement el = e[i];
+         el.setValue(val);
+         int width = el.getLsb() - el.getMsb() + 1;
+         if (width < 64) {
+            expectedVals[i] = val & (1L << width) - 1L;
+         } else {
+            expectedVals[i] = val;
+         }
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            Long.toHexString(expectedVals[i]), Long.toHexString(el.getValue()));
+      }
+   }
+
+   private void generateDescending(Random r, LongIntegerElement[] e, long[] expectedVals, int length) {
+      for (int i = length - 1; i >= 0; i--) {
+         long val = r.nextLong();
+         LongIntegerElement el = e[i];
+         el.setValue(val);
+         int width = el.getLsb() - el.getMsb() + 1;
+         if (width < 64) {
+            expectedVals[i] = val & (1l << width) - 1l;
+         } else {
+            expectedVals[i] = val;
+         }
+         Assert.assertEquals(
+            String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            (Long) expectedVals[i], el.getValue());
+      }
+   }
+
+   private void check(LongIntegerElement[] e, long[] expectedVals, int length) {
+      for (int i = 0; i < length; i++) {
+         LongIntegerElement el = e[i];
+         Assert.assertEquals(
+            String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+            (Long) expectedVals[i], e[i].getValue());
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/RecordMapTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/RecordMapTest.java
new file mode 100644
index 0000000..255927d
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/RecordMapTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RecordMapTest {
+
+   @Test
+   public void testGetInt() {
+      TestMessage msg = new TestMessage();
+
+      // Testing below the boundary.
+      try {
+         msg.RECORD_MAP_1.get(1);
+         Assert.assertTrue(true);
+      } catch (IllegalArgumentException ex) {
+         Assert.fail("We shouldn't get an exception for this get!");
+      }
+
+      // Testing on the boundary.
+      try {
+         msg.RECORD_MAP_1.get(2);
+         Assert.fail("We should get an exception for this get on the boundary!");
+      } catch (IllegalArgumentException ex) {
+         Assert.assertTrue("We should get an exception for this index", true);
+      }
+      // Testing above the boundary.
+      try {
+         msg.RECORD_MAP_1.get(3);
+         Assert.fail("We should get an exception for this get above the boundary!");
+      } catch (IllegalArgumentException ex) {
+         Assert.assertTrue("We should get an exception for this index", true);
+      }
+
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/SignedInteger16ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/SignedInteger16ElementTest.java
new file mode 100644
index 0000000..59ff96a
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/SignedInteger16ElementTest.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SignedInteger16ElementTest {
+
+   @Test
+   public void test1() {
+      final HeaderData hd1 = new HeaderData("test_data 1", new MemoryResource(new byte[64], 0, 64));
+      final HeaderData hd2 = new HeaderData("test_data 2", new MemoryResource(new byte[64], 2, 64));
+      SignedInteger16Element element1 = new SignedInteger16Element(null, "Element1", hd1, 0, 0, 15);
+      SignedInteger16Element element2 = new SignedInteger16Element(null, "Element2", hd2, 0, 0, 15);
+
+      int val1 = -1000;
+      int val2 = 2000;
+      element1.setValue(val1);
+      check(element1, val1);
+      element1.setValue(val2);
+      check(element1, val2);
+
+      element2.setValue(val1);
+      check(element2, val1);
+      element2.setValue(val2);
+      check(element2, val2);
+   }
+
+   @Test
+   public void test2() {
+      final HeaderData hd1 = new HeaderData("test_data 1", new MemoryResource(new byte[64], 0, 64));
+      final HeaderData hd2 = new HeaderData("test_data 2", new MemoryResource(new byte[64], 2, 64));
+      SignedInteger16Element element1 = new SignedInteger16Element(null, "Element1", hd1, 0, 16, 31);
+      SignedInteger16Element element2 = new SignedInteger16Element(null, "Element2", hd2, 0, 16, 31);
+
+      int val1 = -10000;
+      int val2 = 2100;
+      element1.setValue(val1);
+      check(element1, val1);
+      element1.setValue(val2);
+      check(element1, val2);
+
+      element2.setValue(val1);
+      check(element2, val1);
+      element2.setValue(val2);
+      check(element2, val2);
+   }
+
+   private void check(SignedInteger16Element e, int expectedVals) {
+      Assert.assertEquals(
+         String.format("corruption detect on %s: msb=%d, lsb=%d", e.getName(), e.getMsb(), e.getLsb()),
+         (Integer) expectedVals, e.getValue());
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/StringElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/StringElementTest.java
new file mode 100644
index 0000000..1123f80
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/StringElementTest.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import static org.junit.Assert.assertEquals;
+import java.util.Arrays;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StringElementTest {
+   @Test
+   public void testZeroize() {
+      for (int i = 0; i < 10; i++) {
+         final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[128], i, 128));
+         StringElement e1 = new StringElement(null, "test string1", hd, 0, 0, 8 * 10 - 1);
+         StringElement e2 = new StringElement(null, "test string2", hd, 10, 0, 8 * 10 - 1);
+         StringElement e3 = new StringElement(null, "test string3", hd, 20, 0, 8 * 10 - 1);
+
+         String s1 = "aaaa bb  c";
+         String s2 = "zeroizing2";
+         String s3 = "1234567890";
+
+         e1.setValue(s1);
+         e2.setValue(s2);
+         e3.setValue(s3);
+
+         check(e1, s1);
+         check(e2, s2);
+         check(e3, s3);
+
+         e2.zeroize();
+         checkEmpty(e2);
+
+         check(e1, s1);
+         check(e2, "");
+         check(e3, s3);
+
+         e2.setValue(s2);
+         e1.zeroize();
+         checkEmpty(e1);
+
+         check(e1, "");
+         check(e2, s2);
+         check(e3, s3);
+
+         e1.setValue(s1);
+         e3.zeroize();
+
+         check(e1, s1);
+         check(e2, s2);
+         check(e3, "");
+      }
+   }
+
+   @Test
+   public void testStringsTooBig() {
+      for (int i = 0; i < 10; i++) {
+         final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[128], i, 128));
+
+         String s1 = "aaaa bb  c";
+         String s2 = "zeroizing2";
+         String s3 = "1234567890";
+         for (int j = 1; j < 10; j++) {
+            StringElement e1 = new StringElement(null, "test string1", hd, 0, 0, 8 * j - 1);
+            StringElement e2 = new StringElement(null, "test string2", hd, 10, 0, 8 * j - 1);
+            StringElement e3 = new StringElement(null, "test string3", hd, 20, 0, 8 * j - 1);
+
+            e1.setValue(s1);
+            e2.setValue(s2);
+            e3.setValue(s3);
+
+            check(e1, s1.substring(0, j));
+            check(e2, s2.substring(0, j));
+            check(e3, s3.substring(0, j));
+
+            e3.setValue(s3);
+            e2.setValue(s2);
+            e1.setValue(s1);
+
+            check(e1, s1.substring(0, j));
+            check(e2, s2.substring(0, j));
+            check(e3, s3.substring(0, j));
+         }
+      }
+   }
+
+   @Test
+   public void testStringsTooSmall() {
+      for (int i = 0; i < 10; i++) {
+         final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[128], i, 128));
+         StringElement e1 = new StringElement(null, "test string1", hd, 0, 0, 8 * 10 - 1);
+         StringElement e2 = new StringElement(null, "test string2", hd, 10, 0, 8 * 10 - 1);
+         StringElement e3 = new StringElement(null, "test string3", hd, 20, 0, 8 * 10 - 1);
+         String ss1 = "aaaa bb  c";
+         String ss2 = "zeroizing2";
+         String ss3 = "1234567890";
+         for (int j = 1; j <= 10; j++) {
+            String s1 = ss1.substring(0, j);
+            String s2 = ss2.substring(0, j);
+            String s3 = ss3.substring(0, j);
+            e1.setValue(s1);
+            e2.setValue(s2);
+            e3.setValue(s3);
+
+            check(e1, s1);
+            check(e2, s2);
+            check(e3, s3);
+
+            e3.setValue(s3);
+            e2.setValue(s2);
+            e1.setValue(s1);
+
+            check(e1, s1);
+            check(e2, s2);
+            check(e3, s3);
+         }
+      }
+   }
+
+   @Test
+   public void testSetChars() {
+      final char[] testData = {'A', 'B', '\0', 'C', 'D'};
+      final MessageData hd = new HeaderData("test_data", new MemoryResource(new byte[5], 0, 5));
+      final StringElement sut = new StringElement(null, "test string element", hd, 0, 0, 8 * 5 - 1);
+      assertEquals("Empty string to start", "", sut.getValue());
+      sut.setChars(testData);
+      assertEquals("New value is cut off by the null", "AB", sut.getValue());
+      char[] result = new char[5];
+      assertEquals("Five bytes in, five bytes back", 5, sut.getChars(result));
+      assertEquals("Exact same array comes back with getChars()", Arrays.toString(testData), Arrays.toString(result));
+   }
+
+   @Test
+   public void testSetCharsOverflow() {
+      final char[] testData = {'A', 'B', '\0', 'C', 'D', 'E'};
+      // buffer is big enough for test data
+      final MessageData hd = new HeaderData("test_data", new MemoryResource(new byte[6], 0, 6));
+      // element is not big enough for test data
+      final StringElement sut = new StringElement(null, "test string element", hd, 0, 0, 8 * 5 - 1);
+      assertEquals("Empty string to start", "", sut.getValue());
+      sut.setChars(testData);
+      assertEquals("New value is cut off by the null", "AB", sut.getValue());
+      char[] result = new char[5];
+      assertEquals("Five bytes in, five bytes back", 5, sut.getChars(result));
+      final char[] expected = {'A', 'B', '\0', 'C', 'D'};
+      assertEquals("Exact same array comes back with getChars()", Arrays.toString(expected), Arrays.toString(result));
+   }
+
+   @Test
+   public void testSetCharsUnderflow() {
+      final char[] testData = {'A', 'B', '\0', 'C'};
+      // buffer is big enough for test data
+      final MessageData hd = new HeaderData("test_data", new MemoryResource(new byte[5], 0, 5));
+      // element is not big enough for test data
+      final StringElement sut = new StringElement(null, "test string element", hd, 0, 0, 8 * 5 - 1);
+      assertEquals("Empty string to start", "", sut.getValue());
+      sut.setChars(testData);
+      assertEquals("New value is cut off by the null", "AB", sut.getValue());
+      char[] result = new char[5];
+      assertEquals("Five bytes in, five bytes back", 5, sut.getChars(result));
+      final char[] expected = {'A', 'B', '\0', 'C', '\0'};
+      assertEquals("Exact same array comes back with getChars()", Arrays.toString(expected), Arrays.toString(result));
+   }
+
+   private void check(StringElement elem, String value) {
+      if (!elem.getValue().equals(value)) {
+         Assert.assertEquals(elem.getName(), value, elem.getValue());
+      }
+   }
+
+   private void checkEmpty(StringElement elem) {
+      if (!elem.isEmpty()) {
+         Assert.assertEquals(elem.getName(), "rmpty", "not empty");
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/ISequenceHandle.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/ISequenceHandle.java
new file mode 100644
index 0000000..6c5b425
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/ISequenceHandle.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.message.mock;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISequenceHandle {
+   boolean waitForEndSequence(long timoeut, TimeUnit timeUnit) throws InterruptedException;
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/SequenceHandle.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/SequenceHandle.java
new file mode 100644
index 0000000..4b51008
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/SequenceHandle.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.message.mock;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class SequenceHandle implements ISequenceHandle {
+
+   private final ReentrantLock lock = new ReentrantLock();
+   private final Condition endSequenceCondition = lock.newCondition();
+   private boolean endSequence = false;
+
+   @Override
+   public boolean waitForEndSequence(long timeout, TimeUnit timeUnit) throws InterruptedException {
+      lock.lock();
+      long nanos = timeUnit.toNanos(timeout);
+      try {
+         while (!endSequence) {
+            if (nanos > 0) {
+               nanos = endSequenceCondition.awaitNanos(nanos);
+            } else {
+               return false;
+            }
+         }
+         return true;
+      } finally {
+         lock.unlock();
+      }
+   }
+
+   void signalEndSequence() {
+      lock.lock();
+      try {
+         endSequence = true;
+         endSequenceCondition.signalAll();
+      } finally {
+         lock.unlock();
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestEnum.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestEnum.java
new file mode 100644
index 0000000..34b0192
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestEnum.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.message.mock;
+
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public enum TestEnum implements IEnumValue<TestEnum> {
+   VAL_0,
+   VAL_1,
+   VAL_2,
+   VAL_3,
+   VAL_4,
+   VAL_5,
+   VAL_6,
+   VAL_7,
+   VAL_8,
+   VAL_9,
+   VAL_10;
+
+   @Override
+   public TestEnum getEnum(int value) {
+      if (value < 0 || value >= values().length) {
+         throw new IllegalArgumentException("no enum matching value of " + value);
+      }
+      return values()[value];
+   }
+
+   @Override
+   public int getIntValue() {
+      return ordinal();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMemType.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMemType.java
new file mode 100644
index 0000000..8d7d94e
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMemType.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.message.mock;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum TestMemType implements DataType {
+   ETHERNET,
+   SERIAL;
+
+   @Override
+   public int getToolingBufferSize() {
+      return 0;
+   }
+
+   @Override
+   public int getToolingDepth() {
+      return 0;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessage.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessage.java
new file mode 100644
index 0000000..7172e89
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessage.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.message.mock;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.eclipse.osee.ote.message.elements.IRecordFactory;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.elements.RecordMap;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class TestMessage extends Message<UnitTestAccessor, TestMessageData, TestMessage> {
+
+   public final IntegerElement INT_ELEMENT_1;
+   public final StringElement STRING_ELEMENT_1;
+   public final EnumeratedElement<TestEnum> ENUM_ELEMENT_1;
+   public final Float32Element FLOAT32_ELEMENT_1;
+   public final RecordMap<TestRecordElement> RECORD_MAP_1;
+
+   public TestMessage() {
+      super("TEST_MSG", 100, 0, true, 0, 50.0);
+      TestMessageData ethData =
+         new TestMessageData(this.getClass().getName(), getName(), getDefaultByteSize(), getDefaultOffset(),
+            TestMemType.ETHERNET);
+      new TestMessageData(this.getClass().getName(), getName(), getDefaultByteSize(), getDefaultOffset(),
+         TestMemType.SERIAL);
+      setDefaultMessageData(ethData);
+      INT_ELEMENT_1 = new IntegerElement(this, "INT_ELEMENT_1", ethData, 0, 0, 15);
+      STRING_ELEMENT_1 = new StringElement(this, "STRING_ELEMENT_1", ethData, 2, 0, 159);
+      ENUM_ELEMENT_1 = new EnumeratedElement<>(this, "ENUM_ELEMENT_1", TestEnum.class, ethData, 22, 0, 7);
+      FLOAT32_ELEMENT_1 = new Float32Element(this, "FLOAT32_ELEMENT_1", ethData, 23, 0, 31);
+      RECORD_MAP_1 =
+         new RecordMap<TestRecordElement>(this, ethData, "RECORD_MAP_1", 2, new RECORD_MAP_1_factory(ethData));
+      addElements(INT_ELEMENT_1, STRING_ELEMENT_1, ENUM_ELEMENT_1, FLOAT32_ELEMENT_1, RECORD_MAP_1);
+      setMemSource(TestMemType.ETHERNET);
+   }
+
+   @Override
+   public void switchElementAssociation(Collection<TestMessage> messages) {
+
+   }
+
+   public class RECORD_MAP_1_factory implements IRecordFactory {
+      private final MessageData data;
+
+      public RECORD_MAP_1_factory(MessageData data) {
+         this.data = data;
+      }
+
+      @Override
+      public RecordElement create(int i) {
+         TestRecordElement temp =
+            new TestRecordElement(TestMessage.this, "RECORD_MAP_1", i, getBitOffset() + 0, this.data);
+         temp.addPath(RECORD_MAP_1.getElementPath().toArray());
+         return temp;
+      }
+
+      @Override
+      public int getBitLength() {
+         return 512;
+      }
+
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessageData.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessageData.java
new file mode 100644
index 0000000..3bfdb01
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessageData.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.ote.message.mock;
+
+import org.eclipse.osee.ote.message.IMessageHeader;
+import org.eclipse.osee.ote.message.data.IMessageDataVisitor;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public class TestMessageData extends MessageData {
+
+   public TestMessageData(String typeName, String name, int dataByteSize, int offset, DataType memType) {
+      super(typeName, name, dataByteSize, offset, memType);
+   }
+
+   @Override
+   public IMessageHeader getMsgHeader() {
+      return null;
+   }
+
+   @Override
+   public void initializeDefaultHeaderValues() {
+
+   }
+
+   @Override
+   public void visit(IMessageDataVisitor visitor) {
+
+   }
+
+   @Override
+   public void zeroize() {
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestRecordElement.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestRecordElement.java
new file mode 100644
index 0000000..f545a34
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestRecordElement.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.message.mock;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+
+public class TestRecordElement extends RecordElement {
+
+   public TestRecordElement(Message message, String name, int index, int bitOffset, MessageData messageData) {
+      super(message, name, index, messageData, bitOffset, 152);
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestAccessor.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestAccessor.java
new file mode 100644
index 0000000..4969cd4
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestAccessor.java
@@ -0,0 +1,668 @@
+/*******************************************************************************
+ * 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.message.mock;
+
+import java.util.HashMap;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Filter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.ReportDataControl;
+import org.eclipse.osee.ote.core.environment.ScriptControl;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.interfaces.BasicTimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IReportData;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.log.ITestPointTally;
+import org.eclipse.osee.ote.core.log.TestLogger;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+public class UnitTestAccessor implements ITestEnvironmentMessageSystemAccessor, ITestAccessor {
+   private final HashMap<EnvironmentTask, ScheduledFuture<?>> handleMap =
+         new HashMap<EnvironmentTask, ScheduledFuture<?>>(32);
+   private final ScheduledExecutorService executor =
+         Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
+   private final IScriptControl scriptCtrl = new ScriptControl();
+   private final IReportData reportData = new ReportDataControl();
+   private final ITestLogger testLogger = new TestLogger() {
+
+      @Override
+      public void attention(ITestEnvironmentAccessor source, String message) {
+
+      }
+
+      @Override
+      public void debug(ITestEnvironmentAccessor source, String message, boolean timeStamp) {
+
+      }
+
+      @Override
+      public void debug(ITestEnvironmentAccessor source, String message) {
+
+      }
+
+      @Override
+      public void log(TestRecord record) {
+
+      }
+
+      @Override
+      public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments, int methodCount) {
+
+      }
+
+      @Override
+      public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments) {
+
+      }
+
+      @Override
+      public void methodCalled(ITestEnvironmentAccessor source) {
+
+      }
+
+      @Override
+      public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments, int methodCount) {
+
+      }
+
+      @Override
+      public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject) {
+
+      }
+
+      @Override
+      public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat) {
+
+      }
+
+      @Override
+      public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName) {
+
+      }
+
+      @Override
+      public void methodEnded(ITestEnvironmentAccessor source) {
+
+      }
+
+      @Override
+      public void requirement(ITestEnvironmentAccessor source, String message) {
+
+      }
+
+      @Override
+      public void severe(ITestEnvironmentAccessor source, String message) {
+
+      }
+
+      @Override
+      public void severe(Object source, Throwable thrown) {
+
+      }
+
+      @Override
+      public void support(ITestEnvironmentAccessor source, String message) {
+
+      }
+
+      @Override
+      public void testCaseBegan(TestCase testCase) {
+
+      }
+
+      @Override
+      public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, boolean passed, String testPointName, String exp, String act) {
+
+      }
+
+      @Override
+      public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, ITestPoint testPoint) {
+
+      }
+
+      @Override
+      public void testpoint(TestPointRecord record) {
+
+      }
+
+      @Override
+      public void warning(ITestEnvironmentAccessor source, String message) {
+
+      }
+
+      @Override
+      public synchronized void addHandler(Handler handler) throws SecurityException {
+
+      }
+
+      @Override
+      public void config(String msg) {
+
+      }
+
+      @Override
+      public void entering(String sourceClass, String sourceMethod) {
+
+      }
+
+      @Override
+      public void entering(String sourceClass, String sourceMethod, Object param1) {
+
+      }
+
+      @Override
+      public void entering(String sourceClass, String sourceMethod, Object[] params) {
+
+      }
+
+      @Override
+      public void exiting(String sourceClass, String sourceMethod) {
+
+      }
+
+      @Override
+      public void exiting(String sourceClass, String sourceMethod, Object result) {
+
+      }
+
+      @Override
+      public void fine(String msg) {
+
+      }
+
+      @Override
+      public void finer(String msg) {
+
+      }
+
+      @Override
+      public void finest(String msg) {
+
+      }
+
+      @Override
+      public Filter getFilter() {
+         return super.getFilter();
+      }
+
+      @Override
+      public synchronized Handler[] getHandlers() {
+         return super.getHandlers();
+      }
+
+      @Override
+      public Level getLevel() {
+         return super.getLevel();
+      }
+
+      @Override
+      public String getName() {
+         return super.getName();
+      }
+
+      @Override
+      public Logger getParent() {
+         return super.getParent();
+      }
+
+      @Override
+      public ResourceBundle getResourceBundle() {
+         return super.getResourceBundle();
+      }
+
+      @Override
+      public String getResourceBundleName() {
+         return super.getResourceBundleName();
+      }
+
+      @Override
+      public synchronized boolean getUseParentHandlers() {
+         return super.getUseParentHandlers();
+      }
+
+      @Override
+      public void info(String msg) {
+         super.info(msg);
+      }
+
+      @Override
+      public boolean isLoggable(Level level) {
+         return super.isLoggable(level);
+      }
+
+      @Override
+      public void log(LogRecord record) {
+         super.log(record);
+      }
+
+      @Override
+      public void log(Level level, String msg) {
+         super.log(level, msg);
+      }
+
+      @Override
+      public void log(Level level, String msg, Object param1) {
+         super.log(level, msg, param1);
+      }
+
+      @Override
+      public void log(Level level, String msg, Object[] params) {
+         super.log(level, msg, params);
+      }
+
+      @Override
+      public void log(Level level, String msg, Throwable thrown) {
+         super.log(level, msg, thrown);
+      }
+
+      @Override
+      public void logp(Level level, String sourceClass, String sourceMethod, String msg) {
+         super.logp(level, sourceClass, sourceMethod, msg);
+      }
+
+      @Override
+      public void logp(Level level, String sourceClass, String sourceMethod, String msg, Object param1) {
+         super.logp(level, sourceClass, sourceMethod, msg, param1);
+      }
+
+      @Override
+      public void logp(Level level, String sourceClass, String sourceMethod, String msg, Object[] params) {
+         super.logp(level, sourceClass, sourceMethod, msg, params);
+      }
+
+      @Override
+      public void logp(Level level, String sourceClass, String sourceMethod, String msg, Throwable thrown) {
+         super.logp(level, sourceClass, sourceMethod, msg, thrown);
+      }
+
+      @Override
+      public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg) {
+         super.logrb(level, sourceClass, sourceMethod, bundleName, msg);
+      }
+
+      @Override
+      public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object param1) {
+         super.logrb(level, sourceClass, sourceMethod, bundleName, msg, param1);
+      }
+
+      @Override
+      public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object[] params) {
+         super.logrb(level, sourceClass, sourceMethod, bundleName, msg, params);
+      }
+
+      @Override
+      public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Throwable thrown) {
+         super.logrb(level, sourceClass, sourceMethod, bundleName, msg, thrown);
+      }
+
+      @Override
+      public synchronized void removeHandler(Handler handler) throws SecurityException {
+         super.removeHandler(handler);
+      }
+
+      @Override
+      public void setFilter(Filter newFilter) throws SecurityException {
+         super.setFilter(newFilter);
+      }
+
+      @Override
+      public void setLevel(Level newLevel) throws SecurityException {
+         super.setLevel(newLevel);
+      }
+
+      @Override
+      public void setParent(Logger parent) {
+         super.setParent(parent);
+      }
+
+      @Override
+      public synchronized void setUseParentHandlers(boolean useParentHandlers) {
+         super.setUseParentHandlers(useParentHandlers);
+      }
+
+      @Override
+      public void severe(String msg) {
+         super.severe(msg);
+      }
+
+      @Override
+      public void throwing(String sourceClass, String sourceMethod, Throwable thrown) {
+         super.throwing(sourceClass, sourceMethod, thrown);
+      }
+
+      @Override
+      public void warning(String msg) {
+         super.warning(msg);
+      }
+
+      @Override
+      protected Object clone() throws CloneNotSupportedException {
+         return super.clone();
+      }
+
+      @Override
+      public boolean equals(Object obj) {
+         return super.equals(obj);
+      }
+
+      @Override
+      protected void finalize() throws Throwable {
+         super.finalize();
+      }
+
+      @Override
+      public int hashCode() {
+         return super.hashCode();
+      }
+
+      @Override
+      public String toString() {
+         return super.toString();
+      }
+
+   };
+
+   private final ITimerControl timerCtrl = new ITimerControl() {
+
+      @Override
+      public void addTask(final EnvironmentTask task, TestEnvironment environment) {
+         final ScheduledFuture<?> handle = schedulePeriodicTask(new Runnable() {
+            @Override
+            public void run() {
+
+               try {
+                  if (task.isRunning()) {
+                     task.runOneCycle();
+                  }
+               } catch (Throwable ex) {
+                  ScheduledFuture<?> h = handleMap.get(task);
+                  if (h != null) {
+                     h.cancel(false);
+                  }
+                  ex.printStackTrace(System.err);
+               }
+            }
+
+         }, 0, (long) Math.rint(1000.0 / task.getHzRate()));
+         handleMap.put(task, handle);
+      }
+
+      @Override
+      public void cancelAllTasks() {
+         for (ScheduledFuture<?> handle : handleMap.values()) {
+            handle.cancel(false);
+         }
+         handleMap.clear();
+      }
+
+      @Override
+      public void cancelTimers() {
+         executor.shutdown();
+      }
+
+      @Override
+      public void dispose() {
+
+      }
+
+      @Override
+      public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+         synchronized (obj) {
+            obj.wait(milliseconds);
+         }
+      }
+
+      @Override
+      public void envWait(int milliseconds) throws InterruptedException {
+         envWait(new BasicTimeout(), milliseconds);
+      }
+
+      @Override
+      public int getCycleCount() {
+         return (int) System.currentTimeMillis() / 20;
+      }
+
+      @Override
+      public long getEnvTime() {
+         return System.currentTimeMillis();
+      }
+
+      @Override
+      public void incrementCycleCount() {
+
+      }
+
+      @Override
+      public void removeTask(final EnvironmentTask task) {
+         ScheduledFuture<?> handle = handleMap.remove(task);
+         if (handle != null) {
+            handle.cancel(false);
+         }
+      }
+
+      @Override
+      public void setCycleCount(int cycle) {
+
+      }
+
+      @Override
+      public ICancelTimer setTimerFor(final ITimeout objToNotify, int milliseconds) {
+         objToNotify.setTimeout(false);
+         final ScheduledFuture<?> handle = scheduleOneShotTask(new Runnable() {
+
+            @Override
+            public void run() {
+               synchronized (objToNotify) {
+                  objToNotify.setTimeout(true);
+                  objToNotify.notify();
+               }
+            }
+         }, milliseconds);
+
+         return new ICancelTimer() {
+
+            @Override
+            public void cancelTimer() {
+               handle.cancel(false);
+            }
+         };
+      }
+
+      @Override
+      public void step() {
+
+      }
+
+      @Override
+      public long getTimeOfDay() {
+         return 0;
+      }
+
+      @Override
+      public void setRunManager(IRunManager runManager) {
+      }
+
+      @Override
+      public IRunManager getRunManager() {
+         return null;
+      }
+
+      @Override
+      public boolean isRealtime() {
+         return false;
+      }
+
+   };
+
+   public UnitTestAccessor() {
+
+   }
+
+   @Override
+   public IMessageManager getMsgManager() {
+      return null;
+   }
+
+   @Override
+   public boolean isPhysicalTypeAvailable(DataType physicalType) {
+      return physicalType == TestMemType.ETHERNET;
+   }
+
+   @Override
+   public void abortTestScript() {
+
+   }
+
+   @Override
+   public void abortTestScript(Throwable t) {
+
+   }
+
+   @Override
+   public boolean addTask(final EnvironmentTask task) {
+      timerCtrl.addTask(task, null);
+      return true;
+   }
+
+   public void addRunnable(Runnable r) {
+
+   }
+
+   @Override
+   public void associateObject(Class<?> c, Object obj) {
+
+   }
+
+   @Override
+   public Object getAssociatedObject(Class<?> c) {
+      return null;
+   }
+
+   @Override
+   public Set<Class<?>> getAssociatedObjects() {
+
+      return null;
+   }
+
+   public ITestPointTally getAttachedTestPointTally(TestScript script) {
+
+      return null;
+   }
+
+   @Override
+   public long getEnvTime() {
+      return timerCtrl.getEnvTime();
+   }
+
+   @Override
+   public IExecutionUnitManagement getExecutionUnitManagement() {
+      return null;
+   }
+
+   @Override
+   public ITestLogger getLogger() {
+      return testLogger;
+   }
+
+   @Override
+   public IScriptControl getScriptCtrl() {
+      return scriptCtrl;
+   }
+
+   @Override
+   public TestScript getTestScript() {
+      return null;
+   }
+
+   @Override
+   public ITestStation getTestStation() {
+      return null;
+   }
+
+   @Override
+   public ITimerControl getTimerCtrl() {
+      return timerCtrl;
+   }
+
+   @Override
+   public void onScriptComplete() throws InterruptedException {
+
+   }
+
+   @Override
+   public void onScriptSetup() {
+
+   }
+
+   public void setSequentialCmdFinished(CommandDescription description, CommandEndedStatusEnum status) throws Exception {
+
+   }
+
+   @Override
+   public ICancelTimer setTimerFor(ITimeout listener, int time) {
+      return timerCtrl.setTimerFor(listener, time);
+   }
+
+   public ScheduledFuture<?> schedulePeriodicTask(Runnable task, long initialDelay, long period) {
+      return executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.MILLISECONDS);
+   }
+
+   public ScheduledFuture<?> scheduleOneShotTask(Runnable task, long delay) {
+      return executor.schedule(task, delay, TimeUnit.MILLISECONDS);
+   }
+
+   public void shutdown() {
+      timerCtrl.cancelAllTasks();
+      timerCtrl.cancelTimers();
+   }
+
+   @Override
+   public TestCase getTestCase() {
+
+      return null;
+   }
+
+   @Override
+   public Set<DataType> getDataTypes() {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestSupport.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestSupport.java
new file mode 100644
index 0000000..70fe316
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestSupport.java
@@ -0,0 +1,439 @@
+/*******************************************************************************
+ * 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.message.mock;
+
+import java.util.Random;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import org.junit.Assert;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.core.testPoint.Operation;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+public class UnitTestSupport {
+
+   private final UnitTestAccessor accessor = new UnitTestAccessor();
+   private final Random rand = new Random();
+
+   public UnitTestSupport() {
+
+   }
+
+   public void activateMsg(final TestMessage msg) {
+      accessor.addTask(new EnvironmentTask(msg.getRate(), 0) {
+
+         @Override
+         public void runOneCycle() throws InterruptedException, TestException {
+            TestMessageData data = msg.getActiveDataSource();
+            data.incrementActivityCount();
+            data.notifyListeners();
+
+         }
+
+      });
+   }
+
+   public void cleanup() {
+      accessor.shutdown();
+   }
+
+   public <T extends Comparable<T>> void setAfter(final DiscreteElement<T> element, final T value, int millis) {
+      accessor.scheduleOneShotTask(new Runnable() {
+
+         @Override
+         public void run() {
+            element.setValue(value);
+         }
+
+      }, millis);
+   }
+
+   public <T extends Comparable<T>> void maintain(final DiscreteElement<T> element, final T value, final T postValue, int millis) {
+      element.setValue(value);
+      accessor.scheduleOneShotTask(new Runnable() {
+
+         @Override
+         public void run() {
+            element.setValue(postValue);
+         }
+
+      }, millis);
+   }
+
+   public <T extends Comparable<T>> ISequenceHandle setSequence(final DiscreteElement<T> element, final T[] sequence) throws InterruptedException {
+      final SequenceHandle seqHandle = new SequenceHandle();
+      element.setValue(sequence[0]);
+      IOSEEMessageListener listener = new IOSEEMessageListener() {
+         int index = 1;
+
+         @Override
+         public void onDataAvailable(MessageData data, DataType type) throws MessageSystemException {
+            if (index < sequence.length) {
+               element.setValue(sequence[index]);
+               System.out.println(element.getName() + " is now " + element.getValue());
+               index++;
+            } else {
+               element.getMessage().removeListener(this);
+               seqHandle.signalEndSequence();
+            }
+         }
+
+         @Override
+         public void onInitListener() throws MessageSystemException {
+
+         }
+
+      };
+
+      //  wait for a transmission so that the sequence begins on transimssion edges
+      element.getMessage().waitForTransmission(accessor);
+      element.getMessage().addListener(listener);
+      return seqHandle;
+   }
+
+   public <T extends Comparable<T>> ScheduledFuture<?> maintainRandomizedList(final DiscreteElement<T> element, final T[] values, int millis) {
+      element.setValue(values[0]);
+      return accessor.schedulePeriodicTask(new Runnable() {
+         @Override
+         public void run() {
+            try {
+               element.setValue(selectRandom(values));
+            } catch (Exception e) {
+               e.printStackTrace(System.err);
+            }
+         }
+      }, 0, millis);
+   }
+
+   public <T extends Comparable<T>> void checkRange(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      Assert.assertTrue(element.getName() + ".checkRange()->failed",
+         element.checkRange(accessor, null, minValue, minInclusive, maxValue, maxInclusive, millis));
+   }
+
+   public <T extends Comparable<T>> void checkMaintainRange(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeGrp");
+      T val = element.checkMaintainRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+      Assert.assertTrue(element.getName() + ".checkMaintainRange()->failed, value=" + val.toString(), chkGrp.isPass());
+   }
+
+   public <T extends Comparable<T>> void checkMaintainRangeFail(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeFailGrp");
+      T val = element.checkMaintainRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+      Assert.assertFalse(element.getName() + ".checkMaintainRangeFail()->failed, value=" + val.toString(),
+         chkGrp.isPass());
+   }
+
+   public <T extends Comparable<T>> void checkMaintainNotRange(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeGrp");
+      T val = element.checkMaintainNotRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+      Assert.assertTrue(element.getName() + ".checkMaintainNotRange()->failed, value=" + val.toString(),
+         chkGrp.isPass());
+   }
+
+   public <T extends Comparable<T>> void checkMaintainNotRangeFail(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeGrp");
+      T val = element.checkMaintainNotRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+      Assert.assertFalse(element.getName() + ".checkMaintainNotRangeFail()->failed, value=" + val.toString(),
+         chkGrp.isPass());
+   }
+
+   public <T extends Comparable<T>> void checkRangeFail(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      Assert.assertFalse(element.getName() + ".checkRangeFail()->failed",
+         element.checkRange(accessor, null, minValue, minInclusive, maxValue, maxInclusive, millis));
+   }
+
+   public <T extends Comparable<T>> void checkMaintain(DiscreteElement<T> element, T value, int millis) throws InterruptedException {
+      T result = element.checkMaintain(accessor, null, value, millis);
+      Assert.assertEquals(element.getName() + ".checkMaintain()->failed", value, result);
+   }
+
+   public <T extends Comparable<T>> void checkMaintainFail(DiscreteElement<T> element, T maintainValue, T discontinuity, int millis) {
+      try {
+         T result = element.checkMaintain(accessor, null, maintainValue, millis);
+         Assert.assertEquals(element.getName() + ".checkMaintainFail()->failed", discontinuity, result);
+      } catch (InterruptedException e) {
+         Assert.fail("Exception");
+      }
+   }
+
+   public <T extends Comparable<T>> void checkNot(DiscreteElement<T> element, T value, int millis) {
+      CheckGroup grp = new CheckGroup(Operation.AND, "checkNotCheckGroup");
+      try {
+         boolean c = element.checkNot(accessor, grp, value, millis);
+         CheckPoint cp = (CheckPoint) grp.getTestPoints().get(0);
+         long elapsedTime = cp.getElpasedTime();
+         Assert.assertTrue(element.getName() + String.format(".checkNot()->failed, elapsed time=%d", elapsedTime), c);
+         System.out.printf("checkNot->passed, actual %s, expected %s, elapsed=%d\n", cp.getActual(), cp.getExpected(),
+            cp.getElpasedTime());
+      } catch (InterruptedException e) {
+         Assert.fail("Exception");
+      }
+   }
+
+   public <T extends Comparable<T>> void checkNotFail(DiscreteElement<T> element, T value, int millis) {
+      try {
+         Assert.assertFalse(element.getName() + " .checkNotFail()->failed",
+            element.checkNot(accessor, null, value, millis));
+      } catch (InterruptedException e) {
+         Assert.fail("Exception");
+      }
+   }
+
+   public <T extends Comparable<T>> void check(DiscreteElement<T> element, T value) throws InterruptedException {
+      CheckGroup grp = new CheckGroup(Operation.AND, "checkCheckGrp");
+      boolean c = element.check(accessor, grp, value);
+      long time = ((CheckPoint) grp.getTestPoints().get(0)).getElpasedTime();
+      Assert.assertTrue(
+         element.getName() + String.format(".check()->failed, elapsed=%d, expect=<%s>, actual=<%s>", time, value,
+            element.getValue()), c);
+   }
+
+   public <T extends Comparable<T>> void checkWaitForValue(DiscreteElement<T> element, T value, int millis) throws InterruptedException {
+      T result = element.waitForValue(accessor, value, millis);
+      Assert.assertEquals(element.getName() + " .checkWaitForValue()->failed", value, result);
+   }
+
+   public <T extends Comparable<T>> void checkList(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+      Assert.assertTrue(element.getName() + " .checkList()->failed", element.checkInList(accessor, values, millis));
+   }
+
+   public <T extends Comparable<T>> void checkNotInList(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+      Assert.assertTrue(element.getName() + " .checkNotInList()->failed",
+         element.checkNotInList(accessor, values, millis));
+   }
+
+   public <T extends Comparable<T>> void checkNotInListFail(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkNotInListFail");
+      element.checkNotInList(accessor, chkGrp, values, millis);
+      Assert.assertFalse(element.getName() + " .checkNotInListFail()->failed", chkGrp.isPass());
+   }
+
+   public <T extends Comparable<T>> void checkListFail(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkListFail");
+      boolean b = element.checkInList(accessor, chkGrp, values, millis);
+      CheckPoint cp = (CheckPoint) ((CheckGroup) chkGrp.getTestPoints().get(0)).getTestPoints().get(0);
+      Assert.assertFalse(
+         element.getName() + String.format(" .checkListFail()->failed, elapsed time=%d", cp.getElpasedTime()), b);
+   }
+
+   public <T extends Comparable<T>> void checkMaintainList(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintianList");
+      T val = element.checkMaintainList(accessor, chkGrp, values, true, millis);
+      Assert.assertTrue(element.getName() + " .checkMaintainList()->failed, value=" + val.toString(), chkGrp.isPass());
+   }
+
+   public <T extends Comparable<T>> void checkMaintainListFail(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+      CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainListFail");
+      T val = element.checkMaintainList(accessor, chkGrp, values, true, millis);
+      Assert.assertFalse(element.getName() + " .checkMaintainListFail()->failed, value=" + val.toString(),
+         chkGrp.isPass());
+   }
+
+   public <T extends Comparable<T>> void checkWaitForValueFail(DiscreteElement<T> element, T value, int millis) throws InterruptedException {
+      T result = element.waitForValue(accessor, value, millis);
+      boolean b = value.equals(result);
+      Assert.assertFalse(
+         element.getName() + String.format(" .checkWaitForValueFail()->failed, expect=%s, actual=%s", value, result), b);
+   }
+
+   public <T extends Comparable<T>> void checkPulse(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+      Assert.assertTrue(element.getName() + " .checkPulse()->failed",
+         element.checkPulse(accessor, pulsedValue, nonPulsedValue));
+   }
+
+   public <T extends Comparable<T>> void checkPulseFail(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+      Assert.assertFalse(element.getName() + " .checkPulseFail()->failed",
+         element.checkPulse(accessor, pulsedValue, nonPulsedValue));
+   }
+
+   public <T extends Comparable<T>> void genericTestCheckNot(DiscreteElement<T> element, T[] values) throws InterruptedException {
+      if (values.length < 2) {
+         throw new IllegalArgumentException("array needs atleast two values");
+      }
+      System.out.println("genericTestCheckNot()");
+      // check pass conditions
+      for (int i = values.length - 1; i >= 1; i--) {
+         T notValue = values[i];
+         T goodValue = values[i - 1];
+         System.out.format("\tgoodValue=%s, notValue=%s\n", goodValue, notValue);
+         element.setValue(notValue);
+         setAfter(element, goodValue, 100);
+         checkNot(element, notValue, 210);
+         check(element, goodValue); // make sure we did not pass until the goodValue was transmitted
+      }
+
+      // check fail conditions
+      for (T value : values) {
+         element.setValue(value);
+         checkNotFail(element, value, 100);
+      }
+   }
+
+   public <T extends Comparable<T>> void genericCheckMaintain(DiscreteElement<T> element, T[] values) throws InterruptedException {
+      if (values.length < 2) {
+         throw new IllegalArgumentException("array needs atleast two values");
+      }
+
+      // check pass conditions
+      for (T value : values) {
+         element.setValue(value);
+         checkMaintain(element, value, 200);
+         check(element, value); // make sure we pass for the right reasons e.q. no false positives
+      }
+
+      // check fail conditions
+      for (int i = values.length - 1; i >= 1; i--) {
+         T valueToMaintain = values[i];
+         T badValue = values[i - 1];
+         element.setValue(valueToMaintain);
+         setAfter(element, badValue, 100);
+         checkMaintainFail(element, valueToMaintain, badValue, 200); // make sure we fail as expected, no false negatives
+      }
+   }
+
+   public <T extends Comparable<T>> void genericTestCheckWaitForValue(DiscreteElement<T> element, T[] values, T valueToFInd) throws InterruptedException {
+      // check sequence
+      element.getMessage().waitForTransmission(accessor);
+      ISequenceHandle handle = setSequence(element, values);
+      for (T v : values) {
+         checkWaitForValue(element, v, 40);
+      }
+      handle.waitForEndSequence(100, TimeUnit.MILLISECONDS);
+      setSequence(element, values);
+      checkWaitForValueFail(element, valueToFInd, 200);
+   }
+
+   public <T extends Comparable<T>> void genericTestCheckList(DiscreteElement<T> element, T[] goodValues, T[] badValues) throws InterruptedException {
+      // check finding of every item in the list
+      for (T v : goodValues) {
+         element.setValue(selectRandom(badValues)); // value will always not be in the list until after 40 ms
+         setAfter(element, v, 40);
+         checkList(element, goodValues, 100);
+      }
+
+      // check pass
+      maintainRandomizedList(element, goodValues, 500);
+      checkList(element, goodValues, 500);
+
+      // check failure
+      maintainRandomizedList(element, badValues, 500);
+      checkListFail(element, goodValues, 500);
+   }
+
+   public <T extends Comparable<T>> void genericTestCheckNotList(DiscreteElement<T> element, T[] allowedValues, T[] excludeValues) throws InterruptedException {
+      // check transition from fail to pass within time period
+      for (T v : excludeValues) {
+         element.setValue(selectRandom(allowedValues)); // value will always not be in the list until after 40 ms
+         setAfter(element, v, 40);
+         checkNotInList(element, excludeValues, 100);
+      }
+
+      // check pass
+      ScheduledFuture<?> handle = maintainRandomizedList(element, allowedValues, 10);
+      try {
+         checkNotInList(element, excludeValues, 10);
+      } finally {
+         try {
+            handle.cancel(false);
+            handle.get();
+         } catch (CancellationException ex) {
+            // do nothing
+         } catch (ExecutionException ex) {
+            throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+         }
+      }
+
+      // check failure
+      handle = maintainRandomizedList(element, excludeValues, 10);
+      try {
+         checkNotInListFail(element, excludeValues, 550);
+      } finally {
+         try {
+            handle.cancel(false);
+            handle.get();
+         } catch (CancellationException ex) {
+            // do nothing
+         } catch (ExecutionException ex) {
+            throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+         }
+      }
+   }
+
+   public <T extends Comparable<T>> void genericTestCheckMaintainList(DiscreteElement<T> element, T[] values, T badValue) throws InterruptedException {
+      // visit each possible value in list, make sure checkMaintainList does not fail
+      element.setValue(values[0]);
+      int timeStep = 40;
+      for (T val : values) {
+         setAfter(element, val, timeStep);
+      }
+      checkMaintainList(element, values, 1000);
+
+      // random elements from list
+      ScheduledFuture<?> handle = maintainRandomizedList(element, values, 15);
+      try {
+         checkMaintainList(element, values, 2000);
+      } finally {
+         try {
+            handle.cancel(false);
+            handle.get();
+         } catch (CancellationException ex) {
+            // do nothing
+         } catch (ExecutionException ex) {
+            throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+         }
+      }
+
+      // check proper failure behavior
+      handle = maintainRandomizedList(element, values, 25);
+      try {
+         setAfter(element, badValue, 1500);
+         checkMaintainListFail(element, values, 2000);
+         checkWaitForValue(element, badValue, 0);
+      } finally {
+         try {
+            handle.cancel(false);
+            handle.get();
+         } catch (CancellationException ex) {
+            // do nothing
+         } catch (ExecutionException ex) {
+            throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+         }
+      }
+   }
+
+   public <T> T selectRandom(T[] list) {
+      return list[Math.abs(rand.nextInt(list.length))];
+
+   }
+
+   public void checkForTransmission(TestMessage msg, int numXmits, int millis) throws InterruptedException {
+      Assert.assertTrue(msg.getName() + " failed to transmit " + numXmits + " times in " + millis + "ms",
+         msg.checkForTransmissions(accessor, numXmits, millis));
+   }
+
+   public void checkForTransmissionFail(TestMessage msg, int numXmits, int millis) throws InterruptedException {
+      Assert.assertFalse(msg.getName() + " had at least " + numXmits + " transmissions",
+         msg.checkForTransmissions(accessor, numXmits, millis));
+   }
+
+   public boolean inRange(int target, int tolerance, int actual) {
+      return Math.abs(actual - target) <= tolerance;
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestEnumElementOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestEnumElementOperations.java
new file mode 100644
index 0000000..74a6578
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestEnumElementOperations.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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.message.other;
+
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_0;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_1;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_10;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_2;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_3;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_4;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_5;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_6;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_7;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_8;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_9;
+import java.util.EnumSet;
+import org.eclipse.osee.ote.message.mock.TestEnum;
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestEnumElementOperations {
+
+   private UnitTestSupport support;
+
+   @BeforeClass
+   public static void setUpBeforeClass() throws Exception {
+   }
+
+   @AfterClass
+   public static void tearDownAfterClass() throws Exception {
+   }
+
+   @Before
+   public void setUp() throws Exception {
+      support = new UnitTestSupport();
+   }
+
+   @After
+   public void tearDown() throws Exception {
+      support.cleanup();
+   }
+
+   @Test
+   public void testCheckWaitForValue() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      support.genericTestCheckWaitForValue(msg.ENUM_ELEMENT_1, EnumSet.of(VAL_0, VAL_9).toArray(new TestEnum[] {}),
+         VAL_10);
+
+      support.genericTestCheckWaitForValue(msg.ENUM_ELEMENT_1, EnumSet.of(VAL_1, VAL_10).toArray(new TestEnum[] {}),
+         VAL_0);
+   }
+
+   @Test
+   public void testCheckNot() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      support.genericTestCheckNot(msg.ENUM_ELEMENT_1, TestEnum.values());
+   }
+
+   @Test
+   public void testCheckMaintain() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      support.genericCheckMaintain(msg.ENUM_ELEMENT_1, TestEnum.values());
+   }
+
+   @Test
+   public void testCheckList() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      support.genericTestCheckList(msg.ENUM_ELEMENT_1, new TestEnum[] {VAL_0, VAL_2, VAL_4, VAL_6, VAL_8, VAL_10},
+         new TestEnum[] {VAL_1, VAL_3, VAL_5, VAL_7, VAL_9});
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestFloat32Operations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestFloat32Operations.java
new file mode 100644
index 0000000..f8aa274
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestFloat32Operations.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.message.other;
+
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestFloat32Operations {
+   private UnitTestSupport support;
+
+   @BeforeClass
+   public static void setUpBeforeClass() throws Exception {
+   }
+
+   @AfterClass
+   public static void tearDownAfterClass() throws Exception {
+   }
+
+   @Before
+   public void setUp() throws Exception {
+      support = new UnitTestSupport();
+   }
+
+   @After
+   public void tearDown() throws Exception {
+      support.cleanup();
+   }
+
+   @Test
+   public void testCheckWaitForValue() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      support.genericTestCheckWaitForValue(msg.FLOAT32_ELEMENT_1, new Double[] {
+         new Double(0.0f),
+         new Double(0.2f),
+         new Double(100.0f),
+         new Double(999.00075f)}, new Double(33.4001f));
+
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestIntegerOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestIntegerOperations.java
new file mode 100644
index 0000000..923d372
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestIntegerOperations.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * 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.message.other;
+
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestIntegerOperations {
+
+   private UnitTestSupport support;
+
+   @BeforeClass
+   public static void setUpBeforeClass() throws Exception {
+   }
+
+   @AfterClass
+   public static void tearDownAfterClass() throws Exception {
+   }
+
+   @Before
+   public void setUp() throws Exception {
+      support = new UnitTestSupport();
+   }
+
+   @After
+   public void tearDown() throws Exception {
+      support.cleanup();
+   }
+
+   /**
+    * Not sure how this is even supposed to work.
+    * 
+    * @throws InterruptedException
+    */
+   @Ignore
+   @Test
+   public void testCheckWaitForValue() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      int maxElementValue = getMaxIntValue(msg.INT_ELEMENT_1);
+      support.genericTestCheckWaitForValue(msg.INT_ELEMENT_1, new Integer[] {
+         10,
+         30,
+         31,
+         30,
+         50,
+         75,
+         maxElementValue,
+         maxElementValue,
+         400,
+         1,
+         maxElementValue,
+         0,
+         maxElementValue,
+         1,
+         0,
+         1,
+         2}, 49);
+   }
+
+   @Test
+   public void testCheckNot() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      int maxElementValue = getMaxIntValue(msg.INT_ELEMENT_1);
+      support.genericTestCheckNot(msg.INT_ELEMENT_1, new Integer[] {0, maxElementValue, 10, 100, 1000, 5});
+   }
+
+   @Test
+   public void testCheckMaintain() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      int maxElementValue = getMaxIntValue(msg.INT_ELEMENT_1);
+      support.genericCheckMaintain(msg.INT_ELEMENT_1, new Integer[] {
+         0,
+         maxElementValue,
+         0,
+         0,
+         maxElementValue,
+         maxElementValue,
+         1000,
+         5,
+         1,
+         maxElementValue - 1});
+   }
+
+   @Test
+   public void testCheckRange() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      msg.INT_ELEMENT_1.setValue(50);
+      support.checkRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+      // test lower bound, inclusive
+      msg.INT_ELEMENT_1.setValue(0);
+      support.checkRangeFail(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+      support.setAfter(msg.INT_ELEMENT_1, 1, 50);
+      support.checkRange(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+
+      // test upper bound, inclusive
+      msg.INT_ELEMENT_1.setValue(101);
+      support.checkRangeFail(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 50);
+      support.checkRange(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+
+      // test middle
+      msg.INT_ELEMENT_1.setValue(1000);
+      support.setAfter(msg.INT_ELEMENT_1, 50, 50);
+      support.checkRange(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+
+      // test lower bound, exclusive
+      msg.INT_ELEMENT_1.setValue(1);
+      support.checkRangeFail(msg.INT_ELEMENT_1, 1, false, 100, false, 100); // make sure lower bound is exclusive
+      support.setAfter(msg.INT_ELEMENT_1, 2, 50);
+      support.checkRange(msg.INT_ELEMENT_1, 1, false, 100, false, 100);
+
+      // test upper bound, exclusive
+      msg.INT_ELEMENT_1.setValue(100);
+      support.checkRangeFail(msg.INT_ELEMENT_1, 1, false, 100, false, 100); // make sure upper bound is exclusive
+      support.setAfter(msg.INT_ELEMENT_1, 99, 50);
+      support.checkRange(msg.INT_ELEMENT_1, 1, false, 100, false, 100);
+
+      // check multiple out of range values
+      msg.INT_ELEMENT_1.setValue(10);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+      support.setAfter(msg.INT_ELEMENT_1, 9, 40);
+      support.setAfter(msg.INT_ELEMENT_1, 101, 60);
+      support.checkRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 160);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 101, 0); // make sure we did not fail before we should have
+   }
+
+   @Test
+   public void testCheckMaintainRange() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      msg.INT_ELEMENT_1.setValue(50);
+      support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+      msg.INT_ELEMENT_1.setValue(0);
+      support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+      msg.INT_ELEMENT_1.setValue(100);
+      support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+      // check lower bound, inclusive
+      msg.INT_ELEMENT_1.setValue(10);
+      support.setAfter(msg.INT_ELEMENT_1, 9, 50);
+      support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 100);
+
+      // check upper bound, inclusive
+      msg.INT_ELEMENT_1.setValue(100);
+      support.setAfter(msg.INT_ELEMENT_1, 101, 50);
+      support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 100);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 101, 0);
+
+      // check lower bound, exclusive
+      msg.INT_ELEMENT_1.setValue(1);
+      support.setAfter(msg.INT_ELEMENT_1, 0, 50);
+      support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 0, 0);
+
+      // check upper bound, exclusive
+      msg.INT_ELEMENT_1.setValue(99);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 50);
+      support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+
+      // check bouncing between upper and lower inclusive
+      msg.INT_ELEMENT_1.setValue(0);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+      support.setAfter(msg.INT_ELEMENT_1, 50, 40);
+      support.setAfter(msg.INT_ELEMENT_1, 1, 60);
+      support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 1, 0);
+
+      // check approaching upper fail boundary
+      msg.INT_ELEMENT_1.setValue(97);
+      support.setAfter(msg.INT_ELEMENT_1, 98, 20);
+      support.setAfter(msg.INT_ELEMENT_1, 99, 40);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 60);
+      support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+
+      // check approaching lower fail boundary
+      msg.INT_ELEMENT_1.setValue(3);
+      support.setAfter(msg.INT_ELEMENT_1, 2, 20);
+      support.setAfter(msg.INT_ELEMENT_1, 1, 40);
+      support.setAfter(msg.INT_ELEMENT_1, 0, 60);
+      support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+
+      // check mixed inclusive, exclusive
+      msg.INT_ELEMENT_1.setValue(1);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 60);
+      support.checkMaintainRange(msg.INT_ELEMENT_1, 0, false, 100, true, 100);
+
+      // check mixed inclusive, exclusive
+      msg.INT_ELEMENT_1.setValue(99);
+      support.setAfter(msg.INT_ELEMENT_1, 0, 60);
+      support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, false, 100);
+
+      // check bouncing between upper and lower exclusive
+      support.setSequence(msg.INT_ELEMENT_1, new Integer[] {1, 99, 50, 2, 2, 2, 1, 2, 1, 2, 44});
+      support.checkMaintainRange(msg.INT_ELEMENT_1, 0, false, 100, false, 240);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 44, 0);
+
+      // check fail fast behavior
+      msg.INT_ELEMENT_1.setValue(1);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 30);
+      support.setAfter(msg.INT_ELEMENT_1, 50, 60);
+      support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 100, 0); // should immediately check value since it should have caused the above to fail
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 50, 100);
+   }
+
+   @Test
+   public void testCheckMaintainNotRange() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      // bounce around boundaries, make sure it doesn't fail, inclusive
+      support.setSequence(msg.INT_ELEMENT_1, new Integer[] {0, 101, 9, 102, 8, 102, 101, 101, 101, 9, 9, 101, 9});
+      support.checkMaintainNotRange(msg.INT_ELEMENT_1, 10, true, 100, true, 400);
+
+      // bounce around boundaries, make sure it doesn't fail, exclusive
+      msg.INT_ELEMENT_1.setValue(0);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+      support.setAfter(msg.INT_ELEMENT_1, 10, 40);
+      support.setAfter(msg.INT_ELEMENT_1, 101, 60);
+      support.setAfter(msg.INT_ELEMENT_1, 9, 80);
+      support.checkMaintainNotRange(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+
+      // explore boundary then cause failure, exclusive
+      msg.INT_ELEMENT_1.setValue(10);
+      support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+      support.setAfter(msg.INT_ELEMENT_1, 55, 80);
+      support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 55, 0); // make sure our plan failure actually caused it to fail
+
+      // explore boundary then cause failure, inclusive
+      support.setSequence(msg.INT_ELEMENT_1, new Integer[] {9, 9, 101, 101, 9, 101, 55});
+      support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 200);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 55, 0); // make sure our planned failure actually caused it to fail
+
+      // check transition to upper boundary causes failure, inclusive
+      support.maintain(msg.INT_ELEMENT_1, 105, 100, 50);
+      support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 200);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 100, 0); // make sure our planned failure actually caused it to fail
+
+      // check transition to upper boundary causes failure, exclusive
+      support.maintain(msg.INT_ELEMENT_1, 100, 99, 50);
+      support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 99, 0); // make sure our planned failure actually caused it to fail
+
+      // check transition to lower boundary causes failure, inclusive
+      support.maintain(msg.INT_ELEMENT_1, 9, 10, 50);
+      support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 200);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 10, 0); // make sure our planned failure actually caused it to fail
+
+      // check transition to lower boundary causes failure, exclusive
+      support.maintain(msg.INT_ELEMENT_1, 10, 11, 50);
+      support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+      support.checkWaitForValue(msg.INT_ELEMENT_1, 11, 0); // make sure our planned failure actually caused it to fail
+   }
+
+   @Test
+   public void testCheckList() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      support.genericTestCheckList(msg.INT_ELEMENT_1, new Integer[] {20, 40, 50, 60, 80, 100}, new Integer[] {
+         200,
+         300,
+         400,
+         500,
+         600});
+   }
+
+   @Test
+   public void testCheckNotInList() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      support.genericTestCheckNotList(msg.INT_ELEMENT_1, new Integer[] {20, 40, 50, 60, 80, 100}, new Integer[] {
+         200,
+         300,
+         400,
+         500,
+         600});
+   }
+
+   @Test
+   public void testCheckMaintainList() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      Integer[] values = {20, 40, 50, 60, 80};
+      support.genericTestCheckMaintainList(msg.INT_ELEMENT_1, values, 999);
+   }
+
+   @Test
+   public void testCheckPulse() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+
+      support.setSequence(msg.INT_ELEMENT_1, new Integer[] {2, 100, 33, 100, 2, 99});
+      support.checkPulse(msg.INT_ELEMENT_1, 100, 99);
+
+      support.setSequence(msg.INT_ELEMENT_1, new Integer[] {100, 100, 99});
+      support.checkPulse(msg.INT_ELEMENT_1, 100, 99);
+   }
+
+   private int getMaxIntValue(IntegerElement e) {
+      return (1 << e.getBitLength()) - 1;
+   }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestMessageOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestMessageOperations.java
new file mode 100644
index 0000000..c064a74
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestMessageOperations.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * 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.message.other;
+
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestMessageOperations {
+   private UnitTestSupport support;
+
+   @BeforeClass
+   public static void setUpBeforeClass() throws Exception {
+   }
+
+   @AfterClass
+   public static void tearDownAfterClass() throws Exception {
+   }
+
+   @Before
+   public void setUp() throws Exception {
+      support = new UnitTestSupport();
+   }
+
+   @After
+   public void tearDown() throws Exception {
+      support.cleanup();
+   }
+
+   /**
+    * We noticed this failing due to being overly picky about timing, needs to be evaluated to be fixed or removed.
+    * 
+    * @throws InterruptedException
+    */
+   @Ignore
+   @Test
+   public void testTransmissionRate() throws InterruptedException {
+      Benchmark.setBenchmarkingEnabled(true);
+      TestMessage msg = new TestMessage();
+      final Benchmark bm = new Benchmark("transmission rate");
+      msg.addListener(new IOSEEMessageListener() {
+         @Override
+         public void onDataAvailable(MessageData data, DataType type) throws MessageSystemException {
+            bm.samplePoint();
+         }
+
+         @Override
+         public void onInitListener() throws MessageSystemException {
+
+         }
+
+      });
+      int time = 5000; // 5 seconds
+      support.activateMsg(msg);
+      int period = (int) Math.round(1000.0 / msg.getRate());
+      int expectedXmits = (int) Math.round(msg.getRate()) * (time / 1000);
+      Thread.sleep(time + 10);
+      Assert.assertEquals(expectedXmits, bm.getTotalSamples());
+      long avg = bm.getAverage() / 1000;
+      Assert.assertTrue("period is out of range:expected " + period + ", actual " + avg,
+         support.inRange(period, 1, (int) avg));
+   }
+
+   @Test
+   public void testCheckForTransmission() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      int time = 1000;
+      int expectedXmits = (int) Math.round(msg.getRate()) * (time / 1000);
+      support.checkForTransmission(msg, expectedXmits, time + 10);
+
+      support.checkForTransmissionFail(msg, expectedXmits, time - 10);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestStringOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestStringOperations.java
new file mode 100644
index 0000000..0cb060b
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestStringOperations.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.message.other;
+
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestStringOperations {
+
+   private UnitTestSupport support;
+
+   @BeforeClass
+   public static void setUpBeforeClass() throws Exception {
+   }
+
+   @AfterClass
+   public static void tearDownAfterClass() throws Exception {
+   }
+
+   @Before
+   public void setUp() throws Exception {
+      support = new UnitTestSupport();
+   }
+
+   @After
+   public void tearDown() throws Exception {
+      support.cleanup();
+   }
+
+   @Test
+   public void testCheckWaitForValue() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      support.genericTestCheckWaitForValue(msg.STRING_ELEMENT_1, new String[] {
+         "Expected 1",
+         " Expected",
+         "Expected ",
+         "",
+         "expected",
+         "EXPECTED",
+         "Expected",
+         "Expected",
+         "01234",
+         "x"}, "abc");
+   }
+
+   @Test
+   public void testCheckNot() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      String values[] = new String[] {" ", "a", "  ", "hi", "by", "123456789ABCDEF", "1"};
+      support.genericTestCheckNot(msg.STRING_ELEMENT_1, values);
+   }
+
+   @Test
+   public void testCheckList() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      support.activateMsg(msg);
+      String[] good = new String[] {"a b c d e f g", "b", "_", "hello", "test"};
+      String[] bad = new String[] {"a b c d e f g e", "c", " ", "\t", "hellO", "t\0est"};
+      support.genericTestCheckList(msg.STRING_ELEMENT_1, good, bad);
+   }
+
+   @Test
+   public void testStringEmpty() throws InterruptedException {
+      TestMessage msg = new TestMessage();
+      msg.STRING_ELEMENT_1.zeroize();
+      Assert.assertTrue("string is not empty", msg.STRING_ELEMENT_1.isEmpty());
+      msg.STRING_ELEMENT_1.setValue("hi");
+      Assert.assertFalse("string is empty", msg.STRING_ELEMENT_1.isEmpty());
+      msg.STRING_ELEMENT_1.setValue("\0");
+      Assert.assertTrue("string is not empty", msg.STRING_ELEMENT_1.isEmpty());
+      msg.STRING_ELEMENT_1.setValue("0123456789");
+      Assert.assertFalse("string is empty", msg.STRING_ELEMENT_1.isEmpty());
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/.classpath b/org.eclipse.osee.ote.core/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.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.core/.cvsignore b/org.eclipse.osee.ote.core/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.osee.ote.core/.pmd b/org.eclipse.osee.ote.core/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.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.core/.project b/org.eclipse.osee.ote.core/.project
new file mode 100644
index 0000000..99558be
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.core</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.core/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..deb33f1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
@@ -0,0 +1,95 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Test Core Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.core;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote,
+ org.eclipse.osee.ote.classserver,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.annotations,
+ org.eclipse.osee.ote.core.cmd,
+ org.eclipse.osee.ote.core.enums,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.command,
+ org.eclipse.osee.ote.core.environment.config,
+ org.eclipse.osee.ote.core.environment.console,
+ org.eclipse.osee.ote.core.environment.console.cmd,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.core.environment.jini,
+ org.eclipse.osee.ote.core.environment.status,
+ org.eclipse.osee.ote.core.environment.status.msg,
+ org.eclipse.osee.ote.core.framework,
+ org.eclipse.osee.ote.core.framework.adapter,
+ org.eclipse.osee.ote.core.framework.command,
+ org.eclipse.osee.ote.core.framework.event,
+ org.eclipse.osee.ote.core.framework.prompt,
+ org.eclipse.osee.ote.core.framework.saxparse,
+ org.eclipse.osee.ote.core.framework.saxparse.elements,
+ org.eclipse.osee.ote.core.framework.testrun,
+ org.eclipse.osee.ote.core.framework.thread,
+ org.eclipse.osee.ote.core.log,
+ org.eclipse.osee.ote.core.log.record,
+ org.eclipse.osee.ote.core.log.record.json,
+ org.eclipse.osee.ote.core.model,
+ org.eclipse.osee.ote.core.test.shells,
+ org.eclipse.osee.ote.core.test.tags,
+ org.eclipse.osee.ote.core.testPoint,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.commands,
+ org.eclipse.osee.ote.message.condition,
+ org.eclipse.osee.ote.message.data,
+ org.eclipse.osee.ote.message.elements,
+ org.eclipse.osee.ote.message.elements.nonmapping,
+ org.eclipse.osee.ote.message.enums,
+ org.eclipse.osee.ote.message.event,
+ org.eclipse.osee.ote.message.event.send,
+ org.eclipse.osee.ote.message.instrumentation,
+ org.eclipse.osee.ote.message.interfaces,
+ org.eclipse.osee.ote.message.listener,
+ org.eclipse.osee.ote.message.log.record,
+ org.eclipse.osee.ote.message.timer,
+ org.eclipse.osee.ote.message.tool,
+ org.eclipse.osee.ote.message.tool.rec,
+ org.eclipse.osee.ote.message.tool.rec.entry,
+ org.eclipse.osee.ote.remote.messages
+Require-Bundle: org.eclipse.osee.framework.jdk.core,
+ org.eclipse.core.runtime,
+ org.apache.commons.net,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.connection.service,
+ net.jini;bundle-version="2.1.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-Activator: org.eclipse.osee.ote.core.internal.Activator
+Import-Package: javax.xml.parsers,
+ org.apache.xml.serialize,
+ org.codehaus.jackson;version="1.9.13",
+ org.codehaus.jackson.annotate;version="1.9.13",
+ org.codehaus.jackson.map;version="1.9.13",
+ org.codehaus.jackson.map.annotate;version="1.9.13",
+ org.codehaus.jackson.map.module;version="1.9.13",
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.ote.connection.jini,
+ org.eclipse.osee.ote.io,
+ org.eclipse.osee.ote.messaging.dds,
+ org.eclipse.osee.ote.messaging.dds.condition,
+ org.eclipse.osee.ote.messaging.dds.entity,
+ org.eclipse.osee.ote.messaging.dds.listener,
+ org.eclipse.osee.ote.messaging.dds.qos,
+ org.eclipse.osee.ote.messaging.dds.service,
+ org.eclipse.osee.ote.messaging.dds.status,
+ org.eclipse.osee.ote.messaging.dds.test,
+ org.eclipse.osee.ote.messaging.dds.test.data,
+ org.eclipse.osee.ote.properties,
+ org.osgi.service.event;version="1.3.0",
+ org.w3c.dom,
+ org.xml.sax,
+ org.xml.sax.ext,
+ org.xml.sax.helpers
+Service-Component: OSGI-INF/*.xml
+
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/StatusBoardComponent.xml b/org.eclipse.osee.ote.core/OSGI-INF/StatusBoardComponent.xml
new file mode 100644
index 0000000..66a3b14
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/StatusBoardComponent.xml
@@ -0,0 +1,8 @@
+<?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="true" name="org.eclipse.osee.ote.core.statusboard">
+   <implementation class="org.eclipse.osee.ote.core.environment.status.StatusBoard"/>
+   <reference bind="bindEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.core.environment.status.OTEStatusBoard"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/message.service.handler.xml b/org.eclipse.osee.ote.core/OSGI-INF/message.service.handler.xml
new file mode 100644
index 0000000..cd8ac35
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/message.service.handler.xml
@@ -0,0 +1,6 @@
+<?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.internal.RemoteMessageServiceHandler">
+   <implementation class="org.eclipse.osee.ote.internal.RemoteMessageServiceHandler"/>
+   <reference bind="bindIRemoteMessageService" cardinality="1..1" interface="org.eclipse.osee.ote.message.interfaces.IRemoteMessageService" name="IRemoteMessageService" policy="static" unbind="unbindIRemoteMessageService"/>
+   <reference bind="bindEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/org.eclipse.osee.ote.io.xml b/org.eclipse.osee.ote.core/OSGI-INF/org.eclipse.osee.ote.io.xml
new file mode 100644
index 0000000..315052b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/org.eclipse.osee.ote.io.xml
@@ -0,0 +1,6 @@
+<?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.core.systemoutconnection">
+   <implementation class="org.eclipse.osee.ote.internal.OTESystemOutConnection"/>
+   <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+   <reference bind="bindSystemOutput" cardinality="1..1" interface="org.eclipse.osee.ote.io.SystemOutput" name="SystemOutput" policy="static" unbind="unbindSystemOutput"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.api.component.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.api.component.xml
new file mode 100644
index 0000000..63fa06e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.api.component.xml
@@ -0,0 +1,14 @@
+<?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.api">
+   <implementation class="org.eclipse.osee.ote.internal.OTEApiImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.OTEApi"/>
+   </service>
+   <reference bind="bindRuntimeLibraryManager" cardinality="1..1" interface="org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager" name="IRuntimeLibraryManager" policy="static" unbind="unbindRuntimeLibraryManager"/>
+   <reference bind="bindOTEServerFolder" cardinality="1..1" interface="org.eclipse.osee.ote.io.OTEServerFolder" name="OTEServerFolder" policy="static" unbind="unbindOTEServerFolder"/>
+   <reference bind="bindOTEServerRuntimeCache" cardinality="1..1" interface="org.eclipse.osee.ote.OTEServerRuntimeCache" name="OTEServerRuntimeCache" policy="static" unbind="unbindOTEServerRuntimeCache"/>
+   <reference bind="bindTestEnvironmentInterface" cardinality="0..1" interface="org.eclipse.osee.ote.core.environment.TestEnvironmentInterface" name="TestEnvironmentInterface" policy="dynamic" unbind="unbindTestEnvironmentInterface"/>
+   <reference bind="bindIModelManager" cardinality="0..1" interface="org.eclipse.osee.ote.core.model.IModelManager" name="IModelManager" policy="dynamic" unbind="unbindIModelManager"/>
+   <reference bind="bindIRemoteMessageService" cardinality="0..1" interface="org.eclipse.osee.ote.message.interfaces.IRemoteMessageService" name="IRemoteMessageService" policy="dynamic" unbind="unbindIRemoteMessageService"/>
+   <reference bind="bindIHostTestEnvironment" cardinality="0..1" interface="org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment" name="IHostTestEnvironment" policy="dynamic" unbind="unbindIHostTestEnvironment"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.endpoint.component.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.endpoint.component.xml
new file mode 100644
index 0000000..b88c82f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.endpoint.component.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="true" name="org.eclipse.osee.ote.endpoint">
+   <implementation class="org.eclipse.osee.ote.internal.endpoint.EndpointComponent"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint"/>
+   </service>
+   <reference bind="addDataProcessor" cardinality="0..n" interface="org.eclipse.osee.ote.endpoint.EndpointDataProcessor" name="EndpointDataProcessor" policy="dynamic" unbind="removeDataProcessor"/>
+   <reference cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.runtime.manager.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.runtime.manager.xml
new file mode 100644
index 0000000..1ecc266
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.runtime.manager.xml
@@ -0,0 +1,8 @@
+<?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.ote.runtimeManager">
+   <implementation class="org.eclipse.osee.ote.internal.OTEBundleLoader"/>
+  
+   <reference bind="bindOTEServerRuntimeCache" cardinality="1..1" interface="org.eclipse.osee.ote.OTEServerRuntimeCache" name="OTEServerRuntimeCache" policy="static" unbind="unbindOTEServerRuntimeCache"/> <service>
+      <provide interface="org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.server.runtime.cache.component.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.server.runtime.cache.component.xml
new file mode 100644
index 0000000..0f9a7fc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.server.runtime.cache.component.xml
@@ -0,0 +1,8 @@
+<?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="true" name="org.eclipse.osee.ote.server.runtime.cache">
+   <implementation class="org.eclipse.osee.ote.internal.OTEServerRuntimeCacheImpl"/>
+   <reference bind="bindOTEServerFolder" cardinality="1..1" interface="org.eclipse.osee.ote.io.OTEServerFolder" name="OTEServerFolder" policy="static" unbind="unbindOTEServerFolder"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.OTEServerRuntimeCache"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.sessions.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.sessions.xml
new file mode 100644
index 0000000..0f59c98
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.sessions.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.core.OTESessionManager">
+   <implementation class="org.eclipse.osee.ote.core.internal.OTESessionManagerImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.core.OTESessionManager"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/oteapi.handler.xml b/org.eclipse.osee.ote.core/OSGI-INF/oteapi.handler.xml
new file mode 100644
index 0000000..bc4426d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/oteapi.handler.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop">
+   <implementation class="org.eclipse.osee.ote.internal.RemoteOteApiHandler"/>
+   <reference bind="bindOTEApi" cardinality="1..1" interface="org.eclipse.osee.ote.OTEApi" name="OTEApi" policy="static" unbind="unbindOTEApi"/>
+   <reference bind="bindEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/>
+   <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/build.properties b/org.eclipse.osee.ote.core/build.properties
new file mode 100644
index 0000000..2655a11
--- /dev/null
+++ b/org.eclipse.osee.ote.core/build.properties
@@ -0,0 +1,8 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               images/,\
+               .,\
+               OSGI-INF/,\
+               OSGI-INF/org.eclipse.osee.ote.io.xml
+source.. = src/
diff --git a/org.eclipse.osee.ote.core/images/laser_16_16.gif b/org.eclipse.osee.ote.core/images/laser_16_16.gif
new file mode 100644
index 0000000..b29b25e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/images/laser_16_16.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.core/plugin.xml b/org.eclipse.osee.ote.core/plugin.xml
new file mode 100644
index 0000000..af99d23
--- /dev/null
+++ b/org.eclipse.osee.ote.core/plugin.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+   <extension
+         id="server"
+         name="OTE Server"
+         point="org.eclipse.core.runtime.applications">
+      <application
+            cardinality="singleton-global"
+            thread="main"
+            visible="true">
+         <run
+               class="org.eclipse.osee.ote.core.ServerApplication">
+         </run>
+      </application>
+   </extension>
+   <extension
+         id="server"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="org.eclipse.osee.ote.core.server"
+            name="OteServerStandalone">
+         <property
+               name="appName"
+               value="OteServerStandalone">
+         </property>
+      </product>
+   </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.core/pom.xml b/org.eclipse.osee.ote.core/pom.xml
new file mode 100644
index 0000000..ea7e026
--- /dev/null
+++ b/org.eclipse.osee.ote.core/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.core</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Core (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.core/src/org/eclipse/osee/ote/Configuration.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/Configuration.java
new file mode 100644
index 0000000..e92606e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/Configuration.java
@@ -0,0 +1,31 @@
+package org.eclipse.osee.ote;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This defines the bundles to be loaded into the OTE Server.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class Configuration implements Serializable {
+
+   private static final long serialVersionUID = -3395485777990884086L;
+
+   private ArrayList<ConfigurationItem> items;
+
+   public Configuration() {
+      items = new ArrayList<>();
+   }
+   
+   public List<ConfigurationItem> getItems() {
+      return items;
+   }
+
+   public void addItem(ConfigurationItem config) {
+      items.add(config);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationItem.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationItem.java
new file mode 100644
index 0000000..0eb7fa7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationItem.java
@@ -0,0 +1,47 @@
+package org.eclipse.osee.ote;
+
+import java.io.Serializable;
+
+/**
+ * This defines the bundle to be loaded by the OTE Server.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class ConfigurationItem implements Serializable {
+
+   private static final long serialVersionUID = -2805353994429454202L;
+   private String url;
+   private String version;
+   private String symbolicName;
+   private String md5;
+   private boolean isOsgiBundle;
+   
+   public ConfigurationItem(String url, String version, String symbolicName, String md5, boolean isOsgiBundle) {
+      this.url = url;
+      this.version = version;
+      this.symbolicName = symbolicName;
+      this.md5 = md5;
+   }
+
+   public boolean isOsgiBundle() {
+      return isOsgiBundle;
+   }
+
+   public String getSymbolicName() {
+      return symbolicName;
+   }
+
+   public String getMd5Digest() {
+      return md5;
+   }
+
+   public String getVersion() {
+      return version;
+   }
+
+   public String getLocationUrl() {
+      return url;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatus.java
new file mode 100644
index 0000000..8a53714
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatus.java
@@ -0,0 +1,32 @@
+package org.eclipse.osee.ote;
+
+public class ConfigurationStatus {
+
+   private Configuration configuration;
+   private boolean success;
+   private String message;
+
+   public ConfigurationStatus(Configuration configuration, boolean success, String message) {
+      this.configuration = configuration;
+      this.success = success;
+      this.message = message;
+   }
+
+   public void setFail(String message) {
+      success = false;
+      this.message = message;
+   }
+   
+   public boolean isSuccess(){
+      return success;
+   }
+   
+   public String getMessage(){
+      return message;
+   }
+   
+   public Configuration getConfiguration(){
+      return configuration;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatusCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatusCallback.java
new file mode 100644
index 0000000..9458c9a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatusCallback.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote;
+
+public interface ConfigurationStatusCallback {
+
+   public void success();
+
+   public void failure(String errorLog);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/HostServerProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/HostServerProperties.java
new file mode 100644
index 0000000..61a4dc4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/HostServerProperties.java
@@ -0,0 +1,20 @@
+package org.eclipse.osee.ote;
+
+
+public enum HostServerProperties {
+   name,
+   station,
+   version,
+   type,
+   maxUsers,
+   comment,
+   date,
+   group,
+   owner,
+   id,
+   activeMq,
+   appServerURI,
+   oteUdpEndpoint,
+   serverLaunchWorkingDir,
+   isSim
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/NonRemoteUserSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/NonRemoteUserSession.java
new file mode 100644
index 0000000..0c5090b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/NonRemoteUserSession.java
@@ -0,0 +1,98 @@
+package org.eclipse.osee.ote;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+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;
+
+public class NonRemoteUserSession implements IRemoteUserSession, Serializable {
+
+   /**
+    * 
+    */
+   private static final long serialVersionUID = -4094993884862781475L;
+   
+   private OSEEPerson1_4 user;
+   private String address;
+   
+   public NonRemoteUserSession(OSEEPerson1_4 user, String address){
+      this.user = user;
+      this.address = address;
+   }
+   
+   @Override
+   public OSEEPerson1_4 getUser() {
+      return user;
+   }
+
+   @Override
+   public String getAddress() {
+      return address;
+   }
+
+   @Override
+   public byte[] getFile(String workspacePath) {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   @Override
+   public long getFileDate(String workspacePath) {
+      // TODO Auto-generated method stub
+      return 0;
+   }
+
+   @Override
+   public void initiateInformationalPrompt(String message) {
+      // TODO Auto-generated method stub
+      
+   }
+
+   @Override
+   public void initiatePassFailPrompt(IPassFailPromptResponse prompt) {
+      // TODO Auto-generated method stub
+      
+   }
+
+   @Override
+   public void initiateYesNoPrompt(IYesNoPromptResponse prompt) throws Exception {
+      // TODO Auto-generated method stub
+      
+   }
+
+   @Override
+   public void initiateUserInputPrompt(IUserInputPromptResponse prompt) {
+      // TODO Auto-generated method stub
+      
+   }
+
+   @Override
+   public void initiateResumePrompt(IResumeResponse prompt) {
+      // TODO Auto-generated method stub
+      
+   }
+
+   @Override
+   public void cancelPrompts() throws Exception {
+      // TODO Auto-generated method stub
+      
+   }
+
+   @Override
+   public boolean isAlive() {
+      // TODO Auto-generated method stub
+      return false;
+   }
+
+   @Override
+   public UUID getUserId() throws Exception {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEApi.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEApi.java
new file mode 100644
index 0000000..b21c52e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEApi.java
@@ -0,0 +1,132 @@
+package org.eclipse.osee.ote;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.model.IModelManager;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+
+/**
+ * This is an API that exposes some of the key test environment interfaces and operations.  It is expected
+ * that clients of OTE will operate either directly through this API or indirectly using a remote REST or 
+ * Event API that makes use of this API.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface OTEApi {
+   
+   /**
+    * Returns the OTEServerFolder service that enables management of the ote server folder area on
+    * the machine local to the server.
+    * 
+    * @return the OTEServerFolder service
+    */
+   OTEServerFolder getServerFolder();
+   
+   /**
+    * Returns the OTEServerJarCache that can be used for saving and getting files from the local
+    * ote server data store.
+    * 
+    * @return the OTEServerJarCache service
+    */
+   OTEServerRuntimeCache getRuntimeCache();
+   
+   /**
+    * Returns the IModelManager service that will give access to generic model controls.  It depends on the TestEnvironmentInterface exisiting or it 
+    * will be a null value.
+    * 
+    * @return null or a valid IModelManager service
+    */
+   IModelManager getModelManager();
+   
+   /**
+    * Returns the TestEnvironmentInterface service that is a top level object for interacting with the 
+    * environment.  It depends on a valid TestEnvironmentInterface getting registered.  If we do not 
+    * have a valid test environment it will return null.  Generally a valid test environment will exist
+    * as long as a configuration has been loaded, this can happen if a user connects to a shell server
+    * or if we have an RCP that contains all the required startup information and bundles.
+    * 
+    * @return null or a valid TestEnvironmentInterface service
+    */
+   TestEnvironmentInterface getTestEnvironment();
+   
+   /**
+    * Returns a reference to the Environment implementation of the Remote message service, which allows clients
+    * to view environment message data.
+    * 
+    * @return null or a valid IRemoteMessageService
+    */
+   IRemoteMessageService getRemoteMessageService();
+   
+   /**
+    * This method will make sure that the requested configuration is available to the server and then install them.  
+    * Only jars that are proper OSGI bundles will be loaded.  This also means that if configuration items are 
+    * not currently available to the server it will acquire them from the client using the URL in the configuration item.
+    * 
+    * @param configuration
+    * @param callable
+    * @return
+    * @throws InterruptedException
+    * @throws ExecutionException
+    */
+   Future<ConfigurationStatus> loadConfiguration(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException;
+   
+   /**
+    * This method will uninstall the previous bundle configuration.
+    * 
+    * @param callable
+    * @return
+    * @throws InterruptedException
+    * @throws ExecutionException
+    */
+   Future<ConfigurationStatus> resetConfiguration(OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException;
+   
+   /**
+    * Gets the current test environment configuration.
+    * 
+    * @return
+    */
+   Future<ConfigurationStatus> getConfiguration();
+   
+   /**
+    * This method will make all bundles defined in the configuration available to the server.  This means the server will attempt to use the URL in the configuration item
+    * to download any bundles not currently in its cache.
+    * 
+    * @param configuration
+    * @param callable
+    * @return
+    * @throws InterruptedException
+    * @throws ExecutionException
+    */
+   Future<ConfigurationStatus> downloadConfigurationJars(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException;
+   
+   /**
+    * Attempt to load a class from currently installed bundles and then from the script classpath.
+    * 
+    * @param clazz
+    * @return the requested Class
+    * @throws ClassNotFoundException
+    */
+   Class<?> loadFromScriptClassLoader(String clazz) throws ClassNotFoundException;
+
+   /**
+    * Attempt to load a class from any currently installed bundled.
+    * 
+    * @param clazz
+    * @return the requested Class
+    * @throws ClassNotFoundException
+    */
+   Class<?> loadFromRuntimeLibraryLoader(String clazz) throws ClassNotFoundException;
+
+   /**
+    * Get the host test environment.  This method will return null if one has not yet been registered,
+    * so users need to check for null.
+    * 
+    * @return the host environment or null if one is not created
+    */
+   IHostTestEnvironment getIHostTestEnvironment();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEException.java
new file mode 100644
index 0000000..db0e103
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEException.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote;
+
+
+public class OTEException extends RuntimeException {
+
+   private static final long serialVersionUID = 8430838531056913404L;
+
+   public OTEException(String format, Throwable t) {
+      super(format, t);
+   }
+
+   public OTEException(String string) {
+      super(string);
+   }
+
+   public OTEException(Throwable e) {
+      super(e);
+   }
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEServerRuntimeCache.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEServerRuntimeCache.java
new file mode 100644
index 0000000..1dcb522
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEServerRuntimeCache.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Store, find and remove jars that are used when running an OTE test server.
+ * 
+ * The format is  <pre>
+ *                rootFolder/symbolicName/md5.jar - the jar
+ *                rootFolder/symbolicName/md5.jar.date - the last time it was accessed
+ *                </pre>
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface OTEServerRuntimeCache {
+
+   void clearJarCache();
+
+   File save(String symbolicName, String md5Digest, InputStream servedBundleIn) throws IOException;
+
+   File get(String symbolicName, String md5Digest) throws FileNotFoundException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEStatusCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEStatusCallback.java
new file mode 100644
index 0000000..28a1511
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEStatusCallback.java
@@ -0,0 +1,18 @@
+package org.eclipse.osee.ote;
+
+
+public interface OTEStatusCallback<V> {
+
+   void complete(V done);
+   
+   void setTotalUnitsOfWork(int totalUnitsOfWork);
+   
+   void incrememtUnitsWorked(int count);
+
+   void log(String message);
+
+   void error(String message, Throwable th);
+   
+   void error(String message);
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTETestEnvironmentClient.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTETestEnvironmentClient.java
new file mode 100644
index 0000000..7743f7b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTETestEnvironmentClient.java
@@ -0,0 +1,388 @@
+package org.eclipse.osee.ote;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.URISyntaxException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+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.classserver.HeadlessClassServer;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.endpoint.OteEndpointUtil;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.filetransfer.TcpFileTransfer;
+import org.eclipse.osee.ote.filetransfer.TcpFileTransferHandle;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEndpointSendEventMessage;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageFuture;
+import org.eclipse.osee.ote.message.event.send.OteSendEventMessage;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.remote.messages.BooleanResponse;
+import org.eclipse.osee.ote.remote.messages.ConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.DisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.RequestHostEnvironmentProperties;
+import org.eclipse.osee.ote.remote.messages.RequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.RunTestsCancel;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultReq;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultResp;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsCancelled;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsDone;
+import org.eclipse.osee.ote.remote.messages.RunTestsSerialized;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedConnectionRequestResult;
+import org.eclipse.osee.ote.remote.messages.SerializedDisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedEnhancedProperties;
+import org.eclipse.osee.ote.remote.messages.SerializedOTEJobStatus;
+import org.eclipse.osee.ote.remote.messages.SerializedRequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentServerShutdown;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentSetBatchMode;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentTransferFile;
+import org.osgi.service.event.EventAdmin;
+
+public class OTETestEnvironmentClient {
+
+   private OteUdpEndpoint service;
+   private InetSocketAddress destinationAddress;
+   private ExecutorService pool;
+   
+   public static OTETestEnvironmentClient getInstance(String endpoint){
+      return new OTETestEnvironmentClient(ServiceUtility.getService(OteUdpEndpoint.class), OteEndpointUtil.getAddress(endpoint));
+   }
+   
+   public OTETestEnvironmentClient(OteUdpEndpoint service, InetSocketAddress destinationAddress) {
+      this.service = service;
+      this.destinationAddress = destinationAddress;
+      this.pool = Executors.newCachedThreadPool(new ThreadFactory() {
+         
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setName("OTETestEnvironmentClient Thread");
+            return th;
+         }
+      });
+   }
+   
+   public void shutdownServer(String serverId){
+      TestEnvironmentServerShutdown shutdown = new TestEnvironmentServerShutdown();
+      shutdown.SERVER_ID.setValue(serverId);
+      OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+      sendit.asynchSend(shutdown);
+   }
+   
+   public boolean getServerFile(File localFile, File serverFile) throws IOException, ExecutionException, InterruptedException{
+      TcpFileTransferHandle receiveFile = TcpFileTransfer.receiveFile(pool, localFile, 0);
+      TestEnvironmentTransferFile transferFile = new TestEnvironmentTransferFile();
+      transferFile.ADDRESS.setAddress(receiveFile.getLocalAddress().getAddress());
+      transferFile.ADDRESS.setPort(receiveFile.getLocalAddress().getPort());
+      transferFile.FILE_PATH.setValue(serverFile.getAbsolutePath());
+      OteEventMessageUtil.sendEvent(transferFile);
+      return receiveFile.awaitCompletion();      
+   }
+   
+   public void setBatchMode(boolean batchMode) throws URISyntaxException, InterruptedException, ExecutionException, IOException {
+      TestEnvironmentSetBatchMode setBatchMode = new TestEnvironmentSetBatchMode();
+      setBatchMode.SET_BATCH_MODE.setValue(batchMode);
+      OteEventMessageUtil.postEvent(setBatchMode);
+   }
+   
+   public ICommandHandle runScripts(UUID sessionId, PropertyStore globalProperties, List<IPropertyStore> scriptProperties, boolean useOTEBuilderJars, File rootFolderForOTEBuilderJars, SubProgressMonitor monitor, String serverId, ConfigurationStatusCallback configurationStatusCallback) throws URISyntaxException, InterruptedException, ExecutionException, IOException {
+      Configuration configuration = null;
+      if(useOTEBuilderJars){
+         configuration = configureEnvironment(serverId, rootFolderForOTEBuilderJars, monitor, configurationStatusCallback);
+      }
+      RunTests runTests = new RunTests(UUID.randomUUID().toString(), sessionId, configuration, globalProperties, scriptProperties);
+      
+      OteEventMessageUtil.postEvent(new RunTestsSerialized(runTests));
+      return new EventRunTestsHandle(runTests.getGUID(), new OteSendEventMessage(ServiceUtility.getService(EventAdmin.class)));
+   }
+
+   public Configuration configureEnvironment(String serverId, final List<File> bundlesToSend, final boolean installBundles, final SubProgressMonitor monitor, final ConfigurationStatusCallback configurationStatusCallback) {
+      HeadlessClassServer classServer = null;
+      Configuration localConfiguration = new Configuration();
+      try{
+       
+         classServer = new HeadlessClassServer(PortUtil.getInstance().getValidPort(), InetAddress.getLocalHost(), bundlesToSend);
+         for (BundleInfo bundleInfo : classServer.getBundles()) {
+            ConfigurationItem item = new ConfigurationItem(bundleInfo.getServerBundleLocation().toString(),bundleInfo.getVersion(),bundleInfo.getSymbolicName(), bundleInfo.getMd5Digest(), installBundles);
+            localConfiguration.addItem(item);
+         }
+         
+         if(service != null){
+            InetSocketAddress address = service.getLocalEndpoint();
+            ConfigurationAndResponse configAndResponse = new ConfigurationAndResponse(address.getAddress().getHostAddress(), address.getPort(), localConfiguration, installBundles, serverId);
+            SerializedConfigurationAndResponse ser = new SerializedConfigurationAndResponse();
+            ser.setObject(configAndResponse);
+            ser.getHeader().RESPONSE_TOPIC.setValue(SerializedOTEJobStatus.EVENT);
+
+            OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+            service.removeBroadcast(null);
+            service.addBroadcast(service.getOteEndpointSender(destinationAddress));//so we can communicate via console before connect
+            WaitForCompletion completion = new WaitForCompletion(monitor);
+            final OteEventMessageFuture<SerializedConfigurationAndResponse, SerializedOTEJobStatus> asynchSendAndResponse = sendit.asynchSendAndMultipleResponse(SerializedOTEJobStatus.class, ser, completion,  1000 * 60 * 10);
+            Thread th = new Thread(new Runnable(){
+               @Override
+               public void run() {
+                  while(true){
+                     if(monitor != null && monitor.isCanceled()){
+                        asynchSendAndResponse.complete();
+                        return;
+                     } else if (asynchSendAndResponse.isDone()){
+                        return;
+                     } else {
+                        try {
+                           Thread.sleep(2000);
+                        } catch (InterruptedException e) {
+                        }
+                     }
+                  }
+               }
+            });
+            th.setDaemon(true);
+            th.start();
+            asynchSendAndResponse.waitForCompletion();
+            if(!asynchSendAndResponse.isTimedOut() && completion.getStatus() != null){
+               if(completion.getStatus().isSuccess()){
+                  configurationStatusCallback.success();
+               } else {
+                  String errorLog = completion.getStatus().getErrorLog();
+                  if(errorLog.length() > 0){
+                     configurationStatusCallback.failure(errorLog);
+                  } else {//no diff report, must be the same version
+                     configurationStatusCallback.success();
+                  }
+               }
+            }
+         }
+      } catch (Throwable th){
+         th.printStackTrace();
+      } finally {
+         if(classServer != null){
+            classServer.stop();
+         }
+      }
+      return localConfiguration;
+   }
+   
+   private Configuration configureEnvironment(String serverId, final File oteBuilderRootFolder, final SubProgressMonitor monitor, final ConfigurationStatusCallback configurationStatusCallback) {
+      HeadlessClassServer classServer = null;
+      Configuration localConfiguration = new Configuration();
+      try{
+         List<File> bundlesToSend = new ArrayList<>();
+         bundlesToSend.add(oteBuilderRootFolder);
+         classServer = new HeadlessClassServer(PortUtil.getInstance().getValidPort(), InetAddress.getLocalHost(), bundlesToSend);
+         File[] jars = oteBuilderRootFolder.listFiles(new FilenameFilter(){
+            @Override
+            public boolean accept(File arg0, String arg1) {
+               return arg1.endsWith(".jar");
+            }
+         });
+         for (File jar : jars) {
+            try{
+               ConfigurationItem item = new ConfigurationItem(classServer.getHostName() + jar.getName(), "1.0", jar.getName(), Lib.fileToString(new File(jar.getAbsolutePath() + ".md5")), false);
+               localConfiguration.addItem(item);
+            } catch (IOException ex) {
+               OseeLog.log(OTETestEnvironmentClient.class, Level.SEVERE, ex);
+            }
+         }
+         
+         if(service != null){
+            InetSocketAddress address = service.getLocalEndpoint();
+            ConfigurationAndResponse configAndResponse = new ConfigurationAndResponse(address.getAddress().getHostAddress(), address.getPort(), localConfiguration, false, serverId);
+            SerializedConfigurationAndResponse ser = new SerializedConfigurationAndResponse();
+            ser.setObject(configAndResponse);
+            ser.getHeader().RESPONSE_TOPIC.setValue(SerializedOTEJobStatus.EVENT);
+
+            OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+            WaitForCompletion completion = new WaitForCompletion(monitor);
+            final OteEventMessageFuture<SerializedConfigurationAndResponse, SerializedOTEJobStatus> asynchSendAndResponse = sendit.asynchSendAndMultipleResponse(SerializedOTEJobStatus.class, ser, completion,  1000 * 60 * 10);
+            Thread th = new Thread(new Runnable(){
+               @Override
+               public void run() {
+                  while(true){
+                     if(monitor.isCanceled()){
+                        asynchSendAndResponse.complete();
+                        return;
+                     } else if (asynchSendAndResponse.isDone()){
+                        return;
+                     } else {
+                        try {
+                           Thread.sleep(2000);
+                        } catch (InterruptedException e) {
+                        }
+                     }
+                  }
+               }
+            });
+            th.setDaemon(true);
+            th.start();
+            asynchSendAndResponse.waitForCompletion();
+            if(!asynchSendAndResponse.isTimedOut() && completion.getStatus() != null){
+               if(completion.getStatus().isSuccess()){
+                  configurationStatusCallback.success();
+               } else {
+                  String errorLog = completion.getStatus().getErrorLog();
+                  if(errorLog.length() > 0){
+                     configurationStatusCallback.failure(errorLog);
+                  } else {//no diff report, must be the same version
+                     configurationStatusCallback.success();
+                  }
+               }
+            }
+         }
+      } catch (Throwable th){
+         th.printStackTrace();
+      } finally {
+         if(classServer != null){
+            classServer.stop();
+         }
+      }
+      return localConfiguration;
+   }
+   
+   private static class EventRunTestsHandle implements ICommandHandle {
+
+      private String guid;
+      private OteSendEventMessage sendit;
+      
+      public EventRunTestsHandle(String guid, OteSendEventMessage sendit){
+         this.guid = guid;
+         this.sendit = sendit;
+      }
+      
+      @Override
+      public boolean cancelAll(boolean mayInterruptIfRunning) {
+         RunTestsCancel cancel = new RunTestsCancel();
+         cancel.CANCEL_ALL.setValue(true);
+         cancel.GUID.setValue(guid);
+         sendit.asynchSend(cancel);
+         return true;
+      }
+
+      @Override
+      public boolean cancelSingle(boolean mayInterruptIfRunning) {
+         RunTestsCancel cancel = new RunTestsCancel();
+         cancel.CANCEL_ALL.setValue(false);
+         cancel.GUID.setValue(guid);
+         sendit.asynchSend(cancel);
+         return true;
+      }
+
+      @Override
+      public ITestCommandResult get() {
+         RunTestsGetCommandResultReq req = new RunTestsGetCommandResultReq();
+         RunTestsGetCommandResultResp resp = new RunTestsGetCommandResultResp();
+         req.GUID.setValue(guid);
+         resp = sendit.synchSendAndResponse(resp, req, 30000);
+         ITestCommandResult result = null;
+         try {
+            result = resp.getObject();
+         } catch (IOException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+         return result;
+      }
+
+      @Override
+      public boolean isCancelled() {
+         BooleanResponse booleanResponse = new BooleanResponse();
+         RunTestsIsCancelled req = new RunTestsIsCancelled();
+         req.GUID.setValue(guid);
+         booleanResponse = sendit.synchSendAndResponse(booleanResponse, req, 20000);
+         return booleanResponse.VALUE.getValue();
+      }
+
+      @Override
+      public boolean isDone() {
+         BooleanResponse booleanResponse = new BooleanResponse();
+         RunTestsIsDone req = new RunTestsIsDone();
+         req.GUID.setValue(guid);
+         booleanResponse = sendit.synchSendAndResponse(booleanResponse, req, 20000);
+         return booleanResponse.VALUE.getValue();
+      }      
+
+      @Override
+      public String getCommandKey() {
+         return guid;
+      }
+      
+   }
+   
+   public EnhancedProperties getProperties(long timeout) {
+      SerializedEnhancedProperties props = new SerializedEnhancedProperties();
+      RequestHostEnvironmentProperties req = new RequestHostEnvironmentProperties();
+      OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+      props = sendit.synchSendAndResponse(props, req, timeout);
+      EnhancedProperties returnVal = null;
+      try {
+         if(props != null){
+            returnVal = props.getObject();
+         }
+      } catch (IOException e) {
+         e.printStackTrace();
+      } catch (ClassNotFoundException e) {
+         e.printStackTrace();
+      }
+      return returnVal;
+   }
+   
+   public ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID id, TestEnvironmentConfig config) throws RemoteException {
+      Thread.currentThread().setContextClassLoader(new ExportClassLoader());
+      try {
+         SerializedRequestRemoteTestEnvironment req = new SerializedRequestRemoteTestEnvironment(new RequestRemoteTestEnvironment(session, id, config));
+         SerializedConnectionRequestResult result = new SerializedConnectionRequestResult();
+         OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+         result = sendit.synchSendAndResponse(result, req, OtePropertiesCore.serverConnectionTimeout.getLongValue(1000 * 30));
+         if(result != null){
+            return result.getObject();
+         }
+      } catch (IOException e) {
+         e.printStackTrace();
+      } catch (ClassNotFoundException e) {
+         e.printStackTrace();
+      }
+      return null;
+   }
+   
+   public void disconnect(UUID sessionId) throws RemoteException {
+      try {
+         SerializedDisconnectRemoteTestEnvironment req = new SerializedDisconnectRemoteTestEnvironment(new DisconnectRemoteTestEnvironment(sessionId));
+         OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+         sendit.asynchSend(req);
+         if(service != null){
+            service.removeBroadcast(service.getOteEndpointSender(destinationAddress));
+         }
+      } catch (IOException e) {
+         e.printStackTrace();
+      } 
+   }
+   
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OseeLogStatusCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OseeLogStatusCallback.java
new file mode 100644
index 0000000..d33f641
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OseeLogStatusCallback.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class OseeLogStatusCallback implements OTEStatusCallback<ConfigurationStatus> {
+
+   @Override
+   public void complete(ConfigurationStatus done) {
+      OseeLog.log(getClass(), Level.INFO, done.getMessage());
+   }
+
+   @Override
+   public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+      
+   }
+
+   @Override
+   public void incrememtUnitsWorked(int count) {
+      
+   }
+
+   @Override
+   public void log(String message) {
+      OseeLog.log(getClass(), Level.INFO, message);
+   }
+
+   @Override
+   public void error(String message, Throwable th) {
+      OseeLog.log(getClass(), Level.SEVERE, message, th);      
+   }
+
+   @Override
+   public void error(String message) {
+      OseeLog.log(getClass(), Level.SEVERE, message);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/WaitForCompletion.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/WaitForCompletion.java
new file mode 100644
index 0000000..883d120
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/WaitForCompletion.java
@@ -0,0 +1,67 @@
+package org.eclipse.osee.ote;
+
+import java.io.IOException;
+
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageFuture;
+import org.eclipse.osee.ote.remote.messages.JobStatus;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedOTEJobStatus;
+
+class WaitForCompletion implements OteEventMessageCallable<SerializedConfigurationAndResponse, SerializedOTEJobStatus> {
+
+   private SubProgressMonitor monitor;
+   private int lastUnitsWorked = 0;
+   private boolean firstTime = true;
+   private JobStatus status;
+
+   WaitForCompletion(SubProgressMonitor monitor) {
+      this.monitor = monitor;
+   }
+
+   @Override
+   public void call(SerializedConfigurationAndResponse transmitted, SerializedOTEJobStatus recieved, OteEventMessageFuture<?, ?> future) {
+      
+      try {
+         this.status = recieved.getObject();
+         reportStatus(status, future);
+      } catch (IOException e) {
+         e.printStackTrace();
+      } catch (ClassNotFoundException e) {
+         e.printStackTrace();
+      }
+   }
+
+   private synchronized void reportStatus(JobStatus status, OteEventMessageFuture<?, ?> future) {
+      if(monitor != null){
+         if(monitor.isCanceled() || status.isJobComplete()){
+            monitor.done();
+            future.complete();
+            return;
+         }
+         if(firstTime){
+            monitor.beginTask("Configure Test Server", status.getTotalUnitsOfWork());
+            firstTime = false;
+         } else {
+            monitor.worked(status.getUnitsWorked() - lastUnitsWorked);
+            lastUnitsWorked = status.getUnitsWorked();
+         }
+      } else {
+         if(status.isJobComplete()){
+            future.complete();
+            return;
+         }
+      }
+   }
+
+   @Override
+   public void timeout(SerializedConfigurationAndResponse transmitted) {
+      System.out.println("timed out");
+   }
+   
+   public JobStatus getStatus(){
+      return this.status;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/BundleResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/BundleResourceFinder.java
new file mode 100644
index 0000000..0d01b46
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/BundleResourceFinder.java
@@ -0,0 +1,34 @@
+package org.eclipse.osee.ote.classserver;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.core.BundleInfo;
+
+public class BundleResourceFinder extends ResourceFinder {
+
+   private final List<BundleInfo> bundleInfo;
+
+   public BundleResourceFinder(List<BundleInfo> bundleInfo) {
+      super();
+      this.bundleInfo = bundleInfo;
+   }
+
+   @Override
+   public byte[] find(String path) throws IOException {
+      for (BundleInfo info : bundleInfo) {
+         if (info.getSymbolicName().equals(path) || info.getFile().getName().equals(path)) {
+            return Lib.inputStreamToBytes(new FileInputStream(info.getFile()));
+         } 
+      }
+      return null;
+   }
+
+   @Override
+   public void dispose() {
+      //
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassFinder.java
new file mode 100644
index 0000000..24914a5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassFinder.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.classserver;
+
+import java.io.IOException;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.osgi.framework.Bundle;
+
+public class ClassFinder extends ResourceFinder {
+
+   private final ExportClassLoader loader = new ExportClassLoader();
+
+   @Override
+   public void dispose() {
+   }
+
+   @Override
+   public byte[] find(String path) throws IOException {
+      Bundle bundle = loader.getExportingBundle(path);
+      if (bundle != null) {
+         return getBytes(bundle.getResource(path).openStream());
+      }
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServer.java
new file mode 100644
index 0000000..10d605f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServer.java
@@ -0,0 +1,318 @@
+/*******************************************************************************
+ * 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.classserver;
+
+import java.io.BufferedInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class ClassServer extends Thread {
+   private ServerSocket server;
+   private URL hostName;
+   private List<ResourceFinder> resourceFinders;
+
+   private ExecutorService socketThreads;
+
+   /**
+    * Construct a server
+    * 
+    * @param port the port to use
+    * @throws IOException if the server socket cannot be created
+    */
+   public ClassServer(int port, InetAddress address) throws IOException {
+      server = new ServerSocket(port, 50, address);
+      socketThreads = Executors.newCachedThreadPool(new ThreadFactory() {
+
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0, "ClassServer Task");
+            th.setDaemon(true);
+            return th;
+         }
+      });
+      if(address instanceof Inet6Address){
+    	 hostName = new URL("http://[" + address.getHostAddress() + "]:" + server.getLocalPort() + "/"); 
+      } else { 
+         hostName = new URL("http://" + address.getHostAddress() + ":" + server.getLocalPort() + "/");
+   	  }
+      this.setName("OSEE ClassServer");
+      this.resourceFinders = new ArrayList<>();
+   }
+
+   public void addResourceFinder(ResourceFinder finder) {
+      this.resourceFinders.add(finder);
+   }
+
+   /**
+    * Spawn a thread for each connection requesting service
+    */
+   @Override
+   public void run() {
+
+      String msg = "ClassServer started [";
+
+      msg += "port ";
+      msg += Integer.toString(getPort());
+      msg += "]";
+
+      OseeLog.log(ClassServer.class, Level.INFO, msg);
+      try {
+         while (true) {
+            Socket socket = server.accept();
+            socketThreads.submit(new Task(socket));
+         }
+      } catch (IOException e) {
+         synchronized (this) {
+            if (!server.isClosed()) {
+               OseeLog.log(ClassServer.class, Level.SEVERE, "accepting connection", e);
+               terminate();
+               OseeLog.log(ClassServer.class, Level.WARNING, "ClassServer Terminated");
+            }
+         }
+      }
+   }
+
+   /**
+    * Terminate Server - perform cleanup
+    */
+   public synchronized void terminate() {
+      try {
+         server.close();
+      } catch (IOException e) {
+         // do nothing
+      }
+      final Iterator<ResourceFinder> iter = resourceFinders.iterator();
+      while (iter.hasNext()) {
+         final ResourceFinder resFinder = iter.next();
+         resFinder.dispose();
+      }
+
+   }
+
+   /** Returns the port on which this server is listening. */
+   public int getPort() {
+      return server.getLocalPort();
+   }
+
+   /** Read up to CRLF, return false if EOF */
+   private static boolean readLine(InputStream in, StringBuffer buf) throws IOException {
+      while (true) {
+         int c = in.read();
+         if (c < 0) {
+            return buf.length() > 0;
+         }
+         if (c == '\r') {
+            in.mark(1);
+            c = in.read();
+            if (c != '\n') {
+               in.reset();
+            }
+            return true;
+         }
+         if (c == '\n') {
+            return true;
+         }
+         buf.append((char) c);
+      }
+   }
+
+   /** Read the request/response and return the initial line. */
+   private static String getInput(Socket sock, boolean isRequest) throws IOException {
+      BufferedInputStream in = new BufferedInputStream(sock.getInputStream(), 256);
+      StringBuffer buf = new StringBuffer(80);
+      do {
+         if (!readLine(in, buf)) {
+            return null;
+         }
+      } while (isRequest && buf.length() == 0);
+      String initial = buf.toString();
+      do {
+         buf.setLength(0);
+      } while (readLine(in, buf) && buf.length() > 0);
+      return initial;
+   }
+
+   /**
+    * This method provides a way for subclasses to be notified when a file has been completely downloaded.
+    * 
+    * @param fp The path to the file that was downloaded.
+    */
+   protected void fileDownloaded(String fp, InetAddress addr) {
+   }
+
+   public URL getHostName() {
+      return hostName;
+   }
+
+   private class Task implements Runnable {// Thread {
+
+      private final Socket sock;
+
+      public Task(Socket sock) {
+         this.sock = sock;
+         //         setDaemon(true);
+      }
+
+      /**
+       * Get bytes from path Returns the bytes of the requested file, or null if not found.
+       */
+      private byte[] getBytes(String path) throws IOException {
+         byte[] bytes = null;
+         for (int i = 0; i < resourceFinders.size(); i++) {
+            ResourceFinder finder = resourceFinders.get(i);
+            bytes = finder.find(path);
+            if (bytes != null) {
+               return bytes;
+            }
+         }
+         OseeLog.log(ClassServer.class, Level.INFO, "requested file: '" + path + "' was not found.");
+         return null;
+      }
+
+      /** Parse % HEX HEX from s starting at i */
+      private char decode(String s, int i) {
+         return (char) Integer.parseInt(s.substring(i + 1, i + 3), 16);
+      }
+
+      private String getCanonicalizedPath(String path) {
+         try {
+            if (path.regionMatches(true, 0, "http://", 0, 7)) {
+               int i = path.indexOf('/', 7);
+               if (i < 0) {
+                  path = "/";
+               } else {
+                  path = path.substring(i);
+               }
+            }
+            for (int i = path.indexOf('%'); i >= 0; i = path.indexOf('%', i + 1)) {
+               char c = decode(path, i);
+               int n = 3;
+               if ((c & 0x80) != 0) {
+                  switch (c >> 4) {
+                     case 0xC:
+                     case 0xD:
+                        n = 6;
+                        c = (char) ((c & 0x1F) << 6 | decode(path, i + 3) & 0x3F);
+                        break;
+                     case 0xE:
+                        n = 9;
+                        c = (char) ((c & 0x0f) << 12 | (decode(path, i + 3) & 0x3F) << 6 | decode(path, i + 6) & 0x3F);
+                        break;
+                     default:
+                        return null;
+                  }
+               }
+               path = path.substring(0, i) + c + path.substring(i + n);
+            }
+         } catch (Exception e) {
+            return null;
+         }
+         if (path.length() == 0 || path.charAt(0) != '/') {
+            return null;
+         }
+         return path.substring(1);
+      }
+
+      @Override
+      public void run() {
+         try {
+            DataOutputStream out = new DataOutputStream(sock.getOutputStream());
+            String req;
+            try {
+               req = getInput(sock, true);
+            } catch (Exception e) {
+               OseeLog.log(ClassServer.class, Level.INFO, "reading request", e);
+               return;
+            }
+            if (req == null) {
+               return;
+            }
+            if (req.startsWith("SHUTDOWN *")) {
+               out.writeBytes("HTTP/1.0 403 Forbidden\r\n\r\n");
+               out.flush();
+               return;
+            }
+            String[] args = null;
+            boolean get = req.startsWith("GET ");
+            if (!get && !req.startsWith("HEAD ")) {
+               OseeLog.log(ClassServer.class, Level.FINE, "bad request \"{0}\" from {1}:{2}");
+               out.writeBytes("HTTP/1.0 400 Bad Request\r\n\r\n");
+               out.flush();
+               return;
+            }
+            String path = req.substring(get ? 4 : 5);
+            int i = path.indexOf(' ');
+            if (i > 0) {
+               path = path.substring(0, i);
+            }
+            path = getCanonicalizedPath(path);
+            if (path == null) {
+               OseeLog.log(ClassServer.class, Level.FINE, "bad request \"{0}\" from {1}:{2}");
+               out.writeBytes("HTTP/1.0 400 Bad Request\r\n\r\n");
+               out.flush();
+               return;
+            }
+            if (args != null) {
+               args[0] = path;
+            }
+            OseeLog.log(ClassServer.class, Level.FINER,
+               get ? "{0} requested from {1}:{2}" : "{0} probed from {1}:{2}");
+            byte[] bytes;
+            try {
+               bytes = getBytes(path);
+            } catch (Exception e) {
+               OseeLog.log(ClassServer.class, Level.WARNING, "getting bytes", e);
+               out.writeBytes("HTTP/1.0 500 Internal Error\r\n\r\n");
+               out.flush();
+               return;
+            }
+            if (bytes == null) {
+               OseeLog.logf(ClassServer.class, Level.FINE, "%s not found", path);
+               out.writeBytes("HTTP/1.0 404 Not Found\r\n\r\n");
+               out.flush();
+               return;
+            }
+            out.writeBytes("HTTP/1.0 200 OK\r\n");
+            out.writeBytes("Content-Length: " + bytes.length + "\r\n");
+            out.writeBytes("Content-Type: application/java\r\n\r\n");
+            if (get) {
+               out.write(bytes);
+            }
+            out.flush();
+            if (get) {
+               fileDownloaded(path, sock.getInetAddress());
+            }
+         } catch (Exception e) {
+            OseeLog.log(ClassServer.class, Level.INFO, "writing response", e);
+         } finally {
+            try {
+               sock.close();
+            } catch (IOException e) {
+            }
+         }
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServerPermissions.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServerPermissions.java
new file mode 100644
index 0000000..3047dc6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServerPermissions.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.classserver;
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ClassServerPermissions extends PermissionCollection {
+
+   private static final long serialVersionUID = 7752469678730039503L;
+   private final ArrayList<Permission> list;
+
+   public ClassServerPermissions() {
+      list = new ArrayList<>();
+   }
+
+   @Override
+   public void add(Permission permission) {
+      list.add(permission);
+   }
+
+   @Override
+   public boolean implies(Permission permission) {
+      for (int i = 0; i < list.size(); i++) {
+         if (list.get(i).implies(permission)) {
+            return true;
+         }
+      }
+      return false;
+   }
+
+   @Override
+   public Enumeration<Permission> elements() {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/FrameworkResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/FrameworkResourceFinder.java
new file mode 100644
index 0000000..c5260fd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/FrameworkResourceFinder.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.classserver;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+public class FrameworkResourceFinder extends ResourceFinder{
+
+	@Override
+	public byte[] find(String path) throws IOException {
+		for(Bundle bundle:FrameworkUtil.getBundle(getClass()).getBundleContext().getBundles()){
+			URL url = bundle.getResource(path);
+			if (url != null) {
+				return getBytes(url.openStream());
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public void dispose() {
+		
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/HeadlessClassServer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/HeadlessClassServer.java
new file mode 100644
index 0000000..2988e3f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/HeadlessClassServer.java
@@ -0,0 +1,88 @@
+package org.eclipse.osee.ote.classserver;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osee.ote.core.BundleInfo;
+
+
+
+public class HeadlessClassServer {
+
+	private ClassServer classServer;
+	private List<BundleInfo> jars;
+	
+	public HeadlessClassServer(int port, InetAddress address, List<File> bundleFolders) throws IOException{
+//		Thread.currentThread().setName("BundleClassServer");
+		classServer = new ClassServer(port, address);
+		jars = new ArrayList<>();
+		for(File dir:bundleFolders){
+			if(dir.exists() && dir.isDirectory()){
+				findJarFiles(dir, jars);
+			} else if(dir.exists()){//it may be a jar
+			   BundleInfo info = getBundleInfo(dir);
+            if(info != null){
+               jars.add(info);
+            }
+			}
+		}
+		BundleResourceFinder bundleResourceFinder = new BundleResourceFinder(jars); 
+		classServer.addResourceFinder(bundleResourceFinder);
+		classServer.start();
+	
+	}
+	
+	public void stop(){
+		classServer.terminate();
+	}
+	
+	public List<BundleInfo> getBundles(){
+		return jars;
+	}
+
+	private void findJarFiles(File dir, final List<BundleInfo> jars) {
+		dir.listFiles(new FileFilter(){
+			@Override
+			public boolean accept(File pathname) {
+				if(pathname.isDirectory()){
+					findJarFiles(pathname, jars);
+				} else {
+				   BundleInfo info = getBundleInfo(pathname);
+				   if(info != null){
+				      jars.add(info);
+				   }
+				}
+				return false;
+			}
+		});
+	}
+	
+	private BundleInfo getBundleInfo(File file){
+	   BundleInfo bundleInfo = null;
+      try {
+         if(file.getAbsolutePath().endsWith(".jar")){
+            bundleInfo = new BundleInfo(file.toURI().toURL(), getHostName().toExternalForm(), true);
+            if(bundleInfo.getSymbolicName() != null && !bundleInfo.getSymbolicName().equalsIgnoreCase("unknown") && bundleInfo.getVersion() != null){
+               if(bundleInfo.getManifest() == null){
+                  bundleInfo = null;
+               } 
+            }  
+         }
+      } catch (MalformedURLException e) {
+         e.printStackTrace();
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+      return bundleInfo;
+	}
+
+	public URL getHostName(){
+		return classServer.getHostName();
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/PathResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/PathResourceFinder.java
new file mode 100644
index 0000000..31b8dc2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/PathResourceFinder.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * 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.classserver;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilePermission;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class PathResourceFinder extends ResourceFinder {
+
+   private final HashSet<JarFile> jars = new HashSet<>(128);
+   private final HashSet<String> dirs = new HashSet<>(128);
+   private final HashMap<String, JarFile[]> map = new HashMap<>(128);
+   private final boolean trees;
+   private final ClassServerPermissions perm;
+   private static final int NUMBER_OF_FILE_READ_ATTEMPTS = 20;
+
+   public PathResourceFinder(String[] dirsToAdd, boolean trees) {
+      this.trees = trees;
+      perm = new ClassServerPermissions();
+      if (dirsToAdd != null) {
+         addPaths(dirsToAdd);
+      }
+   }
+
+   @Override
+   public byte[] find(String path) throws IOException {
+
+      int i = path.indexOf('/');
+      if (i > 0) {
+         JarFile[] jfs = map.get(path.substring(0, i));
+         if (jfs != null) {
+            String jpath = path.substring(i + 1);
+            for (i = 0; i < jfs.length; i++) {
+               JarEntry je = jfs[i].getJarEntry(jpath);
+               if (je != null) {
+                  return getBytes(jfs[i].getInputStream(je), je.getSize());
+               }
+            }
+         }
+      }
+      synchronized (jars) {
+         Iterator<JarFile> it = jars.iterator();
+         while (it.hasNext()) {
+            JarFile jar = it.next();
+            JarEntry je = jar.getJarEntry(path);
+            if (je != null) {
+               return getBytes(jar.getInputStream(je), je.getSize());
+            }
+         }
+      }
+      boolean exists = false;
+      File f = null;
+      synchronized (dirs) {
+         for (int j = 0; j < NUMBER_OF_FILE_READ_ATTEMPTS; j++) { // we'll retry in case there is a
+            // compile going on
+            Iterator<String> it = dirs.iterator();
+            while (it.hasNext()) {
+               String dirString = it.next();
+               f = new File(dirString + File.separatorChar + path.replace('/', File.separatorChar));
+               if (f.exists()) {
+                  exists = true;
+                  break;
+               }
+            }
+            if (!exists) {
+               try {
+                  synchronized (this) {
+                     this.wait(1000);
+                  }
+                  System.err.println(String.format("trying to find :%s %d", path, j));
+               } catch (InterruptedException ex) {
+               }
+            } else {
+               break;
+            }
+         }
+      }
+
+      if (exists) {
+         if (perm.implies(new FilePermission(f.getPath(), "read"))) {
+            try {
+               return getBytes(new FileInputStream(f), f.length());
+            } catch (FileNotFoundException e) {
+            }
+         }
+      }
+      return null;
+   }
+
+   public void addPaths(String[] paths) {
+
+      for (int i = 0; i < paths.length; i++) {
+         String path = paths[i];
+
+         if (path.startsWith("file:\\")) {
+            path = path.substring(6);
+         }
+
+         if (path.endsWith(".jar")) {
+            try {
+               synchronized (jars) {
+                  jars.add(new JarFile(new File(path)));
+               }
+            } catch (Exception ex) {
+               ex.printStackTrace();
+               continue;
+            }
+         } else {
+            if (dirs.add(path)) {
+               perm.add(new FilePermission(path + File.separator + '-', "read"));
+            }
+         }
+
+         if (trees) {
+            File fdir = new File(path);
+            String[] files = fdir.list();
+            if (files != null) {
+               try {
+                  URL base = fdir.toURI().toURL();
+                  for (int j = 0; j < files.length; j++) {
+                     String jar = files[j];
+                     if (jar.endsWith(".jar") || jar.endsWith(".zip")) {
+                        ArrayList<JarFile> jfs = new ArrayList<>(10);
+                        try {
+                           addJar(jar, jfs, base);
+                           map.put(jar.substring(0, jar.length() - 4), jfs.toArray(new JarFile[jfs.size()]));
+                        } catch (IOException ex) {
+                           ex.printStackTrace();
+                        }
+                     }
+                  }
+               } catch (MalformedURLException ex) {
+                  ex.printStackTrace();
+               }
+            }
+         }
+      }
+   }
+
+   /** Add transitive Class-Path JARs to jfs. */
+   private void addJar(String jar, ArrayList<JarFile> jfs, URL base) throws IOException {
+      base = new URL(base, jar);
+      jar = base.getFile().replace('/', File.separatorChar);
+      for (int i = jfs.size(); --i >= 0;) {
+         if (jar.equals(jfs.get(i).getName())) {
+            return;
+         }
+      }
+
+      JarFile jf = new JarFile(jar);
+      jfs.add(jf);
+      try {
+         Manifest man = jf.getManifest();
+         if (man == null) {
+            return;
+         }
+         Attributes attrs = man.getMainAttributes();
+         if (attrs == null) {
+            return;
+         }
+         String val = attrs.getValue(Attributes.Name.CLASS_PATH);
+         if (val == null) {
+            return;
+         }
+         for (StringTokenizer st = new StringTokenizer(val); st.hasMoreTokens();) {
+            addJar(st.nextToken(), jfs, base);
+         }
+      } catch (IOException ex) {
+         jfs.remove(jf);
+         jf.close();
+         throw ex;
+      }
+   }
+
+   /**
+    * Finds the jarFile if it is being served.
+    * 
+    * @param name The name of the jar file
+    * @return The jar represented as a File, or null if the jar was not found.
+    */
+   public File getJarFile(String name) {
+      File jarFileReturn = null;
+      synchronized (jars) {
+         Iterator<JarFile> it = jars.iterator();
+         while (it.hasNext()) {
+            JarFile jarFile = it.next();
+            if (jarFile.getName().endsWith(File.separator + name)) {
+               jarFileReturn = new File(jarFile.getName());
+               break;
+            }
+         }
+      }
+      return jarFileReturn;
+   }
+
+   public void removeJarFile(String name) {
+      synchronized (jars) {
+         Iterator<JarFile> it = jars.iterator();
+         while (it.hasNext()) {
+            JarFile jarFile = it.next();
+            if (jarFile.getName().endsWith(File.separator + name)) {
+               try {
+                  OseeLog.log(ClassServer.class, Level.INFO, "removing JAR file " + name);
+                  jarFile.close();
+               } catch (IOException ex) {
+                  // do nothing
+               }
+               it.remove();
+               return;
+            }
+         }
+      }
+   }
+
+   @Override
+   public void dispose() {
+      synchronized (jars) {
+         OseeLog.log(ClassServer.class, Level.INFO, "disposing path resource finder's cached JAR files");
+         Iterator<JarFile> it = jars.iterator();
+         while (it.hasNext()) {
+            JarFile jarFile = it.next();
+            try {
+               jarFile.close();
+            } catch (IOException ex) {
+               ex.printStackTrace();
+            }
+         }
+         jars.clear();
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ResourceFinder.java
new file mode 100644
index 0000000..ae6a68d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ResourceFinder.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.classserver;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public abstract class ResourceFinder {
+
+   public abstract byte[] find(String path) throws IOException;
+
+   public byte[] getBytes(InputStream in, long length) throws IOException {
+      DataInputStream din = new DataInputStream(in);
+      byte[] bytes = new byte[(int) length];
+      try {
+         din.readFully(bytes);
+      } finally {
+         din.close();
+      }
+      return bytes;
+   }
+
+   public byte[] getBytes(InputStream stream) throws IOException {
+      return getBytes(stream, stream.available());
+   }
+
+   public abstract void dispose();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/classserver.properties b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/classserver.properties
new file mode 100644
index 0000000..d9c2d56
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/classserver.properties
@@ -0,0 +1,15 @@
+
+
+
+classserver.jar:{0}
+classserver.inputerror:exception reading request from {0}:{1}
+classserver.request:{0} requested from {1}:{2}
+classserver.probe:{0} probed from {1}:{2}
+classserver.badrequest:bad request "{0}" from {1}:{2}
+classserver.shutdown:shutdown request from {0}:{1}
+classserver.notfound:{0} not found
+classserver.usage:[-port <port>] [-dir <dir>] [-stoppable] [-verbose] [-trees]\
+\n  or\
+\n[-port <port>] -stop
+classserver.forbidden:stop request denied
+classserver.status:HTTP status code: {0} {1}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPool.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPool.java
new file mode 100644
index 0000000..e16ba41
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPool.java
@@ -0,0 +1,32 @@
+package org.eclipse.osee.ote.collections;
+
+import java.util.concurrent.ArrayBlockingQueue;
+
+public class ObjectPool<T> {
+   
+   private final ArrayBlockingQueue<T> objs;
+   private final ObjectPoolConfiguration<T> config;
+   
+   public ObjectPool(ObjectPoolConfiguration<T> config) {
+      this.config = config;
+      objs = new ArrayBlockingQueue<>(config.getMaxSize());
+      if(config.preallocate()){
+         for(int i = 0; i < config.getMaxSize(); i++){
+            objs.offer(config.make());
+         }
+      }
+   }
+   
+   public T getObject(){
+      T obj = objs.poll();
+      if(obj == null){
+         obj = config.make();
+      }
+      return obj;
+   }
+   
+   public void returnObj(T obj){
+      objs.offer(obj);
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPoolConfiguration.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPoolConfiguration.java
new file mode 100644
index 0000000..7a4b76b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPoolConfiguration.java
@@ -0,0 +1,23 @@
+package org.eclipse.osee.ote.collections;
+
+public abstract class ObjectPoolConfiguration<T> {
+
+   private int maxSize;
+   private boolean preallocate;
+
+   public ObjectPoolConfiguration(int maxSize, boolean preallocate){
+      this.maxSize = maxSize; 
+      this.preallocate = preallocate;
+   }
+   
+   public int getMaxSize(){
+      return maxSize;
+   }
+   
+   public boolean preallocate(){
+      return preallocate;
+   }
+
+   abstract public T make();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java
new file mode 100644
index 0000000..40be86e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.rmi.RemoteException;
+
+public abstract class AbstractRemoteSession implements IRemoteUserSession {
+
+   private final OSEEPerson1_4 user;
+
+   protected AbstractRemoteSession(OSEEPerson1_4 user) {
+      this.user = user;
+   }
+
+   @Override
+   public OSEEPerson1_4 getUser() {
+      return user;
+   }
+
+   @Override
+   public abstract String getAddress() throws RemoteException;
+
+   @Override
+   public abstract byte[] getFile(String workspacePath) throws RemoteException;
+
+   @Override
+   public abstract long getFileDate(String workspacePath) throws RemoteException;
+
+   @Override
+   public abstract boolean isAlive() throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BaseUdpReceiveRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BaseUdpReceiveRunnable.java
new file mode 100644
index 0000000..ad80048
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BaseUdpReceiveRunnable.java
@@ -0,0 +1,88 @@
+package org.eclipse.osee.ote.core;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.BindException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.DatagramChannel;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEException;
+
+public abstract class BaseUdpReceiveRunnable implements Runnable {
+
+   private static final int DATA_SIZE = 65536;
+   private static final int UDP_TIMEOUT = 240000; // 4 MINUTES
+   private static final int ONE_MEG = 1024 * 1024;
+   
+   private volatile boolean run = true; 
+   private Class<BaseUdpReceiveRunnable> logger = BaseUdpReceiveRunnable.class;
+   private InetSocketAddress address;
+
+   public BaseUdpReceiveRunnable(InetSocketAddress address){
+      this.address = address;
+   }
+   
+   public void stop(){
+      run = false;
+   }
+   
+   @Override
+   public void run() {
+      ByteBuffer buffer = ByteBuffer.allocateDirect(DATA_SIZE);
+      DatagramChannel channel = null;
+      try{
+         while(run){
+            try {
+               channel = DatagramChannel.open();
+               channel.socket().setReuseAddress(true);
+               channel.socket().bind(address);
+               channel.socket().setSoTimeout(UDP_TIMEOUT);
+               channel.socket().setReceiveBufferSize(ONE_MEG);
+               channel.configureBlocking(true);
+             
+               while (run) {
+                  buffer.clear();
+                  channel.receive(buffer);
+                  buffer.flip();
+                  processBuffer(buffer);
+               }
+            } catch (BindException ex) {
+               OseeLog.log(logger, Level.FINEST, ex);
+               channel.close();
+               Thread.sleep(1000);
+            }
+         }
+      }catch (InterruptedIOException ex) {
+         Thread.interrupted();
+         if (run) {
+            OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ex);
+         }
+      } catch (ClosedByInterruptException ie) {
+         Thread.interrupted();
+         if (run) {
+            OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ie);
+         }
+      } catch (Throwable t) {
+         throw new OTEException(t);
+      } finally {
+         try {
+            if (channel != null) {
+               channel.close();
+            }
+         } catch (IOException ex) {
+            ex.printStackTrace();
+         }
+      }
+   }
+
+   protected abstract void processBuffer(ByteBuffer buffer);
+   
+   public InetSocketAddress getAddress() {
+      return address;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BundleInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BundleInfo.java
new file mode 100644
index 0000000..eeed594
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BundleInfo.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.ote.core;
+
+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 org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class BundleInfo {
+   private final String symbolicName;
+   private final String version;
+   private final URL systemLocation;
+   private final URL bundleServerLocation;
+   private final File file;
+   private final Manifest manifest;
+   private final boolean systemLibrary;
+   private String md5Digest;
+
+   public BundleInfo(URL systemLocation, String bundleServerBaseLocation, boolean systemLibrary) 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.bundleServerLocation = new URL(bundleServerBaseLocation + symbolicName);
+      this.systemLibrary = systemLibrary;
+      this.md5Digest = null;
+   }
+
+   public BundleInfo(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.bundleServerLocation = systemLocation;
+      this.systemLibrary = true;
+      this.md5Digest = null;
+   }
+
+   /**
+    * @return the name of the bundle
+    */
+   public static 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;
+   }
+
+   /**
+    * @return the bundleServerLocation
+    */
+   public URL getServerBundleLocation() {
+      return bundleServerLocation;
+   }
+
+   /**
+    * @return the file
+    */
+   public File getFile() {
+      return file;
+   }
+
+   /**
+    * @return the manifest
+    */
+   public Manifest getManifest() {
+      return manifest;
+   }
+
+   @Override
+   public String toString() {
+      return getSymbolicName() + ":" + getVersion();
+   }
+
+   /**
+    * @return the systemLibrary
+    */
+   public boolean isSystemLibrary() {
+      return systemLibrary;
+   }
+
+   /**
+    * @return the md5Digest
+    */
+   public String 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.createChecksumAsString(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);
+         } catch (Exception e) {
+			e.printStackTrace();
+		}
+      }
+      return md5Digest;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java
new file mode 100644
index 0000000..ba38789
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ConnectionRequestResult implements Serializable {
+   private static final long serialVersionUID = -2269465634573908989L;
+   private final ITestEnvironment environment;
+   private final UUID sessionKey;
+   private final ReturnStatus status;
+
+   public ConnectionRequestResult(ITestEnvironment environment, UUID sessionId, ReturnStatus status) {
+      this.environment = environment;
+      this.sessionKey = sessionId;
+      this.status = status;
+   }
+
+   /**
+    * @return the environment
+    */
+   public ITestEnvironment getEnvironment() {
+      return environment;
+   }
+
+   /**
+    * @return the sessionKey
+    */
+   public UUID getSessionKey() {
+      return sessionKey;
+   }
+
+   /**
+    * @return the status
+    */
+   public ReturnStatus getStatus() {
+      return status;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/CopyOnWriteNoIteratorList.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/CopyOnWriteNoIteratorList.java
new file mode 100644
index 0000000..d5c0a6f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/CopyOnWriteNoIteratorList.java
@@ -0,0 +1,128 @@
+package org.eclipse.osee.ote.core;
+
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * This class is useful for cases where frequent looping and thread safety happen. 
+ * It forces you to get a reference to the backing array and expects you to do a 
+ * non Iterator based loop so that no Iterator objects are created to minimized GC churn. 
+ * 
+ * @author Andrew M Finkbeiner
+ *
+ * @param <E>
+ */
+public class CopyOnWriteNoIteratorList<E> {
+   
+   private ReentrantLock lock = new ReentrantLock(); 
+   private AtomicReference<E[]> data = new AtomicReference<>();
+   private Class<E> type;
+   
+   public CopyOnWriteNoIteratorList(Class<E> type){
+      this.type = type;
+      data.set(newArray(0));
+   }
+   
+   @SuppressWarnings("unchecked")
+   private E[] newArray(int size){
+      return (E[]) Array.newInstance(type, size);
+   }
+   
+   public void add(E item){
+      try{
+         lock.lock();
+         E[] ref = data.get();
+         E[] newdata = newArray(ref.length + 1);
+         System.arraycopy(ref, 0, newdata, 0, ref.length);
+         newdata[newdata.length-1] = item;
+         data.set(newdata);
+      } finally{
+         lock.unlock();
+      }
+   }
+   
+   public boolean remove(E item){
+      boolean returnvalue = false;
+      try{
+         lock.lock();
+         int index = -1;
+         E[] ref = data.get();
+         for(int i = 0; i < ref.length; i++){
+            if(item.equals(ref[i])){
+               index = i;
+               break;
+            }
+         }
+         if(index > -1){
+            E[] newdata = newArray(ref.length - 1);
+            if(index == 0){
+               System.arraycopy(ref, 1, newdata, 0, newdata.length);   
+            } else if (index == (ref.length - 1)){
+               System.arraycopy(ref, 0, newdata, 0, newdata.length);
+            } else {
+               System.arraycopy(ref, 0, newdata, 0, index);
+               System.arraycopy(ref, index+1, newdata, index, ref.length - (index + 1));
+            }
+            data.set(newdata);
+            returnvalue = true;
+         }
+      } finally {
+         lock.unlock();
+      }
+      return returnvalue;
+   }
+   
+   public boolean contains(E item){
+      boolean returnValue = false;
+      try{
+         lock.lock();
+         int index = -1;
+         E[] ref = data.get();
+         for(int i = 0; i < ref.length; i++){
+            if(item.equals(ref[i])){
+               index = i;
+               break;
+            }
+         }
+         if(index > -1){
+           returnValue = true;
+         }
+      } finally {
+         lock.unlock();
+      } 
+      return returnValue;
+   }
+   
+   public E[] get(){
+      return data.get();
+   }
+
+   public int length() {
+      return data.get().length;
+   }
+
+   public void clear() {
+      try{
+         lock.lock();
+         data.set(newArray(0));
+      } finally{
+         lock.unlock();
+      }
+   }
+
+   public Collection<E> fillCollection(Collection<E> arrayList) {
+      try{
+         lock.lock();
+         E[] ref = data.get();
+         for(int i = 0; i < ref.length; i++){
+            arrayList.add(ref[i]);
+         }
+      } finally {
+         lock.unlock();
+      }
+      return arrayList;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java
new file mode 100644
index 0000000..ae47275
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.util.logging.Level;
+
+public class ExecutionUnitException extends TestException {
+
+   private static final long serialVersionUID = -9119275292591321042L;
+
+   public ExecutionUnitException(String message, Level level, Throwable cause) {
+      super(message, level, cause);
+   }
+
+   public ExecutionUnitException(String message, Level level) {
+      super(message, level);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java
new file mode 100644
index 0000000..14205dd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class GCHelper {
+
+   private static boolean enableGcHelper = Boolean.parseBoolean(System.getProperty("ote.gc.helper", "false"));
+	
+   private final ConcurrentHashMap<String, WeakReference<Object>> map;
+   private static GCHelper singleton;
+
+   public GCHelper() {
+      super();
+      map = new ConcurrentHashMap<>(1024);
+   }
+
+   public static GCHelper getGCHelper() {
+      if (singleton == null) {
+         singleton = new GCHelper();
+      }
+      return singleton;
+   }
+
+   public void addRefWatch(Object obj) {
+	  if(enableGcHelper){
+         String key = obj.toString() + " [ " + obj.hashCode() + " ] ";
+         map.put(key, new WeakReference<Object>(obj));
+	  }
+   }
+
+   public void printLiveReferences() {
+
+      StringBuilder builder = new StringBuilder(8000);
+      if(!enableGcHelper){
+    	  builder.append("GCHelper disabled.  Enable with '-Dote.gc.helper=true'\n");
+      }
+      writeGCResults(builder);
+      OseeLog.log(GCHelper.class, Level.INFO, builder.toString());
+   }
+
+   public void writeGCResults(StringBuilder builder) {
+      TreeSet<String> live = new TreeSet<>();
+      System.gc();
+      for (Map.Entry<String, WeakReference<Object>> entry : map.entrySet()) {
+         if (entry.getValue().get() != null) {
+            entry.getValue().get();
+            live.add(entry.getKey());
+         }
+      }
+
+      builder.append("Live References:\n");
+      for (String key : live) {
+         builder.append("   ");
+         builder.append(key);
+         builder.append("\n");
+      }
+   }
+
+   public List getInstancesOfType(Class type) {
+      List<Object> listOfObjects = new ArrayList<>();
+      System.gc();
+      for (Map.Entry<String, WeakReference<Object>> entry : map.entrySet()) {
+         if (entry.getValue().get() != null) {
+            if (type.isInstance(entry.getValue().get())) {
+               listOfObjects.add(entry.getValue().get());
+            }
+         }
+      }
+      return listOfObjects;
+   }
+
+   public void collectGarbage() {
+      long memBefore = Runtime.getRuntime().freeMemory();
+      long timeBefore = System.currentTimeMillis();
+      Runtime.getRuntime().runFinalization();
+      Runtime.getRuntime().gc();
+      System.out.println("Garbage Collection --- Memory Released: " + (Runtime.getRuntime().freeMemory() - memBefore) + " -- Time Elapsed: " + (System.currentTimeMillis() - timeBefore));
+   }
+
+   public void collectGarbageAndPrintStats() {
+      new Thread(new Runnable() {
+
+         @Override
+         public void run() {
+            try {
+               Thread.sleep(5000);
+               collectGarbage();
+               printLiveReferences();
+            } catch (InterruptedException ex) {
+            }
+
+         }
+
+      }).start();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java
new file mode 100644
index 0000000..cd179ec
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+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;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IRemoteUserSession extends Remote, IUserSession {
+   @Override
+   public String getAddress() throws RemoteException;
+
+   @Override
+   public OSEEPerson1_4 getUser() throws RemoteException;
+
+   @Override
+   public byte[] getFile(String workspacePath) throws RemoteException;
+
+   @Override
+   public long getFileDate(String workspacePath) throws RemoteException;
+
+   @Override
+   public void initiatePassFailPrompt(IPassFailPromptResponse prompt) throws RemoteException;
+
+   @Override
+   public void initiateUserInputPrompt(IUserInputPromptResponse prompt) throws RemoteException;
+
+   @Override
+   public void initiateResumePrompt(IResumeResponse prompt) throws RemoteException;
+
+   @Override
+   public void initiateInformationalPrompt(String message) throws RemoteException;
+
+   @Override
+   public boolean isAlive() throws RemoteException;
+
+//   @Override
+//   public void sendMessageToClient(Message message) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ITestClient.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ITestClient.java
new file mode 100644
index 0000000..e492fc7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ITestClient.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.core;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandEnded;
+
+public interface ITestClient {
+
+   ITestEnvironment getEnvironment();
+
+   void notifyCmdEmded(SequentialCommandEnded data);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.java
new file mode 100644
index 0000000..7919f1a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.util.UUID;
+
+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;
+
+public interface IUserSession {
+
+   public OSEEPerson1_4 getUser() throws Exception;
+
+   public String getAddress() throws Exception;
+
+   /**
+    * returns the contents of the requested file on the client session
+    * 
+    * @return the byte contents of the requested file or null if it does not exist
+    */
+   public byte[] getFile(String workspacePath) throws Exception;
+
+   public long getFileDate(String workspacePath) throws Exception;
+
+   public void initiateInformationalPrompt(String message) throws Exception;
+
+   public void initiatePassFailPrompt(IPassFailPromptResponse prompt) throws Exception;
+
+   public void initiateYesNoPrompt(IYesNoPromptResponse prompt) throws Exception;
+
+   public void initiateUserInputPrompt(IUserInputPromptResponse prompt) throws Exception;
+
+   public void initiateResumePrompt(IResumeResponse prompt) throws Exception;
+
+//   public void sendMessageToClient(Message message) throws Exception;
+
+   public void cancelPrompts() throws Exception;
+
+   public boolean isAlive() throws Exception;
+   
+   public UUID getUserId() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java
new file mode 100644
index 0000000..58d7c31
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class MethodFormatter implements Xmlizable, XmlizableStream {
+    private final Collection<Argument> arguments = new ArrayList<>();
+
+    public final class Argument {
+        public final String Class;
+        public final String Value;
+
+        public Argument(final String Class, final String Value) {
+            this.Class = Class;
+            this.Value = Value;
+        }
+
+        @Override
+        public String toString() {
+            return "<" + Class + ">" + Value;
+        }
+    }
+
+    public MethodFormatter add(float value) {
+        arguments.add(new Argument(float.class.getName(), Double.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(double value) {
+        arguments.add(new Argument(double.class.getName(), Double.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(byte value) {
+        arguments.add(new Argument(byte.class.getName(), Double.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(short value) {
+        arguments.add(new Argument(short.class.getName(), Double.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(int value) {
+        arguments.add(new Argument(int.class.getName(), Integer.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(long value) {
+        arguments.add(new Argument(long.class.getName(), Double.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(char value) {
+        arguments.add(new Argument(char.class.getName(), Integer.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(boolean value) {
+        arguments.add(new Argument(boolean.class.getName(), Boolean.toString(value)));
+        return this;
+    }
+
+    public MethodFormatter add(EnumBase value) {
+        arguments.add(new Argument(EnumBase.class.getName(), value.getName()));
+        return this;
+    }
+
+    public MethodFormatter add(EnumBase[] value) {
+        final String sep = ", ";
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        for (int i = 0; i < value.length; i++) {
+            sb.append(value[i].getName()).append(sep);
+        }
+        if (sb.length() > sep.length()) {
+            sb.setLength(sb.length() - sep.length());
+        }
+        sb.append("]");
+        arguments.add(new Argument(EnumBase[].class.getName(), sb.toString()));
+        return this;
+    }
+
+    public MethodFormatter add(Object value) {
+        arguments.add(new Argument(value.getClass().getName(), value.toString()));
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        final String sep = ", ";
+        StringBuilder sb = new StringBuilder();
+        for (Argument argument : arguments) {
+            sb.append(argument.toString()).append(sep);
+        }
+        if (sb.length() > sep.length()) {
+            sb.setLength(sb.length() - sep.length());
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public Element toXml(Document doc) {
+        Element toReturn = doc.createElement("MethodArguments");
+        for (Argument argument : arguments) {
+            Element element = doc.createElement("Argument");
+            element.appendChild(Jaxp.createElement(doc, "Type", argument.Class));
+            String toLog = argument.Value != null ? XmlSupport.format(argument.Value) : "null";
+            element.appendChild(Jaxp.createElement(doc, "Value", toLog));
+            toReturn.appendChild(element);
+        }
+        return toReturn;
+    }
+
+    @Override
+    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+        writer.writeStartElement("MethodArguments");
+        for (Argument argument : arguments) {
+            writer.writeStartElement("Argument");
+            XMLStreamWriterUtil.writeElement(writer, "Type", argument.Class);
+            String toLog = argument.Value != null ? XmlSupport.format(argument.Value) : "null";
+            XMLStreamWriterUtil.writeElement(writer, "Value", toLog);
+            writer.writeEndElement();
+        }
+        writer.writeEndElement();
+    }
+    
+    @JsonProperty
+    public Collection<Argument> getMethodArguments() {
+        return arguments;
+    }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OSEEPerson1_4.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OSEEPerson1_4.java
new file mode 100644
index 0000000..9c0d1f5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OSEEPerson1_4.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.io.Serializable;
+
+public class OSEEPerson1_4 implements Serializable {
+
+   private static final long serialVersionUID = 6345874159597384661L;
+
+   private final String name;
+
+   private final String email;
+
+   private final String id;
+
+   public OSEEPerson1_4(String name, String email, String id) {
+      this.name = name;
+      this.email = email;
+      this.id = id;
+   }
+
+   public String getEmail() {
+      return email;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   @Override
+   public boolean equals(Object arg0) {
+      if (arg0 instanceof OSEEPerson1_4) {
+         OSEEPerson1_4 person = (OSEEPerson1_4) arg0;
+         return person.name.equals(this.name) && person.email.equals(this.email) && person.id.equals(this.id);
+      }
+      return false;
+   }
+
+   @Override
+   public int hashCode() {
+      int hashCode = 0;
+      if (name != null) {
+         hashCode += name.hashCode();
+      }
+      if (email != null) {
+         hashCode += email.hashCode();
+      }
+      if (id != null) {
+         hashCode += id.hashCode();
+      }
+      return hashCode;
+   }
+
+   @Override
+   public String toString() {
+      return name + ":" + email + ":" + id + " hash=" + hashCode();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OTESessionManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OTESessionManager.java
new file mode 100644
index 0000000..51dbdae
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OTESessionManager.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.core;
+
+import java.util.Set;
+import java.util.UUID;
+
+public interface OTESessionManager {
+   void add(UUID sessionId, IUserSession session);
+   void remove(UUID sessionId);
+   IUserSession get(UUID sessionId);
+   Set<UUID> get();
+   IUserSession getActiveUser();//??
+   void setActiveUser(UUID sessionId);//??
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.java
new file mode 100644
index 0000000..e444d94
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.lang.ref.WeakReference;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.internal.Activator;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class OseeTestThread {
+
+   private static final Logger logger = Logger.getLogger("osee.test.core.OseeTestThread");
+   private final Thread thread;
+   private final WeakReference<TestEnvironment> env;
+   private static final HashSet<OseeTestThread> threadList = new HashSet<>(32);
+   private volatile Throwable causeOfDeath = null;
+   private volatile Date timeOfDeath = null;
+
+   /**
+    * Creates the thread with the given name and as a non daemon thread
+    */
+   public OseeTestThread(String name, TestEnvironment env) {
+      this(name, false, null, env);
+   }
+
+   public OseeTestThread(String name, ThreadGroup group, TestEnvironment env) {
+      this(name, false, group, env);
+   }
+
+   public Thread.State getState() {
+      return thread.getState();
+   }
+
+   /**
+    * Creates the thread with the given name and daemon flag
+    * 
+    * @param name the name of this thread
+    * @param isDaemon marks the thread as a daemon thread
+    */
+   public OseeTestThread(String name, boolean isDaemon, ThreadGroup group, TestEnvironment env) {
+      GCHelper.getGCHelper().addRefWatch(this);
+      this.env = new WeakReference<>(env);
+      thread = new Thread(group, name) {
+
+         @Override
+         public void run() {
+            try {
+               OseeTestThread.this.run();
+               synchronized (threadList) {
+                  threadList.remove(OseeTestThread.this);
+               }
+            } catch (TestException e) {
+               OseeLog.log(Activator.class, e.getLevel(),
+                  "TestException in " + e.getThreadName() + ": " + e.getMessage(), e);
+               cleanupAfterException(e);
+            } catch (Throwable t) {
+               OseeLog.log(Activator.class, Level.SEVERE, "Unhandled exception in " + thread.getName(), t);
+               cleanupAfterException(t);
+            }
+         }
+      };
+      thread.setDaemon(isDaemon);
+      threadList.add(this);
+   }
+
+   /**
+    * Starts the thread
+    */
+   public void start() {
+      thread.start();
+   }
+
+   public void setName(String name) {
+      thread.setName(name);
+   }
+
+   public String getName() {
+      return thread.getName();
+   }
+
+   public boolean isAlive() {
+      return thread.isAlive();
+   }
+
+   public void interrupt() {
+      thread.interrupt();
+   }
+
+   private static final class Trace extends RuntimeException {
+      private static final long serialVersionUID = 8520935964300439490L;
+
+      Trace() {
+         super("call trace");
+      }
+   }
+
+   /**
+    * This method will be called upon thread execution
+    */
+   protected abstract void run() throws Exception;
+
+   public void join() throws InterruptedException {
+      thread.join();
+   }
+
+   public void join(int milliseconds) throws InterruptedException {
+      thread.join(milliseconds);
+   }
+
+   public TestEnvironment getEnvironment() {
+      return OseeTestThread.this.env.get();
+   }
+
+   public static Collection<OseeTestThread> getThreads() {
+      return threadList;
+   }
+
+   private synchronized void cleanupAfterException(Throwable t) {
+      causeOfDeath = t;
+      timeOfDeath = Calendar.getInstance().getTime();
+      this.env.get().handleException(t, Level.OFF);
+   }
+
+   public Throwable getCauseOfDeath() {
+      return causeOfDeath;
+   }
+
+   public Date getTimeOfDeath() {
+      return timeOfDeath;
+   }
+
+   public static void clearThreadReferences() {
+      synchronized (threadList) {
+         threadList.clear();
+      }
+   }
+
+   public boolean isInterrupted() {
+      return thread.isInterrupted();
+   }
+
+   public void setDaemon(boolean isDaemon) {
+      thread.setDaemon(isDaemon);
+   }
+
+   public Thread getThread() {
+      return thread;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeURLClassLoader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeURLClassLoader.java
new file mode 100644
index 0000000..785f3e2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeURLClassLoader.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLStreamHandlerFactory;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeURLClassLoader extends URLClassLoader {
+
+   private final String name;
+   private final ExportClassLoader exportClassLoader;
+
+   public OseeURLClassLoader(String name, URL[] urls, ClassLoader parent) {
+      super(urls, parent);
+      this.name = name;
+      GCHelper.getGCHelper().addRefWatch(this);
+      exportClassLoader = ExportClassLoader.getInstance();
+      
+   }
+
+   public OseeURLClassLoader(String name, URL[] urls) {
+      super(urls);
+      GCHelper.getGCHelper().addRefWatch(this);
+      this.name = name;
+      exportClassLoader = ExportClassLoader.getInstance();
+   }
+
+   public OseeURLClassLoader(String name, URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) {
+      super(urls, parent, factory);
+      GCHelper.getGCHelper().addRefWatch(this);
+      this.name = name;
+      exportClassLoader = ExportClassLoader.getInstance();
+   }
+
+   @Override
+   public Class<?> loadClass(String clazz) throws ClassNotFoundException{
+      try {
+         return exportClassLoader.loadClass(clazz);
+      } catch (Exception ex2) {
+         int timesTriedToLoad = 0;
+         while(timesTriedToLoad < 10){
+            try {
+               return super.loadClass(clazz);
+            } catch (ClassNotFoundException ex) {
+               System.out.println("Retrying to load from OseeURLClassLoader for class = "+ clazz);
+               timesTriedToLoad++; //Try to load again
+               try {
+                  Thread.sleep(1);
+               } catch (InterruptedException ex1) {
+                  OseeLog.log(OseeURLClassLoader.class, Level.SEVERE, ex1.toString(), ex1);
+               }
+            }
+         }
+         throw new ClassNotFoundException("Class = " + clazz);
+      }
+   }
+   
+   @Override
+   public String toString() {
+      return this.getClass().getName() + " [ " + name + " ] ";
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteBundleLocator.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteBundleLocator.java
new file mode 100644
index 0000000..2ab24ef
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteBundleLocator.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.io.IOException;
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface OteBundleLocator {
+
+   Collection<BundleInfo> getRuntimeLibs() throws IOException, CoreException;
+
+   Collection<BundleInfo> consumeModifiedLibs() throws IOException, CoreException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java
new file mode 100644
index 0000000..d173769
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.util.logging.Level;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteLevel extends Level {
+
+   private static final long serialVersionUID = -1545385440588581634L;
+
+   public static final Level TEST_EVENT = new OteLevel("TEST_EVENT", SEVERE.intValue() + 50);
+   public static final Level TEST_SEVERE = new OteLevel("TEST_SEVERE", SEVERE.intValue() + 100);
+   public static final Level ENV_SEVERE = new OteLevel("ENV_SEVERE", SEVERE.intValue() + 200);
+
+   protected OteLevel(String name, int value) {
+      super(name, value);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.java
new file mode 100644
index 0000000..5ba9981
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.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.core;
+
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteProperties extends OseeProperties {
+   private static final OteProperties instance = new OteProperties();
+   private static final String OSEE_BENCHMARK = "osee.ote.benchmark";
+   private static final String OSEE_CMD_CONSOLE = "osee.ote.cmd.console";
+   private static final String OSEE_OTE_SERVER_TITLE = "osee.ote.server.title";
+   private static final String OSEE_OTE_BATCH = "osee.ote.batch";
+   private static final String OSEE_OTE_LOG_FILE_PATH = "osee.ote.logfilepath";
+   private static final String OSEE_PAUSE_ON_FAIL = "ote.pause.on.fail";
+   private static final String OSEE_PRINT_FAIL_TO_CONSOLE = "ote.print.fail.to.console";
+
+   private OteProperties() {
+      super();
+   }
+
+   public static String getOseeOteServerTitle() {
+      return System.getProperty(OSEE_OTE_SERVER_TITLE, "");
+   }
+
+   public static boolean isOseeOteInBatchModeEnabled() {
+      return System.getProperty(OSEE_OTE_BATCH) != null;
+   }
+
+   public static String getOseeOteLogFilePath() {
+      return System.getProperty(OSEE_OTE_LOG_FILE_PATH);
+   }
+
+   public static boolean isBenchmarkingEnabled() {
+      return System.getProperty(OSEE_BENCHMARK) != null ? true : false;
+   }
+
+   public static boolean isOteCmdConsoleEnabled() {
+      return System.getProperty(OSEE_CMD_CONSOLE) != null ? true : false;
+   }
+
+   public static boolean isPauseOnFailEnabled(){
+      return System.getProperty(OSEE_PAUSE_ON_FAIL) != null ? true : false;
+   }
+   
+   public static boolean isPrintFailToConsoleEnabled(){
+      return System.getProperty(OSEE_PRINT_FAIL_TO_CONSOLE) != null ? true : false;
+   }
+   /**
+    * A string representation of all the property setting specified by this class
+    * 
+    * @return settings for all properties specified by this class
+    */
+   public static String getAllSettings() {
+      return instance.toString();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnFormatter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnFormatter.java
new file mode 100644
index 0000000..3022ba1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnFormatter.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.core;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class ReturnFormatter implements Xmlizable, XmlizableStream {
+
+    private String returnValue;
+
+    public void set(float value) {
+        returnValue = Double.toString(value);
+    }
+
+    public void add(double value) {
+        returnValue = Double.toString(value);
+    }
+
+    public void add(byte value) {
+        returnValue = Double.toString(value);
+    }
+
+    public void add(short value) {
+        returnValue = Double.toString(value);
+    }
+
+    public void add(int value) {
+        returnValue = Integer.toString(value);
+    }
+
+    public void add(long value) {
+        returnValue = Double.toString(value);
+    }
+
+    public void add(char value) {
+        returnValue = Integer.toString(value);
+    }
+
+    public void add(boolean value) {
+        returnValue = Boolean.toString(value);
+    }
+
+    public void add(Object value) {
+        returnValue = value == null ? "null" : value.toString();
+    }
+
+    @Override
+    public String toString() {
+        return returnValue;
+    }
+
+    @Override
+    public Element toXml(Document doc) {
+        return Jaxp.createElement(doc, "ReturnValue", returnValue);
+    }
+
+    @Override
+    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+    	if (returnValue != null) {            
+            XMLStreamWriterUtil.writeElement(writer, "ReturnValue", XmlSupport.format(returnValue));    		
+    	}
+    }
+
+    public String getValue() {
+        return returnValue;
+    }
+    
+    @JsonProperty
+    public String getReturnValue() {
+        return returnValue;
+    }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
new file mode 100644
index 0000000..164db85
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ReturnStatus implements Serializable {
+
+   private static final long serialVersionUID = -7774073812320127561L;
+
+   private final boolean status;
+   private final String message;
+
+   public ReturnStatus(String message, boolean status) {
+      this.status = status;
+      this.message = message;
+   }
+
+   public boolean getStatus() {
+      return status;
+   }
+
+   public String getMessage() {
+      return message;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServerApplication.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServerApplication.java
new file mode 100644
index 0000000..3b1f5db
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServerApplication.java
@@ -0,0 +1,23 @@
+package org.eclipse.osee.ote.core;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+
+public class ServerApplication implements IApplication {
+
+   @Override
+   public Object start(IApplicationContext context) throws Exception {
+      while(true){
+         synchronized (this) {
+            this.wait();
+         }
+      }
+   }
+
+   @Override
+   public void stop() {
+      // TODO Auto-generated method stub
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServiceUtility.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServiceUtility.java
new file mode 100644
index 0000000..5251df8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServiceUtility.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+/**
+ * @author Michael P. Masterson
+ */
+public class ServiceUtility {
+   public static Class<ServiceUtility> getClazz(){
+      return ServiceUtility.class;
+   }
+
+   public static <T> T getService(Class<T> clazz){
+      return getService(clazz, true);
+   }
+
+   @SuppressWarnings({ "rawtypes", "unchecked" })
+   public static <T> T[] getServices(Class<T> clazz) throws InvalidSyntaxException{
+      ServiceReference[] serviceReferences = getContext().getServiceReferences(clazz.getName(), null);
+      T[] data = (T[])new Object[serviceReferences.length];
+      for(int i = 0; i < serviceReferences.length; i ++){
+         data[i] = (T)getContext().getService(serviceReferences[i]);
+      }
+      return data;
+   }
+
+   public static BundleContext getContext(){
+	  Bundle bundle = FrameworkUtil.getBundle(getClazz());
+	  if(bundle == null){
+		  return null;
+	  }
+      return bundle.getBundleContext();
+   }
+
+   @SuppressWarnings({ "rawtypes", "unchecked" })
+   public static Object getService(String clazz) {
+      BundleContext context = getContext();
+      if(context == null){
+       OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz);
+         return null;
+      }
+      ServiceReference serviceReference = context.getServiceReference(clazz);
+      if(serviceReference == null){
+       OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz);
+         return null;
+      }
+      Object obj = getContext().getService(serviceReference);
+      if(obj == null){
+        OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz);
+      }
+      return obj; 
+   }
+
+   @SuppressWarnings({ "rawtypes", "unchecked" })
+   public static <T> T getService(Class<T> clazz, boolean logit) {
+      BundleContext context = getContext();
+      if(context == null){
+         if(logit){
+            OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz.getName());
+         }
+         return null;
+      }
+      ServiceReference serviceReference = context.getServiceReference(clazz.getName());
+      if(serviceReference == null){
+         if(logit){
+            OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz.getName());
+         }
+         return null;
+      }
+      T obj = (T)getContext().getService(serviceReference);
+      if(obj == null && logit){
+         OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz.getName());
+      }
+      return obj;
+   }
+   
+   public static <T> T getService(Class<T> clazz, int waitTimeMs) {
+      int count = 1;
+      if(waitTimeMs > 50){
+         count = waitTimeMs/50;
+      }
+      
+      T obj = getService(clazz, false);
+      if(obj == null){
+         for(int i = 0; i < count && obj == null; i++){
+            try{
+               Thread.sleep(50);
+            } catch (InterruptedException ex){
+            }
+            obj = getService(clazz, false);
+         }
+      }
+      return obj;
+   }
+}
+
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java
new file mode 100644
index 0000000..62d51aa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.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.core;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class StandardShell extends ConsoleShell {
+
+   private final Thread thread;
+   private volatile boolean run = true;
+
+   public StandardShell(ICommandManager manager) {
+      super(manager);
+      thread = new Thread(new Runnable() {
+         @Override
+         public void run() {
+            InputStreamReader stdin = new InputStreamReader(System.in);
+            BufferedReader consoleIn = new BufferedReader(stdin);
+            while (run) {
+               try {
+                  final String line = consoleIn.readLine();
+                  if (line == null) {
+                     OseeLog.log(StandardShell.class, Level.INFO, "INput stream closed, standard shell closing...");
+                     run = false;
+                     break;
+                  }
+                  if (line.equals("")) {
+                     continue;
+                  }
+                  parseAndExecuteCmd(line);
+
+               } catch (InterruptedIOException ioe) {
+                  if (run) {
+                     println("Command console interrupted abnormally");
+                  }
+               } catch (Throwable t) {
+                  printStackTrace(t);
+               }
+            }
+         }
+      }, "LBA Test Server Console");
+      {
+
+      }
+      ;
+   }
+
+   @Override
+   public void println(String string) {
+      System.out.println(string);
+   }
+
+   @Override
+   public void print(String string) {
+      System.out.print(string);
+   }
+
+   @Override
+   public void println() {
+      System.out.println();
+   }
+
+   public void onCommandComplete(ConsoleCommand cmd) {
+      System.out.flush();
+   }
+
+   public void start() {
+      thread.start();
+      OseeLog.log(StandardShell.class, Level.INFO, "The Standard Command Console has been started");
+   }
+
+   public void shutdown() {
+      run = false;
+      thread.interrupt();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java
new file mode 100644
index 0000000..fef03f9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java
@@ -0,0 +1,461 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.log.record.RequirementRecord;
+import org.eclipse.osee.ote.core.log.record.TestCaseRecord;
+import org.eclipse.osee.ote.core.log.record.TestDescriptionRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * TestCase is the abstract base class for all test cases. This class provides the interfaces necessary for a TestCase
+ * to be part of a {@link org.eclipse.osee.ote.core.TestScript TestScript}.
+ * <p>
+ * The TestCase class contains the following information:
+ * <ul>
+ * <li><b>Standalone</b> - This is used to determine if a TestCase can be used in a selective run list.
+ * <ul>
+ * <li><b>true</b> - The TestCase runs as expected regardless of order.
+ * <li><b>false</b> - The TestCase must be run in a given order with other test cases to work as expected.
+ * </ul>
+ * <li><b>Test Case Number</b> - A serial number automatically assigned at the time of construction.
+ * <li><b>Tracability</b> - The requirements that are tested by this TestCase.
+ * </ul>
+ * <p>
+ * When building a new TestCase object it is important to remember that the object contains information describing the
+ * test case in addition to the run time code. It is also important to understand that the when writing classes which
+ * within a TestScript that the object must be instantiated (typically done in the constructor) with a reference to the
+ * TestScript it is within or else it will not be executed.
+ * <p>
+ * The following sample should be followed closely when building TestCase objects. <br>
+ * <br>
+ * <code>
+ * public class OipCase extends TestCase {
+ * 		<ul style="list-style: none">
+ * <li>		public OipCase(TestScript parent) {
+ * 			<ul style="list-style: none">
+ * <li>			</code><i>Use <b>one</b> of the following constructors based on if this TestCase is standalone</i><code>
+ * <li>			super(parent);</code> <i>Standalone defaulted to <b>false</b></i><code>
+ * <li>			super(parent, true);</code><i>Standalone explicitly set to <b>true</b></i><code>
+ * <li>
+ * <li>			</code><i>All requirements tested in the test case should be noted here with the </i>
+ * <code>{@link org.eclipse.osee.ote.core.TestCase#addTracability(String) addTracability}</code><i> method.</i> <code>
+ * 			</ul>
+ * <li>		}
+ * <li>
+ * <li>		</code><i><b>Note:</b>It is very important that </i><code>doTestCase</code><i> always has the </i>
+ * <code>throws InterrupedException</code><i> in the method declaration. The ability to abort a script relies on this
+ * statement, and without it many calls would have to be wrapped with a try/catch block.</i><code>
+ * <li>		public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) throws InterruptedException {
+ * 			<ul style="list-style: none">
+ * <li>			</code><i>Place all of the runtime code for the test case here.</i><code>
+ * 			</ul>
+ * <li>		}
+ * 		</ul>
+ * }
+ * </code>
+ * 
+ * @see org.eclipse.osee.ote.core.TestScript
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ */
+public abstract class TestCase implements ITestEnvironmentAccessor, Xmlizable, XmlizableStream {
+   protected ITestLogger logger;
+   private final ITestEnvironmentAccessor environment;
+   private final boolean standAlone;
+   private final WeakReference<TestScript> testScript;
+   private final TestDescriptionRecord testDescription;
+   @JsonProperty
+   public int number;
+   protected List<RequirementRecord> traceability = new ArrayList<>();
+
+   /**
+    * TestCase Constructor.
+    */
+   public TestCase(TestScript testScript) {
+      this(testScript, false);
+   }
+
+   /**
+    * TestCase Constructor.
+    */
+   public TestCase(TestScript testScript, boolean standAlone) {
+      this(testScript, standAlone, true);
+   }
+
+   /**
+    * TestCase Constructor.
+    */
+   protected TestCase(TestScript testScript, boolean standAlone, boolean addToRunList) {
+      super();
+      this.testDescription = new TestDescriptionRecord(testScript.getTestEnvironment());
+      this.standAlone = standAlone;
+      if (addToRunList) {
+         this.number = testScript.addTestCase(this);
+      }
+      this.testScript = new WeakReference<>(testScript);
+      this.environment = testScript.getTestEnvironment();
+      GCHelper.getGCHelper().addRefWatch(this);
+   }
+
+   public TestCase(ITestEnvironmentAccessor accessor) {
+      this.testDescription = new TestDescriptionRecord(accessor);
+
+      // TODO we have two different traceability tags here.... we need to combine these or get rid
+      // of them all together since define and the artifact framework specifies traceability
+      // this.tracability = new ArrayList();
+      this.traceability = new ArrayList<>();
+
+      this.standAlone = false;
+      ;
+      this.number = 1;
+      this.testScript = null;
+      this.environment = accessor;
+
+   }
+
+   /**
+    * Called by baseDoTestCase(). This is implemented by the tester's in each test case in the test script.
+    * 
+    * @param environment The Test environment.
+    */
+   public abstract void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) throws InterruptedException;
+
+   public Element getTastCaseNumberXml(Document doc) {
+      return Jaxp.createElement(doc, "Number", String.valueOf(number));
+   }
+
+   public void writeTestCaseNumber(XMLStreamWriter writer) throws XMLStreamException {
+      XMLStreamWriterUtil.writeElement(writer, "Number", String.valueOf(number));
+   }
+
+   public void writeTestCaseClassName(XMLStreamWriter writer) throws XMLStreamException {
+      String name = this.getClass().getName();
+      if (name == null || name.length() == 0) {
+         name = "";
+      }
+      XMLStreamWriterUtil.writeElement(writer, "Name", name);
+   }
+   
+   @JsonProperty
+   public String getName() {
+       return this.getClass().getName();
+   }
+
+   public void writeTracability(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement("Tracability");
+      for (RequirementRecord record : traceability) {
+         record.toXml(writer);
+      }
+      writer.writeEndElement();
+   }
+
+   public Element getTestCaseClassName(Document doc) {
+      String name = this.getClass().getName();
+      if (name == null || name.length() == 0) {
+         name = "";
+      }
+      return Jaxp.createElement(doc, "Name", name);
+   }
+   
+   public String getTestCaseClassName() {
+	   return this.getClass().getName();
+   }
+
+   public TestCase getTestCase() {
+      return this;
+   }
+
+   /**
+    * @return Returns the testCaseNumber.
+    */
+   public int getTestCaseNumber() {
+      return number;
+   }
+
+   public ITestEnvironmentAccessor getTestEnvironment() {
+      return environment;
+   }
+
+   public TestRecord getTestRecord() {
+      return new TestCaseRecord(getTestEnvironment(), this);
+   }
+
+   /**
+    * @return Returns the testScript.
+    */
+   @Override
+   public TestScript getTestScript() {
+      return testScript.get();
+   }
+
+   public Element getTracabilityXml(Document doc) {
+      Element traceElement = doc.createElement("Tracability");
+      for (RequirementRecord record : traceability) {
+         traceElement.appendChild(record.toXml(doc));
+
+      }
+      return traceElement;
+   }
+
+   /**
+    * @return Returns the standAlone.
+    */
+   public boolean isStandAlone() {
+      return standAlone;
+   }
+
+   public void prompt() throws InterruptedException {
+      getTestScript().prompt();
+   }
+
+   public void prompt(String message) throws InterruptedException {
+      getTestScript().prompt(new TestPrompt(message, PromptResponseType.NONE));
+   }
+
+   public void promptPassFail(String message) throws InterruptedException {
+      getTestScript().getLogger().methodCalled(getTestScript().getTestEnvironment(), new MethodFormatter().add(message));
+
+      getTestScript().promptPassFail(message);
+
+      getTestScript().getLogger().methodEnded(getTestScript().getTestEnvironment());
+   }
+
+   public void promptPause(String message) throws InterruptedException {
+      getTestScript().promptPause(message);
+   }
+
+   public void promptStep(String message) throws InterruptedException {
+      getTestScript().prompt(new TestPrompt(message, PromptResponseType.SCRIPT_STEP));
+   }
+
+   public String promptInput(String message) throws InterruptedException {
+      return getTestScript().prompt(new TestPrompt(message, PromptResponseType.USER_INPUT));
+   }
+
+   /**
+    * Logs the results of a test point.
+    * 
+    * @param passed boolean T/F
+    * @param expected The expected information
+    * @param actual The actual information
+    */
+   public void testpoint(boolean passed, String testPointName, String expected, String actual) {
+      logger.testpoint(this.getTestEnvironment(), this.getTestScript(), this, passed, testPointName, expected, actual);
+   }
+
+   @Override
+   public String toString() {
+      String description = getTestScript().getClass().getName() + "Test Case " + number + ":";
+      if (traceability != null) {
+         for (RequirementRecord record : traceability) {
+            description += "\n\t" + record;
+         }
+      }
+      return description;
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      Element testCaseElement = doc.createElement("TestCase");
+      testCaseElement.appendChild(getTastCaseNumberXml(doc));
+      testCaseElement.appendChild(getTestCaseClassName(doc));
+      testCaseElement.appendChild(getTracabilityXml(doc));
+      return testCaseElement;
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement("TestCase");
+      writeTestCaseNumber(writer);
+      writeTestCaseClassName(writer);
+      writeTracability(writer);
+   }
+
+   /**
+    * Starts running the test case. Calls doTestCase(), which is implemented by the tester in each test case.
+    * 
+    * @param environment The Test Enviornment.
+    */
+   public void baseDoTestCase(ITestEnvironmentAccessor environment) throws InterruptedException {
+      this.logger = environment.getLogger();
+
+      logger.testCaseBegan(this); // This is required for valid outfile.
+      //This creates the test case outfile logging.
+
+      environment.getTestScript().setTestCase(this);
+      OseeLog.logf(TestEnvironment.class, OteLevel.TEST_EVENT, "Starting Test Case %s.%s",
+         this.getTestScript().getClass().getSimpleName(), this.getClass().getSimpleName());
+      doTestCase(environment, environment.getLogger());
+   }
+
+   @Override
+   public void abortTestScript() {
+      environment.abortTestScript();
+   }
+
+   @Override
+   public boolean addTask(EnvironmentTask task) {
+      return environment.addTask(task);
+   }
+
+   @Override
+   public void associateObject(Class<?> c, Object obj) {
+      environment.associateObject(c, obj);
+   }
+
+   @Override
+   public Object getAssociatedObject(Class<?> c) {
+      return environment.getAssociatedObject(c);
+   }
+
+   @Override
+   public Set<Class<?>> getAssociatedObjects() {
+      return environment.getAssociatedObjects();
+   }
+
+   /*
+    * public ITestEnvironmentCommandCallback getClientCallback() { return environment.getClientCallback(); }
+    */
+
+   // public EnvironmentType getEnvironmentType() {
+   // return environment.getEnvironmentType();
+   // }
+   @Override
+   public long getEnvTime() {
+      return environment.getEnvTime();
+   }
+
+   @Override
+   public IExecutionUnitManagement getExecutionUnitManagement() {
+      return environment.getExecutionUnitManagement();
+   }
+
+   @Override
+   public ITestLogger getLogger() {
+      return environment.getLogger();
+   }
+
+   @Override
+   public IScriptControl getScriptCtrl() {
+      return environment.getScriptCtrl();
+   }
+
+   /*
+    * public StatusBoard getStatusBoard() { return environment.getStatusBoard(); }
+    */
+
+   @Override
+   public ITestStation getTestStation() {
+      return environment.getTestStation();
+   }
+
+   @Override
+   public ITimerControl getTimerCtrl() {
+      return environment.getTimerCtrl();
+   }
+
+   @Override
+   public void onScriptComplete() throws InterruptedException {
+      environment.onScriptComplete();
+   }
+
+   @Override
+   public void onScriptSetup() {
+      environment.onScriptSetup();
+   }
+
+   @Override
+   public ICancelTimer setTimerFor(ITimeout listener, int time) {
+      return environment.setTimerFor(listener, time);
+   }
+
+   public void logTestPoint(boolean isPassed, String testPointName, String expected, String actual) {
+      this.getLogger().testpoint(this.getTestEnvironment(), this.getTestScript(), this, isPassed, testPointName,
+         expected, actual);
+   }
+
+   public void setPurpose(String purpose) {
+      testDescription.setPurpose(purpose);
+   }
+
+   public void setPreCondition(String preCondition) {
+      testDescription.setPreCondition(preCondition);
+   }
+
+   public void setPostCondition(String postCondition) {
+      testDescription.setPostCondition(postCondition);
+   }
+
+   public List<RequirementRecord> getScriptReqRecordTraceability() {
+      return traceability;
+   }
+
+   public void addTraceability(String description) {
+      this.traceability.add(new RequirementRecord(this.getTestEnvironment(), description));
+   }
+
+   public void writeToConsole(String message) {
+      TestPrompt p = new TestPrompt(message);
+
+      try {
+         testScript.get().prompt(p);
+      } catch (Throwable e) {
+         OseeLog.log(TestEnvironment.class, Level.INFO, e.getMessage(), e);
+      }
+   }
+
+   public void setTestScript(TestScript script) {
+      throw new IllegalStateException("Why are you calling this one?!?!?!?");
+   }
+
+   @Override
+   public void abortTestScript(Throwable t) {
+      testScript.get().abortDueToThrowable(t);
+   }
+   
+   @JsonProperty
+   public List<RequirementRecord> getTraceability() {
+       if (traceability.isEmpty()) {
+           return null;
+       } else {
+           return traceability;
+       }
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.java
new file mode 100644
index 0000000..bd54922
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.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.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+public class TestException extends RuntimeException {
+
+   private static final long serialVersionUID = -5628986844200418864L;
+
+   private final String threadCauseName;
+   private final Level level;
+   private List<IHealthStatus> status = new ArrayList<>();
+
+   public TestException(String message, Level level) {
+      this(message, level, null);
+   }
+
+   public TestException(String message, Level level, Throwable cause) {
+      super(message, cause);
+      this.level = level;
+      threadCauseName = Thread.currentThread().getName();
+   }
+
+   public TestException(String message, List<IHealthStatus> status) {
+      this(message, Level.SEVERE);
+      this.status = status;
+   }
+
+   public String getThreadName() {
+      return threadCauseName;
+   }
+
+   public Level getLevel() {
+      return level;
+   }
+
+   public List<IHealthStatus> getHealthStatus() {
+      return status;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPointTally.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPointTally.java
new file mode 100644
index 0000000..59c3cef
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPointTally.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.core;
+
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.log.ITestPointTally;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointTally implements ITestPointTally {
+   private int testPointSuccesses;
+   private int testPointFailures;
+   private final String testName;
+   private final OTEStatusBoard statusBoard;
+
+   public TestPointTally(String testName) {
+      this.testName = testName;
+      statusBoard = ServiceUtility.getService(OTEStatusBoard.class);//tracker.getService();
+   }
+
+   @Override
+   public void reset() {
+      this.testPointSuccesses = 0;
+      this.testPointFailures = 0;
+      sendUpdate();
+   }
+
+   @Override
+   public int tallyTestPoint(boolean pass) {
+      if (pass) {
+         testPointSuccesses++;
+      } else {
+         testPointFailures++;
+      }
+      sendUpdate();
+      return getTestPointTotal();
+   }
+
+   private void sendUpdate() {
+      statusBoard.onTestPointUpdate(testPointSuccesses, testPointFailures, testName);
+   }
+
+   @Override
+   public int getTestPointTotal() {
+      return testPointSuccesses + testPointFailures;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.java
new file mode 100644
index 0000000..f9f4099
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.io.Serializable;
+
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPrompt implements Serializable {
+
+   private static final long serialVersionUID = 5960067878239875110L;
+   private final String prompt;
+   private final boolean waitForResponse;
+   private final boolean ofpStep;
+   private final PromptResponseType type;
+
+   public TestPrompt(String prompt) {
+      this(prompt, PromptResponseType.NONE);
+   }
+
+   public TestPrompt(String prompt, PromptResponseType type) {
+      super();
+      this.prompt = XmlSupport.convertNonPrintableCharacers(prompt);
+      this.waitForResponse =
+         type == PromptResponseType.SCRIPT_PAUSE || type == PromptResponseType.PASS_FAIL || type == PromptResponseType.SCRIPT_STEP || type == PromptResponseType.USER_INPUT ? true : false;
+      this.ofpStep = type == PromptResponseType.SCRIPT_STEP ? true : false;
+      this.type = type;
+   }
+
+   public PromptResponseType getType() {
+      return type;
+   }
+
+   public boolean isWaiting() {
+      return this.waitForResponse;
+   }
+
+   @Override
+   public String toString() {
+      return this.prompt;
+   }
+
+   /**
+    * @return Returns the ofpStep.
+    */
+   public boolean isOfpStep() {
+      return ofpStep;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPromptImpl.java
new file mode 100644
index 0000000..cdad9b7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPromptImpl.java
@@ -0,0 +1,166 @@
+package org.eclipse.osee.ote.core;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.prompt.InformationalPrompt;
+import org.eclipse.osee.ote.core.framework.prompt.PassFailPromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.PassFailPromptResult;
+import org.eclipse.osee.ote.core.framework.prompt.ScriptPausePromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.UserInputPromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.YesNoPromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.YesNoPromptResult;
+import org.eclipse.osee.ote.core.log.record.AttentionRecord;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+
+class TestPromptImpl {
+
+   private final Executor promptInitWorker;
+
+   public TestPromptImpl() {
+      promptInitWorker = Executors.newSingleThreadExecutor();
+   }
+
+   
+   public String prompt(final TestPrompt prompt, final TestEnvironment environment, final TestScript test) throws InterruptedException {
+
+      if (environment.isInBatchMode()) {
+         promptInitWorker.execute(new Runnable() {
+            @Override
+            public void run() {
+               try {
+                  test.getUserSession().initiateInformationalPrompt(prompt.toString());
+               } catch (Exception e) {
+                  System.out.println(prompt.toString());
+               }
+            }
+         });
+         if (prompt.getType() == PromptResponseType.PASS_FAIL) {
+            test.getLogger().log(
+                  new TestPointRecord(environment, new CheckPoint(prompt.toString(), "PROMPT DURING BATCH", "N/A", false),
+                        true));
+         } else {
+            test.getLogger().log(new AttentionRecord(environment, prompt.getType().name() + " : " + prompt.toString(), true));
+         }
+         return "";
+      } else if (!environment.getRunManager().isCurrentThreadScript()){
+         promptInitWorker.execute(new Runnable() {
+            @Override
+            public void run() {
+               try {
+                  test.getUserSession().initiateInformationalPrompt(prompt.toString());
+               } catch (Exception e) {
+                  System.out.println(prompt.toString());
+               }
+            }
+         });
+         if (prompt.getType() != PromptResponseType.NONE) {
+            test.getLogger().log(new AttentionRecord(environment, String.format("ERROR: Blocking prompt type[%s] in non script thread[%s] message[%s]", prompt.getType().name(), Thread.currentThread().getName(), prompt.toString()), true));
+         } else {
+            test.getLogger().log(new AttentionRecord(environment, prompt.getType().name() + " : " + prompt.toString(), true));
+         }
+         return "";
+      } else {
+         try {
+            final String returnValue;
+            String logOutput;
+            final TestRecord testRecord;
+            final IServiceConnector connector = environment.getConnector();
+            synchronized (test){
+               switch (prompt.getType()) {
+               case NONE:
+                  InformationalPrompt infoPrompt = new InformationalPrompt(connector, "", prompt.toString());
+                  infoPrompt.open(test.getUserSession(), promptInitWorker);
+                  infoPrompt.close();
+                  returnValue = "";
+                  testRecord = new AttentionRecord(environment, String.format("PROMPT [%s]\n{\n%s\n}\n", PromptResponseType.NONE.name(), prompt.toString()), true);
+                  break;
+               case PASS_FAIL:
+                  PassFailPromptImpl passFailPrompt = new PassFailPromptImpl(connector, test, "", prompt.toString());
+                  PassFailPromptResult result = passFailPrompt.open(promptInitWorker);
+                  returnValue = result.getText();
+                  passFailPrompt.close();
+                  testRecord =
+                        new TestPointRecord(environment, new CheckPoint("Pass/Fail Prompt", prompt.toString(),
+                              returnValue, result.isPass()), true);
+                  break;
+               case YES_NO:
+                  YesNoPromptImpl yesNoPrompt = new YesNoPromptImpl(connector, test, "", prompt.toString());
+                  YesNoPromptResult yesNo = yesNoPrompt.open(promptInitWorker);
+                  if (yesNo.isYes()) {
+                     returnValue = "YES";
+                  } else {
+                     returnValue = "NO";
+                  }
+                  logOutput =
+                        String.format("PROMPT [%s]\n{\n%s\n}\n\tRETURN VALUE : %s", PromptResponseType.YES_NO.name(),
+                              prompt.toString(), returnValue);
+                  yesNoPrompt.close();
+                  testRecord = new AttentionRecord(environment, logOutput, true);
+                  break;
+               case SCRIPT_PAUSE:
+                  ScriptPausePromptImpl scriptPausePrompt =
+                  new ScriptPausePromptImpl(connector, test, "", prompt.toString());
+                  returnValue = scriptPausePrompt.open(promptInitWorker);
+                  scriptPausePrompt.close();
+                  if (returnValue != null && returnValue.length() > 0) {
+                     logOutput =
+                           String.format("PROMPT [%s]\n{\n%s\n}\n\tRETURN VALUE : %s", PromptResponseType.SCRIPT_PAUSE.name(),
+                                 prompt.toString(), returnValue);
+                  } else {
+                     logOutput =
+                           String.format("PROMPT [%s]\n{\n%s\n}\n", PromptResponseType.SCRIPT_PAUSE.name(), prompt.toString());
+                  }
+
+                  testRecord = new AttentionRecord(environment, logOutput, true);
+                  ;
+                  break;
+               case USER_INPUT:
+                  UserInputPromptImpl userInputPrompt = new UserInputPromptImpl(connector, test, "", prompt.toString());
+                  returnValue = userInputPrompt.open(promptInitWorker);
+                  userInputPrompt.close();
+                  if (returnValue != null && returnValue.length() > 0) {
+                     logOutput =
+                           String.format("PROMPT [%s]\n{\n%s\n}\n\tRETURN VALUE : %s", PromptResponseType.USER_INPUT.name(),
+                                 prompt.toString(), returnValue);
+                  } else {
+                     logOutput =
+                           String.format("PROMPT [%s]\n{\n%s\n}\n", PromptResponseType.USER_INPUT.name(), prompt.toString());
+                  }
+                  testRecord = new AttentionRecord(environment, logOutput, true);
+                  break;
+               case SCRIPT_STEP:
+                  returnValue = "";
+                  testRecord =
+                        new AttentionRecord(environment,
+                              PromptResponseType.SCRIPT_STEP.name() + " : " + prompt.toString(), true);
+                  break;
+               case OFP_DEBUG_RESPONSE:
+                  returnValue = "";
+                  testRecord = null;
+                  break;
+               default:
+                  returnValue = "";
+                  testRecord = null;
+               }
+            }
+            if (testRecord != null) {
+               testRecord.setStackTrace(new Throwable());
+               test.getLogger().log(testRecord);
+            }
+            return returnValue;
+         } catch (InterruptedException e) {
+            throw new InterruptedException();
+         } catch (Exception e) {
+            // what
+         }
+         return "";
+      }
+
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java
new file mode 100644
index 0000000..0d92cec
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java
@@ -0,0 +1,628 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.logging.ILoggerFilter;
+import org.eclipse.osee.framework.logging.ILoggerListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+import org.eclipse.osee.ote.core.enums.ScriptTypeEnum;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptCompleteListener;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptInitializer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.framework.testrun.ITestRunListener;
+import org.eclipse.osee.ote.core.framework.testrun.ITestRunListenerProvider;
+import org.eclipse.osee.ote.core.log.ITestPointTally;
+import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
+
+/**
+ * TestScript is the abstract base class for all test scripts. This class provides the interfaces necessary to allow a
+ * script to be run against remote testing environment servers.
+ * <p>
+ * The TestScript class contains the following information:
+ * <ul>
+ * <li><b>crew</b> - Defines if the script is for pilot or copilot.
+ * <li><b>isBatchable</b> - Defines whether or not the script is batchable. This typically indicates whether or not
+ * there are any prompts in the script.
+ * <li><b>isMpLevel</b> - Defines if the script tests at the Mission Processor level or if it tests at the node level.
+ * <li>Selective run list of TestCase's for test case skipping
+ * <li>ScriptInitializer object
+ * <li>TestCase objects that make up the runtime of the script
+ * </ul>
+ * <p>
+ * When building a new TestScript object it is important to understand that the object does not only contain the runtime
+ * code for performing the test, but also contains information about the test being performed that can be retrieved by
+ * instantiating the object with out necessarily running it.
+ * <p>
+ * The following sample should be followed closely when building TestScript objects. <br>
+ * <br>
+ * <hr>
+ * <br>
+ * <code>
+ * public class SampleScript extends TestCase {
+ * <ul style="list-style: none">
+ * <li>	</code><i>Place declarations for <b>LRU Models</b>,<b>Messages</b>, and <b>Support</b> classes here.</i><code>
+ * <li>
+ * <li>	</code><i>This constructor is necessary for instantiating the TestScript object to get data!</i><code>
+ * <li>	SampleScript () {
+ * 		<ul style="list-style: none">
+ * <li>		this (null,null);
+ * 		</ul>
+ * <li>	}
+ * <li>
+ * <li>	</code><i>This constructor is used at runtime.</i><code>
+ * <li>	SampleScript (TestEnvironment environment, TestEnvironmentController connection) {
+ * 		<ul style="list-style: none">
+ * <li>		super (environment, connection, [batchability, true or false]);
+ * <li>
+ * <li>		</code><i>Place construction for <b>LRU Models</b>,<b>Messages</b>, and <b>Support</b> classes here.</i><code>
+ * <li>
+ * <li>		</code><i>Construct all test cases here. The base TestCase constructor will automatically add
+ * <li>itself to the run list of the TestScript.</i><code>
+ * <li>		new OipCase(this);
+ * <li>		</code><i>...</i><code>
+ * 		</ul>
+ * <li>	}
+ * <li>
+ * <li>	</code><i>This inner class defines the setup for the script and must be present.</i><code>
+ * <li>	private class LocalSetupTestCase extends SetupTestCase {
+ * 		<ul style="list-style: none">
+ * 	<li>
+ * 	<li>		</code><i>Allows the setup to add itself to the runlist.</i><code>
+ * 	<li>		protected LocalSetupTestCase(TestScript parent) {
+ * 			<ul style="list-style: none">
+ * <li>      	super(parent);
+ * 			</ul>
+ * <li>		}
+ * <li>
+ * <li>		</code><i>Provides the runtime code for initialization.</i><code>
+ * <li>		public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) {
+ * 			<ul style="list-style: none">
+ * <li>			</code><i>Place any necessary setup code here and it will be run prior to any of the test cases.</i><code>
+ * 			</ul>
+ * <li>		}
+ * 		</ul>
+ * <li>	}
+ * <li>	<br>
+ * <li>	</code><i>Place all of the test cases here. These will be inner classes that extend </i>
+ * {@link org.eclipse.osee.ote.core.TestCase TestCase}<i>.
+ * <li><b>NOTE:</b>All of these inner classes must be instantiated in the constructor for the TestScript object. If an
+ * inner class is not instantiated then it will <b>not</b> be run, and information within the class will not be
+ * available when the TestScript is instantiated for data retrieval.</i><code>
+ * <li>	public class OipCase extends TestCase {
+ * 		<ul style="list-style: none">
+ * <li>		public OipCase(TestScript parent) {
+ * 			<ul style="list-style: none">
+ * <li>			</code><i>Use <b>one</b> of the following constructors based on if this TestCase is standalone</i><code>
+ * <li>			super(parent);</code> <i>Standalone defaulted to <b>false</b></i><code>
+ * <li>			super(parent, true);</code><i>Standalone explicitly set to <b>true</b></i><code>
+ * <li>
+ * <li>			</code><i>All requirements tested in the test case should be noted here with the </i>
+ * <code>{@link org.eclipse.osee.ote.core.TestCase#addTracability(String) addTracability}</code><i> method.</i> <code>
+ * 			</ul>
+ * <li>		}
+ * <li>
+ * <li>		</code><i><b>Note:</b>It is very important that </i><code>doTestCase</code><i> always has the </i>
+ * <code>throws InterrupedException</code><i> in the method declaration. The ability to abort a script relies on this
+ * statement, and without it many calls would have to be wrapped with a try/catch block.</i><code>
+ * <li>		public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) throws InterruptedException {
+ * 			<ul style="list-style: none">
+ * <li>			</code><i>Place all of the runtime code for the test case here.</i><code>
+ * 			</ul>
+ * <li>		}
+ * 		</ul>
+ * <li>	}
+ * </ul>
+ * }
+ * </code> <br>
+ * <hr>
+ * 
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ * @see org.eclipse.osee.ote.core.TestCase
+ */
+public abstract class TestScript implements ITimeout {
+   private static final Set<Class<? extends TestScript>> instances =
+      Collections.synchronizedSet(new HashSet<Class<? extends TestScript>>());
+   private static final AtomicLong constructed = new AtomicLong(0);
+   private static final AtomicLong finalized = new AtomicLong(0);
+   private final boolean isBatchable;
+   private final ITestStation testStation;
+   private CommandDescription cmdDescription;
+   protected TestCase currentTestCase;
+   protected final TestEnvironment environment;
+   private final boolean isMpLevel;
+   private IScriptInitializer scriptInitializer;
+   private final ScriptTypeEnum scriptType;
+   private final ArrayList<TestCase> selectiveRunList = new ArrayList<>(32);
+   private Date startTime;
+   private final ArrayList<TestCase> testCases = new ArrayList<>(32);
+   private final ITestPointTally testPointTally;
+   protected CommandEndedStatusEnum status;
+   private Throwable rootCause;
+   private volatile boolean timedOut;
+   private volatile boolean aborted = false;
+   private final ArrayList<IScriptCompleteListener> scriptCompleteListeners =
+      new ArrayList<IScriptCompleteListener>(32);
+
+   private final ScriptResultRecord scriptResultRecord;
+   private int pass;
+   private int fail;
+   private ScriptLoggingListener loggingListener;
+   private final TestPromptImpl promptImpl;
+   private ITestRunListenerProvider listenerProvider;
+   private boolean shouldPauseOnFail;
+   private boolean printFailToConsole;
+
+   public TestScript(TestEnvironment environment, IUserSession callback, ScriptTypeEnum scriptType, boolean isBatchable) {
+      constructed.incrementAndGet();
+      this.scriptType = scriptType;
+      this.isBatchable = isBatchable;
+      this.isMpLevel = false;
+
+      promptImpl = new TestPromptImpl();
+      scriptResultRecord = new ScriptResultRecord(this);
+      if (environment != null) {
+         this.environment = environment;
+         this.startTime = new Date(0);
+         testStation = this.environment.getTestStation();
+         GCHelper.getGCHelper().addRefWatch(this);
+         instances.add(getClass());
+      } else {
+         throw new TestException("No environment found: Can not run script ", Level.SEVERE);
+      }
+      this.testPointTally = new TestPointTally(this.getClass().getName());
+      shouldPauseOnFail = OteProperties.isPauseOnFailEnabled();
+      printFailToConsole = OteProperties.isPrintFailToConsoleEnabled();
+   }
+
+   public void abort() {
+      OseeLog.log(TestEnvironment.class, Level.SEVERE, "Aborting script", new Exception());
+      aborted = true;
+   }
+
+   public void abortDueToThrowable(Throwable cause) {
+      this.rootCause = cause;
+      abort();
+   }
+
+   /**
+    * Removes all of the test cases from the selective run list. The list will be empty after this call returns.
+    */
+   public void clearRunList() {
+      selectiveRunList.clear();
+   }
+
+   public void endTest() {
+      // provided as a hook for scripts to override
+   }
+
+   /**
+    * @return Returns the startTime.
+    */
+   public Date getStartTime() {
+      return startTime;
+   }
+
+   public TestCase getTestCase() {
+      return currentTestCase;
+   }
+
+   /**
+    * Get list of test cases.
+    * 
+    * @return reference to arrayList testCases.
+    */
+   public/* TestCase */List<TestCase> getTestCases() {
+      ArrayList<TestCase> testCaseList = new ArrayList<>();
+      testCaseList.add(getSetupTestCase());
+      testCaseList.addAll(testCases);
+      testCaseList.add(getTearDownTestCase());
+      return testCaseList;
+   }
+
+   public ITestEnvironmentAccessor getTestEnvironment() {
+      return environment;
+   }
+
+   public IUserSession getUserSession() {
+      return ServiceUtility.getService(OTESessionManager.class).getActiveUser();
+   }
+
+   public TestScript getTestScript() {
+      return this;
+   }
+
+   public ITestLogger getLogger() {
+      return environment.getLogger();
+   }
+
+   public ScriptTypeEnum getType() {
+      return this.scriptType;
+   }
+
+   public final boolean isBatchable() {
+      return isBatchable;
+   }
+
+   public final boolean isMpLevel() {
+      return isMpLevel;
+   }
+
+   public String prompt(final TestPrompt prompt) throws InterruptedException {
+      return promptImpl.prompt(prompt, environment, this);
+   }
+
+   /**
+    * This method will display a null prompt to the console.
+    */
+   public void prompt() throws InterruptedException {
+      getTestScript().prompt(new TestPrompt(null, PromptResponseType.NONE));
+   }
+
+   /**
+    * This method will display the message input to the console.
+    */
+   public void prompt(String message) throws InterruptedException {
+      getTestScript().prompt(new TestPrompt(message, PromptResponseType.NONE));
+   }
+
+   /**
+    * This method will display the message input to the console. It will also prompt the user with a dialog box to input
+    * whether the condition passed or failed.
+    */
+   public void promptPassFail(String message) throws InterruptedException {
+      getTestScript().prompt(new TestPrompt(message, PromptResponseType.PASS_FAIL));
+   }
+
+   /**
+    * This method will display the message input to the console. It also pauses the script running, and will prompt the
+    * user with a dialog box to continue on with the running of the script.
+    */
+   public void promptPause(String message) throws InterruptedException {
+      prompt(new TestPrompt(message, PromptResponseType.SCRIPT_PAUSE));
+   }
+
+   public void pauseScriptOnFail(int testPoint) throws InterruptedException{
+      if (shouldPauseOnFail){
+         promptPause("Test point " + testPoint + " failed.\n");
+      }
+   }
+   
+   public void pauseScriptOnFail(int testPoint, String name, String expected, String actual, String stackTrace) throws InterruptedException{
+      if (shouldPauseOnFail){
+         promptPause("TP " + testPoint + ": " + name + "\nExpected: " + expected + "\nActual:      " + actual + "\n\n" + stackTrace );
+      }
+   }
+   
+   public void printFailure(int testPoint) throws InterruptedException{
+      if (printFailToConsole){
+         prompt("Test point " + testPoint + " failed.\n");
+      }
+   }
+   public void printFailure(int testPoint, String name, String expected, String actual, String stackTrace) throws InterruptedException{
+      if (printFailToConsole){
+         prompt("TP " + testPoint + ": " + name + "\nExpected: " + expected + "\nActual:      " + actual + "\n\n" + stackTrace );
+      }
+   }
+   
+   /**
+    * Do not use this method from tests instead use {@link #logTestPoint(boolean, String, String, String)}. Takes result of test point and updates the total test point tally.
+    * 
+    * @return total number of test points completed as an int.
+    */
+   public int __recordTestPoint(boolean passed) {
+      return testPointTally.tallyTestPoint(passed);
+   }
+
+   public int getCurrentPointNumber() {
+      return testPointTally.getTestPointTotal();
+   }
+
+   public void addScriptSummary(XmlizableStream xml) {
+	   scriptResultRecord.addChildElement((XmlizableStream) xml);
+   }
+   
+   /**
+    * Add a single test case to selective run list.
+    */
+   public void selectTestCase(int testCaseNumber) {
+      TestCase testCase = testCases.get(testCaseNumber - 1);
+      if (!testCase.isStandAlone()) {
+         throw new IllegalArgumentException("Test case " + testCaseNumber + " is not stand alone.");
+      }
+      selectiveRunList.add(testCase);
+   }
+
+   /**
+    * Add multiple test cases to the selective run list.
+    */
+   public void selectTestCases(int testCaseNumberStart, int testCaseNumberEnd) {
+      for (int i = testCaseNumberStart; i <= testCaseNumberEnd; i++) {
+         selectTestCase(i);
+      }
+   }
+
+   /**
+    * Sets the script initializer.
+    */
+   public void setScriptInitializer(IScriptInitializer scriptInitializer) {
+
+      this.scriptInitializer = scriptInitializer;
+
+   }
+
+   public IScriptInitializer getScriptInitializer() {
+      return scriptInitializer;
+   }
+
+   /**
+    * Causes current thread to wait until another thread invokes the {@link java.lang.Object#notify()}method or the
+    * {@link java.lang.Object#notifyAll()}method for this object.
+    */
+   public synchronized void testWait(int milliseconds) throws InterruptedException {
+      if (milliseconds < 2) {
+         return;
+      }
+      environment.getLogger().methodCalled(this.environment, new MethodFormatter().add(milliseconds));
+      environment.setTimerFor(this, milliseconds);
+      wait();
+      this.getTestEnvironment().getScriptCtrl().lock();
+      environment.getLogger().methodEnded(this.environment);
+   }
+
+   public synchronized void testWaitNoLog(int milliseconds) throws InterruptedException {
+      if (milliseconds < 2) {
+         return;
+      }
+      environment.setTimerFor(this, milliseconds);
+      wait();
+      this.getTestEnvironment().getScriptCtrl().lock();
+   }
+
+   /**
+    * Prints text to the console informing the user of how much time is left in the wait. Any wait time can be passed
+    * in, but this is intended for long waits; usually > 20 seconds. Will not print any info is the time is less than
+    * 1000 ms.
+    * 
+    * @param ms Milliseconds to wait for.
+    */
+   public synchronized void testWaitWithInfo(int ms) throws InterruptedException {
+      int mult = 0;
+      if (ms > 999) {
+         prompt(new TestPrompt("\tWaiting for " + ms / 1000.0 + " seconds."));
+         while (ms >= 30000) {
+            mult++;
+            ms -= 20000;
+            testWait(20000);
+            prompt(new TestPrompt("\t" + 20 * mult + " seconds elapsed."));
+         }
+
+         prompt(new TestPrompt("\tFinishing up; " + ms / 1000.0 + " more seconds."));
+      }
+      testWait(ms);
+      prompt(new TestPrompt("\ttestWait done."));
+   }
+
+   // public String toString() {
+
+   // String description = "Test Script:\n";
+
+   // for (Iterator iter = testCases.iterator(); iter.hasNext();) {
+   // TestCase testCase = (TestCase) iter.next();
+   // description += "\t" + testCase + "\n";
+   // }
+
+   // return description;
+   // }
+
+   /**
+    * Add test case to the test scripts list of test cases.
+    * 
+    * @return the number of test cases in the arrayList testCases as an int.
+    */
+   protected int addTestCase(TestCase testCase) {
+      testCases.add(testCase);
+      return testCases.size();
+   }
+
+   @Deprecated
+   public CommandDescription getCommandDescription() {
+      return this.cmdDescription;
+   }
+
+   protected TestCase getSetupTestCase() {
+      return null;
+   }
+
+   protected TestCase getTearDownTestCase() {
+      return null;
+   }
+
+   /**
+    * Log a test point to the test.
+    * 
+    * @param isPassed
+    * @param testPointName
+    * @param expected
+    * @param actual
+    */
+   public void logTestPoint(boolean isPassed, String testPointName, String expected, String actual) {
+      this.getLogger().testpoint(this.getTestEnvironment(), this, this.getTestCase(), isPassed, testPointName,
+         expected, actual);
+   }
+
+   @Override
+   public boolean isTimedOut() {
+      return this.timedOut;
+   }
+
+   @Override
+   public void setTimeout(boolean timeout) {
+      this.timedOut = timeout;
+   }
+
+   /**
+    * Use addTestRunListener(ITestRunListener listener) instead.
+    * 
+    * @see #addTestRunListener(ITestRunListener listener)
+    */
+   @Deprecated
+   public void addScriptCompleteListener(IScriptCompleteListener listener) {
+      scriptCompleteListeners.add(listener);
+   }
+
+   public ITestStation getTestStation() {
+      return testStation;
+   }
+
+   protected void dispose() {
+      OseeLog.log(TestScript.class, Level.FINEST, "calling dispose on the TestScript.class");
+   }
+
+   /**
+    * Do not use this method from tests instead use {@link #logTestPoint(boolean, String, String, String)}.
+    * 
+    */
+   public void __addTestPoint(boolean pass) {
+      if (pass) {
+         this.pass++;
+      } else {
+         this.fail++;
+      }
+   }
+
+   private class ScriptLoggingListener implements ILoggerListener {
+
+      ILoggerFilter filter = new TestScriptLogFilter();
+
+      public ILoggerFilter getFilter() {
+         return filter;
+      }
+
+      @Override
+      public void log(String loggerName, Level level, String message, Throwable th) {
+         if (environment.getLogger() != null) {
+            environment.getLogger().log(level, message, th);
+         }
+      }
+
+   }
+
+   @Override
+   protected void finalize() throws Throwable {
+      instances.remove(getClass());
+      finalized.incrementAndGet();
+      super.finalize();
+   }
+
+   public static long getConstructed() {
+      return constructed.get();
+   }
+
+   public static long getFinalized() {
+      return finalized.get();
+   }
+
+   public static Collection<Class<? extends TestScript>> getInstances() {
+      return new HashSet<Class<? extends TestScript>>(instances);
+   }
+
+   public void disposeTest() {
+      dispose();
+   }
+
+   public boolean isAborted() {
+      return aborted;
+   }
+
+   @Deprecated
+   public void processScriptcompleteListeners() {
+      for (IScriptCompleteListener listener : scriptCompleteListeners) {
+         try {
+            listener.onScriptComplete();
+         } catch (Throwable t) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE,
+               "exception while notifying script complete listener " + listener.getClass().getName(), t);
+         }
+      }
+   }
+
+   public void setListenerProvider(ITestRunListenerProvider listenerProvider) {
+      this.listenerProvider = listenerProvider;
+   }
+
+   public boolean addTestRunListener(ITestRunListener listener) {
+      if (listenerProvider == null) {
+         String message =
+            String.format("Could not add run listener %s since listener provider is null.",
+               listener.getClass().getName());
+         OseeLog.log(getClass(), Level.WARNING, message, new Exception());
+         return false;
+      }
+      return this.listenerProvider.addTestRunListener(listener);
+   }
+
+   public boolean removeTestRunListener(ITestRunListener listener) {
+      if (listenerProvider == null) {
+         String message =
+            String.format("Could not remove run listener %s since listener provider is null.",
+               listener.getClass().getName());
+         OseeLog.log(getClass(), Level.WARNING, message, new Exception());
+         return false;
+      }
+      return this.listenerProvider.removeTestRunListener(listener);
+   }
+
+   public int getPasses() {
+      return pass;
+   }
+
+   public int getFails() {
+      return fail;
+   }
+
+   @JsonProperty
+   public ScriptResultRecord getScriptResultRecord() {
+      return scriptResultRecord;
+   }
+
+   public void setAborted(boolean aborted) {
+      this.aborted = aborted;
+   }
+
+   void setTestCase(TestCase currentTestCase) {
+      this.currentTestCase = currentTestCase;
+   }
+
+   public String getOutfileComment() {
+      return "\nNO_OUTFILE_COMMENT\n";
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.java
new file mode 100644
index 0000000..ccbc5fe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.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.core;
+
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.logging.ILoggerFilter;
+
+public class TestScriptLogFilter implements ILoggerFilter {
+   private static Level level;
+   static {
+      level = Level.parse(System.getProperty("ote.testscript.filter.level", "SEVERE"));
+   }
+
+   @Override
+   public Pattern bundleId() {
+      return null;
+   }
+
+   @Override
+   public Level getLoggerLevel() {
+      return level;
+   }
+
+   @Override
+   public Pattern name() {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java
new file mode 100644
index 0000000..bf8fb3b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * 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.core;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlSupport {
+
+   private static final Matcher xmlPatternMatcher = Pattern.compile(
+         "[^" + "a-zA-Z0-9" + "!@#$%\\^&*\\(\\)" + "+ _.-=" + "\'\"<>{}\\[\\]|:;,\n\r\t?/`~\\\\]+").matcher("");
+   private static final String CDATA_TEMPLATE = "<![CDATA[%s]]>";
+   private static final String HEX_START = " 0x";
+   private static final String CDATA_END = "]]>";
+
+   // Prevent Instantiation
+   private XmlSupport() {
+   }
+
+   public static String format(String value) {
+      return XmlSupport.isValidCharaterData(value) ? value : asCDATA(value);
+   }
+
+   public static String asCDATA(String value) {
+      if (!isValidCDATA(value)) {
+         ChangeSet changeSet = null;
+         xmlPatternMatcher.reset(value);
+         while (xmlPatternMatcher.find()) {
+            char[] charToConvert = xmlPatternMatcher.group().toCharArray();
+            StringBuilder converted = new StringBuilder();
+            for (int index = 0; index < charToConvert.length; index++) {
+               converted.append(HEX_START);
+               converted.append(Integer.toString(charToConvert[index], 16));
+            }
+            if (changeSet == null) {
+               changeSet = new ChangeSet(value);
+            }
+            changeSet.replace(xmlPatternMatcher.start(), xmlPatternMatcher.end(), converted.toString());
+         }
+         if (changeSet != null) {
+            value = changeSet.applyChangesToSelf().toString();
+         }
+      }
+      return String.format(CDATA_TEMPLATE, value);
+   }
+
+   public static String sanitizeXMLContent(String str) {
+      return str.replace((char) 0x1a, ' ');
+   }
+
+   private static boolean isValidCDATA(String text) {
+      return isValidCharaterData(text) && !text.contains(CDATA_END);
+   }
+
+   public static boolean isValidCharaterData(String text) {
+      if (text != null) {
+         int size = text.length();
+         for (int index = 0; index < size; index++) {
+            int character = text.charAt(index);
+            if (isSurrogatePair(character)) {
+               index++;
+               if (index < size) {
+                  // Check the lower part of the surrogate pair
+                  char lowerPart = text.charAt(index);
+                  if (isValidLowerSurrogate(lowerPart)) {
+                     character = toInt(character, lowerPart);
+                  } else {
+                     return false;
+                  }
+               } else {
+                  return false;
+               }
+            }
+            if (!isHTMLCharacter(character)) {
+               return false;
+            }
+         }
+         return true;
+      }
+      return false;
+   }
+
+   private static boolean isSurrogatePair(int character) {
+      return 0xD800 <= character && character <= 0xDBFF;
+   }
+
+   private static boolean isValidLowerSurrogate(char toCheck) {
+      return 0xDC00 <= toCheck && toCheck <= 0xDFFF;
+   }
+
+   private static int toInt(int higher, char lower) {
+      return 0x10000 + (higher - 0xD800) * 0x400 + lower - 0xDC00;
+   }
+
+   private static boolean isHTMLCharacter(int c) {
+      if (c == '\n' || c == '\r' || c == '\t') {
+         return true;
+      }
+      if (c >= 0x20 && c < 0x7F) {
+         return true;
+      }
+      return false;
+   }
+
+   /**
+    * Replaces non printable characters with 'ASCII=###' human readable text
+    */
+   public static String convertNonPrintableCharacers(String message) {
+      return convertCharacers(message, true, false);
+   }
+
+   /**
+    * Replaces XML specific characters '<', '>', '&' with human readable text.
+    * Note: also converts non-printable characters
+    */
+   public static String convertXmlCharacters(String message) {
+      return convertCharacers(message, true, true);
+   }
+
+   private static String convertCharacers(String message, boolean printable, boolean xml) {
+
+      StringBuilder buff = new StringBuilder(message.length());
+      for (int i = 0; i < message.length(); i++) {
+         char currentChar = message.charAt(i);
+         if (printable && (currentChar < 32 || currentChar > 126) && currentChar != '\n' && currentChar != '\r' && currentChar != '\t') {
+            buff.append("[ASCII=" + (int) currentChar + "]");
+         } else if (xml && currentChar == '<') {
+            buff.append("[less-than]");
+         } else if (xml && currentChar == '>') {
+            buff.append("[greater-than]");
+         } else if (xml && currentChar == '&') {
+            buff.append("[ampersand]");
+         } else {
+            buff.append(currentChar);
+         }
+      }
+
+      return buff.toString();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteEventTopic.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteEventTopic.java
new file mode 100644
index 0000000..5b7b21b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteEventTopic.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.core.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OteEventTopic {
+	String[] value();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteProperty.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteProperty.java
new file mode 100644
index 0000000..22aa505
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteProperty.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.core.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OteProperty {
+	String[] value();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandId.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandId.java
new file mode 100644
index 0000000..2dcf81c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandId.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.core.cmd;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface CommandId {
+   Namespace getNamespace();
+
+   Name getName();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Name.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Name.java
new file mode 100644
index 0000000..6229c1b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Name.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * 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.core.cmd;
+
+public interface Name {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Namespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Namespace.java
new file mode 100644
index 0000000..51f534b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Namespace.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * 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.core.cmd;
+
+public interface Namespace {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.java
new file mode 100644
index 0000000..9b564a6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.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.core.cmd;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface Source {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringCommandId.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringCommandId.java
new file mode 100644
index 0000000..8d10b5e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringCommandId.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.core.cmd;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StringCommandId implements CommandId, Serializable {
+
+   private static final long serialVersionUID = 2236967568467058971L;
+   private final Namespace namespace;
+   private final Name name;
+
+   public StringCommandId(Namespace namespace, Name name) {
+      this.namespace = namespace;
+      this.name = name;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (obj instanceof StringCommandId) {
+         return namespace.equals(((StringCommandId) obj).namespace) && name.equals(((StringCommandId) obj).name);
+      } else {
+         return false;
+      }
+   }
+
+   @Override
+   public int hashCode() {
+      int hash = 7;
+      hash = 31 * hash + namespace.hashCode();
+      hash = 31 * hash + name.hashCode();
+      return hash;
+   }
+
+   @Override
+   public Name getName() {
+      return name;
+   }
+
+   @Override
+   public Namespace getNamespace() {
+      return namespace;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.java
new file mode 100644
index 0000000..bdea6bb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.core.cmd;
+
+import java.io.Serializable;
+
+public class StringName implements Name, Serializable {
+   private static final long serialVersionUID = -7215226960243262972L;
+   private final String name;
+
+   public StringName(String name) {
+      this.name = name;
+   }
+
+   @Override
+   public boolean equals(Object arg0) {
+      if (arg0 instanceof StringName) {
+         return name.equals(((StringName) arg0).name);
+      } else {
+         return false;
+      }
+   }
+
+   @Override
+   public int hashCode() {
+      return name.hashCode();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringNamespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringNamespace.java
new file mode 100644
index 0000000..2d0ef9f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringNamespace.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.cmd;
+
+import java.io.Serializable;
+
+public class StringNamespace implements Namespace, Serializable {
+   private static final long serialVersionUID = -8903438134102328929L;
+   private final String namespace;
+
+   public StringNamespace(String namespace) {
+      this.namespace = namespace;
+   }
+
+   @Override
+   public boolean equals(Object arg0) {
+      if (arg0 instanceof StringNamespace) {
+         return namespace.equals(((StringNamespace) arg0).namespace);
+      } else {
+         return false;
+      }
+   }
+
+   @Override
+   public int hashCode() {
+      return namespace.hashCode();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.java
new file mode 100644
index 0000000..7618bf8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.core.cmd;
+
+import java.io.Serializable;
+import java.net.URI;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class UriSource implements Source, Serializable {
+
+   private static final long serialVersionUID = -917397242786038197L;
+   private final URI source;
+
+   public UriSource(URI source) {
+      this.source = source;
+   }
+
+   public URI getSource() {
+      return source;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      return source.equals(obj);
+   }
+
+   @Override
+   public int hashCode() {
+      return source.hashCode();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java
new file mode 100644
index 0000000..d854695
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.core.enums;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum PromptResponseType {
+
+   NONE,
+   /**
+    * Wait for the a response from the user confirming that they have started the debug ofp.
+    */
+   OFP_DEBUG_RESPONSE,
+   /**
+    * Pause script execution until a response is recieved from a client.
+    */
+   SCRIPT_PAUSE,
+   PASS_FAIL,
+   SCRIPT_STEP,
+   USER_INPUT,
+   YES_NO;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/ScriptTypeEnum.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/ScriptTypeEnum.java
new file mode 100644
index 0000000..da2ae2b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/ScriptTypeEnum.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.enums;
+
+import java.io.Serializable;
+
+public enum ScriptTypeEnum implements Serializable {
+
+   MSG_FUNCTIONAL,
+   UNIT_TEST,
+   FUNCTIONAL_TEST,
+   UNKNOWN,
+   INVALID;
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SkynetTestTypes.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SkynetTestTypes.java
new file mode 100644
index 0000000..91110f1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SkynetTestTypes.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.core.enums;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SkynetTestTypes {
+   public static final String EXECUTION_DATE = "Execution Date";
+   public static final String TEST_STATUS = "Test Status";
+   public static final String TEST_RUN = "Test Run";
+   public static final String EXEC5UTION_DATE = "Execution Date";
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.java
new file mode 100644
index 0000000..cadab6a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.enums;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+
+public class SupportedScriptTypes implements Serializable {
+
+   private static final long serialVersionUID = 8403281090133318485L;
+   public EnumSet<ScriptTypeEnum> supportedClasses = EnumSet.noneOf(ScriptTypeEnum.class);
+
+   public void add(ScriptTypeEnum scriptType) {
+      supportedClasses.add(scriptType);
+   }
+
+   /*
+    * public HashSet<ScriptTypeEnum> getSupportedClasses(){ return supportedClasses; }
+    */
+
+   public boolean isSupported(ScriptTypeEnum type) {
+      return supportedClasses.contains(type);
+   }
+
+   public String getFormmatedString() {
+      return "Supported Script Types : " + supportedClasses + "\n";
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.java
new file mode 100644
index 0000000..20621c0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.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.core.environment;
+
+import java.util.LinkedList;
+import java.util.WeakHashMap;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class AsynchRemoteJobs implements Runnable {
+
+   private final LinkedList<Runnable> jobs;
+   private static WeakHashMap<Object, AsynchRemoteJobs> map = new WeakHashMap<>();
+
+   public static AsynchRemoteJobs getInstance(Object obj) {
+      AsynchRemoteJobs asynchRemoteJobs = null;
+      asynchRemoteJobs = map.get(obj);
+      if (asynchRemoteJobs == null) {
+         asynchRemoteJobs = new AsynchRemoteJobs();
+         map.put(obj, asynchRemoteJobs);
+      }
+      return asynchRemoteJobs;
+   }
+
+   public AsynchRemoteJobs() {
+      jobs = new LinkedList<>();
+      Thread th = new Thread(this);
+      th.setName("AsynchRemoteJobs[Test Environment]");
+      th.start();
+   }
+
+   public void addJob(Runnable job) {
+      synchronized (jobs) {
+         jobs.addLast(job);
+      }
+      synchronized (this) {
+         this.notify();
+      }
+   }
+
+   @Override
+   public void run() {
+      while (true) {
+         while (jobs.size() > 0) {
+            Runnable run = null;
+            synchronized (jobs) {
+               run = jobs.removeFirst();
+            }
+            run.run();
+         }
+         try {
+            synchronized (this) {
+               this.wait();
+            }
+         } catch (InterruptedException e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+         }
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleConfigurationReport.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleConfigurationReport.java
new file mode 100644
index 0000000..0224f49
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleConfigurationReport.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class BundleConfigurationReport implements Serializable {
+   private static final long serialVersionUID = 2948282371713776849L;
+   private final List<BundleDescription> missing;
+   private final List<BundleDescription> versionMismatch;
+   private final List<BundleDescription> partOfInstallation;
+
+   public static long getSerialversionuid() {
+      return serialVersionUID;
+   }
+
+   public List<BundleDescription> getMissing() {
+      return missing;
+   }
+
+   public List<BundleDescription> getVersionMismatch() {
+      return versionMismatch;
+   }
+
+   public List<BundleDescription> getPartOfInstallation() {
+      return partOfInstallation;
+   }
+
+   public BundleConfigurationReport(List<BundleDescription> missing, List<BundleDescription> versionMismatch, List<BundleDescription> partOfInstallation) {
+      this.missing = missing;
+      this.partOfInstallation = partOfInstallation;
+      this.versionMismatch = versionMismatch;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java
new file mode 100644
index 0000000..5fc37de
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.net.URL;
+import java.util.jar.Manifest;
+
+/**
+ * Describes the location where a bundle can be acquired from and provides the manifest of the bundle so that an
+ * educated decision can be made about whether a bundle is needed or not.
+ * 
+ * @author Robert A. Fisher
+ */
+public class BundleDescription implements Serializable {
+   private static final long serialVersionUID = 546754001181908641L;
+
+   private final URL location;
+   private final boolean systemLibrary;
+   private final byte[] manifestData;
+   private final String md5Digest;
+   private transient Manifest manifest;
+
+   /**
+    * Deserialization constructor
+    */
+   protected BundleDescription() {
+      this.location = null;
+      this.manifestData = null;
+      this.manifest = null;
+      this.systemLibrary = false;
+      this.md5Digest = null;
+   }
+
+   public BundleDescription(URL systemLocation, URL serverLocation, Manifest manifest, boolean systemLibrary, String md5Digest) {
+      if (systemLocation == null) {
+         throw new IllegalArgumentException("systemLocation must not be null");
+      }
+      if (serverLocation == null) {
+         throw new IllegalArgumentException("serverLocation must not be null");
+      }
+      if (manifest == null) {
+         throw new IllegalArgumentException("manifest must not be null");
+      }
+      if (md5Digest == null) {
+         throw new IllegalArgumentException("md5Digest must not be null");
+      }
+
+      ByteArrayOutputStream out = new ByteArrayOutputStream();
+      try {
+         manifest.write(out);
+      } catch (IOException ex) {
+         throw new IllegalStateException("ByteArrayOutputStream never should throw IOException", ex);
+      }
+
+      this.location = serverLocation;
+      this.manifestData = out.toByteArray();
+      this.systemLibrary = systemLibrary;
+      this.md5Digest = md5Digest;
+   }
+
+   public InputStream getBundleData() throws IOException {
+      return location.openConnection().getInputStream();
+   }
+
+   /**
+    * @return the manifestData
+    */
+   public Manifest getManifest() {
+      try {
+         if (manifest == null) {
+            manifest = new Manifest(new ByteArrayInputStream(manifestData));
+         }
+         return manifest;
+      } catch (IOException ex) {
+         throw new IllegalStateException("ByteArrayInputStream never should throw IOException", ex);
+      }
+   }
+
+   public String getSymbolicName() {
+      return getManifestEntry("Bundle-SymbolicName");
+   }
+
+   public String getVersion() {
+      return getManifestEntry("Bundle-Version");
+   }
+
+   private String getManifestEntry(String attribute) {
+      String entry = getManifest().getMainAttributes().getValue(attribute).trim();
+
+      // Sometimes there's a semicolon then extra info - ignore this
+      int index = entry.indexOf(';');
+      if (index != -1) {
+         entry = entry.substring(0, index);
+      }
+
+      return entry;
+   }
+
+   /**
+    * @return the systemLibrary
+    */
+   public boolean isSystemLibrary() {
+      return systemLibrary;
+   }
+
+   /**
+    * @return the md5Digest
+    */
+   public String getMd5Digest() {
+      return md5Digest;
+   }
+
+   public boolean isLocalFile() {
+      String protocol = location.getProtocol();
+      return protocol.equals("file");
+   }
+
+   public String getLocation() {
+      return location.toString();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.java
new file mode 100644
index 0000000..cd2dea2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.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.core.environment;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.osgi.framework.BundleException;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class BundleResolveException extends Exception {
+   private static final long serialVersionUID = 5506351677181297953L;
+   private final Collection<BundleException> bundleExceptions;
+
+   public BundleResolveException(String message, Collection<BundleException> bundleExceptions) {
+      super(message);
+      this.bundleExceptions = bundleExceptions;
+   }
+
+   @Override
+   public String toString() {
+      StringBuilder builder = new StringBuilder();
+
+      builder.append(super.toString() + "\n");
+      builder.append(Collections.toString("\n", bundleExceptions));
+
+      return builder.toString();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java
new file mode 100644
index 0000000..7941fc1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import org.eclipse.osee.ote.core.IUserSession;
+
+public class ConsoleOutputJob implements Runnable {
+
+   private final IUserSession callback;
+   private final String message;
+
+   public ConsoleOutputJob(IUserSession callback, String message) {
+      this.callback = callback;
+      this.message = message;
+   }
+
+   @Override
+   public void run() {
+      try {
+         callback.initiateInformationalPrompt(message);
+      } catch (Throwable e) {
+         System.out.println(message);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java
new file mode 100644
index 0000000..7c433f6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.util.TimerTask;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.TestException;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class EnvironmentTask {
+   public static final double cycleResolution = 300.0;
+   private final double hzRate;
+   private final int phase;
+   private final int runEveryNcycles;
+   private boolean running;
+   private TimerTask timerTask;
+
+   private double averateRate;
+
+   private final Benchmark bm;
+
+   public EnvironmentTask(double hzRate) {
+      this(hzRate, 0);
+   }
+
+   public EnvironmentTask(double hzRate, int phase) {
+      this.hzRate = hzRate;
+      this.running = true;
+      this.phase = phase;
+      runEveryNcycles = (int) Math.round(cycleResolution / hzRate);
+      bm = new Benchmark(getClass().getName(), (long) (1000000.0 / hzRate));
+      GCHelper.getGCHelper().addRefWatch(this);
+   }
+
+   public EnvironmentTask(double hzRate, TestEnvironment environment) {
+      this(hzRate);
+      environment.addTask(this);
+   }
+
+   public void baseRunOneCycle(int cycleCount) throws TestException {
+      if (cycleCount == -1 || cycleCount % runEveryNcycles == phase && running) { // if my turn
+
+         bm.samplePoint();
+         try {
+            runOneCycle();
+         } catch (InterruptedException e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+         }
+
+      }
+   }
+
+   public void cancel() {
+      if (timerTask != null) {
+         timerTask.cancel();
+      }
+   }
+
+   public void disable() {
+      this.running = false;
+   }
+
+   public void enable() {
+      this.running = true;
+   }
+
+   /** Gets the hzRate. */
+   public double getHzRate() {
+      return hzRate;
+   }
+
+   public boolean isRunning() {
+      return this.running;
+   }
+
+   public abstract void runOneCycle() throws InterruptedException, TestException;
+
+   public void setTimerTask(TimerTask timerTask) {
+      this.timerTask = timerTask;
+   }
+
+   public double getAverateRate() {
+      return averateRate;
+   }
+
+   @Override
+   public String toString() {
+      return this.getClass().getName() + "{ Task: " + hzRate + "Hz, Phase " + phase + ", running=" + (running ? "true" : "false") + " }";
+
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptCompleteEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptCompleteEvent.java
new file mode 100644
index 0000000..c699bd2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptCompleteEvent.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.core.environment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IScriptCompleteEvent {
+   void scriptComplete();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptSetupEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptSetupEvent.java
new file mode 100644
index 0000000..e24594f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptSetupEvent.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.core.environment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IScriptSetupEvent {
+   void scriptSetup();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java
new file mode 100644
index 0000000..784b9f5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.eclipse.osee.framework.logging.ILoggerListener;
+
+public class OteLogFile implements ILoggerListener {
+
+   public Set<Logger> initializedLoggers;
+   private final FileOutputStream fos;
+   private final StringBuilder sb;
+   private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+
+   public OteLogFile(File file) throws FileNotFoundException {
+      fos = new FileOutputStream(file);
+      sb = new StringBuilder();
+   }
+
+   @Override
+   public synchronized void log(String loggerName, Level level, String message, Throwable th) {
+      try {
+         sb.append(String.format("<record name=\"%s\" level=\"%s\" >\n", loggerName, level.getName()));
+         sb.append("<Time>");
+         sb.append(sdf.format(new Date()));
+         sb.append("</Time>\n");
+         sb.append("<message>\n");
+         sb.append(message);
+         sb.append("\n");
+         sb.append("</message>\n");
+         if (th != null) {
+            sb.append("<stacktrace>");
+            writeStackTrace(sb, th);
+            sb.append("</stacktrace>\n");
+         }
+         sb.append("</record>\n");
+         fos.write(sb.toString().getBytes());
+         fos.flush();
+         sb.setLength(0);
+      } catch (IOException ex) {
+         ex.printStackTrace();
+      }
+   }
+
+   private void writeStackTrace(StringBuilder sb, Throwable th) {
+      while (th != null) {
+         sb.append(th.getMessage());
+         sb.append("\n");
+         for (StackTraceElement el : th.getStackTrace()) {
+            sb.append(el.toString());
+            sb.append("\n");
+         }
+         th = th.getCause();
+      }
+   }
+
+   @Override
+   protected void finalize() throws Throwable {
+      fos.close();
+      super.finalize();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ReportDataControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ReportDataControl.java
new file mode 100644
index 0000000..53b4c3e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ReportDataControl.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportData;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.environment.interfaces.IReportData;
+
+public class ReportDataControl implements IReportData {
+   private final ReportData queueData;
+   // private ArrayList<ReportDataListener> queueListeners;
+   private final ArrayList<ReportDataListener> queueListeners;
+
+   public ReportDataControl() {
+      this.queueListeners = new ArrayList<>();
+      ArrayList<String> queueHeaders = new ArrayList<>();
+      queueHeaders.add("User");
+      queueHeaders.add("Script");
+      this.queueData = new ReportData(queueHeaders);
+   }
+
+   @Override
+   @SuppressWarnings("unchecked")
+   public void addQueueListener(ReportDataListener listener, List cmds) {
+      queueListeners.add(listener);
+      updateQueueData(cmds);
+      try {
+         listener.updateData(queueData);
+      } catch (RemoteException e) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+      }
+   }
+
+   @Override
+   public void removeQueueListener(ReportDataListener listener) {
+      queueListeners.remove(listener);
+   }
+
+   @Override
+   @SuppressWarnings("unchecked")
+   public void updateQueueListeners(List cmds) {
+      updateQueueData(cmds);
+      for (int i = 0; i < queueListeners.size(); i++) {
+         try {
+            queueListeners.get(i).updateData(queueData);
+         } catch (RemoteException e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+         }
+      }
+   }
+
+   private void updateQueueData(List<TestEnvironmentCommand> cmds) {
+      queueData.clearItems();
+      ArrayList<String> values;
+      for (int i = 0; i < cmds.size(); i++) {
+         TestEnvironmentCommand cmd = cmds.get(i);
+         values = new ArrayList<>();
+         values.add(cmd.getDescription().getDescription());
+         queueData.addItem(cmd.getDescription().getGuid(), values);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.java
new file mode 100644
index 0000000..1a6bbe2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+
+public class ScriptControl implements IScriptControl {
+
+   protected boolean isOfpPaused = false;
+   protected boolean isScriptPaused = false;
+   protected boolean isScriptReady = false;
+
+   public ScriptControl() {
+   }
+
+   @Override
+   public boolean isLocked() {
+      return false;
+   }
+
+   @Override
+   public boolean isExecutionUnitPaused() {
+      return isOfpPaused;
+   }
+
+   @Override
+   public boolean isScriptPaused() {
+      return isScriptPaused;
+   }
+
+   @Override
+   public boolean isScriptReady() {
+      return isScriptReady;
+   }
+
+   @Override
+   public void lock() {
+   }
+
+   @Override
+   public void setExecutionUnitPause(boolean pause) {
+      isOfpPaused = pause;
+   }
+
+   @Override
+   public void setScriptPause(boolean pause) {
+      isScriptPaused = pause;
+   }
+
+   @Override
+   public void setScriptReady(boolean ready) {
+      isScriptReady = ready;
+   }
+
+   @Override
+   public boolean shouldStep() {
+      return isScriptPaused() && !isExecutionUnitPaused();
+   }
+
+   @Override
+   public void unlock() {
+   }
+
+   @Override
+   public boolean hasLock() {
+      return false;
+   }
+
+   @Override
+   public boolean isHeldByCurrentThread() {
+      return false;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
new file mode 100644
index 0000000..2d68ba2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
@@ -0,0 +1,594 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.connection.service.LocalConnector;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OseeLogStatusCallback;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.OseeTestThread;
+import org.eclipse.osee.ote.core.OteProperties;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.interfaces.IAssociatedObjectListener;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IEnvironmentFactory;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class TestEnvironment implements TestEnvironmentInterface, ITestEnvironmentAccessor, ITestContext {
+
+   private final List<ITestEnvironmentListener> envListeners = new ArrayList<>(32);
+   private IExecutionUnitManagement executionUnitManagement;
+
+   private File outDir = null;
+   private final ITestStation testStation;
+   private boolean batchMode = false;
+   private final HashMap<String, Remote> controlInterfaces = new HashMap<>();
+   private final IEnvironmentFactory factory;
+   private IServiceConnector connector;
+   private final IRuntimeLibraryManager runtimeManager;
+
+   @Deprecated
+   private final HashMap<Class<?>, Object> associatedObjects;
+   @Deprecated
+   private final HashMap<Class<?>, ArrayList<IAssociatedObjectListener>> associatedObjectListeners;
+   @Deprecated
+   private boolean isEnvSetup = false;
+   @Deprecated
+   private final List<IScriptCompleteEvent> scriptCompleteListeners = new ArrayList<>();
+   @Deprecated
+   private final List<IScriptSetupEvent> scriptSetupListeners = new ArrayList<>();
+
+//   private OteServerSideEndprointRecieve oteServerSideEndpointRecieve;
+//   private OteServerSideEndpointSender oteServerSideEndpointSender;
+//   private final ServiceTracker messagingServiceTracker;
+
+   private volatile boolean isShutdown = false;
+//   private NodeInfo oteEmbeddedBroker;
+   private ServiceRegistration<TestEnvironmentInterface> myRegistration;
+
+   protected TestEnvironment(IEnvironmentFactory factory) {
+      GCHelper.getGCHelper().addRefWatch(this);
+//      try {
+//         oteEmbeddedBroker = new NodeInfo("OTEEmbeddedBroker", new URI("vm://localhost?broker.persistent=false"));
+//      } catch (URISyntaxException ex) {
+//         OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
+//      }
+      this.factory = factory;
+      this.testStation = factory.getTestStation();
+      this.runtimeManager = factory.getRuntimeManager();
+
+      this.associatedObjectListeners = new HashMap<>();
+      this.associatedObjects = new HashMap<>(100);
+      this.batchMode = OteProperties.isOseeOteInBatchModeEnabled();
+
+//      messagingServiceTracker = setupOteMessagingSenderAndReceiver();
+   }
+
+   public void init(IServiceConnector connector) {
+      this.connector = connector;
+   }
+
+   private void setupDefaultConnector() {
+      EnhancedProperties props = new EnhancedProperties();
+      try {
+         props.setProperty("station", InetAddress.getLocalHost().getHostName());
+      } catch (UnknownHostException ex) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
+      }
+      props.setProperty("date", new Date());
+      props.setProperty("group", "OSEE Test Environment");
+      props.setProperty("owner", OtePropertiesCore.userName.getValue());
+      connector = new LocalConnector(this, Integer.toString(this.getUniqueId()), props);
+   }
+
+//   private ServiceTracker setupOteMessagingSenderAndReceiver() {
+//      oteServerSideEndpointRecieve = new OteServerSideEndprointRecieve();
+//      oteServerSideEndpointSender = new OteServerSideEndpointSender(this);
+//      BundleContext context = Platform.getBundle("org.eclipse.osee.ote.core").getBundleContext();
+//      return getServiceTracker(MessagingGateway.class.getName(), new OteEnvironmentTrackerCustomizer(context,
+//            oteServerSideEndpointRecieve, oteServerSideEndpointSender,
+//            OteServerSideEndpointSender.OTE_SERVER_SIDE_SEND_PROTOCOL));
+//   }
+//
+//   public void sendMessageToServer(Message message) {
+//      oteServerSideEndpointRecieve.recievedMessage(message);
+//   }
+
+   public ServiceTracker getServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+      return Activator.getInstance().getServiceTracker(clazz, customizer);
+   }
+
+   @Override
+   public ServiceTracker getServiceTracker(String clazz) {
+      return getServiceTracker(clazz, null);
+   }
+
+   @Override
+   public ICommandHandle addCommand(ITestServerCommand cmd) throws ExportException {
+      return factory.getCommandManager().addCommand(cmd, this);
+   }
+
+   @Override
+   public IRunManager getRunManager() {
+      return factory.getRunManager();
+   }
+
+   @Override
+   public IRuntimeLibraryManager getRuntimeManager() {
+      return this.runtimeManager;
+   }
+
+   @Override
+   public IEnvironmentFactory getEnvironmentFactory() {
+      return factory;
+   }
+
+   @Override
+   public boolean isInBatchMode() {
+      return batchMode;
+   }
+
+   @Override
+   public void setBatchMode(boolean isInBatchMode) {
+      if (!OteProperties.isOseeOteInBatchModeEnabled()) {
+         this.batchMode = isInBatchMode;
+      }
+   }
+
+   @Override
+   public void addEnvironmentListener(ITestEnvironmentListener listener) {
+      envListeners.add(listener);
+   }
+
+   @Override
+   public boolean addTask(EnvironmentTask task) {
+      factory.getTimerControl().addTask(task, this);
+      return true;
+   }
+
+   public boolean equals(ITestEnvironment testEnvironment) throws RemoteException {
+      if (testEnvironment.getUniqueId() == getUniqueId()) {
+         return true;
+      } else {
+         return false;
+      }
+   }
+
+   @Override
+   public long getEnvTime() {
+      return getTimerCtrl().getEnvTime();
+   }
+
+   @Override
+   public IExecutionUnitManagement getExecutionUnitManagement() {
+      return this.executionUnitManagement;
+   }
+
+   @Override
+   public ITestLogger getLogger() {
+      return factory.getTestLogger();
+   }
+
+   @Override
+   public List<String> getQueueLabels() {
+      List<String> list = new ArrayList<>();
+      list.add("Description");
+      return list;
+   }
+
+   @Override
+   public abstract Object getModel(String modelClassName);
+
+   @Override
+   public IScriptControl getScriptCtrl() {
+      return factory.getScriptControl();
+   }
+
+   @Override
+   public byte[] getScriptOutfile(String filepath) throws RemoteException {
+      try {
+         File file = new File(filepath);
+         InputStream is = new FileInputStream(file);
+         long length = file.length();
+         byte[] bytes = new byte[(int) length];
+
+         int numRead = is.read(bytes);
+         if (numRead < bytes.length) {
+            throw new IOException("Could not completely read file " + file.getName());
+         }
+         is.close();
+         OseeLog.log(TestEnvironment.class, Level.FINE, "going to send " + bytes.length + " bytes to the client");
+
+         return bytes;
+      } catch (Exception ex) {
+         throw new RemoteException("Error retrieving the script output", ex);
+      }
+   }
+
+   @Override
+   public ITestStation getTestStation() {
+      return testStation;
+   }
+
+   @Override
+   public ITimerControl getTimerCtrl() {
+      return factory.getTimerControl();
+   }
+
+   @Override
+   public int getUniqueId() {
+      return this.hashCode();
+   }
+
+   private final void removeAllTasks() {
+      factory.getTimerControl().cancelAllTasks();
+   }
+
+   @Override
+   public URL setBatchLibJar(byte[] batchJar) throws IOException {
+      String path = OtePropertiesCore.userHome.getValue() + File.separator + TestEnvironment.class.getName();
+
+      File dir = new File(path, "batchLibCache");
+      if (!dir.isDirectory()) {
+         dir.mkdir();
+      }
+      File jar = File.createTempFile("Batch", ".jar", dir);
+      Lib.writeBytesToFile(batchJar, jar);
+      return jar.toURI().toURL();
+   }
+
+   @Override
+   public ICancelTimer setTimerFor(ITimeout listener, int time) {
+      return getTimerCtrl().setTimerFor(listener, time);
+   }
+
+   @Override
+   public void setupOutfileDir(String outfileDir) throws IOException {
+      if (Strings.isValid(outfileDir)) {
+         outDir = new File(outfileDir);
+         if (!outDir.isDirectory()) {
+            if (!outDir.mkdirs()) {
+               throw new IOException("Failed to create the output directory");
+            }
+            OseeLog.logf(TestEnvironment.class, Level.INFO,
+                  "Outfile Dir [%s] created.", outDir.getAbsolutePath());
+         } else {
+            OseeLog.logf(TestEnvironment.class, Level.FINE,
+                  "Outfile Dir [%s] exists.", outDir.getAbsolutePath());
+         }
+      } else {
+         throw new IOException("A valid outfile directory must be specified.");
+      }
+   }
+
+   @Override
+   public void shutdown() {
+      if (isShutdown) {
+         return;
+      }
+      isShutdown = true;
+      runtimeManager.uninstall(new OseeLogStatusCallback());
+      Activator.getInstance().unregisterTestEnvironment();
+      // here we remove all environment tasks (emulators)
+      removeAllTasks();
+      if (associatedObjects != null) {
+         this.associatedObjects.clear();// get rid of all models and support
+      }
+
+//      messagingServiceTracker.close();
+
+      OseeLog.log(TestEnvironment.class, Level.FINE, "shutting down environment");
+      factory.getTimerControl().cancelTimers();
+      stop();
+      cleanupClassReferences();
+      OseeTestThread.clearThreadReferences();
+      for (ITestEnvironmentListener listener : envListeners) {
+         try {
+            listener.onEnvironmentKilled(this);
+         } catch (Exception e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, "exception during listener notification", e);
+         }
+      }
+      envListeners.clear();
+      if (getRunManager() != null) {
+         getRunManager().clearAllListeners();
+      }
+   }
+
+   protected abstract void loadExternalDrivers();
+
+   public void startup(String outfileDir) throws Exception {
+      try {
+         setupOutfileDir(outfileDir);
+      } catch (IOException ex) {
+         throw new Exception("Error in directory setup. " + outfileDir, ex);
+      }
+      if(myRegistration != null){
+         myRegistration.unregister();
+      }
+      myRegistration = FrameworkUtil.getBundle(getClass()).getBundleContext().registerService(TestEnvironmentInterface.class, this, null);
+   }
+
+   protected void stop() {
+      try{
+         myRegistration.unregister();
+      } catch (IllegalStateException ex){
+         //ignore if it's already unregistered
+      }
+   }
+
+   protected void cleanupClassReferences() {
+      OseeLog.log(TestEnvironment.class, Level.FINE, "cleanupreferences");
+
+      System.out.println("Associated objects that are getting cleaned up.");
+      for (Class<?> clazz : associatedObjects.keySet()) {
+         System.out.println(clazz.toString());
+      }
+
+      if (associatedObjects != null) {
+         associatedObjects.clear();
+      }
+      OseeLog.log(TestEnvironment.class, Level.FINE, "got the other PM REF");
+      if (associatedObjectListeners != null) {
+         associatedObjectListeners.clear();
+      }
+      GCHelper.getGCHelper().printLiveReferences();
+   }
+
+   public void setExecutionUnitManagement(IExecutionUnitManagement executionUnitManagement) {
+      this.executionUnitManagement = executionUnitManagement;
+   }
+
+   @Override
+   public File getOutDir() {
+      return outDir;
+   }
+
+   @Override
+   public Remote getControlInterface(String id) {
+      return controlInterfaces.get(id);
+   }
+
+   @Override
+   public void registerControlInterface(String id, Remote controlInterface) {
+      controlInterfaces.put(id, controlInterface);
+   }
+
+   @Override
+   public IServiceConnector getConnector() {
+      return connector;
+   }
+
+   @Deprecated
+   public void setEnvSetup(boolean isEnvSetup) {
+      this.isEnvSetup = isEnvSetup;
+   }
+
+   @Deprecated
+   public void addScriptCompleteListener(IScriptCompleteEvent scriptComplete) {
+      this.scriptCompleteListeners.add(scriptComplete);
+   }
+
+   @Deprecated
+   public void removeScriptCompleteListener(IScriptCompleteEvent scriptComplete) {
+      this.scriptCompleteListeners.remove(scriptComplete);
+   }
+
+   @Deprecated
+   public void addScriptSetupListener(IScriptSetupEvent scriptSetup) {
+      this.scriptSetupListeners.add(scriptSetup);
+   }
+
+   @Deprecated
+   public void removeScriptSetupListener(IScriptSetupEvent scriptSetup) {
+      this.scriptSetupListeners.remove(scriptSetup);
+   }
+
+   @Deprecated
+   protected boolean isEnvSetup() {
+      return isEnvSetup;
+   }
+
+   @Deprecated
+   /**
+    * alerts the environment of an exception. The environment will take any necessary actions and alert any interested
+    * entities of the problem. Any runing test script will be terminated
+    * 
+    */
+   public void handleException(Throwable t, Level logLevel) {
+      handleException(t, "An exception has occurred in the environment", logLevel, true);
+   }
+
+   @Deprecated
+   /**
+    * @param abortScript true will cause the currently running script to abort
+    */
+   public void handleException(Throwable t, Level logLevel, boolean abortScript) {
+      handleException(t, "An exception has occurred in the environment", logLevel, abortScript);
+   }
+
+   @Deprecated
+   /**
+    * alerts the environment of an exception. The environment will take any necessary actions and alert any interested
+    * entities of the problem
+    * 
+    * @param t the exception
+    * @param logLevel the severity of the exception. Specifing a Level.OFF will
+    * @param abortScript cause the exception to not be logged
+    */
+   public void handleException(Throwable t, String message, Level logLevel, boolean abortScript) {
+      if (logLevel != Level.OFF) {
+         OseeLog.log(TestEnvironment.class, logLevel, message, t);
+      }
+      if (getTestScript() != null && abortScript) {
+         getTestScript().abortDueToThrowable(t);
+      }
+      Iterator<ITestEnvironmentListener> iter = envListeners.iterator();
+      while (iter.hasNext()) {
+         final ITestEnvironmentListener listener = iter.next();
+         listener.onException(message, t);
+      }
+   }
+
+   @Deprecated
+   public void testEnvironmentCommandComplete(ICommandHandle handle) {
+      for (ITestEnvironmentListener listener : envListeners) {
+         try {
+            listener.onTestServerCommandFinished(this, handle);
+         } catch (Throwable th) {
+            System.out.println(listener.getClass().getName());
+            th.printStackTrace();
+         }
+      }
+   }
+
+   @Override
+   @Deprecated
+   /**
+    * marks the script as ready as well as clears any objects that are associated with the environment.
+    */
+   public synchronized void onScriptSetup() {
+
+      for (IScriptSetupEvent listeners : scriptSetupListeners) {
+         listeners.scriptSetup();
+      }
+
+      this.associatedObjects.clear();
+   }
+
+   @Deprecated
+   public void removeQueueListener(ReportDataListener listener) throws RemoteException {
+      factory.getReportDataControl().removeQueueListener(listener);
+   }
+
+   @Override
+   @Deprecated
+   public void onScriptComplete() throws InterruptedException {
+      factory.getScriptControl().setScriptReady(false);
+
+      for (int i = 0; i < scriptCompleteListeners.size(); i++) {
+         try {
+            scriptCompleteListeners.get(i).scriptComplete();
+         } catch (Exception e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, "problem with script complete listener", e);
+         }
+      }
+
+      // here we remove all environment tasks (emulators)
+      if (associatedObjects != null) {
+         this.associatedObjects.clear();// get rid of all models and support
+      }
+   }
+
+   @Override
+   @Deprecated
+   public void associateObject(Class<?> c, Object obj) {
+      associatedObjects.put(c, obj);
+      ArrayList<IAssociatedObjectListener> listeners = this.associatedObjectListeners.get(c);
+      if (listeners != null) {
+         for (int i = 0; i < listeners.size(); i++) {
+            try {
+               listeners.get(i).updateAssociatedListener();
+            } catch (RemoteException e) {
+               OseeLog.log(TestEnvironment.class, Level.SEVERE, e.getMessage(), e);
+            }
+
+         }
+      }
+   }
+
+   @Override
+   @Deprecated
+   public Object getAssociatedObject(Class<?> c) {
+      return associatedObjects.get(c);
+   }
+
+   @Override
+   @Deprecated
+   public Set<Class<?>> getAssociatedObjects() {
+      return associatedObjects.keySet();
+   }
+
+   @Override
+   @Deprecated
+   /**
+    * Use getRunManager().getCurrentScript() instead of this method.
+    */
+   public TestScript getTestScript() {
+      return getRunManager().getCurrentScript();
+   }
+
+   @Override
+   @Deprecated
+   public void abortTestScript() {
+      getRunManager().abort();
+   }
+
+   @Override
+   @Deprecated
+   public void abortTestScript(Throwable t) {
+      getRunManager().abort(t, false);
+   }
+
+//   public void setOteNodeInfo(NodeInfo oteEmbeddedBroker) {
+//      this.oteEmbeddedBroker = oteEmbeddedBroker;
+//   }
+//
+//   public NodeInfo getOteNodeInfo() {
+//      return oteEmbeddedBroker;
+//   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentConfig.java
new file mode 100644
index 0000000..bc40c53
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentConfig.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.core.environment;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public class TestEnvironmentConfig implements Serializable {
+   private static final long serialVersionUID = -382800417464413074L;
+   private Map<String, String> envVars;
+   private String CLEARCASE_VIEW;
+   private String[] jarVersions;
+
+   public TestEnvironmentConfig(String[] jarVersions) {
+      this.jarVersions = jarVersions;
+   }
+
+   public TestEnvironmentConfig(Map<String, String> envVars, String CLEARCASE_VIEW) {
+      this.CLEARCASE_VIEW = CLEARCASE_VIEW;
+      this.envVars = envVars;
+   }
+
+   public Map<String, String> getLibrarySearchPath() {
+      return envVars;
+   }
+
+   public String getClearCaseView() {
+      return CLEARCASE_VIEW;
+   }
+
+   /**
+    * @return the jarVersions
+    */
+   public String[] getJarVersions() {
+      return jarVersions;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.java
new file mode 100644
index 0000000..36897fb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.List;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IEnvironmentFactory;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface TestEnvironmentInterface {
+   public ServiceTracker getServiceTracker(String clazz);
+
+   public ICommandHandle addCommand(ITestServerCommand cmd) throws ExportException;
+
+   public IRunManager getRunManager();
+
+   public IRuntimeLibraryManager getRuntimeManager();
+
+   public boolean isInBatchMode();
+
+   public void setBatchMode(boolean isInBatchMode);
+
+   public void addEnvironmentListener(ITestEnvironmentListener listener);
+
+   public boolean addTask(EnvironmentTask task);
+
+   public long getEnvTime();
+
+   public IExecutionUnitManagement getExecutionUnitManagement();
+
+   public ITestLogger getLogger();
+
+   public List<String> getQueueLabels();
+
+   public abstract Object getModel(String modelClassName);
+
+   public IScriptControl getScriptCtrl();
+
+   public byte[] getScriptOutfile(String filepath) throws RemoteException;
+
+   public ITestStation getTestStation();
+
+   public ITimerControl getTimerCtrl();
+
+   public int getUniqueId();
+
+   public URL setBatchLibJar(byte[] batchJar) throws IOException;
+
+   public ICancelTimer setTimerFor(ITimeout listener, int time);
+
+   public void shutdown();
+
+   public File getOutDir();
+
+   public Remote getControlInterface(String id);
+
+   public void registerControlInterface(String id, Remote controlInterface);
+
+   public IServiceConnector getConnector();
+
+   public IEnvironmentFactory getEnvironmentFactory();
+
+   void setupOutfileDir(String outfileDir) throws IOException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java
new file mode 100644
index 0000000..2473861
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.core.environment;
+
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+
+import org.eclipse.osee.framework.logging.ILoggerFilter;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class TestEnvironmentLogFilter implements ILoggerFilter {
+   private static Level level;
+   static {
+      level = Level.parse(System.getProperty("ote.testenv.filter.level", "INFO"));
+   }
+
+   @Override
+   public Pattern bundleId() {
+      return null;
+   }
+
+   @Override
+   public Level getLoggerLevel() {
+      return level;
+   }
+
+   @Override
+   public Pattern name() {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.java
new file mode 100644
index 0000000..e68c6f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.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.core.environment;
+
+import javax.print.attribute.EnumSyntax;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class TestServerMode extends EnumBase {
+   private static final long serialVersionUID = 6600576749632500352L;
+   public static final TestServerMode MULTI = new TestServerMode(0);
+   public static final TestServerMode SINGLE = new TestServerMode(1);
+   private static final String[] stringTable = new String[] {"multi", "single"};
+   private static final TestServerMode[] enumValueTable = new TestServerMode[] {MULTI, SINGLE};
+
+   private TestServerMode(int value) {
+      super(value);
+   }
+
+   public static TestServerMode toEnum(String str) {
+      return (TestServerMode) getEnum(str, stringTable, enumValueTable);
+   }
+
+   protected static TestServerMode toEnum(int value) {
+      return (TestServerMode) getEnum(value, enumValueTable);
+   }
+
+   @Override
+   protected String[] getStringTable() {
+      return stringTable;
+   }
+
+   @Override
+   protected EnumSyntax[] getEnumValueTable() {
+      return enumValueTable;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.java
new file mode 100644
index 0000000..7d76924
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.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.core.environment;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.BasicTimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+
+public abstract class TimerControl implements ITimerControl {
+
+   private final ScheduledExecutorService executor;
+   private IRunManager runManager;
+
+
+   public TimerControl(int maxTimers) {
+      executor = Executors.newScheduledThreadPool(maxTimers);
+   }
+
+   @Override
+   public void cancelTimers() {
+      executor.shutdown();
+   }
+
+   public ScheduledFuture<?> schedulePeriodicTask(Runnable task, long initialDelay, long period) {
+      return executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.MILLISECONDS);
+   }
+
+   public ScheduledFuture<?> scheduleOneShotTask(Runnable task, long delay) {
+      return executor.schedule(task, delay, TimeUnit.MILLISECONDS);
+   }
+
+   @Override
+   public void envWait(int milliseconds) throws InterruptedException {
+      envWait(new BasicTimeout(), milliseconds);
+   }
+
+   @Override
+   public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+      synchronized (obj) {
+         setTimerFor(obj, milliseconds);
+         obj.wait();
+      }
+   }
+
+   @Override
+   public void setRunManager(IRunManager runManager) {
+      this.runManager = runManager;
+   }
+
+   @Override
+   public IRunManager getRunManager() {
+      return runManager;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java
new file mode 100644
index 0000000..89900f7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.core.environment.command;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class CommandDescription implements Serializable {
+   private static final long serialVersionUID = 538355585678229304L;
+   protected final String guid;
+   protected final String description;
+
+   /**
+    * CommandDescription Constructor. Sets the command's description.
+    */
+   public CommandDescription(String description) {
+      super();
+      this.guid = GUID.create();
+      this.description = description;
+   }
+
+   /**
+    * @return Returns the description.
+    */
+   public String getDescription() {
+      return description;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+
+      if (obj instanceof GUID) {
+         return guid.equals(obj);
+      } else if (obj instanceof CommandDescription) {
+         return guid.equals(((CommandDescription) obj).guid);
+      }
+
+      return false;
+   }
+
+   /**
+    * @return Returns the guid.
+    */
+   public String getGuid() {
+      return guid;
+   }
+
+   @Override
+   public String toString() {
+      return "GUID: " + guid + "\n" + "Desc: " + description;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.java
new file mode 100644
index 0000000..50eb0bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.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.core.environment.command;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.config.ScriptVersionConfig;
+import org.eclipse.osee.ote.core.environment.config.TesterConfig;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RunTestScriptDescription extends CommandDescription {
+
+   private static final long serialVersionUID = 8824248434175577382L;
+   private String clientOutfilePath;
+   private String serverOutfilePath;
+   private ScriptVersionConfig scriptVersion;
+   private final TesterConfig testerConfig;
+   private Level logLevel;
+
+   public RunTestScriptDescription(String description, String clientOutfilePath, ScriptVersionConfig scriptVersion, Level logLevel) {
+      super(description);
+      this.clientOutfilePath = clientOutfilePath;
+      this.scriptVersion = scriptVersion;
+      this.testerConfig = new TesterConfig();
+      this.logLevel = logLevel;
+      if (this.logLevel == null) {
+         this.logLevel = Level.ALL;
+      }
+      /*
+       * if(user != null){ testerConfig.setEmail(user.getEmail()); testerConfig.setName(user.getName());
+       * testerConfig.setId(user.getId()); }
+       */
+   }
+
+   public RunTestScriptDescription(String description, String clientOutfilePath, ScriptVersionConfig scriptVersion) {
+      this(description, clientOutfilePath, scriptVersion, Level.WARNING);
+   }
+
+   /**
+    * @return Returns the outfile.
+    */
+   public String getClientOutfilePath() {
+      return clientOutfilePath;
+   }
+
+   /**
+    * @return Returns the serverOutfilePath.
+    */
+   public String getServerOutfilePath() {
+      return serverOutfilePath;
+   }
+
+   /**
+    * @param serverOutfilePath The serverOutfilePath to set.
+    */
+   public void setServerOutfilePath(String serverOutfilePath) {
+      this.serverOutfilePath = serverOutfilePath;
+   }
+
+   /**
+    * @param clientOutfilePath The clientOutfilePath to set.
+    */
+   public void setClientOutfilePath(String clientOutfilePath) {
+      this.clientOutfilePath = clientOutfilePath;
+   }
+
+   public void setScriptVersion(ScriptVersionConfig scriptVersion) {
+      this.scriptVersion = scriptVersion;
+   }
+
+   public ScriptVersionConfig getScriptVersion() {
+      return this.scriptVersion;
+   }
+
+   public TesterConfig getTesterConfig() {
+      return this.testerConfig;
+   }
+
+   /**
+    * @return Returns the logLevel.
+    */
+   public Level getLogLevel() {
+      return logLevel;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java
new file mode 100644
index 0000000..5fcef4e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.core.environment.command;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IServiceCommand;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class TestEnvironmentCommand implements Serializable, IServiceCommand {
+   private static final long serialVersionUID = -921447917279635626L;
+   private final UUID key;
+   private final CommandDescription commandDescription;
+
+   public TestEnvironmentCommand(UUID key, CommandDescription commandDescription) {
+      this.key = key;
+      this.commandDescription = commandDescription;
+   }
+
+   public UUID getUserKey() {
+      return key;
+   }
+
+   public void executeBase(TestEnvironment environment) {
+      execute(environment);
+   }
+
+   @Override
+   public abstract void execute(TestEnvironment environment) throws TestException;
+
+   public CommandDescription getDescription() {
+      return commandDescription;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java
new file mode 100644
index 0000000..0ab46f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * 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.core.environment.config;
+
+import java.io.Serializable;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ScriptVersionConfig implements Xmlizable, XmlizableStream, Serializable {
+
+   private static final long serialVersionUID = -4021198751318075600L;
+   private String repositoryType;
+   private String location;
+   private String lastChangedRevision;
+   private String lastAuthor;
+   private String lastModificationDate;
+   private String modifiedFlag;
+
+   public ScriptVersionConfig() {
+      repositoryType = "UNKNOWN";
+      location = "-";
+      lastChangedRevision = "-";
+      lastAuthor = "-";
+      lastModificationDate = "-";
+      modifiedFlag = "-";
+   }
+
+   public ScriptVersionConfig(String repositoryType, String location, String lastChangedRevision, String lastAuthor, String lastModificationDate, String modifiedFlag) {
+      this.repositoryType = repositoryType;
+      this.location = location;
+      this.lastChangedRevision = lastChangedRevision;
+      this.lastAuthor = lastAuthor;
+      this.lastModificationDate = lastModificationDate;
+      this.modifiedFlag = modifiedFlag;
+   }
+
+   /**
+    * @return the location
+    */
+   @JsonProperty
+   public String getLocation() {
+      return location;
+   }
+
+   /**
+    * @param location the location to set
+    */
+   public void setLocation(String location) {
+      this.location = location;
+   }
+
+   /**
+    * @return the repositoryType
+    */
+   @JsonProperty
+   public String getRepositoryType() {
+      return repositoryType;
+   }
+
+   /**
+    * @param repositoryType the repositoryType to set
+    */
+   public void setRepositoryType(String repositoryType) {
+      this.repositoryType = repositoryType;
+   }
+
+   /**
+    * @return the revision
+    */
+   @JsonProperty
+   public String getLastChangedRevision() {
+      return lastChangedRevision;
+   }
+
+   /**
+    * @param lastChangedRevision the revision to set
+    */
+   public void setLastChangedRevision(String lastChangedRevision) {
+      this.lastChangedRevision = lastChangedRevision;
+   }
+
+   /**
+    * @return the lastAuthor
+    */
+   @JsonProperty
+   public String getLastAuthor() {
+      return lastAuthor;
+   }
+
+   /**
+    * @param lastAuthor the lastAuthor to set
+    */
+   public void setLastAuthor(String lastAuthor) {
+      this.lastAuthor = lastAuthor;
+   }
+
+   /**
+    * @return the lastDateModified
+    */
+   @JsonProperty
+   public String getLastModificationDate() {
+      return lastModificationDate;
+   }
+
+   /**
+    * @param lastModified the lastModified to set
+    */
+   public void setLastModificationDate(String lastModificationDate) {
+      this.lastModificationDate = lastModificationDate;
+   }
+
+   /**
+    * @return the modifiedFlag
+    */
+   @JsonProperty
+   public String getModifiedFlag() {
+      return modifiedFlag;
+   }
+
+   /**
+    * @param modifiedFlag the modifiedFlag to set
+    */
+   public void setModifiedFlag(String modifiedFlag) {
+      this.modifiedFlag = modifiedFlag;
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      Element scriptVersion = doc.createElement(BaseTestTags.SCRIPT_VERSION);
+      scriptVersion.setAttribute(BaseTestTags.REVISION_FIELD, getLastChangedRevision());
+      scriptVersion.setAttribute(BaseTestTags.REPOSITORY_TYPE, getRepositoryType());
+      scriptVersion.setAttribute(BaseTestTags.LAST_AUTHOR_FIELD, getLastAuthor());
+      scriptVersion.setAttribute(BaseTestTags.LAST_MODIFIED, getLastModificationDate());
+      scriptVersion.setAttribute(BaseTestTags.MODIFIED_FIELD, getModifiedFlag());
+      scriptVersion.setAttribute(BaseTestTags.URL, getLocation());
+      return scriptVersion;
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement(BaseTestTags.SCRIPT_VERSION);
+      writer.writeAttribute(BaseTestTags.REVISION_FIELD, getLastChangedRevision());
+      writer.writeAttribute(BaseTestTags.REPOSITORY_TYPE, getRepositoryType());
+      writer.writeAttribute(BaseTestTags.LAST_AUTHOR_FIELD, getLastAuthor());
+      writer.writeAttribute(BaseTestTags.LAST_MODIFIED, getLastModificationDate());
+      writer.writeAttribute(BaseTestTags.MODIFIED_FIELD, getModifiedFlag());
+      writer.writeAttribute(BaseTestTags.URL, getLocation());
+      writer.writeEndElement();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java
new file mode 100644
index 0000000..97f9495
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.core.environment.config;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestScriptConfig implements Serializable {
+
+   private static final long serialVersionUID = 6791547338404192517L;
+   private final String outFile;
+   private final String fullScriptName;
+   private final String[] classPathStrs;
+   private final boolean isExe;
+   private final ScriptVersionConfig scriptVersion;
+
+   /**
+    * TestScriptConfig Constructor.
+    * 
+    * @param classPathStrs The classPathStrs to set.
+    * @param fullScriptName The fullScriptName to set.
+    * @param outFile The outFile to set.
+    */
+   public TestScriptConfig(String[] classPathStrs, String fullScriptName, String outFile, ScriptVersionConfig scriptVersion) {
+      this.fullScriptName = fullScriptName;
+      this.outFile = outFile;
+      this.isExe = false;
+      this.scriptVersion = scriptVersion;
+      this.classPathStrs = classPathStrs;
+   }
+
+   public String getOutFile() {
+      return outFile;
+   }
+
+   public String getFullScriptName() {
+      return fullScriptName;
+   }
+
+   public String[] getClassPathStrs() {
+      return classPathStrs;
+   }
+
+   public boolean isExe() {
+      return isExe;
+   }
+
+   public ScriptVersionConfig getScriptVersion() {
+      return this.scriptVersion;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java
new file mode 100644
index 0000000..2104c19
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.core.environment.config;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class TesterConfig implements Xmlizable, Serializable {
+
+   private static final long serialVersionUID = -6513354260245950581L;
+   private String name;
+   private String id;
+   private String email;
+
+   public TesterConfig() {
+      name = "";
+      id = "";
+      email = "";
+   }
+
+   public String getEmail() {
+      return email;
+   }
+
+   public void setEmail(String email) {
+      this.email = email;
+   }
+
+   public String getId() {
+      return id;
+   }
+
+   public void setId(String id) {
+      this.id = id;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public void setName(String name) {
+      this.name = name;
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      Element testerElement = doc.createElement(BaseTestTags.EXECUTED_BY);
+      testerElement.appendChild(Jaxp.createElement(doc, BaseTestTags.NAME_FIELD, name));
+      testerElement.appendChild(Jaxp.createElement(doc, BaseTestTags.BEMS_FIELD, id));
+      testerElement.appendChild(Jaxp.createElement(doc, BaseTestTags.EMAIL_FIELD, email));
+      return testerElement;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java
new file mode 100644
index 0000000..3f3cfb3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.core.environment.console;
+
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+public abstract class ConsoleCommand {
+   private static final Pattern SPLITTER = Pattern.compile("\\s");
+
+   private final String cmdName;
+   private final String description;
+
+   private ConsoleShell shell;
+
+   protected ConsoleCommand(String cmdName, String description) {
+      this.cmdName = cmdName;
+      this.description = description;
+   }
+
+   public String getName() {
+      return cmdName;
+   }
+
+   public String getDescription() {
+      return description;
+   }
+
+   public final synchronized void execute(ConsoleShell shell, String switches, String args) {
+      this.shell = shell;
+      final String[] argArray;
+      if (Strings.isValid(args)) {
+         argArray = SPLITTER.split(args);
+      } else {
+         argArray = new String[0];
+      }
+      final String[] switchesArray;
+      if (Strings.isValid(switches)) {
+         switchesArray = SPLITTER.split(switches);
+      } else {
+         switchesArray = new String[0];
+      }
+      doCmd(shell, switchesArray, argArray);
+   }
+
+   protected abstract void doCmd(ConsoleShell shell, String[] switches, String[] args);
+
+   public void dispose() {
+
+   }
+
+   protected final void print(String msg) {
+      shell.print(msg);
+   }
+
+   protected final void println(String msg) {
+      shell.println(msg);
+   }
+
+   protected final void println() {
+      shell.println();
+   }
+
+   protected final void printStackTrace(Throwable t) {
+      shell.printStackTrace(t);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java
new file mode 100644
index 0000000..3a360c9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.core.environment.console;
+
+import java.util.Collection;
+import java.util.Hashtable;
+
+public class ConsoleCommandManager implements ICommandManager {
+
+   private final Hashtable<String, ConsoleCommand> cmdMap = new Hashtable<>(64);
+
+   private boolean isShutdown = false;
+
+   @Override
+   public void registerCommand(ConsoleCommand cmd) {
+      if (!isShutdown) {
+         cmdMap.put(cmd.getName(), cmd);
+      } else {
+         throw new IllegalStateException("Can't register command: This manager has been shutdown");
+      }
+   }
+
+   @Override
+   public ConsoleCommand unregisterCommand(ConsoleCommand cmd) {
+      if (!isShutdown) {
+         return cmdMap.remove(cmd.getName());
+      } else {
+         throw new IllegalStateException("Can't register command: This manager has been shutdown");
+      }
+   }
+
+   @Override
+   public ConsoleCommand getCommand(String name) {
+      return cmdMap.get(name);
+   }
+
+   @Override
+   public Collection<ConsoleCommand> getCommands() {
+      return cmdMap.values();
+   }
+
+   public void shutdown() {
+      isShutdown = true;
+      for (ConsoleCommand cmd : cmdMap.values()) {
+         cmd.dispose();
+      }
+      cmdMap.clear();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.java
new file mode 100644
index 0000000..1025085
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.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.core.environment.console;
+
+import java.lang.ref.WeakReference;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class ConsoleShell {
+   private static final Pattern CMD_PATTERN = Pattern.compile("^(\\S+)\\s*((-[a-zA-Z]\\S*\\s*)*)\\s*((\\S+(\\s+|$))*)");
+
+   private final WeakReference<ICommandManager> manager;
+   private volatile ConsoleCommand lastCmd;
+   private volatile String lastSwitches;
+   private volatile String lastArgs;
+   private boolean saveLastCmdFlag = true;
+
+   public ConsoleShell(ICommandManager manager) {
+      this.manager = new WeakReference<>(manager);
+   }
+
+   public abstract void println(String string);
+
+   public abstract void print(String string);
+
+   public abstract void println();
+
+   public ICommandManager getCommandManager() {
+      return manager.get();
+   }
+
+   public void runLast() {
+      lastCmd.execute(this, lastSwitches, lastArgs);
+   }
+
+   public final void parseAndExecuteCmd(String line) throws Throwable {
+      final Matcher matcher = CMD_PATTERN.matcher(line);
+      if (matcher.matches()) {
+         String cmdName = matcher.group(1);
+         String switches = matcher.group(2);
+         String args = matcher.group(4);
+         final ConsoleCommand cmd = getCommandManager().getCommand(cmdName);
+         if (cmd != null) {
+            cmd.execute(this, switches, args);
+            if (saveLastCmdFlag) {
+               lastCmd = cmd;
+               lastSwitches = switches;
+               lastArgs = args;
+            } else {
+               // we do not save the last command as instructed but we reset the flag
+               saveLastCmdFlag = true;
+            }
+         } else {
+            println(cmdName + " is not recognized as a command");
+         }
+      } else {
+         println("invalid command format");
+      }
+   }
+
+   /**
+    * Prevents the currently running command from being saved as the last executed command. This is useful for commands
+    * that process the last executed command but do not want themselves to become the last command executed
+    */
+   public void setSaveLastCmdFlag(boolean save) {
+      saveLastCmdFlag = save;
+   }
+
+   public void printStackTrace(Throwable t) {
+      println(t.toString() + ":");
+      StackTraceElement[] elements = t.getStackTrace();
+      for (int i = 0; i < elements.length; i++) {
+         println("   " + elements[i].toString());
+      }
+      t = t.getCause();
+      while (t != null) {
+         println("Caused by: " + t.toString());
+         elements = t.getStackTrace();
+         for (int i = 0; i < elements.length; i++) {
+            println("   " + elements[i].toString());
+         }
+         t = t.getCause();
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.java
new file mode 100644
index 0000000..9662886
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.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.core.environment.console;
+
+import java.util.Collection;
+
+public interface ICommandManager {
+
+   public void registerCommand(ConsoleCommand cmd);
+
+   public ConsoleCommand unregisterCommand(ConsoleCommand cmd);
+
+   public ConsoleCommand getCommand(String name);
+
+   public Collection<ConsoleCommand> getCommands();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.java
new file mode 100644
index 0000000..5a2d81d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.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.core.environment.console.cmd;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.Map;
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class BenchmarkCommand extends ConsoleCommand {
+   private static final String NAME = "b";
+   private static final String DESCRIPTION = "outputs results from the benchmarking utility";
+
+   public BenchmarkCommand() {
+      super(NAME, DESCRIPTION);
+   }
+
+   @Override
+   protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+      if (Benchmark.isBenchmarkingEnabled()) {
+         if (switches.length > 0) {
+            processSwitches(switches, args);
+         }
+         print("Current Benchmarks\n");
+         final StringBuilder buffer = new StringBuilder(4096);
+         final Iterator<Benchmark> iter = Benchmark.getAllBenchamrks().iterator();
+         while (iter.hasNext()) {
+            Benchmark bm = iter.next();
+            float val = bm.getLongestSample() / 1000.0f;
+            buffer.append(bm.getName()).append(": total samples: ").append(bm.getTotalSamples());
+            buffer.append(". Max Time: ").append(val).append("ms. Min: ");
+            val = bm.getShortestSample() / 1000.0f;
+            buffer.append(val).append("ms. Avg: ");
+            val = bm.getAverage() / 1000.0f;
+            buffer.append(val).append("ms. Exceed Count: ").append(bm.getExceedCount()).append(" (threshold=").append(
+               bm.getThreshold() / 1000.0f);
+            val = bm.getAverageExceedAmount() / 1000.0f;
+            buffer.append("ms) avg. exceed time:  ").append(val).append("ms\n");
+            for (Map.Entry<String, Integer> entry : bm.getExceeders()) {
+               buffer.append("\tExceeder ").append(entry.getKey()).append(": counted ").append(entry.getValue()).append(
+                  '\n');
+            }
+         }
+         print(buffer.toString());
+      } else {
+         print("Benchmarks disabled\n");
+      }
+   }
+
+   private void processSwitches(String[] switches, String[] args) {
+      for (String sw : switches) {
+         if (sw.equals("-f")) {
+            try {
+               writeToCSV(args[0]);
+               println("wrote results to file " + args[0]);
+            } catch (Exception e) {
+               printStackTrace(e);
+            }
+         } else if (sw.equals("-r")) {
+            Benchmark.resetAll();
+            println("benchmarks reset");
+         } else {
+            println("unknown switch '" + sw + "'");
+         }
+      }
+   }
+
+   private void writeToCSV(String fileName) throws FileNotFoundException {
+      File file = new File(fileName);
+      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
+      PrintWriter out = new PrintWriter(bos);
+      final Iterator<Benchmark> iter = Benchmark.getAllBenchamrks().iterator();
+      out.println("NAME,TOTAL SAMPLES,MAX TIME,MIN TIME,AVG TIME,EXCEED CNT,THRESHOLD,AVG EXCEED TIME,EXCEEDERS");
+      while (iter.hasNext()) {
+         final Benchmark bm = iter.next();
+         out.format("%s,%d,%f,%f,%f,%d,%f,%f", bm.getName(), bm.getTotalSamples(), bm.getLongestSample() / 1000.0f,
+            bm.getShortestSample() / 1000.0f, bm.getAverage() / 1000.0f, bm.getExceedCount(),
+            bm.getThreshold() / 1000.0f, bm.getAverageExceedAmount() / 1000.0f);
+         for (Map.Entry<String, Integer> entry : bm.getExceeders()) {
+            out.format(",Exceeder %s:%d", entry.getKey(), entry.getValue());
+         }
+         out.println();
+      }
+      out.close();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java
new file mode 100644
index 0000000..ae043a3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * 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.core.environment.console.cmd;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class HostCmd extends ConsoleCommand {
+
+   private static final String NAME = "host";
+   private static final String DESCRIPTION = "displays the local host";
+
+   public HostCmd() {
+      super(NAME, DESCRIPTION);
+   }
+
+   @Override
+   protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+      try {
+         println(InetAddress.getLocalHost().toString());
+      } catch (UnknownHostException e) {
+         println("problems getting local host");
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java
new file mode 100644
index 0000000..4dd4d1e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.console.cmd;
+
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class LastCmd extends ConsoleCommand {
+
+   private static final String NAME = "lc";
+   private static final String DESCRIPTION = "Executes the last command executed";
+
+   public LastCmd() {
+      super(NAME, DESCRIPTION);
+   }
+
+   @Override
+   protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+      shell.runLast();
+      shell.setSaveLastCmdFlag(false);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.java
new file mode 100644
index 0000000..a575962
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.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.core.environment.console.cmd;
+
+import java.util.Map;
+import java.util.Properties;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ListSystemPropertiesCmd extends ConsoleCommand {
+   private static final String NAME = "sys_props";
+   private static final String DESCRIPTION = "list JVM system properties";
+
+   public ListSystemPropertiesCmd() {
+      super(NAME, DESCRIPTION);
+   }
+
+   @Override
+   protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+      Properties props = System.getProperties();
+      if (args.length == 0) {
+         for (Map.Entry<Object, Object> entry : props.entrySet()) {
+            println(entry.getKey() + "=" + entry.getValue());
+         }
+      } else {
+         for (String arg : args) {
+            String val = System.getProperty(arg);
+            if (val != null) {
+               println(arg + "=" + val);
+            } else {
+               println("no property defined for " + arg);
+            }
+         }
+      }
+
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java
new file mode 100644
index 0000000..4dc4173
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.environment.console.cmd;
+
+import java.text.NumberFormat;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MemoryUsageCommand extends ConsoleCommand {
+   private static final String NAME = "mem";
+   private static final String DESCRIPTION = "outputs the system memory used by this JVM";
+
+   public MemoryUsageCommand() {
+      super(NAME, DESCRIPTION);
+   }
+
+   @Override
+   public void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+
+      print("JVM Heap space allocated: " + NumberFormat.getInstance().format(Runtime.getRuntime().totalMemory()) + "\n");
+      print("JVM Heap space used:" + NumberFormat.getInstance().format(
+         Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + "\n");
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java
new file mode 100644
index 0000000..53169be
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+public class BasicTimeout implements ITimeout {
+
+   private volatile boolean timeout;
+
+   @Override
+   public boolean isTimedOut() {
+      return timeout;
+   }
+
+   @Override
+   public void setTimeout(boolean timeout) {
+      this.timeout = timeout;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IAssociatedObjectListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IAssociatedObjectListener.java
new file mode 100644
index 0000000..de0f3cf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IAssociatedObjectListener.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.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IAssociatedObjectListener extends Remote {
+   void updateAssociatedListener() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ICancelTimer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ICancelTimer.java
new file mode 100644
index 0000000..9a85de1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ICancelTimer.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface ICancelTimer {
+   public void cancelTimer();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.java
new file mode 100644
index 0000000..d5c5451
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.framework.ICommandContextFactory;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.framework.command.ICommandManager;
+
+public interface IEnvironmentFactory {
+
+   ITimerControl getTimerControl();
+
+   IScriptControl getScriptControl();
+
+   IReportData getReportDataControl();
+
+   ITestLogger getTestLogger();
+
+   ICommandManager getCommandManager();
+
+   IRunManager getRunManager();
+
+   ICommandContextFactory getCommandContextFactory();
+
+   IRuntimeLibraryManager getRuntimeManager();
+
+   ITestStation getTestStation();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IExecutionUnitManagement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IExecutionUnitManagement.java
new file mode 100644
index 0000000..4cce3f4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IExecutionUnitManagement.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.TestException;
+
+/**
+ * This interface provides the basic abilities that must be able to be performed on any ExecutionUnit being run by the
+ * system. All classes which provide control over an ExecutionUnit should implement at least this interface so the
+ * environments can make use of them.
+ * 
+ * @author Robert A. Fisher
+ */
+public interface IExecutionUnitManagement {
+   public void startExecutionUnit() throws Exception;
+
+   public void setupExecutionUnit(Object execUnitConfig) throws Exception;
+
+   public void runPrimaryOneCycle() throws InterruptedException, TestException;
+
+   public void stopExecutionUnit() throws InterruptedException;
+
+   public void init() throws Exception;
+
+   public void dispose();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.java
new file mode 100644
index 0000000..9faa3bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.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.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.UUID;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IHostTestEnvironment extends Remote {
+   EnhancedProperties getProperties() throws RemoteException;
+   
+   ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID id, TestEnvironmentConfig config) throws RemoteException;
+   void disconnect(UUID sessionId) throws RemoteException;
+   
+//   public NodeInfo getBroker() throws RemoteException;
+   
+   public String getHttpURL() throws RemoteException;
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeDefinition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeDefinition.java
new file mode 100644
index 0000000..a10acd5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeDefinition.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.core.environment.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOTypeDefinition {
+   String getName();
+
+   String getDescription();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.java
new file mode 100644
index 0000000..ca426ed
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.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.core.environment.interfaces;
+
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOTypeHandlerDefinition {
+   String getName();
+
+   String getDescription();
+
+   List<IOTypeDefinition> getIOTypesHandled();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java
new file mode 100644
index 0000000..9dce77a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import java.io.File;
+
+public interface IOutfileResults {
+   public File genOutfileResults(ITestEnvironmentServiceConfig serverConfig);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRemoteCommandConsole.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRemoteCommandConsole.java
new file mode 100644
index 0000000..a8c90b4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRemoteCommandConsole.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.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IRemoteCommandConsole extends Remote {
+   public String doCommand(String cmd) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.java
new file mode 100644
index 0000000..f3a96ab
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.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.core.environment.interfaces;
+
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+
+public interface IReportData {
+   // void addQueueListener(ReportDataListener listener, List<TestEnvironmentCommand> cmds);
+   void addQueueListener(ReportDataListener listener, List cmds);
+
+   void removeQueueListener(ReportDataListener listener);
+
+   // void updateQueueListeners(List<TestEnvironmentCommand> cmds);
+   void updateQueueListeners(List cmds);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.java
new file mode 100644
index 0000000..9d0db55
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.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.core.environment.interfaces;
+
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+
+/**
+ * An interface for loading and installing bundles in the running test environment.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface IRuntimeLibraryManager extends XmlizableStream {
+   
+   ClassLoader getClassLoader();
+
+   Class<?> loadFromScriptClassLoader(String path) throws ClassNotFoundException;
+
+   Class<?> loadFromRuntimeLibraryLoader(String path) throws ClassNotFoundException;
+
+   boolean installed();
+
+   boolean uninstall(OTEStatusCallback<ConfigurationStatus> callable);
+
+   boolean install(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable);
+
+   boolean start(OTEStatusCallback<ConfigurationStatus> callable);
+
+   void clearJarCache();
+
+   boolean acquireBundles(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable);
+
+   void resetScriptLoader(Configuration configuration, String[] strings) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptCompleteListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptCompleteListener.java
new file mode 100644
index 0000000..729049d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptCompleteListener.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.core.environment.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IScriptCompleteListener {
+
+   void onScriptComplete();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.java
new file mode 100644
index 0000000..4758e2f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.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.core.environment.interfaces;
+
+public interface IScriptControl {
+
+   boolean isExecutionUnitPaused();
+
+   boolean isScriptPaused();
+
+   boolean isScriptReady();
+
+   boolean isLocked();
+
+   void lock();
+
+   void setExecutionUnitPause(boolean pause);
+
+   void setScriptPause(boolean pause);
+
+   void setScriptReady(boolean ready);
+
+   boolean shouldStep();
+
+   void unlock();
+
+   boolean hasLock();
+
+   boolean isHeldByCurrentThread();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptInitializer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptInitializer.java
new file mode 100644
index 0000000..ddc27e0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptInitializer.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.core.environment.interfaces;
+
+/**
+ * @author Andy Jury
+ * @author Charles Shaw
+ */
+public interface IScriptInitializer {
+
+   public void doScriptInitialProcessing() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.java
new file mode 100644
index 0000000..bf32ff2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface IServiceCommand {
+
+   public abstract void execute(TestEnvironment environment);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.java
new file mode 100644
index 0000000..b20870a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.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.ote.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.core.model.IModelManagerRemote;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironment extends Remote {
+
+   Remote getControlInterface(String controlInterfaceID) throws RemoteException;
+
+   IRemoteCommandConsole getCommandConsole() throws RemoteException;
+   public void closeCommandConsole(IRemoteCommandConsole console) throws RemoteException;
+
+   public IModelManagerRemote getModelManager() throws RemoteException;
+
+   byte[] getScriptOutfile(String outfilePath) throws RemoteException;
+
+   int getUniqueId() throws RemoteException;
+
+   public void setBatchMode(boolean isBatched) throws RemoteException;
+
+//   public void sendMessage(Message message) throws RemoteException;
+   
+   void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+   void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentAccessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentAccessor.java
new file mode 100644
index 0000000..6137329
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentAccessor.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import java.util.Set;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentAccessor {
+   void abortTestScript();
+
+   void abortTestScript(Throwable t);
+
+   boolean addTask(EnvironmentTask task);
+
+   void associateObject(Class<?> c, Object obj);
+
+   Object getAssociatedObject(Class<?> c);
+
+   Set<Class<?>> getAssociatedObjects();
+
+   TestScript getTestScript();
+
+   long getEnvTime();
+
+   IExecutionUnitManagement getExecutionUnitManagement();
+
+   ITestLogger getLogger();
+
+   IScriptControl getScriptCtrl();
+
+   ITestStation getTestStation();
+
+   ITimerControl getTimerCtrl();
+
+   void onScriptComplete() throws InterruptedException;
+
+   void onScriptSetup();
+
+   ICancelTimer setTimerFor(ITimeout listener, int time);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.java
new file mode 100644
index 0000000..5753213
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.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.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+
+public interface ITestEnvironmentListener {
+   void onEnvironmentKilled(TestEnvironment env);
+
+   void onCommandAdded(TestEnvironment env, TestEnvironmentCommand cmd);
+
+   void onCommandBegan(TestEnvironment env, CommandDescription cmdDesc);
+
+   void onCommandFinished(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+   void onTestServerCommandFinished(TestEnvironment env, ICommandHandle handle);
+
+   void onCommandRemoved(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+   void onException(String message, Throwable t);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java
new file mode 100644
index 0000000..60bff94
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import java.lang.reflect.Constructor;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ITestEnvironmentServiceConfig {
+   /**
+    * gets the maximum number of environments allowed in this service
+    */
+   public int getMaxEnvironments();
+
+   public int getMaxUsersPerEnvironment();
+
+   public String getName();
+
+   public String getServerTitle();
+
+   public String getOutfileLocation();
+
+   /**
+    * gets the Constructor for the creating new environments
+    */
+   public Constructor<? extends TestEnvironment> getEnvironmentConstructor();
+
+   /**
+    * gets the parameter instances need to calling the constructor when new environments are created
+    */
+   public Object[] getConstructorParameters();
+
+   /**
+    * tells whether the environment should stay running when the last user disconnects
+    * 
+    * @return true if the environment should stay active when no users are connected or false otherwise
+    */
+   public boolean keepEnvAliveWithNoUsers();
+
+   /**
+    * returns whether an environment should be created and started up upon service initialization
+    * 
+    * @return true if an environment should be started up or false if no evionment should be created until requested
+    */
+   public boolean startEnvionrmnetOnServiceInit();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.java
new file mode 100644
index 0000000..e4235e4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.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.core.environment.interfaces;
+
+import java.util.ArrayList;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.RetryGroup;
+
+/**
+ * The TestPoint interface should be implemented by objects that store pass/fail
+ * data.
+ * 
+ * @author Robert A. Fisher
+ */
+@JsonSubTypes({ @JsonSubTypes.Type(value = CheckGroup.class), //
+		@JsonSubTypes.Type(value = RetryGroup.class) })
+public interface ITestGroup extends ITestPoint {
+	public int size();
+	
+	@JsonProperty
+	public ArrayList<ITestPoint> getTestPoints();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java
new file mode 100644
index 0000000..0f09760
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+
+public interface ITestLogger {
+   public void addHandler(Handler handler);
+
+   public void debug(ITestEnvironmentAccessor source, String message);
+
+   public void debug(ITestEnvironmentAccessor source, String message, boolean timeStamp);
+
+   public void info(String message);
+
+   public void log(TestRecord record);
+
+   public void log(Level level, String message, Throwable th);
+   
+   public void log(ITestEnvironmentAccessor source, Level level, String message, Throwable th);
+
+   public void methodCalled(ITestEnvironmentAccessor source);
+
+   public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter methodFormat);
+
+   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName);
+
+   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat);
+
+   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject);
+
+   public void methodEnded(ITestEnvironmentAccessor source);
+
+   public void methodEnded(ITestEnvironmentAccessor source, ReturnFormatter returnFormatter);
+
+   public void removeHandler(Handler handler);
+
+   public void support(ITestEnvironmentAccessor source, String message);
+
+   public void severe(ITestEnvironmentAccessor source, String message);
+
+   public void severe(Object source, Throwable thrown);
+
+   public void severe(String message);
+
+   public void testCaseBegan(TestCase testCase);
+
+   public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, boolean passed, String testPointName, String expected, String actual);
+
+   public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, ITestPoint testPoint);
+
+   public void testpoint(TestPointRecord record);
+
+   public void warning(ITestEnvironmentAccessor source, String message);
+
+   public void warning(String message);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java
new file mode 100644
index 0000000..dbad799
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+
+/**
+ * The TestPoint interface should be implemented by objects that store pass/fail
+ * data.
+ * 
+ * @author Robert A. Fisher
+ */
+public interface ITestPoint extends Xmlizable, XmlizableStream {
+	@JsonProperty
+	public boolean isPass();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.java
new file mode 100644
index 0000000..3679216
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.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.core.environment.interfaces;
+
+import java.util.List;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface ITestStation {
+
+   public String getOutletIp();
+
+   public void setOutletIp(String outletIp);
+
+   public int getOutletPort();
+
+   public void setOutletPort(int outletPort);
+
+   public String getVmeConnectionName();
+
+   public void turnPowerSupplyOnOff(boolean turnOn);
+
+   public List<IOTypeHandlerDefinition> getSupportedDriverTypes();
+
+   public boolean isPhysicalTypeAvailable(IOTypeDefinition physicalType);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeTypeControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeTypeControl.java
new file mode 100644
index 0000000..7b9fe58
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeTypeControl.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+public interface ITimeTypeControl {
+
+   void step();
+
+   ICancelTimer setTimerFor(Object objToNotify, int milliseconds);
+
+   long getEnvTime();
+
+   void singleStepEnv();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.java
new file mode 100644
index 0000000..5f3bbbf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+public interface ITimeout {
+   boolean isTimedOut();
+
+   void setTimeout(boolean timeout);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java
new file mode 100644
index 0000000..dc96aa6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+
+public interface ITimerControl {
+   void addTask(EnvironmentTask task, TestEnvironment environment);
+
+   void removeTask(EnvironmentTask task);
+
+   void cancelTimers();
+
+   long getEnvTime();
+
+   ICancelTimer setTimerFor(ITimeout objToNotify, int milliseconds);
+
+   void envWait(ITimeout obj, int milliseconds) throws InterruptedException;
+
+   void envWait(int milliseconds) throws InterruptedException;
+
+   int getCycleCount();
+
+   void incrementCycleCount();
+
+   void setCycleCount(int cycle);
+
+   void dispose();
+
+   public void cancelAllTasks();
+
+   public void step();
+
+   long getTimeOfDay();
+
+   public void setRunManager(IRunManager runManager);
+
+   public IRunManager getRunManager();
+
+   public boolean isRealtime();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/OteUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/OteUtil.java
new file mode 100644
index 0000000..c900d78
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/OteUtil.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * 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.core.environment.interfaces;
+
+public class OteUtil {
+
+   public static String generateBundleVersionString(String bundleSpecificVersion, String symbolicName, String version, String md5) {
+      StringBuilder sb = new StringBuilder();
+      if (bundleSpecificVersion != null) {
+         sb.append(bundleSpecificVersion);
+         sb.append("_");
+      }
+      sb.append(symbolicName);
+      sb.append("_");
+      sb.append(version);
+      sb.append("_");
+      sb.append(md5);
+      return sb.toString();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeLibraryListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeLibraryListener.java
new file mode 100644
index 0000000..90ead44
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeLibraryListener.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.core.environment.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface RuntimeLibraryListener {
+   void onPostRuntimeLibraryUpdated(ClassLoader classloader);
+
+   void onRuntimeLibraryUnload();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.java
new file mode 100644
index 0000000..dbfbe51
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * 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.core.environment.jini;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.environment.AsynchRemoteJobs;
+import org.eclipse.osee.ote.core.environment.ConsoleOutputJob;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EclipseConsolePrintStream extends PrintStream {
+
+   private final IUserSession callback;
+   private final StringBuffer builder;
+
+   public EclipseConsolePrintStream(OutputStream stream, IUserSession callback) {
+      super(stream);
+      this.callback = callback;
+      builder = new StringBuffer();
+   }
+
+   public EclipseConsolePrintStream(final InputStream instream, final OutputStream outstream, IUserSession callback) {
+      this(outstream, callback);
+
+      new Thread(new Runnable() {
+
+         @Override
+         public void run() {
+            try {
+               String line;
+               BufferedReader in = new BufferedReader(new InputStreamReader(instream));
+               while ((line = in.readLine()) != null) {
+                  println(line);
+               }
+               flush();
+            } catch (IOException e) {
+               OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+            }
+         }
+      }).start();
+   }
+
+   //   public void write(byte[] cbuf, int off, int len) {
+   //	  super.write(cbuf, off, len);
+   //      buffer.append(cbuf, off, len);
+   //      masterBuffer.append(cbuf, off, len);
+   //   }
+
+   @Override
+   public void flush() {
+      if (builder.length() == 0) {
+         return;
+      }
+      AsynchRemoteJobs.getInstance(this).addJob(new ConsoleOutputJob(callback, builder.toString()));
+      builder.delete(0, builder.length());
+   }
+
+   @Override
+   public void close() {
+      flush();
+   }
+
+   //public PrintStream append(char c) {
+   //	return super.append(c);
+   //}
+   //public PrintStream append(CharSequence csq, int start, int end) {
+   //	CharSequence cs = (csq == null ? "null" : csq);
+   //	write(cs.subSequence(start, end).toString());
+   //	return super.append(csq, start, end);
+   //}
+   //public PrintStream append(CharSequence csq) {
+   //	return super.append(csq);
+   //}
+   @Override
+   public boolean checkError() {
+      return super.checkError();
+   }
+
+   //public PrintStream format(Locale l, String format, Object[] args) {
+   //	return super.format(l, format, args);
+   //}
+   //public PrintStream format(String format, Object[] args) {
+   //	return super.format(format, args);
+   //}
+
+   private void newLine() {
+      flush();
+   }
+
+   @Override
+   public void print(boolean b) {
+      builder.append(b ? "true" : "false");
+      super.print(b);
+   }
+
+   @Override
+   public void print(char c) {
+      builder.append(c);
+      super.print(c);
+   }
+
+   @Override
+   public void print(char[] s) {
+      builder.append(s);
+      super.print(s);
+   }
+
+   @Override
+   public void print(double d) {
+      builder.append(d);
+      super.print(d);
+   }
+
+   @Override
+   public void print(float f) {
+      builder.append(f);
+      super.print(f);
+   }
+
+   @Override
+   public void print(int i) {
+      builder.append(i);
+      super.print(i);
+   }
+
+   @Override
+   public void print(long l) {
+      builder.append(l);
+      super.print(l);
+   }
+
+   @Override
+   public void print(Object obj) {
+      builder.append(String.valueOf(obj));
+      super.print(obj);
+   }
+
+   @Override
+   public void print(String s) {
+      builder.append(s);
+      super.print(s);
+   }
+
+   //public PrintStream printf(Locale l, String format, Object[] args) {
+   //	return super.printf(l, format, args);
+   //}
+   //public PrintStream printf(String format, Object[] args) {
+   //	return super.printf(format, args);
+   //}
+   @Override
+   public void println() {
+      super.println();
+      newLine();
+   }
+
+   @Override
+   public void println(boolean x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void println(char x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void println(char[] x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void println(double x) {
+      newLine();
+      super.println(x);
+   }
+
+   @Override
+   public void println(float x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void println(int x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void println(long x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void println(Object x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void println(String x) {
+      super.println(x);
+      newLine();
+   }
+
+   @Override
+   public void write(int b) {
+      builder.append(b);
+      super.write(b);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java
new file mode 100644
index 0000000..2adfe48
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.core.environment.jini;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EclipseConsoleWriter extends Writer {
+
+   private final IUserSession callback;
+   private final StringBuffer buffer;
+   private StringBuffer masterBuffer;
+
+   public EclipseConsoleWriter(IUserSession callback, boolean createMasterBuffer) {
+      this.callback = callback;
+      buffer = new StringBuffer(256);
+      masterBuffer = new StringBuffer(256);
+   }
+   
+   public EclipseConsoleWriter(IUserSession callback) {
+	   this.callback = callback;
+	   buffer = new StringBuffer(256);
+   }
+
+   @Override
+   public synchronized void write(char[] cbuf, int off, int len) {
+      buffer.append(cbuf, off, len);
+      if(masterBuffer != null){
+    	  masterBuffer.append(cbuf, off, len);
+      }
+   }
+
+   @Override
+   public synchronized void flush() throws IOException {
+      if (buffer.length() > 0 && buffer.charAt(buffer.length() - 1) == '\n') {
+         buffer.deleteCharAt(buffer.length() - 1);
+      }
+      try {
+         callback.initiateInformationalPrompt(buffer.toString());
+      } catch (Exception ex) {
+         System.out.println(buffer.toString());
+      }
+      buffer.delete(0, buffer.length());
+   }
+
+   @Override
+   public synchronized void close() throws IOException {
+      flush();
+   }
+
+   public synchronized String getAllOutput() {
+      if(masterBuffer != null){
+    	  return masterBuffer.toString();
+      } else {
+    	  return "MASTER BUFFER NOT ENABLED";
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java
new file mode 100644
index 0000000..4123412
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.core.environment.jini;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.core.TestPrompt;
+import org.eclipse.osee.ote.core.environment.status.ExceptionEvent;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentCommandCallback extends Remote {
+   void initiatePrompt(TestPrompt prompt) throws RemoteException;
+
+   void exceptionReceived(ExceptionEvent event) throws RemoteException;
+
+   long getFileDate(String workspacePath) throws RemoteException;
+
+   byte[] getFile(String workspacePath) throws RemoteException;
+
+   Object[] getValues(String key) throws RemoteException;
+
+   boolean isAlive() throws RemoteException;
+
+   String getFileVersion(String workspacePath) throws RemoteException;
+
+   String getAddress() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.java
new file mode 100644
index 0000000..f529fe3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.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.ote.core.environment.jini;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintWriter;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public class InputStreamConnection extends PipedInputStream {
+
+   private final PrintWriter writer;
+
+   public InputStreamConnection() {
+      PipedOutputStream piped = new PipedOutputStream();
+      writer = new PrintWriter(piped);
+      try {
+         this.connect(piped);
+      } catch (IOException e) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+      }
+   }
+
+   public InputStreamConnection(OutputStream output) {
+      writer = new PrintWriter(output);
+   }
+
+   public void write(String string) {
+      writer.println(string);
+      writer.flush();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.java
new file mode 100644
index 0000000..2770176
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.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.ote.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class CommandAdded implements IServiceStatusDataCommand, Serializable {
+
+   private static final long serialVersionUID = -2555474494093618398L;
+
+   private CommandDescription description;
+
+   public CommandAdded(CommandDescription description) {
+      this.description = description;
+   }
+
+   public CommandAdded() {
+   }
+
+   @Override
+   public CommandDescription getDescription() {
+      return description;
+   }
+
+   public void set(CommandDescription description) {
+      this.description = description;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      if (visitor != null) {
+         visitor.asCommandAdded(this);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.java
new file mode 100644
index 0000000..3be3942
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.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.core.environment.status;
+
+public enum CommandEndedStatusEnum {
+
+   UNDEFINED,
+   ABORTED,
+   HUNG,
+   EXCEPTION,
+   RAN_TO_COMPLETION;
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java
new file mode 100644
index 0000000..536c3a0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class CommandRemoved implements Serializable, IServiceStatusDataCommand {
+
+   private static final long serialVersionUID = -177791874608013281L;
+   private CommandDescription description;
+   private CommandEndedStatusEnum reason;
+
+   public CommandRemoved(CommandDescription description, CommandEndedStatusEnum reason) {
+      this.description = description;
+      this.reason = reason;
+   }
+
+   public CommandRemoved() {
+   }
+
+   @Override
+   public CommandDescription getDescription() {
+      return description;
+   }
+
+   public void setDescription(CommandDescription description) {
+      this.description = description;
+   }
+
+   public void setReason(CommandEndedStatusEnum reason) {
+      this.reason = reason;
+   }
+
+   public CommandEndedStatusEnum getReason() {
+      return reason;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      if (visitor != null) {
+         visitor.asCommandRemoved(this);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java
new file mode 100644
index 0000000..27c4fa3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class CommandStatusEvent implements Serializable {
+
+   private static final long serialVersionUID = -567005567921815848L;
+   private final CommandDescription description;
+
+   /**
+    * CommandStatusEvent Constructor.
+    * 
+    * @param description The command description.
+    */
+   public CommandStatusEvent(CommandDescription description) {
+      super();
+      this.description = description;
+   }
+
+   /**
+    * @return Returns the description.
+    */
+   public CommandDescription getDescription() {
+      return description;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java
new file mode 100644
index 0000000..e902db4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.Serializable;
+
+public class EnvironmentError implements IServiceStatusData, Serializable {
+
+   private static final long serialVersionUID = -7077313410529981519L;
+   private Throwable err;
+
+   public EnvironmentError(Throwable err) {
+      this.err = err;
+   }
+
+   public EnvironmentError() {
+   }
+
+   public Throwable getErr() {
+      return err;
+   }
+
+   public void set(Throwable err) {
+      this.err = err;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      if (visitor != null) {
+         visitor.asEnvironmentError(this);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.java
new file mode 100644
index 0000000..a5a42fd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.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.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ExceptionEvent extends CommandStatusEvent implements Serializable {
+
+   private static final long serialVersionUID = -831107014787093973L;
+   private final Throwable throwable;
+
+   public ExceptionEvent(CommandDescription description, Throwable exception) {
+      super(description);
+      this.throwable = exception;
+   }
+
+   public Throwable getException() {
+      return this.throwable;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusData.java
new file mode 100644
index 0000000..a9006a1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusData.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.core.environment.status;
+
+import java.io.Serializable;
+
+public interface IServiceStatusData extends Serializable {
+
+   public void accept(IServiceStatusDataVisitor visitor);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataCommand.java
new file mode 100644
index 0000000..e695437
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataCommand.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.core.environment.status;
+
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IServiceStatusDataCommand extends IServiceStatusData {
+
+   public CommandDescription getDescription();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.java
new file mode 100644
index 0000000..51fae4c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IServiceStatusDataVisitor {
+
+   public void asCommandAdded(CommandAdded commandAdded);
+
+   public void asCommandRemoved(CommandRemoved commandRemoved);
+
+   public void asEnvironmentError(EnvironmentError environmentError);
+
+   public void asSequentialCommandBegan(SequentialCommandBegan sequentialCommandBegan);
+
+   public void asSequentialCommandEnded(SequentialCommandEnded sequentialCommandEnded);
+
+   public void asTestPointUpdate(TestPointUpdate testPointUpdate);
+
+   public void asTestServerCommandComplete(TestServerCommandComplete end);
+
+   public void asTestComplete(TestComplete testComplete);
+
+   public void asTestStart(TestStart testStart);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.java
new file mode 100644
index 0000000..b470433
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.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.core.environment.status;
+
+import java.util.List;
+
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface OTEStatusBoard {
+   public void onCommandAdded(TestEnvironment env, TestEnvironmentCommand cmd);
+
+   public void onCommandRemoved(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+   public void onException(String message, Throwable t);
+
+   public void onCommandBegan(TestEnvironment env, CommandDescription cmdDesc);
+
+   public void onCommandFinished(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+   public void onTestPointUpdate(int pass, int fail, String testClassName);
+
+   public void onEnvironmentKilled(TestEnvironment env);
+
+   public void dispose();
+
+   public void onTestServerCommandFinished(TestEnvironment env, ICommandHandle handle);
+
+   public void onTestComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus);
+
+   public void onTestStart(String className, String serverOutfilePath, String clientOutfilePath);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java
new file mode 100644
index 0000000..b618212
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class SequentialCommandBegan implements IServiceStatusDataCommand {
+
+   private static final long serialVersionUID = -3278399375292593249L;
+   private CommandDescription description;
+
+   public SequentialCommandBegan(CommandDescription description) {
+      this.description = description;
+   }
+
+   public SequentialCommandBegan() {
+   }
+
+   public void set(CommandDescription description) {
+      this.description = description;
+   }
+
+   @Override
+   public CommandDescription getDescription() {
+      return description;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      if (visitor != null) {
+         visitor.asSequentialCommandBegan(this);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java
new file mode 100644
index 0000000..46ab777
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class SequentialCommandEnded implements IServiceStatusDataCommand, Serializable {
+
+   private static final long serialVersionUID = 9093713855323793915L;
+   private CommandDescription description;
+   private CommandEndedStatusEnum status;
+
+   public SequentialCommandEnded(CommandDescription description, CommandEndedStatusEnum status) {
+      this.description = description;
+      this.status = status;
+   }
+
+   public SequentialCommandEnded() {
+   }
+
+   @Override
+   public CommandDescription getDescription() {
+      return description;
+   }
+
+   public CommandEndedStatusEnum getStatus() {
+      return status;
+   }
+
+   public void set(CommandDescription description, CommandEndedStatusEnum status) {
+      this.description = description;
+      this.status = status;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      if (visitor != null) {
+         visitor.asSequentialCommandEnded(this);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java
new file mode 100644
index 0000000..8789d70
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandAddedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandRemovedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.EnvErrorMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandBeganMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandEndedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestPointUpdateMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestServerCommandCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestStartMessage;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.core.framework.command.TestCommandStatus;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+import org.osgi.service.event.EventAdmin;
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class StatusBoard implements ITestEnvironmentListener, OTEStatusBoard {
+   private static final long TP_UPDATE_THROTTLE = 5000;
+   
+   private long lastTpUpdateTime = 0;
+
+   private final ThreadPoolExecutor executor;
+   private final ScheduledExecutorService scheduledExecutor;
+   private final Object testPointLock = new Object();
+   private TestPointStatusBoardRunnable latestTestPointUpdate;
+   private final AtomicBoolean executeLatestTestPointUpdate = new AtomicBoolean();
+private EventAdmin eventAdmin;
+
+   //   private Future<?> lastTestPointUpdate;
+
+   /**
+    * StatusBoard Constructor. This class handles passing status information from the test enviornment to the UI's
+    * (StatusHandler Class).
+    */
+   public StatusBoard() {
+      super();
+      GCHelper.getGCHelper().addRefWatch(this);
+      executeLatestTestPointUpdate.set(false);
+      executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
+      scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
+      scheduledExecutor.scheduleAtFixedRate(new Runnable() {
+
+         @Override
+         public void run() {
+            synchronized (testPointLock) {
+               if (executeLatestTestPointUpdate.get()) {
+                  executeLatestTestPointUpdate.set(false);
+                  lastTpUpdateTime = System.currentTimeMillis();
+                  executor.submit(latestTestPointUpdate);
+               }
+            }
+         }
+
+      }, TP_UPDATE_THROTTLE, TP_UPDATE_THROTTLE, TimeUnit.MILLISECONDS);
+   }
+
+
+   public void start(){
+	   
+   }
+   
+   public void stop(){
+	  dispose();   
+   }
+   
+   public void bindEventAdmin(EventAdmin eventAdmin){
+	   this.eventAdmin = eventAdmin;
+   }
+   
+   public void unbindEventAdmin(EventAdmin eventAdmin){
+	   this.eventAdmin = null;
+   }
+   
+   @Override
+   public void onCommandAdded(TestEnvironment env, TestEnvironmentCommand cmd) {
+      CommandAdded cmdAdded = new CommandAdded();
+      cmdAdded.set(cmd.getDescription());
+      try {
+    	  CommandAddedMessage msg = new CommandAddedMessage(cmdAdded);
+    	  notifyListeners(msg);
+      } catch (IOException e) {
+    	  OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+      }
+   }
+
+   @Override
+   public void onCommandRemoved(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status) {
+      CommandRemoved cmdRemoved = new CommandRemoved();
+      cmdRemoved.setDescription(cmdDesc);
+      cmdRemoved.setReason(status);
+      try {
+    	  CommandRemovedMessage msg = new CommandRemovedMessage(cmdRemoved);
+    	  notifyListeners(msg);
+      } catch (IOException e) {
+    	  OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+      }
+   }
+
+   @Override
+   public void onException(String message, Throwable t) {
+      EnvironmentError envError = new EnvironmentError();
+      envError.set(t);
+      try {
+    	  EnvErrorMessage msg = new EnvErrorMessage(envError);
+    	  notifyListeners(msg);
+      } catch (IOException e) {
+    	  OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+      }
+   }
+
+   @Override
+   public void onCommandBegan(TestEnvironment env, CommandDescription cmdDesc) {
+      SequentialCommandBegan seqCmdBegan = new SequentialCommandBegan();
+      seqCmdBegan.set(cmdDesc);
+      try {
+    	  SequentialCommandBeganMessage msg = new SequentialCommandBeganMessage(seqCmdBegan);
+    	  notifyListeners(msg);
+      } catch (IOException e) {
+    	  OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+      }
+   }
+
+   @Override
+   public void onCommandFinished(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status) {
+      OseeLog.log(TestEnvironment.class, Level.INFO, "To End: " + cmdDesc.getGuid());
+
+      SequentialCommandEnded seqCmdEnded = new SequentialCommandEnded();
+      seqCmdEnded.set(cmdDesc, status);
+      try {
+    	  SequentialCommandEndedMessage msg = new SequentialCommandEndedMessage(seqCmdEnded);
+    	  notifyListeners(msg);
+      } catch (IOException e) {
+    	  OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+      }
+   }
+
+   @Override
+   public void onTestPointUpdate(int pass, int fail, String testClassName) {
+	   try {
+		   TestPointStatusBoardRunnable runnable =
+				   new TestPointStatusBoardRunnable(new TestPointUpdateMessage(new TestPointUpdate(pass, fail, testClassName)), eventAdmin);
+		   if (System.currentTimeMillis() - lastTpUpdateTime > TP_UPDATE_THROTTLE) {
+			   lastTpUpdateTime = System.currentTimeMillis();
+			   executor.submit(runnable);
+		   } else {
+			   synchronized (testPointLock) {
+				   latestTestPointUpdate = runnable;
+				   executeLatestTestPointUpdate.set(true);
+			   }
+		   }
+	   } catch (IOException e) {
+		   OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+	   }
+   }
+
+   @SuppressWarnings("rawtypes")
+   void notifyListeners(final SerializedClassMessage msg) {
+      executor.execute(new StatusBoardRunnable(msg) {
+         @Override
+         public void run() {
+        	 OteEventMessageUtil.sendEvent(msg, eventAdmin);
+         }
+      });
+   }
+
+   @Override
+   public void onEnvironmentKilled(TestEnvironment env) {
+
+   }
+
+   @Override
+   public void dispose() {
+   }
+
+   @Override
+   public void onTestServerCommandFinished(TestEnvironment env, ICommandHandle handle) {
+	   try {
+	      ITestCommandResult status = handle.get();
+	      TestCommandStatus cmdStatus = null;
+	      Throwable th = null;
+	      if(status != null){
+	         cmdStatus = status.getStatus();
+	         th = status.getThrowable();
+	      }
+		   TestServerCommandCompleteMessage msg = new TestServerCommandCompleteMessage(new TestServerCommandComplete(cmdStatus, th));
+		   notifyListeners(msg);
+	   } catch (IOException e) {
+		   OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+	   }
+   }
+
+   @Override
+   public void onTestComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus) {
+	   try {
+		   TestCompleteMessage msg = new TestCompleteMessage(new TestComplete(className, serverOutfilePath, clientOutfilePath, status, healthStatus));
+		   notifyListeners(msg);
+	   } catch (IOException e) {
+		   OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+	   }
+   }
+
+   @Override
+   public void onTestStart(String className, String serverOutfilePath, String clientOutfilePath ) {
+	   try {
+		   TestStartMessage msg = new TestStartMessage(new TestStart(className, serverOutfilePath, clientOutfilePath));
+		   notifyListeners(msg);
+	   } catch (IOException e) {
+		   OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+	   }
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java
new file mode 100644
index 0000000..7cbb6e5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public abstract class StatusBoardRunnable implements Runnable {
+
+   private final SerializedClassMessage data;
+
+   public StatusBoardRunnable(SerializedClassMessage msg) {
+      this.data = msg;
+   }
+
+   protected SerializedClassMessage getData() {
+      return data;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java
new file mode 100644
index 0000000..1c5083d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.Serializable;
+import java.util.List;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestComplete implements Serializable, IServiceStatusData {
+   private static final long serialVersionUID = -7969548718769021626L;
+   private final String className;
+   private final CommandEndedStatusEnum status;
+   private final String serverOutfilePath;
+   private final String clientOutfilePath;
+   private final List<IHealthStatus> healthStatus;
+
+   public TestComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus) {
+      this.className = className;
+      this.serverOutfilePath = serverOutfilePath;
+      this.clientOutfilePath = clientOutfilePath;
+      this.status = status;
+      this.healthStatus = healthStatus;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      visitor.asTestComplete(this);
+   }
+
+   public String getClassName() {
+      return className;
+   }
+
+   public CommandEndedStatusEnum getStatus() {
+      return status;
+   }
+
+   public String getServerOutfilePath() {
+      return serverOutfilePath;
+   }
+
+   public String getClientOutfilePath() {
+      return clientOutfilePath;
+   }
+
+   public List<IHealthStatus> getHealthStatus() {
+      return this.healthStatus;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java
new file mode 100644
index 0000000..6ced1e1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import org.eclipse.osee.ote.core.environment.status.msg.TestPointUpdateMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.service.event.EventAdmin;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointStatusBoardRunnable extends StatusBoardRunnable {
+
+   private final EventAdmin eventAdmin;
+
+   public TestPointStatusBoardRunnable(TestPointUpdateMessage testPointUpdateMessage, EventAdmin eventAdmin) {
+      super(testPointUpdateMessage);
+      this.eventAdmin = eventAdmin;
+   }
+
+   @Override
+   public void run() {
+	   OteEventMessageUtil.sendEvent(getData(), eventAdmin);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.java
new file mode 100644
index 0000000..676e770
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.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.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class TestPointUpdate implements Serializable, IServiceStatusDataCommand {
+
+   private static final long serialVersionUID = 7157851807444983673L;
+   private int pass;
+   private int fail;
+   private CommandDescription description;
+   private String testClassName;
+
+   public TestPointUpdate(int pass, int fail, CommandDescription description) {
+      this.pass = pass;
+      this.fail = fail;
+      this.description = description;
+   }
+
+   public TestPointUpdate(int pass, int fail, String testClassName) {
+      this.pass = pass;
+      this.fail = fail;
+      this.testClassName = testClassName;
+   }
+
+   public TestPointUpdate() {
+   }
+
+   public int getFail() {
+      return fail;
+   }
+
+   public int getPass() {
+      return pass;
+   }
+
+   public String getClassName() {
+      return testClassName;
+   }
+
+   @Override
+   public CommandDescription getDescription() {
+      return description;
+   }
+
+   public void set(int pass, int fail, CommandDescription description) {
+      this.pass = pass;
+      this.fail = fail;
+      this.description = description;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      if (visitor != null) {
+         visitor.asTestPointUpdate(this);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java
new file mode 100644
index 0000000..ca2310c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.Serializable;
+
+import org.eclipse.osee.ote.core.framework.command.TestCommandStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestServerCommandComplete implements Serializable, IServiceStatusData {
+
+   private static final long serialVersionUID = -2678833105694275416L;
+   private TestCommandStatus cmdStatus;
+   private Throwable th;
+
+   public TestServerCommandComplete(TestCommandStatus cmdStatus, Throwable th) {
+      this.cmdStatus = cmdStatus;
+      this.th = th;
+   }
+
+   @Override
+   public void accept(IServiceStatusDataVisitor visitor) {
+      visitor.asTestServerCommandComplete(this);
+   }
+
+   public TestCommandStatus getCmdStatus() {
+      return cmdStatus;
+   }
+   
+   public Throwable getThrowable() {
+      return th;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java
new file mode 100644
index 0000000..0d8f90c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.core.environment.status;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestStart implements IServiceStatusData, Serializable {
+
+	private static final long serialVersionUID = -3458459132672153638L;
+	private final String testClassName;
+	private final String serverOutfilePath;
+	private final String clientOutfilePath;
+
+	public TestStart(String testClassName, String serverOutfilePath, String clientOutfilePath) {
+		this.testClassName = testClassName;
+		this.serverOutfilePath = serverOutfilePath;
+		this.clientOutfilePath = clientOutfilePath;
+	}
+
+	@Override
+	public void accept(IServiceStatusDataVisitor visitor) {
+		visitor.asTestStart(this);
+	}
+
+	public String getTestClassName() {
+		return testClassName;
+	}
+
+	public String getServerOutfilePath() {
+		return serverOutfilePath;
+	}
+
+	public String getClientOutfilePath() {
+		return clientOutfilePath;
+	}
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandAddedMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandAddedMessage.java
new file mode 100644
index 0000000..893f188
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandAddedMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.CommandAdded;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class CommandAddedMessage extends SerializedClassMessage<CommandAdded> {
+
+	public static final String EVENT = "ote/status/commandAdded";
+	
+	public CommandAddedMessage() {
+		super(EVENT);
+	}
+	
+	public CommandAddedMessage(CommandAdded commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public CommandAddedMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandRemovedMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandRemovedMessage.java
new file mode 100644
index 0000000..70c7cd6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandRemovedMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.CommandRemoved;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class CommandRemovedMessage extends SerializedClassMessage<CommandRemoved> {
+
+	public static final String EVENT = "ote/status/commandRemoved";
+	
+	public CommandRemovedMessage() {
+		super(EVENT);
+	}
+
+	public CommandRemovedMessage(CommandRemoved cmdRemoved) throws IOException {
+		super("ote/status/commandRemoved", cmdRemoved);
+	}
+	
+	public CommandRemovedMessage(byte[] bytes){
+		super(bytes);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/EnvErrorMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/EnvErrorMessage.java
new file mode 100644
index 0000000..344684b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/EnvErrorMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.EnvironmentError;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class EnvErrorMessage extends SerializedClassMessage<EnvironmentError> {
+
+	public static final String EVENT = "ote/status/envError";
+	
+	public EnvErrorMessage() {
+		super(EVENT);
+	}
+
+	public EnvErrorMessage(EnvironmentError envError) throws IOException {
+		super(EVENT, envError);
+	}
+
+	public EnvErrorMessage(byte[] bytes) {
+		super(bytes);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandBeganMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandBeganMessage.java
new file mode 100644
index 0000000..f7363d8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandBeganMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandBegan;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SequentialCommandBeganMessage extends SerializedClassMessage<SequentialCommandBegan> {
+
+	public static final String EVENT = "ote/status/sequentialCommandBegan";
+	
+	public SequentialCommandBeganMessage() {
+		super(EVENT);
+	}
+
+	public SequentialCommandBeganMessage(SequentialCommandBegan seqCmdBegan) throws IOException {
+		super(EVENT, seqCmdBegan);
+	}
+	
+	public SequentialCommandBeganMessage(byte[] bytes){
+		super(bytes);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandEndedMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandEndedMessage.java
new file mode 100644
index 0000000..8e53ca2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandEndedMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandEnded;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SequentialCommandEndedMessage extends SerializedClassMessage<SequentialCommandEnded> {
+
+	public static final String EVENT = "ote/status/sequentialCommandEnded";
+	
+	public SequentialCommandEndedMessage() {
+		super(EVENT);
+	}
+
+	public SequentialCommandEndedMessage(SequentialCommandEnded seqCmdEnded) throws IOException {
+		super(EVENT, seqCmdEnded);
+	}
+
+	public SequentialCommandEndedMessage(byte[] bytes){
+		super(bytes);
+	}
+	
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestCompleteMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestCompleteMessage.java
new file mode 100644
index 0000000..5efa08a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestCompleteMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestComplete;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestCompleteMessage extends SerializedClassMessage<TestComplete> {
+
+	public static final String EVENT = "ote/status/testComplete";
+	
+	public TestCompleteMessage() {
+		super(EVENT);
+	}
+
+	public TestCompleteMessage(TestComplete testComplete) throws IOException {
+		super(EVENT, testComplete);
+	}
+
+	public TestCompleteMessage(byte[] bytes){
+		super(bytes);
+	}
+	
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestPointUpdateMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestPointUpdateMessage.java
new file mode 100644
index 0000000..82795cc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestPointUpdateMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestPointUpdate;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestPointUpdateMessage extends SerializedClassMessage<TestPointUpdate> {
+
+	public static final String EVENT = "ote/status/testPointUpdate";
+	
+	public TestPointUpdateMessage() {
+		super(EVENT);
+	}
+
+	public TestPointUpdateMessage(TestPointUpdate testPointUpdate) throws IOException {
+		super(EVENT, testPointUpdate);
+	}
+
+	public TestPointUpdateMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestServerCommandCompleteMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestServerCommandCompleteMessage.java
new file mode 100644
index 0000000..ca7306d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestServerCommandCompleteMessage.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestServerCommandComplete;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestServerCommandCompleteMessage extends SerializedClassMessage<TestServerCommandComplete> {
+
+	public static final String EVENT = "ote/status/testServerCommandComplete";
+	
+	public TestServerCommandCompleteMessage() {
+		super(EVENT);
+	}
+
+	public TestServerCommandCompleteMessage(
+			TestServerCommandComplete testServerCommandComplete) throws IOException {
+		super(EVENT, testServerCommandComplete);
+	}
+	
+	public TestServerCommandCompleteMessage(byte[] bytes){
+		super(bytes);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestStartMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestStartMessage.java
new file mode 100644
index 0000000..88dae16
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestStartMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestStart;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestStartMessage extends SerializedClassMessage<TestStart> {
+
+	public static final String EVENT = "ote/status/testStart";
+	
+	public TestStartMessage() {
+		super(EVENT);
+	}
+
+	public TestStartMessage(TestStart testStart) throws IOException {
+		super(EVENT, testStart);
+	}
+
+	public TestStartMessage(byte[] bytes) {
+		super(bytes);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java
new file mode 100644
index 0000000..b2eb2f9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+
+public class BaseCommandContextFactory implements ICommandContextFactory {
+   @Override
+   public ITestContext getContext(final TestEnvironment testEnvironment, final ITestServerCommand cmd) {
+      return testEnvironment;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java
new file mode 100644
index 0000000..53378b7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.Conditions;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.testrun.ITestResultCollector;
+import org.eclipse.osee.ote.core.framework.testrun.ITestResultCollectorFactory;
+import org.eclipse.osee.ote.core.framework.testrun.ITestRunManager;
+
+public class BaseRunManager implements IRunManager {
+
+   private final ITestRunManager testRunManager;
+   private final ITestLifecycleListenerProvider lifecycleListenerProvider;
+   private final ITestResultCollectorFactory resultCollectorFactory;
+   private ITestResultCollector resultCollector;
+
+   public BaseRunManager(ITestRunManager testRunManager, ITestLifecycleListenerProvider lifecycleListenerProvider, ITestResultCollectorFactory resultCollectorFactory) {
+      this.lifecycleListenerProvider = lifecycleListenerProvider;
+      this.testRunManager = testRunManager;
+      this.resultCollectorFactory = resultCollectorFactory;
+   }
+
+   @Override
+   public boolean addListener(ITestLifecycleListener listener) {
+      return lifecycleListenerProvider.addListener(listener);
+   }
+
+   @Override
+   public void clearAllListeners() {
+      lifecycleListenerProvider.clear();
+   }
+
+   @Override
+   public boolean removeListener(ITestLifecycleListener listener) {
+      return lifecycleListenerProvider.removeListener(listener);
+   }
+
+   @Override
+   public IMethodResult run(TestEnvironment env, IPropertyStore propertyStore) {
+      try {
+         this.resultCollector = resultCollectorFactory.createCollector();
+         this.resultCollector.initialize(propertyStore, env);
+         ResultBuilder rb = new ResultBuilder(true);
+         rb.append(lifecycleListenerProvider.notifyPreInstantiation(propertyStore, env));
+         if (rb.isReturnStatusOK()) {
+            rb.append(testRunManager.initialize(env, propertyStore));
+            if (rb.isReturnStatusOK()) {
+               try {
+                  rb.append(
+                     lifecycleListenerProvider.notifyPostInstantiation(propertyStore, testRunManager.getTest(), env));
+               } catch (Throwable th) {
+                  MethodResultImpl result = new MethodResultImpl(ReturnCode.ERROR);
+                  result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+                  rb.append(result);
+               }
+               if (rb.isReturnStatusOK()) {
+                  try {
+                     rb.append(testRunManager.run(propertyStore, env));
+                  } catch (Throwable th) {
+                     MethodResultImpl result = new MethodResultImpl(ReturnCode.ERROR);
+                     result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+                     rb.append(result);
+                  }
+               } else {
+                  TestScript test = testRunManager.getTest();
+                  boolean aborted = false;
+                  if (Conditions.hasValues(rb.get().getStatus())) {
+                     for (IHealthStatus hs : rb.get().getStatus()) {
+                        if (hs.getException() != null) {
+                           test.abortDueToThrowable(hs.getException());
+                           aborted = true;
+                           break;
+                        }
+                     }
+                  }
+                  if (!aborted) {
+                     test.abort();
+                  }
+               }
+            }
+            rb.append(lifecycleListenerProvider.notifyPreDispose(propertyStore, testRunManager.getTest(), env));
+            rb.append(testRunManager.dispose());
+            rb.append(lifecycleListenerProvider.notifyPostDispose(propertyStore, env));
+         }
+         this.resultCollector.dispose(env);
+         this.resultCollector = null;
+         if (!rb.isReturnStatusOK()) {
+            OseeLog.log(BaseRunManager.class, Level.SEVERE, rb.toString());
+         }
+         return rb.get();
+      } catch (Throwable th) {
+         th.printStackTrace();
+         MethodResultImpl status = new MethodResultImpl(ReturnCode.ERROR);
+         status.addStatus(new BaseStatus(BaseRunManager.class.getName(), Level.SEVERE, th));
+         return status;
+      }
+   }
+
+   @Override
+   public boolean abort() {
+      return testRunManager.abort();
+   }
+
+   @Override
+   public boolean abort(Throwable th, boolean wait) {
+      return testRunManager.abort(th, wait);
+   }
+
+   @Override
+   public boolean isAborted() {
+      return testRunManager.isAborted();
+   }
+
+   @Override
+   public TestScript getCurrentScript() {
+      return testRunManager.getTest();
+   }
+
+   @Override
+   public boolean isCurrentThreadScript() {
+      return testRunManager.isCurrentThreadScript();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java
new file mode 100644
index 0000000..2a85d03
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+import org.eclipse.osee.ote.core.framework.event.IEventDataProvider;
+
+public class BaseTestLifecycleListenerProvider implements ITestLifecycleListenerProvider {
+
+   private final IEventDataProvider eventProvider;
+   private final List<ITestLifecycleListener> listeners;
+   private int listenerCountAtPreinit = 0;
+
+   public BaseTestLifecycleListenerProvider(IEventDataProvider eventProvider) {
+      this.eventProvider = eventProvider;
+      listeners = new CopyOnWriteArrayList<>();
+   }
+
+   @Override
+   public void clear() {
+      listeners.clear();
+   }
+
+   @Override
+   public boolean addListener(ITestLifecycleListener listener) {
+      return listeners.add(listener);
+   }
+
+   @Override
+   public IMethodResult notifyPostDispose(IPropertyStore propertyStore, TestEnvironment env) {
+      IEventData eventData = eventProvider.getEventData(propertyStore, null);
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      for (ITestLifecycleListener listener : listeners) {
+         try {
+            result = collectStatus(result, listener.postDispose(eventData, env));
+         } catch (Throwable th) {
+            result = collectStatus(result,new MethodResultImpl(ReturnCode.ERROR));
+            result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+         }
+      }
+
+      int newSize = listeners.size();
+      if( this.listenerCountAtPreinit != newSize)
+      {
+         System.err.printf("+++++++++++++++++++++++++++++++++++++++++There are now %s listeners when there were %s to start with\n", listenerCountAtPreinit, newSize );
+         for (ITestLifecycleListener listener : listeners) {
+            System.err.println("Listener: " + listener.getClass().getName());
+         }
+         System.err.println("-----------------------------------------------------------------------------------------------------");
+      }
+      return result;
+   }
+
+   @Override
+   public IMethodResult notifyPostInstantiation(IPropertyStore propertyStore, TestScript test, TestEnvironment env) {
+      IEventData eventData = eventProvider.getEventData(propertyStore, test);
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      for (ITestLifecycleListener listener : listeners) {
+         result = collectStatus(result, listener.postInstantiation(eventData, env));
+      }
+      return result;
+   }
+
+   @Override
+   public IMethodResult notifyPreDispose(IPropertyStore propertyStore, TestScript test, TestEnvironment env) {
+      IEventData eventData = eventProvider.getEventData(propertyStore, test);
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      for (ITestLifecycleListener listener : listeners) {
+         try {
+            result = collectStatus(result, listener.preDispose(eventData, env));
+         } catch (Throwable th) {
+            result = collectStatus(result,new MethodResultImpl(ReturnCode.ERROR));
+            result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+         }
+      }
+      return result;
+   }
+
+   @Override
+   public IMethodResult notifyPreInstantiation(IPropertyStore propertyStore, TestEnvironment env) {
+      IEventData eventData = eventProvider.getEventData(propertyStore, null);
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+
+      for (ITestLifecycleListener listener : listeners) {
+         result = collectStatus(result, listener.preInstantiation(eventData, env));
+      }
+
+      this.listenerCountAtPreinit = listeners.size();
+      return result;
+   }
+
+   @Override
+   public boolean removeListener(ITestLifecycleListener listener) {
+      return listeners.remove(listener);
+   }
+
+   private MethodResultImpl collectStatus(MethodResultImpl result, IMethodResult listenerResult) {
+      if (listenerResult.getReturnCode() != ReturnCode.OK) {
+         if (result.getReturnCode() == ReturnCode.OK) {
+            result = new MethodResultImpl(ReturnCode.OK);
+         }
+         result.setReturnCode(listenerResult.getReturnCode());
+         result.addStatus(listenerResult.getStatus());
+      }
+      return result;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/DestroyableService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/DestroyableService.java
new file mode 100644
index 0000000..5fefb42
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/DestroyableService.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+public interface DestroyableService {
+   void destroy();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ICommandContextFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ICommandContextFactory.java
new file mode 100644
index 0000000..ecae76d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ICommandContextFactory.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.core.framework;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+
+public interface ICommandContextFactory {
+
+   ITestContext getContext(TestEnvironment testEnvironment, ITestServerCommand cmd);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IMethodResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IMethodResult.java
new file mode 100644
index 0000000..8b91243
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IMethodResult.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+import java.util.List;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMethodResult {
+   List<IHealthStatus> getStatus();
+
+   ReturnCode getReturnCode();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.java
new file mode 100644
index 0000000..ff2082e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface IRunManager {
+
+   public boolean addListener(ITestLifecycleListener listener);
+
+   public void clearAllListeners();
+
+   public boolean removeListener(ITestLifecycleListener listener);
+
+   public IMethodResult run(TestEnvironment env, IPropertyStore propertyStore);
+
+   public boolean abort();
+
+   public boolean abort(Throwable th, boolean wait);
+
+   public boolean isAborted();
+
+   public TestScript getCurrentScript();
+
+   public boolean isCurrentThreadScript();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListener.java
new file mode 100644
index 0000000..c17c58f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestLifecycleListener {
+
+   IMethodResult preInstantiation(IEventData eventData, TestEnvironment env);
+
+   IMethodResult postInstantiation(IEventData eventData, TestEnvironment env);
+
+   IMethodResult preDispose(IEventData eventData, TestEnvironment env);
+
+   IMethodResult postDispose(IEventData eventData, TestEnvironment env);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.java
new file mode 100644
index 0000000..616e290
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.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.ote.core.framework;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ITestLifecycleListenerProvider {
+   void clear();
+
+   boolean addListener(ITestLifecycleListener listener);
+
+   boolean removeListener(ITestLifecycleListener listener);
+
+   IMethodResult notifyPostDispose(IPropertyStore propertyStore, TestEnvironment env);
+
+   IMethodResult notifyPostInstantiation(IPropertyStore propertyStore, TestScript test, TestEnvironment env);
+
+   IMethodResult notifyPreDispose(IPropertyStore propertyStore, TestScript test, TestEnvironment env);
+
+   IMethodResult notifyPreInstantiation(IPropertyStore propertyStore, TestEnvironment env);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.java
new file mode 100644
index 0000000..7b13317
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.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.core.framework;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MethodResultImpl implements IMethodResult {
+
+   public static MethodResultImpl combine(IMethodResult result1, IMethodResult result2) {
+      if (result1.getReturnCode() == ReturnCode.OK && result2.getReturnCode() == ReturnCode.OK) {
+         return new MethodResultImpl(ReturnCode.OK);
+      } else {
+         return new MethodResultImpl(result1, result2);
+      }
+   }
+
+   private List<IHealthStatus> statuses;
+   private ReturnCode returnCode;
+
+   public MethodResultImpl(ReturnCode returnCode) {
+      statuses = new ArrayList<>();
+      this.returnCode = returnCode;
+   }
+
+   private MethodResultImpl(IMethodResult result1, IMethodResult result2) {
+      if (result1.getReturnCode() != ReturnCode.OK) {
+         addStatus(result1.getStatus());
+         setReturnCode(result1.getReturnCode());
+      }
+      if (result2.getReturnCode() != ReturnCode.OK) {
+         addStatus(result2.getStatus());
+         setReturnCode(result2.getReturnCode());
+      }
+   }
+
+   @Override
+   public ReturnCode getReturnCode() {
+      return returnCode;
+   }
+
+   @Override
+   public List<IHealthStatus> getStatus() {
+      return statuses;
+   }
+
+   public void setReturnCode(ReturnCode returnCode) {
+      this.returnCode = returnCode;
+   }
+
+   public void addStatus(IHealthStatus status) {
+      statuses.add(status);
+   }
+
+   public void addStatus(List<IHealthStatus> status) {
+      statuses.addAll(status);
+   }
+
+   @Override
+   public String toString() {
+      StringBuilder sb = new StringBuilder();
+      sb.append(returnCode.toString());
+      sb.append("\n");
+      for (IHealthStatus status : statuses) {
+         sb.append(status.toString());
+         sb.append("\n");
+      }
+      return sb.toString();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java
new file mode 100644
index 0000000..5012056
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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.core.framework;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ResultBuilder {
+
+   private final MethodResultImpl result;
+   private final boolean logToHM;
+
+   public ResultBuilder(boolean logToHM) {
+      result = new MethodResultImpl(ReturnCode.OK);
+      this.logToHM = logToHM;
+   }
+
+   public MethodResultImpl append(IMethodResult result) {
+      if (logToHM) {
+         OseeLog.reportStatus(result.getStatus());
+      }
+      this.result.addStatus(result.getStatus());
+      if (result.getReturnCode() != ReturnCode.OK) {
+         this.result.setReturnCode(result.getReturnCode());
+      }
+      return this.result;
+   }
+
+   public IMethodResult get() {
+      return this.result;
+   }
+
+   public boolean isReturnStatusOK() {
+      return this.result.getReturnCode() == ReturnCode.OK;
+   }
+
+   @Override
+   public String toString() {
+      return result.toString();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.java
new file mode 100644
index 0000000..c5fd6dc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.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.core.framework;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum ReturnCode {
+   OK,
+   ERROR,
+   ABORTED
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.java
new file mode 100644
index 0000000..21ed394
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.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.ote.core.framework.adapter;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.ITestLifecycleListener;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestLifecycleListenerAdapter implements ITestLifecycleListener {
+
+   @Override
+   public IMethodResult postDispose(IEventData eventData, TestEnvironment env) {
+      return new MethodResultImpl(ReturnCode.OK);
+   }
+
+   @Override
+   public IMethodResult postInstantiation(IEventData eventData, TestEnvironment env) {
+      return new MethodResultImpl(ReturnCode.OK);
+   }
+
+   @Override
+   public IMethodResult preDispose(IEventData eventData, TestEnvironment env) {
+      return new MethodResultImpl(ReturnCode.OK);
+   }
+
+   @Override
+   public IMethodResult preInstantiation(IEventData eventData, TestEnvironment env) {
+      return new MethodResultImpl(ReturnCode.OK);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java
new file mode 100644
index 0000000..1f9e984
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.core.framework.command;
+
+import java.rmi.server.ExportException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.framework.thread.OteThreadManager;
+
+public class BaseCommandManager implements ICommandManager {
+
+   private final ExecutorService commands;
+   private final ExecutorService commandResponse;
+   private final Map<ITestServerCommand, Future<ITestCommandResult>> cmdMap;
+
+   public BaseCommandManager() {
+      OteThreadManager threadManager = OteThreadManager.getInstance();
+      commands = Executors.newSingleThreadExecutor(threadManager.createNewFactory("ote.command"));
+      commandResponse = Executors.newSingleThreadExecutor(threadManager.createNewFactory("ote.command.response"));
+      cmdMap = new ConcurrentHashMap<>();
+   }
+
+   @Override
+   public ICommandHandle addCommand(ITestServerCommand cmd, TestEnvironment context) throws ExportException {
+      OTEStatusBoard statusBoard = ServiceUtility.getService(OTEStatusBoard.class);
+      OTESessionManager sessionManager = ServiceUtility.getService(OTESessionManager.class);
+      
+      Future<ITestCommandResult> result =
+         commands.submit(new TestCallableWrapper(this, cmd, context,statusBoard, sessionManager));
+      cmdMap.put(cmd, result);
+      return cmd.createCommandHandle(result, context);
+   }
+
+   public void commandComplete(ITestServerCommand cmd, TestEnvironment context) {
+      commandResponse.submit(new TestCommandComplete(context, cmd, cmdMap.get(cmd)));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BatchLog.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BatchLog.java
new file mode 100644
index 0000000..25635ec
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BatchLog.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.ILoggerListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class BatchLog implements ILoggerListener {
+   
+   private File fileToWriteTo;
+   private FileOutputStream fos;
+   private PrintWriter out;
+   
+   public BatchLog(File fileToWriteTo){
+      this.fileToWriteTo = fileToWriteTo;
+   }
+   
+   public void open() throws FileNotFoundException{
+      fos = new FileOutputStream(fileToWriteTo);
+      out = new PrintWriter(fileToWriteTo);
+      OseeLog.registerLoggerListener(this);
+   }
+   
+   public void close(){
+      try {
+         fos.close();
+         out.close();
+      } catch (IOException e) {
+         e.printStackTrace();
+      } finally {
+         OseeLog.unregisterLoggerListener(this);
+      }
+   }
+   
+   public void flush(){
+      out.flush();
+   }
+   
+   @Override
+   public void log(String loggerName, Level level, String message, Throwable th) {
+      if(level.intValue() >= Level.SEVERE.intValue()){
+         out.printf("%s %s\n", level.getName(), message);
+         if(th != null){
+            th.printStackTrace(out);
+         }
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java
new file mode 100644
index 0000000..a5b243b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.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.core.framework.command;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface CommandCompleteListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java
new file mode 100644
index 0000000..7b70989
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.core.framework.command;
+
+
+public interface ICommandHandle {
+   boolean cancelAll(boolean mayInterruptIfRunning);
+
+   boolean cancelSingle(boolean mayInterruptIfRunning);
+
+   ITestCommandResult get();
+
+   boolean isCancelled();
+
+   boolean isDone();
+
+   String getCommandKey();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandManager.java
new file mode 100644
index 0000000..4bd98b3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandManager.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.core.framework.command;
+
+import java.rmi.server.ExportException;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ICommandManager {
+   public ICommandHandle addCommand(ITestServerCommand cmd, TestEnvironment context) throws ExportException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.java
new file mode 100644
index 0000000..f21c08b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.core.framework.command;
+
+import java.io.Serializable;
+
+public interface ITestCommandResult extends Serializable {
+   TestCommandStatus getStatus();
+
+   Throwable getThrowable();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.java
new file mode 100644
index 0000000..3d4f403
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.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.core.framework.command;
+
+import java.io.File;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+
+public interface ITestContext {
+   IRunManager getRunManager();
+
+   File getOutDir();
+
+   IServiceConnector getConnector();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java
new file mode 100644
index 0000000..ffd304a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.core.framework.command;
+
+import java.rmi.server.ExportException;
+import java.util.UUID;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+
+public interface ITestServerCommand {
+
+   UUID getUserSessionKey();
+
+   ICommandHandle createCommandHandle(Future<ITestCommandResult> result, ITestContext context) throws ExportException;
+
+   ITestCommandResult execute(TestEnvironment context, OTEStatusBoard statusBoard) throws Exception;
+
+   String getGUID();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTests.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTests.java
new file mode 100644
index 0000000..2319f8e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTests.java
@@ -0,0 +1,256 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.Future;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.framework.saxparse.ProcessOutfileOverview;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.IMessageTestContext;
+
+public class RunTests implements ITestServerCommand, Serializable {
+
+   private static final long serialVersionUID = 7408758537342855854L;
+   private static final String DEVELOPMENT = "Development";
+   
+   private final IPropertyStore global;
+   private final List<IPropertyStore> scripts;
+   private volatile boolean cancelAll = false;
+   private volatile boolean isRunning = false;
+   private final UUID sessionKey;
+   private final String commandId;
+   private TestEnvironment environment;
+   private final Configuration configuration;
+
+   public RunTests(String commandId, UUID sessionKey, Configuration configuration, IPropertyStore global, List<IPropertyStore> scripts) {
+      this.global = global;
+      this.scripts = scripts;
+      this.sessionKey = sessionKey;
+      this.commandId = commandId;
+      this.configuration = configuration;
+   }
+
+   public UUID getSessionKey() {
+      return sessionKey;
+   }
+
+   @Override
+   public ICommandHandle createCommandHandle(Future<ITestCommandResult> result, ITestContext context) throws ExportException {
+      return new RunTestsHandle(result, context, this);
+   }
+
+   @Override
+   public ITestCommandResult execute(TestEnvironment environment, OTEStatusBoard statusBoard) throws Exception {
+      ITestCommandResult retVal = TestCommandResult.SUCCESS;
+      isRunning = true;
+      IMessageTestContext msgContext = (IMessageTestContext) environment;
+      this.environment = environment;
+      
+      OTEApi ote = ServiceUtility.getService(OTEApi.class);
+      OTEServerFolder serverFolder = ote.getServerFolder();
+      
+      String testType = getTestType();
+      File batchFolder = serverFolder.getNewBatchFolder(testType);
+      batchFolder.mkdirs();
+      if(!isFolderToKeep(testType)){
+         serverFolder.markFolderForDelete(batchFolder);
+      }
+      BatchLog batchLog = new BatchLog(serverFolder.getBatchLogFile(batchFolder));
+      batchLog.open();
+      
+      File batchStatusFile = serverFolder.getBatchStatusFile(batchFolder);
+      File batchRunList = serverFolder.getBatchRunList(batchFolder);
+      
+      setBatchStatus(batchStatusFile, "running");
+      setBatchRunList(batchRunList, scripts);
+      
+      environment.setupOutfileDir(batchFolder.getAbsolutePath());
+      msgContext.resetScriptLoader(configuration, global.getArray(RunTestsKeys.classpath.name()));
+      
+      //Override the command line option only if batch abort has been selected in TestManager
+      boolean batchAbortFailMode = global.getBoolean(RunTestsKeys.batchFailAbortMode.name());
+      if(batchAbortFailMode){
+        System.setProperty("ote.abort.on.fail", "true");
+      }  
+      else {
+         System.clearProperty("ote.abort.on.fail"); 
+      }
+      
+      //Override the command line option only if batch pause has been selected in TestManager
+      boolean batchPauseFailMode = global.getBoolean(RunTestsKeys.batchFailPauseMode.name());
+      if(batchPauseFailMode){
+         System.setProperty("ote.pause.on.fail", "true");
+      }   
+      else {
+         System.clearProperty("ote.pause.on.fail");   
+      }
+
+      //Override the command line option only if batch pause has been selected in TestManager
+      boolean printOnFailMode = global.getBoolean(RunTestsKeys.printFailToConsoleMode.name());
+      if(printOnFailMode){
+         System.setProperty("ote.print.fail.to.console", "true");
+      }   
+      else {
+         System.clearProperty("ote.print.fail.to.console");   
+      }
+      
+      for (IPropertyStore store : scripts) {
+         Set<String> arrayKeySet = global.arrayKeySet();
+         for(String key:arrayKeySet){
+            String[] array = global.getArray(key);
+            if(array != null ){
+               store.put(key, array);
+            }
+         }
+         Set<String> keySet = global.keySet();
+         for(String key:keySet){
+            String val = global.get(key);
+            if(val != null ){
+               store.put(key, val);
+            }
+         }
+                 
+         if (cancelAll) {
+            statusBoard.onTestComplete(store.get(RunTestsKeys.testClass.name()),
+               store.get(RunTestsKeys.serverOutfilePath.name()),
+               store.get(RunTestsKeys.clientOutfilePath.name()), CommandEndedStatusEnum.ABORTED,
+               new ArrayList<IHealthStatus>());
+            retVal = TestCommandResult.CANCEL;
+            continue;
+
+         }
+         statusBoard.onTestStart(store.get(RunTestsKeys.testClass.name()), store.get(RunTestsKeys.serverOutfilePath.name()), store.get(RunTestsKeys.clientOutfilePath.name()));
+         IMethodResult runResults = environment.getRunManager().run(environment, store);
+
+         CommandEndedStatusEnum status = CommandEndedStatusEnum.RAN_TO_COMPLETION;
+         if (runResults.getReturnCode() == ReturnCode.ABORTED) {
+            status = CommandEndedStatusEnum.ABORTED;
+         }
+         if (runResults.getReturnCode() == ReturnCode.ERROR) {
+            status = CommandEndedStatusEnum.EXCEPTION;
+         }
+
+         statusBoard.onTestComplete(store.get(RunTestsKeys.testClass.name()),
+            store.get(RunTestsKeys.serverOutfilePath.name()), store.get(RunTestsKeys.clientOutfilePath.name()),
+            status, runResults.getStatus());
+         batchLog.flush();
+         
+         File outfile = new File(store.get(RunTestsKeys.serverOutfilePath.name()));
+         generateOutfileSummary(outfile, serverFolder.getResultsFile(outfile));
+      }
+      setBatchStatus(batchStatusFile, "complete");
+      isRunning = false;
+      batchLog.close();
+      return retVal;
+   }
+   
+   private void setBatchRunList(File batchRunList, List<IPropertyStore> scripts2) {
+      StringBuilder sb = new StringBuilder();
+      for (IPropertyStore store : scripts) {
+         sb.append(store.get(RunTestsKeys.testClass.name()));
+         sb.append("\n");
+      }
+      try {
+         Lib.writeStringToFile(sb.toString(), batchRunList);
+      } catch (IOException ex) {
+         OseeLog.log(getClass(), Level.SEVERE, "Failed to write batch run list", ex);
+      }
+   }
+
+   private void setBatchStatus(File batchStatusFile, String string) {
+      try {
+         Lib.writeStringToFile(string, batchStatusFile);
+      } catch (IOException ex) {
+         OseeLog.log(getClass(), Level.SEVERE, "Failed to write batch status", ex);
+      }
+   }
+
+   private void generateOutfileSummary(File outfile, File resultsFile){
+      String summary = getResults(outfile);
+      writeSummaryToFile(resultsFile, summary);
+   }
+   
+   private void writeSummaryToFile(File file, String summary) {
+      try {
+         Lib.writeStringToFile(summary, file);
+      } catch (IOException ex) {
+         OseeLog.log(getClass(), Level.SEVERE, "Failed to write outfile summary", ex);
+      }
+   }
+
+   private String getResults(File outfile){
+      ProcessOutfileOverview overview = new ProcessOutfileOverview();
+      FileInputStream fis = null;
+      try{
+         fis = new FileInputStream(outfile);
+         overview.run(fis);
+      } catch (Exception ex) {
+         OseeLog.log(getClass(), Level.SEVERE, "Failed to write outfile summary", ex);
+      } finally {
+         if(fis != null){
+            try {
+               fis.close();
+            } catch (IOException e) {
+               OseeLog.log(getClass(), Level.SEVERE, "Failed to close outfile", e);
+            }
+         }
+      }
+      return String.format("%s,%s,%s", overview.getScriptName(), overview.getResults(), overview.getElapsedTime());
+   }
+
+   private String getTestType(){
+      return global.get("FormalTestType");
+   }
+   
+   private boolean isFolderToKeep(String testType) {
+      if(testType != null && testType.equalsIgnoreCase(DEVELOPMENT)){
+         return false;
+      } else {
+         return true;
+      }
+   }
+
+   public boolean cancel() {
+      cancelAll = true;
+      return environment.getRunManager().abort();
+   }
+   
+   public boolean cancelSingle() {
+      return environment.getRunManager().abort();
+   }
+
+   @Override
+   public String getGUID() {
+      return commandId;
+   }
+
+   @Override
+   public UUID getUserSessionKey() {
+      return sessionKey;
+   }
+
+   boolean isRunning() {
+      return isRunning;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsHandle.java
new file mode 100644
index 0000000..1b1bbe1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsHandle.java
@@ -0,0 +1,64 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.Serializable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+
+public class RunTestsHandle implements ICommandHandle, Serializable {
+
+   private static final long serialVersionUID = 3643208660033506154L;
+   
+   private final transient Future<ITestCommandResult> result;
+   private final transient ITestContext context;
+   private final transient RunTests command;
+   private final String guid;
+
+   public RunTestsHandle(Future<ITestCommandResult> result, ITestContext context, RunTests command) {
+      this.result = result;
+      this.context = context;
+      this.command = command;
+      this.guid = GUID.create();
+   }
+
+   @Override
+   public boolean cancelAll(boolean mayInterruptIfRunning) {
+      return command.cancel();
+   }
+
+   @Override
+   public boolean cancelSingle(boolean mayInterruptIfRunning) {
+      return command.cancelSingle();
+   }
+
+   @Override
+   public ITestCommandResult get() {
+      try {
+         return result.get();
+      } catch (InterruptedException e) {
+         e.printStackTrace();
+      } catch (ExecutionException e) {
+         e.printStackTrace();
+      }
+      return null;
+   }
+
+   @Override
+   public boolean isCancelled() {
+      return false;
+   }
+
+   @Override
+   public boolean isDone() {
+      return command.isRunning();
+   }
+
+   @Override
+   public String getCommandKey() {
+      return guid;
+   }
+
+ 
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsKeys.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsKeys.java
new file mode 100644
index 0000000..a929048
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsKeys.java
@@ -0,0 +1,29 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+public enum RunTestsKeys {
+   distributionStatement,
+   executablePath,
+   classpath,
+   version_repositoryType,
+   version_location,
+   version_revision,
+   version_lastAuthor,
+   version_lastModificationDate,
+   version_modifiedFlag,
+   serverOutfilePath,
+   executableOutputPath,
+   executableDebug,
+   testClass,
+   clientOutfilePath,
+   testVersion,
+   serverOutfileFolderOverride,
+   executablePathsArray,
+   executableArg1Array,
+   executableArg2Array,
+   spare1,
+   batchFailAbortMode,
+   batchmode,
+   batchFailPauseMode,
+   printFailToConsoleMode;
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java
new file mode 100644
index 0000000..70ca276
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.core.framework.command;
+
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+
+public class TestCallableWrapper implements Callable<ITestCommandResult> {
+
+   private final ITestServerCommand cmd;
+   private final TestEnvironment context;
+   private final BaseCommandManager cmdManager;
+   private final OTEStatusBoard statusBoard;
+   private final OTESessionManager sessionManager;
+
+   public TestCallableWrapper(BaseCommandManager cmdManager, ITestServerCommand cmd, TestEnvironment context, OTEStatusBoard statusBoard, OTESessionManager sessionManager) {
+      this.cmd = cmd;
+      this.context = context;
+      this.cmdManager = cmdManager;
+      this.statusBoard = statusBoard;
+      this.sessionManager = sessionManager;
+   }
+
+   @Override
+   public ITestCommandResult call() throws Exception {
+      ITestCommandResult result;
+      try {
+         sessionManager.setActiveUser(cmd.getUserSessionKey());
+         result = cmd.execute(context, statusBoard);
+         if (result.getThrowable() != null) {
+            OseeLog.log(TestCallableWrapper.class, Level.SEVERE, result.getThrowable());
+         }
+      } catch (Throwable ex) {
+         result = new TestCommandResult(TestCommandStatus.FAIL, ex);
+         OseeLog.log(TestCallableWrapper.class, Level.SEVERE, ex);
+      } finally {
+         cmdManager.commandComplete(cmd, context);
+      }
+      return result;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.java
new file mode 100644
index 0000000..2c1c422
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.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.core.framework.command;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestCommandComplete implements Callable<ITestCommandResult> {
+
+   private ICommandHandle handle;
+   private final TestEnvironment env;
+   private Future<ITestCommandResult> future;
+   private ITestServerCommand cmd;
+
+   public TestCommandComplete(TestEnvironment env, ITestServerCommand cmd, Future<ITestCommandResult> future) {
+      this.future = future;
+      this.cmd = cmd;
+      this.env = env;
+   }
+
+   public TestCommandComplete(TestEnvironment env, ICommandHandle handle) {
+      this.env = env;
+      this.handle = handle;
+   }
+
+   @Override
+   public ITestCommandResult call() throws Exception {
+      ITestCommandResult result;
+      try {
+         result = future.get(30, TimeUnit.SECONDS);
+         ICommandHandle handle = cmd.createCommandHandle(future, env);
+         env.testEnvironmentCommandComplete(handle);
+      } catch (Throwable th) {
+         result = new TestCommandResult(TestCommandStatus.FAIL, new Exception("Failed to retrieve command result", th));
+      }
+      return result;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java
new file mode 100644
index 0000000..01c228b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.core.framework.command;
+
+public class TestCommandResult implements ITestCommandResult {
+
+   private static final long serialVersionUID = -7905997520977718355L;
+
+   public static final ITestCommandResult CANCEL = new TestCommandResult(TestCommandStatus.CANCEL);
+   public static final ITestCommandResult SUCCESS = new TestCommandResult(TestCommandStatus.SUCCESS);
+   public static final ITestCommandResult FAIL = new TestCommandResult(TestCommandStatus.FAIL);
+
+   private final TestCommandStatus status;
+   private Throwable th;
+
+   public TestCommandResult(TestCommandStatus status) {
+      this.status = status;
+   }
+
+   public TestCommandResult(TestCommandStatus status, Throwable th) {
+      this.status = status;
+      this.th = th;
+   }
+
+   @Override
+   public TestCommandStatus getStatus() {
+      return status;
+   }
+
+   @Override
+   public Throwable getThrowable() {
+      return th;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java
new file mode 100644
index 0000000..9683ac2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.core.framework.command;
+
+public enum TestCommandStatus {
+   SUCCESS,
+   FAIL,
+   CANCEL
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java
new file mode 100644
index 0000000..7565431
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+
+public class BaseEvent implements IEventData {
+
+   private final IPropertyStore propertyStore;
+   private final TestScript test;
+   private final TestCase testCase;
+
+   public BaseEvent(IPropertyStore propertyStore, TestScript test) {
+      this.propertyStore = propertyStore;
+      this.test = test;
+      this.testCase = null;
+   }
+
+   public BaseEvent(IPropertyStore propertyStore, TestScript test, TestCase testCase) {
+      this.propertyStore = propertyStore;
+      this.test = test;
+      this.testCase = testCase;
+   }
+
+   public BaseEvent(TestScript test, TestCase testCase) {
+      this.propertyStore = null;
+      this.test = test;
+      this.testCase = testCase;
+   }
+
+   public BaseEvent(TestScript test) {
+      this.test = test;
+      this.testCase = null;
+      this.propertyStore = null;
+   }
+
+   @Override
+   public TestScript getTest() {
+      return test;
+   }
+
+   @Override
+   public TestCase getTestCase() {
+      return testCase;
+   }
+
+   @Override
+   public IPropertyStore getProperties() {
+      return propertyStore;
+   }
+
+   public String getScriptClass() {
+      return propertyStore.get("classname");
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java
new file mode 100644
index 0000000..3895997
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+
+public class BaseEventDataProvider implements IEventDataProvider {
+
+   @Override
+   public IEventData getEventData(IPropertyStore propertyStore, TestScript script) {
+      return new BaseEvent(propertyStore, script);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java
new file mode 100644
index 0000000..294be54
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+
+public interface IEventData {
+   public TestScript getTest();
+
+   public TestCase getTestCase();
+
+   public IPropertyStore getProperties();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventDataProvider.java
new file mode 100644
index 0000000..aa57fd2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventDataProvider.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.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+
+public interface IEventDataProvider {
+
+   IEventData getEventData(IPropertyStore propertyStore, TestScript script);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.java
new file mode 100644
index 0000000..6ba9148
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.util.concurrent.Executor;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractInteractivePrompt<T> extends AbstractRemotePrompt implements IPromptHandle {
+
+   private final TestScript script;
+   protected Exception exception;
+   protected T response;
+
+   public AbstractInteractivePrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+      super(connector, id, message);
+      this.script = script;
+   }
+
+   public T open(Executor executor) throws InterruptedException, Exception {
+      response = null;
+      exception = null;
+      if (executor != null) {
+         // run the prompt in the background
+         executor.execute(new Runnable() {
+
+            @Override
+            public void run() {
+               try {
+                  doPrompt();
+               } catch (Exception e) {
+                  OseeLog.log(TestEnvironment.class, Level.SEVERE, "exception while performing prompt", e);
+                  // the thread that activated the prompt will be waiting on the script object's notifyAll() to
+                  // be called. If an exception occurs this may not happen so we should do it here
+                  endPrompt(null, new Exception("exception while performing prompt", e));
+               }
+            }
+         });
+      } else {
+         doPrompt();
+      }
+      return waitForResponse(script, false);
+   }
+
+   protected void endPrompt(T response, Exception exception) {
+
+      script.getTestEnvironment().getScriptCtrl().setExecutionUnitPause(false);
+      script.getTestEnvironment().getScriptCtrl().setScriptPause(false);
+      synchronized (script) {
+         this.response = response;
+         this.exception = exception;
+         script.notifyAll();
+      }
+   }
+
+   protected abstract void doPrompt() throws Exception;
+
+   protected void terminatePrompt() throws Exception {
+      getScript().getUserSession().cancelPrompts();
+   }
+
+   protected T waitForResponse(TestScript script, boolean executionUnitPause) throws InterruptedException, Exception {
+      synchronized (script) {
+         script.getTestEnvironment().getScriptCtrl().setScriptPause(true);
+         script.getTestEnvironment().getScriptCtrl().setExecutionUnitPause(executionUnitPause);
+         script.getTestEnvironment().getScriptCtrl().unlock();
+         try {
+            script.wait();
+         } catch (InterruptedException e) {
+            terminatePrompt();
+            throw new InterruptedException();
+         } finally {
+            script.getTestEnvironment().getScriptCtrl().lock();
+         }
+         return response;
+      }
+   }
+
+   /**
+    * @return the script
+    */
+   public TestScript getScript() {
+      return script;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java
new file mode 100644
index 0000000..e1e2722
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class AbstractRemotePrompt implements IPromptHandle {
+   private final String id;
+   private final String message;
+   private final IServiceConnector connector;
+
+   public AbstractRemotePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+      this.connector = connector;
+      this.id = id;
+      this.message = message;
+   }
+
+   @Override
+   public String getPromptId() throws RemoteException {
+      return id;
+   }
+
+   @Override
+   public String getPromptMessage() throws RemoteException {
+      return message;
+   }
+
+   /**
+    * returns a reference to the specified remote interface whose remote methods will be bound to this prompt object
+    * 
+    */
+   protected final <U extends IPromptHandle> U createRemoteReference(Class<U> remoteInterface) throws ExportException {
+      return remoteInterface.cast(connector.export(this));
+   }
+
+   public void close() throws Exception {
+      connector.unexport(this);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.java
new file mode 100644
index 0000000..2385333
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class BlockingMessagePrompt extends AbstractRemotePrompt implements IResumeResponse {
+
+   private final ReentrantLock lock = new ReentrantLock();
+   private final Condition responseAvailable = lock.newCondition();
+   private boolean responded;
+
+   public BlockingMessagePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+      super(connector, id, message);
+   }
+
+   /**
+    * @return true if the user did not respond within the time specified and false if the user responded in time
+    */
+   public boolean open(IUserSession session, int timeout) throws Exception {
+      lock.lock();
+      try {
+         responded = false;
+         session.initiateResumePrompt(this);
+         long nanos = TimeUnit.SECONDS.toNanos(timeout);
+
+         while (!responded) {
+            if (nanos > 0) {
+               nanos = responseAvailable.awaitNanos(0);
+            } else {
+               return true;
+            }
+         }
+         return false;
+      } finally {
+         lock.unlock();
+      }
+   }
+
+   @Override
+   public void resume() throws RemoteException {
+      lock.lock();
+      try {
+         responded = true;
+         responseAvailable.notifyAll();
+      } finally {
+         lock.unlock();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPassFailPromptResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPassFailPromptResponse.java
new file mode 100644
index 0000000..f9d31ab
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPassFailPromptResponse.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.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IPassFailPromptResponse extends IPromptHandle {
+   void respond(boolean pass, String text) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPromptHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPromptHandle.java
new file mode 100644
index 0000000..0346e11
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPromptHandle.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IPromptHandle extends Remote {
+   String getPromptId() throws RemoteException;
+
+   String getPromptMessage() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IResumeResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IResumeResponse.java
new file mode 100644
index 0000000..622e37d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IResumeResponse.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.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IResumeResponse extends IPromptHandle {
+   void resume() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ISteppingPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ISteppingPrompt.java
new file mode 100644
index 0000000..8f81017
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ISteppingPrompt.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISteppingPrompt extends IPromptHandle {
+   void step() throws RemoteException;
+
+   void resume() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IUserInputPromptResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IUserInputPromptResponse.java
new file mode 100644
index 0000000..d4aaa6f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IUserInputPromptResponse.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.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IUserInputPromptResponse extends IPromptHandle {
+   void respond(String text) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IYesNoPromptResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IYesNoPromptResponse.java
new file mode 100644
index 0000000..a9a4861
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IYesNoPromptResponse.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+public interface IYesNoPromptResponse extends IPromptHandle {
+   void respond(boolean yes) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java
new file mode 100644
index 0000000..07ddce2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.util.concurrent.Executor;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class InformationalPrompt extends AbstractRemotePrompt {
+
+   public InformationalPrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+      super(connector, id, message);
+   }
+
+   public void open(final IUserSession session, Executor executor) throws Exception {
+      if (executor != null) {
+         executor.execute(new Runnable() {
+
+            @Override
+            public void run() {
+               String message = null;
+               try {
+                  message = getPromptMessage();
+                  if (message != null) {
+                     session.initiateInformationalPrompt(getPromptMessage());
+                  } else {
+                     session.initiateInformationalPrompt("null message");
+                  }
+               } catch (Exception e) {
+                  System.out.println(message);
+               }
+            }
+         });
+      } else {
+         session.initiateInformationalPrompt(getPromptMessage());
+      }
+   }
+
+   @Override
+   public void close() {
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.java
new file mode 100644
index 0000000..31b3d2a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class NonBlockingMessagePrompt extends AbstractRemotePrompt implements IResumeResponse {
+
+   public NonBlockingMessagePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+      super(connector, id, message);
+   }
+
+   public void open(IUserSession session) throws Exception {
+
+      session.initiateResumePrompt(this);
+
+   }
+
+   @Override
+   public void resume() throws RemoteException {
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.java
new file mode 100644
index 0000000..0df027b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class OfpDebugPrompt extends ScriptPausePromptImpl {
+
+   public OfpDebugPrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+      super(connector, script, id, message);
+   }
+
+   @Override
+   public void resume() throws RemoteException {
+      super.resume();
+   }
+
+   @Override
+   protected String waitForResponse(TestScript script, boolean executionUnitPause) throws InterruptedException, Exception {
+      synchronized (script) {
+         script.getTestEnvironment().getScriptCtrl().setScriptPause(true);
+         script.getTestEnvironment().getScriptCtrl().setExecutionUnitPause(executionUnitPause);
+         script.getTestEnvironment().getScriptCtrl().unlock();
+         script.wait();
+         if (exception != null) {
+            throw exception;
+         }
+         return response;
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java
new file mode 100644
index 0000000..759a855
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class PassFailPromptImpl extends AbstractInteractivePrompt<PassFailPromptResult> implements IPassFailPromptResponse {
+
+   public PassFailPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+      super(connector, script, id, message);
+   }
+
+   @Override
+   public void doPrompt() throws Exception {
+      getScript().getUserSession().initiatePassFailPrompt(createRemoteReference(IPassFailPromptResponse.class));
+   }
+
+   @Override
+   public void respond(boolean pass, String text) throws RemoteException {
+      endPrompt(new PassFailPromptResult(pass, text), null);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java
new file mode 100644
index 0000000..7a8861f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+public class PassFailPromptResult {
+   private final boolean pass;
+   private final String text;
+
+   public PassFailPromptResult(boolean pass, String text) {
+      this.pass = pass;
+      this.text = text;
+   }
+
+   /**
+    * @return the pass
+    */
+   public boolean isPass() {
+      return pass;
+   }
+
+   /**
+    * @return the text
+    */
+   public String getText() {
+      return text;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java
new file mode 100644
index 0000000..a900523
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ScriptPausePromptImpl extends AbstractInteractivePrompt<String> implements IResumeResponse {
+
+   public ScriptPausePromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+      super(connector, script, id, message);
+   }
+
+   @Override
+   public void doPrompt() throws Exception {
+      getScript().getUserSession().initiateResumePrompt(createRemoteReference(IResumeResponse.class));
+   }
+
+   @Override
+   public void resume() throws RemoteException {
+      endPrompt("CONTINUE", null);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java
new file mode 100644
index 0000000..318205e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ScriptSteppingPrompt extends AbstractInteractivePrompt<String> implements ISteppingPrompt {
+
+   public ScriptSteppingPrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+      super(connector, script, id, message);
+   }
+
+   @Override
+   public void doPrompt() throws Exception {
+      getScript().getUserSession().initiateResumePrompt(createRemoteReference(IResumeResponse.class));
+   }
+
+   @Override
+   public void step() throws RemoteException {
+      // environment.singleStepEnv();
+      endPrompt("RESUME", null);
+   }
+
+   @Override
+   public void resume() throws RemoteException {
+
+      endPrompt("CONTINUE", null);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java
new file mode 100644
index 0000000..b12e605
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class UserInputPromptImpl extends AbstractInteractivePrompt<String> implements IUserInputPromptResponse {
+
+   public UserInputPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+      super(connector, script, id, message);
+   }
+
+   @Override
+   public void doPrompt() throws Exception {
+      getScript().getUserSession().initiateUserInputPrompt(createRemoteReference(IUserInputPromptResponse.class));
+   }
+
+   @Override
+   public void respond(String text) throws RemoteException {
+      endPrompt(text, null);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptImpl.java
new file mode 100644
index 0000000..7a1a6b1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptImpl.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+public class YesNoPromptImpl extends AbstractInteractivePrompt<YesNoPromptResult> implements IYesNoPromptResponse {
+
+   public YesNoPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+      super(connector, script, id, message);
+   }
+
+   @Override
+   public void doPrompt() throws Exception {
+      getScript().getUserSession().initiateYesNoPrompt(createRemoteReference(IYesNoPromptResponse.class));
+   }
+
+   @Override
+   public void respond(boolean yes) throws RemoteException {
+      endPrompt(new YesNoPromptResult(yes), null);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptResult.java
new file mode 100644
index 0000000..4ebd664
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptResult.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.framework.prompt;
+
+public class YesNoPromptResult {
+   private final boolean yes;
+
+   public YesNoPromptResult(boolean yes) {
+      this.yes = yes;
+   }
+
+   public boolean isYes() {
+      return yes;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java
new file mode 100644
index 0000000..d7efe94
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.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.core.framework.saxparse;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class ElementHandlers {
+
+   private final String name;
+   private final List<IBaseSaxElementListener> listeners = new ArrayList<>();
+
+   public ElementHandlers(String name) {
+      this.name = name;
+   }
+
+   public final String getElementName() {
+      return this.name;
+   }
+
+   public final void addListener(IBaseSaxElementListener listener) {
+      listeners.add(listener);
+   }
+
+   public final void removeListener(IBaseSaxElementListener listener) {
+      listeners.remove(listener);
+   }
+
+   void endElementFound(String uri, String localName, String name, String content) throws SAXException {
+      if (listeners.isEmpty()) {
+         return;
+      }
+      Object obj = createEndElementFoundObject(uri, localName, name, content);
+      for (IBaseSaxElementListener listener : listeners) {
+         listener.onEndElement(obj);
+      }
+   }
+
+   void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+      if (listeners.isEmpty()) {
+         return;
+      }
+      Object obj = createStartElementFoundObject(uri, localName, name, attributes);
+      for (IBaseSaxElementListener listener : listeners) {
+         listener.onStartElement(obj);
+      }
+   }
+
+   public abstract Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes);
+
+   public Object createEndElementFoundObject(String uri, String localName, String name, String content) {
+      return content;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java
new file mode 100644
index 0000000..f64bd7e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IBaseSaxElementListener {
+
+   void onStartElement(Object obj);
+
+   void onEndElement(Object obj);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java
new file mode 100644
index 0000000..856a773
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Actual;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.AdditionalInfo;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Argument;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Attention;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.CheckGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.CheckPoint;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Config;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.CurrentProcessor;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Debug;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ElapsedTime;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Environment;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ExecutedBy;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ExecutionDate;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Expected;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Global;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.GroupName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Info;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.InfoGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Location;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Message;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.MethodArguments;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.MethodName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Name;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Notes;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.NumberOfTransmissions;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ObjectName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.OfpErrorEntry;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.OfpLoggingInfo;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.OteLog;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.PropertyElementHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.PropertyStoreElementHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Qualification;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Requirement;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Result;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.RetryGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ReturnValue;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.RuntimeVersions;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptInit;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptResult;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptVersion;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.SoftKeyInfoGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Stacktrace;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Summary;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Support;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.SystemInfo;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestCase;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestEventElement;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPoint;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointResults;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestScript;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ThrowableElement;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Time;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TimeSummary;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Tracability;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Trace;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TraceEnd;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Type;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.User;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Value;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Version;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.VersionInformation;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Witnesses;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * XMLReader xmlReader = XMLReaderFactory.createXMLReader(); CollectionParser handler = new
+ * CollectionParser(collectors); xmlReader.setContentHandler(handler); xmlReader.parse(new InputSource(inputStream));
+ * 
+ * @author Andrew M. Finkbeiner
+ */
+public class OteSaxHandler extends AbstractSaxHandler {
+
+   Map<String, ElementHandlers> handlers;
+
+   public OteSaxHandler() throws Exception {
+      handlers = new HashMap<>();
+      addHandlers(new Global());
+      addHandlers(new AdditionalInfo());
+      addHandlers(new Actual());
+      addHandlers(new Argument());
+      addHandlers(new Attention());
+      addHandlers(new CheckGroup());
+      addHandlers(new CheckPoint());
+      addHandlers(new Config());
+      addHandlers(new CurrentProcessor());
+      addHandlers(new Debug());
+      addHandlers(new ElapsedTime());
+      addHandlers(new Environment());
+      addHandlers(new ExecutedBy());
+      addHandlers(new ExecutionDate());
+      addHandlers(new Expected());
+      addHandlers(new GroupName());
+      addHandlers(new Info());
+      addHandlers(new InfoGroup());
+      addHandlers(new Location());
+      addHandlers(new Message());
+      addHandlers(new MethodArguments());
+      addHandlers(new MethodName());
+      addHandlers(new Name());
+      addHandlers(new Notes());
+      addHandlers(new org.eclipse.osee.ote.core.framework.saxparse.elements.Number());
+      addHandlers(new NumberOfTransmissions());
+      addHandlers(new ObjectName());
+      addHandlers(new OfpErrorEntry());
+      addHandlers(new OfpLoggingInfo());
+      addHandlers(new OteLog());
+      addHandlers(new PropertyStoreElementHandler());
+      addHandlers(new PropertyElementHandler());
+      addHandlers(new Qualification());
+      addHandlers(new Requirement());
+      addHandlers(new Result());
+      addHandlers(new RetryGroup());
+      addHandlers(new ReturnValue());
+      addHandlers(new RuntimeVersions());
+      addHandlers(new ScriptInit());
+      addHandlers(new ScriptName());
+      addHandlers(new ScriptResult());
+      addHandlers(new ScriptVersion());
+      addHandlers(new SoftKeyInfoGroup());
+      addHandlers(new Stacktrace());
+      addHandlers(new Summary());
+      addHandlers(new Support());
+      addHandlers(new SystemInfo());
+      addHandlers(new TestCase());
+      addHandlers(new TestPoint());
+      addHandlers(new ThrowableElement());
+      addHandlers(new TestEventElement());
+      addHandlers(new TestPointName());
+      addHandlers(new TestPointResults());
+      addHandlers(new TestScript());
+      addHandlers(new Time());
+      addHandlers(new TimeSummary());
+      addHandlers(new Tracability());
+      addHandlers(new Trace());
+      addHandlers(new TraceEnd());
+      addHandlers(new Type());
+      addHandlers(new User());
+      addHandlers(new Value());
+      addHandlers(new Version());
+      addHandlers(new VersionInformation());
+      addHandlers(new Witnesses());
+   }
+
+   @Override
+   public void endElementFound(String uri, String localName, String name) throws SAXException {
+      ElementHandlers handler;
+
+      handler = handlers.get("*");
+      if (handler != null) {
+         handler.endElementFound(uri, localName, name, stripCData(getContents().trim()));
+      }
+
+      handler = handlers.get(name);
+      if (handler != null) {
+         handler.endElementFound(uri, localName, name, stripCData(getContents().trim()));
+      }
+   }
+
+   private String stripCData(String content) {
+      if (content.startsWith("<![CDATA[")) {
+         return content.subSequence(9, content.length() - 3).toString();
+      } else {
+         return content;
+      }
+
+   }
+
+   @Override
+   public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+      ElementHandlers handler;
+
+      handler = handlers.get("*");
+      if (handler != null) {
+         handler.startElementFound(uri, localName, name, attributes);
+      }
+
+      handler = handlers.get(name);
+      if (handler != null) {
+         handler.startElementFound(uri, localName, name, attributes);
+      } else {
+         System.out.println("No Handler for ELEMENT type " + name);
+      }
+   }
+
+   public void addHandlers(ElementHandlers handler) throws Exception {
+      Object obj = handlers.put(handler.getElementName(), handler);
+      if (obj != null) {
+         throw new Exception("Duplicate handler.");
+      }
+   }
+
+   public ElementHandlers getHandler(String elementName) {
+      return handlers.get(elementName);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ProcessOutfileOverview.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ProcessOutfileOverview.java
new file mode 100644
index 0000000..f47eb01
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ProcessOutfileOverview.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse;
+
+import java.io.InputStream;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointResultsData;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TimeSummaryData;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ProcessOutfileOverview {
+
+   private String elapsedTime;
+   private String scriptName;
+   private String results = "";
+   
+   public ProcessOutfileOverview() {
+   }
+
+   public void run(InputStream inputStream) throws Exception {
+
+      long time = System.currentTimeMillis();
+
+      XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+      OteSaxHandler handler = new OteSaxHandler();
+      xmlReader.setContentHandler(handler);
+      xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
+
+      handler.getHandler("TimeSummary").addListener(new IBaseSaxElementListener() {
+
+         @Override
+         public void onEndElement(Object obj) {
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+            if (obj instanceof TimeSummaryData) {
+               TimeSummaryData data = (TimeSummaryData) obj;
+               elapsedTime = data.getElapsed();
+            }
+         }
+
+      });
+      handler.getHandler("TestPointResults").addListener(new IBaseSaxElementListener() {
+
+         @Override
+         public void onEndElement(Object obj) {
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+            if (obj instanceof TestPointResultsData) {
+               TestPointResultsData data = (TestPointResultsData) obj;
+               String fail = data.getFail();
+               String pass = data.getPass();
+               String aborted = data.getAborted();
+               try {
+                  int failedTestPoints = Integer.parseInt(fail);
+                  int passedTestPoints = Integer.parseInt(pass);
+                  int totalTestPoints = passedTestPoints + failedTestPoints;
+                  boolean abort = false;
+                  if (aborted != null && aborted.length() > 0) {
+                     abort = Boolean.parseBoolean(aborted);
+                  }
+                  results = "";
+                  if (abort) {
+                     results = String.format("ABORTED  -  Total[%d] Fail[%d]", totalTestPoints, failedTestPoints);
+                  } else if (failedTestPoints > 0) {
+                     results = String.format("FAILED  -  Total[%d] Fail[%d]", totalTestPoints, failedTestPoints);
+                  } else {
+                     results = String.format("PASSED  -  Total[%d] Fail[%d]", totalTestPoints, failedTestPoints);
+                  }
+               } catch (NumberFormatException ex) {
+
+               }
+            }
+         }
+
+      });
+      handler.getHandler("ScriptName").addListener(new IBaseSaxElementListener() {
+
+         @Override
+         public void onEndElement(Object obj) {
+            scriptName = obj.toString();
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+         }
+      });
+   
+      xmlReader.parse(new InputSource(inputStream));
+    
+      long all = System.currentTimeMillis() - time;
+
+      OseeLog.logf(getClass(), Level.INFO, "It took %d ms total to process.", all);
+   }
+
+   public String getElapsedTime() {
+      return elapsedTime;
+   }
+
+   public String getResults() {
+      return results;
+   }
+   
+   public String getScriptName() {
+      return scriptName;
+   }
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java
new file mode 100644
index 0000000..fb181c6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Actual extends ElementHandlers {
+
+   public Actual() {
+      super("Actual");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java
new file mode 100644
index 0000000..09985cc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class AdditionalInfo extends ElementHandlers {
+
+   public AdditionalInfo() {
+      super("AdditionalInfo");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java
new file mode 100644
index 0000000..beac9fd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Argument extends ElementHandlers {
+
+   public Argument() {
+      super("Argument");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java
new file mode 100644
index 0000000..097aaff
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Attention extends ElementHandlers {
+
+   public Attention() {
+      super("Attention");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java
new file mode 100644
index 0000000..af91245
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckGroup extends ElementHandlers {
+
+   public CheckGroup() {
+      super("CheckGroup");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new CheckGroupData(attributes.getValue("Mode"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java
new file mode 100644
index 0000000..893ee74
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckGroupData {
+
+   private final String mode;
+
+   /**
+    * @return the mode
+    */
+   public String getMode() {
+      return mode;
+   }
+
+   CheckGroupData(String mode) {
+      this.mode = mode;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java
new file mode 100644
index 0000000..6ca0712
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckPoint extends ElementHandlers {
+
+   public CheckPoint() {
+      super("CheckPoint");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java
new file mode 100644
index 0000000..1c18290
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Config extends ElementHandlers {
+
+   public Config() {
+      super("Config");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new ConfigData(attributes.getValue("machineName"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java
new file mode 100644
index 0000000..5fa71f6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ConfigData {
+   private final String machineName;
+
+   /**
+    * @return the machineName
+    */
+   public String getMachineName() {
+      return machineName;
+   }
+
+   public ConfigData(String machineName) {
+      this.machineName = machineName;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java
new file mode 100644
index 0000000..f615b14
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CurrentProcessor extends ElementHandlers {
+
+   public CurrentProcessor() {
+      super("CurrentProcessor");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return attributes.getValue("proc");
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java
new file mode 100644
index 0000000..2db07a7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Debug extends ElementHandlers {
+
+   public Debug() {
+      super("Debug");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java
new file mode 100644
index 0000000..907e1fe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ElapsedTime extends ElementHandlers {
+
+   public ElapsedTime() {
+      super("ElapsedTime");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java
new file mode 100644
index 0000000..9b882c2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Environment extends ElementHandlers {
+
+   public Environment() {
+      super("Environment");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java
new file mode 100644
index 0000000..476ea07
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ExecutedBy extends ElementHandlers {
+
+   public ExecutedBy() {
+      super("ExecutedBy");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java
new file mode 100644
index 0000000..53577e7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ExecutionDate extends ElementHandlers {
+
+   public ExecutionDate() {
+      super("ExecutionDate");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java
new file mode 100644
index 0000000..2e58af7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Expected extends ElementHandlers {
+
+   public Expected() {
+      super("Expected");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Global.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Global.java
new file mode 100644
index 0000000..b5a3ac4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Global.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class Global extends ElementHandlers {
+
+   public Global() {
+      super("*");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return name;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java
new file mode 100644
index 0000000..2a6f0fa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class GroupName extends ElementHandlers {
+
+   public GroupName() {
+      super("GroupName");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java
new file mode 100644
index 0000000..9db505b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Info extends ElementHandlers {
+
+   public Info() {
+      super("Info");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new InfoData(attributes.getValue("title"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.java
new file mode 100644
index 0000000..a809c57
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.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.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class InfoData {
+
+   private final String title;
+
+   InfoData(String title) {
+      this.title = title;
+   }
+
+   /**
+    * @return the title
+    */
+   public String getTitle() {
+      return title;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java
new file mode 100644
index 0000000..77ebb4d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class InfoGroup extends ElementHandlers {
+
+   public InfoGroup() {
+      super("InfoGroup");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new InfoGroupData(attributes.getValue("title"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java
new file mode 100644
index 0000000..ae7a17f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class InfoGroupData {
+
+   private final String title;
+
+   InfoGroupData(String title) {
+      this.title = title;
+   }
+
+   /**
+    * @return the title
+    */
+   public String getTitle() {
+      return title;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java
new file mode 100644
index 0000000..35649fb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Location extends ElementHandlers {
+
+   public Location() {
+      super("Location");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java
new file mode 100644
index 0000000..24bd66c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Message extends ElementHandlers {
+
+   public Message() {
+      super("Message");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java
new file mode 100644
index 0000000..bd05ce5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MethodArguments extends ElementHandlers {
+
+   public MethodArguments() {
+      super("MethodArguments");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java
new file mode 100644
index 0000000..2bb33c3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MethodName extends ElementHandlers {
+
+   public MethodName() {
+      super("MethodName");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java
new file mode 100644
index 0000000..7f3ef63
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Name extends ElementHandlers {
+
+   public Name() {
+      super("Name");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java
new file mode 100644
index 0000000..20935d9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Notes extends ElementHandlers {
+
+   public Notes() {
+      super("Notes");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java
new file mode 100644
index 0000000..5e99840
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Number extends ElementHandlers {
+
+   public Number() {
+      super("Number");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java
new file mode 100644
index 0000000..29473b6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class NumberOfTransmissions extends ElementHandlers {
+
+   public NumberOfTransmissions() {
+      super("NumberOfTransmissions");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java
new file mode 100644
index 0000000..c8755db
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ObjectName extends ElementHandlers {
+
+   public ObjectName() {
+      super("ObjectName");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.java
new file mode 100644
index 0000000..024e891
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.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.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OfpErrorEntry extends ElementHandlers {
+
+   public OfpErrorEntry() {
+      super("OfpErrorEntry");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new OfpErrorEntryData(attributes.getValue("NODE_ID"), attributes.getValue("count"),
+         attributes.getValue("severity"), attributes.getValue("version"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.java
new file mode 100644
index 0000000..12a89d1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OfpErrorEntryData {
+
+   private final String nodeId;
+   private final String count;
+   private final String severity;
+   private final String version;
+
+   /**
+    * @return the nodeId
+    */
+   public String getNodeId() {
+      return nodeId;
+   }
+
+   /**
+    * @return the count
+    */
+   public String getCount() {
+      return count;
+   }
+
+   /**
+    * @return the severity
+    */
+   public String getSeverity() {
+      return severity;
+   }
+
+   /**
+    * @return the version
+    */
+   public String getVersion() {
+      return version;
+   }
+
+   OfpErrorEntryData(String nodeId, String count, String severity, String version) {
+      this.nodeId = nodeId;
+      this.count = count;
+      this.severity = severity;
+      this.version = version;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java
new file mode 100644
index 0000000..c57acf8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OfpLoggingInfo extends ElementHandlers {
+
+   public OfpLoggingInfo() {
+      super("OfpLoggingInfo");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java
new file mode 100644
index 0000000..3ddec0d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteLog extends ElementHandlers {
+
+   public OteLog() {
+      super("OteLog");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new OteLogData(attributes.getValue("Level"), attributes.getValue("Logger"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java
new file mode 100644
index 0000000..3e4be63
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteLogData {
+
+   private final String level;
+   private final String logger;
+
+   OteLogData(String level, String logger) {
+      this.level = level;
+      this.logger = logger;
+   }
+
+   /**
+    * @return the level
+    */
+   public String getLevel() {
+      return level;
+   }
+
+   /**
+    * @return the logger
+    */
+   public String getLogger() {
+      return logger;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandler.java
new file mode 100644
index 0000000..a040654
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandler.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PropertyElementHandler extends ElementHandlers {
+
+   public PropertyElementHandler() {
+      super("Property");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new PropertyElementHandlerData(attributes.getValue("key"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandlerData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandlerData.java
new file mode 100644
index 0000000..e203f98
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandlerData.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.core.framework.saxparse.elements;
+
+public class PropertyElementHandlerData {
+
+	private final String key;
+
+	protected PropertyElementHandlerData(String key){
+		this.key = key;
+	}
+	
+	public String getKey() {
+		return key;
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyStoreElementHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyStoreElementHandler.java
new file mode 100644
index 0000000..575f481
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyStoreElementHandler.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PropertyStoreElementHandler extends ElementHandlers {
+
+   public PropertyStoreElementHandler() {
+      super("PropertyStore");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java
new file mode 100644
index 0000000..2594011
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Qualification extends ElementHandlers {
+
+   public Qualification() {
+      super("Qualification");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new QualificationData(attributes.getValue("buildId"), attributes.getValue("level"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java
new file mode 100644
index 0000000..9ed1f3f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class QualificationData {
+
+   private final String buildId;
+   private final String level;
+
+   public QualificationData(String buildId, String level) {
+      this.buildId = buildId;
+      this.level = level;
+   }
+
+   /**
+    * @return the buildId
+    */
+   public String getBuildId() {
+      return buildId;
+   }
+
+   /**
+    * @return the level
+    */
+   public String getLevel() {
+      return level;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java
new file mode 100644
index 0000000..d14aa95
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Requirement extends ElementHandlers {
+
+   public Requirement() {
+      super("Requirement");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java
new file mode 100644
index 0000000..0f81c78
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Result extends ElementHandlers {
+
+   public Result() {
+      super("Result");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java
new file mode 100644
index 0000000..279f797
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RetryGroup extends ElementHandlers {
+
+   public RetryGroup() {
+      super("RetryGroup");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new RetryGroupData(attributes.getValue("Mode"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java
new file mode 100644
index 0000000..cd6c555
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RetryGroupData {
+
+   private final String mode;
+
+   /**
+    * @return the mode
+    */
+   public String getMode() {
+      return mode;
+   }
+
+   RetryGroupData(String mode) {
+      this.mode = mode;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ReturnValue.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ReturnValue.java
new file mode 100644
index 0000000..4087b01
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ReturnValue.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ReturnValue extends ElementHandlers {
+
+   public ReturnValue() {
+      super("ReturnValue");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java
new file mode 100644
index 0000000..ff168c6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RuntimeVersions extends ElementHandlers {
+
+   public RuntimeVersions() {
+      super("RuntimeVersions");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java
new file mode 100644
index 0000000..b749e81
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptInit extends ElementHandlers {
+
+   public ScriptInit() {
+      super("ScriptInit");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java
new file mode 100644
index 0000000..c64ec2e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptName extends ElementHandlers {
+
+   public ScriptName() {
+      super("ScriptName");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java
new file mode 100644
index 0000000..2001e3c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptResult extends ElementHandlers {
+
+   public ScriptResult() {
+      super("ScriptResult");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.java
new file mode 100644
index 0000000..787a88a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.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.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptVersion extends ElementHandlers {
+
+   public ScriptVersion() {
+      super("ScriptVersion");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new ScriptVersionData(attributes.getValue("lastAuthor"), attributes.getValue("lastModified"),
+         attributes.getValue("modifiedFlag"), attributes.getValue("repositoryType"), attributes.getValue("revision"),
+         attributes.getValue("url"));
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java
new file mode 100644
index 0000000..dcc323f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptVersionData {
+
+   private final String lastAuthor;
+   private final String lastModified;
+   private final String modifiedFlag;
+   private final String repositoryType;
+   private final String revision;
+   private final String url;
+
+   ScriptVersionData(String lastAuthor, String lastModified, String modifiedFlag, String repositoryType, String revision, String url) {
+      this.lastAuthor = lastAuthor;
+      this.lastModified = lastModified;
+      this.modifiedFlag = modifiedFlag;
+      this.repositoryType = repositoryType;
+      this.revision = revision;
+      this.url = url;
+   }
+
+   /**
+    * @return the lastAuthor
+    */
+   public String getLastAuthor() {
+      return lastAuthor;
+   }
+
+   /**
+    * @return the lastModified
+    */
+   public String getLastModified() {
+      return lastModified;
+   }
+
+   /**
+    * @return the modifiedFlag
+    */
+   public String getModifiedFlag() {
+      return modifiedFlag;
+   }
+
+   /**
+    * @return the repositoryType
+    */
+   public String getRepositoryType() {
+      return repositoryType;
+   }
+
+   /**
+    * @return the revision
+    */
+   public String getRevision() {
+      return revision;
+   }
+
+   /**
+    * @return the url
+    */
+   public String getUrl() {
+      return url;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java
new file mode 100644
index 0000000..97377c9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SoftKeyInfoGroup extends ElementHandlers {
+
+   public SoftKeyInfoGroup() {
+      super("SoftKeyInfoGroup");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new SoftKeyInfoGroupData(attributes.getValue("title"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java
new file mode 100644
index 0000000..2ac772d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SoftKeyInfoGroupData {
+
+   private final String title;
+
+   SoftKeyInfoGroupData(String title) {
+      this.title = title;
+   }
+
+   /**
+    * @return the title
+    */
+   public String getTitle() {
+      return title;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java
new file mode 100644
index 0000000..d933553
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Stacktrace extends ElementHandlers {
+
+   public Stacktrace() {
+      super("Stacktrace");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new StacktraceData(attributes.getValue("line"), attributes.getValue("source"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java
new file mode 100644
index 0000000..ba18bcd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StacktraceData {
+
+   private String line;
+   private String source;
+
+   StacktraceData() {
+   }
+
+   public StacktraceData(String line, String source) {
+      this.line = line;
+      this.source = source;
+   }
+
+   /**
+    * @return the line
+    */
+   public String getLine() {
+      return line;
+   }
+
+   /**
+    * @return the source
+    */
+   public String getSource() {
+      return source;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java
new file mode 100644
index 0000000..9a7bfb2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Summary extends ElementHandlers {
+
+   public Summary() {
+      super("Summary");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new SummaryData(attributes.getValue("CRITICAL_COUNT"), attributes.getValue("EXCEPTION_COUNT"),
+         attributes.getValue("INFORMATIONAL_COUNT"), attributes.getValue("MINOR_COUNT"),
+         attributes.getValue("NODE_ID"), attributes.getValue("SERIOUS_COUNT"), attributes.getValue("START_NUMBER"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java
new file mode 100644
index 0000000..531681d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SummaryData {
+
+   private final String criticalCount;
+   private final String exceptionCount;
+   private final String informationCount;
+   private final String minorCount;
+   private final String nodeId;
+   private final String seriousCount;
+   private final String startNumber;
+
+   SummaryData(String criticalCount, String exceptionCount, String informationCount, String minorCount, String nodeId, String seriousCount, String startNumber) {
+      this.criticalCount = criticalCount;
+      this.exceptionCount = exceptionCount;
+      this.informationCount = informationCount;
+      this.minorCount = minorCount;
+      this.nodeId = nodeId;
+      this.seriousCount = seriousCount;
+      this.startNumber = startNumber;
+   }
+
+   /**
+    * @return the criticalCount
+    */
+   public String getCriticalCount() {
+      return criticalCount;
+   }
+
+   /**
+    * @return the exceptionCount
+    */
+   public String getExceptionCount() {
+      return exceptionCount;
+   }
+
+   /**
+    * @return the informationCount
+    */
+   public String getInformationCount() {
+      return informationCount;
+   }
+
+   /**
+    * @return the minorCount
+    */
+   public String getMinorCount() {
+      return minorCount;
+   }
+
+   /**
+    * @return the nodeId
+    */
+   public String getNodeId() {
+      return nodeId;
+   }
+
+   /**
+    * @return the seriousCount
+    */
+   public String getSeriousCount() {
+      return seriousCount;
+   }
+
+   /**
+    * @return the startNumber
+    */
+   public String getStartNumber() {
+      return startNumber;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java
new file mode 100644
index 0000000..a948eda
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Support extends ElementHandlers {
+
+   public Support() {
+      super("Support");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java
new file mode 100644
index 0000000..260f8d8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SystemInfo extends ElementHandlers {
+
+   public SystemInfo() {
+      super("SystemInfo");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      SystemInfoData data =
+         new SystemInfoData(attributes.getValue("osArch"), attributes.getValue("osName"),
+            attributes.getValue("osVersion"), attributes.getValue("oseeVersion"),
+            attributes.getValue("oseeServerTitle"));
+      return data;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.java
new file mode 100644
index 0000000..8604575
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SystemInfoData {
+
+   private final String osArch;
+   private final String osName;
+   private final String osVersion;
+   private final String oseeVersion;
+   private final String oseeServerTitle;
+
+   /**
+    * @return the osArch
+    */
+   public String getOsArch() {
+      return osArch;
+   }
+
+   /**
+    * @return the osName
+    */
+   public String getOsName() {
+      return osName;
+   }
+
+   /**
+    * @return the osVersion
+    */
+   public String getOsVersion() {
+      return osVersion;
+   }
+
+   /**
+    * @return the oseeVersion
+    */
+   public String getOseeVersion() {
+      return oseeVersion;
+   }
+
+   /**
+    * @return the oseeServerTitle
+    */
+   public String getOseeServerTitle() {
+      return oseeServerTitle;
+   }
+
+   SystemInfoData(String osArch, String osName, String osVersion, String oseeVersion, String oseeServerTitle) {
+      this.osArch = osArch;
+      this.osName = osName;
+      this.osVersion = osVersion;
+      this.oseeVersion = oseeVersion;
+      this.oseeServerTitle = oseeServerTitle;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java
new file mode 100644
index 0000000..0890f34
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestCase extends ElementHandlers {
+
+   public TestCase() {
+      super("TestCase");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestEventElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestEventElement.java
new file mode 100644
index 0000000..c1eff0a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestEventElement.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestEventElement extends ElementHandlers {
+
+   public TestEventElement() {
+      super("TEST_EVENT");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java
new file mode 100644
index 0000000..30ad854
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPoint extends ElementHandlers {
+
+   public TestPoint() {
+      super("TestPoint");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java
new file mode 100644
index 0000000..d4cae71
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointName extends ElementHandlers {
+
+   public TestPointName() {
+      super("TestPointName");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java
new file mode 100644
index 0000000..f641479
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointResults extends ElementHandlers {
+
+   public TestPointResults() {
+      super("TestPointResults");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      TestPointResultsData data =
+         new TestPointResultsData(attributes.getValue("aborted"), attributes.getValue("fail"),
+            attributes.getValue("pass"), attributes.getValue("total"));
+      return data;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.java
new file mode 100644
index 0000000..260999e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointResultsData {
+
+   private final String aborted;
+
+   /**
+    * @return the aborted
+    */
+   public String getAborted() {
+      return aborted;
+   }
+
+   /**
+    * @return the fail
+    */
+   public String getFail() {
+      return fail;
+   }
+
+   /**
+    * @return the pass
+    */
+   public String getPass() {
+      return pass;
+   }
+
+   /**
+    * @return the total
+    */
+   public String getTotal() {
+      return total;
+   }
+
+   private final String fail;
+   private final String pass;
+   private final String total;
+
+   public TestPointResultsData(String aborted, String fail, String pass, String total) {
+      this.aborted = aborted;
+      this.fail = fail;
+      this.pass = pass;
+      this.total = total;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java
new file mode 100644
index 0000000..fc52df5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestScript extends ElementHandlers {
+
+   public TestScript() {
+      super("TestScript");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ThrowableElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ThrowableElement.java
new file mode 100644
index 0000000..990e972
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ThrowableElement.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ThrowableElement extends ElementHandlers {
+
+   public ThrowableElement() {
+      super("Throwable");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java
new file mode 100644
index 0000000..97b5143
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Time extends ElementHandlers {
+
+   public Time() {
+      super("Time");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java
new file mode 100644
index 0000000..df14221
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TimeSummary extends ElementHandlers {
+
+   public TimeSummary() {
+      super("TimeSummary");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      TimeSummaryData data =
+         new TimeSummaryData(attributes.getValue("elapsed"), attributes.getValue("endDate"),
+            attributes.getValue("milliseconds"), attributes.getValue("startDate"));
+      return data;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.java
new file mode 100644
index 0000000..f36f31a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TimeSummaryData {
+
+   private final String elapsed;
+
+   /**
+    * @return the elapsed
+    */
+   public String getElapsed() {
+      return elapsed;
+   }
+
+   /**
+    * @return the endDate
+    */
+   public String getEndDate() {
+      return endDate;
+   }
+
+   /**
+    * @return the milliseconds
+    */
+   public String getMilliseconds() {
+      return milliseconds;
+   }
+
+   /**
+    * @return the startDate
+    */
+   public String getStartDate() {
+      return startDate;
+   }
+   private final String endDate;
+   private final String milliseconds;
+   private final String startDate;
+
+   TimeSummaryData(String elapsed, String endDate, String milliseconds, String startDate) {
+      this.elapsed = elapsed;
+      this.endDate = endDate;
+      this.milliseconds = milliseconds;
+      this.startDate = startDate;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java
new file mode 100644
index 0000000..6cdb5ec
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Tracability extends ElementHandlers {
+
+   public Tracability() {
+      super("Tracability");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java
new file mode 100644
index 0000000..61bfd7d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Trace extends ElementHandlers {
+
+   public Trace() {
+      super("Trace");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TraceEnd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TraceEnd.java
new file mode 100644
index 0000000..e67e3a3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TraceEnd.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TraceEnd extends ElementHandlers {
+
+   public TraceEnd() {
+      super("TraceEnd");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java
new file mode 100644
index 0000000..11daefc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Type extends ElementHandlers {
+
+   public Type() {
+      super("Type");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java
new file mode 100644
index 0000000..9f0269c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class User extends ElementHandlers {
+
+   public User() {
+      super("User");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new UserData(attributes.getValue("email"), attributes.getValue("id"), attributes.getValue("name"));
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java
new file mode 100644
index 0000000..656a2be
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class UserData {
+
+   private final String email;
+   private final String id;
+   private final String name;
+
+   UserData(String email, String id, String name) {
+      this.email = email;
+      this.id = id;
+      this.name = name;
+   }
+
+   /**
+    * @return the email
+    */
+   public String getEmail() {
+      return email;
+   }
+
+   /**
+    * @return the id
+    */
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return the name
+    */
+   public String getName() {
+      return name;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java
new file mode 100644
index 0000000..c8ffaec
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Value extends ElementHandlers {
+
+   public Value() {
+      super("Value");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.java
new file mode 100644
index 0000000..daead80
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.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.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Version extends ElementHandlers {
+
+   public Version() {
+      super("Version");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return new VersionData(attributes.getValue("name"), attributes.getValue("underTest"),
+         attributes.getValue("version"), attributes.getValue("versionUnit"));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.java
new file mode 100644
index 0000000..09a4916
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.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.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class VersionData {
+
+   private final String name;
+   private final String underTest;
+   private final String version;
+   private final String versionUnit;
+
+   VersionData(String name, String underTest, String version, String versionUnit) {
+      this.name = name;
+      this.underTest = underTest;
+      this.version = version;
+      this.versionUnit = versionUnit;
+   }
+
+   /**
+    * @return the name
+    */
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @return the underTest
+    */
+   public String getUnderTest() {
+      return underTest;
+   }
+
+   /**
+    * @return the version
+    */
+   public String getVersion() {
+      return version;
+   }
+
+   /**
+    * @return the versionUnit
+    */
+   public String getVersionUnit() {
+      return versionUnit;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java
new file mode 100644
index 0000000..d869146
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class VersionInformation extends ElementHandlers {
+
+   public VersionInformation() {
+      super("VersionInformation");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java
new file mode 100644
index 0000000..6d7f568
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Witnesses extends ElementHandlers {
+
+   public Witnesses() {
+      super("Witnesses");
+   }
+
+   @Override
+   public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java
new file mode 100644
index 0000000..0b98b90
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.framework.event.BaseEvent;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public class BaseTestRunListenerDataProvider implements ITestRunListenerDataProvider {
+
+   public IEventData create(IPropertyStore properties, TestScript test, TestCase testCase) {
+      return new BaseEvent(properties, test, testCase);
+   }
+
+   @Override
+   public IEventData createOnPostRun(IPropertyStore propertyStore, TestScript test) {
+      return new BaseEvent(propertyStore, test);
+   }
+
+   @Override
+   public IEventData createOnPostTestCase(IPropertyStore propertyStore, TestScript test, TestCase testCase) {
+      return new BaseEvent(propertyStore, test, testCase);
+   }
+
+   @Override
+   public IEventData createOnPreRun(IPropertyStore propertyStore, TestScript test) {
+      return new BaseEvent(propertyStore, test);
+   }
+
+   @Override
+   public IEventData createOnPreTestCase(IPropertyStore propertyStore, TestScript test, TestCase testCase) {
+      return new BaseEvent(propertyStore, test, testCase);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java
new file mode 100644
index 0000000..7f93cde
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public class BaseTestRunListenerProvider implements ITestRunListenerProvider {
+
+   List<ITestRunListener> listeners;
+
+   public BaseTestRunListenerProvider() {
+      listeners = new CopyOnWriteArrayList<>();
+   }
+
+   @Override
+   public boolean addTestRunListener(ITestRunListener listener) {
+      return listeners.add(listener);
+   }
+
+   @Override
+   public boolean removeTestRunListener(ITestRunListener listener) {
+      return listeners.remove(listener);
+   }
+
+   @Override
+   public IMethodResult notifyPostRun(IEventData eventData) {
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      boolean failed = false;
+      for (ITestRunListener listener : listeners) {
+         try {
+            result = collectStatus(result, listener.postRun(eventData));
+         } catch (Throwable th) {
+            failed = true;
+            result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+         }
+      }
+      if (failed) {
+         result.setReturnCode(ReturnCode.ERROR);
+      }
+      return result;
+   }
+
+   @Override
+   public IMethodResult notifyPostTestCase(IEventData eventData) {
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      boolean failed = false;
+      for (ITestRunListener listener : listeners) {
+         try {
+            result = collectStatus(result, listener.postTestCase(eventData));
+         } catch (Throwable th) {
+            failed = true;
+            result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+         }
+      }
+      if (failed) {
+         result.setReturnCode(ReturnCode.ERROR);
+      }
+      return result;
+   }
+
+   @Override
+   public IMethodResult notifyPreRun(IEventData eventData) {
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      boolean failed = false;
+      for (ITestRunListener listener : listeners) {
+         try {
+            result = collectStatus(result, listener.preRun(eventData));
+         } catch (Throwable th) {
+            failed = true;
+            result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+         }
+      }
+      if (failed) {
+         result.setReturnCode(ReturnCode.ERROR);
+      }
+      return result;
+   }
+
+   @Override
+   public IMethodResult notifyPreTestCase(IEventData eventData) {
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      boolean failed = false;
+      for (ITestRunListener listener : listeners) {
+         try {
+            result = collectStatus(result, listener.preTestCase(eventData));
+         } catch (Throwable th) {
+            failed = true;
+            result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+         }
+      }
+      if (failed) {
+         result.setReturnCode(ReturnCode.ERROR);
+      }
+      return result;
+   }
+
+   private MethodResultImpl collectStatus(MethodResultImpl result, IMethodResult listenerResult) {
+      if (listenerResult.getReturnCode() != ReturnCode.OK) {
+         if (result.getReturnCode() == ReturnCode.OK) {
+            result = new MethodResultImpl(ReturnCode.OK);
+         }
+         result.setReturnCode(listenerResult.getReturnCode());
+         result.addStatus(listenerResult.getStatus());
+      }
+      return result;
+   }
+
+   /**
+    * Clearing out the listeners.
+    */
+   @Override
+   public void clear() {
+      listeners.clear();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java
new file mode 100644
index 0000000..545ee14
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+public class BaseTestRunListenerProviderFactory implements ITestRunListenerProviderFactory {
+
+   @Override
+   public ITestRunListenerDataProvider createListenerDataProvider() {
+      return new BaseTestRunListenerDataProvider();
+   }
+
+   @Override
+   public ITestRunListenerProvider createRunListenerProvider() {
+      return new BaseTestRunListenerProvider();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java
new file mode 100644
index 0000000..17af221
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.core.log.GCHelper;
+
+public class BaseTestRunManager implements ITestRunManager {
+
+   private final ITestFactory testFactory;
+   private final ITestRunListenerProviderFactory testRunListenerProviderFactory;
+
+   private TestScript test;
+   private TestRunThread testRunThread;
+   private ITestRunListenerDataProvider dataProvider;
+   private ITestRunListenerProvider listenerProvider;
+   private boolean aborted;
+
+   public BaseTestRunManager(ITestFactory testFactory, ITestRunListenerProviderFactory testRunListenerProviderFactory) {
+      this.testFactory = testFactory;
+      this.testRunListenerProviderFactory = testRunListenerProviderFactory;
+   }
+
+   @Override
+   public boolean abort() {
+      if (test != null) {
+         test.abort();
+      }
+      aborted = true;
+      if (testRunThread != null) {
+         return testRunThread.abort();
+      }
+      return true;
+   }
+
+   @Override
+   public IMethodResult run(IPropertyStore propertyStore, TestEnvironment environment) {
+      IMethodResult result = new MethodResultImpl(ReturnCode.OK);
+      if (aborted) {
+         aborted = false;
+         MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
+         methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, "USER ABORTED"));
+         result = methodresult;
+         return result;
+      }
+      try {
+         GCHelper.enable(true);
+         testRunThread = new TestRunThread(propertyStore, test, environment, listenerProvider, dataProvider);
+         testRunThread.start();
+         testRunThread.join();
+         result = testRunThread.getResult();
+      } catch (Exception ex) {
+         MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ERROR);
+         methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, ex));
+         result = methodresult;
+         OseeLog.log(Activator.class, Level.SEVERE, ex);
+      } finally {
+         GCHelper.enable(false);
+         aborted = false;
+         testRunThread = null;
+      }
+      return result;
+   }
+
+   @Override
+   public TestScript getTest() {
+      return test;
+   }
+
+   @Override
+   public IMethodResult dispose() {
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      try {
+         this.test.disposeTest();
+         this.dataProvider = null;
+         this.listenerProvider.clear();
+         this.listenerProvider = null;
+         this.test = null;
+      } catch (Exception ex) {
+         result = new MethodResultImpl(ReturnCode.ERROR);
+         result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, ex));
+         OseeLog.log(Activator.class, Level.SEVERE, ex);
+      }
+      return result;
+   }
+
+   @Override
+   public IMethodResult initialize(TestEnvironment env, IPropertyStore propertyStore) {
+      MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+      try {
+         aborted = false;
+         this.dataProvider = testRunListenerProviderFactory.createListenerDataProvider();
+         this.listenerProvider = testRunListenerProviderFactory.createRunListenerProvider();
+         this.test = testFactory.createInstance(env, propertyStore);
+         this.test.setListenerProvider(listenerProvider);
+      } catch (Exception ex) {
+         result = new MethodResultImpl(ReturnCode.ERROR);
+         result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, ex));
+         OseeLog.log(Activator.class, Level.SEVERE, ex);
+      }
+      return result;
+   }
+
+   @Override
+   public boolean abort(Throwable th, boolean wait) {
+      if (test != null) {
+         test.abort();
+      }
+      aborted = true;
+      if (testRunThread != null) {
+         return testRunThread.abort(th, wait);
+      }
+      return true;
+   }
+
+   @Override
+   public boolean isAborted() {
+      return aborted;
+   }
+
+   @Override
+   public boolean isCurrentThreadScript() {
+      if (testRunThread != null) {
+         return Thread.currentThread() == testRunThread.getThread();
+      }
+      return false;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestFactory.java
new file mode 100644
index 0000000..94f074e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestFactory.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.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ITestFactory {
+
+   TestScript createInstance(TestEnvironment env, IPropertyStore properties) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollector.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollector.java
new file mode 100644
index 0000000..44fd62f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollector.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITestResultCollector {
+
+   public void initialize(IPropertyStore propertyStore, TestEnvironment testEnvironment) throws Exception;
+
+   public void dispose(TestEnvironment testEnvironment) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollectorFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollectorFactory.java
new file mode 100644
index 0000000..7f1c25a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollectorFactory.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITestResultCollectorFactory {
+
+   public ITestResultCollector createCollector();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListener.java
new file mode 100644
index 0000000..1a7cd86
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestRunListener {
+
+   IMethodResult preRun(IEventData eventData);
+
+   IMethodResult preTestCase(IEventData eventData);
+
+   IMethodResult postTestCase(IEventData eventData);
+
+   IMethodResult postRun(IEventData eventData);
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerDataProvider.java
new file mode 100644
index 0000000..7326f7c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerDataProvider.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.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestRunListenerDataProvider {
+
+   IEventData createOnPreRun(IPropertyStore propertyStore, TestScript test);
+
+   IEventData createOnPreTestCase(IPropertyStore propertyStore, TestScript test, TestCase object);
+
+   IEventData createOnPostTestCase(IPropertyStore propertyStore, TestScript test, TestCase object);
+
+   IEventData createOnPostRun(IPropertyStore propertyStore, TestScript test);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProvider.java
new file mode 100644
index 0000000..1eaeee0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProvider.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.ote.core.framework.testrun;
+
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestRunListenerProvider {
+
+   boolean addTestRunListener(ITestRunListener listener);
+
+   boolean removeTestRunListener(ITestRunListener listener);
+
+   IMethodResult notifyPreRun(IEventData eventData);
+
+   IMethodResult notifyPreTestCase(IEventData eventData);
+
+   IMethodResult notifyPostTestCase(IEventData eventData);
+
+   IMethodResult notifyPostRun(IEventData eventData);
+
+   void clear();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProviderFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProviderFactory.java
new file mode 100644
index 0000000..0e4f4a3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProviderFactory.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.core.framework.testrun;
+
+public interface ITestRunListenerProviderFactory {
+   ITestRunListenerProvider createRunListenerProvider();
+
+   ITestRunListenerDataProvider createListenerDataProvider();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.java
new file mode 100644
index 0000000..93974e9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.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.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+
+public interface ITestRunManager {
+
+   IMethodResult initialize(TestEnvironment env, IPropertyStore propertyStore);
+
+   IMethodResult run(IPropertyStore propertyStore, TestEnvironment environment);
+
+   IMethodResult dispose();
+
+   TestScript getTest();
+
+   boolean abort();
+
+   boolean abort(Throwable th, boolean wait);
+
+   boolean isAborted();
+
+   boolean isCurrentThreadScript();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/TestRunThread.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/TestRunThread.java
new file mode 100644
index 0000000..a0a1e75
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/TestRunThread.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.ote.core.framework.testrun;
+
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OseeTestThread;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ResultBuilder;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class TestRunThread extends OseeTestThread {
+
+   private final TestScript test;
+   private final ITestRunListenerProvider listenerProvider;
+   private final ITestRunListenerDataProvider dataProvider;
+   private final IPropertyStore propertyStore;
+   private volatile boolean abort = false;
+   private final ResultBuilder rb = new ResultBuilder(false);
+
+   public TestRunThread(IPropertyStore propertyStore, TestScript test, TestEnvironment env, ITestRunListenerProvider listenerProvider, ITestRunListenerDataProvider dataProvider) {
+      super(test.getClass().getSimpleName(), env);
+      this.test = test;
+      this.listenerProvider = listenerProvider;
+      this.dataProvider = dataProvider;
+      this.propertyStore = propertyStore;
+   }
+
+   @Override
+   protected void run() throws Exception {
+      try {
+         rb.append(listenerProvider.notifyPreRun(dataProvider.createOnPreRun(propertyStore, test)));
+         if (rb.isReturnStatusOK()) {
+            List<TestCase> testCases = test.getTestCases();
+            for (int i = 0; i < testCases.size(); i++) {
+               if (abort) {
+                  Thread.interrupted();//clear the interrupted flag so that cleanup can occur without exception
+                  addAbortResult(null);
+                  i = testCases.size() - 1;//set to the last test case - TearDown
+               }
+               TestCase testCase = testCases.get(i);
+               if (testCase == null) {
+                  continue;
+               }
+               
+               rb.append(listenerProvider.notifyPreTestCase(dataProvider.createOnPreTestCase(propertyStore, test,
+                  testCase)));
+               try {
+                  testCase.baseDoTestCase(getEnvironment());
+                  if (Thread.interrupted()) {
+                     throw new InterruptedException("Thread probably aborted");
+                  }
+               } catch (Throwable ex) {
+                  if (abort) {
+                     addAbortResult(null);
+                  } else {
+                     abort = true;
+                     this.test.setAborted(true);
+                     MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
+                     Throwable clientSideThrowable = ex;
+                     if (!ex.getClass().getName().startsWith("java")) {
+                        String msg = ex.getClass().getName();
+                        if (ex.getMessage() != null && !ex.getMessage().isEmpty()) {
+                           msg += ": "+ex.getMessage();
+                        }
+                        Throwable removeThisOnceWeGetRidOfSerializationOnAssociatedException = new Throwable(msg);
+                        removeThisOnceWeGetRidOfSerializationOnAssociatedException.setStackTrace(ex.getStackTrace());
+                        clientSideThrowable = removeThisOnceWeGetRidOfSerializationOnAssociatedException;
+                     }
+                     methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, clientSideThrowable));
+                     rb.append(methodresult);
+                     OseeLog.log(
+                        Activator.class,
+                        Level.SEVERE,
+                        "Exception running Test Case [" + testCase != null ? testCase.getClass().getName() : "unknown (null test case)" + "]",
+                        ex);
+                  }
+               } 
+               rb.append(listenerProvider.notifyPostTestCase(dataProvider.createOnPostTestCase(propertyStore, test, testCase)));
+            }
+         }
+      } finally {
+         Thread.interrupted();//clear the interrupted flag so that cleanup can occur without exception
+         rb.append(listenerProvider.notifyPostRun(dataProvider.createOnPostRun(propertyStore, test)));
+         if (getEnvironment().getScriptCtrl().isLocked()) {
+            getEnvironment().getScriptCtrl().unlock();
+         }
+      }
+   }
+
+   private void addAbortResult(Throwable th) {
+      if (rb.isReturnStatusOK()) {
+         MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
+         if (th == null) {
+            methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, "USER ABORTED"));
+         } else {
+            methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+         }
+         rb.append(methodresult);
+      }
+   }
+
+   public boolean abort() {
+      abort = true;
+      this.test.setAborted(true);
+      if (Thread.currentThread() == this.getThread()) {
+         throw new TestException("", Level.SEVERE);
+      }
+      if(OtePropertiesCore.abortMultipleInterrupt.getBooleanValue()){
+    	  this.interrupt();
+    	  try{
+    		  this.join(1000*60);
+    	  } catch (InterruptedException ex){
+    	  }
+      } else {
+    	  int count = 0;
+    	  do{
+    		  this.interrupt();
+    		  try{
+    			  this.join(10);
+    		  } catch (InterruptedException ex){
+    		  }
+    		  count++;
+    	  } while (this.isAlive() && count < 200);
+      }
+      if (this.isAlive()) {
+         OseeLog.reportStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE,
+               "Waited 60s for test to abort but the thread did not die."));
+         return false;
+      }
+      return true;
+   }
+
+   public boolean abort(Throwable th, boolean wait) {
+      if (abort) {
+         return true;
+      }
+      abort = true;
+      this.test.setAborted(true);
+      addAbortResult(th);
+      if (Thread.currentThread() == this.getThread()) {
+         throw new TestException("", Level.SEVERE);
+      }
+      this.interrupt();
+      return true;
+   }
+
+   public IMethodResult getResult() {
+      return rb.get();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThread.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThread.java
new file mode 100644
index 0000000..add930b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThread.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.framework.thread;
+
+public class OteThread extends Thread {
+
+   protected OteThread(String name) {
+      super(name);
+
+   }
+
+   protected OteThread(Runnable arg0, String name) {
+      super(arg0, name);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.java
new file mode 100644
index 0000000..ba82b5e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.core.framework.thread;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteThreadFactory implements ThreadFactory {
+
+   private final List<WeakReference<OteThread>> threads;
+   private final String threadName;
+
+   protected OteThreadFactory(String threadName) {
+      this.threadName = threadName;
+      this.threads = new CopyOnWriteArrayList<>();
+   }
+
+   @Override
+   public Thread newThread(Runnable runnable) {
+      OteThread thread = new OteThread(runnable, threadName + ":" + threads.size());
+      this.threads.add(new WeakReference<OteThread>(thread));
+      return thread;
+   }
+
+   public List<OteThread> getThreads() {
+      List<OteThread> toReturn = new ArrayList<>();
+      for (WeakReference<OteThread> weak : threads) {
+         OteThread thread = weak.get();
+         if (thread != null) {
+            toReturn.add(thread);
+         }
+      }
+      return toReturn;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadManager.java
new file mode 100644
index 0000000..d5c4f7a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadManager.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.core.framework.thread;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteThreadManager {
+
+   private static OteThreadManager instance = null;
+
+   private final Map<String, OteThreadFactory> factories;
+
+   private OteThreadManager() {
+      this.factories = new HashMap<>();
+   }
+
+   public static OteThreadManager getInstance() {
+      if (instance == null) {
+         instance = new OteThreadManager();
+      }
+      return instance;
+   }
+
+   public ThreadFactory createNewFactory(String threadName) {
+      OteThreadFactory factory = new OteThreadFactory(threadName);
+      factories.put(threadName, factory);
+      return factory;
+   }
+
+   public List<OteThread> getThreadsFromFactory(String key) {
+      OteThreadFactory factory = factories.get(key);
+      return factory.getThreads();
+   }
+
+   public Set<String> getFactories() {
+      return factories.keySet();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java
new file mode 100644
index 0000000..7e98b4e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * 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.core.internal;
+
+import java.util.Hashtable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.core.util.ServiceDependencyTracker;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OteProperties;
+import org.eclipse.osee.ote.core.StandardShell;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommandManager;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+import org.eclipse.osee.ote.core.log.GCHelper;
+import org.eclipse.osee.ote.message.internal.MessageIoManagementStarter;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Ryan D. Brooks
+ */
+public class Activator implements BundleActivator {
+
+   private ServiceRegistration testEnvironmentRegistration;
+   private static Activator activator;
+   private BundleContext bundleContext;
+   private final CompositeKeyHashMap<String, ServiceTrackerCustomizer, ServiceTracker> serviceTrackers =
+      new CompositeKeyHashMap<String, ServiceTrackerCustomizer, ServiceTracker>();
+   private ConsoleCommandManager consoleCommandManager;
+   private StandardShell stdShell;
+   private ServiceRegistration consoleCommandRegistration;
+   private ServiceDependencyTracker serviceDependencyTracker;
+   private MessageIoManagementStarter messageIoManagementStarter;
+   private ServiceTracker testEnvTracker;
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      activator = this;
+      GCHelper.installGCMonitoring();
+      bundleContext = context;
+      consoleCommandManager = new ConsoleCommandManager();
+      if (OteProperties.isOteCmdConsoleEnabled()) {
+         stdShell = new StandardShell(consoleCommandManager);
+         stdShell.start();
+      } else {
+         stdShell = null;
+      }
+      consoleCommandRegistration =
+         context.registerService(ICommandManager.class.getName(), consoleCommandManager, new Hashtable());
+
+      serviceDependencyTracker = new ServiceDependencyTracker(bundleContext, new StatusBoardRegistrationHandler());
+      serviceDependencyTracker.open();
+      
+      testEnvTracker = new ServiceTracker(context, TestEnvironmentInterface.class.getName(), null);
+      testEnvTracker.open(true);
+      
+      messageIoManagementStarter = new MessageIoManagementStarter(context);
+      messageIoManagementStarter.open(true);
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      serviceDependencyTracker.close();
+      closeAllValidServiceTrackers();
+      unregisterTestEnvironment();
+      if (stdShell != null) {
+         stdShell.shutdown();
+      }
+      consoleCommandManager.shutdown();
+      consoleCommandRegistration.unregister();
+      
+      messageIoManagementStarter.close();
+      testEnvTracker.close();
+   }
+
+   public static Activator getInstance() {
+      return activator;
+   }
+
+   public void registerTestEnvironment(TestEnvironment env) {
+      if (testEnvironmentRegistration != null) {
+         testEnvironmentRegistration.unregister();
+      }
+      testEnvironmentRegistration =
+         bundleContext.registerService(TestEnvironmentInterface.class.getName(), env, new Hashtable());
+   }
+
+   public void unregisterTestEnvironment() {
+      if (testEnvironmentRegistration != null) {
+         testEnvironmentRegistration.unregister();
+         testEnvironmentRegistration = null;
+      }
+   }
+
+   public ServiceTracker getServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+      ServiceTracker tracker = findServiceTracker(clazz, customizer);
+      if (tracker == null) {
+         tracker = createNewServiceTracker(clazz, customizer);
+      }
+      return tracker;
+   }
+
+   private ServiceTracker createNewServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+      ServiceTracker tracker = new ServiceTracker(bundleContext, clazz, customizer);
+      tracker.open(true);
+      serviceTrackers.put(clazz, customizer, tracker);
+      return tracker;
+   }
+
+   private ServiceTracker findServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+      return serviceTrackers.get(clazz, customizer);
+   }
+
+   private void closeAllValidServiceTrackers() {
+      for (ServiceTracker tracker : serviceTrackers.values()) {
+         if (tracker != null) {
+            tracker.close();
+         }
+      }
+   }
+   
+   public static TestEnvironmentInterface getTestEnvironment() {
+	   try {
+		   return (TestEnvironmentInterface) getInstance().testEnvTracker.waitForService(20000);
+	   } catch (InterruptedException e) {
+		   OseeLog.log(Activator.class, Level.SEVERE, e);
+	   }
+	   return null;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/OTESessionManagerImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/OTESessionManagerImpl.java
new file mode 100644
index 0000000..7476b89
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/OTESessionManagerImpl.java
@@ -0,0 +1,60 @@
+package org.eclipse.osee.ote.core.internal;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OTESessionManager;
+
+public class OTESessionManagerImpl implements OTESessionManager {
+
+   private Map<UUID, IUserSession> userMap;
+   private UUID activeUserId;
+   
+   public OTESessionManagerImpl(){
+      userMap = new ConcurrentHashMap<>();
+   }
+   
+   @Override
+   public void add(UUID sessionId, IUserSession session) {
+      userMap.put(sessionId, session);
+   }
+
+   @Override
+   public void remove(UUID sessionId) {
+      userMap.remove(sessionId);
+   }
+
+   @Override
+   public IUserSession get(UUID sessionId) {
+      if(sessionId == null){
+         return null;
+      }
+      return userMap.get(sessionId);
+   }
+
+   @Override
+   public Set<UUID> get() {
+      return userMap.keySet();
+   }
+
+   @Override
+   public IUserSession getActiveUser() {
+      IUserSession session = get(activeUserId);
+      if(session == null){
+         if(userMap.size() > 0){
+            UUID id = userMap.keySet().iterator().next();
+            session = get(id);
+         }
+      }
+      return session;
+   }
+
+   @Override
+   public void setActiveUser(UUID sessionId) {
+      this.activeUserId = sessionId;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/StatusBoardRegistrationHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/StatusBoardRegistrationHandler.java
new file mode 100644
index 0000000..dfcc023
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/StatusBoardRegistrationHandler.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.core.internal;
+
+import java.util.Map;
+import org.eclipse.osee.framework.core.util.AbstractTrackingHandler;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.environment.status.StatusBoard;
+import org.osgi.framework.BundleContext;
+
+public class StatusBoardRegistrationHandler extends AbstractTrackingHandler {
+
+   private final static Class<?>[] SERVICE_DEPENDENCIES = new Class<?>[] {
+      OTEStatusBoard.class,
+      TestEnvironmentInterface.class};
+   private TestEnvironmentInterface testEnv;
+   private StatusBoard statusBoard;
+
+   @Override
+   public Class<?>[] getDependencies() {
+      return SERVICE_DEPENDENCIES;
+   }
+
+   @Override
+   public void onActivate(BundleContext context, Map<Class<?>, Object> services) {
+
+      testEnv = getService(TestEnvironmentInterface.class, services);
+      statusBoard = (StatusBoard) getService(OTEStatusBoard.class, services);
+      testEnv.addEnvironmentListener(statusBoard);
+   }
+
+   @Override
+   public void onDeActivate() {
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java
new file mode 100644
index 0000000..5ea731c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.core.log;
+
+import java.util.logging.ConsoleHandler;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Env extends Logger {
+
+   private static Env instance = null;
+
+   public static Env getInstance() {
+      if (instance == null) {
+         instance = new Env(null, Level.ALL); // FileHandler was giving problems sometimes.
+      }
+      return instance;
+   }
+
+   public static Env getInstance(Class<?> newClass, Level level) {
+      if (instance == null) {
+         instance = new Env(newClass, level);
+      }
+      return instance;
+   }
+
+   private Env(Class<?> handlerType, Level level) {
+      super("osee.test.core.log.EnvServiceLogger", null);
+      Handler handler;
+      if (handlerType == FileHandler.class) {
+         try {
+            handler = new FileHandler("TestEnvLog_" + this.hashCode() + "%g.log");
+         } catch (Exception e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+            handler = new ConsoleHandler();
+         }
+      } else {
+         handler = new ConsoleHandler();
+      }
+      handler.setLevel(level);
+      this.setLevel(level);
+      this.addHandler(handler);
+   }
+
+   public void debug(String message) {
+      try {
+         log(Level.FINE, message);
+      } catch (Exception e) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+      }
+   }
+
+   public void exception(Throwable ex) {
+      try {
+         throwing("", "", ex);
+      } catch (Exception e) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+      }
+   }
+
+   public void message(String message) {
+      try {
+         log(Level.INFO, message);
+      } catch (Exception e) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+      }
+   }
+
+   public void close() {
+      Handler[] handlers = Env.instance.getHandlers();
+      for (int i = 0; i < handlers.length; i++) {
+         handlers[i].close();
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/GCHelper.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/GCHelper.java
new file mode 100644
index 0000000..701ef4e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/GCHelper.java
@@ -0,0 +1,221 @@
+package org.eclipse.osee.ote.core.log;
+
+import java.lang.management.GarbageCollectorMXBean;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import javax.management.Notification;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationListener;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+public class GCHelper {
+   
+   private static final String installGCMonitoring = System.getProperty("org.eclipse.osee.ote.gcmonitor", "true");
+   
+   
+   private static volatile boolean enableLog = false;
+   
+   public static void enable(boolean enable){
+      enableLog = enable;
+   }
+   
+   public static void installGCMonitoring(){
+      if(Boolean.parseBoolean(installGCMonitoring)){
+         List<GarbageCollectorMXBean> gcbeans = java.lang.management.ManagementFactory.getGarbageCollectorMXBeans();
+         for (GarbageCollectorMXBean gcbean : gcbeans) {
+            NotificationEmitter emitter = (NotificationEmitter) gcbean;
+            NotificationListener listener = new GCListener();
+            emitter.addNotificationListener(listener, null, null);
+         }
+      }
+    }
+   
+   private static class GCListener implements NotificationListener {
+
+      private GCNotification gcData;
+
+      public void printCompositeDataSupport(Object obj, int level){
+         if(obj instanceof CompositeDataSupport){
+            CompositeDataSupport dataSupport = (CompositeDataSupport)obj;
+            CompositeType type = dataSupport.getCompositeType();
+            for(String key : type.keySet()){
+               Object value = dataSupport.get(key);
+               if(value instanceof CompositeDataSupport || value instanceof TabularDataSupport){
+                  printCompositeDataSupport(value, level + 1);
+               } else {
+                  if(!populateCompositeData(key, type, value)){
+                     for(int i = 0; i < level; i++){
+                        System.out.print("   ");
+                     }
+                     System.out.printf("key[%s] desc[%s] value[%s] class[%s]\n", key , type.getDescription(key), value, value.getClass().getName());
+                  }
+               }
+            }
+         } else if (obj instanceof TabularDataSupport){
+            TabularDataSupport dataSupport = (TabularDataSupport)obj;
+            TabularType type = dataSupport.getTabularType();
+            for(Object value : dataSupport.values()){
+               if(value instanceof CompositeDataSupport || value instanceof TabularDataSupport){
+                  printCompositeDataSupport(value, level + 1);
+               } else {
+                  System.out.println("nope");
+               }
+            }
+         }
+         else {
+            if(!populateGenericValue(obj)){
+               for(int i = 0; i < level; i++){
+                  System.out.print("   ");
+               }
+               System.out.printf("valud[%s] class[%s]\n", obj, obj.getClass().getName());
+            }
+         }
+      }
+
+      private boolean populateCompositeData(String key, CompositeType type, Object value) {
+         if(key.equals("GcThreadCount")){
+            gcData.threadCount = (Integer)value;
+            return true;
+         } else if (key.equals("duration")){
+            gcData.duration = (Long)value;
+            return true;
+         } else if (key.equals("endTime")){
+            gcData.endtime = (Long)value;
+            return true;
+         } else if (key.equals("startTime")){
+            gcData.startTime = (Long)value;
+            return true;
+         } else if (key.equals("id")){
+            //ignore
+            return true;
+         } else if (key.equals("key")){
+            gcData.currentGcMemory = new GCMemory();
+            gcData.currentGcMemory.memType = GCMemory.getType(value);
+            if(gcData.currentGcMemory.memType == GCMemory.type.unknown){
+               System.out.printf("unknown mem type [%s]\n", value);
+            }
+            gcData.memory.add(gcData.currentGcMemory);
+            return true;
+         } else if (key.equals("committed")){
+            gcData.currentGcMemory.committed = (Long)value;
+            return true;
+         }else if (key.equals("init")){
+            gcData.currentGcMemory.init = (Long)value;
+            return true;
+         }else if (key.equals("max")){
+            gcData.currentGcMemory.max = (Long)value;
+            return true;
+         }else if (key.equals("used")){
+            gcData.currentGcMemory.used = (Long)value;
+            return true;
+         }
+         return false;
+      }
+
+      private boolean populateGenericValue(Object obj) {
+         if(obj.toString().equals("end of minor GC")){
+            gcData.isMinor = true;
+            return true;
+         } else if(obj.toString().equals("end of major GC")){
+            gcData.isMajor = true;
+            return true;
+         } else if (obj.toString().equals("System.gc()") || obj.toString().equals("Metadata GC Threshold") || obj.toString().equals("Allocation Failure") || 
+               obj.toString().equals("PS Scavenge") || obj.toString().equals("PS MarkSweep") || obj.toString().equals("ParNew") || obj.toString().equals("GCLocker Initiated GC")){
+            if(gcData.reason == null){
+               gcData.reason = obj.toString();
+            } else {
+               gcData.reason = gcData.reason +", " + obj.toString();
+            }
+            return true;
+         }
+         return false;
+      }
+
+      //implement the notifier callback handler
+      @Override
+      public void handleNotification(Notification notification, Object handback) {
+         if(enableLog){
+            gcData = new GCNotification();
+            Object userData = notification.getUserData();
+            if(userData instanceof CompositeDataSupport){
+               CompositeDataSupport dataSupport = (CompositeDataSupport)userData;
+               for(Object obj :dataSupport.values()){
+                  printCompositeDataSupport(obj, 0);
+               }
+
+            } else {
+               System.out.printf("%s - %s\n", userData.getClass().getName(), userData);
+            }
+            OseeLog.log(GCHelper.class, Level.INFO, gcData.toString());
+         }
+      }
+   }
+   
+   public static class GCNotification {
+      
+      public String reason;
+      public Long startTime;
+      public GCMemory currentGcMemory;
+
+      enum gcType { psScavenge, psMarkSweep; }
+      
+      private gcType type;
+      private boolean isMajor = false;
+      private boolean isMinor = false;
+      private int threadCount;
+      private long duration;
+      private long endtime;
+      private long id;
+      
+      private List<GCMemory> memory;
+      
+      public GCNotification(){
+         memory = new ArrayList<GCHelper.GCMemory>();
+         currentGcMemory = new GCMemory();
+      }
+      
+      public String toString(){
+         return String.format("GC %s - %s - elapsedTime[%d]", (isMajor ? "major" : "minor"), reason, duration);
+      }
+   }
+   
+   public static class GCMemory {
+      enum type { compressedClassSpace, psSurvivorSpace, parSurvivorSpace, psOldGen, parOldGen, psEdenSpace, parEdenSpace, Metaspace, CodeCache, unknown; }
+      
+      private type memType;
+      private long committed;
+      private long init;
+      private long max;
+      private long used;
+      
+      public static org.eclipse.osee.ote.core.log.GCHelper.GCMemory.type getType(Object value) {
+         if(value.equals("Compressed Class Space")){
+            return type.compressedClassSpace;
+         } else if (value.equals("PS Survivor Space")){
+            return type.psSurvivorSpace;
+         } else if (value.equals("PS Old Gen")){
+            return type.psOldGen;
+         } else if (value.equals("Metaspace")){
+            return type.Metaspace;
+         } else if (value.equals("PS Eden Space")){
+            return type.psEdenSpace;
+         } else if (value.equals("Code Cache")){
+            return type.CodeCache;
+         } else if (value.equals("Par Survivor Space")){
+            return type.parSurvivorSpace;
+         } else if (value.equals("CMS Old Gen")){
+            return type.parOldGen;
+         } else if (value.equals("Par Eden Space")){
+            return type.parEdenSpace;
+         } 
+         return type.unknown;
+      }
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java
new file mode 100644
index 0000000..b30196b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.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.core.log;
+
+/**
+ * @author John Butler
+ */
+public interface ITestPointTally {
+
+   /**
+    * Resets the test point pass and fail counts to zero.
+    */
+   public void reset();
+
+   /**
+    * Records test point result.
+    * 
+    * @param pass test point result. <b>True</b> for passing. <b>False</b> for failing.
+    * @return The total number of test points recorded.
+    */
+   public int tallyTestPoint(boolean pass);
+
+   /**
+    * @return The total number of test points recorded.
+    */
+   public int getTestPointTotal();
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java
new file mode 100644
index 0000000..d6c51d9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * 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.core.log;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.log.record.ScriptInitRecord;
+import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
+import org.eclipse.osee.ote.core.log.record.TestCaseRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecordEnd;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.ProcessingInstruction;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class ScriptLogHandler extends Handler {
+   private final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+   protected Element testCaseElement;
+   protected Element parent;
+   protected Element child;
+   protected Element testScriptElement;
+   protected Element scriptInitElement;
+   protected Document document;
+   private final File outFile;
+   private final List<LogRecord> records;
+
+   /**
+    * ScriptLogHandler Constructor. Sets the outfile to log to and the test script that will be logged. It also
+    * establishes the xml format to be used.
+    * 
+    * @param outFile Reference to the outfile that will be used to output the log.
+    */
+   public ScriptLogHandler(File outFile, TestEnvironment testEnvironment) {
+      GCHelper.getGCHelper().addRefWatch(this);
+      this.outFile = outFile;
+      OseeLog.log(TestEnvironment.class, Level.FINE, outFile.getAbsolutePath());
+
+      try {
+         factory.setNamespaceAware(true);
+         DocumentBuilder builder = factory.newDocumentBuilder();
+         document = builder.newDocument();
+      } catch (ParserConfigurationException ex) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
+      }
+
+      ProcessingInstruction processingInstruction =
+         document.createProcessingInstruction("xml-stylesheet",
+            "type=\"text/xsl\" href=\"" + getXSLTransformName() + "\"");
+      document.appendChild(processingInstruction);
+      records = new ArrayList<>();
+
+      document.appendChild(document.createComment("OUTFILE_COMMNET"));
+
+      this.testScriptElement = document.createElement("TestScript");
+      this.scriptInitElement = document.createElement("ScriptInit");
+      document.appendChild(testScriptElement);
+      this.parent = this.testScriptElement;
+   }
+
+   public String getXSLTransformName() {
+      return "outputNormal.xsl";
+   }
+
+   /**
+    * Write out the log file to the outfile.
+    */
+   public void writeOutFile() {
+      try {
+         Jaxp.writeXmlDocument(document, outFile, Jaxp.getPrettyFormat());
+      } catch (Throwable th) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, th);
+      }
+   }
+
+   @Override
+   public synchronized void publish(LogRecord logRecord) {
+      if (isLoggable(logRecord)) {
+         records.add(logRecord);
+      }
+   }
+
+   public synchronized void flushRecords() {
+      try {
+         for (int i = 0; i < records.size(); i++) {
+            LogRecord logRecord = records.get(i);
+
+            if (logRecord instanceof TestRecord) {
+               TestRecord record = (TestRecord) logRecord;
+               child = record.toXml(document);
+
+               if (record instanceof TestCaseRecord) {
+                  testCaseElement = child;
+                  testScriptElement.appendChild(testCaseElement);
+                  parent = testCaseElement;
+               } else {
+
+                  if (record instanceof ScriptResultRecord) {
+                     testScriptElement.appendChild(child);
+                  } else if (record instanceof ScriptInitRecord) {
+                     if (((ScriptInitRecord) record).getStartFlag()) {
+                        // We are doing it this way so that it is chronologically accurate in the xml.
+                        if (scriptInitElement.getParentNode() == null) {
+                           testScriptElement.appendChild(scriptInitElement);
+                        }
+                        parent = scriptInitElement;
+                     } else {
+                        parent = testScriptElement;
+                     }
+                  } else {
+                     parent.appendChild(child);
+                     if (record instanceof TraceRecord) {// method began
+                        parent = child;
+                     } else if (record instanceof TraceRecordEnd) {// method ended
+                        if (parent.getParentNode() != null) {
+                           parent = (Element) parent.getParentNode();
+                        }
+                     }
+                  }
+               }
+            } else {
+               if (parent != null) {
+                  Element el = document.createElement("OteLog");
+                  el.setAttribute("Level", logRecord.getLevel().getLocalizedName());
+                  el.setAttribute("Logger", logRecord.getLoggerName());
+                  Element msg = document.createElement("Message");
+                  msg.appendChild(document.createTextNode(logRecord.getMessage()));
+                  el.appendChild(msg);
+
+                  if (logRecord.getThrown() != null) {
+
+                     try {
+                        StringWriter sw = new StringWriter();
+                        PrintWriter pw = new PrintWriter(sw);
+                        logRecord.getThrown().printStackTrace(pw);
+                        pw.close();
+
+                        Element thrown = document.createElement("Throwable");
+                        thrown.appendChild(document.createTextNode(sw.toString()));
+                        el.appendChild(thrown);
+                     } catch (Exception ex) {
+                     }
+                  }
+                  parent.appendChild(el);
+               }
+            }
+         }
+      } catch (Exception ex) {
+         ex.printStackTrace();
+      } finally {
+         records.clear();
+      }
+   }
+
+   @Override
+   public void close() throws SecurityException {
+
+      writeOutFile();
+   }
+
+   @Override
+   public void flush() {
+      // don't call this method
+
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java
new file mode 100644
index 0000000..919ac24
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * 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.core.log;
+
+import java.util.logging.Level;
+
+/**
+ * @author Michael A. Winston
+ */
+public class TestLevel extends Level {
+
+   private static final long serialVersionUID = -3898810954576373823L;
+
+   public final static TestLevel TEST_POINT = new TestLevel("TestPoint", Level.SEVERE.intValue() + 10);
+   public final static TestLevel ATTENTION = new TestLevel("Attention", Level.WARNING.intValue() + 30);
+   public final static TestLevel REQUIREMENT = new TestLevel("Requirement", Level.WARNING.intValue() + 20);
+   public final static TestLevel SUPPORT = new TestLevel("Support", Level.INFO.intValue() + 30);
+   public final static TestLevel MESSAGING = new TestLevel("Messaging", Level.INFO.intValue() + 20);
+   public final static TestLevel TRACE = new TestLevel("Trace", Level.INFO.intValue() + 10);
+   public final static TestLevel DEBUG = new TestLevel("Debug", Level.FINE.intValue());
+
+   /**
+    * TestLevel Constructor. Sets a level name and value.
+    * 
+    * @param name The level name.
+    * @param value The level value.
+    */
+   private TestLevel(String name, int value) {
+      super(name, value);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java
new file mode 100644
index 0000000..2cf1f2d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ * 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.core.log;
+
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.eclipse.osee.ote.core.log.record.AttentionRecord;
+import org.eclipse.osee.ote.core.log.record.DebugRecord;
+import org.eclipse.osee.ote.core.log.record.InfoRecord;
+import org.eclipse.osee.ote.core.log.record.RequirementRecord;
+import org.eclipse.osee.ote.core.log.record.SevereRecord;
+import org.eclipse.osee.ote.core.log.record.SupportRecord;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecordEnd;
+import org.eclipse.osee.ote.core.log.record.WarningRecord;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ * @author Charles Shaw
+ */
+public class TestLogger extends Logger implements ITestLogger {
+
+   /**
+    * TestLogger Constructor. Sets logging level and filter.
+    */
+   public TestLogger() {
+      super("osee.test.core.log", null);
+      setLevel(Level.ALL);
+   }
+
+   /**
+    * For communicating with the user running an interactive script only allowed in interactive scripts (use sparingly).
+    */
+   public void attention(ITestEnvironmentAccessor source, String message) {
+      // TODO: this is not just a straight log
+      log(new AttentionRecord(source, message));
+   }
+
+   /**
+    * Records a debugging message in the log. Will never be seen during demos.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param message The log message.
+    */
+   @Override
+   public void debug(ITestEnvironmentAccessor source, String message) {
+      log(new DebugRecord(source, message));
+   }
+
+   /**
+    * Records a debugging message in the log. Will never be seen during the demos.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param message The log message.
+    * @param timeStamp <b>True</b> if you want a time stamp included, <b>False</b> if you do not.
+    */
+   @Override
+   public void debug(ITestEnvironmentAccessor source, String message, boolean timeStamp) {
+      log(new DebugRecord(source, message, timeStamp));
+   }
+
+   /**
+    * Records a warning message in the log.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param message The log message.
+    */
+   @Override
+   public void warning(ITestEnvironmentAccessor source, String message) {
+      log(new WarningRecord(source, message));
+   }
+
+   /**
+    * Internal - logging from, say, guts of messaging API
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param message The log message.
+    */
+   @Override
+   public void support(ITestEnvironmentAccessor source, String message) {
+      log(new SupportRecord(source, message));
+   }
+
+   /**
+    * Records a severe message in the log.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param message The log message.
+    */
+   @Override
+   public void severe(ITestEnvironmentAccessor source, String message) {
+      log(new SevereRecord(source, message));
+   }
+
+   /**
+    * Records a severe message in the log.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    */
+   @Override
+   public void severe(Object source, Throwable thrown) {
+      throwing(source.getClass().getName(), null, thrown);
+   }
+
+   @Override
+   public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, boolean passed, String testPointName, String exp, String act) {
+      log(new TestPointRecord(env, script, testCase, testPointName, exp, act, passed));
+   }
+
+   @Override
+   public void testpoint(TestPointRecord record) {
+      log(record);
+   }
+
+   @Override
+   public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, ITestPoint testPoint) {
+      log(new TestPointRecord(env, script, testCase, testPoint));
+   }
+
+   /**
+    * Records that a test case began in the log.
+    * 
+    * @param testCase The test case whose start is to be recorded.
+    */
+   @Override
+   public void testCaseBegan(TestCase testCase) {
+      log(testCase.getTestRecord());
+   }
+
+   /**
+    * Record a trace event. Such as when a function starts or stops.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    */
+   public void trace(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments) {
+      log(new TraceRecord(source, objectName, methodName, methodArguments));
+   }
+
+   public void endtrace(ITestEnvironmentAccessor source, ReturnFormatter methodArguments) {
+      log(new TraceRecordEnd(source, methodArguments));
+   }
+
+   /**
+    * Record a requirement to the log.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param message The log message.
+    */
+   public void requirement(ITestEnvironmentAccessor source, String message) {
+      log(new RequirementRecord(source, message));
+   }
+
+   /**
+    * Log the beginning of a method with no arguments.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    */
+   @Override
+   public void methodCalled(ITestEnvironmentAccessor source) {
+      methodCalled(source, new MethodFormatter(), 2);
+   }
+
+   /**
+    * Log the beginning of a method with a formatted string holding the arguments.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param arguments The arguments in a formatted string.
+    */
+   @Override
+   public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments) {
+      methodCalled(source, arguments, 2);
+   }
+
+   //   /**
+   //    * Log the beginning of a method with a the MethodFormatter formatted argument object.
+   //    *
+   //    * @param source The object requesting the logging (Usually "this" is passed in).
+   //    * @param methodFormat Reference to the MethodFormatter formatted argument list.
+   //    */
+   //   public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter methodFormat) {
+   //      methodCalled(source, methodFormat, 2);
+   //   }
+
+   /**
+    * Log the beginning of a method.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param arguments The arguments in a formatted string.
+    * @param methodCount The number of methods called to reach this point.
+    */
+   public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments, int methodCount) {
+      String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
+      trace(source, "", methodName, arguments);
+   }
+
+   /**
+    * Log the start of a method with the object variable name.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param objectName The class variable name.
+    */
+   @Override
+   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName) {
+      methodCalledOnObject(source, objectName, new MethodFormatter(), 2);
+   }
+
+   //   /**
+   //    * Log the start of a method with the object variable name and a formatted string with the
+   //    * arguments.
+   //    *
+   //    * @param source The object requesting the logging (Usually "this" is passed in).
+   //    * @param objectName The class variable name.
+   //    * @param arguments The arguments in a formatted string.
+   //    */
+   //   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments) {
+   //      methodCalledOnObject(source, objectName, arguments, 2);
+   //   }
+
+   /**
+    * Log the start of a method with the object variable name and a MethodFormatter formatted argument object.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param objectName The class variable name.
+    * @param methodFormat Reference to the MethodFormatter formatted argument list.
+    */
+   @Override
+   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat) {
+      methodCalledOnObject(source, objectName, methodFormat, 2);
+   }
+
+   /**
+    * Log the start of a method with the object variable name.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    * @param objectName The class variable name.
+    * @param arguments The arguments in a formatted string.
+    * @param methodCount The number of methods called to reach this point.
+    */
+   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments, int methodCount) {
+
+      String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
+      trace(source, objectName, methodName, arguments);
+   }
+
+   /**
+    * Specifies that a method has ended. This must be paired with the methodBegin() call.
+    * 
+    * @param source The object requesting the logging (Usually "this" is passed in).
+    */
+   @Override
+   public void methodEnded(ITestEnvironmentAccessor source) {
+      endtrace(source, new ReturnFormatter());
+   }
+
+   @Override
+   public void methodEnded(ITestEnvironmentAccessor source, ReturnFormatter returnFormatter) {
+      endtrace(source, returnFormatter);
+   }
+
+   @Override
+   public void log(TestRecord record) {
+      this.log((LogRecord) record);
+   }
+
+   @Override
+   public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject) {
+      methodCalledOnObject(source, objectName, methodFormat, xmlObject, 2);
+   }
+
+   private void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject, int methodCount) {
+      String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
+      TraceRecord record = new TraceRecord(source, objectName, methodName, methodFormat, true);
+      record.addAdditionalElement(xmlObject);
+      if (xmlObject instanceof XmlizableStream) {
+         record.addAdditionalElement((XmlizableStream) xmlObject);
+      }
+      log(record);
+   }
+
+   @Override
+   public void log(ITestEnvironmentAccessor source, Level level, String message, Throwable th) {
+      if(level.intValue() >= Level.SEVERE.intValue()){
+         SevereRecord severe = new SevereRecord(source, message, true);
+         severe.setThrown(th);
+         this.log(severe);
+      } else if (level.intValue() >= Level.WARNING.intValue()){
+         WarningRecord warn = new WarningRecord(source, message, true);
+         warn.setThrown(th);
+         this.log(warn);
+      } else if (level.intValue() >= Level.INFO.intValue()){
+         InfoRecord info = new InfoRecord(source, message, true);
+         info.setThrown(th);
+         this.log(info);
+      } else {
+         this.log(level, message, th);
+      }
+   }
+
+ 
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java
new file mode 100644
index 0000000..018aa08
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Charles Shaw
+ */
+public class AttentionRecord extends TestRecord {
+
+   private static final long serialVersionUID = -6974833259038544176L;
+
+   /**
+    * AttentionRecord Constructor. Sets up generic message log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    * @param timeStamp <b>True</b> if a timestamp should be recorded, <b>False</b> if not.
+    */
+   public AttentionRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+      super(source, TestLevel.ATTENTION, msg, timeStamp);
+   }
+
+   /**
+    * MessagingRecord Constructor. Sets up generic message log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    */
+   public AttentionRecord(ITestEnvironmentAccessor source, String msg) {
+      this(source, msg, true);
+   }
+
+   /**
+    * Converts log element to XML format.
+    * 
+    * @return xml formated element.
+    */
+   @Override
+   public Element toXml(Document doc) {
+      Element recordElement = doc.createElement(getLevel().getName());
+      recordElement.appendChild(Jaxp.createElement(doc, "Message", getMessage()));
+      //      for (Xmlizable object : getAdditionalXml()) {
+      //         recordElement.appendChild(object.toXml(doc));
+      //      }
+      if (TestRecord.getLocationLoggingOn()) {
+         recordElement.appendChild(getLocation(doc));
+      }
+      return recordElement;
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement(getLevel().getName());
+      writeLocationCheckLocationLoggingOn(writer);
+      writeMessage(writer);
+      writer.writeEndElement();
+   }
+   
+   @JsonProperty
+   @Override
+   public Level getLevel() {
+	   return super.getLevel();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java
new file mode 100644
index 0000000..3d28e07
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class DebugRecord extends TestRecord {
+
+   private static final long serialVersionUID = -5340996017961551683L;
+
+   /**
+    * DebugRecord Constructor. Invokes TestRecord with the log message source, the log message, and the ability to
+    * include a timestamp.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    * @param timeStamp <b>True </b> if time stamp should be logged, <b>False </b> if not.
+    */
+   public DebugRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+      super(source, TestLevel.DEBUG, msg, timeStamp);
+   }
+
+   /**
+    * DebugRecord Constructor. Invokes TestRecord with the log message source and the log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    */
+   public DebugRecord(ITestEnvironmentAccessor source, String msg) {
+      this(source, msg, true);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java
new file mode 100644
index 0000000..4ec5383
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.XmlSupport;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ErrorRecord extends TestRecord {
+    private static final long serialVersionUID = -9083013356154141017L;
+    private final String executionResult;
+    private final String executionMessage;
+    private final boolean printTimeStamp;
+    private long timeStamp;
+
+    public ErrorRecord(ITestEnvironmentAccessor source, Level level, String executionResult, Throwable throwable, boolean timeStamp) {
+        super(source, level, executionResult, false);
+        this.executionResult = executionResult;
+        this.executionMessage = getThrowbableMessage(throwable);
+        this.printTimeStamp = timeStamp;
+        if (timeStamp) {
+            if (source != null) {
+                if (source instanceof TestEnvironment) {
+                    TestEnvironment env = (TestEnvironment) source;
+                    if (env.getTestScript() != null) {
+                        this.timeStamp = System.currentTimeMillis() - env.getTestScript().getStartTime().getTime();
+                    } else {
+                        this.timeStamp = new Date().getTime();
+                    }
+                }
+            } else {
+                this.timeStamp = new Date().getTime();
+                try {
+                    throw new Exception("source was null");
+                } catch (Exception e) {
+                    OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+                }
+            }
+        }
+    }
+
+    private String getThrowbableMessage(Throwable throwable) {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        pw.println("Exception " + throwable.getClass().getName() + ": " + throwable.getMessage());
+        throwable.printStackTrace(new PrintWriter(sw));
+        return sw.toString();
+    }
+
+    @Override
+    public Element toXml(Document doc) {
+        Element root = doc.createElement("ExecutionStatus");
+        if (this.printTimeStamp) {
+            root.appendChild(Jaxp.createElement(doc, "Time", Long.toString(timeStamp)));
+        }
+        root.appendChild(Jaxp.createElement(doc, "ExecutionResult", XmlSupport.sanitizeXMLContent(executionResult)));
+        root.appendChild(Jaxp.createElement(doc, "ExecutionDetails", XmlSupport.sanitizeXMLContent(executionMessage)));
+        return root;
+    }
+
+    @Override
+    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+        writer.writeStartElement("ExecutionStatus");
+        writeTime(writer);
+        writeElement(writer, "ExecutionResult", XmlSupport.sanitizeXMLContent(executionResult));
+        writeElement(writer, "ExecutionDetails", XmlSupport.sanitizeXMLContent(executionMessage));
+        writer.writeEndElement();
+    }
+
+    public String getExecutionResult() {
+        return executionResult;
+    }
+
+    public String getExecutionMessage() {
+        return executionMessage;
+    }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/InfoRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/InfoRecord.java
new file mode 100644
index 0000000..7c6ed0d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/InfoRecord.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+public class InfoRecord extends TestRecord {
+
+   private static final long serialVersionUID = -3124953320400273382L;
+
+   /**
+    * InfoRecord Constructor. Sets up a Warning log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+    */
+   public InfoRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+      super(source, Level.INFO, msg, timeStamp);
+   }
+
+   /**
+    * InfoRecord Constructor. Sets up a Warning log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    */
+   public InfoRecord(ITestEnvironmentAccessor source, String msg) {
+      this(source, msg, true);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ParentLogRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ParentLogRecord.java
new file mode 100644
index 0000000..e12af0d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ParentLogRecord.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class ParentLogRecord extends LogRecord {
+    private static final long serialVersionUID = 684361479587503820L;
+    private Collection<LogRecord> records = new ArrayList<>();
+
+    public ParentLogRecord() {
+        super(Level.OFF, "");
+    }
+
+    public void addChild(final LogRecord testPoint) {
+        records.add(testPoint);
+    }
+
+    @JsonProperty
+    public Collection<LogRecord> getChildRecords() {
+        return records;
+    }
+    
+    @Override
+   @JsonIgnore
+    public Level getLevel() {
+        return super.getLevel();
+    };
+    
+    @Override
+   @JsonIgnore
+    public String getMessage() {
+        return super.getMessage();
+    };
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecord.java
new file mode 100644
index 0000000..30576b6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecord.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.core.log.record;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+
+public class PropertyStoreRecord extends TestRecord {
+
+	private static final long serialVersionUID = -6515147544821433102L;
+	private IPropertyStore store;
+
+	public PropertyStoreRecord(IPropertyStore store) {
+		super(null, Level.INFO, "PropertyStoreRecord", false);
+		this.store = store;
+	}
+
+	@Override
+	public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+		writer.writeStartElement("PropertyStore");
+		if(store != null){
+			for(String key:store.keySet()){
+				String message = store.get(key);
+				writer.writeStartElement("Property");
+				writer.writeAttribute("key", key);
+				writer.writeCharacters(message);
+				writer.writeEndElement();
+			}
+		}
+		writer.writeEndElement();
+	}
+	
+	@JsonProperty
+	public Map<String, String> getProperties() {
+		Map<String, String> result = new HashMap<>();
+		if (store != null && !store.isEmpty()) {
+			for (String key : store.keySet()) {
+				if (nonEmptyString(store.get(key)) != null) {
+					result.put(key, store.get(key));
+				}
+			}
+			return result;
+		} else {
+			return null;
+		}
+	}
+	
+	@Override
+   @JsonIgnore
+	public String getMessage() {
+		return super.getMessage();
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java
new file mode 100644
index 0000000..927c750
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RequirementRecord extends TestRecord {
+
+   private static final long serialVersionUID = -3533522844275324310L;
+
+   /**
+    * RequirementRecord Constructor. Sets up a Requirement log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+    */
+   public RequirementRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+      super(source, TestLevel.REQUIREMENT, msg, timeStamp);
+   }
+
+   /**
+    * RequirementRecord Constructor. Sets up a Requirement log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    */
+   public RequirementRecord(ITestEnvironmentAccessor source, String msg) {
+      this(source, msg, true);
+   }
+   
+   @JsonProperty
+   public String getRequirement() {
+	   return getMessage();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java
new file mode 100644
index 0000000..02c5a3b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.config.ScriptVersionConfig;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptConfigRecord extends TestRecord {
+    private ScriptVersionConfig scriptVersionRecord;
+    private String userName;
+    private String userEmail;
+    private String userId;
+    private static final long serialVersionUID = 6919229589873467398L;
+
+    /**
+     * ScriptConfigRecord Constructor. Constructs test script configuration log
+     * message with timestamp.
+     * 
+     * @param script
+     *            The test script who's configuration is to be recorded.
+     * @param timeStamp
+     *            <b>True </b> if a timestamp should be recorded, <b>False </b>
+     *            if not.
+     */
+    public ScriptConfigRecord(TestScript script, boolean timeStamp) {
+        super(script.getTestEnvironment(), TestLevel.TEST_POINT, script.getClass().getName(), timeStamp);
+    }
+
+    /**
+     * ScriptConfigRecord Constructor. Constructs test script configuration log
+     * message.
+     * 
+     * @param script
+     *            The test script who's configuration is to be recorded.
+     */
+    public ScriptConfigRecord(TestScript script) {
+        this(script, true);
+    }
+
+    /**
+     * Convert an element to XML format.
+     * 
+     * @return XML formated config element.
+     */
+    @Override
+    public Element toXml(Document doc) {
+        Element configElement = doc.createElement(BaseTestTags.CONFIG_ENTRY);
+        try {
+            configElement.setAttribute("machineName", InetAddress.getLocalHost().getHostName());
+        } catch (DOMException e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+        } catch (UnknownHostException e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+        }
+        configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.SCRIPT_NAME, getMessage()));
+        Element user = doc.createElement("User");
+        user.setAttribute("name", this.userName);
+        user.setAttribute("email", this.userEmail);
+        user.setAttribute("id", this.userId);
+        configElement.appendChild(user);
+        if (scriptVersionRecord != null) {
+            configElement.appendChild(scriptVersionRecord.toXml(doc));
+        }
+        // if (executedBy != null) {
+        // configElement.appendChild(executedBy.toXml(doc));
+        // }
+        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
+        configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.EXECUTION_DATE, dateFormat.format(new Date()).toString()));
+        TestScript script = ((TestEnvironment) this.getSource()).getTestScript();
+        if (script != null) {
+            configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.ENVIRONMENT_FIELD, script.getType().toString()));
+        } else {
+            // script is null
+            configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.ENVIRONMENT_FIELD, "Null Script"));
+        }
+        return configElement;
+    }
+
+    @Override
+    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+        writer.writeStartElement(BaseTestTags.CONFIG_ENTRY);
+        try {
+            writer.writeAttribute("machineName", InetAddress.getLocalHost().getHostName());
+        } catch (DOMException e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+        } catch (UnknownHostException e) {
+            OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+        }
+        writeElement(writer, BaseTestTags.SCRIPT_NAME, getMessage());
+        writer.writeStartElement("User");
+        writer.writeAttribute("name", this.userName);
+        writer.writeAttribute("email", this.userEmail);
+        writer.writeAttribute("id", this.userId);
+        writer.writeEndElement();
+        if (scriptVersionRecord != null) {
+            scriptVersionRecord.toXml(writer);
+        }
+        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
+        writeElement(writer, BaseTestTags.EXECUTION_DATE, dateFormat.format(new Date()).toString());
+        TestScript script = ((TestEnvironment) this.getSource()).getTestScript();
+        if (script != null) {
+            writeElement(writer, BaseTestTags.ENVIRONMENT_FIELD, script.getType().toString());
+        } else {
+            // script is null
+            writeElement(writer, BaseTestTags.ENVIRONMENT_FIELD, "Null Script");
+        }
+        writer.writeEndElement();
+    }
+
+    @JsonProperty
+    public ScriptVersionConfig getScriptVersionRecord() {
+        return scriptVersionRecord;
+    }
+
+    public void setScriptVersion(ScriptVersionConfig scriptVersionRecord) {
+        this.scriptVersionRecord = scriptVersionRecord;
+    }
+
+    public void setExecutedBy(String name, String email, String id) {
+        this.userName = name;
+        this.userEmail = email;
+        this.userId = id;
+    }
+
+    @JsonProperty
+    public String getMachineName() {
+        try {
+            return InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @JsonProperty
+    public User getUser() {
+        return new User(this.userName, this.userEmail, this.userId);
+    }
+
+    public class User {
+        private String name, email, id;
+
+        @JsonCreator
+        public User(final String name, final String email, final String id) {
+            this.name = name;
+            this.email = email;
+            this.id = id;
+        }
+
+        @JsonProperty
+        public String getName() {
+            return nonEmptyString(name);
+        }
+
+        @JsonProperty
+        public String getEmail() {
+            return nonEmptyString(email);
+        }
+
+        @JsonProperty
+        public String getId() {
+            return nonEmptyString(id);
+        }
+    }
+
+    @JsonProperty
+    public String getExecutionDate() {
+        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
+        return dateFormat.format(new Date()).toString();
+    }
+
+    @JsonProperty
+    public String getEnvironment() {
+        TestScript script = ((TestEnvironment) this.getSource()).getTestScript();
+        if (script != null) {
+            return script.getType().toString();
+        } else {
+            return null;
+        }
+    }
+
+    @JsonIgnore
+    @Override
+    public List<String> getLocation() {
+        return super.getLocation();
+    }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java
new file mode 100644
index 0000000..82f75cb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.LogRecord;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptInitRecord extends TestRecord {
+
+   private static final long serialVersionUID = -8573603873316659237L;
+   private final boolean startFlag;
+
+   /**
+    * ScriptInitRecord Constructor. Constructs test script configuration log message with timestamp.
+    * 
+    * @param script The test script who's configuration is to be recorded.
+    * @param timeStamp <b>True</b> if a timestamp should be recorded, <b>False</b> if not.
+    */
+   public ScriptInitRecord(TestScript script, boolean timeStamp, boolean startFlag) {
+      super(script.getTestEnvironment(), TestLevel.TEST_POINT, script.getClass().getName(), timeStamp);
+      this.startFlag = startFlag;
+   }
+
+   /**
+    * ScriptConfigRecord Constructor. Constructs test script configuration log message.
+    * 
+    * @param script The test script who's configuration is to be recorded.
+    * @param startFlag true for the beginning of init, false for the end.
+    */
+   public ScriptInitRecord(TestScript script, boolean startFlag) {
+      this(script, true, startFlag);
+   }
+
+   /**
+    * Returns whether this is the start of the init or end.
+    * 
+    * @return <b>true</b> if start of the script init, <b>false</b> if the end.
+    */
+   public boolean getStartFlag() {
+      return startFlag;
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      //This element is not added to the output xml.
+      //It is here because ScriptLogHandler creates an
+      //element out of the record and adds it to the xml.
+      //We don't add it, but it was necessary to create the
+      //element so that we could test for ScriptInitRecord.
+      return doc.createElement("ScriptInit");
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement("ScriptInit");
+   }
+
+   @Override
+   @JsonProperty("Script")
+   public String getMessage() {
+	   return super.getMessage();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java
new file mode 100644
index 0000000..bd2ca93
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptResultRecord extends TestRecord {
+    private static final long serialVersionUID = -6132341487630154239L;
+    private final List<Xmlizable> childElements;
+    private final List<XmlizableStream> childStreamElements;
+
+    /**
+     * ScriptConfigRecord Constructor. Constructs test script configuration log
+     * message with timestamp.
+     * 
+     * @param script
+     *            The test script who's configuration is to be recorded.
+     * @param timeStamp
+     *            <b>True </b> if a timestamp should be recorded, <b>False </b>
+     *            if not.
+     */
+    public ScriptResultRecord(TestScript script) {
+        super(script.getTestEnvironment(), TestLevel.TEST_POINT, script.getClass().getName(), false);
+        childElements = new ArrayList<>(1000);
+        childStreamElements = new ArrayList<>(100);
+    }
+
+    public void addChildElement(Xmlizable xml) {
+        childElements.add(xml);
+    }
+
+    public void addChildElement(XmlizableStream xml) {
+        childStreamElements.add(xml);
+    }
+
+    /**
+     * Convert an element to XML format.
+     * 
+     * @return XML formated config element.
+     */
+    @Override
+    public Element toXml(Document doc) {
+        Element result = doc.createElement("ScriptResult");
+        for (Xmlizable xml : childElements) {
+            result.appendChild(xml.toXml(doc));
+        }
+        childElements.clear();
+        return result;
+    }
+
+    @Override
+    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+        writer.writeStartElement("ScriptResult");
+        for (XmlizableStream xml : childStreamElements) {
+            xml.toXml(writer);
+        }
+        writer.writeEndElement();
+    }
+
+    @JsonProperty
+    public List<XmlizableStream> getResults() {
+        return childStreamElements;
+    }
+
+    @Override
+   @JsonProperty("ScriptName")
+    public String getMessage() {
+        return super.getMessage();
+    }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.java
new file mode 100644
index 0000000..3744987
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.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.ote.core.log.record;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SevereRecord extends TestRecord {
+
+   private static final long serialVersionUID = -2717539209163922501L;
+
+   /**
+    * SevereRecord Constructor. Sets up a Severe log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+    */
+   public SevereRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+      super(source, Level.SEVERE, msg, timeStamp);
+   }
+
+   /**
+    * SevereRecord Constructor. Sets up a Severe log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    */
+   public SevereRecord(ITestEnvironmentAccessor source, String msg) {
+      this(source, msg, true);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.java
new file mode 100644
index 0000000..bd6a08c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.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.ote.core.log.record;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SupportRecord extends TestRecord {
+
+   private static final long serialVersionUID = 6889265206495780451L;
+
+   /**
+    * SupportRecord Constructor. Sets up a Support log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+    */
+   public SupportRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+      super(source, TestLevel.SUPPORT, msg, timeStamp);
+   }
+
+   /**
+    * SupportRecord Constructor. Sets up a Support log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    */
+   public SupportRecord(ITestEnvironmentAccessor source, String msg) {
+      this(source, msg, true);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java
new file mode 100644
index 0000000..a99f64b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class TestCaseRecord extends TestRecord {
+    private static final long serialVersionUID = -5049608072548003705L;
+    private final TestCase testCase;
+
+    /**
+     * TestCaseRecorded Constructor. Sets up a test case log message.
+     * 
+     * @param source
+     *            The object requesting the logging.
+     * @param testCase
+     *            The current test case to be logged.
+     */
+    public TestCaseRecord(ITestEnvironmentAccessor source, TestCase testCase) {
+        super(source, TestLevel.TEST_POINT, "Test Case " + testCase.getTestCaseNumber() + " began.", true);
+        this.testCase = testCase;
+        if (testCase.getTestEnvironment() == null) {
+            OseeLog.log(TestEnvironment.class, Level.INFO, "env null");
+        }
+        /*
+         * else if (testCase.getTestEnvironment().getStatusBoard() == null)
+         * OseeLog.log(Activator.class, Level.INFO, "nullstatus board");
+         * testCase
+         * .getTestEnvironment().getStatusBoard().setCurrentScriptCurrentTestCase
+         * (testCase.getTestCaseNumber());
+         */
+    }
+
+    /**
+     * Convert an element to XML format.
+     * 
+     * @return XML formated element.
+     */
+    @Override
+    public Element toXml(Document doc) {
+        return testCase.toXml(doc);
+    }
+
+    @Override
+    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+        testCase.toXml(writer);
+    }
+    
+    @JsonProperty
+    public TestCase getTestCase() {
+        return testCase;
+    }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java
new file mode 100644
index 0000000..d4fb6ba
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class TestDescriptionRecord extends TestRecord {
+
+   private static final long serialVersionUID = -2188431468814850228L;
+   private String purpose;
+   private String preCondition;
+   private String postCondition;
+
+   public TestDescriptionRecord(ITestEnvironmentAccessor testEnvironment) {
+      super(testEnvironment, TestLevel.TEST_POINT, "Description Record", false);
+      this.purpose = " ";
+      this.preCondition = " ";
+      this.postCondition = " ";
+   }
+
+   public void setPurpose(String purpose) {
+      this.purpose = purpose;
+   }
+
+   public void setPreCondition(String preCondition) {
+      this.preCondition = preCondition;
+   }
+
+   public void setPostCondition(String postCondition) {
+      this.postCondition = postCondition;
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      Element root = doc.createElement(BaseTestTags.DESCRIPTION_FIELD);
+      root.appendChild(Jaxp.createElement(doc, BaseTestTags.PURPOSE_FIELD, purpose));
+      root.appendChild(Jaxp.createElement(doc, BaseTestTags.PRECONDITION_FIELD, preCondition));
+      root.appendChild(Jaxp.createElement(doc, BaseTestTags.POSTCONDITION_FIELD, postCondition));
+      return root;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java
new file mode 100644
index 0000000..c9d659d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Robert A. Fisher
+ * @author Charles Shaw
+ */
+public class TestPointRecord extends TestRecord {
+   private static final long serialVersionUID = 921875066237859323L;
+    private int number;
+    protected ITestPoint testPoint;
+
+    public TestPointRecord(ITestEnvironmentAccessor source, ITestPoint testPoint, boolean timeStamp) {
+        this(source, source.getTestScript(), source.getTestScript().getTestCase(), testPoint, timeStamp);
+    }
+
+    /**
+     * TestPointRecord Constructor. Sets up a test point record of the result of
+     * the test point.
+     * 
+     * @param source
+     *            The object requesting the logging.
+     * @param accessor
+     *            The test case the test point is in.
+     * @param testPoint
+     *            The TestSubPoint object for the test point.
+     * @param timeStamp
+     *            <b>True </b> if a timestamp should be recorded, <b>False </b>
+     *            if not.
+     */
+    public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase accessor, ITestPoint testPoint, boolean timeStamp) {
+        super(source, TestLevel.TEST_POINT, "", timeStamp);
+        this.testPoint = testPoint;
+        script.__addTestPoint(testPoint.isPass());
+        // this.testCase = accessor.getTestCase();
+        if (accessor == null) {
+            // OseeLog.log(Activator.class, Level.INFO, "test case null");
+        } else if (accessor.getTestScript() == null) {
+            OseeLog.log(TestEnvironment.class, Level.INFO, "test script null");
+        }
+        if (testPoint == null) {
+            OseeLog.log(TestEnvironment.class, Level.INFO, "test point null");
+        }
+        this.number = script.__recordTestPoint(testPoint.isPass());
+    }
+
+    /**
+     * TestPointRecord Constructor. Sets up a test point record of the result of
+     * the test point
+     * 
+     * @param source
+     *            The object requesting the logging.
+     * @param testPoint
+     *            The TestPoint object for the test point.
+     */
+    public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase testCase, ITestPoint testPoint) {
+        this(source, script, testCase, testPoint, true);
+        int point = script.getCurrentPointNumber();  
+        
+        if (!testPoint.isPass()) {
+           try {
+              if (testPoint instanceof CheckPoint) {
+                 CheckPoint cp = (CheckPoint) testPoint;
+                 String exp = cp.getExpected();
+                 String act = cp.getActual();
+                 String name = cp.getTestPointName();
+                 Throwable th = new Throwable();
+                 StringBuilder stack = new StringBuilder();
+                 boolean printLine = false;
+                 for (StackTraceElement element : th.getStackTrace()) {
+                    if (!printLine && !element.toString().startsWith("org.eclipse.osee")) {
+                       printLine = true;
+                    }
+                    if (printLine){
+                       stack.append(element.toString());
+                       stack.append("\n");
+                    }
+                 }
+                 script.pauseScriptOnFail(point, name, exp, act, stack.toString()); 
+                 script.printFailure(point, name, exp, act, stack.toString());
+              }
+              else {
+                 script.pauseScriptOnFail(point);
+                 script.printFailure(point);
+              }
+           } catch (InterruptedException e) {
+              e.printStackTrace();
+           }
+        }
+    }
+
+    /**
+     * TestPointRecord Constructor. Sets up a test point record of the result of
+     * the test point.
+     * 
+     * @param source
+     *            The object requesting the logging.
+     * @param script
+     *            The test script object
+     * @param testCase
+     *            The test case object
+     * @param testPointName
+     *            The name of the item being tested.
+     * @param expected
+     *            The expected value for the test point.
+     * @param actual
+     *            The actual value for the test point.
+     * @param passed
+     *            <b>True </b> if the test point passed, <b>False </b> if not.
+     * @param timeStamp
+     *            <b>True </b> if a timestamp should be recorded, <b>False </b>
+     *            if not.
+     */
+    public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase testCase, String testPointName, String expected, String actual,
+            boolean passed, boolean timeStamp) {
+        this(source, script, testCase, new CheckPoint(testPointName, expected, actual, passed), timeStamp);
+    }
+
+    /**
+     * TestPointRecord Constructor. Sets up a test point record of the result of
+     * the test point.
+     * 
+     * @param source
+     *            The object requesting the logging.
+     * @param accessor
+     *            The test case the test point is in.
+     * @param testPointName
+     *            The name of the item being tested.
+     * @param expected
+     *            The expected value for the test point.
+     * @param actual
+     *            The actual value for the test point.
+     * @param passed
+     *            <b>True </b> if the test point passed, <b>False </b> if not.
+     */
+    public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase accessor, String testPointName, String expected, String actual,
+            boolean passed) {
+        this(source, script, accessor, testPointName, expected, actual, passed, true);
+    }
+
+    /**
+     * Converts element to XML formating.
+     * 
+     * @return Element XML formated element.
+     */
+    @Override
+    public Element toXml(Document doc) {
+        Element tpElement = doc.createElement("TestPoint");
+        tpElement.appendChild(Jaxp.createElement(doc, "Number", String.valueOf(number)));
+        if (testPoint.isPass()) {
+            tpElement.appendChild(Jaxp.createElement(doc, "Result", "PASSED"));
+        } else {
+            tpElement.appendChild(Jaxp.createElement(doc, "Result", "FAILED"));
+        }
+        tpElement.appendChild(this.getLocation(doc));
+        tpElement.appendChild(testPoint.toXml(doc));
+
+        return tpElement;
+    }
+
+    @Override
+    public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+        writer.writeStartElement("TestPoint");
+        XMLStreamWriterUtil.writeElement(writer, "Number", String.valueOf(number));
+        if (testPoint.isPass()) {
+            XMLStreamWriterUtil.writeElement(writer, "Result", "PASSED");
+        } else {
+            XMLStreamWriterUtil.writeElement(writer, "Result", "FAILED");
+        }
+        writeLocation(writer);
+        testPoint.toXml(writer);
+        writer.writeEndElement();
+    }
+
+    @JsonProperty
+    public ITestPoint getTestPoint() {
+        return testPoint;
+    }
+    
+    @JsonProperty
+    public int getNumber() {
+        return number;
+    }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java
new file mode 100644
index 0000000..07eef5d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java
@@ -0,0 +1,341 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.regex.Pattern;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.log.record.MessageJarConfigrecord;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Michael A. Winston
+ */
+public abstract class TestRecord extends LogRecord implements Xmlizable, XmlizableStream {
+	private static final long serialVersionUID = 2663140700880844240L;
+	private static final ArrayList<Pattern> stacktraceExcludes = new ArrayList<>(32);
+	private static final ArrayList<Pattern> stacktraceIncludes = new ArrayList<>(32);
+	private static boolean filterTheStacktrace = true;
+	private static boolean locationLogginOn = true;
+	private List<LogRecord> children = new ArrayList<>();
+
+	public static void setLocationLoggingOn(boolean on) {
+		locationLogginOn = on;
+	}
+
+	public static boolean getLocationLoggingOn() {
+		return locationLogginOn;
+	}
+
+	static {
+		filterTheStacktrace = OtePropertiesCore.noStacktraceFilter.getValue() == null;
+		stacktraceExcludes.add(Pattern.compile("org\\.eclipse\\.osee\\..*"));
+	}
+
+	private final ITestEnvironmentAccessor source;
+	private long timeStamp;
+	private final boolean printTimeStamp;
+	private Throwable throwable;
+
+	/**
+	 * TestRecord Constructor. This is an abstract class so this constructor is
+	 * called via the super() call from the extended class. This sets the
+	 * source, the logging level, the log message and whether a timestamp should
+	 * be included.
+	 * 
+	 * @param source
+	 *            The object requesting the logging.
+	 * @param level
+	 *            The logging level.
+	 * @param msg
+	 *            The log message.
+	 * @param timeStamp
+	 *            <b>True </b> to include timestamp, <b>False </b> if not.
+	 */
+	public TestRecord(ITestEnvironmentAccessor source, Level level, String msg, boolean timeStamp) {
+		super(level, msg);
+		this.throwable = new Throwable();
+		this.printTimeStamp = timeStamp;
+		this.source = source;
+		if (this.printTimeStamp) {
+			if (source != null) {
+				this.timeStamp = source.getEnvTime();
+			} else {
+				this.timeStamp = System.currentTimeMillis();
+				try {
+					throw new Exception("source was null");
+				} catch (Exception e) {
+					OseeLog.log(TestEnvironment.class, Level.SEVERE, e.getMessage(), e);
+				}
+			}
+		}
+	}
+
+	@JsonIgnore
+	public void setStackTrace(Throwable throwable) {
+		this.throwable = throwable;
+	}
+
+	private Element calc(Document doc) {
+		StackTraceElement[] stackElements = this.throwable.getStackTrace();
+		Element locationElement = doc.createElement("Location");
+		locationElement.setAttribute("id", Integer.toString(locationElement.hashCode()));
+		for (StackTraceElement stackElement : stackElements) {
+			addElement(doc, stackElement, locationElement);
+		}
+		return locationElement;
+	}
+
+	private void calc(XMLStreamWriter writer) throws XMLStreamException {
+		StackTraceElement[] stackElements = this.throwable.getStackTrace();
+		writer.writeStartElement("Location");
+		writer.writeAttribute("id", Integer.toString(stackElements.hashCode()));
+		for (StackTraceElement stackElement : stackElements) {
+			addElement(writer, stackElement);
+		}
+	}
+
+	private void addElement(XMLStreamWriter writer, StackTraceElement stackElement) throws XMLStreamException {
+		if (filterTheStacktrace) {
+			final String className = stackElement.getClassName();
+			for (Pattern includes : stacktraceIncludes) {
+				if (includes.matcher(className).matches()) {
+					writer.writeEmptyElement("Stacktrace");
+					writer.writeAttribute("source", stackElement.getClassName());
+					writer.writeAttribute("line", Integer.toString(stackElement.getLineNumber()));
+					// writer.writeEndElement();
+					return;
+				}
+			}
+			for (Pattern excludes : stacktraceExcludes) {
+				if (excludes.matcher(className).matches()) {
+					return;
+				}
+			}
+		}
+		writer.writeEmptyElement("Stacktrace");
+		writer.writeAttribute("source", stackElement.getClassName());
+		writer.writeAttribute("line", Integer.toString(stackElement.getLineNumber()));
+		// writer.writeEndElement();
+	}
+
+	private void addElement(Document doc, StackTraceElement stackElement, Element locationElement) {
+		if (filterTheStacktrace) {
+			final String className = stackElement.getClassName();
+			for (Pattern includes : stacktraceIncludes) {
+				if (includes.matcher(className).matches()) {
+					Element stackTrace = doc.createElement("Stacktrace");
+					stackTrace.setAttribute("source", stackElement.getClassName());
+					stackTrace.setAttribute("line", Integer.toString(stackElement.getLineNumber()));
+					locationElement.appendChild(stackTrace);
+					return;
+				}
+			}
+			for (Pattern excludes : stacktraceExcludes) {
+				if (excludes.matcher(className).matches()) {
+					return;
+				}
+			}
+		}
+		Element stackTrace = doc.createElement("Stacktrace");
+		stackTrace.setAttribute("source", stackElement.getClassName());
+		stackTrace.setAttribute("line", Integer.toString(stackElement.getLineNumber()));
+		locationElement.appendChild(stackTrace);
+	}
+
+	/**
+	 * Converts log element to XML format.
+	 * 
+	 * @return xml formated element.
+	 */
+	@Override
+	public Element toXml(Document doc) {
+		Element recordElement = doc.createElement(getLevel().getName());
+		if (TestRecord.getLocationLoggingOn()) {
+			recordElement.appendChild(getLocation(doc));
+		}
+		recordElement.appendChild(Jaxp.createElement(doc, "Message", getMessage()));
+		return recordElement;
+	}
+
+	@Override
+	public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+	   writer.writeStartElement("OteLog");
+	   writer.writeAttribute("Level", getLevel().getName());
+	   writeMessage(writer);
+	   writeLocationCheckLocationLoggingOn(writer);
+	   writer.writeEndElement();
+	}
+
+	public Object getSource() {
+		return source;
+	}
+
+	/**
+	 * @return Elements location.
+	 */
+	protected Element getLocation(Document doc) {
+		Element locationElement = calc(doc);
+		if (this.printTimeStamp) {
+			locationElement.appendChild(Jaxp.createElement(doc, "Time", Long.toString(timeStamp)));
+		}
+		return locationElement;
+	}
+
+	protected void writeLocation(XMLStreamWriter writer) throws XMLStreamException {
+		calc(writer);
+		writeTime(writer);
+		writer.writeEndElement();
+	}
+
+	protected void writeLocationCheckLocationLoggingOn(XMLStreamWriter writer) throws XMLStreamException {
+		if (TestRecord.getLocationLoggingOn()) {
+			writeLocation(writer);
+		}
+	}
+
+	protected void writeTime(XMLStreamWriter writer) throws XMLStreamException {
+		if (this.printTimeStamp) {
+			writer.writeStartElement("Time");
+			writer.writeCharacters(Long.toString(timeStamp));
+			writer.writeEndElement();
+		}
+	}
+
+	protected void writeMessage(XMLStreamWriter writer) throws XMLStreamException {
+		writeElement(writer, "Message", getMessage());
+	}
+
+	protected void writeElement(XMLStreamWriter writer, String elementName, String characterData) throws XMLStreamException {
+		XMLStreamWriterUtil.writeElement(writer, elementName, characterData);
+	}
+
+	@JsonProperty
+	public List<String> getLocation() {
+		List<String> result = new ArrayList<>();
+		if (TestRecord.getLocationLoggingOn()) {
+			StackTraceElement[] stackTrace = this.throwable.getStackTrace();
+			result.addAll(filterStackTrace(stackTrace));
+		}
+		if (result.isEmpty()) {
+			return null;
+		} else {
+			return result;
+		}
+	}
+
+	private List<String> filterStackTrace(StackTraceElement[] stackTrace) {
+		// include everything if not filtered, otherwise ... 
+		// default is to include unless explicitly excluded, but only if not
+		// explicitly included ... yuck
+		List<String> result = new ArrayList<>();
+		for (StackTraceElement stackElement : stackTrace) {
+			final String className = stackElement.getClassName();
+			if (!filterTheStacktrace || included(className) || !excluded(className)) {
+				result.add(stackElement.getClassName() + ":" + stackElement.getLineNumber());
+			}
+		}
+		return result;
+	}
+
+	private boolean excluded(String className) {
+		for (Pattern exclude : stacktraceExcludes) {
+			if (exclude.matcher(className).matches()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private boolean included(String className) {
+		for (Pattern include : stacktraceIncludes) {
+			if (include.matcher(className).matches()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	@JsonProperty
+	public Long getTimeStamp() {
+		if (this.printTimeStamp) {
+			return timeStamp;
+		} else {
+			return null;
+		}
+	}
+
+	@Override
+   @JsonProperty
+	public String getMessage() {
+		return nonEmptyString(super.getMessage());
+	}
+	
+	protected String nonEmptyString(final String subject) {
+		if (subject != null && subject.trim().length() > 0) {
+			return subject;
+		} else {
+			return null;
+		}
+	}
+	
+	
+	protected <T> List<T> nonEmptyList(final List<T> subject) {
+		return (List<T>) nonEmptyCollection(subject);
+	}
+	
+	protected <T> Collection<T> nonEmptyCollection(final Collection<T> subject) {
+		if (subject.isEmpty()) {
+			return null;
+		} else {
+			return subject;
+		}
+	}
+	
+	// we want LogRecord to record its level in the JSON, but not derivatives, but we must
+	// preserve default behavior for other things, like the log handler
+	@JsonIgnore
+	@Override
+	public Level getLevel() {
+		return super.getLevel();
+	}
+	
+	public void addChildRecord(final LogRecord record) {
+		children.add(record);
+	}
+	
+	@JsonProperty
+	public List<LogRecord> getChildRecords() {
+		return nonEmptyList(children);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java
new file mode 100644
index 0000000..191bac8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.LogRecord;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class TraceRecord extends TestRecord implements Xmlizable {
+   private static final long serialVersionUID = 8567378567805515775L;
+   private final String objectName;
+   private final String methodName;
+   private final MethodFormatter methodArguments;
+   private final ArrayList<Xmlizable> additionalElements;
+   private final ArrayList<XmlizableStream> additionalStreamElements;
+
+   private static final String additionalString = "AdditionalInfo";
+
+   /**
+    * TraceRecord Constructor. Sets up a Trace log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+    */
+   public TraceRecord(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments, boolean timeStamp, boolean startFlag) {
+      this(source, objectName, methodName, methodArguments, timeStamp);
+   }
+
+   public TraceRecord(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments, boolean timeStamp) {
+      super(source, TestLevel.TRACE, "", timeStamp);
+      this.objectName = objectName;
+      this.methodName = methodName;
+      this.methodArguments = methodArguments;
+      this.additionalElements = new ArrayList<>();
+      this.additionalStreamElements = new ArrayList<>();
+   }
+
+   public TraceRecord(ITestEnvironmentAccessor source, String objectName2, String methodName2, MethodFormatter methodArguments2) {
+      this(source, objectName2, methodName2, methodArguments2, true);
+   }
+
+   public void addAdditionalElement(Xmlizable object) {
+      if (object != null) {
+         additionalElements.add(object);
+      }
+   }
+
+   public void addAdditionalElement(XmlizableStream object) {
+      if (object != null) {
+         additionalStreamElements.add(object);
+      }
+   }
+
+   /**
+    * Converts element to XML formating.
+    * 
+    * @return Element XML formated element.
+    */
+   @Override
+   public Element toXml(Document doc) {
+      Element trElement = doc.createElement("Trace");
+      trElement.appendChild(Jaxp.createElement(doc, "ObjectName", objectName));
+      trElement.appendChild(Jaxp.createElement(doc, "MethodName", methodName));
+      trElement.appendChild(methodArguments.toXml(doc));
+      if (!additionalElements.isEmpty()) {
+         Element additional = doc.createElement(additionalString);
+         trElement.appendChild(additional);
+         for (Xmlizable object : additionalElements) {
+            additional.appendChild(object.toXml(doc));
+         }
+      }
+      if (TestRecord.getLocationLoggingOn()) {
+         trElement.appendChild(getLocation(doc));
+      }
+      return trElement;
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement("Trace");
+      XMLStreamWriterUtil.writeElement(writer, "ObjectName", objectName);
+      XMLStreamWriterUtil.writeElement(writer, "MethodName", methodName);
+      methodArguments.toXml(writer);
+      if (!additionalElements.isEmpty()) {
+         writer.writeStartElement(additionalString);
+         for (XmlizableStream object : additionalStreamElements) {
+            object.toXml(writer);
+         }
+         writer.writeEndElement();
+      }
+      writeLocationCheckLocationLoggingOn(writer);
+   }
+   
+   @JsonProperty
+   public String getArguments() {
+	   return nonEmptyString(methodArguments.toString());
+   }
+   
+   @JsonProperty
+   public List<?> getAdditionalInfo() {
+	   return nonEmptyList(additionalStreamElements);
+   }
+   
+   @JsonProperty
+   public String getObjectName() {
+	   return nonEmptyString(objectName);
+   }
+   
+   @JsonProperty
+   public String getMethodName() {
+	   return nonEmptyString(methodName);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecordEnd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecordEnd.java
new file mode 100644
index 0000000..24b8a4a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecordEnd.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.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class TraceRecordEnd extends TestRecord implements Xmlizable {
+
+   private static final long serialVersionUID = 8567378567805515775L;
+   private final ReturnFormatter returnFormatter;
+   private final ArrayList<Xmlizable> additionalElements;
+   private final ArrayList<XmlizableStream> additionalStreamElements;
+
+   private static final String additionalString = "AdditionalInfo";
+
+   public TraceRecordEnd(ITestEnvironmentAccessor source, ReturnFormatter returnFormatter) {
+      super(source, TestLevel.TRACE, "", true);
+      this.returnFormatter = returnFormatter;
+      this.additionalElements = new ArrayList<>();
+      this.additionalStreamElements = new ArrayList<>();
+   }
+
+   public void addAdditionalElement(Xmlizable object) {
+      if (object != null) {
+         additionalElements.add(object);
+      }
+   }
+
+   public void addAdditionalElement(XmlizableStream object) {
+      if (object != null) {
+         additionalStreamElements.add(object);
+      }
+   }
+
+   /**
+    * Converts element to XML formating.
+    * 
+    * @return Element XML formated element.
+    */
+   @Override
+   public Element toXml(Document doc) {
+      Element trElement = doc.createElement("TraceEnd");
+      trElement.appendChild(returnFormatter.toXml(doc));
+      if (!additionalElements.isEmpty()) {
+         Element additional = doc.createElement(additionalString);
+         trElement.appendChild(additional);
+         for (Xmlizable object : additionalElements) {
+            additional.appendChild(object.toXml(doc));
+         }
+      }
+      return trElement;
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement("TraceEnd");
+      returnFormatter.toXml(writer);
+      if (!additionalElements.isEmpty()) {
+         writer.writeStartElement(additionalString);
+         for (XmlizableStream object : additionalStreamElements) {
+            object.toXml(writer);
+         }
+      }
+      writer.writeEndElement();
+   }
+   
+   @JsonProperty
+   public ReturnFormatter getReturnValue() {
+    return returnFormatter;
+}
+
+@Override
+@JsonIgnore
+   public List<String> getLocation() {
+	   return null;
+   }
+   
+   @JsonProperty
+   public List<?> getAdditionalInfo() {
+       return nonEmptyList(additionalStreamElements);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java
new file mode 100644
index 0000000..8267d7f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.core.log.record;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WarningRecord extends TestRecord {
+
+   private static final long serialVersionUID = -3124953320400273382L;
+
+   /**
+    * WarningRecord Constructor. Sets up a Warning log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+    */
+   public WarningRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+      super(source, Level.WARNING, msg, timeStamp);
+   }
+
+   /**
+    * WarningRecord Constructor. Sets up a Warning log message.
+    * 
+    * @param source The object requesting the logging.
+    * @param msg The log message.
+    */
+   public WarningRecord(ITestEnvironmentAccessor source, String msg) {
+      this(source, msg, true);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/json/LogRecordModule.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/json/LogRecordModule.java
new file mode 100644
index 0000000..70fa79a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/json/LogRecordModule.java
@@ -0,0 +1,34 @@
+package org.eclipse.osee.ote.core.log.record.json;
+
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+import org.codehaus.jackson.Version;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.codehaus.jackson.map.module.SimpleModule;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+
+public class LogRecordModule extends SimpleModule {
+
+	public LogRecordModule() {
+		super("LogRecordModule", new Version(0, 0, 1, null));
+	}
+
+	@Override
+	public void setupModule(SetupContext context) {
+		context.setMixInAnnotations(LogRecord.class, MixIn.class);
+	}
+
+	abstract class MixIn {
+		MixIn(@JsonProperty("Level") Level level, @JsonProperty("Message") String message) {
+		};
+
+		@JsonProperty
+		abstract public Level getLevel();
+		
+		@JsonProperty
+		abstract public String getMessage();
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.java
new file mode 100644
index 0000000..1265d6c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.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.core.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModel extends Remote {
+   void turnModelOn() throws RemoteException;
+
+   void turnModelOff() throws RemoteException;
+
+   void init(TestEnvironment testEnvironment, ModelKey key) throws RemoteException;
+
+   ModelState getState() throws RemoteException;
+
+   <CLASSTYPE extends IModel> ModelKey getKey() throws RemoteException;
+
+   void dispose() throws RemoteException;
+
+   EnvironmentTask getEnvironmentTask() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.java
new file mode 100644
index 0000000..151e08e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.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.core.model;
+
+import java.util.Collection;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelKeyFactory {
+   Collection<ModelKey> getModelKeys();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java
new file mode 100644
index 0000000..9dd542a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelListener extends Remote {
+
+   void onModelPreCreate(ModelKey key) throws RemoteException;
+
+   void onModelPostCreate(ModelKey key) throws RemoteException;
+
+   void onModelDispose(ModelKey key) throws RemoteException;
+
+   void onModelStateChange(ModelKey key, ModelState state) throws RemoteException;
+
+   int getHashCode() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java
new file mode 100644
index 0000000..3218c94
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.core.model;
+
+import java.rmi.RemoteException;
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelManager {
+   <CLASSTYPE extends IModel> CLASSTYPE getModel(ModelKey<CLASSTYPE> key);
+
+   <CLASSTYPE extends IModel> void disposeModel(ModelKey<?> key);
+
+   <CLASSTYPE extends IModel> void registerModel(ModelKey<?> key);
+
+   void changeModelState(ModelKey<?> key, ModelState state);
+
+   void notifyModelStateListener(ModelKey<?> key, ModelState state) throws RemoteException;
+
+   @Deprecated
+   void notifyModeStateListener(ModelKey key, ModelState state) throws RemoteException;
+
+   List<ModelKey> getRegisteredModels();
+
+   void releaseReference(IModel model);
+
+   void releaseAllReferences(ModelKey<?> key);
+
+   void addModelActivityListener(IModelListener listener);
+
+   void removeModelActivityListener(IModelListener listener);
+
+   void addModelActivityListener(IModelListener listener, ModelKey<?> key);
+
+   void removeModelActivityListener(IModelListener listener, ModelKey<?> key);
+
+   ModelState getModelState(ModelKey<?> key) throws RemoteException;
+
+   /**
+    * Releases a single reference of the model given by the class.
+    * 
+    * @param key
+    */
+   void releaseReference(ModelKey<?> key);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java
new file mode 100644
index 0000000..c2f7f2b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.core.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelManagerRemote extends Remote {
+   List<ModelKey> getRegisteredModels() throws RemoteException;
+
+   Remote getRemoteModel(ModelKey<?> key) throws RemoteException;
+
+   ModelState getModelState(ModelKey<?> key) throws RemoteException;
+
+   void releaseReference(ModelKey<?> key) throws RemoteException;
+
+   void addModelActivityListener(IModelListener listener) throws RemoteException;
+
+   void removeModelActivityListener(IModelListener listener) throws RemoteException;
+
+   void addModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException;
+
+   void removeModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException;
+
+   void changeModelState(ModelKey<?> key, ModelState state) throws RemoteException;
+
+   void releaseAllReferences(ModelKey<?> key) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IRemoteModel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IRemoteModel.java
new file mode 100644
index 0000000..182b95c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IRemoteModel.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.core.model;
+
+import java.rmi.Remote;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IRemoteModel extends Remote {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.java
new file mode 100644
index 0000000..aa114f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.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.core.model;
+
+import java.io.Serializable;
+
+/**
+ * This key is used by the model manager to search for a model already instanciated for this environment. Each of the
+ * getter functions MUST return a unique identifier for the specific model they represent ( or null if that particular
+ * type isn't available).
+ * 
+ * @author Andrew M. Finkbeiner
+ */
+public class ModelKey<M extends IModel> implements Serializable, Comparable {
+   private static final long serialVersionUID = 4735332847721441142L;
+   private String className;
+   private String name;
+   private Class<M> modelClass;
+
+   public ModelKey(String className) {
+      this(className, null, null);
+   }
+
+   public ModelKey(ModelKey key) {
+      this(key.className, key.name, null);
+   }
+
+   public ModelKey(Class<M> clazz) {
+      this(clazz.getCanonicalName(), null, clazz);
+   }
+
+   public ModelKey(Class<M> clazz, String name) {
+      this(clazz.getCanonicalName(), name, clazz);
+   }
+
+   public ModelKey(String className, String name, Class<M> modelClass) {
+      this.className = className;
+      this.name = name;
+      this.modelClass = modelClass;
+   }
+
+   /**
+    * return the instance class for the model specified by this key. This class MUST match for all keys specifying this
+    * particular model.
+    * 
+    * @return The class for the model described by this key. This may be null if no class name is available but in this
+    * case {@link #getClassName()} must NOT return null.
+    */
+   public Class<M> getModelClass() {
+      return this.modelClass;
+   }
+
+   public void setModelClass(Class<M> modelClass) {
+      this.modelClass = modelClass;
+   }
+
+   /**
+    * return the name of the model specified by this key.
+    * 
+    * @return The name for the model described by this key
+    */
+   public String getName() {
+      if (this.name == null) {
+         this.name = this.getClassName().substring(this.getClassName().lastIndexOf(".") + 1);
+      }
+      return this.name;
+   }
+
+   /**
+    * return the fully qualified class name for the model specified by this key. This class name MUST match for all keys
+    * specifying this particular model.
+    * 
+    * @return The class name for the model described by this key. This may be null if no class name is available but in
+    * this case {@link #getModelClass()} must NOT return null.
+    */
+   public String getClassName() {
+      if (className != null) {
+         return this.className;
+      } else if (modelClass != null) {
+         return modelClass.getCanonicalName();
+      } else {
+         return null;
+      }
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      return getClassName().equals(((ModelKey) obj).getClassName());
+   }
+
+   @Override
+   public int hashCode() {
+      return getClassName().hashCode();
+   }
+
+   @Override
+   public int compareTo(Object o) {
+      if (!(o instanceof ModelKey)) {
+         return -1;
+      }
+
+      ModelKey otherKey = (ModelKey) o;
+      return this.getName().compareTo(otherKey.getName());
+   }
+
+   @Override
+   public String toString() {
+      return getClassName();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java
new file mode 100644
index 0000000..b2079e3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.core.model;
+
+import java.io.Serializable;
+
+/**
+ * @author Michael P. Masterson
+ */
+public enum ModelState implements Serializable {
+   DISPOSED,
+   PAUSED,
+   RUNNING;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/IServiceOperation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/IServiceOperation.java
new file mode 100644
index 0000000..dc373ea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/IServiceOperation.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.core.osgi;
+
+/**
+ * An operation that interacts with an OSGI service in an atomic manner
+ * 
+ * @author Ken J. Aguilar
+ */
+public interface IServiceOperation {
+
+   /**
+    * the operation to perform against the service. The service instance will be valid during the execution of the
+    * operation. Subclasses should handle the case when the operation is asynchronously interrupted.
+    */
+   void doOperation(Object service) throws InterruptedException;
+
+   /**
+    * called when the service is about to be removed.
+    */
+   void interrupt();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/ServiceOperationExecutor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/ServiceOperationExecutor.java
new file mode 100644
index 0000000..ce0b89b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/ServiceOperationExecutor.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * 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.core.osgi;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * A special service tracker that allows the atomic execution of an operation against a service. This provides a way for
+ * a complex operation to interact with an OSGI service without fear of the service being removed in the middle of the
+ * operation
+ * 
+ * @author Ken J. Aguilar
+ */
+public class ServiceOperationExecutor extends ServiceTracker {
+
+   private IServiceOperation operationInProgress = null;
+   private final ReentrantLock operationLock = new ReentrantLock();
+   private final Condition operationComplete = operationLock.newCondition();
+
+   public ServiceOperationExecutor(BundleContext context, String serviceName) {
+      super(context, serviceName, null);
+   }
+
+   @Override
+   public void close() {
+      waitForOperationComplete();
+      super.close();
+   }
+
+   @Override
+   public void removedService(ServiceReference reference, Object service) {
+      waitForOperationComplete();
+      super.removedService(reference, service);
+   }
+
+   protected void waitForOperationComplete() {
+      operationLock.lock();
+      try {
+         if (operationInProgress != null) {
+            operationInProgress.interrupt();
+            while (operationInProgress != null) {
+               operationComplete.await();
+            }
+         }
+      } catch (InterruptedException e) {
+         /*
+          * we got interrupted ourselves!! Standard practice is to call the current threads interrupt() if we can't
+          * re-throw the interrupted exception
+          */
+         Thread.currentThread().interrupt();
+      } finally {
+         operationLock.unlock();
+      }
+   }
+
+   /**
+    * executes the operation.
+    * 
+    * @return true if the operation completed or false if the dependent service was not acquired
+    * @throws InterruptedException if the service operation was interrupted
+    */
+   public boolean executeOperation(IServiceOperation operation) throws InterruptedException {
+
+      final Object service;
+      // lock so we can safely get the service and set the operation in progress
+      operationLock.lock();
+      service = getService();
+      if (service == null) {
+         // the tracked service has not been acquired yet
+         return false;
+      }
+      operationInProgress = operation;
+      /*
+       * unlock since we do not want to be holding the lock while the operation is in progress.
+       */
+      operationLock.unlock();
+
+      try {
+         operationInProgress.doOperation(service);
+      } finally {
+         /*
+          * if we get interrupted or something else happens make sure we signal operation complete so that we can
+          * prevent deadlocks if something was waiting on the operation
+          */
+         operationLock.lock();
+         operationInProgress = null;
+         operationComplete.signal();
+         operationLock.unlock();
+
+      }
+      return true;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java
new file mode 100644
index 0000000..a4f4714
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * 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.core.test.shells;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.net.SocketException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.InputBufferThread;
+
+public class BashShell {
+   private static final int MAX_RESPONSE_TIME = 20000;
+
+   private static final int ITERATION_TIME = 2000;
+
+   private final InputStream in;
+
+   private final PrintStream out;
+
+   private final InputBufferThread inputBuffer;
+
+   //	private String prompt = "$ ";
+
+   /**
+    * Connects telnet to the specified ipAddress and port
+    */
+   public BashShell() throws SocketException, IOException {
+      String shell;
+      if (Lib.isWindows()) {
+         shell = "cmd.exe";
+      } else {
+         shell = "/bin/bash";
+      }
+      Process process;
+
+      process = Runtime.getRuntime().exec(new String[] {shell});
+
+      in = process.getInputStream();
+      out = new PrintStream(process.getOutputStream());
+
+      inputBuffer = new InputBufferThread(in);
+      inputBuffer.start();
+
+   }
+
+   /**
+    * writes the command given to the output stream ( telnet )
+    * 
+    * @param string The command to give
+    */
+   public void write(String string) {
+      out.println(string);
+      out.flush();
+   }
+
+   /**
+    * Sits on the line, reading in characters, and waits for the expected output from telnet
+    * 
+    * @param string The String this function will stop on and return
+    * @return The entire string seen up to finding the string provided
+    */
+   public synchronized String waitFor(String string) throws InterruptedException {
+
+      int elapsedTime = 0;
+      while (elapsedTime <= MAX_RESPONSE_TIME) {
+         if (inputBuffer.contains(string, true) >= 0) {
+            break;
+         }
+         this.wait(ITERATION_TIME);
+         elapsedTime += ITERATION_TIME;
+      }
+      if (elapsedTime > MAX_RESPONSE_TIME) {
+         throw new InterruptedException(
+            "Waiting for '" + string + "' took longer then " + MAX_RESPONSE_TIME + " miliseconds.");
+      }
+      return inputBuffer.getBuffer();
+   }
+
+   /**
+    * Writes the command to telnet and waits for the normal command prompt
+    * 
+    * @param string The command to issue
+    * @return Returns the whole buffer up to the prompt
+    */
+   public String sendCommand(String string, long wait) throws InterruptedException {
+
+      write(string);
+      return waitFor(wait);
+   }
+
+   private String waitFor(long time) throws InterruptedException {
+      while (System.currentTimeMillis() - inputBuffer.getLastRead() < time) {
+         synchronized (this) {
+            this.wait(100);
+         }
+      }
+      return inputBuffer.getBuffer();
+   }
+
+   /**
+    * disconnects from telnet
+    */
+   public void disconnect() {
+      write("ls");
+      inputBuffer.stopOnNextRun(true);
+      write("exit");
+   }
+
+   //	private String getBuffer() {
+   //		return inputBuffer.getBuffer();
+   //	}
+
+   public static void main(String[] args) {
+      BashShell shell;
+      try {
+         shell = new BashShell();
+         String env = shell.sendCommand("env", 4000L);
+         System.out.println(env);
+         shell.disconnect();
+      } catch (SocketException e) {
+
+      } catch (IOException e) {
+
+      } catch (InterruptedException e) {
+
+      }
+
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java
new file mode 100644
index 0000000..ed00228
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java
@@ -0,0 +1,339 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 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.ote.core.test.shells;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
+import java.util.logging.Level;
+import java.util.regex.MatchResult;
+import java.util.regex.Pattern;
+import org.apache.commons.net.telnet.EchoOptionHandler;
+import org.apache.commons.net.telnet.InvalidTelnetOptionException;
+import org.apache.commons.net.telnet.SuppressGAOptionHandler;
+import org.apache.commons.net.telnet.TelnetClient;
+import org.apache.commons.net.telnet.TelnetNotificationHandler;
+import org.apache.commons.net.telnet.TelnetOption;
+import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.InputBufferThread;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * Created on Aug 15, 2005
+ */
+public class TelnetShell implements TelnetNotificationHandler {
+
+   private static final int MAX_RESPONSE_TIME = 10000;
+   public final static class Piper extends Thread {
+      private final InputStream inStream;
+      private final OutputStream outStream;
+
+      public final ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
+
+      public Piper(InputStream in, OutputStream out) {
+         super("Stream Piper");
+         this.inStream = in;
+         this.outStream = out;
+      }
+
+      @Override
+      public void run() {
+         final ReadableByteChannel in = Channels.newChannel(inStream);
+         final WritableByteChannel out = Channels.newChannel(outStream);
+         try {
+            buffer.clear();
+            while (true) {
+               in.read(buffer);
+               buffer.flip();
+               out.write(buffer);
+               buffer.compact();
+            }
+         } catch (IOException e) {
+            e.printStackTrace(System.err);
+         }
+      }
+   }
+
+   private final TelnetClient telnet;
+   private final InputStream in;
+   private final OutputStream out;
+   private InputBufferThread inputBuffer;
+   private String prompt = "$ ";
+   private int currentOutput = 0;
+
+   /**
+    * Connects telnet to the specified ipAddress and port
+    */
+   public TelnetShell(String ipAddress, int port) throws SocketException, IOException {
+      this(ipAddress, port, true);
+   }
+
+   public TelnetShell(String ipAddress, int port, boolean start) throws SocketException, IOException {
+      telnet = new TelnetClient();
+      telnet.registerNotifHandler(this);
+      SuppressGAOptionHandler sgaOpt = new SuppressGAOptionHandler(true, true, true, true);
+      TerminalTypeOptionHandler ttOpt = new TerminalTypeOptionHandler("VT100", false, false, true, false);
+      EchoOptionHandler eOPt = new EchoOptionHandler(true, false, true, false);
+      try {
+         telnet.addOptionHandler(ttOpt);
+         telnet.addOptionHandler(sgaOpt);
+         telnet.addOptionHandler(eOPt);
+      } catch (InvalidTelnetOptionException e) {
+         throw new IllegalStateException("invalid telnet options", e);
+      }
+      telnet.connect(ipAddress, port);
+      try {
+         Thread.sleep(1500);
+      } catch (InterruptedException ex) {
+         ex.printStackTrace();
+      }
+
+      /*
+       * try { if (!telnet.sendAYT(5000)) { throw new SocketException("server appears to be in use"); } } catch
+       * (IllegalArgumentException ex) { ex.printStackTrace(); } catch (InterruptedException ex) { ex.printStackTrace();
+       * }
+       */
+      //printOptionStates();
+      in = telnet.getInputStream();
+      out = telnet.getOutputStream();
+      if (start) {
+         inputBuffer = new InputBufferThread(in);
+         inputBuffer.start();
+
+      }
+   }
+
+   /**
+    * writes the command given to the output stream ( telnet )
+    * 
+    * @param string The command to give
+    */
+   public void write(String string) {
+      // currentOutput = inputBuffer.getLength() + string.length() + 1;
+      try {
+         for (byte b : string.getBytes("us-ascii")) {
+            out.write(b);
+            out.flush();
+
+            try {
+               Thread.sleep(10);
+            } catch (InterruptedException ex) {
+               ex.printStackTrace();
+            }
+
+         }
+         out.write(getNewline());
+         out.flush();
+      } catch (UnsupportedEncodingException e) {
+         e.printStackTrace();
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+
+   }
+
+   public String writeAndGetPrompt(String string, int timeout) throws Exception {
+      inputBuffer.clear();
+      // currentOutput = inputBuffer.getLength() + string.length() + 1;
+      for (byte b : string.getBytes("us-ascii")) {
+         out.write(b);
+         out.flush();
+
+         try {
+            Thread.sleep(10);
+         } catch (InterruptedException ex) {
+            ex.printStackTrace();
+         }
+
+      }
+      out.write(getNewline());
+      out.flush();
+      Thread.sleep(timeout);
+      return inputBuffer.getBuffer();
+
+   }
+
+   /**
+    * Sits on the line, reading in characters, and waits for the expected output from telnet
+    * 
+    * @param string The String this function will stop on and return
+    */
+   public synchronized void waitFor(String string) throws InterruptedException {
+      if (inputBuffer.waitFor(string, true, MAX_RESPONSE_TIME) < 0) {
+         throw new InterruptedException(
+            "Waiting for '" + string + "' took longer then " + MAX_RESPONSE_TIME + " miliseconds.");
+      }
+   }
+
+   public synchronized MatchResult waitForPattern(Pattern pattern, int millis) throws InterruptedException {
+      MatchResult index = inputBuffer.waitFor(pattern, false, millis);
+      if (index == null) {
+         throw new InterruptedException(
+            "Waiting for '" + pattern.pattern() + "' took longer then " + millis + " miliseconds.");
+      }
+      return index;
+   }
+
+   public synchronized void waitForTransmission(int millis) throws InterruptedException {
+      if (!inputBuffer.waitFor(millis)) {
+         throw new InterruptedException("Waiting for transmission took longer then " + millis + " miliseconds.");
+      }
+   }
+
+   public synchronized String getBuffer(int start, int end) {
+      return inputBuffer.subString(start, end);
+   }
+
+   public synchronized String captureTo(String string) throws InterruptedException {
+      int index = inputBuffer.waitFor(string, false, MAX_RESPONSE_TIME);
+      if (index < 0) {
+         throw new InterruptedException(
+            "Waiting for '" + string + "' took longer then " + MAX_RESPONSE_TIME + " miliseconds.");
+      }
+      return inputBuffer.subString(0, index);
+   }
+
+   /**
+    * Writes the command to telnet and waits for the normal command prompt
+    * 
+    * @param string The command to issue
+    */
+   public void sendCommand(String string) throws InterruptedException {
+      currentOutput = inputBuffer.getLength() + string.length() + 1;
+      write(string);
+      waitFor(prompt);
+   }
+
+   /**
+    * disconnects from telnet
+    */
+   public void disconnect() {
+      try {
+         try {
+            inputBuffer.stopNow();
+         } finally {
+            telnet.disconnect();
+         }
+      } catch (Exception ex) {
+         ex.printStackTrace();
+      }
+   }
+
+   public static void main(String[] args) {
+      try {
+         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+         System.out.println("Enter host name or ip address (#.#.#.#))");
+         String host = reader.readLine();
+         System.out.println("Enter port");
+         String string = reader.readLine();
+         if (string == null) {
+            return;
+         }
+         int port = Integer.parseInt(string);
+         TelnetShell shell = new TelnetShell(host, port, false);
+         Piper piper = new Piper(shell.in, System.out);
+         piper.start();
+         try {
+            boolean done = false;
+            while (!done) {
+               String in = reader.readLine();
+               if (in.equals("quit")) {
+                  done = true;
+               } else {
+                  shell.write(in);
+               }
+            }
+            shell.disconnect();
+         } finally {
+            piper.interrupt();
+         }
+      } catch (Exception e) {
+         e.printStackTrace();
+      }
+   }
+
+   public void setPrompt(String prompt) {
+      this.prompt = prompt;
+   }
+
+   public String getBuffer() {
+      return inputBuffer.getBuffer();
+   }
+
+   public String getCurrentBuffer() {
+      try {
+         inputBuffer.waitFor(MAX_RESPONSE_TIME);
+      } catch (InterruptedException e) {
+         OseeLog.log(TestEnvironment.class, Level.SEVERE, e.getMessage(), e);
+      }
+      return inputBuffer.subString(currentOutput);
+   }
+
+   public InputStream getInputStream() {
+      return in;
+   }
+
+   public TelnetClient getTelnet() {
+      return telnet;
+   }
+
+   public void clearBuffer() {
+      inputBuffer.clear();
+   }
+
+   @Override
+   public void receivedNegotiation(int negotiationCode, int option) {
+      final String negotiationCodeStr;
+      switch (negotiationCode) {
+         case TelnetNotificationHandler.RECEIVED_DO:
+            negotiationCodeStr = "DO";
+            break;
+         case TelnetNotificationHandler.RECEIVED_DONT:
+            negotiationCodeStr = "DONT";
+            break;
+         case TelnetNotificationHandler.RECEIVED_WILL:
+            negotiationCodeStr = "WILL";
+            break;
+         case TelnetNotificationHandler.RECEIVED_WONT:
+            negotiationCodeStr = "WONT";
+            break;
+         default:
+            throw new Error("unhandled negotiation code of " + negotiationCode);
+      }
+      System.out.printf("Negotiation recieved: %s for option %s\n", negotiationCodeStr, TelnetOption.getOption(option));
+   }
+
+   public void printOptionStates() {
+      for (int i = 0; i < TelnetOption.MAX_OPTION_VALUE; i++) {
+         String str = TelnetOption.getOption(i);
+         if (!str.equals("UNASSIGNED")) {
+            boolean local = telnet.getLocalOptionState(i);
+            boolean remote = telnet.getRemoteOptionState(i);
+            if (local || remote) {
+               System.out.printf("%s (%02d): local %b, remote %b\n", TelnetOption.getOption(i), i, local, remote);
+            }
+         }
+      }
+   }
+
+   private byte[] getNewline() throws UnsupportedEncodingException {
+      return "\n".getBytes("US-ASCII");
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java
new file mode 100644
index 0000000..00467c3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.core.test.tags;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract interface BaseTestTags {
+   public static final String TEST_SCRIPT = "TestScript";
+
+   public static final String NAME_FIELD = "Name";
+   public static final String NUMBER_FIELD = "Number";
+   public static final String LOCATION_FIELD = "Location";
+   public static final String SCRIPT_SOURCE_FIELD = "ScriptSource";
+   public static final String SCRIPT_LINE_FIELD = "ScriptLine";
+   public static final String FAILURE_TYPE = "FailureType";
+
+   public static final String DESCRIPTION_FIELD = "Description";
+   public static final String MESSAGE_FIELD = "Message";
+   public static final String DETAILS_FIELD = "Details";
+   public static final String ITEMS_FIELD = "Item";
+   public static final String TIME_FIELD = "Time";
+
+   public static final String PURPOSE_FIELD = "Purpose";
+   public static final String PRECONDITION_FIELD = "PreCondition";
+   public static final String POSTCONDITION_FIELD = "PostCondition";
+
+   public static final String CONFIG_ENTRY = "Config";
+   public static final String SCRIPT_NAME = "ScriptName";
+   public static final String SCRIPT_VERSION = "ScriptVersion";
+   public static final String EXECUTED_BY = "ExecutedBy";
+   public static final String EXECUTION_DATE = "ExecutionDate";
+   public static final String ENVIRONMENT_FIELD = "Environment";
+   public static final String CLEAR_TOOL_VIEW = "ClearToolView";
+
+   public static final String NATIVE_ENVIRONMENT = "NativeEnvironment";
+   public static final String ENVIRONMENT_VARIABLE = "EnvironmentVariable";
+   public static final String OSEE_ENVIRONMENT_PREFIX = "OSEEKEY_";
+   public static final String PATH_FIELD = "Path";
+
+   public static final String SCRIPT_TIME_FIELD = "ScriptResult";
+   public static final String ELAPSED_TIME_FIELD = "ElapsedTime";
+
+   public static final String EXECUTION_STATUS = "ExecutionStatus";
+   public static final String EXECUTION_RESULT = "ExecutionResult";
+   public static final String EXECUTION_SUCCESS = "SUCCESS";
+   public static final String EXECUTION_ABORTED = "ABORTED";
+   public static final String EXECUTION_DETAILS = "ExecutionDetails";
+   public static final String TARGET_ENVIRONMENT = "TargetEnvironment";
+
+   public static final String SECTION_BREAK = "----------------------------------------------------------------";
+
+   public static final String BEMS_FIELD = "BEMS";
+   public static final String EMAIL_FIELD = "Email";
+
+   public static final String REPOSITORY_TYPE = "repositoryType";
+
+   public static final String MODIFIED_FIELD = "modifiedFlag";
+   public static final String REVISION_FIELD = "revision";
+   public static final String LAST_AUTHOR_FIELD = "lastAuthor";
+   public static final String LAST_MODIFIED = "lastModified";
+   public static final String URL = "url";
+
+   public static final String UNDEFINED_ENVIRONMENT = "Undefined";
+
+   public static final String Traceability = "Traceability";
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java
new file mode 100644
index 0000000..f5c8e91
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.core.test.tags;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract interface FunctionalTestTags extends BaseTestTags {
+   public static final String FUNCTIONAL_TEST_SCRIPT = "FunctionalTestScript";
+   public static final String FUNCTIONAL_TEST_CASE = "FunctionalTestCase";
+   public static final String FUNCTIONAL_TEST_POINT = "FunctionalTestPoint";
+   public static final String FUNCTIONAL_UNIT_EXECUTION = "FunctionalUnitExecution";
+   public static final String FUNCTIONAL_UNIT_HEADER = "FunctionalUnitHeader";
+
+   public static final String EXECUTABLE_FIELD = "Executable";
+   public static final String OPTIONS_FIELD = "Options";
+   public static final String GUID_FIELD = "Guid";
+
+   public static final String FUNCTIONAL_TEST_POINT_RESULT = "Result";
+   public static final String RESULT_PASSED = "PASSED";
+   public static final String RESULT_FAILED = "FAILED";
+   public static final String RESULT_NOT_RUN = "NOT RUN";
+   public static final String RESULT_MANUAL = "MANUAL";
+
+   public static final String MESSAGE_CHECK = "MessageCheck";
+   public static final String VALUE_FIELD = "Value";
+   public static final String ACTION_CMD = "ActionCmd";
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java
new file mode 100644
index 0000000..dee7112
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * 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.core.testPoint;
+
+import java.util.ArrayList;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestGroup;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ * @author Charles Shaw
+ */
+public class CheckGroup implements ITestGroup {
+   private final String groupName;
+   private final ArrayList<ITestPoint> testPoints;
+   private final Operation operation;
+
+   /**
+    * CheckGroup objects are used to setup complex TestPoint structures where the pass/fail behavior can be an <b>And
+    * </b>'ing or an <b>Or </b>'ing of the <b>getPass() </b> values of all the immediate children.
+    * <p>
+    * More complex TestPoint syntax can be obtained using the CheckGroup as a parent of other CheckGroup objects, of
+    * which the <b>And </b> or <b>Or </b> setting can be set differently.
+    * 
+    * @param operation The logical operation used for combining items within this CheckGroup.
+    */
+   public CheckGroup(Operation operation, String groupName) {
+      super();
+      testPoints = new ArrayList<>();
+      // this.allTrue = allTrue;
+      this.operation = operation;
+      this.groupName = groupName;
+   }
+
+   public CheckGroup add(ITestPoint testPoint) {
+      this.testPoints.add(testPoint);
+
+      return this;
+   }
+
+   @JsonProperty
+   @Override
+   public ArrayList<ITestPoint> getTestPoints() {
+      return testPoints;
+   }
+
+   @JsonProperty
+   public Operation getOperation() {
+      return operation;
+   }
+
+   @JsonProperty
+   public String getGroupName() {
+      return groupName;
+   }
+
+   /**
+    * @return The number of test points added to this check group so far
+    */
+   @Override
+   public int size() {
+      return this.testPoints.size();
+   }
+
+   @Override
+   public boolean isPass() {
+      boolean passFail;
+
+      // Ensure that some points have been added
+      if (testPoints.size() > 0) {
+         // If this group is using AND logic then assume pass until find a
+         // fail
+         // if (allTrue) {
+         if (operation == Operation.AND) {
+            passFail = true;
+            // Else the group is using OR logic, so assume fail until find a
+            // pass
+         } else {
+            passFail = false;
+         }
+
+         for (ITestPoint testPoint : testPoints) {
+            if (operation == Operation.AND) {
+               passFail &= testPoint.isPass();
+            } else {
+               passFail |= testPoint.isPass();
+            }
+         }
+      } else {
+         passFail = false;
+      }
+      return passFail;
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      return buildXml(doc, "CheckGroup");
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      buildXml(writer, "CheckGroup");
+      writer.writeEndElement();
+   }
+
+   protected Element buildXml(Document doc, String name) {
+      Element checkGroupElement = doc.createElement(name);
+
+      checkGroupElement.setAttribute("Mode", operation.toString());
+      checkGroupElement.appendChild(Jaxp.createElement(doc, "GroupName", groupName));
+
+      if (this.isPass()) {
+         checkGroupElement.appendChild(Jaxp.createElement(doc, "Result", "PASSED"));
+      } else {
+         checkGroupElement.appendChild(Jaxp.createElement(doc, "Result", "FAILED"));
+      }
+
+      for (ITestPoint testPoint : testPoints) {
+         checkGroupElement.appendChild(testPoint.toXml(doc));
+      }
+
+      return checkGroupElement;
+   }
+
+   protected void buildXml(XMLStreamWriter writer, String name) throws XMLStreamException {
+      writer.writeStartElement(name);
+      writer.writeAttribute("Mode", operation.toString());
+      XMLStreamWriterUtil.writeElement(writer, "GroupName", groupName);
+      if (this.isPass()) {
+         XMLStreamWriterUtil.writeElement(writer, "Result", "PASSED");
+      } else {
+         XMLStreamWriterUtil.writeElement(writer, "Result", "FAILED");
+      }
+
+      for (ITestPoint testPoint : testPoints) {
+         testPoint.toXml(writer);
+      }
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java
new file mode 100644
index 0000000..4ca63cb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * 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.core.testPoint;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.ote.core.XmlSupport;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class CheckPoint implements ITestPoint {
+	private final String testPointName;
+	private String expected;
+	private final String actual;
+	private final boolean pass;
+	private final long elpasedTime;
+	private final int numTransmissions;
+
+	/**
+	 * CheckPoint objects are used for describing the result of a check and can
+	 * be logged directly to a the logger as a testPoint or can be added to a
+	 * CheckGroup if it is just a part of a larger series of checks being
+	 * performed that all constitute one overall check.
+	 * 
+	 * @param testPointName
+	 *            The item being tested. (i.e. TSD Button).
+	 * @param expected
+	 *            The expected condition for a pass point.
+	 * @param actual
+	 *            The actual condition during the check.
+	 * @param pass
+	 *            The result of the check.
+	 * @param elapsedTime
+	 *            The amount of time elapsed in milliseconds
+	 */
+	public CheckPoint(String testPointName, String expected, String actual, boolean pass, long elapsedTime) {
+		this(testPointName, expected, actual, pass, 0, elapsedTime);
+	}
+
+	public CheckPoint(String testPointName, String expected, String actual, boolean pass, int numTransmissions, long elapsedTime) {
+		this.testPointName = testPointName;
+		this.expected = expected.equals("") ? " " : XmlSupport.convertNonPrintableCharacers(expected);
+		this.actual = actual.equals("") ? " " : XmlSupport.convertNonPrintableCharacers(actual);
+		this.pass = pass;
+		this.elpasedTime = elapsedTime;
+		this.numTransmissions = numTransmissions;
+	}
+
+	public CheckPoint(String testPointName, Object expected, Object actual, boolean pass, long elapsedTime) {
+		this(testPointName, expected.toString(), actual.toString(), pass, elapsedTime);
+	}
+
+	public CheckPoint(String testPointName, Object expected, Object actual, boolean pass) {
+		this(testPointName, expected.toString(), actual.toString(), pass, 0);
+	}
+
+	public CheckPoint(String testPointName, String expected, String actual, boolean pass) {
+		this(testPointName, expected, actual, pass, 0);
+	}
+
+	public CheckPoint(String testPointName, boolean expected, boolean actual) {
+		this(testPointName, expected, actual, expected == actual, 0);
+	}
+
+	/**
+	 * @return Returns the actual.
+	 */
+	@JsonProperty
+	public String getActual() {
+		return actual;
+	}
+
+	/**
+	 * @return Returns the expected.
+	 */
+	@JsonProperty
+	public String getExpected() {
+		return expected;
+	}
+
+	/**
+	 * @return Returns the pass.
+	 */
+	@Override
+	public boolean isPass() {
+		return pass;
+	}
+
+	public void setExpected(String expected) {
+		this.expected = XmlSupport.convertNonPrintableCharacers(expected);
+	}
+
+	@Override
+	public Element toXml(Document doc) {
+		Element checkPointElement = doc.createElement("CheckPoint");
+
+		checkPointElement.appendChild(Jaxp.createElement(doc, "TestPointName", testPointName));
+		checkPointElement.appendChild(Jaxp.createElement(doc, "Expected", expected));
+		checkPointElement.appendChild(Jaxp.createElement(doc, "Actual", actual));
+		checkPointElement.appendChild(Jaxp.createElement(doc, "Result", pass ? "PASSED" : "FAILED"));
+		checkPointElement.appendChild(Jaxp.createElement(doc, "ElapsedTime", Long.toString(this.elpasedTime)));
+		checkPointElement.appendChild(Jaxp.createElement(doc, "NumberOfTransmissions", Integer.toString(this.numTransmissions)));
+
+		return checkPointElement;
+	}
+
+	@Override
+	public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+		writer.writeStartElement("CheckPoint");
+		XMLStreamWriterUtil.writeElement(writer, "TestPointName", testPointName);
+		XMLStreamWriterUtil.writeElement(writer, "Expected", expected);
+		XMLStreamWriterUtil.writeElement(writer, "Actual", actual);
+		XMLStreamWriterUtil.writeElement(writer, "Result", pass ? "PASSED" : "FAILED");
+		XMLStreamWriterUtil.writeElement(writer, "ElapsedTime", Long.toString(this.elpasedTime));
+		XMLStreamWriterUtil.writeElement(writer, "NumberOfTransmissions", Integer.toString(this.numTransmissions));
+		writer.writeEndElement();
+	}
+
+	@JsonProperty
+	public String getTestPointName() {
+		return testPointName;
+	}
+
+	/**
+	 * @return the elpasedTime
+	 */
+	@JsonProperty
+	public long getElpasedTime() {
+		return elpasedTime;
+	}
+
+	/**
+	 * @return the numTransmissions
+	 */
+	@JsonProperty
+	public int getNumTransmissions() {
+		return numTransmissions;
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java
new file mode 100644
index 0000000..50e21ff
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.core.testPoint;
+
+import javax.print.attribute.EnumSyntax;
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+
+public class Operation extends EnumBase {
+
+   private static final long serialVersionUID = -3132727420541603024L;
+   public static final Operation OR = new Operation(0);
+   public static final Operation AND = new Operation(1);
+
+   private static final String[] stringTable = new String[] {"OR", "AND"};
+   private static final Operation[] enumValueTable = new Operation[] {OR, AND};
+
+   private Operation(int value) {
+      super(value);
+   }
+
+   @JsonCreator
+   public static Operation toEnum(String str) {
+      return (Operation) getEnum(str, stringTable, enumValueTable);
+   }
+
+   protected static Operation toEnum(int value) {
+      return (Operation) getEnum(value, enumValueTable);
+   }
+
+   @Override
+   protected String[] getStringTable() {
+      return stringTable;
+   }
+
+   @Override
+   protected EnumSyntax[] getEnumValueTable() {
+      return enumValueTable;
+   }
+
+   @Override
+   @JsonProperty
+   public String getName() {
+      return super.getName();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java
new file mode 100644
index 0000000..afba89e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.core.testPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RetryGroup extends CheckGroup {
+   ArrayList<Xmlizable> childElements;
+   @JsonProperty("ChildRecords")
+   ArrayList<XmlizableStream> childStreamElements;
+
+   public RetryGroup(String groupName) {
+      super(Operation.OR, groupName);
+      childElements = new ArrayList<>();
+      childStreamElements = new ArrayList<>();
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      Element retVal = buildXml(doc, "RetryGroup");
+
+      for (Xmlizable object : childElements) {
+         retVal.appendChild(object.toXml(doc));
+      }
+      return retVal;
+   }
+   
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      buildXml(writer, "RetryGroup");
+      for (XmlizableStream object : childStreamElements) {
+         object.toXml(writer);
+      }
+      writer.writeEndElement();
+   }
+
+   public void addChildElement(XmlizableStream child) {
+      childStreamElements.add(child);
+   }
+
+   public void addChildren(List<XmlizableStream> children) {
+      childStreamElements.addAll(children);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/AddressBuffer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/AddressBuffer.java
new file mode 100644
index 0000000..7e1ec2f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/AddressBuffer.java
@@ -0,0 +1,31 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+
+public class AddressBuffer {
+   
+   private ByteBuffer buffer;
+   private InetSocketAddress address;
+   
+   public AddressBuffer(){
+      buffer = ByteBuffer.allocate(131072);
+   }
+   
+   public ByteBuffer getBuffer(){
+      return buffer;
+   }
+   
+   public void setBytes(byte[] bytes) {
+      buffer = ByteBuffer.wrap(bytes);
+   }
+   
+   public InetSocketAddress getAddress(){
+      return address;
+   }
+   
+   public void setAddress(InetSocketAddress address){
+      this.address = address;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/EndpointDataProcessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/EndpointDataProcessor.java
new file mode 100644
index 0000000..a0b8ed3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/EndpointDataProcessor.java
@@ -0,0 +1,11 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.nio.ByteBuffer;
+
+public interface EndpointDataProcessor {
+
+   int getTypeId();
+
+   void processBuffer(ByteBuffer buffer);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointReceiveRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointReceiveRunnable.java
new file mode 100644
index 0000000..ed2e6be
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointReceiveRunnable.java
@@ -0,0 +1,174 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.BindException;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.DatagramChannel;
+import java.util.Date;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import java.util.zip.DataFormatException;
+import java.util.zip.Inflater;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageHeader;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+
+public class OteEndpointReceiveRunnable implements Runnable {
+
+   private static final int DATA_SIZE = 65536;
+   private static final int UDP_TIMEOUT = 240000; // 4 MINUTES
+   private static final int ONE_MEG = 1024 * 1024;
+   
+   private volatile boolean run = true; 
+   private volatile boolean debugOutput = false;
+   private Class<OteEndpointReceiveRunnable> logger = OteEndpointReceiveRunnable.class;
+   private final InetSocketAddress address;
+   private static final int MAGIC_NUMBER = ByteBuffer.wrap(OteEndpointSendRunnable.MAGIC_NUMBER).getInt();
+   private final Inflater inflater = new Inflater();
+   
+   private CopyOnWriteArrayList<EndpointDataProcessor> dataProcessors = new CopyOnWriteArrayList<>();
+
+   public OteEndpointReceiveRunnable(InetSocketAddress address){
+      this.address = address;
+   }
+   
+   public void stop(){
+      run = false;
+   }
+   
+   @Override
+   public void run() {
+      ByteBuffer buffer = ByteBuffer.allocate(DATA_SIZE);
+      DatagramChannel channel = null;
+      try{
+         while(run){
+            try {
+               channel = DatagramChannel.open();
+               channel.socket().setReuseAddress(true);
+               channel.socket().bind(address);
+               channel.socket().setSoTimeout(UDP_TIMEOUT);
+               channel.socket().setReceiveBufferSize(ONE_MEG);
+               channel.configureBlocking(true);
+             
+               while (run) {
+                  try{
+                     buffer.clear();
+                     channel.receive(buffer);
+                     buffer.flip();
+                     processBuffer(buffer);
+                  } catch(ClosedByInterruptException ex){
+                     stop();
+                  } catch (Throwable th){
+                     th.printStackTrace();
+                  }
+               }
+            } catch (BindException ex) {
+               if(debugOutput){
+                  OseeLog.log(logger, Level.FINEST, ex);
+               }
+               channel.close();
+               Thread.sleep(1000);
+            }
+         }
+      }catch (InterruptedIOException ex) {
+         Thread.interrupted();
+         if (run && debugOutput) {
+            OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ex);
+         }
+      } catch (ClosedByInterruptException ie) {
+         Thread.interrupted();
+         if (run && debugOutput) {
+            OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ie);
+         }
+      } catch (Throwable t) {
+         throw new OTEException(t);
+      } finally {
+         try {
+            if (channel != null) {
+               channel.close();
+            }
+         } catch (IOException ex) {
+            if(debugOutput){
+               ex.printStackTrace();
+            }
+         }
+      }
+   }
+
+   private void processBuffer(ByteBuffer buffer) {
+      int magicNumber = 0;
+      if(buffer.remaining() > 4) {
+         magicNumber = buffer.getInt(0);
+      }
+      // compressed stream
+      if(magicNumber == MAGIC_NUMBER) {
+         inflater.reset();
+         inflater.setInput(buffer.array(), 4, buffer.remaining() - 4);
+         ByteArrayOutputStream outputStream = new ByteArrayOutputStream(buffer.remaining() - 4);
+         byte[] tempBuf = new byte[1024];
+         try {
+            while (!inflater.finished()) {
+               int count = inflater.inflate(tempBuf);
+               outputStream.write(tempBuf, 0, count);
+            }
+            outputStream.close();
+            buffer = ByteBuffer.wrap(outputStream.toByteArray());
+         }
+         catch (DataFormatException e) {
+            OseeLog.log(getClass(), Level.SEVERE, e);
+         }
+         catch (IOException e) {
+            OseeLog.log(getClass(), Level.SEVERE, e);
+         }
+      }
+      int typeId = buffer.getShort(0) & 0xFFFF;
+      if(typeId == OteEventMessageHeader.MARKER_VALUE){
+         byte[] data = new byte[buffer.remaining()];
+         buffer.get(data);
+         OteEventMessage msg = new OteEventMessage((byte[])data);
+         msg.getHeader().TTL.setNoLog(1);
+         if(debugOutput){
+            try {
+               System.out.printf("[%s] received: [%s][%d] from [%s:%d]\n", new Date(), msg.getHeader().TOPIC.getValue(), msg.getData().length, msg.getHeader().ADDRESS.getAddress().getHostAddress(), msg.getHeader().ADDRESS.getPort());
+            } catch (UnknownHostException e) {
+               e.printStackTrace();
+            }
+         }
+         OteEventMessageUtil.postEvent(msg);
+      } else {
+         for(EndpointDataProcessor processor: dataProcessors){
+            if(processor.getTypeId() == typeId){
+               try{
+                  processor.processBuffer(buffer);
+               } catch (Throwable th){
+                  th.printStackTrace();
+               }
+            }
+         }
+      }
+   }
+
+   public void setDebugOutput(boolean enable) {
+      debugOutput  = enable;
+   }
+
+   public InetSocketAddress getAddress() {
+      return address;
+   }
+
+   public void addDataProcessor(EndpointDataProcessor processor) {
+      dataProcessors.add(processor);
+   }
+
+   public void removeDataProcessor(EndpointDataProcessor processor) {
+      dataProcessors.remove(processor);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSendRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSendRunnable.java
new file mode 100644
index 0000000..ea9a7dc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSendRunnable.java
@@ -0,0 +1,147 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.channels.AsynchronousCloseException;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.DatagramChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.zip.Deflater;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.collections.ObjectPool;
+
+final class OteEndpointSendRunnable implements Runnable {
+
+   private static final int SEND_BUFFER_SIZE = 1024 * 512;
+   /**
+    * This is the header for a ZIP file
+    */
+   public static final byte[] MAGIC_NUMBER = {0x04, 0x03, 0x4b, 0x50};
+   private static final int MAX_DGRAM_SIZE = 65500;
+   
+   private final ArrayBlockingQueue<AddressBuffer> toSend;
+   private final ObjectPool<AddressBuffer> buffers;
+   private final Deflater compressor = new Deflater();
+
+   private boolean debug = false;
+
+   OteEndpointSendRunnable(ArrayBlockingQueue<AddressBuffer> toSend, ObjectPool<AddressBuffer> buffers, boolean debug) {
+      this.toSend = toSend;
+      this.buffers = buffers;
+      this.debug = debug;
+      compressor.setLevel(Deflater.BEST_SPEED);
+   }
+
+   @Override
+   public void run() {
+      DatagramChannel threadChannel = null; 
+      try {
+         threadChannel = openAndInitializeDatagramChannel();
+         boolean keepRunning = true;
+         final List<AddressBuffer> dataToSend = new ArrayList<>(32);
+         System.setSecurityManager(null);
+         while(keepRunning){
+            try{
+               dataToSend.clear();
+               if (toSend.drainTo(dataToSend) < 1) {
+                  try {
+                     // block until something is available
+                     AddressBuffer addrBuf = toSend.poll(15, TimeUnit.SECONDS);
+                     if (addrBuf == null) {
+                        // no activity for a while so lets clean ourselves up. Our master will restart
+                        // a new thread if another event comes along after we self terminate
+                        keepRunning = false;
+                     } else {
+                        dataToSend.add(addrBuf);
+                     }
+                  } catch (InterruptedException e) {
+                     keepRunning = false;
+                     continue;
+                  }
+               }
+               int size = dataToSend.size();
+               for (int i = 0; i < size; i++) {
+                  AddressBuffer data = dataToSend.get(i);
+                  if (data == OteUdpEndpointSender.POISON_PILL) {
+                     keepRunning = false;
+                     break;
+                  }
+                  
+                  int bufSize = data.getBuffer().remaining();
+                  if(bufSize > MAX_DGRAM_SIZE) {
+                     compressor.reset();
+                     compressor.setInput(data.getBuffer().array(), 0, bufSize);
+                     compressor.finish();
+
+                     ByteArrayOutputStream bos = new ByteArrayOutputStream(bufSize);
+
+                     byte[] buf = new byte[1024];
+                     while (!compressor.finished()) {
+                       int count = compressor.deflate(buf);
+                       bos.write(buf, 0, count);
+                     }
+                     try {
+                        bos.close();
+                        byte[] dataBytes = new byte[bos.size() + 4];
+                        System.arraycopy(MAGIC_NUMBER, 0, dataBytes, 0, 4);
+                        System.arraycopy(bos.toByteArray(), 0, dataBytes, 4, bos.size());
+                        data.setBytes(dataBytes);
+                     }
+                     catch (IOException e) {
+                        OseeLog.log(getClass(), Level.SEVERE, "Error trying to compress data", e);
+                        continue;
+                     }
+                  }
+                  
+                  threadChannel.send(data.getBuffer(), data.getAddress());
+               }
+            } catch (ClosedByInterruptException ex){
+               if(debug){
+                  OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+               }
+               threadChannel = openAndInitializeDatagramChannel();
+            } catch (AsynchronousCloseException ex){
+               if(debug){
+                  OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+               }
+               Lib.close(threadChannel);
+               threadChannel = openAndInitializeDatagramChannel();
+            } catch (ClosedChannelException ex){
+               if(debug){
+                  OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+               }
+               Lib.close(threadChannel);
+               threadChannel = openAndInitializeDatagramChannel();
+            } catch (IOException ex){
+               OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+            } finally {
+               int size = dataToSend.size();
+               for (int i = 0; i < size; i++) {
+                  buffers.returnObj(dataToSend.get(i));
+               }
+            }
+         } 
+      } catch (IOException ex){
+         OseeLog.log(getClass(), Level.SEVERE, "Error opening DatagramChannel.  Ending OteEndpointSendRunnable unexpectedly.", ex);
+      } finally{
+         Lib.close(threadChannel);
+      }
+
+   }
+   
+   private DatagramChannel openAndInitializeDatagramChannel() throws IOException {
+      DatagramChannel channel = DatagramChannel.open();
+      if (channel.socket().getSendBufferSize() < SEND_BUFFER_SIZE) {
+         channel.socket().setSendBufferSize(SEND_BUFFER_SIZE);
+      }
+      channel.socket().setReuseAddress(true);
+      channel.configureBlocking(true);
+      return channel;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSender.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSender.java
new file mode 100644
index 0000000..4a1a9e7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSender.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public interface OteEndpointSender {
+
+   void send(OteEventMessage sendMessage);
+
+   InetSocketAddress getAddress();
+
+   void stop() throws InterruptedException;
+
+   boolean isClosed();
+
+   void setDebug(boolean debug);
+
+   void start();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointUtil.java
new file mode 100644
index 0000000..761a405
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointUtil.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+
+import org.eclipse.osee.ote.OTEException;
+
+public class OteEndpointUtil {
+
+   /**
+    * Get the socket address for the OTEUdpEndpoint from an encoded URI.  You should catch OTEException and 
+    * handle the case when the sting is not as expected.
+    * 
+    * @param uriAddress
+    * @return
+    */
+   public static InetSocketAddress getAddress(final String uriAddress) throws OTEException {
+      String[] addPort = null;
+      if(uriAddress.startsWith("tcp://")){
+         String add = uriAddress.replaceFirst("tcp://", "");
+         addPort = add.split(":");
+      } else {
+         addPort = uriAddress.split(":");
+      }
+      if(addPort != null && addPort.length == 2){
+         try {
+         InetAddress byName = InetAddress.getByName(addPort[0]);
+         int port = Integer.parseInt(addPort[1]);
+         return new InetSocketAddress(byName, port);
+         } catch (UnknownHostException ex){
+            throw new OTEException(String.format("Invalid address[%s]", uriAddress), ex);
+         } catch (NumberFormatException ex){
+            throw new OTEException(String.format("Invalid address format[%s], can't determine port", uriAddress), ex);
+         }
+      } else {
+         throw new OTEException(String.format("Invalid address format[%s]", uriAddress));
+      }
+   }
+   
+   public static InetSocketAddress getAddress(final String address, final int port) {
+      try {
+         InetAddress byName = InetAddress.getByName(address);
+         return new InetSocketAddress(byName, port);
+      } catch (UnknownHostException ex){
+         throw new OTEException(String.format("Invalid address[%s]", address), ex);
+      }
+   }
+   
+   public static String getAddressURI(final InetSocketAddress address){
+      return String.format("tcp://%s:%d", address.getAddress().getHostAddress(), address.getPort());
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpoint.java
new file mode 100644
index 0000000..e391134
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpoint.java
@@ -0,0 +1,30 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+
+public interface OteUdpEndpoint {
+
+   public void setDebugOutput(boolean enable);
+
+   public InetSocketAddress getLocalEndpoint();
+
+   public OteUdpEndpointSender getOteEndpointSender(InetSocketAddress address);
+
+   OteUdpEndpointInlineSender getOteEndpointInlineSender(InetSocketAddress address);
+
+   public void addBroadcast(OteUdpEndpointSender sender);
+
+   public void removeBroadcast(OteUdpEndpointSender sender);
+   
+//   public void clearBroadcast();
+
+   public CopyOnWriteNoIteratorList<OteUdpEndpointSender> getBroadcastSenders();
+
+   public void addDataProcessor(EndpointDataProcessor processor);
+
+   public void removeDataProcessor(EndpointDataProcessor processor);
+
+   OteUdpEndpointSender getOteEndpointThreadedSender(InetSocketAddress address);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointInlineSender.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointInlineSender.java
new file mode 100644
index 0000000..aace552
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointInlineSender.java
@@ -0,0 +1,70 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+/**
+ * Launches a Thread that monitors a queue for data to send to specified UDP endpoints.
+ *
+ * @author b1528444
+ */
+public class OteUdpEndpointInlineSender implements OteEndpointSender {
+   private static final int SEND_BUFFER_SIZE = 1024 * 512;
+
+   private final InetSocketAddress address;
+
+   public OteUdpEndpointInlineSender(InetSocketAddress address) {
+      this.address = address;
+   }
+
+   @Override
+   public InetSocketAddress getAddress() {
+      return address;
+   }
+
+   @Override
+   public void send(OteEventMessage message) {
+
+      try {
+         DatagramChannel channel = DatagramChannel.open();
+         if (channel.socket().getSendBufferSize() < SEND_BUFFER_SIZE) {
+            channel.socket().setSendBufferSize(SEND_BUFFER_SIZE);
+         }
+         channel.socket().setReuseAddress(true);
+         channel.configureBlocking(true);
+
+         ByteBuffer buffer = ByteBuffer.allocate(SEND_BUFFER_SIZE);
+
+         buffer.put(message.getData());
+         buffer.flip();
+         channel.send(buffer, address);
+      } catch (IOException e) {
+         throw new OTEException(e);
+      }
+   }
+
+   @Override
+   public void stop() {
+      //not needed
+   }
+
+   @Override
+   public boolean isClosed() {
+      return false;
+   }
+
+   @Override
+   public void setDebug(boolean debug) {
+      //not needed
+   }
+
+   @Override
+   public void start() {
+      //not needed
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointReceiverImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointReceiverImpl.java
new file mode 100644
index 0000000..6974857
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointReceiverImpl.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+
+public class OteUdpEndpointReceiverImpl {
+
+   private OteEndpointReceiveRunnable oteEndpointReceiveRunnable;
+   private Thread th;
+
+   public OteUdpEndpointReceiverImpl(InetSocketAddress address){
+      oteEndpointReceiveRunnable = new OteEndpointReceiveRunnable(address);
+   }
+   
+   public void start(){
+      th = new Thread(oteEndpointReceiveRunnable);
+      th.setName("OTE UDP Endpoint Receiver");
+      th.setDaemon(true);
+      th.start();
+   }
+   
+   public void stop(){
+      oteEndpointReceiveRunnable.stop();
+      th.interrupt();
+   }
+   
+   public void setDebugOutput(boolean enable){
+      oteEndpointReceiveRunnable.setDebugOutput(enable);
+   }
+   
+   public InetSocketAddress getEndpoint(){
+      return oteEndpointReceiveRunnable.getAddress();
+   }
+
+   public void addDataProcessor(EndpointDataProcessor processor) {
+      oteEndpointReceiveRunnable.addDataProcessor(processor);  
+   }
+
+   public void removeDataProcessor(EndpointDataProcessor processor) {
+      oteEndpointReceiveRunnable.removeDataProcessor(processor);
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointSender.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointSender.java
new file mode 100644
index 0000000..3ae2f4e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointSender.java
@@ -0,0 +1,95 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+import java.util.Date;
+import java.util.concurrent.ArrayBlockingQueue;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.collections.ObjectPool;
+import org.eclipse.osee.ote.collections.ObjectPoolConfiguration;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+/**
+ * Launches a Thread that monitors a queue for data to send to specified UDP endpoints.
+ *
+ * @author b1528444
+ *
+ */
+public class OteUdpEndpointSender implements OteEndpointSender {
+
+   static final AddressBuffer POISON_PILL = new AddressBuffer();
+
+   private final ObjectPool<AddressBuffer> buffers;
+   private final ArrayBlockingQueue<AddressBuffer> toSend;
+
+   private final InetSocketAddress address;
+
+   private boolean debug = false;
+
+   private volatile boolean isClosed = false;
+
+   private volatile Thread thread;
+
+   public OteUdpEndpointSender(InetSocketAddress address){
+      toSend = new ArrayBlockingQueue<>(5000);
+      buffers = new ObjectPool<AddressBuffer>(new ObjectPoolConfiguration<AddressBuffer>(50,true) {
+         @Override
+         public AddressBuffer make() {
+            return new AddressBuffer();
+         }
+      });
+      this.address = address;
+   }
+
+   @Override
+   public void start(){
+      thread = new Thread(new OteEndpointSendRunnable(toSend, buffers, debug));
+      thread.setName(String.format("OTE Endpoint Sender[%s]", address.toString()));
+      thread.setDaemon(true);
+      thread.start();
+   }
+
+   @Override
+   public void stop() throws InterruptedException{
+      toSend.put(POISON_PILL);
+      isClosed  = true;
+   }
+
+   @Override
+   public InetSocketAddress getAddress(){
+      return address;
+   }
+
+   @Override
+   public void send(OteEventMessage message) {
+      if(debug){
+         System.out.printf("[%s] sending: [%s] to [%s] [%d]\n", new Date(), message.getHeader().TOPIC.getValue(), address.toString(), message.getData().length);
+      }
+      AddressBuffer obj = buffers.getObject();
+      obj.getBuffer().clear();
+      obj.getBuffer().put(message.getData());
+      obj.getBuffer().flip();
+      obj.setAddress(address);
+      try {
+         toSend.put(obj);
+      } catch (InterruptedException e) {
+         throw new OTEException(e);
+      }
+
+      if (!thread.isAlive()) {
+         // our thread has sat idle for too long and self terminated go ahead and start a new one
+         start();
+      }
+   }
+
+   @Override
+   public boolean isClosed() {
+      return isClosed;
+   }
+
+   @Override
+   public void setDebug(boolean debug){
+      this.debug = debug;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransfer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransfer.java
new file mode 100644
index 0000000..deb6a41
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransfer.java
@@ -0,0 +1,282 @@
+package org.eclipse.osee.ote.filetransfer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketTimeoutException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+
+public class TcpFileTransfer {
+
+
+
+	private static final int SECRET_CODE = 0xF17E;
+	private static final int BLOCK_SIZE = 64*1024;
+
+	public static TcpFileTransferHandle sendFile(ExecutorService service, final File file, final InetSocketAddress address) throws IOException{
+		if (!file.exists()) {
+			throw new IllegalArgumentException("Invalid file specified: " + file.getAbsolutePath());
+		}
+		final TransferProgressMonitor monitor = new TransferProgressMonitor();
+		monitor.updateTransferStartTime(System.currentTimeMillis());
+		final SocketChannel sendChannel =  SocketChannel.open(address);
+
+		final TcpFileTransfer fileTransfer = new TcpFileTransfer(Direction.FILE_TO_CHANNEL, file);
+		Callable<Boolean> c = new Callable<Boolean>() {
+
+			@Override
+			public Boolean call() throws Exception {
+				fileTransfer.openSender(monitor, sendChannel);
+				monitor.updateTransferCompleteTime(System.currentTimeMillis());
+				return true;
+			}
+		};
+		InetSocketAddress localAddress = (InetSocketAddress) sendChannel.socket().getLocalSocketAddress();
+		return new TcpFileTransferHandle(monitor, localAddress, service.submit(c));
+	}
+
+
+	/**
+	 * 
+	 * @param service
+	 * @param file
+	 * @param port
+	 * @return the transfer handle or null if the file to be written to is in use by another process
+	 * @throws IOException
+	 */
+	public static TcpFileTransferHandle receiveFile(ExecutorService service, final File file, int port) throws IOException{
+		if (service == null) {
+			throw new NullPointerException("Service cannot be null");
+		}
+
+		final TcpFileTransfer fileTransfer;
+		try {
+			fileTransfer = new TcpFileTransfer(Direction.CHANNEL_TO_FILE, file);
+		} catch (FileNotFoundException e) {
+			// most likely due to file being used by another process
+			return null;
+		}
+		final TransferProgressMonitor monitor = new TransferProgressMonitor();
+		monitor.updateTransferStartTime(System.currentTimeMillis());
+
+		final ServerSocketChannel channel = ServerSocketChannel.open();
+		channel.configureBlocking(false);
+		channel.socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), port));
+		InetSocketAddress localAddress = (InetSocketAddress) channel.socket().getLocalSocketAddress();
+
+		Callable<Boolean> c = new Callable<Boolean>() {
+
+			@Override
+			public Boolean call() throws Exception {
+				fileTransfer.openReceiver(monitor, channel);
+				monitor.updateTransferCompleteTime(System.currentTimeMillis());
+
+				return true;
+
+			}
+		};
+		return new TcpFileTransferHandle(monitor, localAddress, service.submit(c));
+	}
+
+	private static enum Direction {
+		FILE_TO_CHANNEL {
+
+			@Override
+			long transfer(FileChannel fileChannel, SocketChannel byteChannel, long position, long count) throws IOException{
+				return fileChannel.transferTo(position, count, byteChannel);
+			}
+
+			@Override
+			FileChannel createChannel(File file) throws IOException{
+				return new FileInputStream(file).getChannel();
+			}
+
+		},
+		CHANNEL_TO_FILE {
+
+			@Override
+			long transfer(FileChannel fileChannel, SocketChannel byteChannel, long position, long count) throws IOException{
+				return fileChannel.transferFrom(byteChannel, position, count);				
+			}
+
+			@Override
+			FileChannel createChannel(File file) throws IOException {
+				FileChannel channel = new FileOutputStream(file).getChannel();
+				channel.lock();
+				return channel;
+			}
+
+
+		};
+
+		abstract long transfer(FileChannel fileChannel, SocketChannel byteChannel, long position, long count) throws IOException;
+		abstract FileChannel createChannel(File file) throws IOException;
+	}
+
+	private final Direction direction;
+	private final File file;
+
+	private TcpFileTransfer(Direction direction, File file) throws FileNotFoundException, IOException{
+		this.direction = direction;
+		this.file = file;
+	}
+
+
+	private void openSender(TransferProgressMonitor monitor, SocketChannel sendChannel) throws IOException{		
+		try {
+			Selector selector = Selector.open();
+			try {
+				sendChannel.configureBlocking(false);
+				sendChannel.register(selector, SelectionKey.OP_WRITE);
+				final File[] files;
+				if (file.isDirectory()) {
+					files = file.listFiles();					
+				} else {
+					files = new File[]{file};
+				}
+				int fileCounter = 1;
+				ByteBuffer buffer = ByteBuffer.allocate(1024);
+				for (File targetFile : files) {
+					long size = targetFile.length();
+					monitor.updateTotalTransferAmount(size);
+					buffer.clear();
+					buffer.putInt(SECRET_CODE);
+					buffer.putInt(files.length);
+					buffer.putInt(fileCounter++);
+					String name = targetFile.getName();
+					buffer.putInt(name.length());
+					buffer.put(name.getBytes());
+					buffer.putLong(size);
+					buffer.flip();
+					sendChannel.write(buffer);
+					transfer(monitor, sendChannel, selector, size, targetFile);
+					buffer.clear();
+					sendChannel.keyFor(selector).interestOps(SelectionKey.OP_READ);
+					waitForData(selector, sendChannel, buffer);
+					sendChannel.keyFor(selector).interestOps(SelectionKey.OP_WRITE);
+				}
+			} finally {
+				selector.close();
+			}
+		} finally {
+			sendChannel.close();
+		}
+	}
+
+	private void openReceiver(TransferProgressMonitor monitor, ServerSocketChannel serverChannel) throws IOException{		
+		try {
+			Selector selector = Selector.open();
+			try {
+				serverChannel.register(selector, SelectionKey.OP_ACCEPT);
+				// only way to timeout on accept with channels is to use a selector. 
+				// ServerSocketChannel does not honor the socket.setSoTimeout() value
+				if (selector.select(10000) < 1) {
+					throw new SocketTimeoutException();
+				}
+				selector.selectedKeys().clear();
+				serverChannel.keyFor(selector).cancel();
+				
+				SocketChannel receiveChannel =  serverChannel.accept();
+				receiveChannel.configureBlocking(false);
+				receiveChannel.register(selector, SelectionKey.OP_READ);
+
+				// now we need to handle timeouts for the data channel
+				try {
+					boolean done = false;
+					ByteBuffer buffer = ByteBuffer.allocate(1024);
+					byte[] fileNameBytes = new byte[2048];
+					while (!done) {
+						buffer.clear();
+						// we only want to read the next 12 bytes, anything more than 12 is the file data
+						// and we want that left in the channel to be consumed later
+						buffer.limit(16);
+	
+						waitForData(selector, receiveChannel, buffer);
+						
+						buffer.flip();
+						int code = buffer.getInt();
+						if (code != SECRET_CODE) {
+							throw new IOException("Unexpected data during transfer negotiation");
+						}
+						int fileCount = buffer.getInt();
+						int currentFile = buffer.getInt();
+						monitor.updateNumberOfFiles(fileCount);
+						int fileNameLength = buffer.getInt();
+						buffer.clear();
+						buffer.limit(fileNameLength + 8);
+						waitForData(selector, receiveChannel, buffer);
+						buffer.flip();
+						buffer.get(fileNameBytes, 0, fileNameLength);
+						long fileSize = buffer.getLong();
+						monitor.updateTotalTransferAmount(fileSize);
+						File targetFile = file.isDirectory() ? new File(file, new String(fileNameBytes, 0, fileNameLength)) : file;
+						transfer(monitor, receiveChannel, selector, fileSize, targetFile);
+						buffer.clear();
+						buffer.putInt(0xF0F0);
+						buffer.flip();
+						receiveChannel.write(buffer);
+						done = currentFile == fileCount;
+						
+					}
+				} finally {
+					receiveChannel.close();
+				}
+			} finally {
+				selector.close();
+			}
+		} finally {
+			serverChannel.close();
+		}
+	}
+	
+	private static void waitForData(Selector selector, SocketChannel channel, ByteBuffer buffer) throws SocketTimeoutException, IOException{
+		if (selector.select(10000) < 1) {
+			throw new SocketTimeoutException();
+		}
+		selector.selectedKeys().clear();
+		channel.read(buffer);
+	}
+
+
+	private static void waitForChannel(Selector selector) throws SocketTimeoutException, IOException{
+		selector.select(10000);
+		Set<SelectionKey> set = selector.selectedKeys();
+		if (set.size() == 0) {
+			throw new SocketTimeoutException();
+		}
+		set.clear();						
+	}
+	
+	private void transfer(TransferProgressMonitor monitor, SocketChannel channel, Selector selector, long totalTransferAmount, File targetFile) throws IOException {
+		// we need a selector to deal with time outs 
+		FileChannel fileChannel = direction.createChannel(targetFile);
+		try {
+			long position = 0;
+			while (position < totalTransferAmount) {
+				waitForChannel(selector);
+				long count = direction.transfer(fileChannel, channel, position, Math.min(BLOCK_SIZE, totalTransferAmount - position));
+				if (count < 0) {
+					channel.keyFor(selector).cancel();
+					continue;
+				}
+				position += count;
+				monitor.updateAmountTransferred(position);
+			}
+		} finally {
+			fileChannel.close();
+		}
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransferHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransferHandle.java
new file mode 100644
index 0000000..3175631
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransferHandle.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.filetransfer;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class TcpFileTransferHandle {
+
+	private final Future<Boolean> future;
+	private final TransferProgressMonitor progressMonitor;
+
+	private final InetSocketAddress localAddress;
+	
+	TcpFileTransferHandle(TransferProgressMonitor progressMonitor, InetSocketAddress localAddress,
+			Future<Boolean> future) {
+		super();
+		this.progressMonitor = progressMonitor;
+		this.future = future;
+		this.localAddress = localAddress;
+	}
+	
+	public void cancelTransfer() {
+		future.cancel(true);
+	}
+	
+	public TransferProgressMonitor getProgressMonitor() {
+		return progressMonitor;
+	}
+
+
+	
+	/**
+	 * blocks until transfer is complete.
+	 * @return true if transfer was a success or false otherwise
+	 * @throws ExecutionException
+	 * @throws InterruptedException
+	 */
+	public boolean awaitCompletion() throws ExecutionException, InterruptedException {
+		return future.get();
+	}
+	
+	/**
+	 * returns whether or not the transfer has completed. A transfer is considered complete
+	 * once all bytes have been sent/received or if transfer was aborted due to an error
+	 * @return
+	 */
+	public boolean isComplete() {
+		return future.isDone();
+	}
+
+	public InetSocketAddress getLocalAddress() {
+		return localAddress;
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TransferProgressMonitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TransferProgressMonitor.java
new file mode 100644
index 0000000..b72102c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TransferProgressMonitor.java
@@ -0,0 +1,61 @@
+package org.eclipse.osee.ote.filetransfer;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class TransferProgressMonitor {
+
+	private final AtomicInteger numberOfFiles = new AtomicInteger(-1);
+	private final AtomicLong total = new AtomicLong(-1L);
+	private final AtomicLong current = new AtomicLong(0L);
+	private final AtomicLong transferStartTime = new AtomicLong(-1L);
+	private final AtomicLong transferCompleteTime = new AtomicLong(-1L);
+
+	public long getAmountTransferred() {
+		return current.get();
+	}
+	
+	public long getTotalTransferAmount() {
+		return total.get();
+	}
+	
+	public long getPercentTransferred() {
+		return (current.get() * 100) / total.get();
+	}
+	
+	void updateAmountTransferred(long amount) {
+		current.set(amount);
+	}
+	
+	void updateTotalTransferAmount(long totalAmount) {
+		total.set(totalAmount);				
+	}
+	
+	void updateNumberOfFiles(int files) {
+		numberOfFiles.set(files);
+	}
+
+	public int getNumberOfFiles() {
+		return numberOfFiles.get();
+	}
+
+	public long getTransferStartTime() {
+		return transferStartTime.get();
+	}
+
+	public long getTransferCompleteTime() {
+		return transferCompleteTime.get();
+	}
+	
+	void updateTransferStartTime(long time) {
+		transferStartTime.set(time);
+	}
+	
+	void updateTransferCompleteTime(long time) {
+		transferCompleteTime.set(time);
+	}
+	
+	public long getTotalTransferTime() {
+		return getTransferCompleteTime() - getTransferStartTime();
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/AddressResponseListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/AddressResponseListener.java
new file mode 100644
index 0000000..ed9e17d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/AddressResponseListener.java
@@ -0,0 +1,44 @@
+package org.eclipse.osee.ote.internal;
+
+import java.net.InetSocketAddress;
+
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+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.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class AddressResponseListener implements EventHandler {
+
+   private final EventAdmin eventAdmin;
+   private final IRemoteMessageService messageService;
+   private final GET_INET_ADDRESS_RESP resp;
+   private final GET_INET_ADDRESS_REQ req;
+
+   public AddressResponseListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.eventAdmin = eventAdmin;
+      this.messageService = messageService;
+      resp = new GET_INET_ADDRESS_RESP();
+      req = new GET_INET_ADDRESS_REQ();
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      OteEventMessageUtil.putBytes(event, req);
+      InetSocketAddress address;
+      resp.getHeader().RESPONSE_ID.setValue(req.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+      if(req.SOCKET_ID.getValue() == SOCKET_ID.MSG_UPDATES){
+         address = messageService.getMsgUpdateSocketAddress();
+      } else {
+         address = messageService.getRecorderSocketAddress();
+      }
+      resp.SOCKET_ID.setValue(req.SOCKET_ID.getValue());
+      resp.ADDRESS.setAddress(address.getAddress());
+      resp.ADDRESS.setPort(address.getPort());
+      OteEventMessageUtil.postEvent(resp, eventAdmin);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/Configure.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/Configure.java
new file mode 100644
index 0000000..e3e716e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/Configure.java
@@ -0,0 +1,58 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+
+public class Configure implements Callable<ConfigurationStatus> {
+
+   private final IRuntimeLibraryManager bundleLoader;
+   private final Configuration configuration;
+   private final OTEStatusCallback<ConfigurationStatus> callable;
+   
+   public Configure(IRuntimeLibraryManager bundleLoader2, Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) {
+      this.bundleLoader = bundleLoader2;
+      this.configuration = configuration;
+      this.callable = callable;
+   }
+
+   @Override
+   public ConfigurationStatus call() throws Exception {
+      long startTime = System.currentTimeMillis();
+      ConfigurationStatus status = new ConfigurationStatus(configuration, true, "");
+      try{
+         boolean completedUninstall = true;
+         callable.setTotalUnitsOfWork(determineUnitsOfWork());
+         if(bundleLoader.installed()){
+            completedUninstall = bundleLoader.uninstall(callable);
+            callable.incrememtUnitsWorked(1);
+         }
+         if(completedUninstall){
+            if(bundleLoader.install(configuration, callable)){
+               if(!bundleLoader.start(callable)){
+                  status.setFail("Bundle start failed.");
+               }
+            } else {
+               status.setFail("Bundle install failed.");
+            }
+         } else {
+            status.setFail("Failed to uninstall bundles.");
+         }
+      } finally {
+         callable.complete(status);
+      }
+      long elapsedTime = System.currentTimeMillis() - startTime;
+      OseeLog.log(getClass(), Level.INFO, String.format("Took %d ms to load and start the test environment.", elapsedTime));
+      return status;
+   }
+
+   private int determineUnitsOfWork() {
+      return (bundleLoader.installed() ? 1 : 0) + configuration.getItems().size()*2;      
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConfigureAndResponseListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConfigureAndResponseListener.java
new file mode 100644
index 0000000..552356b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConfigureAndResponseListener.java
@@ -0,0 +1,143 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.ConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.JobStatus;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedOTEJobStatus;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ConfigureAndResponseListener implements EventHandler {
+
+   private final OTEApi oteApi;
+   private final OteUdpEndpoint endpoint;
+
+   public ConfigureAndResponseListener(EventAdmin eventAdmin, OteUdpEndpoint endpoint, OTEApi oteApi) {
+      this.oteApi = oteApi;
+      this.endpoint = endpoint;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      SerializedConfigurationAndResponse serialized = new SerializedConfigurationAndResponse(OteEventMessageUtil.getBytes(arg0));
+      try {
+         ConfigurationAndResponse config = serialized.getObject();
+         
+         OteUdpEndpointSender oteEndpointSender = endpoint.getOteEndpointSender(serialized.getHeader().getSourceInetSocketAddress());
+         endpoint.addBroadcast(oteEndpointSender);
+         try{
+            String id = (String) oteApi.getIHostTestEnvironment().getProperties().getProperty("id");
+            /*
+             * Ensure that the id matches so that we are talking with the server we intended to talk to 
+             */            
+            if(id != null && config.getId().equals(id)){
+               if(config.install()){
+                  oteApi.loadConfiguration(config.getConfiguration(), new Status(oteEndpointSender));
+               } else {
+                  oteApi.downloadConfigurationJars(config.getConfiguration(), new Status(oteEndpointSender));
+               }
+            } else {
+               handleException(new Exception("Bad server id."), oteEndpointSender);
+            }
+         } catch (ExecutionException e) {
+               handleException(e, oteEndpointSender);
+         }
+      }catch (Throwable e) {
+         handleException(e);
+      }
+   }
+
+   private void handleException(Throwable e, OteUdpEndpointSender oteEndpointSender) {
+      SerializedOTEJobStatus message = new SerializedOTEJobStatus();
+      JobStatus jobStatus = new JobStatus();
+      StringBuilder sb = new StringBuilder();
+      sb.append("error: ").append(message).append("\n").append(Lib.exceptionToString(e)).append("\n");
+      jobStatus.setErrorLog(sb.toString());
+      jobStatus.setSuccess(false);
+      jobStatus.setJobComplete(true);
+      try {
+         message.setObject(jobStatus);
+         oteEndpointSender.send(message);
+      } catch (IOException e1) {
+         e1.printStackTrace();
+      }
+   }
+
+   private void handleException(Throwable e) {
+      OseeLog.log(getClass(), Level.SEVERE, e);
+   }
+
+   private static class Status implements OTEStatusCallback<ConfigurationStatus> {
+      
+      private OteUdpEndpointSender oteEndpointSender;
+      private SerializedOTEJobStatus message;
+      private JobStatus jobStatus;
+      private StringBuilder sb;
+
+      public Status(OteUdpEndpointSender oteEndpointSender) {
+         this.oteEndpointSender = oteEndpointSender;
+         this.message = new SerializedOTEJobStatus();
+         this.jobStatus = new JobStatus();
+         sb = new StringBuilder();
+      }
+
+      private void setAndSend(){
+         try {
+            message.setObject(jobStatus);
+            oteEndpointSender.send(message);
+         } catch (IOException e) {
+            e.printStackTrace();
+         }
+      }
+      
+      @Override
+      public void complete(ConfigurationStatus done) {
+         this.jobStatus.setSuccess(done.isSuccess());
+         this.jobStatus.setJobComplete(true);
+         this.jobStatus.setErrorLog(done.getMessage());
+         setAndSend();
+      }
+
+      @Override
+      public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+         jobStatus.setTotalUnitsOfWork(totalUnitsOfWork);
+         setAndSend();
+      }
+
+      @Override
+      public void incrememtUnitsWorked(int count) {
+         jobStatus.setUnitsWorked(jobStatus.getUnitsWorked() + count);
+         setAndSend();
+      }
+
+      @Override
+      public void log(String message) {
+         sb.append("log: ").append(message).append("\n");
+      }
+
+      @Override
+      public void error(String message, Throwable th) {
+         sb.append("error: ").append(message).append("\n").append(Lib.exceptionToString(th)).append("\n");
+      }
+
+      @Override
+      public void error(String message) {
+         sb.append("error: ").append(message).append("\n");
+      }
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConnectionListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConnectionListener.java
new file mode 100644
index 0000000..b0e31bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConnectionListener.java
@@ -0,0 +1,58 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.RequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedConnectionRequestResult;
+import org.eclipse.osee.ote.remote.messages.SerializedRequestRemoteTestEnvironment;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ConnectionListener implements EventHandler {
+
+   private OteUdpEndpoint oteEndpoint;
+   private OTEApi oteApi;
+   
+   public ConnectionListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+      this.oteEndpoint = oteEndpoint;
+      this.oteApi = oteApi;
+   }
+
+
+   @Override
+   public void handleEvent(Event arg0) {
+      SerializedRequestRemoteTestEnvironment serialized = new SerializedRequestRemoteTestEnvironment(OteEventMessageUtil.getBytes(arg0));
+      RequestRemoteTestEnvironment request;
+      try {
+         request = serialized.getObject();
+         IHostTestEnvironment hostTestEnvironment = oteApi.getIHostTestEnvironment();
+         if(hostTestEnvironment != null){
+            try {
+               InetSocketAddress address = serialized.getHeader().getSourceInetSocketAddress();
+               ConnectionRequestResult requestEnvironment = hostTestEnvironment.requestEnvironment(request.getSession(), request.getId(), request.getConfig());
+               OteUdpEndpointSender oteEndpointSender = oteEndpoint.getOteEndpointSender(address);
+               SerializedConnectionRequestResult serializedConnectionRequestResult = new SerializedConnectionRequestResult(requestEnvironment);
+               serializedConnectionRequestResult.setResponse(serialized);
+               oteEndpointSender.send(serializedConnectionRequestResult);
+               oteEndpoint.addBroadcast(oteEndpointSender);
+            } catch (RemoteException e) {
+               e.printStackTrace();
+            }
+         }
+      } catch (IOException e1) {
+         e1.printStackTrace();
+      } catch (ClassNotFoundException e1) {
+         e1.printStackTrace();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DisconnectListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DisconnectListener.java
new file mode 100644
index 0000000..a184a0d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DisconnectListener.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.DisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedDisconnectRemoteTestEnvironment;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class DisconnectListener implements EventHandler {
+
+   private OTEApi oteApi;
+   private OteUdpEndpoint oteEndpoint;
+
+   public DisconnectListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+      this.oteApi = oteApi;
+      this.oteEndpoint = oteEndpoint;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      SerializedDisconnectRemoteTestEnvironment serializedDisconnectRemoteTestEnvironment = new SerializedDisconnectRemoteTestEnvironment(OteEventMessageUtil.getBytes(arg0));
+      DisconnectRemoteTestEnvironment disconnect;
+      try {
+         disconnect = serializedDisconnectRemoteTestEnvironment.getObject();
+         oteApi.getIHostTestEnvironment().disconnect(disconnect.getId());
+         oteEndpoint.removeBroadcast(oteEndpoint.getOteEndpointSender(serializedDisconnectRemoteTestEnvironment.getHeader().getSourceInetSocketAddress()));
+      } catch (IOException e) {
+         e.printStackTrace();
+      } catch (ClassNotFoundException e) {
+         e.printStackTrace();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DownloadConfiguration.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DownloadConfiguration.java
new file mode 100644
index 0000000..5667ef9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DownloadConfiguration.java
@@ -0,0 +1,40 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.concurrent.Callable;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+
+public class DownloadConfiguration implements Callable<ConfigurationStatus> {
+
+   private final IRuntimeLibraryManager bundleLoader;
+   private final Configuration configuration;
+   private final OTEStatusCallback<ConfigurationStatus> callable;
+   
+   public DownloadConfiguration(IRuntimeLibraryManager bundleLoader2, Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) {
+      this.bundleLoader = bundleLoader2;
+      this.configuration = configuration;
+      this.callable = callable;
+   }
+
+   @Override
+   public ConfigurationStatus call() throws Exception {
+      ConfigurationStatus status = new ConfigurationStatus(configuration, true, "");
+      try{
+         callable.setTotalUnitsOfWork(determineUnitsOfWork());
+         if(!bundleLoader.acquireBundles(configuration, callable)){
+            status.setFail("Failed to download all bundles.");
+         }
+      } finally {
+         callable.complete(status);
+      }
+      return status;
+   }
+
+   private int determineUnitsOfWork() {
+      return configuration.getItems().size();      
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/GetPropertiesListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/GetPropertiesListener.java
new file mode 100644
index 0000000..64aee76
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/GetPropertiesListener.java
@@ -0,0 +1,49 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointInlineSender;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.SerializedEnhancedProperties;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class GetPropertiesListener implements EventHandler {
+
+   private final OTEApi oteApi;
+   private final OteUdpEndpoint endpoint;
+
+   public GetPropertiesListener(EventAdmin eventAdmin, OteUdpEndpoint endpoint, OTEApi oteApi) {
+      this.oteApi = oteApi;
+      this.endpoint = endpoint;
+   }
+   
+   @Override
+   public void handleEvent(Event arg0) {
+      OteEventMessage oteEventMessage = OteEventMessageUtil.getOteEventMessage(arg0);
+      SerializedEnhancedProperties properties = new SerializedEnhancedProperties();
+      IHostTestEnvironment host = oteApi.getIHostTestEnvironment();
+      if(host != null){
+         try {
+            properties.setResponse(oteEventMessage);
+            OteUdpEndpointInlineSender oteEndpointSender =endpoint.getOteEndpointInlineSender(oteEventMessage.getHeader().getSourceInetSocketAddress());
+            properties.setObject(host.getProperties());
+            oteEndpointSender.send(properties);            
+         } catch (RemoteException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+         } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+         }
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEApiImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEApiImpl.java
new file mode 100644
index 0000000..d38a158
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEApiImpl.java
@@ -0,0 +1,278 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationItem;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.OTEServerRuntimeCache;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.model.IModelManager;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+
+public final class OTEApiImpl implements OTEApi {
+
+   private final Configuration emptyConfiguration;
+   private final ReentrantLock configurationLock;
+   
+   private Future<ConfigurationStatus> currentConfigurationFuture;
+   private ExecutorService executor;
+   private IRuntimeLibraryManager runtimeLibraryManager;
+   private OTEServerFolder serverFolder;
+   private OTEServerRuntimeCache serverRuntimeCache;
+   private TestEnvironmentInterface env;
+   private IModelManager modelManager;
+   private IRemoteMessageService remoteMessageService;
+   private IHostTestEnvironment host;
+   
+   /**
+    * ds component method
+    */
+   public void start(){
+   }
+   
+   /**
+    * ds component method
+    */
+   public void stop(){
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+      this.runtimeLibraryManager = runtimeLibraryManager;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+      this.runtimeLibraryManager = null;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindOTEServerFolder(OTEServerFolder serverFolder){
+      this.serverFolder = serverFolder;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindOTEServerFolder(OTEServerFolder serverFolder){
+      this.serverFolder = null;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+      this.serverRuntimeCache = serverRuntimeCache;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+      this.serverRuntimeCache = null;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindTestEnvironmentInterface(TestEnvironmentInterface env){
+      this.env = env;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindTestEnvironmentInterface(TestEnvironmentInterface env){
+      this.env = null;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindIModelManager(IModelManager modelManager){
+      this.modelManager = modelManager;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindIModelManager(IModelManager modelManager){
+      this.modelManager = null;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindIRemoteMessageService(IRemoteMessageService remoteMessageService){
+      this.remoteMessageService = remoteMessageService;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindIRemoteMessageService(IRemoteMessageService remoteMessageService){
+      this.remoteMessageService = null;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindIHostTestEnvironment(IHostTestEnvironment host){
+      this.host = host;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindIHostTestEnvironment(IHostTestEnvironment host){
+      this.host = null;
+   }
+   
+   public OTEApiImpl(){
+      this.configurationLock = new ReentrantLock();
+      this.emptyConfiguration = new Configuration();
+      this.currentConfigurationFuture = new OTEFutureImpl(new ConfigurationStatus(emptyConfiguration, true, ""));
+      this.executor = Executors.newSingleThreadExecutor(new ThreadFactory(){
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setName("OteConfiguration");
+            return th;
+         }
+      });
+   }
+   
+   @Override
+   public Future<ConfigurationStatus> loadConfiguration(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException {
+      Future<ConfigurationStatus> status;
+      configurationLock.lock();
+      try{
+         if(currentConfigurationFuture != null && !currentConfigurationFuture.isDone()){
+            status = new OTEFutureImpl(new ConfigurationStatus(configuration, false, "In the process of loading a configuration."));
+            callable.complete(status.get());
+         } else if(currentConfigurationFuture.get().getConfiguration() == emptyConfiguration || configuration == emptyConfiguration || !currentConfigurationFuture.get().isSuccess()){
+            status = new OTEFutureImpl(executor.submit(new Configure(runtimeLibraryManager, configuration, callable)));
+            currentConfigurationFuture = status;
+         } else {
+            status = new OTEFutureImpl(new ConfigurationStatus(configuration, false, generateConfigDiff(configuration, currentConfigurationFuture.get().getConfiguration())));
+            callable.complete(status.get());
+         }
+      } finally {
+         configurationLock.unlock();
+      }
+      return status;
+   }
+   
+   private String generateConfigDiff(Configuration configuration, Configuration configuration2) {
+      Collections.sort(configuration.getItems(), new ConfigurationItemComparator());
+      Collections.sort(configuration2.getItems(), new ConfigurationItemComparator());
+      StringBuilder missingBundles = new StringBuilder();
+      StringBuilder extraBundles = new StringBuilder();
+      StringBuilder differentVersion = new StringBuilder();
+      for(ConfigurationItem item:configuration.getItems()){
+         int i = Collections.binarySearch(configuration2.getItems(), item, new ConfigurationItemComparator());
+         if(i >= 0 ){
+            ConfigurationItem item2 = configuration2.getItems().get(i);
+            if(!item2.getVersion().equals(item.getVersion())){
+               differentVersion.append(String.format("%s  [%s] != [%s]\n", item.getSymbolicName(), item.getVersion(), item2.getVersion()));
+            } else if(!item2.getMd5Digest().equals(item.getMd5Digest())){
+               differentVersion.append(String.format("%s  binary contents do not match\n", item.getSymbolicName()));
+            }
+         } else {
+            missingBundles.append(String.format("%s   missing\n", item.getSymbolicName()));
+         }
+      }
+      for(ConfigurationItem item:configuration2.getItems()){
+         int i = Collections.binarySearch(configuration.getItems(), item, new ConfigurationItemComparator());
+         if(i < 0 ){
+            extraBundles.append(String.format("%s   extra bundle\n", item.getSymbolicName()));
+         }
+      }      
+      return differentVersion.toString() + missingBundles.toString() + extraBundles.toString();
+   }
+   
+   private static class ConfigurationItemComparator implements Comparator<ConfigurationItem> {
+
+      @Override
+      public int compare(ConfigurationItem arg0, ConfigurationItem arg1) {
+         return arg0.getSymbolicName().compareTo(arg1.getSymbolicName());
+      }
+      
+   }
+   
+   
+
+   @Override
+   public Future<ConfigurationStatus> resetConfiguration(OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException {
+      return loadConfiguration(emptyConfiguration, callable);
+   }
+
+   @Override
+   public Future<ConfigurationStatus> getConfiguration() {
+      return currentConfigurationFuture;
+   }
+   
+   @Override
+   public Future<ConfigurationStatus> downloadConfigurationJars(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException {
+      return new OTEFutureImpl(executor.submit(new DownloadConfiguration(runtimeLibraryManager, configuration, callable)));
+   }
+
+   @Override
+   public IModelManager getModelManager() {
+      return modelManager;
+   }
+
+   @Override
+   public TestEnvironmentInterface getTestEnvironment() {
+      return env;
+   }
+
+   @Override
+   public OTEServerFolder getServerFolder() {
+      return serverFolder;
+   }
+
+   @Override
+   public OTEServerRuntimeCache getRuntimeCache() {
+      return serverRuntimeCache;
+   }
+
+   @Override
+   public Class<?> loadFromScriptClassLoader(String clazz) throws ClassNotFoundException {
+      return runtimeLibraryManager.loadFromRuntimeLibraryLoader(clazz);
+   }
+
+   @Override
+   public Class<?> loadFromRuntimeLibraryLoader(String clazz) throws ClassNotFoundException {
+      return runtimeLibraryManager.loadFromScriptClassLoader(clazz);
+   }
+
+   @Override
+   public IRemoteMessageService getRemoteMessageService() {
+	   return remoteMessageService;
+   }
+
+   @Override
+   public IHostTestEnvironment getIHostTestEnvironment() {
+      return host;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEBundleLoader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEBundleLoader.java
new file mode 100644
index 0000000..4f96ff6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEBundleLoader.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * 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.internal;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationItem;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEServerRuntimeCache;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.OseeURLClassLoader;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * When starting bundles users can specify an OTE-StartLevel: <int value> in the manifest of a bundle, if there are issues 
+ * with the order in which bundles need to be started.  The list of bundles to start will simply be sorted by that value, 
+ * the default value is 0.  This was implemented to work around a deadlock issue that can happen when you call Bundle.start()
+ * and there is a conflict with 'component resolving thread'.  By waiting till the end to load the bundles that can cause the issue
+ * we avoid the deadlock issue which has a default 5 second time limit.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OTEBundleLoader implements IRuntimeLibraryManager{
+
+   public static final String MANIFEST_ENTRY_OTE_STARTLEVEL = "OTE-StartLevel";
+   
+   private final List<Bundle> installedBundles;
+   private final Collection<Bundle> runningBundles;
+   private final Map<String, String> bundleNameToMd5Map;
+   private final BundleContext context;
+   
+   private URLClassLoader scriptClassLoader;
+   private OTEServerRuntimeCache serverRuntimeCache;
+
+   public void bindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+      this.serverRuntimeCache = serverRuntimeCache;
+   }
+   
+   public void unbindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+      this.serverRuntimeCache = serverRuntimeCache;
+   }
+   
+   public OTEBundleLoader() {
+      this.context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+      this.installedBundles = new LinkedList<>();
+      this.runningBundles = new LinkedList<>();
+      this.bundleNameToMd5Map = new HashMap<>();
+   }
+
+   @Override
+   public boolean install(Configuration oteConfiguration, OTEStatusCallback<ConfigurationStatus> statusCallback) {
+      boolean pass = true;
+      for (ConfigurationItem bundleDescription : oteConfiguration.getItems()) {
+         String bundleName = bundleDescription.getSymbolicName();
+         try {
+            boolean exists = false;
+            for (Bundle bundle : runningBundles) {
+               if (bundle.getSymbolicName().equals(bundleName)) {
+                  exists = true;
+                  break;
+               }
+            }
+            if (!exists) {
+               Bundle bundle = Platform.getBundle(bundleDescription.getSymbolicName());
+               if (bundle == null) {
+                  Bundle installedBundle;
+                  File bundleData = acquireSystemLibraryStream(bundleDescription);
+                  installedBundle = context.installBundle("reference:" + bundleData.toURI().toURL().toExternalForm());
+                  bundleNameToMd5Map.put(bundleName, bundleDescription.getMd5Digest());
+                  installedBundles.add(installedBundle);
+               } 
+            }
+            statusCallback.log("installed " + bundleName);
+         } catch (BundleException ex){
+            if(ex.getType() == BundleException.DUPLICATE_BUNDLE_ERROR){
+               statusCallback.log(String.format("Duplicate bundle [%s].", bundleName));
+            } else {
+               statusCallback.error(String.format("Unable to load [%s].", bundleName), ex);
+               pass = false;
+            }
+         } catch (Throwable th) {
+            statusCallback.error(String.format("Unable to load [%s].", bundleName), th);
+            pass = false;
+         } finally {
+            statusCallback.incrememtUnitsWorked(1);
+         }
+      }
+      return pass;
+   }
+
+   @Override
+   public boolean acquireBundles(Configuration oteConfiguration, OTEStatusCallback<ConfigurationStatus> statusCallback) {
+      boolean pass = true;
+      for (ConfigurationItem bundleDescription : oteConfiguration.getItems()) {
+         String bundleName = bundleDescription.getSymbolicName();
+         File bundleData = null;
+         try{
+            bundleData = acquireSystemLibraryStream(bundleDescription);
+         } catch (Exception e) {
+            pass = false;
+            statusCallback.error("Failed to aquire bundle from client.", e);
+         }
+         finally {
+            if(bundleData == null){
+               pass = false;
+               statusCallback.error("Failed to downloaded bundle " + bundleName);
+            }
+            statusCallback.incrememtUnitsWorked(1);
+         }
+         statusCallback.log("downloaded " + bundleName);
+      }
+      return pass;
+   }
+   
+   @Override
+   public boolean start(OTEStatusCallback<ConfigurationStatus> statusCallback) {
+      boolean pass = true;
+      sortBundles(installedBundles);
+      Iterator<Bundle> iter = installedBundles.iterator();
+      while (iter.hasNext()) {
+         Bundle bundle = iter.next();
+         try {
+            String entry = bundle.getHeaders().get("Fragment-Host");
+            if (entry == null) {
+               int bundleState = bundle.getState();
+               if(bundleState != Bundle.ACTIVE) {
+                  bundle.start();
+               } 
+            }
+            // We got here because bundle.start did not exception
+            runningBundles.add(bundle);
+            iter.remove();
+            statusCallback.log("started " + bundle.getSymbolicName());
+         } catch (BundleException ex) {
+            pass = false;
+            statusCallback.error("Failed to start " + bundle.getSymbolicName(), ex);
+         } finally {
+            statusCallback.incrememtUnitsWorked(1);
+         }
+      }
+      return pass;
+   }
+
+   private void sortBundles(List<Bundle> installedBundles2) {
+	   Collections.sort(installedBundles, new Comparator<Bundle>() {
+			@Override
+			public int compare(Bundle arg0, Bundle arg1) {
+				int startLevel0 = getStartLevel(arg0);
+				int startLevel1 = getStartLevel(arg1);
+				if(startLevel0 != 0 || startLevel1 != 0){
+				return startLevel0 - startLevel1;
+				} else {
+				   return arg0.getSymbolicName().compareTo(arg1.getSymbolicName());
+				}
+			}
+			
+			private int getStartLevel(Bundle arg0) {
+				String level = arg0.getHeaders().get(MANIFEST_ENTRY_OTE_STARTLEVEL);
+				if(level == null){
+					return 0;
+				} else {
+					try {
+						return Integer.parseInt(level);
+					} catch (NumberFormatException ex) {
+						return 0;
+					}
+				}
+			}
+		});
+   }
+
+   @Override
+   public boolean uninstall(OTEStatusCallback<ConfigurationStatus> statusCallback) {
+      boolean result = true;
+      for (Bundle bundle : installedBundles) {
+         try {
+            bundle.uninstall();
+         } catch (BundleException ex) {
+            result = false;
+            statusCallback.error("Failed to uninstall " + bundle.getSymbolicName(), ex);
+         }
+      }
+      installedBundles.clear();
+
+      for (Bundle bundle : runningBundles) {
+         try {
+            String entry = bundle.getHeaders().get("Fragment-Host");
+        	if (entry == null) {
+        	   bundle.stop();
+        	}
+            bundle.uninstall();
+         } catch (BundleException ex) {
+            result = false;
+            statusCallback.error("Failed to stop and uninstall " + bundle.getSymbolicName(), ex);
+         }
+      }
+      runningBundles.clear();
+      
+      return result;
+   }
+
+   private File acquireSystemLibraryStream(ConfigurationItem bundleDescription) throws Exception {
+      File file = serverRuntimeCache.get(bundleDescription.getSymbolicName(), bundleDescription.getMd5Digest());
+      if (file == null) {
+         InputStream servedBundleIn = new URL(bundleDescription.getLocationUrl()).openConnection().getInputStream();
+         file = serverRuntimeCache.save(bundleDescription.getSymbolicName(), bundleDescription.getMd5Digest(), servedBundleIn);
+         servedBundleIn.close();
+      }
+      return file;
+   }
+
+   public void dispose() {
+      bundleNameToMd5Map.clear();
+      installedBundles.clear();
+      runningBundles.clear();
+   }
+
+   @Override
+   public boolean installed() {
+      return installedBundles.size() > 0 || runningBundles.size() > 0;
+   }
+
+   @Override
+   public void clearJarCache() {
+      serverRuntimeCache.clearJarCache();
+   }
+   
+   @Override
+   public void resetScriptLoader(Configuration oteConfiguration, String[] classPaths) throws Exception {
+      List<URL> urls = new ArrayList<>();
+      if(oteConfiguration != null){
+         for(ConfigurationItem item:oteConfiguration.getItems()){
+            File file = serverRuntimeCache.get(item.getSymbolicName(), item.getMd5Digest());
+            if(file != null){
+               urls.add(file.toURI().toURL());
+            }
+         }
+      }
+      URL[] urlArray = urls.toArray(new URL[urls.size()+classPaths.length]);
+      URL[] urlClassPaths = Lib.getUrlFromString(classPaths);
+      System.arraycopy(urlClassPaths, 0, urlArray, urls.size(), urlClassPaths.length);
+      scriptClassLoader = new OseeURLClassLoader("Script ClassLoader", urlArray, ExportClassLoader.getInstance());
+   }
+
+   @Override
+   public Class<?> loadFromScriptClassLoader(String path) throws ClassNotFoundException {
+      if (scriptClassLoader == null) {
+         return loadFromRuntimeLibraryLoader(path);
+      }
+      Class<?> scriptClass = scriptClassLoader.loadClass(path);
+      return scriptClass;
+   }
+
+   @Override
+   public Class<?> loadFromRuntimeLibraryLoader(String clazz) throws ClassNotFoundException {
+      return ExportClassLoader.getInstance().loadClass(clazz);
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement("RuntimeVersions");
+      for (String bundleVersion : getBundleVersions()) {
+         XMLStreamWriterUtil.writeElement(writer, "Version", bundleVersion);
+      }
+      writer.writeEndElement();
+   }
+
+   @JsonProperty
+   public List<String> getBundleVersions() {
+       Bundle[] bundles = ServiceUtility.getContext().getBundles();
+       List<String> versions = new ArrayList<>();
+       for(Bundle bundle: bundles ){
+           String version = bundle.getHeaders().get("Bundle-Version");
+           String implVersion = bundle.getHeaders().get("Implementation-Version");
+           if (version != null && implVersion != null) {
+               versions.add(String.format("%s_%s_%s", bundle.getSymbolicName(), version, implVersion));
+           } else if (version != null){
+               versions.add(String.format("%s_%s", bundle.getSymbolicName(), version));
+           } else {
+               versions.add(String.format("%s", bundle.getSymbolicName()));
+           }
+       }
+       Collections.sort(versions);
+       return versions;
+   }
+
+   @Override
+   public ClassLoader getClassLoader() {
+      if (scriptClassLoader == null) {
+         return ExportClassLoader.getInstance();
+      } else {
+         return scriptClassLoader;
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEFutureImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEFutureImpl.java
new file mode 100644
index 0000000..cf2ad43
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEFutureImpl.java
@@ -0,0 +1,64 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.osee.ote.ConfigurationStatus;
+
+public class OTEFutureImpl implements Future<ConfigurationStatus> {
+
+   private final Future<ConfigurationStatus> submit;
+   private ConfigurationStatus oteConfigurationStatus;
+   
+   public OTEFutureImpl(Future<ConfigurationStatus> submit) {
+      this.submit = submit;
+   }
+
+   public OTEFutureImpl(ConfigurationStatus oteConfigurationStatus) {
+      this.submit = null;
+      this.oteConfigurationStatus = oteConfigurationStatus;
+   }
+
+   @Override
+   public boolean cancel(boolean mayInterruptIfRunning) {
+      if(submit == null){
+         return false;
+      }
+      return submit.cancel(mayInterruptIfRunning);
+   }
+
+   @Override
+   public ConfigurationStatus get() throws InterruptedException, ExecutionException {
+      if(submit == null){
+         return oteConfigurationStatus;
+      }
+      return submit.get();
+   }
+
+   @Override
+   public ConfigurationStatus get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
+      if(submit == null){
+         return oteConfigurationStatus;
+      }
+      return submit.get(timeout, unit);
+   }
+
+   @Override
+   public boolean isCancelled() {
+      if(submit == null){
+         return false;
+      }
+      return submit.isCancelled();
+   }
+
+   @Override
+   public boolean isDone() {
+      if(submit == null){
+         return true;
+      }
+      return submit.isDone();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEServerRuntimeCacheImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEServerRuntimeCacheImpl.java
new file mode 100644
index 0000000..99eace7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEServerRuntimeCacheImpl.java
@@ -0,0 +1,222 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.io.streams.StreamPumper;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEServerRuntimeCache;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+
+public class OTEServerRuntimeCacheImpl implements OTEServerRuntimeCache  {
+   
+   private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd___kk_mm_ss"); 
+
+   private File folder;
+   private OTEServerFolder oteServerFolder;
+
+   public OTEServerRuntimeCacheImpl(){
+   }
+   
+   /**
+    * ds component method
+    */
+   public void start(){
+      folder = oteServerFolder.getCacheFolder();
+      if (!folder.exists()) {
+         if (!folder.mkdirs()) {
+            OseeLog.log(getClass(), Level.SEVERE, "Could not create JAR cache at " + folder.getAbsolutePath());
+         }
+      }
+      if (!folder.isDirectory()) {
+         OseeLog.log(getClass(), Level.SEVERE, "The JAR cache is not a directory! Path=" + folder.getAbsolutePath());
+      }
+      clean();
+   }
+   
+   /**
+    * ds component method
+    */
+   public void stop(){
+   }
+   
+   /**
+    * ds component method
+    */
+   public void bindOTEServerFolder(OTEServerFolder oteServerFolder){
+      this.oteServerFolder = oteServerFolder;
+   }
+   
+   /**
+    * ds component method
+    */
+   public void unbindOTEServerFolder(OTEServerFolder oteServerFolder){
+      this.oteServerFolder = oteServerFolder;
+   }
+   
+   @Override
+   public void clearJarCache() {
+      File[] bundleFolders = folder.listFiles();
+      for(File bundleFolder: bundleFolders){
+         if(bundleFolder.isDirectory()){
+            File[] jars = bundleFolder.listFiles(new FileFilter() {
+               @Override
+               public boolean accept(File file) {
+                  return file.getAbsolutePath().endsWith(".jar");
+               }
+            });
+            for(File jar:jars){
+               jar.delete();
+            }
+         } else {
+            bundleFolder.delete();
+         }
+      }
+   }
+   
+   @Override
+   public File save(String symbolicName, String md5Digest, InputStream servedBundleIn) throws IOException {
+      File namedFolder = new File(folder, symbolicName);
+      if(namedFolder.exists() && !namedFolder.isDirectory()){
+         namedFolder.delete();
+      }
+      namedFolder.mkdirs();
+      
+      File newCachedFile = new File(namedFolder, md5Digest + ".jar");
+      OutputStream cachedFileOut = new FileOutputStream(newCachedFile);
+      StreamPumper.pumpData(servedBundleIn, cachedFileOut);
+      cachedFileOut.close();
+      servedBundleIn.close();
+      writeDateFile(newCachedFile);
+      return newCachedFile;
+   }
+
+   @Override
+   public File get(String symbolicName, String md5Digest) throws FileNotFoundException {
+      File foundFile = new File(new File(folder, symbolicName), md5Digest + ".jar");
+      if(foundFile.exists()){
+         writeDateFile(foundFile);
+         return foundFile; 
+      }
+      return null;
+   }
+
+   /**
+    * Write out a file that has the date a cached file was last accessed.  This file will be used to determine when it is ok to remove a file.
+    * 
+    * @param foundFile
+    */
+   private void writeDateFile(File foundFile) {
+      File dateFile = new File(foundFile.getParentFile(), foundFile.getName()+ ".date");
+      FileOutputStream fos = null;
+      try{
+         fos = new FileOutputStream(dateFile);
+         fos.write(formatter.format(new Date()).getBytes());
+         fos.flush();
+      } catch(IOException ex) {
+         OseeLog.log(getClass(), Level.SEVERE, ex);
+      } finally {
+         if(fos != null){
+            try {
+               fos.close();
+            } catch (IOException e) {
+            }
+         }
+      }
+   }
+   
+   private void clean(){
+      if(folder.exists()){
+         File[] bundleFolders = folder.listFiles();
+         if(bundleFolders != null){
+            for(File bundleFolder: bundleFolders){
+               if(bundleFolder.isDirectory()){
+                  File[] jars = bundleFolder.listFiles(new FileFilter() {
+                     @Override
+                     public boolean accept(File file) {
+                        return file.getAbsolutePath().endsWith(".jar");
+                     }
+                  });
+                  if(jars.length == 0){
+                     if(bundleFolder.listFiles().length == 0){
+                        bundleFolder.delete();
+                     }
+                  } else {
+                     for(File jar:jars){
+                        File dateFile = new File(jar.getAbsolutePath() + ".date");
+                        if(dateFile.exists()){
+                           if(isDateFileOld(dateFile)){//delete files that haven't been recently used
+                              if(jar.exists()){
+                                 jar.delete();
+                              }
+                              dateFile.delete();
+                           }  
+                        } else { //delete a jar without a ".date" file
+                           jar.delete();
+                        }
+                     }
+                  }
+               } else { //delete legacy style cache items
+                  bundleFolder.delete();
+               }
+            }
+         }
+      }
+   }
+
+   private boolean isDateFileOld(File dateFile) {
+      String dateStr = getDateFromFile(dateFile);
+      Date date;
+      try {
+         date = formatter.parse(dateStr);
+      } catch (ParseException e) {
+         return true;
+      }
+      Date oldDate = getOldDate();
+      if(date.before(oldDate)){
+         return true;
+      } else {
+         return false;
+      }
+   }
+   
+   private String getDateFromFile(File dateFile){
+      FileInputStream fis = null;
+      String dateStr = null;
+      try{
+         byte[] buffer = new byte[1024];
+         fis = new FileInputStream(dateFile);
+         fis.read(buffer);
+         dateStr = new String(buffer);
+      } catch(IOException ex) {
+         OseeLog.log(getClass(), Level.SEVERE, ex);
+      } finally {
+         if(fis != null){
+            try {
+               fis.close();
+            } catch (IOException e) {
+            }
+         }
+      }
+      return dateStr;
+   }
+   
+   private Date getOldDate(){
+      Calendar cal = Calendar.getInstance();
+      cal.setTime(new Date());
+      cal.add(Calendar.DAY_OF_MONTH, -7);
+      return cal.getTime();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutConnection.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutConnection.java
new file mode 100644
index 0000000..38a799c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutConnection.java
@@ -0,0 +1,91 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.io.SystemOutput;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.ConsoleInputMessage;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+public class OTESystemOutConnection {
+
+   private OteUdpEndpoint endpoint;
+   private SystemOutput output;
+   private OTESystemOutputHandler outputHandler;
+   private ServiceRegistration<EventHandler> subscribe;
+
+   /**
+    * osgi
+    */
+   public void start(){
+      outputHandler = new OTESystemOutputHandler(endpoint);
+      output.addListener(outputHandler);
+      subscribe = OteEventMessageUtil.subscribe(ConsoleInputMessage.TOPIC, new ConsoleInputHandler(output));
+   }
+   
+   /**
+    * osgi
+    */
+   public void stop(){
+      output.removeListener(outputHandler);
+      if(subscribe != null){
+         subscribe.unregister();
+         subscribe = null;
+      }
+   }
+   
+   /**
+    * osgi
+    */
+   public void bindOteUdpEndpoint(OteUdpEndpoint endpoint){
+      this.endpoint = endpoint;
+   }
+   
+   /**
+    * osgi
+    */
+   public void unbindOteUdpEndpoint(OteUdpEndpoint endpoint){
+      this.endpoint = null;
+   }
+   
+   /**
+    * osgi
+    */
+   public void bindSystemOutput(SystemOutput output){
+      this.output = output;
+   }
+   
+   /**
+    * osgi
+    */
+   public void unbindSystemOutput(SystemOutput output){
+      this.output = null;
+   }
+   
+   private static class ConsoleInputHandler implements EventHandler {
+
+      private SystemOutput output;
+      private ConsoleInputMessage message;
+
+      public ConsoleInputHandler(SystemOutput output) {
+         this.output = output;
+         message = new ConsoleInputMessage();
+      }
+
+      @Override
+      public void handleEvent(Event arg0) {
+         message.setBackingBuffer(OteEventMessageUtil.getBytes(arg0));
+         try {
+            output.write(message.getString());
+         } catch (IOException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+      }
+      
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutputHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutputHandler.java
new file mode 100644
index 0000000..3b82527
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutputHandler.java
@@ -0,0 +1,87 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.io.SystemOutputListener;
+import org.eclipse.osee.ote.remote.messages.ConsoleOutputMessage;
+
+public class OTESystemOutputHandler implements SystemOutputListener {
+
+   private ByteBuffer buffer = ByteBuffer.allocate(4096);
+   private OteUdpEndpoint endpoint;
+   private ConsoleOutputMessage outputMessage;
+   private ScheduledExecutorService newSingleThreadScheduledExecutor;
+   
+   public OTESystemOutputHandler(OteUdpEndpoint endpoint) {
+      this.endpoint = endpoint;
+      outputMessage = new ConsoleOutputMessage();
+      newSingleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setDaemon(true);
+            th.setName("OTEConsole Send");
+            return th;
+         }
+      });
+      newSingleThreadScheduledExecutor.scheduleAtFixedRate(new Runnable(){
+         @Override
+         public void run() {
+            send();
+         }
+      }, 1000, 1000, TimeUnit.MILLISECONDS);
+   }
+
+   @Override
+   public void close() throws IOException {
+      flush();
+   }
+
+   @Override
+   public synchronized void flush() throws IOException {
+      send();
+   }
+   
+   public synchronized void send(){
+      if(buffer.position() > 0){
+         try{
+            buffer.flip();
+            outputMessage.setStringData(buffer);
+            buffer.clear();
+            CopyOnWriteNoIteratorList<OteUdpEndpointSender> broadcastSenders = endpoint.getBroadcastSenders();
+            OteUdpEndpointSender[] oteUdpEndpointSenders = broadcastSenders.get();
+            for(int i = 0; i < oteUdpEndpointSenders.length; i++){
+               oteUdpEndpointSenders[i].send(outputMessage);
+            }
+         } catch (Throwable th){
+         }
+      }
+   }
+
+   @Override
+   public synchronized void write(byte[] b, int off, int len) throws IOException {
+      while(len > 0){
+         if(buffer.position() > 0 && buffer.remaining() <= len){
+            flush();
+         }
+         int length = (buffer.remaining() < len) ? buffer.remaining() : len;
+         len = len - length;
+         buffer.put(b, off, length);   
+         off += length;
+      }
+   }
+
+   @Override
+   public synchronized void write(byte[] b) throws IOException {
+      write(b, 0, b.length);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/PhysicalTypesResponceListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/PhysicalTypesResponceListener.java
new file mode 100644
index 0000000..d9edf52
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/PhysicalTypesResponceListener.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.AVAILABLE_PHYSICAL_TYPES_REQ;
+import org.eclipse.osee.ote.remote.messages.SerializedAvailablePhysicalTypesMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class PhysicalTypesResponceListener implements EventHandler {
+
+   private final EventAdmin eventAdmin;
+   private final IRemoteMessageService messageService;
+   private final SerializedAvailablePhysicalTypesMessage resp;
+   private final AVAILABLE_PHYSICAL_TYPES_REQ req;
+
+   public PhysicalTypesResponceListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.eventAdmin = eventAdmin;
+      this.messageService = messageService;
+      resp = new SerializedAvailablePhysicalTypesMessage();
+      req = new AVAILABLE_PHYSICAL_TYPES_REQ();
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      OteEventMessageUtil.putBytes(event, req);
+      resp.getHeader().RESPONSE_ID.setValue(req.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+      try {
+         resp.setObject((Serializable)messageService.getAvailablePhysicalTypes());
+         OteEventMessageUtil.postEvent(resp, eventAdmin);
+      } catch (IOException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RecordCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RecordCommandListener.java
new file mode 100644
index 0000000..a7746af
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RecordCommandListener.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedRecordCommandMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RecordCommandListener implements EventHandler {
+
+   private final IRemoteMessageService messageService;
+
+   public RecordCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.messageService = messageService;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      RecordCommand cmd;
+      try {
+         SerializedRecordCommandMessage msg = new SerializedRecordCommandMessage(OteEventMessageUtil.getBytes(arg0));
+         cmd = msg.getObject();
+         messageService.startRecording(cmd);
+      } catch (IOException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } catch (ClassNotFoundException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteMessageServiceHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteMessageServiceHandler.java
new file mode 100644
index 0000000..ed42646
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteMessageServiceHandler.java
@@ -0,0 +1,86 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+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.STOP_RECORDING_CMD;
+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.SerializedUnSubscribeMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedZeroizeElementMessage;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RemoteMessageServiceHandler {
+
+   private EventAdmin eventAdmin;
+   private IRemoteMessageService messageService;
+   private ServiceRegistration<EventHandler> addressResponseReg;
+   private ServiceRegistration<EventHandler> availablePhysicalTypesReg;
+   private ServiceRegistration<EventHandler> subscribeToMessageReg;
+   private ServiceRegistration<EventHandler> unsubscribeToMessageReg;
+   private ServiceRegistration<EventHandler> recordReg;
+   private ServiceRegistration<EventHandler> setElementReg;
+   private ServiceRegistration<EventHandler> zeroizeElementReg;
+   private ServiceRegistration<EventHandler> stopRecordReg;
+
+   /**
+    * osgi
+    */
+   public void bindEventAdmin(EventAdmin eventAdmin){
+      this.eventAdmin = eventAdmin;
+   }
+   
+   /**
+    * osgi
+    */
+   public void unbindEventAdmin(EventAdmin eventAdmin){
+      this.eventAdmin = null;
+   }
+   
+   /**
+    * osgi
+    */
+   public void bindIRemoteMessageService(IRemoteMessageService messageService){
+      this.messageService = messageService;
+   }
+   
+   /**
+    * osgi
+    */
+   public void unbindIRemoteMessageService(IRemoteMessageService messageService){
+      this.messageService = null;
+   }
+   
+   /**
+    * osgi
+    */
+   public void start(){
+      addressResponseReg = OteEventMessageUtil.subscribe(GET_INET_ADDRESS_REQ.TOPIC, new AddressResponseListener(eventAdmin, messageService));
+      availablePhysicalTypesReg = OteEventMessageUtil.subscribe(AVAILABLE_PHYSICAL_TYPES_REQ.TOPIC, new PhysicalTypesResponceListener(eventAdmin, messageService));
+      subscribeToMessageReg = OteEventMessageUtil.subscribe(SerializedSubscribeToMessage.EVENT, new SubscriptionCommandListener(eventAdmin, messageService));
+      unsubscribeToMessageReg = OteEventMessageUtil.subscribe(SerializedUnSubscribeMessage.EVENT, new UnSubscribeCommandListener(eventAdmin, messageService));
+      recordReg = OteEventMessageUtil.subscribe(SerializedRecordCommandMessage.EVENT, new RecordCommandListener(eventAdmin, messageService));
+      setElementReg = OteEventMessageUtil.subscribe(SerializedSetElementMessage.EVENT, new SetElementCommandListener(eventAdmin, messageService));
+      zeroizeElementReg = OteEventMessageUtil.subscribe(SerializedZeroizeElementMessage.EVENT, new ZeroizeElementCommandListener(eventAdmin, messageService));
+      stopRecordReg = OteEventMessageUtil.subscribe(STOP_RECORDING_CMD.TOPIC, new StopRecordCommandListener(eventAdmin, messageService));
+   }
+   
+   /**
+    * osgi 
+    */
+   public void stop(){
+      addressResponseReg.unregister();
+      availablePhysicalTypesReg.unregister();
+      subscribeToMessageReg.unregister();
+      unsubscribeToMessageReg.unregister();
+      recordReg.unregister();
+      setElementReg.unregister();
+      zeroizeElementReg.unregister();
+      stopRecordReg.unregister();
+   }
+  
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteOteApiHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteOteApiHandler.java
new file mode 100644
index 0000000..12e976b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteOteApiHandler.java
@@ -0,0 +1,103 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.RequestHostEnvironmentProperties;
+import org.eclipse.osee.ote.remote.messages.RunTestsSerialized;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedDisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedRequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentServerShutdown;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentSetBatchMode;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentTransferFile;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RemoteOteApiHandler {
+
+   private EventAdmin eventAdmin;
+   private OTEApi oteApi;
+   private OteUdpEndpoint oteEndpoint;
+   private ServiceRegistration<EventHandler> configureAndResponse;
+   private ServiceRegistration<EventHandler> getProperties;
+   private ServiceRegistration<EventHandler> getConnection;
+   private ServiceRegistration<EventHandler> disconnect;
+   private ServiceRegistration<EventHandler> runTests;
+   private ServiceRegistration<EventHandler> setBatchMode;
+   private ServiceRegistration<EventHandler> transferFile;
+   private ServiceRegistration<EventHandler> serverShutdown;
+
+   /**
+    * osgi
+    */
+   public void bindEventAdmin(EventAdmin eventAdmin){
+      this.eventAdmin = eventAdmin;
+   }
+   
+   /**
+    * osgi
+    */
+   public void unbindEventAdmin(EventAdmin eventAdmin){
+      this.eventAdmin = null;
+   }
+   
+   /**
+    * osgi
+    */
+   public void bindOTEApi(OTEApi oteApi){
+      this.oteApi = oteApi;
+   }
+   
+   /**
+    * osgi
+    */
+   public void unbindOTEApi(OTEApi oteApi){
+      this.oteApi = null;
+   }
+   
+   /**
+    * osgi
+    */
+   public void bindOteUdpEndpoint(OteUdpEndpoint oteEndpoint){
+      this.oteEndpoint = oteEndpoint;
+   }
+   
+   /**
+    * osgi
+    */
+   public void unbindOteUdpEndpoint(OteUdpEndpoint oteEndpoint){
+      this.oteEndpoint = null;
+   }
+   
+   
+   /**
+    * osgi
+    */
+   public void start(){
+      configureAndResponse = OteEventMessageUtil.subscribe(SerializedConfigurationAndResponse.EVENT, new ConfigureAndResponseListener(eventAdmin, oteEndpoint, oteApi));
+      getProperties =  OteEventMessageUtil.subscribe(RequestHostEnvironmentProperties.TOPIC, new GetPropertiesListener(eventAdmin, oteEndpoint, oteApi));
+      getConnection =  OteEventMessageUtil.subscribe(SerializedRequestRemoteTestEnvironment.TOPIC, new ConnectionListener(eventAdmin, oteEndpoint, oteApi));
+      disconnect =  OteEventMessageUtil.subscribe(SerializedDisconnectRemoteTestEnvironment.TOPIC, new DisconnectListener(eventAdmin, oteEndpoint, oteApi));
+      runTests =  OteEventMessageUtil.subscribe(RunTestsSerialized.RUNTESTS_NAMESPACE + "*", new RunTestListener(eventAdmin, oteEndpoint, oteApi));
+      setBatchMode =  OteEventMessageUtil.subscribe(TestEnvironmentSetBatchMode.TOPIC, new SetBatchModeListener(eventAdmin, oteEndpoint, oteApi));
+      transferFile =  OteEventMessageUtil.subscribe(TestEnvironmentTransferFile.TOPIC, new TransferFileToClientListener(eventAdmin, oteEndpoint, oteApi));
+      serverShutdown =  OteEventMessageUtil.subscribe(TestEnvironmentServerShutdown.TOPIC, new ServerShutdownListener(eventAdmin, oteEndpoint, oteApi));
+   }
+   
+   /**
+    * osgi 
+    */
+   public void stop(){
+      configureAndResponse.unregister();
+      getProperties.unregister();
+      getConnection.unregister();
+      disconnect.unregister();
+      runTests.unregister();
+      setBatchMode.unregister();
+      transferFile.unregister();
+      serverShutdown.unregister();
+   }
+  
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RunTestListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RunTestListener.java
new file mode 100644
index 0000000..639962d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RunTestListener.java
@@ -0,0 +1,110 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.rmi.server.ExportException;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.BooleanResponse;
+import org.eclipse.osee.ote.remote.messages.RunTestsCancel;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultReq;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultResp;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsCancelled;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsDone;
+import org.eclipse.osee.ote.remote.messages.RunTestsSerialized;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RunTestListener implements EventHandler {
+
+   private OTEApi oteApi;
+   
+   private ConcurrentHashMap<String, ICommandHandle> handles;
+   
+   public RunTestListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+      this.oteApi = oteApi;
+      handles = new ConcurrentHashMap<>();
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      if(oteApi.getTestEnvironment() == null){
+         return;
+      }
+      OteEventMessage generic = OteEventMessageUtil.getOteEventMessage(event);
+      if(RunTestsSerialized.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+         RunTestsSerialized serialized = new RunTestsSerialized(OteEventMessageUtil.getBytes(event));
+         try {
+            RunTests runTests = serialized.getObject();
+            String guid = runTests.getGUID();
+            ICommandHandle addCommand = oteApi.getTestEnvironment().addCommand(runTests);
+            handles.put(guid, addCommand);
+         } catch (ExportException e) {
+            e.printStackTrace();
+         } catch (IOException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+      } else if (RunTestsCancel.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+         BooleanResponse booleanResponse = new BooleanResponse();
+         RunTestsCancel cancel = new RunTestsCancel(OteEventMessageUtil.getBytes(event));
+         ICommandHandle iCommandHandle = handles.get(cancel.GUID.getValue());
+         boolean status = false;
+         if(iCommandHandle != null){
+            if(cancel.CANCEL_ALL.getValue()){
+               status = iCommandHandle.cancelAll(true);
+            } else {
+               status = iCommandHandle.cancelSingle(true);
+            }
+         }      
+         booleanResponse.VALUE.setValue(status);
+         booleanResponse.setResponse(cancel);
+         OteEventMessageUtil.postEvent(booleanResponse);
+      } else if (RunTestsGetCommandResultReq.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+         RunTestsGetCommandResultReq req = new RunTestsGetCommandResultReq(OteEventMessageUtil.getBytes(event));
+         ICommandHandle iCommandHandle = handles.get(req.GUID.getValue());
+         RunTestsGetCommandResultResp resp = new RunTestsGetCommandResultResp();
+         if(iCommandHandle != null){
+            ITestCommandResult iTestCommandResult = iCommandHandle.get();
+            try {
+               resp.setObject(iTestCommandResult);
+            } catch (IOException e) {
+               e.printStackTrace();
+            }
+         }   
+         resp.setResponse(req);
+         OteEventMessageUtil.postEvent(resp);
+      } else if (RunTestsIsCancelled.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+         BooleanResponse booleanResponse = new BooleanResponse();
+         RunTestsIsCancelled isCanceled = new RunTestsIsCancelled(OteEventMessageUtil.getBytes(event));
+         ICommandHandle iCommandHandle = handles.get(isCanceled.GUID.getValue());
+         boolean status = false;
+         if(iCommandHandle != null){
+            status = iCommandHandle.isCancelled();
+         }      
+         booleanResponse.VALUE.setValue(status);
+         booleanResponse.setResponse(isCanceled);
+         OteEventMessageUtil.postEvent(booleanResponse);
+      } else if (RunTestsIsDone.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+         BooleanResponse booleanResponse = new BooleanResponse();
+         RunTestsIsDone isDone = new RunTestsIsDone(OteEventMessageUtil.getBytes(event));
+         ICommandHandle iCommandHandle = handles.get(isDone.GUID.getValue());
+         boolean status = false;
+         if(iCommandHandle != null){
+            status = iCommandHandle.isDone();
+         }    
+         booleanResponse.VALUE.setValue(status);
+         booleanResponse.setResponse(isDone);
+         OteEventMessageUtil.postEvent(booleanResponse);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ServerShutdownListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ServerShutdownListener.java
new file mode 100644
index 0000000..a70b0f9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ServerShutdownListener.java
@@ -0,0 +1,69 @@
+package org.eclipse.osee.ote.internal;
+
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentServerShutdown;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ServerShutdownListener implements EventHandler {
+
+   private OTEApi oteApi;
+
+   public ServerShutdownListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+      this.oteApi = oteApi;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      if(oteApi.getIHostTestEnvironment() == null){
+         return;
+      }
+      TestEnvironmentServerShutdown serverShutdown = new TestEnvironmentServerShutdown(OteEventMessageUtil.getBytes(arg0));
+      String id;
+      try {
+         id = (String)oteApi.getIHostTestEnvironment().getProperties().getProperty("id", "dontknow");
+         if(serverShutdown.SERVER_ID.getValue().equals(id)){
+            shutdown();
+         }
+      } catch (RemoteException e) {
+         e.printStackTrace();
+      }
+   }
+   
+   private void shutdown(){
+      BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+      Bundle systemBundle = context.getBundle(0);
+      try {
+         systemBundle.stop();
+         boolean canExit = false;
+         while(!canExit){
+            try{
+               Thread.sleep(20);
+            } catch (Throwable th){
+            }
+            canExit = true;
+            try{
+               for(Bundle b:context.getBundles()){
+                  if(b.getState() != Bundle.ACTIVE){
+                     canExit = false;
+                  }
+               }
+            } catch (Throwable th){
+               canExit = true;
+            }
+         }
+      } catch (BundleException e) {
+      }
+      System.exit(0);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetBatchModeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetBatchModeListener.java
new file mode 100644
index 0000000..1c179c5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetBatchModeListener.java
@@ -0,0 +1,28 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentSetBatchMode;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class SetBatchModeListener implements EventHandler {
+
+   private OTEApi oteApi;
+
+   public SetBatchModeListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+      this.oteApi = oteApi;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      if(oteApi.getTestEnvironment() == null){
+         return;
+      }
+      TestEnvironmentSetBatchMode testEnvironmentSetBatchMode = new TestEnvironmentSetBatchMode(OteEventMessageUtil.getBytes(arg0));
+      oteApi.getTestEnvironment().setBatchMode(testEnvironmentSetBatchMode.SET_BATCH_MODE.getValue());
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetElementCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetElementCommandListener.java
new file mode 100644
index 0000000..d6abffa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetElementCommandListener.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedSetElementMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class SetElementCommandListener implements EventHandler {
+
+   private final IRemoteMessageService messageService;
+
+   public SetElementCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.messageService = messageService;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      SetElementValue cmd;
+      try {
+         SerializedSetElementMessage msg = new SerializedSetElementMessage(OteEventMessageUtil.getBytes(arg0));
+         cmd = msg.getObject();
+         messageService.setElementValue(cmd);
+      } catch (IOException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } catch (ClassNotFoundException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/StopRecordCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/StopRecordCommandListener.java
new file mode 100644
index 0000000..3c042de
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/StopRecordCommandListener.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class StopRecordCommandListener implements EventHandler {
+
+   private final IRemoteMessageService messageService;
+   
+   public StopRecordCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.messageService = messageService;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      messageService.stopRecording();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SubscriptionCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SubscriptionCommandListener.java
new file mode 100644
index 0000000..6b8182a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SubscriptionCommandListener.java
@@ -0,0 +1,48 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscribeToMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscriptionDetailsMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class SubscriptionCommandListener implements EventHandler {
+
+   private final IRemoteMessageService messageService;
+   private final SerializedSubscribeToMessage cmd;
+   
+   public SubscriptionCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.messageService = messageService;
+      cmd = new SerializedSubscribeToMessage();
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      OteEventMessageUtil.putBytes(event, cmd);
+      SubscribeToMessage subscribe;
+      try {
+         subscribe = cmd.getObject();
+         SubscriptionDetails resp = messageService.subscribeToMessage(subscribe);
+         SerializedSubscriptionDetailsMessage stat = new SerializedSubscriptionDetailsMessage();
+         stat.getHeader().RESPONSE_ID.setValue(cmd.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+         stat.setObject(resp);
+         OteEventMessageUtil.postEvent(stat);
+      } catch (UnknownHostException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } catch (IOException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } catch (ClassNotFoundException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/TransferFileToClientListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/TransferFileToClientListener.java
new file mode 100644
index 0000000..c376e32
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/TransferFileToClientListener.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.filetransfer.TcpFileTransfer;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentTransferFile;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class TransferFileToClientListener implements EventHandler {
+
+   private ExecutorService pool;
+   private OTEApi oteApi;
+
+   public TransferFileToClientListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+      this.oteApi = oteApi;
+      pool = Executors.newCachedThreadPool(new ThreadFactory() {
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setName("OTE File Transfer");
+            return th;
+         }
+      });
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      if(oteApi.getTestEnvironment() == null){
+         return;
+      }
+      TestEnvironmentTransferFile testEnvironmentTransferFile = new TestEnvironmentTransferFile(OteEventMessageUtil.getBytes(arg0));
+      InetSocketAddress inetSocketAddress;
+      try {
+         inetSocketAddress = new InetSocketAddress(testEnvironmentTransferFile.ADDRESS.getAddress(), testEnvironmentTransferFile.ADDRESS.getPort());
+         TcpFileTransfer.sendFile(pool, new File(testEnvironmentTransferFile.FILE_PATH.getValue()), inetSocketAddress);
+      } catch (UnknownHostException e) {
+         e.printStackTrace();
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/UnSubscribeCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/UnSubscribeCommandListener.java
new file mode 100644
index 0000000..11d9d55
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/UnSubscribeCommandListener.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedUnSubscribeMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class UnSubscribeCommandListener implements EventHandler {
+
+   private final IRemoteMessageService messageService;
+   private final SerializedUnSubscribeMessage cmd;
+   
+   public UnSubscribeCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.messageService = messageService;
+      cmd = new SerializedUnSubscribeMessage();
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      OteEventMessageUtil.putBytes(event, cmd);
+      UnSubscribeToMessage unsubscribe;
+      try {
+         unsubscribe = cmd.getObject();
+         messageService.unsubscribeToMessage(unsubscribe);
+      } catch (UnknownHostException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } catch (IOException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } catch (ClassNotFoundException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ZeroizeElementCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ZeroizeElementCommandListener.java
new file mode 100644
index 0000000..8bf3f9b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ZeroizeElementCommandListener.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedZeroizeElementMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ZeroizeElementCommandListener implements EventHandler {
+
+   private final IRemoteMessageService messageService;
+
+   public ZeroizeElementCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+      this.messageService = messageService;
+   }
+
+   @Override
+   public void handleEvent(Event arg0) {
+      ZeroizeElement cmd;
+      try {
+         SerializedZeroizeElementMessage msg = new SerializedZeroizeElementMessage(OteEventMessageUtil.getBytes(arg0));
+         cmd = msg.getObject();
+         messageService.zeroizeElement(cmd);
+      } catch (IOException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } catch (ClassNotFoundException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/endpoint/EndpointComponent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/endpoint/EndpointComponent.java
new file mode 100644
index 0000000..579060d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/endpoint/EndpointComponent.java
@@ -0,0 +1,148 @@
+package org.eclipse.osee.ote.internal.endpoint;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.HashMap;
+
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.endpoint.EndpointDataProcessor;
+import org.eclipse.osee.ote.endpoint.OteEndpointSender;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointInlineSender;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointReceiverImpl;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class EndpointComponent implements OteUdpEndpoint {
+   
+   private OteUdpEndpointReceiverImpl receiver;
+   private HashMap<InetSocketAddress, OteUdpEndpointSender> senders = new HashMap<>();
+   private CopyOnWriteNoIteratorList<OteUdpEndpointSender> broadcastThreaded = new CopyOnWriteNoIteratorList<>(OteUdpEndpointSender.class);//for backwards compatibility
+   private boolean debug = false;
+   
+   public EndpointComponent(){
+      int port;
+      try {
+         String strPort = OtePropertiesCore.endpointPort.getValue(Integer.toString(PortUtil.getInstance().getValidPort()));
+         try{
+            port = Integer.parseInt(strPort);
+         } catch (Throwable th){
+            port = PortUtil.getInstance().getValidPort();
+         }
+         receiver = new OteUdpEndpointReceiverImpl(new InetSocketAddress(InetAddress.getLocalHost(), port));
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+   }
+   
+   public void start(){
+      receiver.start();
+      setDebugOutput(false);
+   }
+   
+   public synchronized void stop(){
+      receiver.stop();
+      for(OteEndpointSender sender: senders.values()){
+         try {
+            sender.stop();
+         } catch (Throwable e) {
+            e.printStackTrace();
+         }
+      }
+   }
+   
+   @Override
+   public void setDebugOutput(boolean debug) {
+      String ioRedirect = OtePropertiesCore.ioRedirect.getValue();
+      if(ioRedirect != null){
+         if(Boolean.parseBoolean(ioRedirect)){
+            this.debug = false;
+            System.out.println("Unable to enable Endpoint debug because -Dote.io.redirect is enabled.");
+            return;
+         }
+      }
+      this.debug = debug;
+      receiver.setDebugOutput(debug);
+      for(OteUdpEndpointSender sender: senders.values()){
+         sender.setDebug(debug);
+      }
+   }
+
+   @Override
+   public InetSocketAddress getLocalEndpoint() {
+      return receiver.getEndpoint();
+   }
+
+   @Override
+   public synchronized OteUdpEndpointSender getOteEndpointThreadedSender(InetSocketAddress address) {
+      OteUdpEndpointSender sender = senders.get(address);
+      if(sender == null || (sender != null && sender.isClosed())){
+         sender = new OteUdpEndpointSender(address);
+         sender.setDebug(debug);
+         sender.start();
+         senders.put(address, sender);
+      }
+      return sender;
+   }
+
+   @Override
+   public OteUdpEndpointInlineSender getOteEndpointInlineSender(InetSocketAddress address) {
+      return new OteUdpEndpointInlineSender(address);
+   }
+   
+   @Override
+   public synchronized OteUdpEndpointSender getOteEndpointSender(InetSocketAddress address) {
+      return getOteEndpointThreadedSender(address);
+   }
+   
+   @Override
+   public void addBroadcast(OteUdpEndpointSender sender) {
+      if(!isAlreadyInBroadcastThreadedList(sender) && sender instanceof OteUdpEndpointSender){
+         broadcastThreaded.add((OteUdpEndpointSender)sender);
+      }
+   }
+
+   private boolean isAlreadyInBroadcastThreadedList(OteEndpointSender sender) {
+      OteEndpointSender[] oteUdpEndpointSenders = broadcastThreaded.get();
+      for(int i = 0; i < oteUdpEndpointSenders.length; i++) {
+         if(oteUdpEndpointSenders[i].getAddress().getPort() == sender.getAddress().getPort()){
+            if(oteUdpEndpointSenders[i].getAddress().getAddress().equals(sender.getAddress().getAddress())){
+               return true;
+            }
+         }
+      }
+      return false;
+   }
+
+   @Override
+   public CopyOnWriteNoIteratorList<OteUdpEndpointSender> getBroadcastSenders() {
+      return broadcastThreaded;
+   }
+
+   @Override
+   public void addDataProcessor(EndpointDataProcessor processor) {
+      receiver.addDataProcessor(processor);
+   }
+
+   @Override
+   public void removeDataProcessor(EndpointDataProcessor processor) {
+      receiver.removeDataProcessor(processor);      
+   }
+
+   @Override
+   public void removeBroadcast(OteUdpEndpointSender sender) {
+      if(sender == null){
+         broadcastThreaded.clear();
+      } else {
+         broadcastThreaded.remove(sender);
+      }
+   }
+   
+//   @Override
+//   public void clearBroadcast() {
+//      broadcastThreaded.clear();
+//   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/NotifyOnResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/NotifyOnResponse.java
new file mode 100644
index 0000000..ec37344
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/NotifyOnResponse.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * 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.internal.message.event.send;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+public class NotifyOnResponse<T extends OteEventMessage> implements EventHandler {
+
+   private final int responseId;
+   private final Condition responseReceived;
+   private final Lock lock;
+   private final Class<T> clazz;
+   private T recievedMessage;
+   private volatile boolean responded = false;
+   private final ServiceRegistration<EventHandler> reg;
+   private T responseMessage;
+
+   public NotifyOnResponse(Class<T> clazz, String responseTopic, int responseId, Lock lock, Condition responseReceived) {
+      this.responseId = responseId;
+      this.clazz = clazz;
+      this.responseReceived = responseReceived;
+      this.lock = lock;
+      reg = OteEventMessageUtil.subscribe(responseTopic, this);
+   }
+
+   @SuppressWarnings("unchecked")
+   public NotifyOnResponse(T responseMessage, int responseId2, Lock lock2, Condition responseReceived2) {
+      this((Class<T>)responseMessage.getClass(), responseMessage.getHeader().TOPIC.getValue(), responseId2, lock2, responseReceived2);
+      this.responseMessage = responseMessage;
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      try {
+         if(responseMessage == null){
+            recievedMessage = clazz.newInstance();
+         } else {
+            recievedMessage = responseMessage;
+         }
+         OteEventMessageUtil.putBytes(event, recievedMessage);
+         if(recievedMessage.getHeader().RESPONSE_ID.getValue() == responseId){
+            lock.lock();
+            try{
+               responded = true;
+               responseReceived.signal();
+            }finally{
+               lock.unlock();
+            }
+         } else {
+            recievedMessage = null;
+         }
+      } catch (InstantiationException e) {
+         recievedMessage = null;
+         e.printStackTrace();
+      } catch (IllegalAccessException e) {
+         recievedMessage = null;
+         e.printStackTrace();
+      }
+   }
+
+   public boolean hasResponse(){
+      return responded;
+   }
+   
+   public T getMessage(){
+      return recievedMessage;
+   }
+   
+   public void dispose(){
+      reg.unregister();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureImpl.java
new file mode 100644
index 0000000..4d5a906
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureImpl.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * 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.internal.message.event.send;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageFuture;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+public class OteEventMessageFutureImpl<T extends OteEventMessage, R extends OteEventMessage> implements OteEventMessageFuture<T, R>, EventHandler{
+
+   private final ServiceRegistration<EventHandler> reg;
+   protected final OteEventMessageCallable<T, R> callable;
+   protected final Class<R> recieveClasstype;
+   protected final int responseId;
+   protected final T sentMessage;
+   private final ScheduledExecutorService ex;
+   private final ReentrantLock lock;
+   private final Condition condition;
+   private final ScheduledFuture<?> wakeup;
+   private TimeoutRunnable<T, R> timeoutRunnable;
+   protected volatile boolean gotResponse = false;
+   protected volatile boolean isDone = false;
+
+   public OteEventMessageFutureImpl(Class<R> recieveClasstype, OteEventMessageCallable<T, R> callable, T sentMessage, String responseTopic, int responseId, long timeout) {
+      this.callable = callable;
+      this.responseId = responseId;
+      this.sentMessage = sentMessage;
+      this.recieveClasstype = recieveClasstype;
+      reg = OteEventMessageUtil.subscribe(responseTopic, this);
+      lock = new ReentrantLock();
+      condition = lock.newCondition();
+      ex = Executors.newSingleThreadScheduledExecutor(new ThreadFactory(){
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setDaemon(true);
+            th.setName("OteEventMessage Timeout");
+            return th;
+         }
+      });
+      timeoutRunnable = new TimeoutRunnable<>(lock, condition, sentMessage, callable, this);
+      wakeup = ex.schedule(timeoutRunnable, timeout, TimeUnit.MILLISECONDS);
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      try {
+         R msg = recieveClasstype.newInstance();
+         OteEventMessageUtil.putBytes(event, msg);
+         if(msg.getHeader().RESPONSE_ID.getValue() == responseId){
+            cancel();
+            gotResponse = true;
+            callable.call(sentMessage, msg, this);
+            executeCondition();
+         }
+      } catch (InstantiationException e) {
+         e.printStackTrace();
+      } catch (IllegalAccessException e) {
+         e.printStackTrace();
+      }
+   }
+
+   protected final void executeCondition(){
+      lock.lock();
+      try{
+         condition.signal();
+      } finally {
+         lock.unlock();
+      }
+   }
+   
+   @Override
+   public void cancel(){
+      dispose();
+   }
+   
+   @Override
+   public void waitForCompletion(){
+      lock.lock();
+      try{
+         while(!timeoutRunnable.isTimedOut() && !this.wakeup.isDone()){
+            try {
+               condition.await();
+            } catch (InterruptedException e) {
+               OseeLog.log(getClass(), Level.SEVERE, e);
+            }
+         }
+      } finally {
+         lock.unlock();
+      }
+   }
+   
+   @Override
+   public boolean isTimedOut(){
+      return timeoutRunnable.isTimedOut();
+   }
+   
+   @Override
+   public boolean gotResponse(){
+      return gotResponse ;
+   }
+   
+   @Override
+   public void complete(){
+      cancel();
+      executeCondition();
+   }
+   
+   private void dispose(){
+      reg.unregister();
+      wakeup.cancel(false);
+      this.ex.shutdown();
+      isDone = true;
+   }
+
+   @Override
+   public boolean isDone() {
+      return isDone;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureMultipleResponseImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureMultipleResponseImpl.java
new file mode 100644
index 0000000..fafd13b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureMultipleResponseImpl.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * 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.internal.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+import org.osgi.service.event.Event;
+
+
+public class OteEventMessageFutureMultipleResponseImpl<T extends OteEventMessage, R extends OteEventMessage> extends OteEventMessageFutureImpl<T, R> {
+
+
+   public OteEventMessageFutureMultipleResponseImpl(Class<R> recieveClasstype, OteEventMessageCallable<T, R> callable, T sentMessage, String responseTopic, int responseId, long timeout) {
+      super(recieveClasstype, callable, sentMessage, responseTopic, responseId, timeout);
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+      try {
+         R msg = recieveClasstype.newInstance();
+         OteEventMessageUtil.putBytes(event, msg);
+         callable.call(sentMessage, msg, this);
+      } catch (InstantiationException e) {
+         e.printStackTrace();
+      } catch (IllegalAccessException e) {
+         e.printStackTrace();
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageResponseFutureImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageResponseFutureImpl.java
new file mode 100644
index 0000000..128ce15
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageResponseFutureImpl.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.internal.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageResponseCallable;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageResponseFuture;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+public class OteEventMessageResponseFutureImpl<R extends OteEventMessage> implements OteEventMessageResponseFuture<R>, EventHandler {
+   private final ServiceRegistration<EventHandler> reg;
+   private final OteEventMessageResponseCallable<R> callable;
+   private final Class<R> recieveClasstype;
+
+   public OteEventMessageResponseFutureImpl(Class<R> recieveClasstype, OteEventMessageResponseCallable<R> callable, String responseTopic) {
+      this.callable = callable;
+      this.recieveClasstype = recieveClasstype;
+      reg = OteEventMessageUtil.subscribe(responseTopic, this);
+   }
+   
+   @Override
+   public void handleEvent(Event event) {
+      try {
+         R msg = recieveClasstype.newInstance();
+         OteEventMessageUtil.putBytes(event, msg);
+         callable.call(msg);
+      } catch (InstantiationException e) {
+         e.printStackTrace();
+      } catch (IllegalAccessException e) {
+         e.printStackTrace();
+      }
+   }
+
+   @Override
+   public void cancel(){
+      dispose();
+   }
+   
+   private void dispose(){
+      reg.unregister();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/TimeoutRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/TimeoutRunnable.java
new file mode 100644
index 0000000..3681e2c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/TimeoutRunnable.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.internal.message.event.send;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+
+
+public class TimeoutRunnable<T extends OteEventMessage, R extends OteEventMessage> implements Runnable {
+
+   private final ReentrantLock lock;
+   private final Condition condition;
+   private final T sentMessage;
+   private boolean timedOut = false;
+   private final OteEventMessageCallable<T, R> callable;
+   private final OteEventMessageFutureImpl<T, R> oteByteMessageFuture;
+
+   public TimeoutRunnable(ReentrantLock lock, Condition condition, T sentMessage, OteEventMessageCallable<T, R> callable, OteEventMessageFutureImpl<T, R> oteByteMessageFuture) {
+      this.lock = lock;
+      this.condition = condition;
+      this.sentMessage = sentMessage;
+      this.callable = callable;
+      this.oteByteMessageFuture = oteByteMessageFuture;
+   }
+
+   @Override
+   public void run() {
+      lock.lock();
+      try{
+         timedOut = true;
+         try{
+            oteByteMessageFuture.cancel();
+            callable.timeout(sentMessage);
+         } finally {
+            condition.signal();
+         }
+      } finally {
+         lock.unlock();
+      }
+   }
+   
+   public boolean isTimedOut(){
+      return timedOut;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/ElementPath.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/ElementPath.java
new file mode 100644
index 0000000..a6247f9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/ElementPath.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * 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.message;
+
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ElementPath implements Serializable {
+
+   private static final long serialVersionUID = 4928814252711879251L;
+
+   private final List<Object> elementPath;
+   private String elementPathAsString = null;
+   private final boolean isHeaderElement;
+
+   public static ElementPath decode(String encodedPath) {
+      List<Object> path = new LinkedList<>();
+      String[] components = encodedPath.split("\\+");
+
+      for (String component : components) {
+         try {
+            Integer i = Integer.parseInt(component);
+            path.add(i);
+         } catch (NumberFormatException e) {
+            path.add(component);
+         }
+      }
+
+      return new ElementPath(path);
+   }
+
+   public String getMessageClass() {
+      return elementPath.get(0).toString();
+   }
+
+   public boolean isHeaderElement() {
+      return isHeaderElement;
+   }
+
+   public String getElementName() {
+      return elementPath.get(elementPath.size() - 1).toString();
+   }
+
+   public ElementPath(List<Object> path) {
+      elementPath = path;
+      String string = (String) path.get(1);
+      isHeaderElement = string.startsWith("HEADER(");
+
+   }
+
+   public List<Object> getList() {
+      return elementPath;
+   }
+
+   @Override
+   public String toString() {
+      if (elementPathAsString == null) {
+         StringBuilder sb = new StringBuilder(64);
+         if (isHeaderElement) {
+            String string = (String) elementPath.get(1);
+            String headerName = string.substring(string.indexOf('(') + 1, string.indexOf(')'));
+            sb.append(headerName).append("-HEADER").append('.').append(elementPath.get(2).toString());
+         } else {
+            for (int i = 1; i < elementPath.size(); i++) {
+               Object obj = elementPath.get(i);
+               if (obj instanceof Integer) {
+                  sb.delete(sb.length() - 1, sb.length());
+                  sb.append('[');
+                  sb.append(((Integer) obj).intValue());
+                  sb.append(']');
+               } else {
+
+                  sb.append(obj.toString());
+               }
+               sb.append('.');
+            }
+            sb.deleteCharAt(sb.length() - 1);
+         }
+         elementPathAsString = sb.toString();
+      }
+      return elementPathAsString;
+   }
+
+   public String encode() {
+
+      StringBuilder buffer = new StringBuilder(256);
+      for (Object component : elementPath) {
+         buffer.append(component.toString());
+         buffer.append('+');
+      }
+      buffer.deleteCharAt(buffer.length() - 1);
+      return buffer.toString();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java
new file mode 100644
index 0000000..4da5002
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.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.message;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IInstrumentationRegistrationListener extends Remote {
+   void onRegistered(String name, IOInstrumentation instrumentation) throws RemoteException;
+
+   void onDeregistered(String name) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java
new file mode 100644
index 0000000..b1201bb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.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.message;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMemSourceChangeListener {
+   void onChange(DataType oldtype, DataType newType, Message<?, ?, ?> message);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java
new file mode 100644
index 0000000..2f4a381
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageDisposeListener.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.message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageDisposeListener {
+   void onPreDispose(Message<?, ?, ?> message);
+
+   void onPostDispose(Message<?, ?, ?> message);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageHeader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageHeader.java
new file mode 100644
index 0000000..c0988c1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageHeader.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.message;
+
+import org.eclipse.osee.ote.message.elements.Element;
+
+/**
+ * Defines operations for setting and getting the raw bytes that comprise a message header as well as getting the name
+ * of the message that the header is attached to
+ * 
+ * @author Ken J. Aguilar
+ */
+public interface IMessageHeader {
+   public String getMessageName();
+
+   public int getHeaderSize();
+
+   /**
+    * Sets the data that backs this header.
+    */
+   //   public void copyData(byte[] data);
+   public byte[] getData();
+
+   public Element[] getElements();
+
+   public void setNewBackingBuffer(byte[] data);
+
+   public String toXml();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageSendListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageSendListener.java
new file mode 100644
index 0000000..729ec99
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageSendListener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.message;
+
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageSendListener {
+   void onPreSend(MessageData messageData);
+
+   void onPostSend(MessageData messageData);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageTestContext.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageTestContext.java
new file mode 100644
index 0000000..e4fe421
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageTestContext.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.message;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageTestContext extends ITestContext {
+   void resetScriptLoader(Configuration configuration, String[] strings) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java
new file mode 100644
index 0000000..5ea7b84
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * 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.message;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class IOInstrumentationDB {
+
+   private final Map<String, IOInstrumentation> ioInstrumentation = new ConcurrentHashMap<>();;
+   private final CopyOnWriteArraySet<IInstrumentationRegistrationListener> listeners =
+      new CopyOnWriteArraySet<IInstrumentationRegistrationListener>();
+
+   IOInstrumentationDB() {
+   }
+
+   public IOInstrumentation getIOInstrumentation(String name) {//, IOInstrumentation io){
+      return ioInstrumentation.get(name);
+   }
+
+   public IOInstrumentation registerIOInstrumentation(String name, IOInstrumentation io) {
+      IOInstrumentation old = ioInstrumentation.put(name, io);
+      if (old != io) {
+         notifyRegistration(name, io);
+      }
+      return old;
+   }
+
+   public void unregisterIOInstrumentation(String name) {
+      IOInstrumentation io = ioInstrumentation.remove(name);
+      if (io != null) {
+         notifyDeregistration(name);
+      }
+   }
+
+   public void addRegistrationListener(IInstrumentationRegistrationListener listener) {
+      listeners.add(listener);
+      for (Map.Entry<String, IOInstrumentation> entry : ioInstrumentation.entrySet()) {
+         try {
+            listener.onRegistered(entry.getKey(), entry.getValue());
+         } catch (Exception e) {
+            OseeLog.log(IOInstrumentation.class, Level.SEVERE,
+               "exception notifying listener of IO instrumentation registration", e);
+         }
+      }
+   }
+
+   public void removeRegistrationListener(IInstrumentationRegistrationListener listener) {
+      listeners.remove(listener);
+   }
+
+   private void notifyRegistration(String name, IOInstrumentation io) {
+      for (IInstrumentationRegistrationListener listener : listeners) {
+         try {
+            listener.onRegistered(name, io);
+         } catch (Exception e) {
+            OseeLog.log(IOInstrumentation.class, Level.SEVERE,
+               "exception notifying listener of IO instrumentation registration", e);
+         }
+      }
+   }
+
+   private void notifyDeregistration(String name) {
+      for (IInstrumentationRegistrationListener listener : listeners) {
+         try {
+            listener.onDeregistered(name);
+         } catch (Exception e) {
+            OseeLog.log(IOInstrumentation.class, Level.SEVERE,
+               "exception notifying listener of IO instrumentation de-registration", e);
+         }
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOType.java
new file mode 100644
index 0000000..a32ed8b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOType.java
@@ -0,0 +1,5 @@
+package org.eclipse.osee.ote.message;
+
+public interface IOType {
+   String name();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOteIO.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOteIO.java
new file mode 100644
index 0000000..7d6ee9d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOteIO.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.message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOteIO {
+   void send();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java
new file mode 100644
index 0000000..11888ad
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.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.message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IPreScriptInstantiation {
+   void run();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java
new file mode 100644
index 0000000..ed68c72
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java
@@ -0,0 +1,1355 @@
+/*******************************************************************************
+ * 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.message;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.condition.ICondition;
+import org.eclipse.osee.ote.message.condition.TransmissionCountCondition;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.MsgWaitResult;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.IMessageRequestor;
+import org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+import org.eclipse.osee.ote.message.listener.MessageSystemListener;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.w3c.dom.Document;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class Message<S extends ITestEnvironmentMessageSystemAccessor, T extends MessageData, U extends Message<S, T, U>> implements Xmlizable, XmlizableStream {
+   private static volatile AtomicLong constructed = new AtomicLong(0);
+   private static volatile AtomicLong finalized = new AtomicLong(0);
+   private final LinkedHashMap<String, Element> elementMap;
+   @JsonProperty
+   private final String name;
+   private final MessageSystemListener listenerHandler;
+   protected final ArrayList<IMessageScheduleChangeListener> schedulingChangeListeners =
+      new ArrayList<IMessageScheduleChangeListener>(10);
+   private boolean destroyed = false;
+
+   private DataType currentMemType;
+   private final Map<DataType, ArrayList<U>> memTypeToMessageMap = new HashMap<>();
+   private final Map<DataType, ArrayList<T>> memToDataMap = new HashMap<>();
+   private final int phase;
+   protected double rate;
+   protected final double defaultRate;
+   private final boolean isScheduledFromStart;
+   private boolean regularUnscheduleCalled = false;
+   private boolean isTurnedOff = false;
+
+   @SuppressWarnings("rawtypes")
+   private IMessageRequestor messageRequestor = null;
+   private static final double doubleTolerance = 0.000001;
+   private final Set<DataType> memTypeActive = new HashSet<>();
+
+   private T defaultMessageData;
+
+   private final List<IMemSourceChangeListener> preMemSourceChangeListeners = new CopyOnWriteArrayList<>();
+   private final List<IMemSourceChangeListener> postMemSourceChangeListeners =
+      new CopyOnWriteArrayList<IMemSourceChangeListener>();
+   private final List<IMessageDisposeListener> preMessageDisposeListeners = new CopyOnWriteArrayList<>();
+   private final List<IMessageDisposeListener> postMessageDisposeListeners = new CopyOnWriteArrayList<>();
+
+   private final int defaultByteSize;
+   private final int defaultOffset;
+
+   protected final MessageSystemListener removableListenerHandler;
+
+   public Message(String name, int defaultByteSize, int defaultOffset, boolean isScheduled, int phase, double rate) {
+      constructed.incrementAndGet();
+      listenerHandler = new MessageSystemListener(this);
+      this.name = name;
+      this.defaultByteSize = defaultByteSize;
+      this.defaultOffset = defaultOffset;
+      elementMap = new LinkedHashMap<>(20);
+      this.phase = phase;
+      this.rate = rate;
+      this.defaultRate = rate;
+      this.isScheduledFromStart = isScheduled;
+      GCHelper.getGCHelper().addRefWatch(this);
+      this.removableListenerHandler = new MessageSystemListener(this);
+   }
+
+   /**
+    * Attemps to remove the specified listener from the list of REMOVABLE listeners. This will NOT remove any listener
+    * added using the addListener() call, only those added using the addRemovableListener() call will be removed.
+    * 
+    * @param listener The removable listener to remove
+    */
+   public void removeRemovableListener(IOSEEMessageListener listener) {
+      removableListenerHandler.removeListener(listener);
+   }
+
+   /**
+    * Adds listener to the list of listeners removed at the end of every script.
+    * 
+    * @param listener the removable listern to add.
+    */
+   public void addRemovableListener(IOSEEMessageListener listener) {
+      removableListenerHandler.addListener(listener);
+   }
+
+   /**
+    * Removes all the listeners from the RemovableListenerHandler. This method is meant to be called upon script
+    * completion but can be used by anyone. Other listeners can be removed using the traditional removeListener call.
+    */
+   public void clearRemovableListeners() {
+      this.removableListenerHandler.clearListeners();
+
+   }
+
+   public void destroy() {
+
+      notifyPreDestroyListeners();
+      destroyed = true;
+      defaultMessageData.dispose();
+
+      memToDataMap.clear();
+      memTypeToMessageMap.clear();
+      listenerHandler.dispose();
+
+      notifyPostDestroyListeners();
+      schedulingChangeListeners.clear();
+      postMessageDisposeListeners.clear();
+      preMessageDisposeListeners.clear();
+      postMemSourceChangeListeners.clear();
+      preMemSourceChangeListeners.clear();
+      elementMap.clear();
+
+      if (messageRequestor != null) {
+         messageRequestor.dispose();
+      }
+      removableListenerHandler.dispose();
+   }
+
+   private void notifyPostDestroyListeners() {
+      for (IMessageDisposeListener listener : postMessageDisposeListeners) {
+         listener.onPostDispose(this);
+      }
+   }
+
+   private void notifyPreDestroyListeners() {
+      for (IMessageDisposeListener listener : preMessageDisposeListeners) {
+         try {
+            listener.onPreDispose(this);
+         } catch (Exception e) {
+            OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, "exception during listener notification", e);
+         }
+      }
+   }
+
+   public void setData(byte[] data) {
+      checkState();
+      if (data == null) {
+         throw new IllegalArgumentException("data array cannot be null");
+      }
+      for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+         msgdata.setFromByteArray(data);
+      }
+   }
+
+   public void setData(ByteBuffer data, int length) {
+      checkState();
+      if (data == null) {
+         throw new IllegalArgumentException("data array cannot be null");
+      }
+      for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+         msgdata.setFromByteArray(data, length);
+      }
+   }
+
+   public void setData(byte[] data, int length) {
+      checkState();
+      if (data == null) {
+         throw new IllegalArgumentException("data array cannot be null");
+      }
+      for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+         msgdata.setFromByteArray(data, length);
+      }
+   }
+
+   public void setBackingBuffer(byte[] data) {
+      checkState();
+      if (data == null) {
+         throw new IllegalArgumentException("data array cannot be null");
+      }
+      for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+         msgdata.setNewBackingBuffer(data);
+      }
+   }
+
+   public byte[] getData() {
+      checkState();
+      return getActiveDataSource().toByteArray();
+   }
+
+   public T getMemoryResource() {
+      checkState();
+      return memToDataMap.get(currentMemType).get(0);
+   }
+
+   /**
+    * Returns the number of byte words in the payload of this message.
+    * 
+    * @return number of bytes in the message payload
+    */
+   public int getPayloadSize() {
+      checkState();
+      return memToDataMap.get(currentMemType).get(0).getPayloadSize();
+   }
+
+   public int getPayloadSize(DataType type) {
+      checkState();
+      return memToDataMap.get(type).get(0).getPayloadSize();
+   }
+
+   /**
+    * Returns the number of byte words in the header of this message.
+    * 
+    * @return the number of bytes in the header
+    */
+   public int getHeaderSize() {
+      checkState();
+      final IMessageHeader hdr = memToDataMap.get(currentMemType).get(0).getMsgHeader();
+      if (hdr != null) {
+         return hdr.getHeaderSize();
+      }
+      return 0;
+   }
+
+   public int getHeaderSize(DataType type) {
+      checkState();
+      return memToDataMap.get(type).get(0).getMsgHeader().getHeaderSize();
+   }
+
+   /*
+    * protected static final ThreadLocal current = new ThreadLocal() { protected Object initialValue() { return new
+    * MemMessageHolder(); } };
+    */
+   public void send() throws MessageSystemException {
+      checkState();
+      if (!isTurnedOff) {
+         ArrayList<T> dataList = memToDataMap.get(currentMemType);
+         if (dataList != null) {
+            int listSize = dataList.size();
+            for (int i = 0; i < listSize; i++) {
+               dataList.get(i).send();
+            }
+         } else {
+            throw new MessageSystemException(
+               "Message: " + name + " does not have the  physical type " + currentMemType + " available for this environment!!!!!",
+               Level.SEVERE);
+         }
+      }
+   }
+
+   public void addSendListener(IMessageSendListener listener) {
+      getActiveDataSource().addSendListener(listener);
+   }
+
+   public void removeSendListener(IMessageSendListener listener) {
+      getActiveDataSource().removeSendListener(listener);
+   }
+
+   public boolean containsSendListener(IMessageSendListener listener) {
+      return getActiveDataSource().containsSendListener(listener);
+   }
+
+   public void send(DataType type) throws MessageSystemException {
+      checkState();
+      if (!isTurnedOff) {
+         Collection<T> dataList = memToDataMap.get(type);
+         if (dataList != null) {
+
+            for (T data : dataList) {
+               data.send();
+            }
+
+         } else {
+            throw new MessageSystemException(
+               "Message: " + name + " does not have a physical type available for this environment!!!!!", Level.SEVERE);
+         }
+      } else {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.WARNING,
+            this.getMessageName() + " has attempted a send(), but is currently turned off.");
+      }
+   }
+
+   //	we may not really need this guy, in fact I think we don't
+   //	protected void takeNextSample() {
+   //	for (T item : memToDataMap.get(currentMemType)) {
+   //	item.takeNextSample();
+   //	}
+   //	}
+
+   public boolean setMemSource(S accessor, DataType type) {
+      return setMemSource(type);
+   }
+
+   /**
+    * Associates Messages to MemTypes based on the memType's physical availability
+    */
+   //	public abstract void associateMessages(S accessor);
+   /**
+    * Changes the element references for this message to a corresponding message with the given MemType. The messages
+    * defined for this memType must have been provided by the associateMessages function to be seen.
+    * 
+    * @param memType the possibly new physical mem type.
+    */
+   public void switchElementAssociation(DataType memType) {
+      checkState();
+      switchElementAssociation(getMessageTypeAssociation(memType));
+   }
+
+   //   public abstract void switchElementAssociation(Collection<U> messages);
+
+   public void addMessageTypeAssociation(DataType memType, U messageToBeAdded) {
+      checkState();
+      ArrayList<U> list;
+      if (!memTypeToMessageMap.containsKey(memType)) {
+         list = new ArrayList<>(4);
+         memTypeToMessageMap.put(memType, list);
+      } else {
+         list = memTypeToMessageMap.get(memType);
+      }
+      list.add(messageToBeAdded);
+
+      //		addMessageDataSource(messageToBeAdded.defaultMessageData);
+   }
+
+   protected Collection<U> getMessageTypeAssociation(DataType type) {
+      final ArrayList<U> list = memTypeToMessageMap.get(type);
+      if (list != null) {
+         return Collections.unmodifiableCollection(list);
+      } else {
+         return new ArrayList<U>();
+      }
+   }
+
+   public void addMessageDataSource(T... dataList) {
+      checkState();
+      for (T data : dataList) {
+         addMessageDataSource(data);
+      }
+   }
+
+   public void addMessageDataSource(Collection<T> dataList) {
+      for (T data : dataList) {
+         addMessageDataSource(data);
+      }
+   }
+
+   protected void addMessageDataSource(T data) {
+      final DataType type = data.getType();
+      final ArrayList<T> list;
+      if (!memToDataMap.containsKey(type)) {
+         list = new ArrayList<>();
+         memToDataMap.put(type, list);
+      } else {
+         list = memToDataMap.get(type);
+      }
+      list.add(data);
+      data.addMessage(this);
+   }
+
+   public Collection<T> getMemSource(DataType type) {
+      checkState();
+      final ArrayList<T> list = memToDataMap.get(type);
+      if (list != null) {
+         return Collections.unmodifiableCollection(list);
+      } else {
+         return new ArrayList<T>();
+      }
+   }
+
+   public boolean getMemSource(DataType type, Collection<T> listToAddto) {
+      checkState();
+      final ArrayList<T> list = memToDataMap.get(type);
+      if (list != null) {
+         return listToAddto.addAll(list);
+      }
+      return false;
+   }
+
+   public DataType getMemType() {
+      return currentMemType;
+   }
+
+   public void addElement(Element element) {
+      checkState();
+      elementMap.put(element.getName(), element);
+   }
+
+   /**
+    * Gets a list of all the message's data elements.
+    * <br>
+    * This returns ALL the elements, which may not be mapped to the
+    * active data type and/or may be non-mapping elements.
+    * 
+    * Use {@link #getElements(DataType)} to get mapped elements
+    * 
+    * @return a collection of {@link Element}s
+    */
+   public Collection<Element> getElements() {
+      checkState();
+      return elementMap.values();
+   }
+
+   public void getAllElements(Collection<Element> elements) {
+      checkState();
+      IMessageHeader header = getActiveDataSource().getMsgHeader();
+      if (header != null) {
+         Collections.addAll(elements, header.getElements());
+      }
+      elements.addAll(elementMap.values());
+
+   }
+
+   /**
+    * @return a collection of mapped {@link Element}s for the specified DataType
+    */
+   public Collection<Element> getElements(DataType type) {
+      checkState();
+      LinkedList<Element> list = new LinkedList<>();
+      for (Element element : elementMap.values()) {
+         Element e = element.switchMessages(getMessageTypeAssociation(type));
+         if (!e.isNonMappingElement()) {
+            list.add(e);
+         }
+      }
+      return list;
+   }
+
+   /**
+    * @return true if the Message contains an element with the given name, false otherwise
+    */
+   public boolean hasElement(String elementName) {
+      checkState();
+      return elementMap.containsKey(elementName);
+   }
+
+   /**
+    * @return HashMap<String, Element>
+    */
+   public HashMap<String, Element> getElementMap() {
+      checkState();
+      return elementMap;
+   }
+
+   /**
+    * @param elementName the name of the element as defined in the message ( All caps ).
+    * @return the element associated with the given name
+    * @throws IllegalArgumentException if an element doesn't exist with given name. Use {@link #hasElement(String)} with
+    * any use of this function.
+    */
+   public Element getElement(String elementName) {
+      return getElement(elementName, currentMemType);
+   }
+
+   public <E extends Element> E getElement(String elementName, Class<E> clazz) {
+      checkState();
+      return clazz.cast(getElement(elementName, currentMemType));
+   }
+
+   public boolean hasElement(List<Object> elementPath) {
+      return getElement(elementPath) != null;
+   }
+
+   public Element getElement(List<Object> elementPath) {
+      checkState();
+      Element el = null;
+      RecordElement rel = null;
+      if (elementPath.size() == 1) {
+         el = elementMap.get(elementPath.get(0));
+      } else {
+         String string = (String) elementPath.get(1);
+         if (string.startsWith("HEADER(")) {
+            Element[] elements = getActiveDataSource(currentMemType).getMsgHeader().getElements();
+            for (Element element : elements) {
+               if (element.getName().equals(elementPath.get(2))) {
+                  return element;
+               }
+            }
+            return null;
+         } else {
+            el = this.elementMap.get(string);
+            if (el instanceof RecordElement) {
+               rel = (RecordElement) el;
+            }
+         }
+         for (int i = 2; i < elementPath.size(); i++) {
+            if (elementPath.get(i) instanceof String) {
+               String name = (String) elementPath.get(i);
+               el = rel.getElementMap().get(name);
+               if (el instanceof RecordElement) {
+                  rel = (RecordElement) el;
+               }
+            } else if (elementPath.get(i) instanceof Integer) {
+               Integer index = (Integer) elementPath.get(i);
+               rel = rel.get(index);
+               el = rel;
+            }
+         }
+      }
+      return el;
+   }
+
+   public Element getElement(List<Object> elementPath, DataType type) {
+      Element element = getElement(elementPath);
+      if (element == null) {
+         return null;
+      }
+      return element.switchMessages(this.getMessageTypeAssociation(type));
+   }
+
+   /**
+    * @return the element associated with the given name
+    * @throws IllegalArgumentException if an element doesn't exist with given name. Use {@link #hasElement(String)} with
+    * any use of this function.
+    */
+   public Element getElement(String elementName, DataType type) {
+      checkState();
+      Element retVal = elementMap.get(elementName);
+      if (retVal != null) {
+         return retVal.switchMessages(this.getMessageTypeAssociation(type));
+      }
+      return null;
+
+   }
+
+   public Element getBodyOrHeaderElement(String elementName) {
+      return getBodyOrHeaderElement(elementName, currentMemType);
+   }
+
+   public Element getBodyOrHeaderElement(String elementName, DataType type) {
+      checkState();
+      Element e = elementMap.get(elementName);
+      if (e == null) {
+         Element[] elements = getActiveDataSource(type).getMsgHeader().getElements();
+         for (Element element : elements) {
+            if (element.getName().equals(elementName)) {
+               return element;
+            }
+         }
+      } else {
+         e = e.switchMessages(this.getMessageTypeAssociation(type));
+      }
+      return e;
+   }
+
+   /**
+    * Turning off a message causes sends to be short-circuited and the message to be unscheduled.
+    */
+   public void turnOff() {
+      checkState();
+      isTurnedOff = true;
+      unschedule();
+   }
+
+   /**
+    * Turning on message allows sends to work again & reschedules message if that is the default state defined by the
+    * message constructor call.
+    */
+   public void turnOn() {
+      checkState();
+      isTurnedOff = false;
+      if (isScheduledFromStart()) {
+         schedule();
+      }
+   }
+
+   /**
+    * This is the turnOn being called from the method register in MessageCollection. Messages shouldn't be scheduled at
+    * this point b/c the control message hasn't gone out yet. Messages can't go out until the control message goes out
+    * the first time so that collisions in the box are avoided.
+    */
+   public void whenBeingRegisteredTurnOn() {
+      isTurnedOff = false;
+   }
+
+   /**
+    * Returns if the message is turned off.
+    */
+   public boolean isTurnedOff() {
+      return isTurnedOff;
+   }
+
+   private void setSchedule(boolean newValue) {
+      ArrayList<T> dataList = memToDataMap.get(currentMemType);
+      for (T d : dataList) {
+         d.setScheduled(newValue);
+      }
+   }
+
+   /**
+    * This method schedules the message. There is also some code that allows the scheduled state to be updated in
+    * Message Watch.
+    */
+   public void schedule() {
+      checkState();
+      if (!isTurnedOff) {
+         setSchedule(true);
+         regularUnscheduleCalled = false;
+         for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+            listener.isScheduledChanged(true);
+         }
+      }
+   }
+
+   /**
+    * This method unschedules the message. The variable regularUnscheduledCalled is used to preserve unschedules that
+    * are called in constructors, which is before the control message goes out for the first time.
+    */
+   public void unschedule() {
+      checkState();
+      setSchedule(false);
+      regularUnscheduleCalled = true;
+      for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+         listener.isScheduledChanged(false);
+      }
+   }
+
+   /**
+    * Returns if the message is scheduled or not.
+    */
+   @Deprecated
+   public boolean isScheduled() {
+      ArrayList<T> dataList = memToDataMap.get(currentMemType);
+      for (T d : dataList) {
+         if (!d.isScheduled()) {
+            return false;
+         }
+      }
+      return true;
+   }
+
+   /**
+    * This is called at the end of a script run to reset the "hard" unschedule variable that is used to preserve
+    * unschedules called in constructors.
+    */
+   public void resetScheduling() {
+      regularUnscheduleCalled = false;
+
+   }
+
+   /**
+    * @return - double - rate of message
+    */
+   public double getRate() {
+      return rate;
+   }
+
+   /**
+    * @return - int - phase of message
+    */
+   public int getPhase() {
+      return phase;
+   }
+
+   public MessageSystemListener getListener() {
+      return listenerHandler;
+   }
+
+   public MessageSystemListener getRemoveableListener() {
+      return removableListenerHandler;
+   }
+   
+   public void setListenerTrace(MessageListenerTrace listener) {
+      if(listenerHandler != null){
+         listenerHandler.setMessageListenerTrace(this, listener);
+      }
+   }
+   
+   public MessageListenerTrace clearListenerTrace() {
+      if(listenerHandler != null){
+         return listenerHandler.clearListenerTrace(this);
+      }
+      return null;
+   }
+
+   public void addListener(IOSEEMessageListener listener) {
+      listenerHandler.addListener(listener);
+   }
+
+   public boolean removeListener(IOSEEMessageListener listener) {
+      return listenerHandler.removeListener(listener);
+   }
+
+   /**
+    * Notifies all registered listeners of an update.
+    * <P>
+    * <B>NOTE: </B>Should only be called from sub classes of {@link MessageData}
+    * 
+    * @param data the Message Data object that has been updated
+    * @param type the memtype of the message data object
+    */
+   public void notifyListeners(final MessageData data, final DataType type) {
+      checkState();
+      this.listenerHandler.onDataAvailable(data, type);
+      this.removableListenerHandler.onDataAvailable(data, type);
+   }
+
+   /*
+    * public HashMap getTypeToMessageData(){ return typeToMessageData; }
+    */
+   /**
+    * @return Returns the name.
+    */
+   public String getName() {
+      return name;
+   }
+
+   private static final int TransmissionTimeoutDefault = 15000;
+
+   @Override
+   public String toString() {
+      return name;
+   }
+
+   /**
+    * @return Returns the messageName.
+    */
+   public String getMessageName() {
+      return name;
+   }
+
+   @Override
+   public org.w3c.dom.Element toXml(Document doc) {
+      org.w3c.dom.Element rootElement = doc.createElement("Message");
+      rootElement.appendChild(Jaxp.createElement(doc, "Name", name));
+      rootElement.appendChild(Jaxp.createElement(doc, "Type", getMemType().name()));
+      return rootElement;
+   }
+
+   @Override
+   public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+      writer.writeStartElement("Message");
+      XMLStreamWriterUtil.writeElement(writer, "Name", name);
+      XMLStreamWriterUtil.writeElement(writer, "Type", getMemType().name());
+      writer.writeEndElement();
+   }
+
+   @JsonProperty
+   public String getType() {
+       return getMemType().name();
+   }
+   
+   public void zeroize() {
+      checkState();
+      for (DataType memType : memToDataMap.keySet()) {
+         for (Element el : getElements(memType)) {
+            el.zeroize();
+         }
+      }
+   }
+
+   /**
+    * Verifies that the message is sent at least once using the default message timeout. DO NOT override this method in
+    * production code.
+    * 
+    * @return if the check passed
+    */
+   public boolean checkForTransmission(ITestAccessor accessor) throws InterruptedException {
+      return checkForTransmission(accessor, TransmissionTimeoutDefault);
+   }
+
+   /**
+    * Verifies that the message is sent at least once within the time specified. DO NOT override this method in
+    * production code.
+    * 
+    * @param milliseconds the amount to time (in milliseconds) to allow
+    * @return if the check passed
+    */
+   public boolean checkForTransmission(ITestAccessor accessor, int milliseconds) throws InterruptedException {
+      return checkForTransmissions(accessor, 1, milliseconds);
+   }
+
+   /**
+    * Verifies that the message is sent at least "numTransmission" times within the default message timeout. DO NOT
+    * override this method in production code.
+    * 
+    * @param numTransmissions the number of transmissions to look for
+    * @return if the check passed
+    */
+   public boolean checkForTransmissions(ITestAccessor accessor, int numTransmissions) throws InterruptedException {
+      return checkForTransmissions(accessor, numTransmissions, TransmissionTimeoutDefault);
+   }
+
+   /**
+    * Verifies that the message is sent at least "numTransmission" times within the time specified.
+    * 
+    * @param numTransmissions the number of transmission to look for
+    * @param milliseconds the amount to time (in milliseconds) to allow
+    * @return if the check passed
+    */
+   public boolean checkForTransmissions(ITestAccessor accessor, int numTransmissions, int milliseconds) throws InterruptedException {
+      checkState();
+      accessor.getLogger().methodCalledOnObject(accessor, getMessageName(),
+         new MethodFormatter().add(numTransmissions).add(milliseconds));
+      TransmissionCountCondition c = new TransmissionCountCondition(numTransmissions);
+      MsgWaitResult result = waitForCondition(accessor, c, false, milliseconds);
+      CheckPoint passFail =
+         new CheckPoint(this.name, Integer.toString(numTransmissions), Integer.toString(result.getXmitCount()),
+            result.isPassed(), result.getXmitCount(), result.getElapsedTime());
+      accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      accessor.getLogger().methodEnded(accessor);
+      return passFail.isPass();
+   }
+
+   /**
+    * Verifies that the message is not sent within the time specified.
+    * 
+    * @param milliseconds the amount to time (in milliseconds) to check
+    * @return if the check passed
+    */
+   public boolean checkForNoTransmissions(ITestEnvironmentMessageSystemAccessor accessor, int milliseconds) throws InterruptedException {
+      checkState();
+      if (accessor == null) {
+         throw new IllegalArgumentException("accessor cannot be null");
+      }
+      accessor.getLogger().methodCalledOnObject(accessor, getMessageName(), new MethodFormatter().add(milliseconds),
+         this);
+      long time = accessor.getEnvTime();
+      org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+         accessor.setTimerFor(listenerHandler, milliseconds);
+
+      boolean result;
+      listenerHandler.waitForData(); // will also return if the timer (set above)
+      // expires
+
+      result = listenerHandler.isTimedOut();
+
+      cancelTimer.cancelTimer();
+      time = accessor.getEnvTime() - time;
+
+      accessor.getLogger().testpoint(
+         accessor,
+         accessor.getTestScript(),
+         accessor.getTestScript().getTestCase(),
+         new CheckPoint(this.getMessageName(), "No Transmissions",
+            result ? "No Transmissions" : "Transmissions Occurred", result, time));
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+      return result;
+   }
+
+   /**
+    * Waits until message is sent at least once within the default message timeout.
+    * 
+    * @return if the check passed
+    */
+   public boolean waitForTransmission(ITestEnvironmentMessageSystemAccessor accessor) throws InterruptedException {
+      return waitForTransmission(accessor, TransmissionTimeoutDefault);
+   }
+
+   /**
+    * Waits until message is sent at least once within the time specified.
+    * 
+    * @param milliseconds the amount to time (in milliseconds) to allow
+    * @return if the check passed
+    */
+   public boolean waitForTransmission(ITestEnvironmentMessageSystemAccessor accessor, int milliseconds) throws InterruptedException {
+      return waitForTransmissions(accessor, 1, milliseconds);
+   }
+
+   /**
+    * Waits until message is sent at least "numTransmission" times within the default message timeout.
+    * 
+    * @param numTransmissions the number of transmissions to look for
+    * @return if the check passed
+    */
+   public boolean waitForTransmissions(ITestEnvironmentMessageSystemAccessor accessor, int numTransmissions) throws InterruptedException {
+      return waitForTransmissions(accessor, numTransmissions, TransmissionTimeoutDefault);
+   }
+
+   /**
+    * Waits until message is sent at least "numTransmission" times within the time specified.
+    * 
+    * @param milliseconds the amount to time (in milliseconds) to allow
+    * @return if the check passed
+    */
+   public boolean waitForTransmissions(ITestEnvironmentMessageSystemAccessor accessor, int numTransmissions, int milliseconds) throws InterruptedException {
+      checkState();
+      accessor.getLogger().methodCalledOnObject(accessor, getMessageName(),
+         new MethodFormatter().add(numTransmissions).add(milliseconds), this);
+      boolean pass = waitForTransmissionsNoLog(accessor, numTransmissions, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return pass;
+   }
+
+   public boolean waitForTransmissionsNoLog(ITestEnvironmentMessageSystemAccessor accessor, int numTransmissions, int milliseconds) throws InterruptedException {
+      checkState();
+      if (accessor == null) {
+         throw new IllegalArgumentException("environment accessor parameter cannot be null");
+      }
+      TransmissionCountCondition c = new TransmissionCountCondition(numTransmissions);
+      MsgWaitResult result = waitForCondition(accessor, c, false, milliseconds);
+      return result.isPassed();
+   }
+
+   public MsgWaitResult waitForCondition(ITestEnvironmentAccessor accessor, ICondition condition, boolean maintain, int milliseconds) throws InterruptedException {
+      checkState();
+      return listenerHandler.waitForCondition(accessor, condition, maintain, milliseconds);
+   }
+
+   /**
+    * @return Returns size value.
+    */
+   public int getMaxDataSize() {
+      checkState();
+      return getMaxDataSize(currentMemType);
+   }
+
+   public int getMaxDataSize(DataType type) {
+      checkState();
+      int size = 0;
+      for (MessageData msgData : memToDataMap.get(type)) {
+         if (msgData != null && msgData.getPayloadSize() > size) {
+            size = msgData.getPayloadSize();
+         }
+      }
+      return size;
+   }
+
+   /*
+    * @Override public boolean equals(Object obj) { return this.getClass().equals(obj.getClass()); }
+    */
+
+   /*
+    * @Override public int hashCode() { return getClass().hashCode(); }
+    */
+
+   /**
+    * returns a {@link MessageState} object that represents this message's state. The state is intended to be used in
+    * synchronizing a remote instance of this message
+    * 
+    * @return Returns MessageState object reference.
+    */
+   public MessageState getMessageState() {
+      checkState();
+      MessageMode mode = isWriter() ? MessageMode.WRITER : MessageMode.READER;
+      return new MessageState(currentMemType, getData(), memToDataMap.keySet(), mode);
+   }
+
+   /**
+    * restores the state of this message. The state is intended to come from a remote instance of this message.
+    */
+   public void setMessageState(final MessageState state) {
+      checkState();
+      setMemSource(state.getCurrentMemType());
+      setData(state.getData());
+   }
+
+   public void addSchedulingChangeListener(IMessageScheduleChangeListener listener) {
+      checkState();
+      schedulingChangeListeners.add(listener);
+   }
+
+   public void removeSchedulingChangeListener(IMessageScheduleChangeListener listener) {
+      checkState();
+      schedulingChangeListeners.remove(listener);
+   }
+
+   public T getActiveDataSource() {
+      checkState();
+      ArrayList<T> dataList = memToDataMap.get(currentMemType);
+      if (dataList == null) {
+         throw new IllegalStateException("no datas for " + currentMemType);
+      }
+      return dataList.get(0);
+   }
+
+   public T getActiveDataSource(DataType type) {
+      checkState();
+      ArrayList<T> dataList = memToDataMap.get(type);
+      return dataList != null ? dataList.get(0) : null;
+   }
+
+   public void addElements(Element... elements) {
+      checkState();
+      for (Element element : elements) {
+         elementMap.put(element.getElementName(), element);
+         element.addPath(this.getClass().getName());
+      }
+   }
+
+   public int getBitOffset() {
+      return 0;
+   }
+
+   /**
+    * @param currentMemType the currentMemType to set
+    */
+   protected void setCurrentMemType(DataType currentMemType) {
+      checkState();
+      this.currentMemType = currentMemType;
+   }
+
+   public boolean setMemSource(DataType type) {
+      checkState();
+      DataType oldMemType = getMemType();
+      notifyPreMemSourceChangeListeners(oldMemType, type, this);
+      this.switchElementAssociation(type);
+      setCurrentMemType(type);
+      notifyPostMemSourceChangeListeners(oldMemType, type, this);
+      return true;
+   }
+
+   public boolean activateMemSource(DataType type) {
+      checkState();
+      DataType oldMemType = getMemType();
+      notifyPreMemSourceChangeListeners(oldMemType, type, this);
+      //		this.switchElementAssociation(type);
+      //		setCurrentMemType(type);
+      notifyPostMemSourceChangeListeners(oldMemType, type, this);
+      return true;
+   }
+
+   private void notifyPostMemSourceChangeListeners(DataType old, DataType newtype, Message message) {
+      checkState();
+      for (IMemSourceChangeListener listener : postMemSourceChangeListeners) {
+         try {
+            listener.onChange(old, newtype, message);
+         } catch (Exception e) {
+            OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, e);
+         }
+      }
+   }
+
+   private void notifyPreMemSourceChangeListeners(DataType old, DataType newtype, Message message) {
+      checkState();
+      for (IMemSourceChangeListener listener : preMemSourceChangeListeners) {
+         listener.onChange(old, newtype, message);
+      }
+   }
+
+   public void addPreMemSourceChangeListener(IMemSourceChangeListener listener) {
+      checkState();
+      preMemSourceChangeListeners.add(listener);
+   }
+
+   public void addPostMemSourceChangeListener(IMemSourceChangeListener listener) {
+      checkState();
+      postMemSourceChangeListeners.add(listener);
+   }
+   
+   public void removePreMemSourceChangeListener(IMemSourceChangeListener listener) {
+      checkState();
+      preMemSourceChangeListeners.remove(listener);
+   }
+
+   public void removePostMemSourceChangeListener(IMemSourceChangeListener listener) {
+      checkState();
+      postMemSourceChangeListeners.remove(listener);
+   }
+
+   public void addPreMessageDisposeListener(IMessageDisposeListener listener) {
+      checkState();
+      preMessageDisposeListeners.add(listener);
+   }
+
+   public void removePreMessageDisposeListener(IMessageDisposeListener listener) {
+      checkState();
+      preMessageDisposeListeners.remove(listener);
+   }
+
+   public void addPostMessageDisposeListener(IMessageDisposeListener listener) {
+      checkState();
+      postMessageDisposeListeners.add(listener);
+   }
+
+   /**
+    * @return the memToDataMap
+    */
+   public Collection<ArrayList<T>> getAllData() {
+      checkState();
+      return memToDataMap.values();
+   }
+
+   public Set<DataType> getAvailableMemTypes() {
+      checkState();
+      return memToDataMap.keySet();
+   }
+
+   public Collection<T> getMessageData(DataType type) {
+      checkState();
+      return memToDataMap.get(type);
+   }
+
+   public String getTypeName() {
+      return getName();
+   }
+
+   /**
+    * This variable reflects whether a message is defined to start out being scheduled.
+    * 
+    * @return Returns the isScheduledFromStart.
+    */
+   public boolean isScheduledFromStart() {
+      return isScheduledFromStart;
+   }
+
+   /**
+    * This variable reflects whether unsubscribe has been called on the message. The main purpose of this is to preserve
+    * if an unschedule is called on a message from a constructor.
+    * 
+    * @return Returns the regularUnscheduleCalled.
+    */
+   public boolean isRegularUnscheduleCalled() {
+      return regularUnscheduleCalled;
+   }
+
+   /**
+    * @return the defaultMessageData
+    */
+   public T getDefaultMessageData() {
+      checkState();
+      return defaultMessageData;
+   }
+
+   /**
+    * @param defaultMessageData the defaultMessageData to set
+    */
+   @SuppressWarnings("unchecked")
+   protected void setDefaultMessageData(T defaultMessageData) {
+      checkState();
+      this.defaultMessageData = defaultMessageData;
+      addMessageDataSource(defaultMessageData);
+      addMessageTypeAssociation(defaultMessageData.getType(), (U) this);
+   }
+
+   public boolean isWriter() {
+      checkState();
+      return defaultMessageData.isWriter();
+   }
+
+   public void setMemTypeActive(DataType type) {
+      checkState();
+      memTypeActive.add(type);
+      notifyPostMemSourceChangeListeners(currentMemType, currentMemType, this);
+   }
+
+   public void setMemTypeInactive(DataType type) {
+      checkState();
+      memTypeActive.add(type);
+      notifyPostMemSourceChangeListeners(currentMemType, currentMemType, this);
+   }
+
+   public boolean isMemTypeActive(DataType type) {
+      checkState();
+      return memTypeActive.contains(type);
+   }
+
+   protected void checkState() throws IllegalStateException {
+      if (isDestroyed()) {
+         throw new IllegalStateException(getName() + " is destroyed");
+      }
+   }
+
+   public boolean isDestroyed() {
+      return destroyed;
+   }
+
+   @Override
+   protected void finalize() throws Throwable {
+      finalized.incrementAndGet();
+      super.finalize();
+   }
+
+   public static long getConstructed() {
+      return constructed.get();
+   }
+
+   public static long getFinalized() {
+      return finalized.get();
+   }
+
+   public boolean isValidElement(Element currentElement, Element proposedElement) {
+      return true;
+   }
+
+   public IMessageHeader[] getHeaders() {
+      final Collection<T> dataSources = getMemSource(getMemType());
+      if (dataSources.size() > 0) {
+         final IMessageHeader[] headers = new IMessageHeader[dataSources.size()];
+         int i = 0;
+         for (T dataSrc : dataSources) {
+            headers[i] = dataSrc.getMsgHeader();
+            i++;
+         }
+         return headers;
+      } else {
+         return new IMessageHeader[0];
+      }
+   }
+
+   public long getActivityCount() {
+      return getActiveDataSource().getActivityCount();
+   }
+
+   public long getSentCount() {
+      return getActiveDataSource().getSentCount();
+   }
+
+   public void setActivityCount(long activityCount) {
+      getActiveDataSource().setActivityCount(activityCount);
+   }
+
+   public void switchElementAssociation(Collection<U> messages) {
+   }
+
+   @SuppressWarnings("rawtypes")
+   public Map<? extends DataType, Class<? extends Message>[]> getAssociatedMessages() {
+      return new HashMap<DataType, Class<? extends Message>[]>();
+   }
+
+   @SuppressWarnings({ "rawtypes", "unchecked" })
+   public void postCreateMessageSetup(IMessageManager messageManager, MessageData data) throws Exception {
+      Map<? extends DataType, Class<? extends Message>[]> o = getAssociatedMessages();
+      messageRequestor = messageManager.createMessageRequestor(getName());
+      for (Entry<? extends DataType, Class<? extends Message>[]> entry : o.entrySet()) {
+         if (messageManager.isPhysicalTypeAvailable(entry.getKey())) {
+            for (Class<? extends Message> clazz : entry.getValue()) {
+               final Message message;
+               if (data.isWriter()) {
+                  message = messageRequestor.getMessageWriter(clazz);
+               } else {
+                  message = messageRequestor.getMessageReader(clazz);
+               }
+               this.addMessageDataSource((T) message.getDefaultMessageData());
+               this.addMessageTypeAssociation(entry.getKey(), (U) message);
+               setMemSource(entry.getKey());
+            }
+         }
+      }
+   }
+
+   /**
+    * Changes the rate a message is being published at. NOTE: This is only going to be allowed to be used on periodic
+    * message & users are not allowed to set rate to zero.
+    * 
+    * @param newRate - hz
+    */
+   public void changeRate(double newRate) {
+      if (Math.abs(newRate - 0.0) < doubleTolerance) { //newRate == 0.0
+         throw new IllegalArgumentException(
+            "Cannot change message rate to zero (" + getName() + ")!\n\tUse unschedule() to do that!");
+      }
+      if (Math.abs(newRate - rate) > doubleTolerance) { //newRate != rate
+         //         accessor.getMsgManager().changeMessageRate(this, newRate, rate);
+         double oldRate = rate;
+         rate = newRate;
+         for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+            listener.onRateChanged(this, oldRate, newRate);
+         }
+      }
+   }
+
+   /**
+    * Changes the rate back to the default rate.
+    */
+   public void changeRateToDefault(ITestEnvironmentMessageSystemAccessor accessor) {
+      //      accessor.getMsgManager().changeMessageRate(this, defaultRate, rate);
+      double oldRate = getRate();
+      rate = defaultRate;
+      for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+         listener.onRateChanged(this, oldRate, defaultRate);
+      }
+   }
+
+   public void sendWithLog(ITestAccessor accessor) {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, getMessageName(), new MethodFormatter(), this);
+      }
+      send();
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+   }
+
+   public int getDefaultByteSize() {
+      return defaultByteSize;
+   }
+
+   public int getDefaultOffset() {
+      return defaultOffset;
+   }
+
+   public Element getElementByPath(ElementPath path) {
+      return getElementByPath(path, currentMemType);
+   }
+
+   public Element getElementByPath(ElementPath path, DataType type) {
+      if (path.isHeaderElement()) {
+         Element[] elements = getActiveDataSource(type).getMsgHeader().getElements();
+         for (Element element : elements) {
+            if (element.getName().equals(path.getElementName())) {
+               return element;
+            }
+         }
+         return null;
+      }
+      return getElement(path.getList(), type);
+   }
+   
+   public ListIterator<Element> getElementIterator() {
+	   ArrayList<Element> list = new ArrayList<>(elementMap.values());
+	   return list.listIterator();
+   }
+   
+   public ListIterator<Element> getElementIterator(Element elemnt) {
+	   ArrayList<Element> list = new ArrayList<>(elementMap.values());
+	   int index = list.indexOf(elemnt);
+	   if (index >= 0) {
+		   return list.listIterator(index);		   
+	   }
+	   return null;
+   }
+
+   
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java
new file mode 100644
index 0000000..088b6cf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.message;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface MessageDefinitionProvider {
+
+   /**
+    * This function returns an ID that is intended to be unique to the running system. The system should not allow more
+    * than one active instance of a service with the same singletonId.
+    */
+   String singletonId();
+
+   String majorVersion();
+
+   String minorVersion();
+
+   void generateMessageIndex(MessageSink sink) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageEventLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageEventLogger.java
new file mode 100644
index 0000000..e9525a2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageEventLogger.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * 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.message;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageEventLogger implements UniversalMessageListener {
+   private static final class StackTrace extends RuntimeException {
+      private static final long serialVersionUID = 6805422596135323489L;
+
+      public StackTrace() {
+         super("Event stack trace");
+      }
+   }
+
+   private final Message message;
+   private final String modeStatus;
+
+   private volatile boolean showStackTrace = false;
+
+   public MessageEventLogger(Message message) {
+      this(message, false);
+   }
+
+   /**
+    * @return the message
+    */
+   public Message getMessage() {
+      return message;
+   }
+
+   /**
+    * Creates a message event logger that also prints a stack trace when the event is fired
+    */
+   public MessageEventLogger(Message message, boolean showStackTrace) {
+      this.message = message;
+      modeStatus = message.isWriter() ? "wirter " : "reader";
+      message.addPostMemSourceChangeListener(this);
+      message.addPostMessageDisposeListener(this);
+      message.addPreMessageDisposeListener(this);
+      message.addSchedulingChangeListener(this);
+      this.showStackTrace = showStackTrace;
+   }
+
+   @Override
+   public void onChange(DataType oldtype, DataType newType, Message message) {
+      log(Level.INFO, String.format("MemType for %s %s has changed from %s to %s", message.getName(), modeStatus,
+         oldtype.name(), newType.name()), showStackTrace ? new StackTrace() : null);
+   }
+
+   @Override
+   public void onPostDispose(Message message) {
+      log(Level.INFO, String.format("%s %s has been disposed", message.getName(), modeStatus),
+         showStackTrace ? new StackTrace() : null);
+   }
+
+   @Override
+   public void onPreDispose(Message message) {
+      log(Level.INFO, String.format("%s %s is about to be disposed", message.getName(), modeStatus),
+         showStackTrace ? new StackTrace() : null);
+   }
+
+   @Override
+   public void isScheduledChanged(boolean isScheduled) {
+      log(Level.INFO, String.format("schedule status for %s has changed to %s. Env time is %d", message.getName(),
+         modeStatus, isScheduled ? "scheduled" : "not scheduled"), showStackTrace ? new StackTrace() : null);
+   }
+
+   @Override
+   public void onRateChanged(Message message, double oldRate, double newRate) {
+      log(Level.INFO,
+         String.format("rate for %s %s change from %f to %f", message.getName(), modeStatus, oldRate, newRate),
+         showStackTrace ? new StackTrace() : null);
+   }
+
+   protected void log(Level level, String message) {
+      OseeLog.log(MessageSystemTestEnvironment.class, level, message);
+   }
+
+   protected void log(Level level, String message, StackTrace stackTrace) {
+      OseeLog.log(MessageSystemTestEnvironment.class, level, message, stackTrace);
+   }
+
+   protected StackTraceElement[] getStackTrace() {
+      return new Exception().getStackTrace();
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageListenerTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageListenerTrace.java
new file mode 100644
index 0000000..164025b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageListenerTrace.java
@@ -0,0 +1,232 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * The {@code MessageListenerTrace} class will time the listeners of a message.  Only one can be set on a message at a time.
+ * <pre>
+ * This is measuring the timing of events that are occurring in the 
+ * {@link org.eclipse.osee.ote.message.listener.MessageSystemListener#onDataAvailable(MessageData, DataType) MessageSystemListener.onDataAvailable()}
+ * The ALL will measure the time from when the preNotify to the postNotify.
+ * The other one will measure the time from right before the inner onDataAvailable is called to right after.
+ * 
+ * <pre>
+ * {@code
+ * MessageListenerTrace trace = new MessageListenerTrace(TimeUnit.NANOSECONDS, testMessage, logger);
+ * trace.start();
+ * //wait or do stuff
+ * trace.stop();
+ * trace.printResults();
+ * }
+ * </pre>
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class MessageListenerTrace extends MessageTimeTrace {
+
+   public final String TRACE_TYPE = "MessageListenerTrace";
+   private int maxAllListenerTime = Integer.MAX_VALUE;
+   private int maxListenerTime = Integer.MAX_VALUE;
+   private int listenerWaitTimeMs;
+
+   private MessageTraceOutput messageTraceOutput;
+   private MessageTraceOutput messageTraceOutputAll;
+   private MessageTraceLogger messageTraceLogger;
+   
+   /**
+    * @param environment - the test environment.
+    * @param timeUnit - determines the resolution of the timing that is measured.
+    * @param message - the message to measure
+    * @param messageTraceLogger - logger to write output
+    */
+   @SuppressWarnings("rawtypes")
+   public MessageListenerTrace(ITestEnvironmentAccessor environment, TimeUnit timeUnit, Message message, MessageTraceLogger messageTraceLogger) {
+      super(environment, message, timeUnit);
+      this.messageTraceOutput = new MessageTraceOutput();
+      this.messageTraceOutputAll = new MessageTraceOutput();
+      this.messageTraceLogger = messageTraceLogger;
+   }
+   
+   public void setMaxAllListeners(int time){
+      maxAllListenerTime = time;
+   }
+   
+   public void setMaxListeners(int time){
+      maxListenerTime = time;
+   }
+   
+   @Override
+   public void start(){
+      super.start();
+      getMessage().setListenerTrace(this);
+   }
+   
+   @Override
+   public void stop(){
+      super.stop();
+      getMessage().clearListenerTrace();
+   }
+
+   public void setListenerWaitTimeMs(int listenerWaitTimeMs) {
+      this.listenerWaitTimeMs = listenerWaitTimeMs;
+   }
+
+   @Override
+   public synchronized void printResults(){
+      List<TimeEvent> events = get();
+      int allCount = 0;
+      int allexceedanceCount = 0;
+      double allaverage = 0.0;
+      double allmax = -1.0;
+      double allmin = -1.0;
+      
+      int count = 0;
+      int exceedanceCount = 0;
+      double average = 0.0;
+      double max = -1.0;
+      double min = -1.0;
+      
+      ListenerEvent preNotify = null;
+      ListenerEvent postNotify = null; 
+      ListenerEvent preListener = null;
+      ListenerEvent postListener = null; 
+      
+      for(TimeEvent event:events){
+         if(event instanceof ListenerEvent){
+            ListenerEvent sendEvent = (ListenerEvent)event;
+            if(sendEvent.type == ListenerEventType.startNotify){
+               preNotify = sendEvent;
+            } else if (sendEvent.type == ListenerEventType.endNotify) {
+               postNotify = sendEvent;
+            } else if (sendEvent.type == ListenerEventType.startListener){
+               preListener = sendEvent;
+            } else if (sendEvent.type == ListenerEventType.endListener){
+               postListener = sendEvent;
+            }
+         }
+         if(preNotify != null && postNotify != null){
+            long nanoDiff = postNotify.getNanoTime() - preNotify.getNanoTime();
+            preNotify = null;
+            postNotify = null;
+            allCount++;
+            long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+            
+            if(currentTime >= 0){
+               if(allmax < 0 || currentTime > allmax){
+                  allmax = currentTime;
+               }
+               if(allmin < 0 || currentTime < allmin){
+                  allmin = currentTime;
+               }
+               if(currentTime > maxAllListenerTime){
+                  allexceedanceCount++;
+                  String maxMessage = String.format("%s: count[%d] %d [%d (count)] [%s]", getName(), allCount, currentTime, allexceedanceCount, getTimeUnit().name());
+                  System.out.println(maxMessage);
+               }
+               allaverage = (((allCount-1) * allaverage) + currentTime)/allCount;
+            }
+         }
+         
+         if(preListener != null && postListener != null && preListener.listener == postListener.listener){
+            long nanoDiff = postListener.getNanoTime() - preListener.getNanoTime();
+            String listenerLabel = preListener.listener.getClass().getName();
+            preListener = null;
+            postListener = null;
+            count++;
+            long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+            
+            if(currentTime >= 0){
+               if(max < 0 || currentTime > max){
+                  max = currentTime;
+               }
+               if(min < 0 || currentTime < min){
+                  min = currentTime;
+               }
+               if(currentTime > maxListenerTime){
+                  exceedanceCount++;
+                  String maxMessage = String.format("%s: %s: count[%d] %d [%d (count)] [%s]", getName(), listenerLabel, count, currentTime, exceedanceCount, getTimeUnit().name());
+                  System.out.println(maxMessage);
+               }
+               average = (((count-1) * average) + currentTime)/count;
+            }
+         }
+      }
+      
+      messageTraceOutputAll.setMessage(getMessage().getMessageName());
+      messageTraceOutputAll.setMessageRate(getMessageRate());
+      messageTraceOutputAll.setTimeUnit(getTimeUnit().name());
+      messageTraceOutputAll.setTraceType(TRACE_TYPE);
+      messageTraceOutputAll.setCount(allCount);
+      messageTraceOutputAll.setAverage(allaverage);
+      messageTraceOutputAll.setMin(allmin);
+      messageTraceOutputAll.setMax(allmax);
+      messageTraceOutputAll.setExceedanceCount(allexceedanceCount);
+      messageTraceOutputAll.setExceedanceThreshold(maxAllListenerTime);
+      messageTraceOutputAll.setListenerWaitTimeMs(listenerWaitTimeMs);
+      messageTraceOutputAll.setTestDurationSec(testDurationSec);
+
+      messageTraceOutput.setMessage(getMessage().getMessageName());
+      messageTraceOutput.setMessageRate(getMessageRate());
+      messageTraceOutput.setTimeUnit(getTimeUnit().name());
+      messageTraceOutput.setTraceType(TRACE_TYPE);
+      messageTraceOutput.setCount(count);
+      messageTraceOutput.setAverage(average);
+      messageTraceOutput.setMin(min);
+      messageTraceOutput.setMax(max);
+      messageTraceOutput.setExceedanceCount(exceedanceCount);
+      messageTraceOutput.setExceedanceThreshold(maxListenerTime);
+      messageTraceOutput.setListenerWaitTimeMs(listenerWaitTimeMs);
+      messageTraceOutput.setTestDurationSec(testDurationSec);
+      
+      messageTraceOutputAll.setExtraTraceOutput(messageTraceOutput);
+      if (messageTraceLogger != null){
+         messageTraceLogger.logMessageTraceOutput(messageTraceOutputAll);
+      }
+   }
+   
+   public void addStartNotify() {
+      add(new ListenerEvent(ListenerEventType.startNotify));
+   }
+
+   public void addEndNotify() {
+      add(new ListenerEvent(ListenerEventType.endNotify));
+   }
+
+   public void addStartListener(IOSEEMessageListener listener) {
+      add(new ListenerEvent(ListenerEventType.startListener, listener));
+   }
+
+   public void addEndListener(IOSEEMessageListener listener) {
+      add(new ListenerEvent(ListenerEventType.endListener, listener));
+   }
+   
+   private static class ListenerEvent extends TimeEvent {
+      
+      public final ListenerEventType type;
+      public IOSEEMessageListener listener;
+      
+      public ListenerEvent(ListenerEventType type) {
+         super(type.name());
+         this.type = type;
+      }
+
+      public ListenerEvent(ListenerEventType type, IOSEEMessageListener listener) {
+         this(type);
+         this.listener = listener;
+      }
+      
+   }
+   
+   private enum ListenerEventType {
+      startNotify,
+      endNotify,
+      startListener,
+      endListener
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageProviderVersion.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageProviderVersion.java
new file mode 100644
index 0000000..e188022
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageProviderVersion.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * 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.message;
+
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
+
+public class MessageProviderVersion {
+	Set<String> versions = new ConcurrentSkipListSet<>();
+	
+	public synchronized void add(MessageDefinitionProvider provider){
+		versions.add(generateVersion(provider));
+	}
+	
+	public synchronized void remove(MessageDefinitionProvider provider){
+		versions.remove(generateVersion(provider));
+	}
+	
+	public synchronized String getVersion(){
+		if(versions.size() == 0){
+			return "no library detected";
+		}
+		StringBuilder sb = new StringBuilder();
+		for(String ver:versions){
+			sb.append(ver);
+			sb.append("\n");
+		}
+		sb.deleteCharAt(sb.length()-1);
+		return sb.toString();
+	}
+
+	private String generateVersion(MessageDefinitionProvider provider){
+		return String.format("%s[%s.%s]", provider.singletonId(), provider.majorVersion(), provider.minorVersion());
+	}
+	
+	public synchronized boolean isAnyAvailable(){
+		return versions.size() > 0;
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendPeriodTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendPeriodTrace.java
new file mode 100644
index 0000000..c16e97d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendPeriodTrace.java
@@ -0,0 +1,165 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * This class will measure the time between sends.
+  * <pre>
+ * {@code
+ * MessageSendPeriodTrace trace = new MessageSendPeriodTrace(TimeUnit.NANOSECONDS, testMessage, logger);
+ * trace.start();
+ * //wait or do stuff
+ * trace.stop();
+ * trace.printResults();
+ * }
+ * </pre>
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class MessageSendPeriodTrace extends MessageTimeTrace {
+   
+   public final String TRACE_TYPE = "MessageSendPeriodTrace";
+   private SendTimer sendTimer;
+   private int maxFlag = Integer.MAX_VALUE;
+   private int minError = Integer.MIN_VALUE;
+   private int maxError = Integer.MAX_VALUE;
+   
+   private MessageTraceOutput messageTraceOutput;
+   private MessageTraceLogger messageTraceLogger;
+   
+   /**
+    * @param environment - the test environment.
+    * @param timeUnit - determines the resolution of the timing that is measured.
+    * @param message - the message to measure
+    * @param messageTraceLogger - logger to write output
+    */
+   @SuppressWarnings("rawtypes")
+   public MessageSendPeriodTrace(ITestEnvironmentAccessor environment, TimeUnit timeUnit, Message message, MessageTraceLogger messageTraceLogger) {
+      super(environment, message, timeUnit);
+      sendTimer = new SendTimer(this);
+      this.messageTraceOutput = new MessageTraceOutput();
+      this.messageTraceLogger = messageTraceLogger;
+   }
+   
+   /**
+    * 
+    * @param expected the expected period in the constructed TimeUnit
+    * @param maxError the max variance off of the period in the constructed TimeUnit
+    */
+   public void setMaxVariance(int expected, int maxError){
+      this.maxFlag = maxError;
+      this.minError = expected - maxError;
+      this.maxError = expected + maxError;
+   }
+
+   public void addStartEvent(String message){
+      add(new TimeEvent(message));
+   }
+
+   @Override
+   public void start(){
+      super.start();
+      getMessage().getDefaultMessageData().addSendListener(sendTimer);
+   }
+   
+   @Override
+   public void stop(){
+      super.stop();
+      getMessage().getDefaultMessageData().removeSendListener(sendTimer);
+   }
+   
+   @Override
+   public synchronized void printResults(){
+      List<TimeEvent> events = get();
+      int count = 0;
+      int exceedanceCount = 0;
+      double average = 0.0;
+      double max = -1.0;
+      double min = -1.0;
+      
+      SendEvent pre1 = null;
+      SendEvent pre2 = null;
+      for(TimeEvent event:events){
+         if(event instanceof SendEvent){
+            SendEvent sendEvent = (SendEvent)event;
+            if(sendEvent.type == SendEventType.pre){
+               pre1 = pre2;
+               pre2 = sendEvent; 
+            } 
+         }
+         if(pre1 != null && pre2 != null){
+            long nanoDiff = pre2.getNanoTime() - pre1.getNanoTime();
+            count++;
+            long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+            
+            if(currentTime >= 0){
+               if(max < 0 || currentTime > max){
+                  max = currentTime;
+               }
+               if(min < 0 || currentTime < min){
+                  min = currentTime;
+               }
+               if(currentTime > maxError || currentTime < minError){
+                  exceedanceCount++;
+                  String maxMessage = String.format("%s: count[%d] %d [%d (count)] [%s]", getName(), count, currentTime, exceedanceCount, getTimeUnit().name());
+                  System.out.println(maxMessage);
+               }
+               average = (((count-1) * average) + currentTime)/count;
+            }
+         }
+      }
+      messageTraceOutput.setMessage(getMessage().getMessageName());
+      messageTraceOutput.setMessageRate(getMessageRate());
+      messageTraceOutput.setTimeUnit(getTimeUnit().name());
+      messageTraceOutput.setTraceType(TRACE_TYPE);
+      messageTraceOutput.setCount(count);
+      messageTraceOutput.setAverage(average);
+      messageTraceOutput.setMin(min);
+      messageTraceOutput.setMax(max);
+      messageTraceOutput.setExceedanceCount(exceedanceCount);
+      messageTraceOutput.setExceedanceThreshold(maxFlag);
+      messageTraceOutput.setTestDurationSec(testDurationSec);
+      if (messageTraceLogger != null){
+         messageTraceLogger.logMessageTraceOutput(messageTraceOutput);
+      }
+   }
+   
+   private static class SendTimer implements IMessageSendListener {
+
+      private MessageSendPeriodTrace messageSendOperator;
+
+      public SendTimer(MessageSendPeriodTrace messageSendOperator) {
+         this.messageSendOperator = messageSendOperator;
+      }
+
+      @Override
+      public void onPreSend(MessageData messageData) {
+         messageSendOperator.add(new SendEvent(SendEventType.pre));
+      }
+
+      @Override
+      public void onPostSend(MessageData messageData) {
+         // Intentionally empty block
+      }
+      
+   }
+   
+   private static class SendEvent extends TimeEvent {
+      
+      public final SendEventType type;
+      
+      public SendEvent(SendEventType type) {
+         super(type.name());
+         this.type = type;
+      }
+      
+   }
+   
+   private enum SendEventType {
+      pre
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendTrace.java
new file mode 100644
index 0000000..18dc30c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendTrace.java
@@ -0,0 +1,161 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * This class will time the send call of a message.  From just after you call send to after socket.send() has been called.
+ * 
+ * The results will be written to System.out or System.out and the Outfile, depending on which constructor you use.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class MessageSendTrace extends MessageTimeTrace {
+   
+   public final String TRACE_TYPE = "MessageSendTrace";
+   private SendTimer sendTimer;
+
+   private int maxFlag = Integer.MAX_VALUE;
+   
+   private MessageTraceOutput messageTraceOutput;
+   private MessageTraceLogger messageTraceLogger;
+   
+   /**
+    * @param environment - the test environment.
+    * @param timeUnit - determines the resolution of the timing that is measured.
+    * @param message - the message to measure
+    * @param messageTraceLogger - logger to write output
+    */
+   @SuppressWarnings("rawtypes")
+   public MessageSendTrace(ITestEnvironmentAccessor environment, TimeUnit timeUnit, Message message, MessageTraceLogger messageTraceLogger) {
+      super(environment, message, timeUnit);
+      sendTimer = new SendTimer(this);
+      this.messageTraceOutput = new MessageTraceOutput();
+      this.messageTraceLogger = messageTraceLogger;
+   }
+   
+   /**
+    * Set the time that you want to flag for exceeding the expected time.  It is in the scale of the passed in TimeUnit.
+    * 
+    * @param maxFlagNS
+    */   
+   public void setMaxFlag(int maxFlag){
+      this.maxFlag = maxFlag;
+   }
+
+   public void addStartEvent(String message){
+      add(new TimeEvent(message));
+   }
+
+
+   @Override
+   public void start(){
+      super.start();
+      getMessage().getDefaultMessageData().addSendListener(sendTimer);
+   }
+   
+   @Override
+   public void stop(){
+      super.stop();
+      getMessage().getDefaultMessageData().removeSendListener(sendTimer);
+   }
+   
+   @Override
+   public synchronized void printResults(){
+      List<TimeEvent> events = get();
+      int count = 0;
+      int exceedanceCount = 0;
+      double average = 0.0;
+      double max = -1.0;
+      double min = -1.0;
+      
+      SendEvent pre = null;
+      SendEvent post = null;
+      for(TimeEvent event:events){
+         if(event instanceof SendEvent){
+            SendEvent sendEvent = (SendEvent)event;
+            if(sendEvent.type == SendEventType.pre){
+               pre = sendEvent;
+            } else {
+               post = sendEvent;
+            }
+         }
+         if(pre != null && post != null){
+            long nanoDiff = post.getNanoTime() - pre.getNanoTime();
+            pre = null;
+            post = null;
+            count++;
+            long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+            
+            if(currentTime >= 0){
+               if(max < 0 || currentTime > max){
+                  max = currentTime;
+               }
+               if(min < 0 || currentTime < min){
+                  min = currentTime;
+               }
+               if(currentTime > maxFlag){
+                  exceedanceCount++;
+                  String maxMessage = String.format("%s: count[%d] %d [%d (count)] [%s]", getName(), count, currentTime, exceedanceCount, getTimeUnit().name());
+                  System.out.println(maxMessage);
+               }
+               average = (((count-1) * average) + currentTime)/count;
+            }
+         }
+      }
+      messageTraceOutput.setMessage(getMessage().getMessageName());
+      messageTraceOutput.setMessageRate(getMessageRate());
+      messageTraceOutput.setTimeUnit(getTimeUnit().name());
+      messageTraceOutput.setTraceType(TRACE_TYPE);
+      messageTraceOutput.setCount(count);
+      messageTraceOutput.setAverage(average);
+      messageTraceOutput.setMin(min);
+      messageTraceOutput.setMax(max);
+      messageTraceOutput.setExceedanceCount(exceedanceCount);
+      messageTraceOutput.setExceedanceThreshold(maxFlag);
+      messageTraceOutput.setTestDurationSec(testDurationSec);
+      if (messageTraceLogger != null){
+         messageTraceLogger.logMessageTraceOutput(messageTraceOutput);
+      }
+   }
+   
+   private static class SendTimer implements IMessageSendListener {
+
+      private MessageSendTrace messageSendOperator;
+
+      public SendTimer(MessageSendTrace messageSendOperator) {
+         this.messageSendOperator = messageSendOperator;
+      }
+
+      @Override
+      public void onPreSend(MessageData messageData) {
+         messageSendOperator.add(new SendEvent(SendEventType.pre));
+      }
+
+      @Override
+      public void onPostSend(MessageData messageData) {
+         messageSendOperator.add(new SendEvent(SendEventType.post));
+      }
+      
+   }
+   
+   private static class SendEvent extends TimeEvent {
+      
+      public final SendEventType type;
+      
+      public SendEvent(SendEventType type) {
+         super(type.name());
+         this.type = type;
+      }
+      
+   }
+   
+   private enum SendEventType {
+      pre,
+      post
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSink.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSink.java
new file mode 100644
index 0000000..4556d64
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSink.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.message;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface MessageSink {
+
+   /**
+    * called once by each provider before it calls absorbMessage or absorbElement
+    * @param providerName The name of the provider
+    */
+   public void absorbProvider(String providerName);
+
+   /**
+    * called once for each message in the message list
+    * @param messageName The name of the message
+    */
+   public void absorbMessage(String messageName);
+
+   /**
+    * called once for each element in a message after absorbMessage is called for that message
+    * @param elementName The name of the element
+    */
+   public void absorbElement(String elementName);
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageState.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageState.java
new file mode 100644
index 0000000..2b42104
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageState.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.message;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * Holds a state of a message intended to be transferred from the message manager server to an interest client. In other
+ * words, helps synchronize two remote instances of a message object
+ * 
+ * @author Ken J. Aguilar
+ * @see org.eclipse.osee.ote.message.Message
+ */
+public final class MessageState implements Serializable {
+
+   private static final long serialVersionUID = -8977593021184452337L;
+
+   private final DataType currentMemType;
+   private final byte[] data;
+   private final Set<DataType> availableMemTypes;
+   private final MessageMode mode;
+
+   public MessageState(final DataType currentMemType, final byte[] data, final Set<DataType> availableMemTypes, final MessageMode mode) {
+      this.currentMemType = currentMemType;
+      this.data = data;
+
+      this.availableMemTypes = new HashSet<>(availableMemTypes);
+      this.mode = mode;
+   }
+
+   public DataType getCurrentMemType() {
+      return currentMemType;
+   }
+
+   public byte[] getData() {
+      return data;
+   }
+
+   public Set<DataType> getAvailableMemTypes() {
+      return availableMemTypes;
+   }
+
+   public MessageMode getMode() {
+      return mode;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemException.java
new file mode 100644
index 0000000..208653b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemException.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.message;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.TestException;
+
+public class MessageSystemException extends TestException {
+
+   private static final long serialVersionUID = -8476610648021756216L;
+
+   public MessageSystemException(String message, Level level) {
+      this(message, level, null);
+   }
+
+   public MessageSystemException(String message, Level level, Throwable cause) {
+      super(message, level, cause);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java
new file mode 100644
index 0000000..a2311c9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestCase.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.message;
+
+import java.util.Set;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public abstract class MessageSystemTestCase extends TestCase implements ITestAccessor {
+
+   private final ITestEnvironmentMessageSystemAccessor msgSysTestEnvironment;
+
+   protected MessageSystemTestCase(TestScript testScript, boolean standAlone, boolean addToRunList) {
+      super(testScript, standAlone, addToRunList);
+      msgSysTestEnvironment = (MessageSystemTestScript) testScript;
+   }
+
+   /**
+    * TestCase Constructor.
+    */
+   public MessageSystemTestCase(TestScript testScript, boolean standAlone) {
+      this(testScript, standAlone, true);
+   }
+
+   /**
+    * TestCase Constructor.
+    */
+   public MessageSystemTestCase(TestScript testScript) {
+      this(testScript, false);
+   }
+
+   @Override
+   public IMessageManager<?, ?> getMsgManager() {
+      return msgSysTestEnvironment.getMsgManager();
+   }
+
+   @Override
+   public boolean isPhysicalTypeAvailable(DataType mux) {
+      return msgSysTestEnvironment.isPhysicalTypeAvailable(mux);
+   }
+
+   @Override
+   public void associateObject(Class<?> c, Object obj) {
+      msgSysTestEnvironment.associateObject(c, obj);
+   }
+
+   @Override
+   public Set<? extends DataType> getDataTypes() {
+      return msgSysTestEnvironment.getDataTypes();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java
new file mode 100644
index 0000000..67326b8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * 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.message;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.BasicTimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.IEnvironmentFactory;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.model.IModelManager;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class MessageSystemTestEnvironment extends TestEnvironment implements ITestEnvironmentMessageSystemAccessor, IMessageTestContext {
+   protected URL[] clientClasses;
+   private final List<IPreScriptInstantiation> preInstantiation = new ArrayList<>();
+   protected boolean promptResponse = false;
+   private IOInstrumentationDB ioInstrumentation;
+
+   protected MessageSystemTestEnvironment(IEnvironmentFactory factory) {
+      super(factory);
+      getScriptCtrl().setScriptReady(false);
+   }
+
+   private void setupIOInstrumentation() {
+      if (ioInstrumentation == null) {
+         ioInstrumentation = new IOInstrumentationDB();
+      }
+   }
+
+   public void envWait(int milliseconds) throws InterruptedException {
+      envWait(new BasicTimeout(), milliseconds);
+   }
+
+   public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+      setTimerFor(obj, milliseconds);
+      synchronized (obj) {
+         obj.wait();
+      }
+   }
+
+   @SuppressWarnings("rawtypes")
+   @Override
+   public IMessageManager getMsgManager() {
+      return ServiceUtility.getService(IMessageManager.class, false);
+   }
+
+   public IModelManager getModelManager() {
+      return ServiceUtility.getService(IModelManager.class, 5000);
+   }
+
+   /**
+    * provides a way for sub classes to instantiate test scripts in their own way.
+    */
+   protected abstract TestScript instantiateScriptClass(Class<?> scriptClass, IUserSession connection) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException;
+
+   public abstract void singleStepEnv();
+
+   @Override
+   public void resetScriptLoader(Configuration configuration, String[] strings) throws Exception {
+      getRuntimeManager().resetScriptLoader(configuration, strings);
+   }
+
+   public void addPreInstantiationListener(IPreScriptInstantiation listener) {
+      preInstantiation.add(listener);
+   }
+
+   public void removePreInstantiationListener(IPreScriptInstantiation listener) {
+      preInstantiation.remove(listener);
+   }
+
+   public void notifyPreInstantiationListeners() {
+      for (IPreScriptInstantiation pre : preInstantiation) {
+         pre.run();
+      }
+   }
+
+   public IOInstrumentation getIOInstrumentation(String name) {
+      setupIOInstrumentation();
+      return ioInstrumentation.getIOInstrumentation(name);
+   }
+
+   public IOInstrumentation registerIOInstrumentation(String name, IOInstrumentation io) {
+      setupIOInstrumentation();
+      return ioInstrumentation.registerIOInstrumentation(name, io);
+   }
+
+   public void deregisterIOInstrumentation(String name) {
+      setupIOInstrumentation();
+      ioInstrumentation.unregisterIOInstrumentation(name);
+   }
+
+   public void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) {
+      setupIOInstrumentation();
+      ioInstrumentation.addRegistrationListener(listener);
+   }
+
+   public void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) {
+      setupIOInstrumentation();
+      ioInstrumentation.removeRegistrationListener(listener);
+   }
+
+   public Class<?> loadClassFromMessageLoader(String path) throws ClassNotFoundException {
+      return getRuntimeManager().loadFromRuntimeLibraryLoader(path);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java
new file mode 100644
index 0000000..8d22982
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * 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.message;
+
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.enums.ScriptTypeEnum;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class MessageSystemTestScript extends TestScript implements ITestAccessor {
+
+   private final ITestEnvironmentMessageSystemAccessor msgSysEnvironment;
+
+   public MessageSystemTestScript(TestEnvironment environment, IUserSession callback, ScriptTypeEnum scriptType, boolean isBatchable) {
+      super(environment, callback, scriptType, isBatchable);
+      msgSysEnvironment = (ITestEnvironmentMessageSystemAccessor) environment;
+   }
+
+   @Override
+   public IMessageManager<?, ?> getMsgManager() {
+      return msgSysEnvironment.getMsgManager();
+   }
+
+   @Override
+   public boolean isPhysicalTypeAvailable(DataType mux) {
+      return msgSysEnvironment.isPhysicalTypeAvailable(mux);
+   }
+
+   @Override
+   public void associateObject(Class<?> c, Object obj) {
+      msgSysEnvironment.associateObject(c, obj);
+   }
+
+   @Override
+   public Object getAssociatedObject(Class<?> c) {
+      return msgSysEnvironment.getAssociatedObject(c);
+   }
+
+   public Object getAssociatedObject() {
+      return msgSysEnvironment.getAssociatedObjects();
+   }
+
+   @Override
+   public IExecutionUnitManagement getExecutionUnitManagement() {
+      return msgSysEnvironment.getExecutionUnitManagement();
+   }
+
+   @Override
+   public ITestStation getTestStation() {
+      return msgSysEnvironment.getTestStation();
+   }
+
+   @Override
+   public ITestLogger getLogger() {
+      return msgSysEnvironment.getLogger();
+   }
+
+   @Override
+   public ITimerControl getTimerCtrl() {
+      return msgSysEnvironment.getTimerCtrl();
+   }
+
+   @Override
+   public IScriptControl getScriptCtrl() {
+      return msgSysEnvironment.getScriptCtrl();
+   }
+
+   @Override
+   public ICancelTimer setTimerFor(ITimeout listener, int time) {
+      return msgSysEnvironment.setTimerFor(listener, time);
+   }
+
+   @Override
+   public final void onScriptSetup() {
+      msgSysEnvironment.onScriptSetup();
+   }
+
+   @Override
+   public final void onScriptComplete() throws InterruptedException {
+      msgSysEnvironment.onScriptComplete();
+   }
+
+   @Override
+   public long getEnvTime() {
+      return msgSysEnvironment.getEnvTime();
+   }
+
+   //   public ITestPointTally getAttachedTestPointTally(TestScript script) {
+   //      return msgSysEnvironment.getAttachedTestPointTally(script);
+   //   }
+
+   //   public EnvironmentType getEnvironmentType() {
+   //      return msgSysEnvironment.getEnvironmentType();
+   //   }
+   @Override
+   public void abortTestScript() {
+      msgSysEnvironment.abortTestScript();
+   }
+
+   @Override
+   public boolean addTask(EnvironmentTask task) {
+      return msgSysEnvironment.addTask(task);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTimeTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTimeTrace.java
new file mode 100644
index 0000000..e7751b9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTimeTrace.java
@@ -0,0 +1,57 @@
+/*
+ * Created on Oct 16, 2017
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message;
+
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+public class MessageTimeTrace extends TimeTrace {
+   
+   protected int testDurationSec = 10;
+   private ITestEnvironmentAccessor environment;
+   @SuppressWarnings("rawtypes")
+   private Message message;
+   private TimeUnit timeUnit;
+   private double messageRate;
+
+   @SuppressWarnings("rawtypes")
+   public MessageTimeTrace(ITestEnvironmentAccessor environment, Message message, TimeUnit timeUnit) {
+      super(message.getName());
+      this.environment = environment;
+      this.message = message;
+      this.timeUnit= timeUnit;
+      this.messageRate = message.getRate();
+   }
+
+   public void testWait() throws InterruptedException {
+      environment.getTimerCtrl().envWait(testDurationSec*1000);
+   }
+
+   public void runTraceTest() throws InterruptedException {
+      start();
+      testWait();
+      stop();
+   }
+
+   public void setTestDurationTime(int testDurationSec) {
+      this.testDurationSec = testDurationSec;
+   }
+   
+   @SuppressWarnings("rawtypes")
+   public Message getMessage() {
+      return message;
+   }
+   
+   public TimeUnit getTimeUnit() {
+      return timeUnit;
+   }
+   
+   public double getMessageRate() {
+      return messageRate;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceLogger.java
new file mode 100644
index 0000000..ca1d3a5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceLogger.java
@@ -0,0 +1,12 @@
+package org.eclipse.osee.ote.message;
+
+/**
+ * The {@code MessageTraceDbLogger} interface is a logger interface.
+ * 
+ * @author Andy Jury
+ *
+ */
+public interface MessageTraceLogger {
+
+   public void logMessageTraceOutput(MessageTraceOutput messageTraceOutput);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceOutput.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceOutput.java
new file mode 100644
index 0000000..f8540ee
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceOutput.java
@@ -0,0 +1,136 @@
+package org.eclipse.osee.ote.message;
+
+/**
+ * The {@code MessageTraceOutput} class is a container for the different properties that 
+ * are being measured and calculated for the different Message Trace classes.
+ * 
+ * 
+ * @author Andy Jury
+ *
+ */
+public class MessageTraceOutput {
+
+   private String traceType;
+
+   private String message;
+   private double messageRate;
+   private String timeUnit;
+   
+   private int count;
+
+   private double average;
+   private double max;
+   private double min;
+   
+   private int exceedanceCount;
+   private int exceedanceThreshold;
+   
+   private int testDurationSec;
+   
+   private Object extraTraceOutput;
+   private int listenerWaitTimeMs;
+   
+   public void setTraceType(String traceType) {
+      this.traceType = traceType;
+   }
+
+   public String getTraceType() {
+      return traceType;
+   }
+   
+   public void setMessage(String message) {
+      this.message = message;
+   }
+
+   public String getMessage() {
+      return message;
+   }
+   
+   public void setMessageRate(double messageRate) {
+      this.messageRate = messageRate;
+   }
+   
+   public double getMessageRate() {
+      return messageRate;
+   }
+   
+   public void setTimeUnit(String timeUnit) {
+      this.timeUnit = timeUnit;
+   }
+   
+   public String getTimeUnit() {
+      return timeUnit;
+   }
+
+   public int getCount() {
+      return count;
+   }
+
+   public void setCount(int count) {
+      this.count = count;
+   }
+
+   public int getExceedanceCount() {
+      return exceedanceCount;
+   }
+   
+   public void setExceedanceCount(int exceedanceCount) {
+      this.exceedanceCount = exceedanceCount;
+   }
+
+   public double getAverage() {
+      return average;
+   }
+
+   public void setAverage(double average) {
+      this.average = average;
+   }
+
+   public double getMax() {
+      return max;
+   }
+
+   public void setMax(double max) {
+      this.max = max;
+   }
+
+   public double getMin() {
+      return min;
+   }
+
+   public void setMin(double min) {
+      this.min = min;
+   }
+
+   public int getExceedanceThreshold() {
+      return exceedanceThreshold;
+   }
+
+   public void setExceedanceThreshold(int exceedanceThreshold) {
+      this.exceedanceThreshold = exceedanceThreshold;
+   }
+
+   public int getTestDurationSec() {
+      return testDurationSec;
+   }
+
+   public void setTestDurationSec(int testDurationSec) {
+      this.testDurationSec = testDurationSec;
+   }
+
+   public Object getExtraTraceOutput() {
+      return extraTraceOutput;
+   }
+
+   public void setExtraTraceOutput(Object extraTraceOutput) {
+      this.extraTraceOutput = extraTraceOutput;
+   }
+
+   public int getListenerWaitTimeMs() {
+      return listenerWaitTimeMs;
+   }
+
+   public void setListenerWaitTimeMs(int listenerWaitTimeMs) {
+      this.listenerWaitTimeMs = listenerWaitTimeMs;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeEvent.java
new file mode 100644
index 0000000..1a7c121
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeEvent.java
@@ -0,0 +1,20 @@
+package org.eclipse.osee.ote.message;
+
+public class TimeEvent {
+
+   private long nanoTime;
+   private String lable;
+   
+   public TimeEvent(String label) {
+      this.lable = label;
+      nanoTime = System.nanoTime();
+   }
+
+   public long getNanoTime(){
+      return nanoTime;
+   }
+
+   public void print() {
+      System.out.printf("%s %d", lable, nanoTime);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeTrace.java
new file mode 100644
index 0000000..b2874fe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeTrace.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+/**
+ * This is a class that has the base functionality to keep a list of {@link TimeEvent} objects.  This way 
+ * we can post process the events to determine timing of a trace of functionality.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TimeTrace {
+
+   private String name;
+   private List<TimeEvent> events;
+   private volatile boolean isRunning;
+
+   public TimeTrace(String name){
+      this.name = String.format(this.getClass().getName() + "[%s]", name);
+      events = new ArrayList<>();
+   }
+   
+   public void stop() {
+      isRunning = false;
+   }
+   
+   public void start(){
+      isRunning = true;
+   }
+   
+   public synchronized void add(TimeEvent event){
+      if(isRunning){
+         events.add(event);
+      }
+   }
+   
+   public List<TimeEvent> get(){
+      return events;
+   }
+   
+   public synchronized void printResults(){
+      System.out.println(">>>>>>>>>>>>>>>>>>>>-----------------");
+      System.out.println(name);
+      System.out.println("-----------------");
+      for(int i = 0; i < events.size(); i++){
+         events.get(i).print();
+         System.out.println();
+      }
+      System.out.println("<<<<<<<<<<<<<<<<<<<<-----------------");
+   }
+   
+   public synchronized void clear(){
+      events.clear();
+   }
+
+   public String getName(){
+      return name;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/UniversalMessageListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/UniversalMessageListener.java
new file mode 100644
index 0000000..4255980
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/UniversalMessageListener.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.message;
+
+import org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface UniversalMessageListener extends IMemSourceChangeListener, IMessageDisposeListener, IMessageScheduleChangeListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java
new file mode 100644
index 0000000..af8591b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+public final class ChangeSubscription implements Serializable {
+   private static final long serialVersionUID = 2863442398798431500L;
+   private final String msgName;
+   private final MessageMode mode;
+   private final int newMemTypeOrdinal;
+   private final int oldMemTypeOrdinal;
+   private final InetSocketAddress oldAddress;
+   private final InetSocketAddress newAddress;
+
+   public ChangeSubscription(final String msgName, final MessageMode mode, final int oldMemTypeOrdinal, final int newMemTypeOrdinal, final InetSocketAddress oldAddress, final InetSocketAddress newAddress) {
+      this.msgName = msgName;
+      this.mode = mode;
+      this.newMemTypeOrdinal = newMemTypeOrdinal;
+      this.oldMemTypeOrdinal = oldMemTypeOrdinal;
+      this.oldAddress = oldAddress;
+      this.newAddress = newAddress;
+   }
+
+   public String getMsgName() {
+      return msgName;
+   }
+
+   /**
+    * @return Returns the mode.
+    */
+   public MessageMode getMode() {
+      return mode;
+   }
+
+   public int getNewMemTypeOrdinal() {
+      return newMemTypeOrdinal;
+   }
+
+   public int getOldMemTypeOrdinal() {
+      return oldMemTypeOrdinal;
+   }
+
+   public InetSocketAddress getOldAddress() {
+      return oldAddress;
+   }
+
+   public InetSocketAddress getNewAddress() {
+      return newAddress;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/RecordCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/RecordCommand.java
new file mode 100644
index 0000000..d643c91
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/RecordCommand.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * 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.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RecordCommand implements Serializable {
+
+   public static final class MessageRecordDetails implements Serializable {
+
+      private static final long serialVersionUID = 2954398510075588584L;
+      private final String name;
+      private final DataType type;
+      private final List<List<Object>> headerElementNames;
+      private final List<List<Object>> bodyElementNames;
+      private final boolean headerDump;
+      private final boolean bodyDump;
+
+      public MessageRecordDetails(final String name, final DataType type, boolean headerDump, final List<List<Object>> headerElementNames, boolean bodyDump, final List<List<Object>> bodyElementNames) {
+         super();
+         this.name = name;
+         this.type = type;
+         this.headerDump = headerDump;
+         this.bodyDump = bodyDump;
+         this.headerElementNames = headerElementNames;
+         this.bodyElementNames = bodyElementNames;
+      }
+
+      public static long getSerialVersionUID() {
+         return serialVersionUID;
+      }
+
+      public List<List<Object>> getBodyElementNames() {
+         return bodyElementNames;
+      }
+
+      public List<List<Object>> getHeaderElementNames() {
+         return headerElementNames;
+      }
+
+      public boolean getHeaderDump() {
+         return this.headerDump;
+      }
+
+      public boolean getBodyDump() {
+         return this.bodyDump;
+      }
+
+      public String getName() {
+         return name;
+      }
+
+      public DataType getType() {
+         return type;
+      }
+
+   }
+   private static final long serialVersionUID = -1000973301709084337L;
+
+   private final List<MessageRecordDetails> list;
+   private final InetSocketAddress destAddress;
+   private final UUID key;
+
+   public RecordCommand(UUID key, InetSocketAddress destAddress, List<MessageRecordDetails> list) {
+      this.list = list;
+      this.destAddress = destAddress;
+      this.key = key;
+   }
+
+   /**
+    * @return the destAddress
+    */
+   public InetSocketAddress getDestAddress() {
+      return destAddress;
+   }
+
+   public Collection<MessageRecordDetails> getMsgsToRecord() {
+      return list;
+   }
+   
+   public UUID getKey(){
+      return key;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetElementValue.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetElementValue.java
new file mode 100644
index 0000000..bf97412
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetElementValue.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.message.commands;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Ken J. Aguilar
+ */
+public final class SetElementValue implements Serializable {
+
+   private static final long serialVersionUID = -6696340729803635664L;
+   private final String message;
+   private final List<Object> element;
+   private final String value;
+   private final DataType type;
+   private final boolean shouldSend;
+
+   public SetElementValue(String message, DataType type, List<Object> elementPath, String value, boolean shouldSend) {
+      super();
+      this.message = message;
+      this.type = type;
+      this.element = elementPath;
+      this.value = value;
+      this.shouldSend = shouldSend;
+   }
+
+   /**
+    * @return Returns the message.
+    */
+   public String getMessage() {
+      return message;
+   }
+
+   /**
+    * @return Returns the data.
+    */
+   public List<Object> getElement() {
+      return element;
+   }
+
+   public String getValue() {
+      return value;
+   }
+
+   public DataType getMemType() {
+      return type;
+   }
+   
+   public boolean shouldSend() {
+	   return shouldSend;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java
new file mode 100644
index 0000000..adc8afa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class SetMessageModeCmd implements Serializable {
+
+   private static final long serialVersionUID = 4294009014724352978L;
+
+   private final String name;
+   private final DataType type;
+   private final MessageMode oldMode;
+   private final MessageMode newMode;
+   private final InetSocketAddress address;
+
+   public SetMessageModeCmd(String name, DataType type, MessageMode oldMode, MessageMode newMode, InetSocketAddress address) {
+      this.name = name;
+      this.type = type;
+      this.oldMode = oldMode;
+      this.newMode = newMode;
+      this.address = address;
+   }
+
+   /**
+    * @return Returns the serialVersionUID.
+    */
+   public static long getSerialVersionUID() {
+      return serialVersionUID;
+   }
+
+   /**
+    * @return Returns the name.
+    */
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @return Returns the newMode.
+    */
+   public MessageMode getNewMode() {
+      return newMode;
+   }
+
+   /**
+    * @return Returns the oldMode.
+    */
+   public MessageMode getOldMode() {
+      return oldMode;
+   }
+
+   /**
+    * @return Returns the client.
+    */
+   public InetSocketAddress getAddress() {
+      return address;
+   }
+
+   /**
+    * @return Returns the type.
+    */
+   public DataType getType() {
+      return type;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java
new file mode 100644
index 0000000..43707ac
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.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.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SubscribeToMessage implements Serializable {
+
+   private static final long serialVersionUID = -8639822314152666969L;
+   private final String message;
+   private final DataType type;
+   private final MessageMode mode;
+   private final InetSocketAddress address;
+   private final UUID key;
+
+   public SubscribeToMessage(String message, DataType type, MessageMode mode, InetSocketAddress address, UUID key) {
+      super();
+      this.message = message;
+      this.type = type;
+      this.mode = mode;
+      this.address = address;
+      this.key = key;
+   }
+
+   /**
+    * @param message The message to set.
+    */
+   public String getMessage() {
+      return message;
+   }
+
+   public DataType getType() {
+      return type;
+   }
+
+   public MessageMode getMode() {
+      return mode;
+   }
+   
+   public InetSocketAddress getAddress(){
+      return address;
+   }
+   
+   public UUID getKey(){
+      return key;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java
new file mode 100644
index 0000000..595fcf8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class UnSubscribeToMessage implements Serializable {
+
+   private static final long serialVersionUID = -1140091630056507142L;
+   private final String messageName;
+   private final MessageMode mode;
+   private final InetSocketAddress address;
+   private final DataType memTypeOrdinal;
+
+   /**
+    * Creates a new unsubscribe command.
+    * 
+    * @param messageName the name of the message that the message manager service will no longer sent updates to for the
+    * specified client address
+    * @param address the address of the client.
+    */
+   public UnSubscribeToMessage(final String messageName, final MessageMode mode, final DataType memTypeOrdinal, InetSocketAddress address) {
+      this.messageName = messageName;
+      this.mode = mode;
+      this.address = address;
+      this.memTypeOrdinal = memTypeOrdinal;
+   }
+
+   public String getMessage() {
+      return messageName;
+   }
+
+   public InetSocketAddress getAddress() {
+      return address;
+   }
+
+   public DataType getMemTypeOrdinal() {
+      return memTypeOrdinal;
+   }
+
+   /**
+    * @return Returns the mode.
+    */
+   public MessageMode getMode() {
+      return mode;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java
new file mode 100644
index 0000000..b553e8a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.message.commands;
+
+import java.io.Serializable;
+import java.util.List;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Ken J. Aguilar
+ */
+public class ZeroizeElement implements Serializable {
+
+   private static final long serialVersionUID = 2245725475520729629L;
+   private final String message;
+   private final List<Object> element;
+   private final DataType type;
+
+   public ZeroizeElement(String message, DataType type, List<Object> elementPath) {
+      super();
+      this.message = message;
+      this.type = type;
+      this.element = elementPath;
+   }
+
+   /**
+    * @return Returns the message.
+    */
+   public String getMessage() {
+      return message;
+   }
+
+   /**
+    * @return Returns the data.
+    */
+   public List<Object> getElement() {
+      return element;
+   }
+
+   public DataType getMemType() {
+      return type;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java
new file mode 100644
index 0000000..7558292
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractCondition implements ICondition {
+
+   @Override
+   public boolean checkAndIncrement() {
+      incrementCheckCount();
+      return check();
+   }
+
+   private int checkCount = 0;
+
+   protected void incrementCheckCount() {
+      checkCount++;
+   }
+
+   @Override
+   public int getCheckCount() {
+      return checkCount;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AndCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AndCondition.java
new file mode 100644
index 0000000..4382a67
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AndCondition.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import java.util.Collection;
+
+/**
+ * Checks that atleast one condition of a series of conditions is true
+ * 
+ * @author Ken J. Aguilar
+ */
+public class AndCondition extends AbstractCondition {
+
+   private final ICondition[] conditions;
+
+   public AndCondition(ICondition... conditions) {
+      this.conditions = conditions;
+   }
+
+   public AndCondition(Collection<ICondition> conditions) {
+      this.conditions = conditions.toArray(new ICondition[conditions.size()]);
+   }
+
+   @Override
+   public boolean check() {
+      for (ICondition condition : conditions) {
+         if (condition.check()) {
+            return true;
+         }
+      }
+      return false;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java
new file mode 100644
index 0000000..9fafabd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class ChangesCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final DiscreteElement<T> element;
+   private T lastValue = null;
+
+   public ChangesCondition(DiscreteElement<T> element) {
+      this.element = element;
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      T currentValue = element.getValue();
+      if (lastValue == null) {
+         lastValue = currentValue;
+         return false;
+      }
+      boolean result = !currentValue.equals(lastValue);
+      lastValue = currentValue;
+      return result;
+   }
+
+   public DiscreteElement<T> getElement() {
+      return element;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java
new file mode 100644
index 0000000..89b7b0c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class ComparisonCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final DiscreteElement<T> element;
+   private final T value;
+   private final EqualityOperation operation;
+   private T lastValue = null;
+
+   public ComparisonCondition(DiscreteElement<T> element, EqualityOperation operation, T value) {
+      this.element = element;
+      this.operation = operation;
+      this.value = value;
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      lastValue = element.getValue();
+      return operation.evaluate(lastValue, value);
+   }
+
+   public DiscreteElement<T> getElement() {
+      return element;
+   }
+
+   public T getValue() {
+      return value;
+   }
+
+   public EqualityOperation getOperation() {
+      return operation;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java
new file mode 100644
index 0000000..0077844
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.NumericElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class DifferenceCondition<T extends Number & Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final NumericElement<T> element;
+   private final T differenceThreshold;
+   private T lastValue;
+   private final NumericEvaluator<T> evaluator;
+
+   public DifferenceCondition(NumericElement<T> element, T differenceThreshold) {
+      this.element = element;
+      this.differenceThreshold = differenceThreshold;
+      Class<?> targetClass = differenceThreshold.getClass();
+      if (targetClass.equals(Integer.class)) {
+         evaluator = (NumericEvaluator<T>) NumericEvaluator.IntegerEvaluator;
+      } else if (targetClass.equals(Double.class)) {
+         evaluator = (NumericEvaluator<T>) NumericEvaluator.DoubleEvaluator;
+      } else if (targetClass.equals(Long.class)) {
+         evaluator = (NumericEvaluator<T>) NumericEvaluator.LongEvaluator;
+      } else if (targetClass.equals(Float.class)) {
+         evaluator = (NumericEvaluator<T>) NumericEvaluator.FloatEvaluator;
+      } else {
+         throw new IllegalArgumentException("");
+      }
+   }
+
+   public NumericElement<T> getElement() {
+      return element;
+   }
+
+   public T getDifferenceThreshold() {
+      return differenceThreshold;
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      T value = element.getValue();
+      if (lastValue == null) {
+         lastValue = value;
+         return false;
+      }
+
+      boolean result = evaluator.subtractAndCheckGreater(value, lastValue, differenceThreshold);
+      lastValue = value;
+      return result;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java
new file mode 100644
index 0000000..02b8c2e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+/**
+ * this condition checks to see if a {@link StringElement} is empty. Empty is defined as having the first byte/character
+ * of the element equal to zero.
+ * 
+ * @author Ken J. Aguilar
+ */
+public class EmptyStringCondition extends AbstractCondition implements IDiscreteElementCondition<Character> {
+
+   public final StringElement element;
+   private char lastValue;
+   private final int offset;
+
+   public EmptyStringCondition(StringElement element) {
+      this.element = element;
+      offset = element.getMsgData().getMem().getOffset() + element.getByteOffset();
+   }
+
+   @Override
+   public Character getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      lastValue = (char) element.getMsgData().getMem().getData()[offset];
+      return lastValue == (char) 0;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java
new file mode 100644
index 0000000..202eea8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public enum EqualityOperation {
+   LESS_THAN("<") {
+
+      @Override
+      public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+         return currentValue.compareTo(targetValue) < 0;
+      }
+   },
+   LESS_THAN_OR_EQUAL("<=") {
+
+      @Override
+      public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+         return currentValue.compareTo(targetValue) <= 0;
+      }
+   },
+   EQUAL("==") {
+
+      @Override
+      public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+         return currentValue.compareTo(targetValue) == 0;
+      }
+   },
+   NOT_EQUAL("!=") {
+
+      @Override
+      public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+         return currentValue.compareTo(targetValue) != 0;
+      }
+   },
+   GREATER_THAN_OR_EQUAL(">=") {
+
+      @Override
+      public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+         return currentValue.compareTo(targetValue) >= 0;
+      }
+   },
+   GREATER_THAN(">") {
+
+      @Override
+      public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+         return currentValue.compareTo(targetValue) > 0;
+      }
+   };
+
+   private final String toString;
+
+   EqualityOperation(String toString) {
+      this.toString = toString;
+   }
+
+   @Override
+   public String toString() {
+      return toString;
+   }
+
+   public abstract <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java
new file mode 100644
index 0000000..8e11f60
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualsCondition.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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class EqualsCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final DiscreteElement<T> element;
+   private final T value;
+   private final boolean notEquals;
+   private T actualValue;
+
+   public EqualsCondition(DiscreteElement<T> element, T value) {
+      this(element, false, value);
+   }
+
+   /**
+    * sets up a condition that only passes when the notEquals flag is set to false and actual value equals the expected
+    * value or when the notEquals flag is true and the actual value does not equal the expected.
+    */
+   public EqualsCondition(DiscreteElement<T> element, boolean notEquals, T value) {
+      this.element = element;
+      this.value = element.elementMask(value);
+      this.notEquals = notEquals;
+   }
+
+   @Override
+   public boolean check() {
+      actualValue = element.getValue();
+      return actualValue.equals(value) ^ notEquals;
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return actualValue;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ICondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ICondition.java
new file mode 100644
index 0000000..33c55c1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ICondition.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+public interface ICondition {
+   boolean check();
+
+   boolean checkAndIncrement();
+
+   int getCheckCount();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java
new file mode 100644
index 0000000..3439308
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+public interface IDiscreteElementCondition<T extends Comparable<T>> extends ICondition {
+
+   T getLastCheckValue();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java
new file mode 100644
index 0000000..dfca34a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/InRangeCondition.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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class InRangeCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final DiscreteElement<T> element;
+   private final T minValue;
+   private final T maxValue;
+   private final boolean minInclusive;
+   private final boolean maxInclusive;
+   private T actualValue;
+
+   public InRangeCondition(DiscreteElement<T> element, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+      this.element = element;
+      this.minValue = element.elementMask(minValue);
+      this.maxValue = element.elementMask(maxValue);
+      this.maxInclusive = maxInclusive;
+      this.minInclusive = minInclusive;
+   }
+
+   @Override
+   public boolean check() {
+      actualValue = element.getValue();
+      boolean result = minInclusive ? actualValue.compareTo(minValue) >= 0 : actualValue.compareTo(minValue) > 0;
+      return result && (maxInclusive ? actualValue.compareTo(maxValue) <= 0 : actualValue.compareTo(maxValue) < 0);
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return actualValue;
+   }
+
+   public DiscreteElement<T> getElement() {
+      return element;
+   }
+
+   public T getMinValue() {
+      return minValue;
+   }
+
+   public T getMaxValue() {
+      return maxValue;
+   }
+
+   public boolean isMinInclusive() {
+      return minInclusive;
+   }
+
+   public boolean isMaxInclusive() {
+      return maxInclusive;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ListCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ListCondition.java
new file mode 100644
index 0000000..9d97889
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ListCondition.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.message.condition;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class ListCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+   private final DiscreteElement<T> element;
+   private final HashSet<T> set;
+   private final boolean inList;
+   private T lastValue;
+
+   public ListCondition(DiscreteElement<T> element, boolean inList, T... list) {
+      this.element = element;
+      this.inList = inList;
+      for (int i = 0; i < list.length; i++) {
+         list[i] = element.elementMask(list[i]);
+      }
+      this.set = new HashSet<>(Arrays.asList(list));
+
+   }
+
+   public ListCondition(DiscreteElement<T> element, boolean inList, Collection<T> list) {
+      this.element = element;
+      this.inList = inList;
+      this.set = new HashSet<>();
+      for (T item : list) {
+         set.add(element.elementMask(item));
+      }
+
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      lastValue = element.getValue();
+      return !(inList ^ set.contains(lastValue));
+   }
+
+   public DiscreteElement<T> getElement() {
+      return element;
+   }
+
+   public Collection<T> getSet() {
+      return set;
+   }
+
+   public boolean isInList() {
+      return inList;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java
new file mode 100644
index 0000000..6e9f1a2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.core.testPoint.Operation;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.MsgWaitResult;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+public class MultiMessageCondition {
+
+   private static final class MessageCounter {
+      private final Message message;
+      private int count;
+
+      public MessageCounter(Message message, int initialCount) {
+         this.count = initialCount;
+         this.message = message;
+      }
+
+      public void incrementCount() {
+         count++;
+      }
+
+      public int getCount() {
+         return count;
+      }
+
+   }
+   private static final class Listener implements IOSEEMessageListener, ITimeout {
+      private volatile boolean isTimedOut = false;
+      private final Message[] messages;
+      private final HashSet<MessageData> messagesNotSeen = new HashSet<>();
+      private final HashMap<MessageData, MessageCounter> hitCount = new HashMap<>();
+
+      private Listener(Message... messages) {
+         this.messages = messages;
+         for (Message message : messages) {
+            MessageData data = message.getActiveDataSource();
+            messagesNotSeen.add(data);
+            hitCount.put(data, new MessageCounter(message, 0));
+         }
+
+      }
+
+      synchronized void begin() {
+         for (Message message : messages) {
+            message.addListener(this);
+         }
+      }
+
+      void end() {
+         for (Message message : messages) {
+            message.removeListener(this);
+         }
+      }
+
+      @Override
+      public synchronized void onDataAvailable(MessageData data, DataType type) throws MessageSystemException {
+         MessageCounter count = hitCount.get(data);
+         if (count != null) {
+            if (count.getCount() == 0) {
+               // remove this message from the list of messages not seen
+               messagesNotSeen.remove(data);
+            }
+            count.incrementCount();
+         }
+         notify();
+      }
+
+      @Override
+      public void onInitListener() throws MessageSystemException {
+         // TODO Auto-generated method stub
+
+      }
+
+      @Override
+      public boolean isTimedOut() {
+         return isTimedOut;
+      }
+
+      @Override
+      public void setTimeout(boolean timeout) {
+         isTimedOut = timeout;
+      }
+
+      public synchronized boolean waitForTransmission() throws InterruptedException {
+         wait();
+         return !isTimedOut;
+
+      }
+
+      public void fillInMessagesReceived(Collection<MessageCounter> list) {
+         for (Message msg : messages) {
+            // items are removed from the hit list when they are found so if they are not
+            // in the hit list then that means we received it
+
+            MessageCounter counter = hitCount.get(msg.getActiveDataSource());
+            if (counter != null) {
+               list.add(counter);
+            }
+         }
+      }
+
+      public int getHitCount(Message msg) {
+         MessageCounter count = hitCount.get(msg.getActiveDataSource());
+         return count != null ? count.getCount() : 0;
+      }
+
+      public void fillInMessagesNotReceived(Collection<Message> list) {
+
+         for (Message msg : messages) {
+            // if we found it in the hit list then that means we didn't see it
+            if (messagesNotSeen.contains(msg.getActiveDataSource())) {
+               list.add(msg);
+            }
+         }
+      }
+   }
+
+   public MultiMessageCondition() {
+   }
+
+   public MsgWaitResult waitForAllTransmissions(ITestEnvironmentAccessor accessor, int timeout, Collection<MessageCounter> msgsNotSeen, Message... messages) throws InterruptedException {
+      long time = accessor.getEnvTime();
+      boolean seenAllMessages = false;
+      int count = 0;
+      if (timeout > 0) {
+         boolean done = false;
+         Listener listener = new Listener(messages);
+         listener.begin();
+         try {
+            final ICancelTimer cancelTimer = accessor.setTimerFor(listener, timeout);
+            while (!done) {
+               if (listener.waitForTransmission()) {
+                  seenAllMessages = listener.messagesNotSeen.isEmpty();
+                  count++;
+               }
+               done = seenAllMessages | listener.isTimedOut();
+            }
+            cancelTimer.cancelTimer();
+         } finally {
+            listener.end();
+            if (msgsNotSeen != null) {
+               listener.fillInMessagesReceived(msgsNotSeen);
+            }
+         }
+      }
+      time = accessor.getEnvTime() - time;
+      return new MsgWaitResult(time, count, seenAllMessages);
+   }
+
+   public MsgWaitResult waitForAnyTransmission(ITestEnvironmentAccessor accessor, int timeout, Collection<MessageCounter> msgsSeen, Message... messages) throws InterruptedException {
+      long time = accessor.getEnvTime();
+      boolean anyTransmissions = false;
+      int count = 0;
+      if (timeout > 0) {
+         boolean done = false;
+         Listener listener = new Listener(messages);
+         listener.begin();
+         try {
+            final ICancelTimer cancelTimer = accessor.setTimerFor(listener, timeout);
+            while (!done) {
+               if (listener.waitForTransmission()) {
+                  count++;
+                  anyTransmissions = true;
+               }
+               done = anyTransmissions | listener.isTimedOut();
+            }
+            cancelTimer.cancelTimer();
+         } finally {
+            listener.end();
+            if (msgsSeen != null) {
+               listener.fillInMessagesReceived(msgsSeen);
+            }
+         }
+      }
+      time = accessor.getEnvTime() - time;
+      return new MsgWaitResult(time, count, anyTransmissions);
+   }
+
+   public void checkNoTransmissions(ITestAccessor accessor, int timeout, Message... messages) throws InterruptedException {
+      MethodFormatter mf = new MethodFormatter();
+      mf.add(timeout);
+      for (Message msg : messages) {
+         mf.add(msg.getName());
+      }
+      accessor.getLogger().methodCalledOnObject(accessor, "MultMessage", mf);
+      LinkedList<MessageCounter> msgsReceived = new LinkedList<>();
+      MsgWaitResult result = waitForAnyTransmission(accessor, timeout, msgsReceived, messages);
+      if (!result.isPassed()) {
+         CheckPoint cp =
+            new CheckPoint("MESSAGE_TRANSMISSION.NONE", "NONE", result.isPassed() ? "AT LEAST ONE" : "NONE",
+               !result.isPassed(), result.getXmitCount(), result.getElapsedTime());
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), cp);
+      } else {
+         CheckGroup group = new CheckGroup(Operation.AND, "MESSAGE_TRANSMISSION.NONE");
+         for (MessageCounter counter : msgsReceived) {
+            group.add(new CheckPoint("TRANSMISSIONS OF " + counter.message.getName(), "0",
+               Integer.toString(counter.count), counter.count == 0, counter.count, result.getElapsedTime()));
+         }
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), group);
+      }
+      accessor.getLogger().methodEnded(accessor);
+   }
+
+   public void checkAnyTransmissions(ITestAccessor accessor, int timeout, Message... messages) throws InterruptedException {
+      MethodFormatter mf = new MethodFormatter();
+      mf.add(timeout);
+      for (Message msg : messages) {
+         mf.add(msg.getName());
+      }
+      accessor.getLogger().methodCalledOnObject(accessor, "MultMessage", mf);
+      LinkedList<MessageCounter> msgsReceived = new LinkedList<>();
+      MsgWaitResult result = waitForAnyTransmission(accessor, timeout, msgsReceived, messages);
+      CheckPoint cp =
+         new CheckPoint("MESSAGE_TRANSMISSION.ANY", "AT LEAST ONE", result.isPassed() ? "AT LEAST ONE" : "NONE",
+            result.isPassed(), result.getXmitCount(), result.getElapsedTime());
+      accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), cp);
+      accessor.getLogger().methodEnded(accessor);
+   }
+
+   public void checkAllTransmissions(ITestAccessor accessor, int timeout, Message... messages) throws InterruptedException {
+      MethodFormatter mf = new MethodFormatter();
+      mf.add(timeout);
+      for (Message msg : messages) {
+         mf.add(msg.getName());
+      }
+      accessor.getLogger().methodCalledOnObject(accessor, "MultMessage", mf);
+      LinkedList<MessageCounter> msgsReceived = new LinkedList<>();
+      MsgWaitResult result = waitForAllTransmissions(accessor, timeout, msgsReceived, messages);
+      if (result.isPassed()) {
+         CheckPoint cp =
+            new CheckPoint("MESSAGE_TRANSMISSION.ALL", "ALL", result.isPassed() ? "ALL" : "NOT ALL", result.isPassed(),
+               result.getXmitCount(), result.getElapsedTime());
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), cp);
+      } else {
+         CheckGroup group = new CheckGroup(Operation.AND, "MESSAGE_TRANSMISSION.ALL");
+         for (MessageCounter counter : msgsReceived) {
+            group.add(new CheckPoint("TRANSMISSIONS OF " + counter.message.getName(), "GREATER THAN 0",
+               Integer.toString(counter.count), counter.count > 0, counter.count, result.getElapsedTime()));
+         }
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), group);
+      }
+
+      accessor.getLogger().methodEnded(accessor);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java
new file mode 100644
index 0000000..c27c422
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class NotInRangeCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final DiscreteElement<T> element;
+   private final T minValue;
+   private final T maxValue;
+   private final boolean minInclusive;
+   private final boolean maxInclusive;
+   private T actualValue;
+
+   public NotInRangeCondition(DiscreteElement<T> element, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+      this.element = element;
+      this.minValue = element.elementMask(minValue);
+      this.maxValue = element.elementMask(maxValue);
+      this.maxInclusive = maxInclusive;
+      this.minInclusive = minInclusive;
+   }
+
+   @Override
+   public boolean check() {
+      actualValue = element.getValue();
+      boolean result = minInclusive ? actualValue.compareTo(minValue) < 0 : actualValue.compareTo(minValue) <= 0;
+      return result | (maxInclusive ? actualValue.compareTo(maxValue) > 0 : actualValue.compareTo(maxValue) >= 0);
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return actualValue;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java
new file mode 100644
index 0000000..6394d4a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.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.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface NumericEvaluator<T extends Number & Comparable<T>> {
+
+   public static final NumericEvaluator<Integer> IntegerEvaluator = new NumericEvaluator<Integer>() {
+      @Override
+      public boolean subtractAndCheckGreater(Integer left, Integer right, Integer expected) {
+         return left - right > expected;
+      }
+   };
+
+   public static final NumericEvaluator<Double> DoubleEvaluator = new NumericEvaluator<Double>() {
+      @Override
+      public boolean subtractAndCheckGreater(Double left, Double right, Double expected) {
+         return left - right > expected;
+      }
+   };
+
+   public static final NumericEvaluator<Long> LongEvaluator = new NumericEvaluator<Long>() {
+      @Override
+      public boolean subtractAndCheckGreater(Long left, Long right, Long expected) {
+         return left - right > expected;
+      }
+   };
+
+   public static final NumericEvaluator<Float> FloatEvaluator = new NumericEvaluator<Float>() {
+      @Override
+      public boolean subtractAndCheckGreater(Float left, Float right, Float expected) {
+         return left - right > expected;
+      }
+   };
+
+   boolean subtractAndCheckGreater(T left, T right, T expected);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/OrCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/OrCondition.java
new file mode 100644
index 0000000..b40426e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/OrCondition.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import java.util.Collection;
+
+/**
+ * Checks that a series of conditions are all true
+ * 
+ * @author Ken J. Aguilar
+ */
+public class OrCondition extends AbstractCondition {
+
+   private final ICondition[] conditions;
+
+   public OrCondition(ICondition... conditions) {
+      this.conditions = conditions;
+   }
+
+   public OrCondition(Collection<ICondition> conditions) {
+      this.conditions = conditions.toArray(new ICondition[conditions.size()]);
+   }
+
+   @Override
+   public boolean check() {
+      for (ICondition condition : conditions) {
+         if (!condition.check()) {
+            return false;
+         }
+      }
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/PulseCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/PulseCondition.java
new file mode 100644
index 0000000..b9a0b6a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/PulseCondition.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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class PulseCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final int maxPulses;
+   private final DiscreteElement<T> element;
+   private final T pulsedValue;
+   private final T nonPulsedValue;
+   private int pulses = 0;
+   private T lastValue;
+
+   public PulseCondition(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue, int numPulses) {
+      this.element = element;
+      this.pulsedValue = element.elementMask(pulsedValue);
+      this.nonPulsedValue = element.elementMask(nonPulsedValue);
+      this.maxPulses = numPulses;
+   }
+
+   public PulseCondition(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue) {
+      this(element, pulsedValue, nonPulsedValue, 2);
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      lastValue = element.getValue();
+      if (lastValue.equals(pulsedValue)) {
+         pulses++;
+      } else if (lastValue.equals(nonPulsedValue)) {
+         if( pulses >= maxPulses ) {
+            return true;
+         } else {
+            pulses = 0;
+         }
+      }
+      return false;
+   }
+
+   public int getPulses() {
+      return pulses;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringComparisonCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringComparisonCondition.java
new file mode 100644
index 0000000..229959f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringComparisonCondition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class StringComparisonCondition extends AbstractCondition implements IDiscreteElementCondition<String> {
+
+   private final StringElement element;
+   private final String value;
+   private final StringOperation operation;
+   private String lastValue = null;
+
+   public StringComparisonCondition(StringElement element, StringOperation operation, String value) {
+      this.element = element;
+      this.operation = operation;
+      this.value = value;
+   }
+
+   @Override
+   public String getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      lastValue = element.getValue();
+      return operation.evaluate(lastValue, value);
+   }
+
+   public StringElement getElement() {
+      return element;
+   }
+
+   public String getValue() {
+      return value;
+   }
+
+   public StringOperation getOperation() {
+      return operation;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringOperation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringOperation.java
new file mode 100644
index 0000000..c4d6da2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringOperation.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public enum StringOperation {
+   LESS_THAN("<") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return currentValue.compareTo(targetValue) < 0;
+      }
+   },
+   LESS_THAN_OR_EQUAL("<=") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return currentValue.compareTo(targetValue) <= 0;
+      }
+   },
+   EQUAL("==") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return currentValue.compareTo(targetValue) == 0;
+      }
+   },
+   NOT_EQUAL("!=") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return currentValue.compareTo(targetValue) != 0;
+      }
+   },
+   GREATER_THAN_OR_EQUAL(">=") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return currentValue.compareTo(targetValue) >= 0;
+      }
+   },
+   GREATER_THAN(">") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return currentValue.compareTo(targetValue) > 0;
+      }
+   },
+
+   SUBSTRING("SUB-STRING OF") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return targetValue.contains(currentValue);
+      }
+   },
+
+   CONTAINS("CONTAINS") {
+
+      @Override
+      public boolean evaluate(String currentValue, String targetValue) {
+         return currentValue.contains(targetValue);
+      }
+   };
+
+   private final String toString;
+
+   StringOperation(String toString) {
+      this.toString = toString;
+   }
+
+   @Override
+   public String toString() {
+      return toString;
+   }
+
+   public abstract boolean evaluate(String currentValue, String targetValue);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java
new file mode 100644
index 0000000..6816365
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class StringTrimCondition extends AbstractCondition implements IDiscreteElementCondition<String> {
+
+   private final DiscreteElement<String> element;
+   private final String value;
+   private String actualValue;
+
+   public StringTrimCondition(DiscreteElement<String> element, String value) {
+      this.element = element;
+      this.value = value;
+   }
+
+   @Override
+   public boolean check() {
+      actualValue = element.getValue().trim();
+      return actualValue.equals(value);
+   }
+
+   @Override
+   public String getLastCheckValue() {
+      return actualValue;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java
new file mode 100644
index 0000000..2c66b46
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class TransitionCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+   private final DiscreteElement<T> element;
+   private final T transitionFromValue;
+   private final T transitionToValue;
+   private T lastValue = null;
+
+   public TransitionCondition(DiscreteElement<T> element, T transitionFromValue, T transitionToValue) {
+      this.element = element;
+      this.transitionToValue = transitionToValue;
+      this.transitionFromValue = transitionFromValue;
+   }
+
+   @Override
+   public T getLastCheckValue() {
+      return lastValue;
+   }
+
+   @Override
+   public boolean check() {
+      T currentValue = element.getValue();
+      if (lastValue == null) {
+         lastValue = currentValue;
+         return false;
+      }
+      boolean result = transitionFromValue.equals(lastValue) && transitionToValue.equals(currentValue);
+      lastValue = currentValue;
+      return result;
+   }
+
+   public DiscreteElement<T> getElement() {
+      return element;
+   }
+
+   public T getTransitionFromValue() {
+      return transitionFromValue;
+   }
+
+   public T getTransitionToValue() {
+      return transitionToValue;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java
new file mode 100644
index 0000000..9860239
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.message.condition;
+
+public class TransmissionCountCondition extends AbstractCondition {
+
+   private final int max;
+
+   public TransmissionCountCondition(int max) {
+      this.max = max;
+   }
+
+   @Override
+   public boolean check() {
+      return getCheckCount() >= max;
+   }
+
+   public int getMaxTransmitCount() {
+      return max;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java
new file mode 100644
index 0000000..a497cd9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.message.data;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ByteArrayHolder {
+   private byte[] buffer;
+   private ByteBuffer byteBuffer;
+
+   public ByteArrayHolder() {
+
+   }
+
+   public ByteArrayHolder(byte[] buffer) {
+      this.buffer = buffer;
+      byteBuffer = ByteBuffer.wrap(buffer);
+   }
+
+   public void set(byte[] buffer) {
+      this.buffer = buffer;
+      byteBuffer = ByteBuffer.wrap(buffer);
+   }
+
+   public byte[] get() {
+      return this.buffer;
+   }
+
+   public ByteBuffer getByteBuffer() {
+      return byteBuffer;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java
new file mode 100644
index 0000000..61a427c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.message.data;
+
+import org.eclipse.osee.ote.messaging.dds.service.Key;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class DDSTypeSupport extends TypeSupport {
+
+   private final Key key;
+   private final String readerName;
+   private final String writerName;
+   private final int size;
+
+   public DDSTypeSupport(Key key, String readerName, String writerName, int size) {
+      this.key = key;
+      this.readerName = readerName;
+      this.writerName = writerName;
+      this.size = size;
+   }
+
+   @Override
+   protected Key getKey() {
+      return key;
+   }
+
+   @Override
+   protected String getReaderName() {
+      return this.readerName;
+   }
+
+   @Override
+   protected int getTypeDataSize() {
+      return this.size;
+   }
+
+   @Override
+   protected String getWriterName() {
+      return this.writerName;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/HeaderData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/HeaderData.java
new file mode 100644
index 0000000..588c7d5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/HeaderData.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.message.data;
+
+import org.eclipse.osee.ote.message.IMessageHeader;
+
+public class HeaderData extends MessageData {
+
+   public HeaderData(String name, MemoryResource memoryResource) {
+      super(name, memoryResource);
+   }
+
+   public HeaderData(MemoryResource memoryResource) {
+      this("", memoryResource);
+   }
+
+   @Override
+   public IMessageHeader getMsgHeader() {
+      return null;
+   }
+
+   @Override
+   public void initializeDefaultHeaderValues() {
+   }
+
+   @Override
+   public void visit(IMessageDataVisitor visitor) {
+   }
+
+   @Override
+   public void zeroize() {
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java
new file mode 100644
index 0000000..195bc7a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.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.message.data;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageDataVisitor {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java
new file mode 100644
index 0000000..3c58096
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java
@@ -0,0 +1,511 @@
+/*******************************************************************************
+ * 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.message.data;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.logging.Level;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MemoryResource {
+   private static final Charset US_ASCII_CHARSET = Charset.forName("US-ASCII");
+
+   private final ByteArrayHolder byteArray;
+   //	private byte _data[];
+   private int _offset;
+   private final int _length;
+   private volatile boolean _dataHasChanged;
+
+   //	private final ByteBuffer buffer;
+
+   public MemoryResource(byte data[], int offset, int length) {
+      byteArray = new ByteArrayHolder(data);
+      _length = length;
+      _offset = offset;
+      _dataHasChanged = false;
+   }
+
+   protected MemoryResource(ByteArrayHolder byteArray, int offset, int length) {
+      this.byteArray = byteArray;
+      _length = length;
+      _offset = offset;
+      _dataHasChanged = false;
+   }
+
+   public final String getUnfilteredASCIIString(int offset, int msb, int lsb) {
+      offset += _offset;
+      int size = (lsb - msb + 1) / 8;
+
+      StringBuilder str = new StringBuilder(size);
+      int limit = Math.min(size, byteArray.get().length-offset);
+      for (int i = 0; i < limit; i++) {
+         str.append(getASCIICharFromOffset(offset + i));
+      }
+      return str.toString();
+   }
+   public void setData(byte data[]) {
+      byteArray.set(data);
+      _dataHasChanged = true;
+   }
+
+   public byte[] getData() {
+      return byteArray.get();
+   }
+
+   public byte getByte(int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 7) {
+         return byteArray.get()[offset];
+      } else {
+         int b = byteArray.get()[offset];
+         int mask = (1 << 8 - msb) - 1;
+         mask = mask & 0xFFFFFF80 >>> lsb;
+         return (byte) ((b & mask) >> 7 - lsb);
+      }
+   }
+
+   private byte getByteFromOffset(int offset) {
+      return byteArray.get()[offset];
+   }
+
+   private final char getASCIICharFromOffset(int offset) {
+      return (char) byteArray.get()[offset];
+   }
+
+   public final int getInt(int offset, int msb, int lsb) {
+      offset += _offset;
+      final byte[] data = byteArray.get();
+      final int length = data.length;
+      final int beginByte = offset + msb / 8;
+      int endByte = offset + lsb / 8;
+      endByte = endByte < length ? endByte : length;
+      int v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+      if (endByte != beginByte) {
+         for (int i = beginByte + 1; i <= endByte - 1; i++) {
+            v <<= 8;
+            v |= data[i] & 0xFF;
+         }
+         v <<= 8;
+         v |= data[endByte] & 0xFF;
+      }
+      return v >>> 7 - lsb % 8;
+   }
+
+   public final short getSignedInt16(int offset, int msb, int lsb) {
+      if (lsb - msb != 15) {
+         throw new IllegalArgumentException("element must be 16 bits wide");
+      }
+      offset += _offset;
+      final byte[] data = byteArray.get();
+      final int length = data.length;
+      final int beginByte = offset + msb / 8;
+      int endByte = offset + lsb / 8;
+      endByte = endByte < length ? endByte : length;
+      int v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+            if (endByte != beginByte) {
+               for (int i = beginByte + 1; i <= endByte - 1; i++) {
+                  v <<= 8;
+                  v |= data[i] & 0xFF;
+               }
+               v <<= 8;
+               v |= data[endByte] & 0xFF;
+            }
+            return (short) (v >>> 7 - lsb % 8);
+   }
+
+   public final int getSignedInt32(int offset, int msb, int lsb) {
+      if (lsb - msb != 31) {
+         throw new IllegalArgumentException("element must be 32 bits wide");
+      }
+      offset += _offset;
+      final byte[] data = byteArray.get();
+      final int length = data.length;
+      final int beginByte = offset + msb / 8;
+      int endByte = offset + lsb / 8;
+      endByte = endByte < length ? endByte : length;
+      int v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+                  if (endByte != beginByte) {
+                     for (int i = beginByte + 1; i <= endByte - 1; i++) {
+                        v <<= 8;
+                        v |= data[i] & 0xFF;
+                     }
+                     v <<= 8;
+                     v |= data[endByte] & 0xFF;
+                  }
+                  return v >>> 7 - lsb % 8;
+   }
+
+   public final long getLong(int offset, int msb, int lsb) {
+      offset += _offset;
+      if (lsb - msb <= 63) {
+         final byte[] data = byteArray.get();
+         final int length = data.length;
+         final int beginByte = offset + msb / 8;
+         int endByte = offset + lsb / 8;
+         endByte = endByte < length ? endByte : length;
+         long v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+      if (endByte != beginByte) {
+         for (int i = beginByte + 1; i <= endByte - 1; i++) {
+            v <<= 8;
+            v |= data[i] & 0xFF;
+         }
+         v <<= 8;
+         v |= data[endByte] & 0xFF;
+      }
+      return v >>> 7 - lsb % 8;
+      } else {
+         throw new IllegalArgumentException("gettting long with bits not supported");
+      }
+   }
+
+   public final String getASCIIString(int offset, int length) {
+      offset += _offset;
+      // int size = ((lsb - msb) + 1) / 8;
+
+      StringBuilder str = new StringBuilder(length);
+      for (int i = 0; i < length; i++) {
+         char ch = getASCIICharFromOffset(offset + i);
+         if (ch != 0) {// NOTE this was done to be compatible with java
+            // Strings that don't null char termination
+            str.append(getASCIICharFromOffset(offset + i));
+         }
+      }
+      return str.toString();
+   }
+
+   public final String getASCIIString(int offset, int msb, int lsb) {
+      offset += _offset;
+      int size = (lsb - msb + 1) / 8;
+
+      StringBuilder str = new StringBuilder(size);
+      for (int i = 0; i < size; i++) {
+         if (offset + i >= byteArray.get().length) {
+            break;
+         }
+         char ch = getASCIICharFromOffset(offset + i);
+         if (ch == 0) {
+            break; //Terminate on null characters.
+         }
+         str.append(getASCIICharFromOffset(offset + i));
+      }
+      return str.toString();
+   }
+
+   public final int getASCIIChars(int offset, int msb, int lsb, char[] destination) {
+      offset += _offset;
+      int size = (lsb - msb + 1) / 8;
+      int destIndex = 0;
+
+      for (int i = 0; i < size; i++) {
+         if (offset + i >= byteArray.get().length) {
+            break;
+         }
+         char ch = getASCIICharFromOffset(offset + i);
+         destination[destIndex] = ch;
+         destIndex++;
+      }
+      return destIndex;
+   }
+
+   public boolean asciiEquals(int offset, int msb, int lsb, String other) {
+      offset += _offset;
+      int size = (lsb - msb + 1) / 8;
+      if (other.length() > size) {
+         return false;
+      }
+      boolean isEqual = true;
+      for (int i = 0; i < size && isEqual; i++) {
+         char ch = getASCIICharFromOffset(offset + i);
+         if (ch != 0) {// NOTE this was done to be compatible with java
+            // Strings that don't null char termination
+            isEqual = ch == other.charAt(i);
+         }
+      }
+      return isEqual;
+   }
+
+   public void setBoolean(boolean v, int offset, int msb, int lsb) {
+      int i = v ? 1 : 0;
+      if (lsb < 32) {
+         setInt(i, offset, msb, lsb);
+      } else {
+         throw new RuntimeException("Not supported lsb = " + lsb);
+      }
+   }
+
+   public final void setByte(int v, int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 7) {
+         setByteFromOffset(v, offset);
+      } else {
+         if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+            throw new IllegalArgumentException("Tried to set signal to value that is too large");
+         }
+         int mask = createMask(msb, lsb, 7);
+         v = v << 7 - lsb;
+         v &= ~mask;
+         setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+      }
+   }
+
+   public final void setBytesInHeader(int v, int offset, int msb, int lsb) {
+      if (offset > _offset) {
+         throw new IllegalArgumentException("Data beyond header attempting to be set!!!");
+      }
+      if (msb == 0 && lsb == 7) {
+         setByteFromOffset(v, offset);
+      } else {
+         if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+            throw new IllegalArgumentException("Tried to set signal to value that is too large");
+         }
+         int mask = (1 << 7 - lsb) - 1;
+         mask = mask | 0xFFFFFF00 >>> msb;
+         v = v << 7 - lsb;
+         setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+      }
+   }
+
+   private final void setByteFromOffset(int v, int offset) {
+      byteArray.get()[offset] = (byte) v;
+      _dataHasChanged = true;
+   }
+
+   public void setOffset(int offset) {
+      this._offset = offset;
+   }
+
+   public final void setInt(int v, int offset, int msb, int lsb) {
+      offset += _offset;
+      final byte[] data = byteArray.get();
+      final int length = data.length;
+      final int beginByte = offset + msb / 8;
+      int endByte = offset + lsb / 8;
+      endByte = endByte < length ? endByte : length - 1;
+      final int lsbMod = lsb % 8;
+      if (endByte != beginByte) {
+         byte mask = (byte) (0xFF >>> lsbMod + 1); // mask used to mask off bits we shouldn't touch
+         data[endByte] &= mask; // zero out bits that will be set by v
+         v <<= 7 - lsbMod; // shift v so that it lines up
+         data[endByte] |= v;
+         v >>>= 8; // shift to the next byte
+         for (int i = endByte - 1; i >= beginByte + 1; i--) {
+            data[i] = (byte) v;
+            v >>>= 8; // shift to the next byte
+         }
+         mask = (byte) (0xFF >>> msb % 8);
+         v &= mask;
+         data[beginByte] &= ~mask;
+         data[beginByte] |= v;
+      } else {
+         byte mask = (byte) (-1 << lsb - msb + 1); // create mask for everything left of msb
+         v &= ~mask; // mask off everything to the left of the msb in the value
+         int shift = 7 - lsbMod;
+         mask <<= shift; // shift mask to align with the lsb
+         v <<= shift; // shift value so that it aligns with the lsb
+         mask |= (byte) (0xFF >>> lsbMod + 1); // union the mask so that it mask everything to the right of the lsb
+         data[beginByte] &= mask; // zero out the bits about to be written to
+         data[beginByte] |= v; // logical 'OR' in the value
+      }
+      _dataHasChanged = true;
+   }
+
+   private int createMask(int msb, int lsb, int maxBitPosition) {
+      int maximumElementValue = (int) Math.pow(2, lsb - msb + 1) - 1;
+      int maxValueInPosition = maximumElementValue << maxBitPosition - lsb;
+      //the mask is all ones except at the bit positions we are setting
+      int mask = ~maxValueInPosition;
+      return mask;
+   }
+
+   public final void setLong(long v, int offset, int msb, int lsb) {
+      if (lsb - msb < 64) {
+         offset += _offset;
+         final byte[] data = byteArray.get();
+         final int length = data.length;
+         final int beginByte = offset + msb / 8;
+         int endByte = offset + lsb / 8;
+         endByte = endByte < length ? endByte : length - 1;
+         final int lsbMod = lsb % 8;
+         if (endByte != beginByte) {
+            byte mask = (byte) (0xFF >>> lsbMod + 1); // mask used to mask off bits we shouldn't touch
+            data[endByte] &= mask; // zero out bits that will be set by v
+            v <<= 7 - lsbMod; // shift v so that it lines ups
+            data[endByte] |= v;
+            v >>>= 8;
+            for (int i = endByte - 1; i >= beginByte + 1; i--) {
+               data[i] = (byte) v;
+               v >>>= 8;
+            }
+            mask = (byte) (0xFF >>> msb % 8);
+            v &= mask;
+            data[beginByte] &= ~mask;
+            data[beginByte] |= v;
+         } else {
+            byte mask = (byte) (-1 << lsb - msb + 1);
+            v &= ~mask;
+            int shift = 7 - lsbMod;
+            mask <<= shift;
+            v <<= shift;
+            mask |= (byte) (0xFF >>> lsbMod + 1);
+            data[beginByte] &= mask;
+            data[beginByte] |= v;
+         }
+         _dataHasChanged = true;
+      } else {
+         throw new IllegalArgumentException("not supported bit width of " + (lsb - msb + 1));
+      }
+   }
+
+   public final void setASCIIString(String s, int offset, int msb, int lsb) {
+      int size = (lsb - msb + 1) / 8;
+      int limit = Math.min(s.length(), size);
+      System.arraycopy(s.getBytes(US_ASCII_CHARSET), 0, byteArray.get(), _offset + offset, limit);
+      zeroizeFromOffset(limit + offset, size - limit);
+      _dataHasChanged = true;
+   }
+
+   public final void setASCIIString(String s, int offset) {
+      System.arraycopy(s.getBytes(US_ASCII_CHARSET), 0, byteArray.get(), _offset + offset, s.length());
+      _dataHasChanged = true;
+   }
+
+   public void zeroizeFromOffset(int offset, int size) {
+      offset += _offset;
+      Arrays.fill(byteArray.get(), offset, offset + size, (byte) 0);
+      _dataHasChanged = true;
+   }
+
+   public boolean getBoolean(int offset, int msb, int lsb) {
+      return getInt(offset, msb, lsb) != 0;
+   }
+
+   public void copyData(int offset, byte[] src, int srcOffset, int length) {
+      //		assert(byteArray.get().length >= length );
+      if (length + offset > byteArray.get().length) {
+         throw new MessageSystemException("backing byte[] is too small for copy operation", Level.SEVERE);
+      }
+      System.arraycopy(src, srcOffset, byteArray.get(), offset, length);
+      Arrays.fill(byteArray.get(), offset + length, byteArray.get().length, (byte) 0);
+      _dataHasChanged = true;
+   }
+
+   public void copyData(ByteBuffer src) {
+      copyData(0, src, src.remaining());
+   }
+
+   /**
+    * @param destOffset offset in this memory resource in which the copy will begin
+    */
+   public void copyData(int destOffset, ByteBuffer src, int length) throws MessageSystemException {
+      if (length + destOffset > byteArray.get().length) {
+         throw new MessageSystemException("backing byte[] is too small for copy operation", Level.INFO);
+      }
+      if (src.hasArray()) {
+         System.arraycopy(src.array(), src.arrayOffset() + src.position(), byteArray.get(), destOffset, length);
+      } else {
+         synchronized (src) {
+            src.mark();
+            src.get(byteArray.get(), destOffset, length);
+            src.reset();
+         }
+      }
+      Arrays.fill(byteArray.get(), destOffset + length, byteArray.get().length, (byte) 0);
+      _dataHasChanged = true;
+   }
+
+   public ByteBuffer getAsBuffer() {
+      return ByteBuffer.wrap(byteArray.get());
+   }
+
+   public ByteBuffer getBuffer() {
+      return byteArray.getByteBuffer();
+   }
+
+   //	public void set(ByteBuffer other) {
+   //	buffer.put(other);
+   //	}
+   public ByteBuffer getAsBuffer(int offset, int length) {
+      if (offset > byteArray.get().length) {
+         throw new IllegalArgumentException(
+               "offset of " + offset + " cannot be bigger than data length of " + byteArray.get().length);
+      }
+      if (offset + length > byteArray.get().length) {
+         throw new IllegalArgumentException(
+               "offset (" + offset + ") plus length (" + length + ") is greater than data length of " + byteArray.get().length);
+      }
+      return ByteBuffer.wrap(byteArray.get(), offset, length);
+   }
+
+   public int getOffset() {
+      return _offset;
+   }
+
+   public int getLength() {
+      return _length;
+   }
+
+   public MemoryResource slice(int offset, int length) {
+      return new MemoryResource(byteArray, offset, length);
+   }
+
+   /**
+    * @return the _dataHasChanged
+    */
+   public boolean isDataChanged() {
+      return _dataHasChanged;
+   }
+
+   /**
+    * @param hasChanged the _dataHasChanged to set
+    */
+   public void setDataHasChanged(boolean hasChanged) {
+      _dataHasChanged = hasChanged;
+   }
+
+   public static void main(String[] args) {
+
+      MemoryResource mem = new MemoryResource(new byte[24], 4, 24);
+      mem.setLong(0x1234567890abcdefL, 12, 0, 63);
+      for (int i = 0; i < 24; i++) {
+         System.out.printf("%02x ", mem.getData()[i]);
+      }
+      System.out.printf("\nget=%016x\n", mem.getLong(12, 0, 63));
+
+      mem.setLong(0xff22cc00aa11L, 12, 0, 43);
+      for (int i = 0; i < 24; i++) {
+         System.out.printf("%02x ", mem.getData()[i]);
+      }
+      System.out.printf("\nget=%016x\n", mem.getLong(12, 0, 43));
+
+      mem.setLong(0xffdd555522L, 12, 2, 41);
+      for (int i = 0; i < 24; i++) {
+         System.out.printf("%02x ", mem.getData()[i]);
+      }
+      System.out.printf("\nget=%016x\n", mem.getLong(12, 2, 41));
+
+      mem.setLong(0x00L, 12, 2, 41);
+      for (int i = 0; i < 24; i++) {
+         System.out.printf("%02x ", mem.getData()[i]);
+      }
+      System.out.printf("\nget=%016x\n", mem.getLong(12, 2, 41));
+
+      mem.setLong(0x035544332211L, 12, 2, 43);
+      for (int i = 0; i < 24; i++) {
+         System.out.printf("%02x ", mem.getData()[i]);
+      }
+      System.out.printf("\nget=%016x\n", mem.getLong(12, 2, 43));
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java
new file mode 100644
index 0000000..e99fcec
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java
@@ -0,0 +1,515 @@
+/*******************************************************************************
+ * 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.message.data;
+
+import java.nio.ByteBuffer;
+import java.util.logging.Level;
+import org.eclipse.osee.ote.message.MessageSystemException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MemoryResourceByteBuffer {
+   private byte _data[];
+   private final int _offset;
+   public boolean _dataHasChanged;
+
+   private final ByteBuffer buffer;
+
+   public MemoryResourceByteBuffer(byte data[], int offset, int length) {
+      _data = data;
+      _offset = offset;
+      _dataHasChanged = false;
+      buffer = ByteBuffer.wrap(_data);
+   }
+
+   public void setData(byte data[]) {
+      _data = data;
+      _dataHasChanged = true;
+   }
+
+   public byte[] getData() {
+      return _data;
+   }
+
+   public long getRawDataLong(int offset, int msb, int lsb) {
+
+      if (lsb < 8) {
+         return getByte(offset, msb, lsb);
+      } else if (lsb < 16) {
+         return getShort(offset, msb, lsb);
+      } else if (lsb < 32) {
+         offset += _offset;
+         if (msb == 0 && lsb == 31) {
+            return getIntFromOffset(offset);
+         } else {
+            int i = getIntFromOffset(offset);
+            int mask = (1 << 32 - msb) - 1;
+            mask = mask & 0x80000000 >>> lsb;
+            return (i & mask) >> 31 - lsb;
+         }
+      } else if (lsb == 63) {
+         return getLong(offset, msb, lsb);
+      } else {
+         throw new IllegalArgumentException("lsb greater than 63");
+      }
+   }
+
+   public int getRawDataInt(int offset, int msb, int lsb) {
+
+      if (lsb < 8) {
+         return getByte(offset, msb, lsb);
+      } else if (lsb < 16) {
+         return getShort(offset, msb, lsb);
+      } else if (lsb < 32) {
+         offset += _offset;
+         if (msb == 0 && lsb == 31) {
+            return getIntFromOffset(offset);
+         } else {
+            int i = getIntFromOffset(offset);
+            int mask = (1 << 32 - msb) - 1;
+            mask = mask & 0x80000000 >>> lsb;
+            return (i & mask) >> 31 - lsb;
+         }
+      } else {
+         throw new IllegalArgumentException("lsb greater than 31");
+      }
+   }
+
+   public void setRawData(long v, int offset, int msb, int lsb) {
+      if (lsb < 8) {
+         setByte((int) v, offset, msb, lsb);
+      } else if (lsb < 16) {
+         setShort((int) v, offset, msb, lsb);
+      } else if (lsb < 32) {
+         setInt((int) v, offset, msb, lsb);
+      } else {
+         setLong(v, offset, msb, lsb);
+      }
+   }
+
+   public byte getByte(int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 7) {
+         return getByteFromOffset(offset);
+      } else {
+         int b = getByteFromOffset(offset);
+         int mask = (1 << 8 - msb) - 1;
+         mask = mask & 0xFFFFFF80 >>> lsb;
+         return (byte) ((b & mask) >> 7 - lsb);
+      }
+   }
+
+   private byte getByteFromOffset(int offset) {
+      return _data[offset];
+   }
+
+   public short getShort(int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 15) {
+         return getShortFromOffset(offset);
+      } else {
+         int s = getShortFromOffset(offset);
+         int mask = (1 << 16 - msb) - 1;
+         mask = mask & 0xFFFF8000 >>> lsb;
+         return (short) ((s & mask) >> 15 - lsb);
+      }
+   }
+
+   private short getShortFromOffset(int offset) {
+      int ch1 = _data[offset] & 0xFF;
+      int ch2 = _data[offset + 1] & 0xFF;
+      return (short) ((ch1 << 8) + (ch2 << 0));
+   }
+
+   public char getASCIIChar(int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 7) {
+         return getASCIICharFromOffset(offset);
+      } else if (msb == 8 && lsb == 15) {
+         return getASCIICharFromOffset(offset + 1);
+      } else if (msb == 16 && lsb == 23) {
+         return getASCIICharFromOffset(offset + 2);
+      } else if (msb == 24 && lsb == 31) {
+         return getASCIICharFromOffset(offset + 3);
+      } else {
+         throw new IllegalArgumentException("not supported");
+      }
+   }
+
+   private final char getASCIICharFromOffset(int offset) {
+      return (char) _data[offset];
+   }
+
+   public int getInt(int offset, int msb, int lsb) {
+
+      int nextFourBytes = getIntFromOffset(offset + _offset);
+
+      int bitsToShift = 32 - msb;
+      int maskLeft = msb == 0 ? -1 : (1 << bitsToShift) - 1;//(int)Math.pow(2, 32 - msb ) -1;
+
+      int retVal = (nextFourBytes & maskLeft) >>> 31 - lsb;
+      return retVal;
+
+      //      if (lsb < 8) {
+      //         return getByte(offset, msb, lsb);
+      //      }
+      //      else if (lsb < 16) {
+      //         return getShort(offset, msb, lsb);
+      //      }
+      //      else if (lsb < 32) {
+      //         offset += _offset;
+      //         if (msb == 0 && lsb == 31) {
+      //            return getIntFromOffset(offset);
+      //         }
+      //         else {
+      //            int i = getIntFromOffset(offset);
+      //            int mask = (1 << (32 - msb)) - 1;
+      //            mask = mask & (0x80000000 >>> lsb);
+      //            return (i & mask) >> (31 - lsb);
+      //         }
+      //      }
+      //      else {
+      //         throw new IllegalArgumentException("lsb greater than 31");
+      //      }
+   }
+
+   private int getIntFromOffset(int offset) {
+      int ch1 = 0, ch2 = 0, ch3 = 0, ch4 = 0;
+
+      if (_data.length > offset) {
+         ch1 = _data[offset] & 0xFF;
+      }
+      if (_data.length > offset + 1) {
+         ch2 = _data[offset + 1] & 0xFF;
+      }
+      if (_data.length > offset + 2) {
+         ch3 = _data[offset + 2] & 0xFF;
+      }
+      if (_data.length > offset + 3) {
+         ch4 = _data[offset + 3] & 0xFF;
+      }
+      return (ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0);
+   }
+
+   public final long getLong(int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 63) {
+         return getLongFromOffset(offset);
+      } else {
+         throw new IllegalArgumentException("gettting long with bits not supported");
+      }
+   }
+
+   private final long getLongFromOffset(int offset) {
+      long byte1 = 0, byte2 = 0, byte3 = 0, byte4 = 0, byte5 = 0, byte6 = 0, byte7 = 0, byte8 = 0;
+
+      if (_data.length > offset) {
+         byte1 = _data[offset];
+      }
+      if (_data.length > offset + 1) {
+         byte2 = _data[offset + 1];
+      }
+      if (_data.length > offset + 2) {
+         byte3 = _data[offset + 2];
+      }
+      if (_data.length > offset + 3) {
+         byte4 = _data[offset + 3];
+      }
+      if (_data.length > offset + 4) {
+         byte5 = _data[offset + 4];
+      }
+      if (_data.length > offset + 5) {
+         byte6 = _data[offset + 5];
+      }
+      if (_data.length > offset + 6) {
+         byte7 = _data[offset + 6];
+      }
+      if (_data.length > offset + 7) {
+         byte8 = _data[offset + 7];
+      }
+
+      long retVal =
+         (byte1 << 56) + ((byte2 & 0xFF) << 48) + ((byte3 & 0xFF) << 40) + ((byte4 & 0xFF) << 32) + ((byte5 & 0xFF) << 24) + ((byte6 & 0xFF) << 16) + ((byte7 & 0xFF) << 8) + (byte8 & 0xFF);
+
+      return retVal;
+      //      return (((long) _data[offset] << 56) + ((long) (_data[offset + 1] & 255) << 48)
+      //            + ((long) (_data[offset + 2] & 255) << 40) + ((long) (_data[offset + 3] & 255) << 32)
+      //            + ((long) (_data[offset + 4] & 255) << 24) + ((_data[offset + 5] & 255) << 16)
+      //            + ((_data[offset + 6] & 255) << 8) + ((_data[offset + 7] & 255) << 0));
+   }
+
+   public final String getASCIIString(int offset, int length) {
+      offset += _offset;
+      // int size = ((lsb - msb) + 1) / 8;
+
+      StringBuffer str = new StringBuffer(length);
+      for (int i = 0; i < length; i++) {
+         char ch = getASCIICharFromOffset(offset + i);
+         if (ch != 0) {// NOTE this was done to be compatible with java
+            // Strings that don't null char termination
+            str.append(getASCIICharFromOffset(offset + i));
+         }
+      }
+      return str.toString();
+   }
+
+   public final String getASCIIString(int offset, int msb, int lsb) {
+      offset += _offset;
+      int size = (lsb - msb + 1) / 8;
+
+      StringBuffer str = new StringBuffer(size);
+      for (int i = 0; i < size; i++) {
+         char ch = getASCIICharFromOffset(offset + i);
+         if (ch != 0) {// NOTE this was done to be compatible with java
+            // Strings that don't null char termination
+            str.append(getASCIICharFromOffset(offset + i));
+         }
+      }
+      return str.toString();
+   }
+
+   public void setBoolean(boolean v, int offset, int msb, int lsb) {
+      int i = v ? 1 : 0;
+      if (lsb < 8) {
+         setByte(i, offset, msb, lsb);
+      } else if (lsb < 16) {
+         setShort(i, offset, msb, lsb);
+      } else if (lsb < 32) {
+         setInt(i, offset, msb, lsb);
+      } else {
+         throw new RuntimeException("Not supported lsb = " + lsb);
+      }
+   }
+
+   public final void setByte(int v, int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 7) {
+         setByteFromOffset(v, offset);
+      } else {
+         if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+            throw new IllegalArgumentException("Tried to set signal to value that is too large");
+         }
+         int mask = createMask(msb, lsb, 7);
+         v = v << 7 - lsb;
+         setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+      }
+   }
+
+   public final void setBytesInHeader(int v, int offset, int msb, int lsb) {
+      if (offset > _offset) {
+         throw new IllegalArgumentException("Data beyond header attempting to be set!!!");
+      }
+      if (msb == 0 && lsb == 7) {
+         setByteFromOffset(v, offset);
+      } else {
+         if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+            throw new IllegalArgumentException("Tried to set signal to value that is too large");
+         }
+         int mask = (1 << 7 - lsb) - 1;
+         mask = mask | 0xFFFFFF00 >>> msb;
+         v = v << 7 - lsb;
+         setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+      }
+   }
+
+   private final void setByteFromOffset(int v, int offset) {
+      _data[offset] = (byte) v;
+      _dataHasChanged = true;
+   }
+
+   private final void setShort(int v, int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 15) {
+         setShortFromOffset(v, offset);
+      } else {
+         if ((v & 1 >>> 15 - (lsb - msb)) != 0) {
+            throw new IllegalArgumentException("Tried to set signal to value that is too large");
+         }
+         int mask = createMask(msb, lsb, 15);
+
+         // shift the value into the correct position within the whole int
+         v = v << 15 - lsb;
+         // zero out the element we are setting before oring in the new value
+         setShortFromOffset(v | getShortFromOffset(offset) & mask, offset);
+      }
+   }
+
+   private final void setShortFromOffset(int v, int offset) {
+      _data[offset] = (byte) (v >>> 8 & 0xFF);
+      _data[offset + 1] = (byte) (v >>> 0 & 0xFF);
+      _dataHasChanged = true;
+   }
+
+   public final void setASCIIChar(char v, int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 7) {
+         setASCIICharFromOffset(v, offset);
+      } else if (msb == 8 && lsb == 15) {
+         setASCIICharFromOffset(v, offset + 1);
+      } else if (msb == 16 && lsb == 23) {
+         setASCIICharFromOffset(v, offset + 2);
+      } else if (msb == 24 && lsb == 31) {
+         setASCIICharFromOffset(v, offset + 3);
+      } else {
+         throw new IllegalArgumentException("only 8 bit char supported");
+      }
+   }
+
+   private final void setASCIICharFromOffset(char v, int offset) {
+      _data[offset] = (byte) (v & 0xFF);
+      _dataHasChanged = true;
+   }
+
+   public final void setInt(int v, int offset, int msb, int lsb) {
+      if (lsb < 8) {
+         setByte(v, offset, msb, lsb);
+      } else if (lsb < 16) {
+         setShort(v, offset, msb, lsb);
+      } else {
+         offset += _offset;
+         if (msb == 0 && lsb == 31) {
+            setIntFromOffset(v, offset);
+         } else {
+            if ((v & 1 >>> 31 - (lsb - msb)) != 0) {
+               throw new IllegalArgumentException("Tried to set signal to value that is too large");
+            }
+            int mask = createMask(msb, lsb, 31);
+            // shift the value into the correct position within the whole int
+            v = v << 31 - lsb;
+            // zero out the element we are setting before oring in the new value
+            setIntFromOffset(v | getIntFromOffset(offset) & mask, offset);
+         }
+      }
+   }
+
+   private int createMask(int msb, int lsb, int maxBitPosition) {
+      int maximumElementValue = (int) Math.pow(2, lsb - msb + 1) - 1;
+      int maxValueInPosition = maximumElementValue << maxBitPosition - lsb;
+      //the mask is all ones except at the bit positions we are setting
+      int mask = ~maxValueInPosition;
+      return mask;
+   }
+
+   private final void setIntFromOffset(int v, int offset) {
+      if (_data.length > offset) {
+         _data[offset] = (byte) (v >>> 24 & 0xFF);
+      }
+      if (_data.length > offset + 1) {
+         _data[offset + 1] = (byte) (v >>> 16 & 0xFF);
+      }
+      if (_data.length > offset + 2) {
+         _data[offset + 2] = (byte) (v >>> 8 & 0xFF);
+      }
+      if (_data.length > offset + 3) {
+         _data[offset + 3] = (byte) (v >>> 0 & 0xFF);
+      }
+      _dataHasChanged = true;
+   }
+
+   public final void setLong(long v, int offset, int msb, int lsb) {
+      offset += _offset;
+      if (msb == 0 && lsb == 63) {
+         setLongFromOffset(v, offset);
+      } else {
+         throw new IllegalArgumentException("not supported");
+      }
+   }
+
+   private final void setLongFromOffset(long v, int offset) {
+      if (_data.length > offset) {
+         _data[offset] = (byte) (v >>> 56);
+      }
+      if (_data.length > offset + 1) {
+         _data[offset + 1] = (byte) (v >>> 48);
+      }
+      if (_data.length > offset + 2) {
+         _data[offset + 2] = (byte) (v >>> 40);
+      }
+      if (_data.length > offset + 3) {
+         _data[offset + 3] = (byte) (v >>> 32);
+      }
+      if (_data.length > offset + 4) {
+         _data[offset + 4] = (byte) (v >>> 24);
+      }
+      if (_data.length > offset + 5) {
+         _data[offset + 5] = (byte) (v >>> 16);
+      }
+      if (_data.length > offset + 6) {
+         _data[offset + 6] = (byte) (v >>> 8);
+      }
+      if (_data.length > offset + 7) {
+         _data[offset + 7] = (byte) (v >>> 0);
+      }
+      _dataHasChanged = true;
+   }
+
+   public final void setASCIIString(String s, int offset, int msb, int lsb) {
+      offset += _offset;
+      int size = (lsb - msb + 1) / 8;
+
+      int len = s.length();
+      for (int i = 0; i < len && i < size; i++) {
+         setASCIICharFromOffset(s.charAt(i), offset + i);
+      }
+   }
+
+   public final void setASCIIString(String s, int offset) {
+      offset += _offset;
+      int len = s.length();
+      for (int i = 0; i < len; i++) {
+         setASCIICharFromOffset(s.charAt(i), offset + i);
+      }
+   }
+
+   public boolean getBoolean(int offset, int msb, int lsb) {
+      int i;
+      if (lsb < 8) {
+         i = getByte(offset, msb, lsb);
+      } else if (lsb < 16) {
+         i = getShort(offset, msb, lsb);
+      } else {
+         i = getInt(offset, msb, lsb);
+      }
+      return i != 0;
+   }
+
+   public void copyData(int offset, byte[] src, int srcOffset, int length) {
+      //	   assert(_data.length >= length );
+      if (_data.length < src.length) {
+         throw new MessageSystemException("backing byte[] is too small for copy operation", Level.SEVERE);
+      }
+      System.arraycopy(src, srcOffset, _data, offset, length);
+      _dataHasChanged = true;
+   }
+
+   public void copyData(ByteBuffer src) {
+      src.get(_data);
+      _dataHasChanged = true;
+   }
+
+   public void copyData(int offset, ByteBuffer src, int length) {
+      src.get(_data, offset, length);
+      _dataHasChanged = true;
+   }
+
+   public ByteBuffer getAsBuffer() {
+      return ByteBuffer.wrap(_data);
+   }
+
+   public void set(ByteBuffer other) {
+      buffer.put(other);
+   }
+
+   public ByteBuffer getAsBuffer(int offset, int length) {
+      return ByteBuffer.wrap(_data, offset, length);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MessageData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MessageData.java
new file mode 100644
index 0000000..fc4afbd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MessageData.java
@@ -0,0 +1,690 @@
+/*******************************************************************************
+ * 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.message.data;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Locale;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.log.Env;
+import org.eclipse.osee.ote.message.IMessageDisposeListener;
+import org.eclipse.osee.ote.message.IMessageHeader;
+import org.eclipse.osee.ote.message.IMessageSendListener;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.Namespace;
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.service.Key;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class MessageData implements DataReaderListener, DataWriterListener, Data, Key {
+
+   private static long debugTimeout = OtePropertiesCore.timeDebugTimeout.getLongValue();
+   private static boolean debugTime = OtePropertiesCore.timeDebug.getBooleanValue();
+
+   private DataWriter writer;
+   private DataReader reader;
+   private DataSample myDataSample;
+
+   private final MemoryResource mem;
+   private final String typeName;
+   private final String name;
+   private final CopyOnWriteNoIteratorList<Message> messages = new CopyOnWriteNoIteratorList<>(Message.class);
+   private final CopyOnWriteNoIteratorList<IMessageSendListener> messageSendListeners = new CopyOnWriteNoIteratorList<>(IMessageSendListener.class);
+   private final int defaultDataByteSize;
+   private final DataType memType;
+   private final boolean isEnabled = true;
+   private long activityCount = 0;
+   private long sentCount;
+   private int currentLength;
+   private boolean isScheduled = false;
+   private long time = -1;
+
+   public MessageData(String typeName, String name, int dataByteSize, int offset, DataType memType) {
+      mem = new MemoryResource(new byte[dataByteSize], offset, dataByteSize - offset);
+      myDataSample = new DataSample(this);
+      this.typeName = typeName;
+      this.name = name;
+      this.defaultDataByteSize = dataByteSize;
+      this.currentLength = dataByteSize;
+      this.memType = memType;
+   }
+
+   public MessageData(String typeName, String name, MemoryResource mem, DataType memType) {
+      this.mem = mem;
+      myDataSample = new DataSample(this);
+      this.typeName = typeName;
+      this.name = name;
+      this.defaultDataByteSize = mem.getLength();
+      this.currentLength = mem.getLength();
+      this.memType = memType;
+      GCHelper.getGCHelper().addRefWatch(this);
+   }
+
+   public MessageData(String name, int dataByteSize, int offset, DataType memType) {
+      this(name, name, dataByteSize, offset, memType);
+   }
+
+   public MessageData(byte[] data, int dataByteSize, int offset) {
+      this.mem = new MemoryResource(data, offset, dataByteSize - offset);
+      this.typeName = "";
+      this.name = "";
+      this.defaultDataByteSize = dataByteSize;
+      this.currentLength = dataByteSize;
+      this.memType = null;
+      GCHelper.getGCHelper().addRefWatch(this);
+   }
+
+   public MessageData(MemoryResource memoryResource) {
+      this("", memoryResource);
+   }
+
+   public MessageData(String name, MemoryResource memoryResource) {
+      this.mem = memoryResource;
+      this.typeName = "";
+      this.name = name;
+      this.defaultDataByteSize = memoryResource.getLength();
+      this.currentLength = memoryResource.getLength();
+      this.memType = null;
+      GCHelper.getGCHelper().addRefWatch(this);
+   }
+
+   public abstract IMessageHeader getMsgHeader();
+
+   public DataType getType() {
+      return memType;
+   }
+
+   /**
+    * Returns the number of byte words in the payload of this message.
+    * 
+    * @return the number of bytes in the message payload
+    */
+   public int getPayloadSize() {
+      return currentLength;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * adds a {@link Message} who are mapped to this data object
+    */
+   public void addMessage(Message message) {
+      if (!messages.contains(message)) {
+         messages.add(message);
+         message.addPreMessageDisposeListener(disposeListener);
+      }
+   }
+
+   /**
+    * returns a list of the message that this data is a source for. <BR>
+    * 
+    * @return a collection of messages
+    */
+   public Collection<Message> getMessages() {
+      return messages.fillCollection(new ArrayList<Message>());
+      //      return new ArrayList<Message>(messages);
+   }
+
+   /**
+    * @return Returns the activityCount.
+    */
+   public long getActivityCount() {
+      return activityCount;
+   }
+
+   /**
+    * @param activityCount The activityCount to set.
+    */
+   public void setActivityCount(long activityCount) {
+      this.activityCount = activityCount;
+   }
+
+   public void incrementActivityCount() {
+      activityCount++;
+   }
+
+   public void incrementSentCount() {
+      sentCount++;
+   }
+
+   public long getSentCount() {
+      return sentCount;
+   }
+
+   public boolean isEnabled() {
+      return isEnabled;
+   }
+
+   public abstract void visit(IMessageDataVisitor visitor);
+
+   public void dispose() {
+
+      try{
+         Message[] msgs = messages.get();
+         for (int i = 0; i < msgs.length; i++){
+            Message local = msgs[i];
+            if(local != null){
+               local.removePreMessageDisposeListener(disposeListener);
+            }
+         }
+      } catch (Throwable th){
+         OseeLog.log(getClass(), Level.SEVERE, "failed to remove message dispose listener.", th);
+      }
+      messages.clear();
+      if (writer != null) {
+         writer.getPublisher().deleteDataWriter(writer);
+         writer.dispose(this, null);
+         writer = null;
+      } else if (reader != null && reader.getSubscriber() != null) {
+         reader.getSubscriber().deleteDataReader(reader);
+         reader.dispose();
+         reader = null;
+      }
+      disposeListener = null;
+   }
+
+   public void copyData(int destOffset, byte[] data, int srcOffset, int length) {
+      setCurrentLength(length + destOffset);
+      mem.copyData(destOffset, data, srcOffset, length);
+   }
+
+   public void copyData(int destOffset, ByteBuffer data, int length) throws MessageSystemException {
+      try {
+         setCurrentLength(destOffset + length);
+         mem.copyData(destOffset, data, length);
+      } catch (MessageSystemException ex) {
+         OseeLog.logf(MessageSystemTestEnvironment.class, Level.INFO, ex,
+               "increasing backing store for %s to %d. prev length: %d, recv cnt: %d", getName(), destOffset + length,
+               mem.getData().length, this.activityCount);
+         setNewBackingBuffer(data, destOffset, length);
+      }
+   }
+
+   public void copyData(ByteBuffer data) {
+      copyData(0, data, data.remaining());
+   }
+
+   /**
+    * Notifies all {@link Message}s that have this registered as a data source of the update
+    */
+   public void notifyListeners() throws MessageSystemException {
+      final DataType memType = getType();
+      Message[] ref = messages.get();
+      for (int i = 0; i < ref.length; i++) {
+         Message message = ref[i];
+         try {
+            if (!message.isDestroyed()) {
+               message.notifyListeners(this, memType);
+            }
+         } catch (Throwable t) {
+            final String msg =
+                  String.format("Problem during listener notification for message %s. Data=%s, MemType=%s",
+                        message.getName(), this.getName(), this.getType());
+            OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, msg, t);
+         }
+      }
+   }
+
+   /**
+    * @return the currentLength
+    */
+   public int getCurrentLength() {
+      return currentLength;
+   }
+
+   /**
+    * @param currentLength the currentLength to set
+    */
+   public void setCurrentLength(int currentLength) {
+      this.currentLength = currentLength;
+   }
+
+   /**
+    * Override this method if you need to set some default data in the backing buffer.
+    */
+   public void setNewBackingBuffer(byte[] data) {
+      setCurrentLength(data.length);
+      this.mem.setData(data);
+      if (this.getMsgHeader() != null) {
+         initializeDefaultHeaderValues();
+      } else {
+         // System.out.println("what??-- bad HeaderData");
+      }
+
+   }
+
+   public void setNewBackingBuffer(ByteBuffer buffer) {
+      byte[] data = new byte[buffer.remaining()];
+      buffer.get(data);
+      this.mem.setData(data);
+      setCurrentLength(data.length);
+      if (this.getMsgHeader() != null) {
+         initializeDefaultHeaderValues();
+      } else {
+         // System.out.println("what??-- bad HeaderData");
+      }
+   }
+
+   public void setNewBackingBuffer(ByteBuffer buffer, int offset, int length) {
+      byte[] data = new byte[offset + length];
+      buffer.get(data, offset, length);
+      this.mem.setData(data);
+      setCurrentLength(data.length);
+      if (this.getMsgHeader() != null) {
+         initializeDefaultHeaderValues();
+      } else {
+         // System.out.println("what??-- bad HeaderData");
+      }
+
+   }
+
+   public abstract void initializeDefaultHeaderValues();
+
+   /**
+    * @return the mem
+    */
+   public MemoryResource getMem() {
+      return mem;
+   }
+
+   public int getDefaultDataByteSize() {
+      return defaultDataByteSize;
+   }
+
+   @Override
+   public synchronized void onDataAvailable(DataReader theReader) {
+      // System.out.println(String.format("data available %s %s", this.getName(),
+      // this.getNamespace()));
+      if (isEnabled()) {
+         ReturnCode val = theReader.takeNextSample(myDataSample);
+         if (val == ReturnCode.OK) {
+            incrementActivityCount();
+            notifyListeners();
+         } else {
+            Env.getInstance().severe(val.getDescription());
+         }
+      }
+   }
+
+   @Override
+   public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+   }
+
+   @Override
+   public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+   }
+
+   @Override
+   public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+   }
+
+   @Override
+   public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+   }
+
+   @Override
+   public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+   }
+
+   @Override
+   public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+   }
+
+   @Override
+   public synchronized void onDataSentToMiddleware(DataWriter theWriter) {
+      // header.setSequenceNumber(header.getSequenceNumber() + 1);
+      notifyListeners();
+   }
+
+   @Override
+   public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status) {
+   }
+
+   @Override
+   public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status) {
+   }
+
+   @Override
+   public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status) {
+   }
+
+   @Override
+   public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status) {
+   }
+
+   @Override
+   public Object getKeyValue() {
+      return null;
+   }
+
+   @Override
+   public void setFromByteArray(byte[] input) {
+      try {
+         copyData(0, input, 0, input.length);
+      } catch (MessageSystemException ex) {
+         OseeLog.logf(MessageSystemTestEnvironment.class, Level.WARNING,
+
+               "Copy Failed: setting new backing buffer.  msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+               this.mem.getData().length, input.length);
+         setNewBackingBuffer(input);
+      }
+   }
+
+   @Override
+   public void setFromByteBuffer(ByteBuffer buffer) {
+      try {
+         copyData(buffer);
+      } catch (Exception e) {
+         OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+               "Copy Failed: setting new backing buffer.  msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+               this.mem.getData().length, buffer.limit());
+         setNewBackingBuffer(buffer);
+      }
+   }
+
+   @Override
+   public ByteBuffer toByteBuffer() {
+      return mem.getAsBuffer();
+   }
+
+   public void setFromByteArray(byte[] input, int length) {
+      try {
+         copyData(0, input, 0, length);
+      } catch (MessageSystemException ex) {
+         OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+               "Copy Failed: setting new backing buffer.  msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+               this.mem.getData().length, length);
+         setNewBackingBuffer(input);
+      }
+   }
+
+   public void setFromByteArray(int destOffset, byte[] input, int srcOffset, int length) {
+      try {
+         copyData(destOffset, input, srcOffset, length);
+      } catch (MessageSystemException ex) {
+         OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+               "Copy Failed: setting new backing buffer.  msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+               this.mem.getData().length, length);
+         setNewBackingBuffer(input);
+      }
+   }
+
+   public void setFromByteArray(ByteBuffer input, int length) {
+      try {
+         copyData(0, input, length);
+      } catch (MessageSystemException ex) {
+         OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+               "Copy Failed: setting new backing buffer.  msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+               this.mem.getData().length, length);
+         setNewBackingBuffer(input);
+      }
+   }
+
+   @Override
+   public byte[] toByteArray() {
+      return mem.getData();
+   }
+
+   public void setReader(DataReader reader) {
+      this.reader = reader;
+   }
+
+   public void setWriter(DataWriter writer) {
+      this.writer = writer;
+   }
+
+   public void send() throws MessageSystemException {
+      if (writer == null) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, getName() + " - the writer is null");
+      } else if (shouldSendData()) {
+         try {
+            notifyPreSendListeners();
+            long start = 0, elapsed;
+            if(debugTime){
+               start = System.nanoTime();
+            }
+            getMem().setDataHasChanged(false);
+            writer.write(null, null, this, null);
+            incrementSentCount();
+            if(debugTime){
+               elapsed = System.nanoTime() - start;
+               if(elapsed > debugTimeout){
+                  Locale.setDefault(Locale.US);
+                  System.out.printf("%s SLOW IOSEND %,d\n", getName(), elapsed);
+               }
+            }
+            notifyPostSendListeners();
+         } catch (Throwable ex) {
+            throw new MessageSystemException("Could not send message data " + getName(), Level.SEVERE, ex);
+         }
+      }
+   }
+
+   protected void sendTo(IDestination destination, ISource source) throws MessageSystemException {
+      if (writer == null) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.WARNING, getName() + " - the writer is null");
+      } else if (shouldSendData()) {
+         try {
+            notifyPreSendListeners();
+            // this.initializeDefaultHeaderValues();
+            getMem().setDataHasChanged(false);
+            writer.write(destination, source, this, null);
+            incrementSentCount();
+            notifyPostSendListeners();
+         } catch (Throwable ex) {
+            throw new MessageSystemException("Could not send message data " + getName(), Level.SEVERE, ex);
+         }
+      }
+   }
+
+   /**
+    * Override this method if you want to specialize the send criteria in a data source. For example, if you only want
+    * to send data to the MUX driver if the data has changed.
+    */
+   protected boolean shouldSendData() {
+      return true;
+   }
+
+   public TypeSupport getTypeSupport() {
+      return new DDSTypeSupport(this, getName(), getName(), getPayloadSize());
+   }
+
+   public String getTopicName() {
+      return getName();
+   }
+
+   public String getTypeName() {
+      return typeName;
+   }
+
+   @Override
+   public boolean isSameInstance(byte[] data1, byte[] data2) {
+      return true;
+   }
+
+   public Namespace getNamespace() {
+      if (isWriter()) {
+         return new Namespace(writer.getTopic().getNamespace());
+      } else {
+         return new Namespace(reader.getTopicDescription().getNamespace());
+      }
+   }
+
+   /*
+    * each type that extends DDSData needs to have it's own namespace.... we need to go through each DDSData child and
+    * determine all of it's possible namespaces
+    */
+   public boolean isWriter() {
+      if (writer != null && reader == null) {
+         return true;
+      } else if (writer == null && reader != null) {
+         return false;
+      } else {
+         throw new MessageSystemException(
+               "This is an illegal message it has neither a reader or a writer [" + this.getName() + "].", Level.SEVERE);
+      }
+   }
+
+   private IMessageDisposeListener disposeListener = new IMessageDisposeListener() {
+
+      @Override
+      public void onPreDispose(Message message) {
+         messages.remove(message);
+      }
+
+      @Override
+      public void onPostDispose(Message message) {
+      }
+
+   };
+
+   @Override
+   public void copyFrom(Data data) {
+      ByteBuffer buffer = data.toByteBuffer();
+      copyData(data.getOffset(), buffer, buffer.remaining());
+   }
+
+   @Override
+   public String toString() {
+      return getClass().getName() + ": name=" + getName();
+   }
+
+   @Override
+   public int getOffset() {
+      return 0;
+   }
+
+   /**
+    * @return the isScheduled
+    */
+   public boolean isScheduled() {
+      return isScheduled;
+   }
+
+   /**
+    * @param isScheduled the isScheduled to set
+    */
+   public void setScheduled(boolean isScheduled) {
+      this.isScheduled = isScheduled;
+   }
+
+   private void notifyPostSendListeners() {
+      try {
+         long start = 0, elapsed;
+         IMessageSendListener[] listeners = messageSendListeners.get();
+         for (int i = 0; i < listeners.length; i++) {
+            IMessageSendListener listener = listeners[i];
+            if(debugTime){
+               start = System.nanoTime();
+            }
+            listener.onPostSend(this);
+            if(debugTime){
+               elapsed = System.nanoTime() - start;
+               if(elapsed > debugTimeout){
+                  Locale.setDefault(Locale.US);
+                  System.out.printf("%s %s SLOW POST SEND %,d\n", getName(), listener.getClass().getName(), elapsed);
+               }
+            }
+         }
+      } catch (Exception ex) {
+         OseeLog.log(Message.class, Level.SEVERE, ex);
+      }
+   }
+
+   private void notifyPreSendListeners() {
+      try {
+         long start = 0, elapsed;
+         IMessageSendListener[] listeners = messageSendListeners.get();
+         for (int i = 0; i < listeners.length; i++) {
+            IMessageSendListener listener = listeners[i];
+            if(debugTime){
+               start = System.nanoTime();
+            }
+            listener.onPreSend(this);
+            if(debugTime){
+               elapsed = System.nanoTime() - start;
+               if(elapsed > debugTimeout){
+                  Locale.setDefault(Locale.US);
+                  System.out.printf("%s %s SLOW PRE SEND %,d\n", getName(), listener.getClass().getName(), elapsed);
+               }
+            }
+         }
+      } catch (Exception ex) {
+         OseeLog.log(Message.class, Level.SEVERE, ex);
+      }
+   }
+
+   public void addSendListener(IMessageSendListener listener) {
+      messageSendListeners.add(listener);
+   }
+
+   public void removeSendListener(IMessageSendListener listener) {
+      messageSendListeners.remove(listener);
+   }
+
+   public boolean containsSendListener(IMessageSendListener listener) {
+      return messageSendListeners.contains(listener);
+   }
+
+   public boolean isMessageCollectionNotEmpty() {
+      return messages.get().length > 0;
+   }
+
+   public void zeroize() {
+      final byte[] data = toByteArray();
+      Arrays.fill(data, getMsgHeader().getHeaderSize(), data.length, (byte) 0);
+   }
+
+   /**
+    * A time value associated with this message.
+    * The time value will have different meanings or may not be used depending on the context and usage.
+    */
+   public long getTime() {
+      return time;
+   }
+
+   public void setTime(long time) {
+      this.time = time;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/ArrayElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/ArrayElement.java
new file mode 100644
index 0000000..04d0552
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/ArrayElement.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public class ArrayElement extends Element {
+
+   public ArrayElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+   }
+
+   public ArrayElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(msg, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public ArrayElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      return null;
+   }
+
+   public void setValue(int index, byte value) {
+      getMsgData().getMem().getData()[index + getMsgData().getMem().getOffset() + getArrayStartOffset()] = value;
+   }
+
+   public ByteBuffer asByteBuffer() {
+      return ByteBuffer.wrap(getMsgData().getMem().getData(),
+         getMsgData().getMem().getOffset() + getArrayStartOffset(), getLength());
+   }
+
+   public byte getValue(int index) {
+      return getValue(getMsgData().getMem(), index);
+   }
+
+   public byte getValue(MemoryResource mem, int index) {
+      return mem.getData()[index + mem.getOffset() + getArrayStartOffset()];
+
+   }
+
+   @Override
+   public void zeroize() {
+      MemoryResource mem = getMsgData().getMem();
+      mem.zeroizeFromOffset(getArrayStartOffset(), getLength());
+   }
+
+   public int getLength() {
+      int currentMsgLength = getMsgData().getCurrentLength() - getMsgData().getOffset() - getArrayStartOffset();
+      int length = getArrayEndOffset() - getArrayStartOffset();
+      length = currentMsgLength < length ? currentMsgLength : length;
+      return length;
+   }
+
+   public int getArrayStartOffset() {
+      return byteOffset + msb / 8;
+   }
+
+   public int getArrayEndOffset() {
+      return (lsb - msb + 1) / 8 + byteOffset;
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asArrayElement(this);
+   }
+
+   @Override
+   public ArrayElement findElementInMessages(Collection<? extends Message> messages) {
+      return (ArrayElement) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   public ArrayElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (ArrayElement) super.switchMessages(messages);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BiSci16Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BiSci16Element.java
new file mode 100644
index 0000000..cc40d74
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BiSci16Element.java
@@ -0,0 +1,224 @@
+/*
+ * Created on Apr 30, 2015
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingLongIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * MIL-STD-1760E standard 16 bit Binary Scientific Notation Integer format.
+ * <dl>
+ * <dt>Base<dd>2's compliment integer located in the first 12 most significant bits
+ * <dt>Exponent<dd>unsigned int located in the last 4 (least significant) bits
+ * <dt>Conversion<dd>LogicalValue = (Base) * 16<sup>Exponent</sup> 
+ * </dl>
+ *            
+ * @author Michael P. Masterson
+ */
+public class BiSci16Element extends LongIntegerElement {
+
+   public BiSci16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public BiSci16Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public BiSci16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public void setValue(Long value) {
+      super.setValue(convertLogicalValueToBiSci(value));
+   }
+   
+   @Override
+   public Long getValue() {
+      return convertBiSciToLogicalValue(super.getValue());
+   }
+   
+   @Override
+   public Long valueOf(MemoryResource mem) {
+      return convertBiSciToLogicalValue(super.valueOf(mem));
+   }
+   
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean check(ITestAccessor accessor, long value, int milliseconds) throws InterruptedException {
+      return super.check(accessor, (CheckGroup) null, value, milliseconds);
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   @Override
+   public void checkPulse(ITestAccessor accessor, long value) throws InterruptedException {
+      long nonPulsedValue = 0;
+      if (value == 0) {
+         nonPulsedValue = 1;
+      }
+
+      checkPulse(accessor, value, nonPulsedValue);
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void set(ITestEnvironmentAccessor accessor, long value) {
+      super.set(accessor, value);
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it..
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, long value) {
+      this.set(accessor, value);
+      super.sendMessage();
+   }
+   
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      this.set(accessor, Long.parseLong(value));
+   }
+
+   @Override
+   protected NonMappingLongIntegerElement getNonMappingElement() {
+      return new NonMappingLongIntegerElement(this);
+   }
+
+   @Override
+   public Long elementMask(Long value) {
+      return value;
+   }
+
+   @Override
+   public long getNumericBitValue() {
+      return getRaw();
+   }
+   
+   /**
+    * @return the raw bits of this element without conversion from the binary scientific notation format.
+    */
+   public long getRaw() {
+      return getRaw(getMsgData().getMem());
+   }
+
+   /**
+    * @param mem
+    * @return the raw bits of this element without conversion from the binary scientific notation format.
+    */
+   public long getRaw(MemoryResource mem) {
+      return mem.getLong(byteOffset, msb, lsb);
+   }
+   
+   
+   /**
+    * Sets the raw long straight into memory without conversion
+    * @param hex
+    */
+   public void setHex(long hex) {
+      getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+   }
+   
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   @Override
+   public void checkForwarding(ITestAccessor accessor, LongIntegerElement cause, long value) throws InterruptedException {
+      /* check for 0 to begine */
+      check(accessor, 0, 0);
+
+      /* Set the DP1 Mux Signal */
+      cause.set(accessor, value);
+
+      /* Chk Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, 0);
+
+      /* Init DP2 Mux to 0 */
+      set(accessor, 0);
+
+      /* Chk Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+      check(accessor, 0, 500);
+
+   }
+   
+   
+   /*package*/ Long convertLogicalValueToBiSci(long logical) {
+      long biSci = 0;
+      boolean isNeg = false;
+      if( logical < 0 ) {
+         isNeg = true;
+         logical = -logical;
+      }
+      
+      long base =  Math.abs(logical);
+      int powersOf16 = 0;
+      boolean round = false;
+      while( base > 0x0800) {
+         powersOf16++;
+         if( round ) 
+            base--;
+         
+         round = base % 16 > 7;
+         base = base >>> 4;
+         
+         if( round)
+            base++;
+      }
+      
+      if( isNeg ) {
+         base = 0x1000 - base;
+      }
+      
+      final long shiftedBase = base << 4;
+      biSci = shiftedBase + powersOf16;
+      
+      return biSci & 0xFFFF;
+   }
+   
+   /*package*/ Long convertBiSciToLogicalValue(long biSci) {
+      long logical = 0;
+      long base = ((short)biSci) >> 4; // cast to short to ensure sign extension to long
+      long powersOf16 = biSci & 0xF;
+      
+      long shift = powersOf16 * 4;
+      logical = base << shift;
+      
+      return logical;
+   }
+   
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BooleanElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BooleanElement.java
new file mode 100644
index 0000000..3b75e9a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BooleanElement.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public class BooleanElement extends DiscreteElement<Boolean> {
+
+   public BooleanElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+
+   }
+
+   public BooleanElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(msg, elementName, messageData, bitOffset, bitLength);
+
+   }
+
+   public BooleanElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb);
+
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      return null;
+   }
+
+   @Override
+   public Boolean getValue() {
+      return Boolean.valueOf(getMsgData().getMem().getBoolean(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public void setValue(Boolean obj) {
+      getMsgData().getMem().setBoolean(obj, byteOffset, msb, lsb);
+   }
+
+   @Override
+   public String toString(Boolean obj) {
+      return obj.toString();
+   }
+
+   @Override
+   public Boolean valueOf(MemoryResource mem) {
+      return Boolean.valueOf(mem.getBoolean(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      set(accessor, Boolean.parseBoolean(value));
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asBooleanElement(this);
+   }
+
+   @Override
+   public Boolean elementMask(Boolean value) {
+      return value;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/CharElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/CharElement.java
new file mode 100644
index 0000000..8f411bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/CharElement.java
@@ -0,0 +1,611 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.ListIterator;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingCharElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.listener.MessageSystemListener;
+
+/**
+ * @author John Butler
+ * @author Robert A. Fisher
+ */
+public class CharElement extends DiscreteElement<Character> {
+
+	public CharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+		this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+	}
+
+	public CharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+		super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+	}
+
+	public CharElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+		super(message, elementName, messageData, bitOffset, bitLength);
+	}
+
+	@SuppressWarnings("rawtypes")
+   @Override
+	public CharElement findElementInMessages(Collection<? extends Message> messages) {
+	   return (CharElement) super.findElementInMessages(messages);
+	}
+	
+	@Override
+	public CharElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+		return (CharElement) super.switchMessages(messages);
+	}
+
+	/**
+	 * Checks that this element correctly forwards a message sent from cause with the value passed.
+	 * 
+	 * @param cause The originator of the signal
+	 * @param value The value sent by cause and being forwarded by this element
+	 */
+	public void checkForwarding(ITestAccessor accessor, CharElement cause, Character value) throws InterruptedException {
+		/* check for 0 to begine */
+		check(accessor, (char) 0, 0);
+
+		/* Set the DP1 Mux Signal */
+		cause.set(accessor, value);
+
+		/* Chk Value on DP2 */
+		check(accessor, value, 1000);
+
+		/* Set DP1 to 0 */
+		cause.set(accessor, (char) 0);
+
+		/* Init DP2 Mux to 0 */
+		set(accessor, (char) 0);
+
+		/* Chk Value on DP2 is still set */
+		check(accessor, value, 500);
+
+		/* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+		check(accessor, (char) 0, 500);
+
+	}
+
+	/**
+	 * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+	 * 
+	 * @param value Expected value.
+	 * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+	 * @return If the check passed.
+	 */
+	public boolean checkNot(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+		return this.checkNot(accessor, (CheckGroup) null, value, milliseconds);
+	}
+
+	/**
+	 * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+	 * 
+	 * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+	 * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+	 * logging a point.
+	 * <p>
+	 * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+	 * will log the test point.
+	 * @param value Expected value.
+	 * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+	 * @return If the check passed.
+	 */
+	public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+		if (accessor == null) {
+			throw new IllegalArgumentException("accessor cannot be null");
+		}
+		accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+				new MethodFormatter().add(value).add(milliseconds), getMessage());
+
+		long time = accessor.getEnvTime();
+		String currentValue;
+		boolean result;
+		if (milliseconds > 0) {
+			final MessageSystemListener listener = getMessage().getListener();
+			org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+					accessor.setTimerFor(listener, milliseconds);
+
+			accessor.getLogger().debug(accessor, "waiting............", true);
+
+			while (result = !(currentValue = getString(accessor, value.length())).equals(value)) {
+				listener.waitForData(); // will also return if the timer (set above)
+				// expires
+				/*
+				 * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+				 * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+				 * forced to save the fact that we timed out.
+				 */
+				if (listener.isTimedOut()) {
+					break;
+				}
+			}
+			cancelTimer.cancelTimer();
+			accessor.getLogger().debug(accessor, "done waiting", true);
+		} else {
+			result = !(currentValue = getString(accessor, value.length())).equals(value);
+		}
+		time = accessor.getEnvTime() - time;
+		CheckPoint passFail = new CheckPoint(this.getFullName(), "Not " + value, currentValue, result, time);
+
+		if (checkGroup == null) {
+			accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+		} else {
+			checkGroup.add(passFail);
+		}
+
+		if (accessor != null) {
+			accessor.getLogger().methodEnded(accessor);
+		}
+		return passFail.isPass();
+	}
+
+	/**
+	 * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+	 * 
+	 * @param value Expected value.
+	 * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+	 * @return If the check passed.
+	 */
+	public boolean check(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+		return this.check(accessor, (CheckGroup) null, value, milliseconds);
+	}
+
+	/**
+	 * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+	 * 
+	 * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+	 * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+	 * logging a point.
+	 * <p>
+	 * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+	 * will log the test point.
+	 * @param value Expected value.
+	 * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+	 * @return If the check passed.
+	 */
+	public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+		if (accessor == null) {
+			throw new IllegalArgumentException("accessor cannot be null");
+		}
+		accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+				new MethodFormatter().add(value).add(milliseconds), this.getMessage());
+		long time = accessor.getEnvTime();
+		String currentValue;
+		if (milliseconds > 0) {
+			MessageSystemListener listener = getMessage().getListener();
+			org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+					accessor.setTimerFor(listener, milliseconds);
+
+			accessor.getLogger().debug(accessor, "waiting............", true);
+
+			while (!compareString(currentValue = getString(accessor, value.length()), value)) {
+				listener.waitForData(); // will also return if the timer (set above)
+				// expires
+				/*
+				 * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+				 * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+				 * forced to save the fact that we timed out.
+				 */
+				if (listener.isTimedOut()) {
+					break;
+				}
+			}
+
+			cancelTimer.cancelTimer();
+			accessor.getLogger().debug(accessor, "done waiting", true);
+		} else {
+			currentValue = getString(accessor, value.length());
+		}
+		time = accessor.getEnvTime() - time;
+		CheckPoint passFail =
+				new CheckPoint(this.getFullName(), value, currentValue, compareString(currentValue, value), time);
+
+		if (checkGroup == null) {
+			accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+		} else {
+			checkGroup.add(passFail);
+		}
+
+		if (accessor != null) {
+			accessor.getLogger().methodEnded(accessor);
+		}
+		return passFail.isPass();
+	}
+
+	private boolean compareString(String string, String value) {
+		return string.equals(value);
+	}
+
+	/**
+	 * Verifies that the string starting at the element is not set to "value".
+	 * 
+	 * @param value Expected value
+	 * @return if the check passed
+	 */
+	public boolean checkNot(ITestAccessor accessor, String value) {
+		return this.checkNot(accessor, (CheckGroup) null, value);
+	}
+
+	/**
+	 * Verifies that the string starting at the element is not set to "value".
+	 * 
+	 * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+	 * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+	 * logging a point.
+	 * <p>
+	 * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+	 * will log the test point.
+	 * @param value Expected value
+	 * @return if the check passed
+	 */
+	public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+		if (accessor != null) {
+			accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+					this.getMessage());
+		}
+
+		String actualValue = getString(accessor, value.length());
+
+		CheckPoint passFail =
+				new CheckPoint(this.getFullName(), "Not " + value, actualValue, value.compareTo(actualValue) != 0, 0);
+
+		if (checkGroup == null) {
+			accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+		} else {
+			checkGroup.add(passFail);
+		}
+
+		if (accessor != null) {
+			accessor.getLogger().methodEnded(accessor);
+		}
+		return passFail.isPass();
+
+	}
+
+	/**
+	 * Verifies that the string starting at the element is set to "value".
+	 * 
+	 * @param value Expected value
+	 * @return if the check passed
+	 */
+	public boolean check(ITestAccessor accessor, String value) {
+		return this.check(accessor, (CheckGroup) null, value);
+	}
+
+	/**
+	 * Verifies that the string starting at the element is set to "value".
+	 * 
+	 * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+	 * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+	 * logging a point.
+	 * <p>
+	 * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+	 * will log the test point.
+	 * @param value Expected value
+	 * @return if the check passed
+	 */
+	public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+		if (accessor != null) {
+			accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+					this.getMessage());
+		}
+		String actualValue = getString(accessor, value.length());
+
+		CheckPoint passFail =
+				new CheckPoint(this.getFullName(), value, actualValue, value.compareTo(actualValue) == 0, 0);
+
+		if (checkGroup == null) {
+			if (accessor != null) {
+				accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+			}
+		} else {
+			checkGroup.add(passFail);
+		}
+
+		if (accessor != null) {
+			accessor.getLogger().methodEnded(accessor);
+		}
+		return passFail.isPass();
+	}
+
+	/**
+	 * Returns the string of length "stringLength" starting as the position of the element.
+	 * 
+	 * @param stringLength the length of the string to return
+	 * @return the string starting with this element
+	 */
+	public String getString(ITestEnvironmentAccessor accessor, int stringLength) {
+		if (getBitLength() == 8) {
+			return getASCIIString(stringLength);
+		} else {
+			ListIterator<Element> iter = getMessage().getElementIterator(this);
+			char[] chars = new char[stringLength];
+			for (int i = 0; i < stringLength; i++) {
+				Element element = iter.next();
+				if (element instanceof CharElement) {
+					chars[i] = ((CharElement) element).getValue();					
+				} else {
+					// we ran into a non char element we should abort string extraction
+					break;
+				}
+			}
+			return new String(chars);
+		}
+	}
+
+	/**
+	 * <p>
+	 * Sets the element's value. Can be [ab]used to set subsequent, contiguous bytes but, while widespread, this use is
+	 * discouraged and may be removed in a future release. The behavior of this method differs depending on the length of
+	 * string passed in and whether the underlying element is eight bits.
+	 * </p>
+	 * <p>
+	 * For an empty string it sets the element to the null character, '\0', using {@link #setValue(Character)}, which
+	 * properly accounts for cases where the element is not eight bits.
+	 * </p>
+	 * <p>
+	 * If the string has a length of one it calls {@link #setValue(Character)} with value.charAt(0).
+	 * </p>
+	 * <p>
+	 * If the string length is greater than one it will assume this and all subsequent elements are eight bits and set
+	 * them. <b>Note</b> that it does nothing to ensure the subsequent bytes are character elements or eight bits. It
+	 * will throw IllegalArgumentException if setting subsequent elements would overflow. If the element is not eight
+	 * bits in size it will set as above and log a warning and stack trace but not throw an exception.
+	 * </p>
+	 * 
+	 * @param accessor
+	 * @param value the string to set the bytes to
+	 */
+	@Override
+	public void parseAndSet(ITestEnvironmentAccessor accessor, String value) {
+		if (value.length() + this.getByteOffset() > this.getMessage().getData().length) {
+			throw new IllegalArgumentException("Setting a String whose length exceeds the Message bounds!");
+		}
+
+		if (accessor != null) {
+			accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+					this.getMessage());
+		}
+
+		switch (value.length()) {
+			case 0:
+				setValue('\0');
+				break;
+			case 1:
+				setValue(value.charAt(0));
+				break;
+			default:
+				setASCIIString(value);
+				break;
+		}
+
+		if (accessor != null) {
+			accessor.getLogger().methodEnded(accessor);
+		}
+	}
+
+	/**
+	 * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+	 * limitations.
+	 * 
+	 * @param accessor
+	 * @param value
+	 */
+	public void set(ITestEnvironmentAccessor accessor, String value) {
+		parseAndSet(accessor, value);
+	}
+
+	/**
+	 * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+	 * limitations.
+	 * 
+	 * @param value
+	 */
+	public void setValue(String value) {
+		parseAndSet(null, value);
+	}
+
+	/**
+	 * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+	 * limitations. After setting it sends the message.
+	 * 
+	 * @param accessor
+	 * @param value
+	 */
+	public void setAndSend(ITestEnvironmentAccessor accessor, String value) {
+		this.parseAndSet(accessor, value);
+		super.sendMessage();
+	}
+
+	/**
+	 * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+	 * limitations.
+	 * 
+	 * @param accessor
+	 * @param value
+	 */
+	public void setNoLog(ITestEnvironmentAccessor accessor, String value) {
+		this.parseAndSet(accessor, value);
+	}
+
+	/**
+	 * Sets the element to the "value" passed and immediately sends the meessage that contains it..
+	 * 
+	 * @param value The value to set.
+	 */
+	public void setAndSend(ITestEnvironmentAccessor accessor, Character value) {
+		this.set(accessor, value);
+		super.sendMessage();
+	}
+
+	/**
+	 * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+	 * 
+	 * @param value The expected value to wait for.
+	 * @param milliseconds Number of milliseconds to wait before failing.
+	 * @return last value found. Either value expected or value found at timeout.
+	 */
+	protected String waitForValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+		if (accessor != null) {
+			accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+					new MethodFormatter().add(value).add(milliseconds), this.getMessage());
+		}
+		String currentValue;
+		if (milliseconds > 0) {
+			MessageSystemListener listener = getMessage().getListener();
+			org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+					accessor.setTimerFor(listener, milliseconds);
+
+			accessor.getLogger().debug(accessor, "waiting............", true);
+
+			while ((currentValue = getString(accessor, value.length())).equals(value)) {
+				listener.waitForData(); // will also return if the timer (set above)
+				// expires
+				/*
+				 * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+				 * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+				 * forced to save the fact that we timed out.
+				 */
+				if (listener.isTimedOut()) {
+					break;
+				}
+			}
+			cancelTimer.cancelTimer();
+			accessor.getLogger().debug(accessor, "done waiting", true);
+		} else {
+			currentValue = getString(accessor, value.length());
+		}
+		if (accessor != null) {
+			accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+					this.getMessage());
+		}
+		return currentValue;
+	}
+
+	/**
+	 * Waits until the element does not equal the "value" passed. Returns last value observed upon a timout.
+	 * 
+	 * @param value The expected value to wait for.
+	 * @param milliseconds Number of milliseconds to wait before failing.
+	 * @return last value found. Either value expected or value found at timeout.
+	 */
+	protected String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+		if (accessor != null) {
+			accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+					new MethodFormatter().add(value).add(milliseconds), this.getMessage());
+		}
+		String currentValue;
+		if (milliseconds > 0) {
+
+			MessageSystemListener listener = getMessage().getListener();
+			org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+					accessor.setTimerFor(listener, milliseconds);
+
+			accessor.getLogger().debug(accessor, "waiting............", true);
+
+			while (!(currentValue = getString(accessor, value.length())).equals(value)) {
+				listener.waitForData(); // will also return if the timer (set above)
+				// expires
+				/*
+				 * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+				 * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+				 * forced to save the fact that we timed out.
+				 */
+				if (listener.isTimedOut()) {
+					break;
+				}
+			}
+			cancelTimer.cancelTimer();
+			accessor.getLogger().debug(accessor, "done waiting", true);
+		} else {
+			currentValue = getString(accessor, value.length());
+		}
+		if (accessor != null) {
+			accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+					this.getMessage());
+		}
+		return currentValue;
+	}
+
+	/**
+	 * Sets the element value, properly accounting for the bit-size of the element.
+	 * 
+	 * @param value
+	 */
+	@Override
+	public void setValue(Character value) {
+		getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+	}
+
+	@Override
+	public Character getValue() {
+		return (char) getMsgData().getMem().getInt(byteOffset, msb, lsb);
+	}
+
+	@Override
+	public Character valueOf(MemoryResource otherMem) {
+		return Character.valueOf((char) otherMem.getInt(byteOffset, msb, lsb));
+	}
+
+	@Override
+	public String toString(Character obj) {
+		return obj.toString();
+	}
+
+	private String getASCIIString(int length) {
+		return getMsgData().getMem().getASCIIString(byteOffset, length);
+	}
+
+	private void setASCIIString(String value) {
+		if (getBitLength() == 8) {
+			getMsgData().getMem().setASCIIString(value, byteOffset);
+		} else {
+			ListIterator<Element> iter = getMessage().getElementIterator(this);
+			for (int i = 0; i < value.length(); i++) {
+				Element element = iter.next();
+				if (element instanceof CharElement) {
+					((CharElement) element).setValue(value.charAt(i));
+				} else {
+					// we ran into a non char element we should abort string extraction
+					return;
+				}
+			}
+		}
+	}
+
+	@Override
+	public void visit(IElementVisitor visitor) {
+		visitor.asCharElement(this);
+	}
+
+	@Override
+	protected NonMappingCharElement getNonMappingElement() {
+		return new NonMappingCharElement(this);
+	}
+
+	@Override
+	public Character elementMask(Character value) {
+		return value;
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Dec32Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Dec32Element.java
new file mode 100644
index 0000000..81f53da
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Dec32Element.java
@@ -0,0 +1,81 @@
+/*
+ * Created on Nov 6, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class Dec32Element extends Float32Element {
+
+   /**
+    * @param message
+    * @param elementName
+    * @param messageData
+    * @param byteOffset
+    * @param msb
+    * @param lsb
+    */
+   public Dec32Element(Message message, String elementName, MessageData messageData,
+         int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   /**
+    * @param message
+    * @param elementName
+    * @param messageData
+    * @param byteOffset
+    * @param msb
+    * @param lsb
+    * @param originalLsb
+    * @param originalMsb
+    */
+   public Dec32Element(Message message, String elementName, MessageData messageData,
+         int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   /**
+    * @param message
+    * @param elementName
+    * @param messageData
+    * @param bitOffset
+    * @param bitLength
+    */
+   public Dec32Element(Message message, String elementName, MessageData messageData,
+         int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   @Override
+   protected double toDouble(long value) {
+      return super.toDouble(value * 4);
+   }
+
+   @Override
+   protected long toLong(double value) {
+      return super.toLong(value * 4);
+   }
+
+   @Override
+   public void setValue(Double value) {
+      super.setValue(value * 4);
+   }
+
+   @Override
+   public Double getValue() {
+      return super.getValue() / 4;
+   }
+
+   @Override
+   public Double valueOf(MemoryResource mem) {
+      return super.valueOf(mem) / 4;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
new file mode 100644
index 0000000..4202594
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
@@ -0,0 +1,1473 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.core.testPoint.Operation;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.condition.EqualsCondition;
+import org.eclipse.osee.ote.message.condition.IDiscreteElementCondition;
+import org.eclipse.osee.ote.message.condition.InRangeCondition;
+import org.eclipse.osee.ote.message.condition.ListCondition;
+import org.eclipse.osee.ote.message.condition.NotInRangeCondition;
+import org.eclipse.osee.ote.message.condition.PulseCondition;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+public abstract class DiscreteElement<T extends Comparable<T>> extends Element implements Comparable<DiscreteElement<T>> {
+
+   private static final String FOR_2_PULSES = " FOR 2 PULSES";
+
+   public DiscreteElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+   }
+
+   public DiscreteElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public DiscreteElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(msg, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public abstract void setValue(T obj);
+
+   public abstract T getValue();
+
+   public abstract String toString(T obj);
+
+   public String valueOf() {
+      return getValue().toString();
+   }
+
+   public abstract void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException;
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param value The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, T value) {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+            getMessage());
+      }
+
+      setValue(value);
+
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+            getMessage());
+      }
+
+      T actualValue = getValue();
+      CheckPoint passFail =
+         new CheckPoint(this.getFullName(), toString(value), toString(actualValue),
+            actualValue.equals(elementMask(value)), 0);
+
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+      return passFail.isPass();
+   }
+
+   public boolean checkNT(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+         getMessage());
+      boolean v = getValue().equals(elementMask(value));
+      accessor.getLogger().methodEnded(accessor);
+      return v;
+   }
+
+   public boolean checkNotNT(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+         getMessage());
+      boolean v = !getValue().equals(elementMask(value));
+      accessor.getLogger().methodEnded(accessor);
+      return v;
+   }
+
+   public final boolean check(ITestAccessor accessor, T value) {
+      return this.check(accessor, (CheckGroup) null, value);
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public final boolean check(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      return check(accessor, (CheckGroup) null, value, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive), getMessage());
+
+      InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+
+      boolean pass = c.check();
+      CheckPoint passFail =
+         new CheckPoint(this.getFullName(), "In " + expectedRangeString(toString(minValue).toString(), minInclusive,
+            toString(maxValue), maxInclusive), toString(c.getLastCheckValue()), pass, 0);
+
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+      accessor.getLogger().methodEnded(accessor);
+      return passFail.isPass();
+   }
+
+   public boolean checkRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive), getMessage());
+      InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      boolean pass = c.check();
+      accessor.getLogger().methodEnded(accessor);
+      return pass;
+   }
+
+   public boolean checkRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive), getMessage());
+      InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, millis);
+      accessor.getLogger().methodEnded(accessor);
+      return result.isPassed();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public final boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue) {
+      return checkRange(accessor, checkGroup, minValue, true, maxValue, true);
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+            getMessage());
+      }
+
+      T actualValue = getValue();
+
+      CheckPoint passFail =
+         new CheckPoint(this.getFullName(), "Not " + toString(value), toString(actualValue),
+            !actualValue.equals(value), 0);
+
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+      return passFail.isPass();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return checkMaintainRange(accessor, null, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return checkMaintainRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive,
+         milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainNotRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return checkMaintainNotRange(accessor, null, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is not set to a value within the range specified for the entire time specified.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainNotRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return checkMaintainNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive,
+         milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return checkMaintainRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public final boolean checkNotRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return checkNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public final boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) throws InterruptedException {
+      return checkNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive, 0);
+   }
+
+   /**
+    * Waits until the element equals the "value" passed. Returns last value observed upon a time out.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value found. Either value expected or value found at timeout.
+    */
+   public T waitForValue(ITestEnvironmentAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+            new MethodFormatter().add(value).add(milliseconds), getMessage());
+      }
+      EqualsCondition<T> c = new EqualsCondition<>(this, value);
+      getMessage().waitForCondition(accessor, c, false, milliseconds);
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a time out.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForNotValue(ITestEnvironmentAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+            new MethodFormatter().add(value).add(milliseconds), getMessage());
+      }
+      EqualsCondition<T> c = new EqualsCondition<>(this, true, value);
+      getMessage().waitForCondition(accessor, c, false, milliseconds);
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForRange(ITestEnvironmentAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+            new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+            getMessage());
+      }
+      InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      getMessage().waitForCondition(accessor, c, false, milliseconds);
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T waitForRange(ITestEnvironmentAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return waitForRange(accessor, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForNotRange(ITestEnvironmentAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+            new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+            getMessage());
+      }
+
+      NotInRangeCondition<T> c = new NotInRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      getMessage().waitForCondition(accessor, c, false, milliseconds);
+
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Assumes range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T waitForNotRange(ITestEnvironmentAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return waitForRange(accessor, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T waitNotValue(ITestEnvironmentAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      return waitForNotValue(accessor, value, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(value).add(milliseconds), getMessage());
+
+      EqualsCondition<T> c = new EqualsCondition<>(this, value);
+
+      CheckPoint cp = waitWithCheckPoint(accessor, checkGroup, toString(value), c, false, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return cp.isPass();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be in the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+         getMessage());
+
+      InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      CheckPoint cp =
+         waitWithCheckPoint(accessor, checkGroup,
+            "In " + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive), c, false,
+            milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return cp.isPass();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minimum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public final boolean checkRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return checkRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public final boolean checkRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+      return checkRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public final boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return checkRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public final boolean checkRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return this.checkRange(accessor, (CheckGroup) null, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public final boolean checkRange(ITestAccessor accessor, T minValue, T maxValue) {
+      return checkRange(accessor, (CheckGroup) null, minValue, true, maxValue, true);
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(value).add(milliseconds), getMessage());
+      CheckPoint cp =
+         waitWithCheckPoint(accessor, checkGroup, "Not " + toString(value), new EqualsCondition<T>(this, true, value),
+            false, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return cp.isPass();
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public final boolean checkNot(ITestAccessor accessor, T value) {
+      return checkNot(accessor, (CheckGroup) null, value);
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the element is set to a value other than "value".
+    * 
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public final boolean checkNot(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      return checkNot(accessor, (CheckGroup) null, value, milliseconds);
+   }
+
+   protected CheckPoint waitWithCheckPoint(ITestAccessor accessor, CheckGroup checkGroup, String expected, IDiscreteElementCondition<T> condition, boolean maintain, int milliseconds) throws InterruptedException {
+      MsgWaitResult result = getMessage().waitForCondition(accessor, condition, maintain, milliseconds);
+      CheckPoint passFail =
+         new CheckPoint(getFullName(), expected, toString(condition.getLastCheckValue()), result.isPassed(),
+            result.getXmitCount(), result.getElapsedTime());
+
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+      return passFail;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+         getMessage());
+      CheckPoint cp =
+         waitWithCheckPoint(accessor, checkGroup,
+            "Not In " + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive),
+            new NotInRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive), false, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return cp.isPass();
+   }
+
+   public boolean checkNotRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+         getMessage());
+      MsgWaitResult cp =
+         getMessage().waitForCondition(accessor,
+            new NotInRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive), false, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return cp.isPassed();
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public final boolean checkNotRange(ITestAccessor accessor, T minValue, T maxValue) throws InterruptedException {
+      return checkNotRange(accessor, (CheckGroup) null, minValue, true, maxValue, true);
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public final boolean checkNotRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return checkNotRange(accessor, (CheckGroup) null, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public final boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return checkNotRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public final boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue) throws InterruptedException {
+      return checkNotRange(accessor, checkGroup, minValue, true, maxValue, true);
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public final boolean checkNotRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) throws InterruptedException {
+      return checkNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive);
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public T checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(value).add(milliseconds), getMessage());
+      EqualsCondition<T> c = new EqualsCondition<>(this, value);
+      waitWithCheckPoint(accessor, checkGroup, toString(value), c, true, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   public T checkMaintainNT(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(value).add(milliseconds), getMessage());
+      EqualsCondition<T> c = new EqualsCondition<>(this, value);
+      getMessage().waitForCondition(accessor, c, true, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   public T checkMaintainNotNT(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(value).add(milliseconds), getMessage());
+      EqualsCondition<T> c = new EqualsCondition<>(this, true, value);
+      getMessage().waitForCondition(accessor, c, true, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public final T checkMaintain(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      return checkMaintain(accessor, (CheckGroup) null, value, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value other than the "value" passed for the entire time passed into
+    * "milliseconds". Returns value found that caused failure or last value observed if time expires.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed
+    */
+   public T checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(value).add(milliseconds), getMessage());
+
+      EqualsCondition<T> c = new EqualsCondition<>(this, true, value);
+      waitWithCheckPoint(accessor, checkGroup,
+
+      "Not " + toString(value), c, true, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed
+    */
+   public final T checkMaintainNot(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+      return checkMaintainNot(accessor, (CheckGroup) null, value, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+         getMessage());
+
+      InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      waitWithCheckPoint(accessor, checkGroup,
+         "In" + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive), c, true,
+         milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   public T checkMaintainRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+         getMessage());
+      InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      getMessage().waitForCondition(accessor, c, true, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param accessor Reference to the accessor.
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+         getMessage());
+
+      NotInRangeCondition<T> c = new NotInRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      waitWithCheckPoint(accessor, checkGroup,
+         "Not In" + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive), c, true,
+         milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   public T checkMaintainNotRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      checkAccessor(accessor);
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+         getMessage());
+
+      NotInRangeCondition<T> c = new NotInRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+      getMessage().waitForCondition(accessor, c, true, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+      return checkMaintainNotRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+   }
+
+   public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue, int milliseconds, int pulses) throws InterruptedException {
+      if (accessor == null) {
+         throw new NullPointerException("The parameter accessor is null");
+      }
+
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(pulsedValue).add(nonPulsedValue).add(milliseconds), getMessage());
+      final PulseCondition<T> c = new PulseCondition<>(this, pulsedValue, nonPulsedValue, pulses);
+
+      MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+      CheckPoint passFail =
+         new CheckPoint(getFullName(), toString(pulsedValue) + " FOR " + pulses + " PULSES",
+            toString(c.getLastCheckValue()) + " FOR " + c.getPulses() + " PULSES", result.isPassed(),
+            result.getElapsedTime());
+
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+      accessor.getLogger().methodEnded(accessor);
+      return passFail.isPass();
+   }
+
+   public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+      return checkPulse(accessor, null, pulsedValue, nonPulsedValue);
+   }
+
+   public final boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+      return checkPulse(accessor, checkGroup, pulsedValue, nonPulsedValue, 1000, 2);
+   }
+
+   public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+      return checkPulse(accessor, null, pulsedValue, nonPulsedValue, milliseconds, 2);
+   }
+   
+   public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue, int milliseconds, int pulses) throws InterruptedException {
+      return checkPulse(accessor, null, pulsedValue, nonPulsedValue, milliseconds, pulses);
+   }
+   
+   public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+      return checkPulse(accessor, checkGroup, pulsedValue, nonPulsedValue, milliseconds, 2);
+   }
+   
+   public abstract T valueOf(MemoryResource mem);
+
+   @Override
+   public String toString() {
+
+      return elementName + "=" + getValue().toString();
+   }
+
+   @Override
+   public int compareTo(DiscreteElement<T> o) {
+      return getValue().compareTo(o.getValue());
+   }
+
+   /**
+    * Verifies that the element is set to a value in the "list".
+    * 
+    * @param list List of values to check for
+    * @return if check passed
+    */
+   public final boolean checkInList(ITestAccessor accessor, T[] list) {
+      return checkList(accessor, null, true, list);
+   }
+
+   /**
+    * Verifies that the element is set to a value NOT in the "list".
+    * 
+    * @param list List of values to check for
+    * @return if check passed
+    */
+   public final boolean checkNotInList(ITestAccessor accessor, T[] list) {
+      return checkList(accessor, null, false, list);
+   }
+
+   /**
+    * Verifies that the element is set to a value IN or NOT IN the "list" passed. "isInList" determines if checking for
+    * IN the list or NOT.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param isInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+    * test for IN the "list".
+    * @param list List of values to check for
+    * @param milliseconds Number of milliseconds to wait
+    * @return if check passed
+    */
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, T[] list, int milliseconds) throws InterruptedException {
+      ListCondition<T> c = new ListCondition<>(this, isInList, list);
+
+      if (accessor == null) {
+         throw new NullPointerException("The parameter accessor is null");
+      }
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(isInList).add(list).add(milliseconds), getMessage());
+
+      MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+      CheckGroup passFail = inList(accessor, isInList, c.getLastCheckValue(), list, result.getElapsedTime());
+      assert result.isPassed() == passFail.isPass() : "result does not match checkgroup";
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+      accessor.getLogger().methodEnded(accessor);
+      return passFail.isPass();
+   }
+
+   /**
+    * Verifies that the element is set to a value NOT in the "list".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param list List of values to check for
+    * @return if check passed
+    */
+   public final boolean checkNotInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list) {
+      return this.checkList(accessor, checkGroup, false, list);
+   }
+
+   /**
+    * Verifies that the element is set to a value NOT in the "list".
+    * 
+    * @param list List of values to check for
+    * @param milliseconds Number of milliseconds to wait
+    * @return if check passed
+    */
+   public final boolean checkNotInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+      return this.checkList(accessor, (CheckGroup) null, false, list, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value IN or NOT IN the "list" passed. "wantInList" determines if checking
+    * for IN the list or NOT.
+    * 
+    * @param wantInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+    * test for IN the "list".
+    * @param list List of values to check for
+    * @return if check passed
+    */
+   public final boolean checkList(ITestAccessor accessor, boolean wantInList, T[] list) {
+      return this.checkList(accessor, null, wantInList, list);
+   }
+
+   /**
+    * Verifies that the element is set to a value IN or NOT IN the "list" passed. "isInList" determines if checking for
+    * IN the list or NOT.
+    * 
+    * @param isInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+    * test for IN the "list".
+    * @param list List of values to check for
+    * @param milliseconds Number of milliseconds to wait
+    * @return if check passed
+    */
+   public final boolean checkList(ITestAccessor accessor, boolean isInList, T[] list, int milliseconds) throws InterruptedException {
+      return checkList(accessor, (CheckGroup) null, isInList, list, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value IN or NOT IN the "list" passed. "wantInList" determines if checking
+    * for IN the list or NOT.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param wantInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+    * test for IN the "list".
+    * @param list List of values to check for
+    * @return if check passed
+    */
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, T[] list) {
+
+      final T actualValue = getValue();
+
+      // Check if the value is in the list
+      CheckGroup passFail = inList(accessor, wantInList, actualValue, list, 0);
+
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+
+      return passFail.isPass();
+   }
+
+   /**
+    * Verifies that the element is set to a value in the "list".
+    * 
+    * @param list List of values to check for
+    * @param milliseconds Number of milliseconds to wait
+    * @return if check passed
+    */
+   public final boolean checkInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+      return this.checkList(accessor, (CheckGroup) null, true, list, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value NOT in the "list".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param list List of values to check for
+    * @param milliseconds Number of milliseconds to wait
+    * @return if check passed
+    */
+   public final boolean checkNotInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+      return this.checkList(accessor, checkGroup, false, list, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value in the list for the entire time passed into milliseconds.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param list The list of values to check against
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+      return this.checkMaintainList(accessor, checkGroup, list, true, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value not in the list for the entire time passed into milliseconds.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param list The list of values to check against
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public final T checkMaintainNotInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+      return this.checkMaintainList(accessor, checkGroup, list, false, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value in the "list".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param list List of values to check for
+    * @param milliseconds Number of milliseconds to wait
+    * @return if check passed
+    */
+   public final boolean checkInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+      return this.checkList(accessor, checkGroup, true, list, milliseconds);
+   }
+
+   /**
+    * Verifies that the element is set to a value in the "list".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param list List of values to check for
+    * @return if check passed
+    */
+   public final boolean checkInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list) {
+      return checkList(accessor, checkGroup, true, list);
+   }
+
+   /**
+    * Waits until the element is set to a value either in or not in the "list" as determined by "isInList".
+    * 
+    * @param list The list of values to check against
+    * @param isInList If the value is expected to be in or not in the "list"
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForList(ITestAccessor accessor, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+         new MethodFormatter().add(list).add(isInList).add(milliseconds), this.getMessage());
+
+      ListCondition<T> c = new ListCondition<>(this, isInList, list);
+      getMessage().waitForCondition(accessor, c, false, milliseconds);
+      accessor.getLogger().methodEnded(accessor);
+      return c.getLastCheckValue();
+   }
+
+   public T checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+         new MethodFormatter().add(list).add(isInList).add(milliseconds), this.getMessage());
+
+      ListCondition<T> c = new ListCondition<>(this, isInList, list);
+
+      MsgWaitResult result = getMessage().waitForCondition(accessor, c, true, milliseconds);
+
+      T value = c.getLastCheckValue();
+
+      CheckGroup passFail = inList(accessor, isInList, value, list, result.getElapsedTime());
+      if (checkGroup == null) {
+         accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+      } else {
+         checkGroup.add(passFail);
+      }
+      accessor.getLogger().methodEnded(accessor);
+      return value;
+   }
+
+   /**
+    * This method checks a an array of EnumBase objects to determine if a given EnumBase object is or isn't in the list.
+    * It then returns a CheckGroup object that describes the checks and pass/fail status.
+    * 
+    * @param isInList <ul>
+    * <li><b>True </b> used to get a pass iff the item is in the list.</li>
+    * <li><b>False </b> used to get a pass iff the item is not in the list.</li>
+    * </ul>
+    * @param actual The EnumBase object to check for.
+    * @param list The array of EnumBase objects to look through.
+    * @return A CheckGroup object that describes all comparisons made and outcomes.
+    */
+   private CheckGroup inList(ITestAccessor accessor, boolean isInList, T actual, T[] list, long elapsedTime) {
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+         new MethodFormatter().add(isInList).add(actual).add(list), this.getMessage());
+      CheckGroup checkGroup;
+      final String not = "Not ";
+
+      int i = 0;
+      // Build CheckPoint based on the type of check
+      if (isInList) {
+         checkGroup = new CheckGroup(Operation.OR, this.getFullName()); // Pass if at least one item
+         // matches
+         for (T expected : list) {
+            // Check if current item in the list matches.
+            checkGroup.add(new CheckPoint("List Item: " + i, expected.toString(), actual.toString(), expected.equals(actual),
+               elapsedTime));
+            i++;
+         }
+      } else {
+         checkGroup = new CheckGroup(Operation.AND, this.getFullName()); // Pass iff none of the
+         // items match
+         for (T expected : list) {
+            checkGroup.add(new CheckPoint("List Item: " + i, not + expected.toString(), actual.toString(), 
+               !expected.equals(actual), elapsedTime));
+            i++;
+         }
+      }
+      accessor.getLogger().methodEnded(accessor);
+      return checkGroup;
+   }
+
+   /**
+    * Sets the element to the first enumeration for the wait time and then it sets it to the second enumeration.
+    */
+   public synchronized void toggle(ITestEnvironmentAccessor accessor, T value1, T value2, int milliseconds) throws InterruptedException {
+      accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+         new MethodFormatter().add(value1).add(value2).add(milliseconds), getMessage());
+
+      set(accessor, value1);
+      accessor.setTimerFor(this, milliseconds);
+      wait();
+      accessor.getScriptCtrl().lock();
+      set(accessor, value2);
+
+      accessor.getLogger().methodEnded(accessor);
+   }
+
+   /**
+    * Will be removed in MS_0.1.6.
+    * 
+    * @use {@link #getValue()} instead
+    */
+   @Deprecated
+   public T get() {
+      return getValue();
+   }
+
+   /**
+    * gets this element's current value. Does logging
+    */
+   public T get(ITestEnvironmentAccessor accessor) {
+//      accessor.getLogger().methodCalled(accessor, new MethodFormatter());
+	   if (accessor != null) {
+		   accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter(),
+				   getMessage());
+	   }
+
+      T v = getValue();
+      ReturnFormatter returnFormatter = new ReturnFormatter();
+      returnFormatter.add(v);
+      if (accessor != null) {
+    	  accessor.getLogger().methodEnded(accessor, returnFormatter);    	  
+      }
+      return v;
+   }
+
+   /**
+    * get this elements current value
+    * 
+    * @return the value of this element
+    */
+   public T getNoLog() {
+      return getValue();
+   }
+
+   @Deprecated
+   public void set(T value) {
+      setValue(value);
+   }
+
+   public void setNoLog(T value) {
+      setValue(value);
+   }
+
+   @Deprecated
+   public void setNoLog(ITestEnvironmentAccessor accessor, T value) {
+      setValue(value);
+   }
+
+   private void checkAccessor(ITestEnvironmentAccessor accessor) {
+      if (accessor == null) {
+         throw new NullPointerException("The parameter accessor is null");
+      }
+   }
+
+   abstract public T elementMask(T value);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java
new file mode 100644
index 0000000..86b57e4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class Element implements ITimeout {
+//   protected final Message msg;
+   private final WeakReference<Message> msg;
+   protected String elementName;
+   private volatile boolean timedOut;
+   private final List<Object> elementPath;
+   private final String fullName;
+
+   protected final int byteOffset;
+   protected int lsb;
+   protected final MessageData messageData;
+   protected int msb;
+   protected final int originalMsb;
+   protected final int originalLsb;
+   private String elementPathAsString;
+
+   public Element(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+      this.msg = new WeakReference<>(msg);
+      this.elementName = elementName;
+      this.messageData = messageData;
+      this.byteOffset = byteOffset;
+      this.lsb = lsb;
+      this.msb = msb;
+      this.originalLsb = originalLsb;
+      this.originalMsb = originalMsb;
+      elementPath = new ArrayList<>();
+      fullName = (msg != null ? msg.getName() : messageData.getName()) + "." + this.elementName;
+   }
+
+   public Element(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      this(msg, elementName, messageData, bitOffset / 8, 0, 0, 0, 0);
+      this.msb = bitOffset % 8;
+      this.lsb = msb + bitLength - 1;
+   }
+
+   public Element(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(msg, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public int getMsb() {
+      return msb;
+   }
+
+   public int getLsb() {
+      return lsb;
+   }
+
+   public int getByteOffset() {
+      return byteOffset;
+   }
+
+   public MessageData getMsgData() {
+      return messageData;
+   }
+
+   public int getBitLength() {
+      return Math.abs(getMsb() - getLsb()) + 1;
+   }
+
+   public int getStartingBit() {
+      return getByteOffset() * 8 + Math.min(getMsb(), getLsb());
+   }
+
+   /*
+    * protected void set(TestEnvironmentAccessor accessor, long value) { if (accessor != null) {
+    * accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), (new MethodFormatter()).add(value)); }
+    * ((MemHolder) current.get()).getMem().s.setLong(value); if (accessor != null) {
+    * accessor.getLogger().methodEnded(accessor); } }
+    */
+   /**
+    * @return Returns full name string.
+    */
+   public String getFullName() {
+      return fullName;
+   }
+
+   public String getName() {
+      return this.elementName;
+   }
+
+   public String getDescriptiveName() {
+      return this.elementName;
+   }
+
+   /**
+    * @return Returns the msg.
+    */
+   public Message getMessage() {
+      return msg.get();
+   }
+
+   public String getElementName() {
+      return elementName;
+   }
+
+   @Override
+   public boolean isTimedOut() {
+      return this.timedOut;
+   }
+
+   @Override
+   public void setTimeout(boolean timeout) {
+      this.timedOut = timeout;
+   }
+
+   public DataType getType() {
+      return messageData.getType();
+   }
+
+   /**
+    * @return Returns the lsb.
+    */
+   public int getOriginalLsb() {
+      return originalLsb;
+   }
+
+   /**
+    * @return Returns the msb.
+    */
+   public int getOriginalMsb() {
+      return originalMsb;
+   }
+
+   private int calculateBitsToShift() {
+      int size = lsb - msb + 1;
+      return 32 - size;
+   }
+
+   private int calculateLongBitsToShift() {
+      int size = lsb - msb + 1;
+      return 64 - size;
+   }
+
+   protected int signExtend(int value) {
+      int bitsToShift = calculateBitsToShift();
+      return value << bitsToShift >> bitsToShift;
+   }
+
+   protected int removeSign(int value) {
+      int bitsToShift = calculateBitsToShift();
+      return value << bitsToShift >>> bitsToShift;
+   }
+
+   protected long removeSign(long value) {
+      int bitsToShift = calculateLongBitsToShift();
+      return value << bitsToShift >>> bitsToShift;
+   }
+
+   /**
+    * @return whether this message maps solely to PubSub
+    */
+   public boolean isNonMappingElement() {
+      return false;
+   }
+
+   /**
+    * Looks for the element matching this elements name inside one of the messages passed
+    * 
+    * @param messages Those messages mapped to a certain physical type, one of whom contains a mapping to this element
+    * @return An element of one of the messages passed with the same name as this element or this element if no match is
+    * found.
+    */
+   @SuppressWarnings("rawtypes")
+   public Element findElementInMessages(Collection<? extends Message> messages) {
+      for (Message currentMessage : messages) {
+         //         System.out.println("SwitchMessages" + currentMessage.getMessageName());
+         Element el = currentMessage.getElement(this.getElementPath());
+         if (el != null && currentMessage.isValidElement(this, el)) {
+            return el;
+         }
+      }
+      return this.getNonMappingElement();
+   }
+   
+   public Element switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      for (Message currentMessage : messages) {
+         //         System.out.println("SwitchMessages" + currentMessage.getMessageName());
+         Element el = currentMessage.getElement(this.getElementPath());
+         if (el != null && currentMessage.isValidElement(this, el)) {
+            return el;
+         }
+      }
+      return this.getNonMappingElement();
+   }
+
+   protected void sendMessage() {
+      this.getMessage().send();
+   }
+
+   /**
+    * This method returns a properly formatted string that describes the range and inclusive/exclusive properties of
+    * each end of the range.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return the string holding "[", "]", "(", or ")"
+    */
+   protected static String expectedRangeString(Object minValue, boolean minInclusive, Object maxValue, boolean maxInclusive) {
+      // A means for a return value
+      String retVal;
+
+      // Start with the proper symbol for the lower bound
+      if (minInclusive) {
+         retVal = "[";
+      } else {
+         retVal = "(";
+      }
+
+      // Add in the minimum and maximum values
+      retVal += minValue + " .. " + maxValue;
+
+      // End with the proper symbol for the upper bound
+      if (maxInclusive) {
+         retVal += "]";
+      } else {
+         retVal += ")";
+      }
+
+      // Return the formatted string
+      return retVal;
+   }
+
+   protected abstract Element getNonMappingElement();
+
+   protected void throwNoMappingElementException() {
+      throw new MessageSystemException(
+         "The element " + msg.get().getName() + "." + elementName + " does not exist for the message's current MemType!! " + "\nIt shouldn't be used for this environment type!!",
+         Level.SEVERE);
+   }
+
+   /**
+    * @return the elementPath
+    */
+   public List<Object> getElementPath() {
+      return elementPath;
+   }
+
+   public void addPath(Object... objs) {
+      for (Object obj : objs) {
+         elementPath.add(obj);
+      }
+      elementPath.add(this.getName());
+   }
+
+   @Override
+   public String toString() {
+
+      return elementName;
+   }
+
+   public void zeroize() {
+
+      getMsgData().getMem().setLong(0L, byteOffset, msb, lsb);
+
+   }
+
+   public void visit(IElementVisitor visitor) {
+      visitor.asGenericElement(this);
+   }
+
+   public String getElementPathAsString() {
+      if (elementPathAsString == null) {
+         StringBuilder sb = new StringBuilder();
+         for (int i = 1; i < elementPath.size(); i++) {
+            Object obj = elementPath.get(i);
+            if (obj instanceof String) {
+               sb.append(obj);
+
+            } else if (obj instanceof Integer) {
+               sb.delete(sb.length() - 1, sb.length());
+               sb.append("[");
+               sb.append(((Integer) obj).intValue());
+               sb.append("]");
+            }
+            if (i < elementPath.size() - 1) {
+               sb.append(".");
+            }
+         }
+         elementPathAsString = sb.toString();
+      }
+      return elementPathAsString;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java
new file mode 100644
index 0000000..39f13c5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingEmptyEnumElement;
+import org.eclipse.osee.ote.message.enums.EmptyEnum;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class EmptyEnum_Element extends DiscreteElement<EmptyEnum> {
+
+   public EmptyEnum_Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public EmptyEnum_Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public EmptyEnum_Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, EmptyEnum_Element cause, EmptyEnum value) throws InterruptedException {
+      /* check for 0 to begin */
+      check(accessor, EmptyEnum.toEnum(0), 0);
+
+      /* Set the DP1 Signal */
+      cause.set(accessor, value);
+
+      /* Check Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, EmptyEnum.toEnum(0));
+
+      /* Set DP2 Mux to 0 */
+      set(accessor, EmptyEnum.toEnum(0));
+
+      /* Check Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Check DP2 is 0 for two-pulse signals and high for four-pulse signal */
+      check(accessor, EmptyEnum.toEnum(0), 500);
+
+   }
+
+   @Override
+   @Deprecated
+   public EmptyEnum_Element findElementInMessages(Collection<? extends Message> messages) {
+      return (EmptyEnum_Element) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   public EmptyEnum_Element switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (EmptyEnum_Element) super.switchMessages(messages);
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it.
+    * 
+    * @param enumeration The value to set.
+    */
+   public void setAndSend(ITestEnvironmentAccessor accessor, EmptyEnum enumeration) {
+      this.set(accessor, enumeration);
+      super.sendMessage();
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      return new NonMappingEmptyEnumElement(this);
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asEmptyEnumElement(this);
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      int intValue = Integer.parseInt(value);
+      getMsgData().getMem().setInt(intValue, byteOffset, msb, lsb);
+   }
+
+   @Override
+   public EmptyEnum getValue() {
+      return toEnum(getMsgData().getMem().getInt(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public void setValue(EmptyEnum obj) {
+      getMsgData().getMem().setInt(obj.getValue(), byteOffset, msb, lsb);
+   }
+
+   @Override
+   public String toString(EmptyEnum obj) {
+      return "EmptyEnum_" + obj.getValue();
+   }
+
+   @Override
+   public EmptyEnum valueOf(MemoryResource mem) {
+      return toEnum(mem.getInt(byteOffset, msb, lsb));
+   }
+
+   private EmptyEnum toEnum(int intValue) {
+      return EmptyEnum.toEnum(intValue);
+   }
+
+   @Override
+   public EmptyEnum elementMask(EmptyEnum value) {
+      return value;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java
new file mode 100644
index 0000000..be3fabc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingEnumeratedElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class EnumeratedElement<T extends Enum<T> & IEnumValue<T>> extends DiscreteElement<T> {
+
+   private final Class<T> clazz;
+   private final T[] values;
+
+   public EnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+      this.clazz = clazz;
+
+      values = clazz.getEnumConstants();
+   }
+
+   public EnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(msg, elementName, clazz, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   private T getValue(int intVal) {
+      T undefined = null;
+      for (T val : values) {
+         if (val.getIntValue() == intVal) {
+            return val;
+         } else if (undefined == null) {
+            undefined = val.getEnum(intVal);
+         }
+      }
+      return undefined;
+   }
+
+   public EnumeratedElement(Message message, String elementName, Class<T> clazz, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+      this.clazz = clazz;
+
+      values = clazz.getEnumConstants();
+   }
+
+   public int getIntValue() {
+      return getMsgData().getMem().getInt(byteOffset, msb, lsb);
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the meessage that contains it.
+    * 
+    * @param enumeration The value to set.
+    */
+   public void setAndSend(ITestEnvironmentAccessor accessor, T enumeration) {
+      this.set(accessor, enumeration);
+      super.sendMessage();
+   }
+
+   /**
+    * Waits until the element is set to a value not in the "list" passed
+    * 
+    * @param list The list of values to check against
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForNotInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+      return this.waitForList(accessor, list, false, milliseconds);
+   }
+
+   /**
+    * Waits until the element is set to a value in the "list" passed
+    * 
+    * @param list The list of values to check against
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+      return this.waitForList(accessor, list, true, milliseconds);
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   public void checkPulse(ITestAccessor accessor, T value) throws InterruptedException {
+
+      T nonPulsedValue = getValue(0);
+      if (value == nonPulsedValue) {
+         nonPulsedValue = getValue(1);
+      }
+
+      checkPulse(accessor, value, nonPulsedValue);
+
+   }
+
+   @SuppressWarnings({ "unchecked", "rawtypes" })
+   @Override
+   public EnumeratedElement<T> findElementInMessages(Collection<? extends Message> messages) {
+      return (EnumeratedElement<T>) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   @SuppressWarnings("unchecked")
+   public EnumeratedElement<T> switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (EnumeratedElement<T>) super.switchMessages(messages);
+   }
+
+   protected T toEnum(int intValue) {
+      final T val = getValue(intValue);
+      if (val != null) {
+         return val;
+      }
+      throw new IllegalArgumentException(
+         "No enum value associated with the integer value " + intValue + " for element " + getName());
+   }
+
+   @Override
+   public T getValue() {
+      return toEnum(getMsgData().getMem().getInt(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public T valueOf(MemoryResource otherMem) {
+      return toEnum(otherMem.getInt(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public void setValue(T obj) {
+      getMsgData().getMem().setInt(obj.getIntValue(), byteOffset, msb, lsb);
+   }
+
+   public T[] getEnumValues() {
+      return clazz.getEnumConstants();
+   }
+
+   @Override
+   public String toString(T obj) {
+      return String.format("%s [%d]", obj.name(), obj.getIntValue());
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      this.set(accessor, Enum.valueOf(clazz, value));
+   }
+
+   public void set(String value) throws IllegalArgumentException {
+      this.setValue(Enum.valueOf(clazz, value));
+   }
+
+   public void setbyEnumIndex(int index) throws IllegalArgumentException {
+      getMsgData().getMem().setInt(values[index].getIntValue(), byteOffset, msb, lsb);
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asEnumeratedElement(this);
+   }
+
+   @Override
+   protected NonMappingEnumeratedElement<T> getNonMappingElement() {
+      return new NonMappingEnumeratedElement<T>(this);
+   }
+
+   @Override
+   public String valueOf() {
+      return String.format("%s [%d]", getValue().name(), getIntValue());
+   }
+
+   public Class<T> getEnumClass() {
+      return clazz;
+   }
+
+   @Override
+   public T elementMask(T value) {
+      return value;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java
new file mode 100644
index 0000000..505e6e3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java
@@ -0,0 +1,342 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingFixedPointElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author John Butler
+ */
+public class FixedPointElement extends RealElement {
+
+   private final double resolution;
+   private final boolean signed;
+   private final double offset;
+
+   public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, resolution, 0, signed, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double offset, boolean signed, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, resolution, offset, signed, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      this(message, elementName, messageData, resolution, 0, signed, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double offset, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+      this.resolution = resolution;
+      this.signed = signed;
+      this.offset = offset;
+   }
+
+   public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double offset, boolean signed, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+      this.resolution = resolution;
+      this.signed = signed;
+      this.offset = offset;
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void set(ITestEnvironmentAccessor accessor, double value) {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+            this.getMessage());
+      }
+      setValue(value);
+
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+   }
+
+   /**
+    * Sets the element to the "value" passeda nd immediately sends the message that contains it...
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+      this.set(accessor, value);
+      super.sendMessage();
+   }
+
+   public void setNoLog(ITestEnvironmentAccessor accessor, double value) {
+      setValue(value);
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, FixedPointElement cause, double value) throws InterruptedException {
+      /* check for 0 to begine */
+      check(accessor, 0d, 0);
+
+      /* Set the DP1 Mux Signal */
+      cause.set(accessor, value);
+
+      /* Chk Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, 0);
+
+      /* Init DP2 Mux to 0 */
+      set(accessor, 0);
+
+      /* Chk Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+      check(accessor, 0d, 500);
+   }
+
+   private double toFixed(long value, boolean signed, double resolution, double offset) {
+      int shift = 64 - (lsb - msb + 1);
+      if (signed) {// two's compliment
+         if (value >>> lsb - msb == 1) {// we've got a negative
+            value--;
+            value = ~value;
+            value = value << shift;
+            value = value >>> shift;
+            value = value * -1;
+         }
+      } else {
+         value = value << shift;
+         value = value >>> shift;
+      }
+      return value * resolution + offset;
+   }
+
+   private long toFixedLong(double value, boolean signed, double resolution, double offset) {
+      long returnValue = Math.round((value - offset) / resolution);
+
+      if (value > 0 && toFixed(returnValue, signed, resolution, offset) < 0) {
+         returnValue = Math.round((value - resolution - offset) / resolution);
+         if (value > 0 && toFixed(returnValue, signed, resolution, offset) < 0) {
+            returnValue = Math.round((value - resolution * 2 - offset) / resolution);
+            if (value > 0 && toFixed(returnValue, signed, resolution, offset) < 0) {
+               OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, getName());
+            } else {
+               OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, getName());
+            }
+         } else {
+            OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, getName());
+         }
+      }
+
+      if (signed && value < 0) {
+         returnValue = returnValue * -1;
+         int shift = 64 - (lsb - msb + 1);
+         returnValue = returnValue << shift;
+         returnValue = ~returnValue;
+         returnValue = returnValue >>> shift;
+         returnValue++;
+      }
+      return returnValue;
+   }
+
+   @Override
+   public void setValue(Double obj) {
+      getMsgData().getMem().setLong(toFixedLong(obj, signed, resolution, offset), byteOffset, msb, lsb);
+   }
+
+   @Override
+   public void setHex(long hex) {
+      getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+   }
+
+   @Override
+   public Double getValue() {
+      return toFixed(getRaw(), signed, resolution, offset);
+   }
+
+   @Override
+   public Double valueOf(MemoryResource mem) {
+      return toFixed(getRaw(mem), signed, resolution, offset);
+   }
+
+   @Override
+   protected double toDouble(long value) {
+      return toFixed(value, signed, resolution, offset);
+   }
+
+   @Override
+   protected long toLong(double value) {
+      return toFixedLong(value, signed, resolution, offset);
+   }
+
+   /**
+    * @return Returns the offset.
+    */
+   public double getMinVal() {
+      return offset;
+   }
+
+   /**
+    * @return Returns the resolution.
+    */
+   public double getResolution() {
+      return resolution;
+   }
+
+   /**
+    * @return Returns the signed.
+    */
+   public boolean isSigned() {
+      return signed;
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asFixedPointElement(this);
+   }
+
+   @Override
+   protected NonMappingFixedPointElement getNonMappingElement() {
+      return new NonMappingFixedPointElement(this);
+   }
+
+   @Override
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+      return super.check(accessor, checkGroup, adjust(value), milliseconds);
+   }
+
+   @Override
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, Double value) {
+      return super.check(accessor, checkGroup, adjust(value));
+   }
+
+   @Override
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, Double[] list, int milliseconds) throws InterruptedException {
+      return super.checkList(accessor, checkGroup, isInList, adjust(list), milliseconds);
+   }
+
+   @Override
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, Double[] list) {
+      return super.checkList(accessor, checkGroup, wantInList, adjust(list));
+   }
+
+   @Override
+   public Double checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+      return super.checkMaintain(accessor, checkGroup, adjust(value), milliseconds);
+   }
+
+   @Override
+   public Double checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, Double[] list, boolean isInList, int milliseconds) throws InterruptedException {
+      return super.checkMaintainList(accessor, checkGroup, adjust(list), isInList, milliseconds);
+   }
+
+   @Override
+   public Double checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+      return super.checkMaintainNot(accessor, checkGroup, adjust(value), milliseconds);
+   }
+
+   @Override
+   public Double checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.checkMaintainNotRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive,
+         milliseconds);
+   }
+
+   @Override
+   public Double checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.checkMaintainRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive,
+         milliseconds);
+   }
+
+   @Override
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+      return super.checkNot(accessor, checkGroup, adjust(value), milliseconds);
+   }
+
+   @Override
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, Double value) {
+      return super.checkNot(accessor, checkGroup, adjust(value));
+   }
+
+   @Override
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.checkNotRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+   }
+
+   @Override
+   public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, Double pulsedValue, Double nonPulsedValue, int milliseconds) throws InterruptedException {
+      return super.checkPulse(accessor, checkGroup, adjust(pulsedValue), adjust(nonPulsedValue), milliseconds);
+   }
+
+   @Override
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.checkRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+   }
+
+   @Override
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive) {
+      return super.checkRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive);
+   }
+
+   @Override
+   public Double waitForList(ITestAccessor accessor, Double[] list, boolean isInList, int milliseconds) throws InterruptedException {
+      return super.waitForList(accessor, adjust(list), isInList, milliseconds);
+   }
+
+   @Override
+   public Double waitForNotRange(ITestEnvironmentAccessor accessor, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.waitForNotRange(accessor, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+   }
+
+   @Override
+   public Double waitForNotValue(ITestEnvironmentAccessor accessor, Double value, int milliseconds) throws InterruptedException {
+      return super.waitForNotValue(accessor, adjust(value), milliseconds);
+   }
+
+   @Override
+   public Double waitForRange(ITestEnvironmentAccessor accessor, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.waitForRange(accessor, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+   }
+
+   @Override
+   public Double waitForValue(ITestEnvironmentAccessor accessor, Double value, int milliseconds) throws InterruptedException {
+      return super.waitForValue(accessor, adjust(value), milliseconds);
+   }
+
+   private Double adjust(Double value) {
+      return toDouble(toLong(value));
+   }
+
+   private Double[] adjust(Double[] list) {
+      Double[] newList = new Double[list.length];
+      for (int i = 0; i < list.length; i++) {
+         newList[i] = adjust(list[i]);
+      }
+      return newList;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float32Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float32Element.java
new file mode 100644
index 0000000..fccee40
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float32Element.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingFloat32Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Float32Element extends RealElement {
+
+   public Float32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public Float32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public Float32Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, Float32Element cause, double value) throws InterruptedException {
+      /* check for 0 to begine */
+      check(accessor, 0d, 0);
+
+      /* Set the DP1 Mux Signal */
+      cause.set(accessor, (float) value);
+
+      /* Chk Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, 0);
+
+      /* Init DP2 Mux to 0 */
+      set(accessor, 0);
+
+      /* Chk Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+      check(accessor, 0d, 500);
+
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void set(ITestEnvironmentAccessor accessor, double value) {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+            this.getMessage());
+      }
+      setValue(value);
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it..
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+      this.set(accessor, value);
+      super.sendMessage();
+   }
+
+   @Override
+   public Double getValue() {
+      return new Double(Float.intBitsToFloat(getMsgData().getMem().getInt(byteOffset, msb, lsb)));
+
+   }
+
+   @Override
+   public Double valueOf(MemoryResource mem) {
+      return new Double(Float.intBitsToFloat(mem.getInt(byteOffset, msb, lsb)));
+   }
+
+   @Override
+   public void setValue(Double obj) {
+      setValue(obj.floatValue());
+   }
+
+   @Override
+   public void setValue(Float obj) {
+      getMsgData().getMem().setInt(Float.floatToIntBits(obj), byteOffset, msb, lsb);
+   }
+
+   @Override
+   protected double toDouble(long value) {
+      return Float.intBitsToFloat((int) value);
+   }
+
+   @Override
+   protected long toLong(double value) {
+      return Double.doubleToLongBits(value);
+   }
+
+   @Override
+   protected NonMappingFloat32Element getNonMappingElement() {
+      return new NonMappingFloat32Element(this);
+   }
+
+   @Override
+   public void setHex(long hex) {
+      getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float64Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float64Element.java
new file mode 100644
index 0000000..83d2abd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float64Element.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingFloat64Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Float64Element extends RealElement {
+
+   public Float64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public Float64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public Float64Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, Float64Element cause, double value) throws InterruptedException {
+      /* check for 0 to begine */
+      check(accessor, 0d, 0);
+
+      /* Set the DP1 Mux Signal */
+      cause.set(accessor, value);
+
+      /* Chk Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, 0);
+
+      /* Init DP2 Mux to 0 */
+      set(accessor, 0);
+
+      /* Chk Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+      check(accessor, 0d, 500);
+
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void set(ITestEnvironmentAccessor accessor, double value) {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+            this.getMessage());
+      }
+      setValue(value);
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it..
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+      this.set(accessor, value);
+      super.sendMessage();
+   }
+
+   public void setNoLog(ITestEnvironmentAccessor accessor, double value) {
+      setValue(value);
+   }
+
+   @Override
+   public Double getValue() {
+      return Double.longBitsToDouble(getMsgData().getMem().getLong(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public Double valueOf(MemoryResource mem) {
+      return Double.longBitsToDouble(mem.getLong(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public void setValue(Double obj) {
+      getMsgData().getMem().setLong(Double.doubleToLongBits(obj), byteOffset, msb, lsb);
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param accessor - For logging.
+    * @param bits - The bits to set.
+    */
+   public void setRawBits(ITestEnvironmentAccessor accessor, long bits) {
+      if (accessor != null) {
+         accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(bits),
+            this.getMessage());
+      }
+
+      getMsgData().getMem().setLong(bits, byteOffset, msb, lsb);
+      if (accessor != null) {
+         accessor.getLogger().methodEnded(accessor);
+      }
+   }
+
+   /**
+    * Sest the element without the logging.
+    */
+   public void setRawBits(long bits) {
+      getMsgData().getMem().setLong(bits, byteOffset, msb, lsb);
+   }
+
+   @Override
+   protected double toDouble(long value) {
+      return Double.longBitsToDouble(value);
+   }
+
+   @Override
+   protected long toLong(double value) {
+      return Double.doubleToLongBits(value);
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      return new NonMappingFloat64Element(this);
+   }
+
+   @Override
+   public void setHex(long hex) {
+      getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java
new file mode 100644
index 0000000..ba7a609
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+/**
+ * @author Andy Jury
+ */
+public interface IElementVisitor {
+
+   void asGenericElement(Element element);
+
+   void asBooleanElement(BooleanElement element);
+
+   void asIntegerElement(IntegerElement element);
+
+   void asRealElement(RealElement element);
+
+   void asCharElement(CharElement element);
+
+   void asEnumeratedElement(EnumeratedElement<?> element);
+
+   void asFixedPointElement(FixedPointElement element);
+
+   void asRecordElement(RecordElement element);
+
+   void asFloat32(Float32Element element);
+
+   void asFloat64(Float64Element element);
+
+   void asStringElement(StringElement element);
+
+   void asRecordMap(RecordMap<? extends RecordElement> element);
+
+   void asEmptyEnumElement(EmptyEnum_Element element);
+
+   void asLongIntegerElement(LongIntegerElement element);
+
+   void asSignedInteger16Element(SignedInteger16Element element);
+
+   void asArrayElement(ArrayElement element);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IEnumValue.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IEnumValue.java
new file mode 100644
index 0000000..13b058b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IEnumValue.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+public interface IEnumValue<T> {
+   public int getIntValue();
+
+   T getEnum(int value);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java
new file mode 100644
index 0000000..846fb95
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IRecordFactory.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.message.elements;
+
+public interface IRecordFactory {
+
+   RecordElement create(int i);
+
+   int getBitLength();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java
new file mode 100644
index 0000000..e9ccc81
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public class InaccessibleElement extends Element {
+
+   // TODO - this is a temporary hack for (PLT/CPG)_UFD_CMD. When cdb adds
+   // individual elements, delete this class!!! Make sure to remove it from
+   // MuxSignalType too!! Also make sure to take code out of Message Generation
+   // too.
+   public InaccessibleElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public InaccessibleElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public InaccessibleElement findElementInMessages(Collection<? extends Message> messages) {
+      return (InaccessibleElement) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   public InaccessibleElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (InaccessibleElement) super.switchMessages(messages);
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      return null;
+   }
+
+   public int compareTo(InaccessibleElement o) {
+      return 0;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IntegerElement.java
new file mode 100644
index 0000000..48ae746
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IntegerElement.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class IntegerElement extends NumericElement<Integer> {
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asIntegerElement(this);
+   }
+
+   public IntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public IntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public IntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public IntegerElement findElementInMessages(Collection<? extends Message> messages) {
+      return (IntegerElement) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   public IntegerElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (IntegerElement) super.switchMessages(messages);
+   }
+
+   @Override
+   public String toString(Integer obj) {
+      int value = elementMask(obj);
+      return value + "(0x" + Integer.toHexString(value).toUpperCase() + ")";
+   }
+
+   @Override
+   public void setValue(Integer value) {
+      getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+   }
+
+   @Override
+   public Integer getValue() {
+      return Integer.valueOf(getMsgData().getMem().getInt(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public Integer valueOf(MemoryResource mem) {
+      return Integer.valueOf(mem.getInt(byteOffset, msb, lsb));
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+      value = removeSign(value);
+      /* check for 0 to begine */
+      check(accessor, 0, 0);
+
+      /* Set the DP1 Mux Signal */
+      cause.set(accessor, value);
+
+      /* Chk Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, 0);
+
+      /* Init DP2 Mux to 0 */
+      set(accessor, 0);
+
+      /* Chk Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+      check(accessor, 0, 500);
+
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   public void checkPulse(ITestAccessor accessor, Integer value) throws InterruptedException {
+
+      int nonPulsedValue = 0;
+      if (value == 0) {
+         nonPulsedValue = 1;
+      }
+
+      checkPulse(accessor, value, nonPulsedValue);
+
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   @Override
+   public void set(ITestEnvironmentAccessor accessor, Integer value) {
+      super.set(accessor, value);
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it..
+    * 
+    * @param value The value to set.
+    */
+   public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+      this.set(accessor, value);
+      super.sendMessage();
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      return this.waitForRange(accessor, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.waitForRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+         maxInclusive, milliseconds);
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      return this.waitForNotRange(accessor, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.waitForNotRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+         maxInclusive, milliseconds);
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      this.set(accessor, Integer.parseInt(value));
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      return new NonMappingIntegerElement(this);
+   }
+
+   @Override
+   public Integer elementMask(Integer value) {
+      return removeSign(value);
+   }
+
+   public static void main(String[] args) {
+      final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 2, 64));
+      IntegerElement e1 = new IntegerElement(null, "e1", hd, 0, 0, 31);
+      IntegerElement e2 = new IntegerElement(null, "e2", hd, 4, 0, 31);
+      e1.setValue(-1);
+      e2.setValue(-1000);
+
+      System.out.printf(" e1 value = %d\n", e1.getValue());
+      System.out.printf(" e2 value = %d\n", e2.getValue());
+
+   }
+
+   @Override
+   public long getNumericBitValue() {
+      return getValue() & 0xFFFFFFFFL;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java
new file mode 100644
index 0000000..f04d99c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingLongIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class LongIntegerElement extends NumericElement<Long> {
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asLongIntegerElement(this);
+   }
+
+   public LongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public LongIntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public LongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+   
+   @Override
+   public LongIntegerElement findElementInMessages(Collection<? extends Message> messages) {
+      return (LongIntegerElement) super.findElementInMessages(messages);
+   }
+
+   @Override
+   public LongIntegerElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (LongIntegerElement) super.switchMessages(messages);
+   }
+
+   @Override
+   public String toString(Long obj) {
+      long value = elementMask(obj);
+      return value + "(0x" + Long.toHexString(value).toUpperCase() + ")";
+   }
+
+   @Override
+   public void setValue(Long value) {
+      getMsgData().getMem().setLong(value, byteOffset, msb, lsb);
+   }
+
+   @Override
+   public Long getValue() {
+      return Long.valueOf(getMsgData().getMem().getLong(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public Long valueOf(MemoryResource mem) {
+      return Long.valueOf(mem.getLong(byteOffset, msb, lsb));
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, LongIntegerElement cause, long value) throws InterruptedException {
+      value = removeSign(value);
+      /* check for 0 to begine */
+      check(accessor, 0, 0);
+
+      /* Set the DP1 Mux Signal */
+      cause.set(accessor, value);
+
+      /* Chk Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, 0);
+
+      /* Init DP2 Mux to 0 */
+      set(accessor, 0);
+
+      /* Chk Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+      check(accessor, 0, 500);
+
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, long value, int milliseconds) throws InterruptedException {
+      return super.check(accessor, (CheckGroup) null, removeSign(value), milliseconds);
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   public void checkPulse(ITestAccessor accessor, long value) throws InterruptedException {
+      long nonPulsedValue = 0;
+      if (value == 0) {
+         nonPulsedValue = 1;
+      }
+
+      checkPulse(accessor, value, nonPulsedValue);
+
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, long value) {
+      super.set(accessor, value);
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   @Deprecated
+   public void set(long value) {
+      setValue(value);
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it..
+    * 
+    * @param value The value to set.
+    */
+   public void setAndSend(ITestEnvironmentAccessor accessor, long value) {
+      this.set(accessor, value);
+      super.sendMessage();
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      this.set(accessor, Long.parseLong(value));
+   }
+
+   @Override
+   protected NonMappingLongIntegerElement getNonMappingElement() {
+      return new NonMappingLongIntegerElement(this);
+   }
+
+   @Override
+   public Long elementMask(Long value) {
+      return removeSign(value);
+   }
+
+   @Override
+   public long getNumericBitValue() {
+      return getValue();
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java
new file mode 100644
index 0000000..57ca292
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+public class MsgWaitResult {
+   private final long time;
+   private final int xmitCount;
+   private final boolean passed;
+
+   public MsgWaitResult(long time, int xmitCount, boolean passed) {
+      this.time = time;
+      this.xmitCount = xmitCount;
+      this.passed = passed;
+   }
+
+   public long getElapsedTime() {
+      return time;
+   }
+
+   public int getXmitCount() {
+      return xmitCount;
+   }
+
+   public boolean isPassed() {
+      return passed;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NonFilteredStringElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NonFilteredStringElement.java
new file mode 100644
index 0000000..c155e2e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NonFilteredStringElement.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.message.elements;
+
+
+public class NonFilteredStringElement extends StringElement{
+
+	public NonFilteredStringElement(StringElement element) {
+		super(element.getMessage(), element.getName(), element.getMsgData(), element.getByteOffset(), element.getMsb(), element.getLsb());
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.osee.ote.message.elements.StringElement#getValue()
+	 */
+	@Override
+	public String getValue() {
+		return getMsgData().getMem().getUnfilteredASCIIString(byteOffset, msb, lsb);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NumericElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NumericElement.java
new file mode 100644
index 0000000..3e3cdb6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NumericElement.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.ote.message.elements;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public abstract class NumericElement<T extends Number & Comparable<T>> extends DiscreteElement<T> {
+
+   public NumericElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+   }
+
+   public NumericElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NumericElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(msg, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public abstract long getNumericBitValue();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RealElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RealElement.java
new file mode 100644
index 0000000..feb9997
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RealElement.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class RealElement extends NumericElement<Double> {
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asRealElement(this);
+   }
+
+   public RealElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public RealElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public RealElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   @Override
+   public RealElement findElementInMessages(Collection<? extends Message> messages) {
+      return (RealElement) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   public RealElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (RealElement) super.switchMessages(messages);
+   }
+
+   public void setValue(Float value) {
+      setValue(value.doubleValue());
+   }
+
+   @Override
+   public String valueOf() {
+      return getValue().toString();
+   }
+
+   public long getRaw() {
+      return getRaw(getMsgData().getMem());
+   }
+
+   public long getRaw(MemoryResource mem) {
+      return mem.getLong(byteOffset, msb, lsb);
+   }
+
+   public abstract void set(ITestEnvironmentAccessor accessor, double value);
+
+   public abstract void setAndSend(ITestEnvironmentAccessor accessor, double value);
+
+   /**
+    * sets the bit pattern for this element. All hex values must be in the form of: <br>
+    * <p>
+    * <code><b>0x[<I>hex characters</I>]L</b></code><br>
+    * <p>
+    * The trailing 'L' signals java to treat the value as a long integer.
+    * 
+    * @param hex a bit patter to set the element to. The pattern is not limited to hexadecimal
+    */
+   public abstract void setHex(long hex);
+
+   protected abstract double toDouble(long value);
+
+   protected abstract long toLong(double value);
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      this.set(accessor, Double.parseDouble(value));
+   }
+
+   @Override
+   public String toString(Double obj) {
+      return obj.toString();
+   }
+
+   @Override
+   public Double elementMask(Double value) {
+      return value;
+   }
+
+   @Override
+   public long getNumericBitValue() {
+      return getRaw();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordElement.java
new file mode 100644
index 0000000..e98dab4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordElement.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingRecordElement;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class RecordElement extends Element {
+
+   private final Map<String, Element> elementMap;
+   private final int recordBitSize;
+
+   private int bitOffset;
+   private final int index;
+   private boolean isPartOfMap = true;
+   private final int firstRecordBitOffset;
+   public int BIT_OFFSET;
+
+   /**
+    * @param message -
+    * @param elementName -
+    */
+   public RecordElement(Message message, String elementName, int index, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
+      super(message, elementName, messageData, firstRecordBitOffset + index * recordBitSize, recordBitSize);
+      elementMap = new LinkedHashMap<>();
+      BIT_OFFSET = this.bitOffset = firstRecordBitOffset + index * recordBitSize;
+      this.recordBitSize = recordBitSize;
+      this.firstRecordBitOffset = firstRecordBitOffset;
+      this.index = index;
+   }
+
+   public RecordElement(Message message, String elementName, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
+      this(message, elementName, 0, messageData, firstRecordBitOffset, recordBitSize);
+      isPartOfMap = false;
+   }
+
+   public void addElements(Element... elements) {
+      for (Element element : elements) {
+         elementMap.put(element.elementName, element);
+      }
+   }
+
+   @Override
+   public void addPath(Object... objs) {
+      for (Object obj : objs) {
+         getElementPath().add(obj);
+      }
+      if (isPartOfMap) {
+         getElementPath().add(index);
+      } else {
+         getElementPath().add(getElementName());
+      }
+      Object[] myPath = getElementPath().toArray();
+      for (Element el : elementMap.values()) {
+         el.addPath(myPath);
+      }
+   }
+
+   public RecordElement(RecordElement message, String elementName, int offset, MessageData messageData, int firstRecordByteOffset, int recordByteSize) {
+      this(message.getMessage(), elementName, offset, messageData, firstRecordByteOffset, recordByteSize);
+      isPartOfMap = false;
+   }
+
+   public Map<String, Element> getElementMap() {
+      return this.elementMap;
+   }
+
+   @Override
+   protected NonMappingRecordElement getNonMappingElement() {
+      return new NonMappingRecordElement(this);
+   }
+
+   @Override
+   public RecordElement findElementInMessages(Collection<? extends Message> messages) {
+      return (RecordElement) super.findElementInMessages(messages);
+   }
+   
+   public RecordElement switchMessagesNew(Collection<? extends Message<?,?,?>> messages) {
+      return (RecordElement) super.switchMessages(messages);
+   }
+   
+   public void put(int index, RecordElement newRecord) {
+      // records.put(index, (T)newRecord);
+   }
+
+   public int length() {
+      return -1;
+   }
+
+   public RecordElement get(int index) {
+      // T val = records.get(index);
+      // if(val == null){
+      // val = (T)factory.create(index);
+      // records.put(index, val);
+      // }
+      return null;
+   }
+
+   /**
+    * @return the firstRecordBitOffset
+    */
+   public int getFirstRecordBitOffset() {
+      return firstRecordBitOffset;
+   }
+
+   /**
+    * @return the bitOffset
+    */
+   public int getBitOffset() {
+      return bitOffset;
+   }
+
+   /**
+    * @return the recordBitSize
+    */
+   public int getRecordBitSize() {
+      return recordBitSize;
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asRecordElement(this);
+   }
+
+   @Override
+   public void zeroize() {
+      for (Element el : elementMap.values()) {
+         el.zeroize();
+      }
+   }
+
+   @Override
+   public String getDescriptiveName() {
+      if (isPartOfMap) {
+         return String.format("%s[%d]", getName(), index);
+      }
+      return getName();
+   }
+
+   public int getIndex() {
+      return index;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordMap.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordMap.java
new file mode 100644
index 0000000..db59bd7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordMap.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import java.util.HashMap;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class RecordMap<T extends RecordElement> extends RecordElement {
+
+   private final int NUMBER_OF_RECORDS;
+
+   private final HashMap<Integer, T> records;
+   private IRecordFactory factory;
+
+   public RecordMap(Message message, MessageData messageData, String elementName, int numberOfRecords, IRecordFactory factory) {
+      super(message, elementName, 1, messageData, 0, factory.getBitLength());
+      NUMBER_OF_RECORDS = numberOfRecords;
+      records = new HashMap<>(numberOfRecords);
+      this.factory = factory;
+   }
+
+   public RecordMap(Message message, MessageData messageData, int firstRecordByteOffset, int recordByteSize, int numberOfRecords) {
+      super(message, "", 1, messageData, 0, 0);
+      NUMBER_OF_RECORDS = numberOfRecords;
+      records = new HashMap<>(numberOfRecords);
+   }
+
+   @Override
+   public T get(int index) {
+      if (index >= NUMBER_OF_RECORDS) {
+         throw new IllegalArgumentException(
+            "index(zero-based):" + index + " is greater than NUMBER_OF_RECORDS:" + NUMBER_OF_RECORDS);
+      }
+
+      T val = records.get(index);
+      if (val == null) {
+         val = (T) factory.create(index);
+         for (Object obj : getElementPath()) {
+            val.getElementPath().add(obj);
+         }
+         records.put(index, val);
+      }
+      return val;
+   }
+
+   @Override
+   public void addPath(Object... objs) {
+      for (Object obj : objs) {
+         getElementPath().add(obj);
+      }
+      getElementPath().add(this.getName());
+   }
+
+   @Override
+   public void put(int index, RecordElement newRecord) {
+      records.put(index, (T) newRecord);
+   }
+
+   @Override
+   public int length() {
+      return this.NUMBER_OF_RECORDS;
+   }
+
+   public MessageData getMessageData() {
+      return messageData;
+   }
+
+   public RecordMap<T> switchRecordMapMessages(Collection<? extends Message<?,?,?>> messages) {
+      for (RecordElement element : this.records.values()) {
+         element.switchMessages(messages);
+      }
+
+      return this;
+   }
+
+   //   public <U extends Message<? extends ITestEnvironmentMessageSystemAccessor, ? extends MessageData, U>> RecordMap<T> switchMessages(Collection<U> messages) {
+   //	      for (RecordElement element : this.records.values()) {
+   //	         element.switchMessages(messages);
+   //	      }
+   //
+   //	      return this;
+   //   }
+
+   
+   @Override
+   public RecordMap<T> findElementInMessages(Collection<? extends Message> messages) {
+      for (RecordElement element : this.records.values()) {
+         element.findElementInMessages(messages);
+      }
+      return this;
+   }
+   
+   @Override
+   public RecordMap<T> switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      for (RecordElement element : this.records.values()) {
+         element.switchMessages(messages);
+      }
+      return this;
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asRecordMap(this);
+   }
+
+   public int compareTo(RecordElement o) {
+      return 0;
+   }
+
+   @Override
+   public void zeroize() {
+      super.zeroize();
+      for (int i = 0; i < length(); i++) {
+         get(i).zeroize();
+      }
+   }
+
+   @Override
+   public String getDescriptiveName() {
+      return String.format("%s[0...%d]", getName(), length() - 1);
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java
new file mode 100644
index 0000000..d4f642a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingSignedInteger16Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SignedInteger16Element extends NumericElement<Integer> {
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asSignedInteger16Element(this);
+   }
+
+   public SignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public SignedInteger16Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public SignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public SignedInteger16Element findElementInMessages(Collection<? extends Message> messages) {
+      return (SignedInteger16Element) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   public SignedInteger16Element switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (SignedInteger16Element) super.switchMessages(messages);
+   }
+
+   @Override
+   public String toString(Integer obj) {
+      return obj + "(0x" + Integer.toHexString(obj).toUpperCase() + ")";
+   }
+
+   @Override
+   public void setValue(Integer value) {
+      getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+   }
+
+   @Override
+   public Integer getValue() {
+      return Integer.valueOf(getMsgData().getMem().getSignedInt16(byteOffset, msb, lsb));
+   }
+
+   @Override
+   public Integer valueOf(MemoryResource mem) {
+      return Integer.valueOf(mem.getSignedInt16(byteOffset, msb, lsb));
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, SignedInteger16Element cause, int value) throws InterruptedException {
+      /* check for 0 to begine */
+      check(accessor, 0, 0);
+
+      /* Set the DP1 Mux Signal */
+      cause.set(accessor, value);
+
+      /* Chk Value on DP2 */
+      check(accessor, value, 1000);
+
+      /* Set DP1 to 0 */
+      cause.set(accessor, 0);
+
+      /* Init DP2 Mux to 0 */
+      set(accessor, 0);
+
+      /* Chk Value on DP2 is still set */
+      check(accessor, value, 500);
+
+      /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+      check(accessor, 0, 500);
+
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+      int nonPulsedValue = 0;
+      if (value == 0) {
+         nonPulsedValue = 1;
+      }
+
+      checkPulse(accessor, value, nonPulsedValue);
+
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, int value) {
+      super.set(accessor, value);
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it..
+    * 
+    * @param value The value to set.
+    */
+   public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+      this.set(accessor, value);
+      super.sendMessage();
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.waitForRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+         maxInclusive, milliseconds);
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      return this.waitForNotRange(accessor, minValue, true, maxValue, true, milliseconds);
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      return super.waitForNotRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+         maxInclusive, milliseconds);
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      this.set(accessor, Integer.parseInt(value));
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      return new NonMappingSignedInteger16Element(this);
+   }
+
+   @Override
+   public Integer elementMask(Integer value) {
+      return value;
+   }
+
+   @Override
+   public long getNumericBitValue() {
+      return getValue() & 0xFFFFFFFFL;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/StringElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/StringElement.java
new file mode 100644
index 0000000..a394adb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/StringElement.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * 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.message.elements;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.condition.EmptyStringCondition;
+import org.eclipse.osee.ote.message.condition.StringTrimCondition;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingStringElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class StringElement extends DiscreteElement<String> {
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      visitor.asStringElement(this);
+   }
+
+   public StringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+   }
+
+   public StringElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public StringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public StringElement findElementInMessages(Collection<? extends Message> messages) {
+      return (StringElement) super.findElementInMessages(messages);
+   }
+   
+   @Override
+   public StringElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+      return (StringElement) super.switchMessages(messages);
+   }
+
+   @Override
+   public String toString(String obj) {
+      return obj;
+   }
+
+   @Override
+   public void setValue(String value) {
+      getMsgData().getMem().setASCIIString(value, byteOffset, msb, lsb);
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      set(accessor, value);
+   }
+
+   @Override
+   public String getValue() {
+      return getMsgData().getMem().getASCIIString(byteOffset, msb, lsb);
+   }
+
+   /**
+    * copies this elements chars into the given array. The array must be big enough to contain this elements data or an
+    * ArrayIndexOutOfBoundsException will be thrown. Does not exclude or stop on null (\0) characters in the element
+    * data.
+    * 
+    * @param destination the destination array that will receive the char data
+    * @return the actual number of characters copied. The destination array will contain undefined data starting at this
+    * index until the end of the char array.
+    * @throws ArrayIndexOutOfBoundsException if the destination array is too small
+    */
+   public int getChars(char[] destination) throws ArrayIndexOutOfBoundsException {
+      return getMsgData().getMem().getASCIIChars(byteOffset, msb, lsb, destination);
+   }
+
+   public void setChars(final char[] data) {
+      final int sizeInBytes = (lsb - msb + 1) / 8;
+      if (data.length > sizeInBytes) {
+         OseeLog.log(getClass(), Level.WARNING,
+            "char[] passed to setChars() is bigger than the element, setting with subset of passed data");
+      } else if (data.length < sizeInBytes) {
+         OseeLog.log(getClass(), Level.WARNING,
+            "char[] passed to setChars() is smaller than element, setting subset of element");
+      }
+      MemoryResource memory = getMsgData().getMem();
+      final int bytesToSet = Math.min(data.length, sizeInBytes);
+      for (int i = 0; i < bytesToSet; i++) {
+         memory.setByte(data[i], byteOffset + i, 0, 7);
+      }
+   }
+
+   public boolean equals(String other) {
+      return getMsgData().getMem().asciiEquals(byteOffset, msb, lsb, other);
+   }
+
+   @Override
+   public String valueOf(MemoryResource mem) {
+      return mem.getASCIIString(byteOffset, msb, lsb);
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkTrimWhiteSpace(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+      if (accessor == null) {
+         throw new NullPointerException("The parameter accessor is null");
+      }
+
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+         new MethodFormatter().add(value).add(milliseconds), getMessage());
+      final StringTrimCondition c = new StringTrimCondition(this, value);
+
+      MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+      CheckPoint passFail =
+         new CheckPoint(getFullName(), toString(value), toString(c.getLastCheckValue()), result.isPassed(),
+            result.getElapsedTime());
+
+      accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+
+      accessor.getLogger().methodEnded(accessor);
+      return passFail.isPass();
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it..
+    * 
+    * @param value The value to set.
+    */
+   public void setAndSend(ITestEnvironmentAccessor accessor, String value) {
+      parseAndSet(accessor, value);
+      super.sendMessage();
+   }
+
+   @Override
+   protected NonMappingStringElement getNonMappingElement() {
+      return new NonMappingStringElement(this);
+   }
+
+   @Override
+   public void zeroize() {
+      int sizeInBytes = (lsb - msb + 1) / 8;
+      getMsgData().getMem().zeroizeFromOffset(byteOffset, sizeInBytes);
+   }
+
+   public boolean isEmpty() {
+      return new EmptyStringCondition(this).check();
+   }
+
+   public boolean checkEmpty(ITestAccessor accessor, int milliseconds) throws InterruptedException {
+      if (accessor == null) {
+         throw new NullPointerException("The parameter accessor is null");
+      }
+
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(), new MethodFormatter().add(milliseconds),
+         getMessage());
+      final EmptyStringCondition c = new EmptyStringCondition(this);
+
+      MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+      CheckPoint passFail =
+         new CheckPoint(getFullName(), "Empty", result.isPassed() ? "Empty" : "Not Empty", result.isPassed(),
+            result.getElapsedTime());
+
+      accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+
+      accessor.getLogger().methodEnded(accessor);
+      return passFail.isPass();
+   }
+
+   public boolean checkMaintainEmpty(ITestAccessor accessor, int milliseconds) throws InterruptedException {
+      if (accessor == null) {
+         throw new NullPointerException("The parameter accessor is null");
+      }
+
+      accessor.getLogger().methodCalledOnObject(accessor, getFullName(), new MethodFormatter().add(milliseconds),
+         getMessage());
+      final EmptyStringCondition c = new EmptyStringCondition(this);
+
+      MsgWaitResult result = getMessage().waitForCondition(accessor, c, true, milliseconds);
+      CheckPoint passFail =
+         new CheckPoint(getFullName(), "Empty", result.isPassed() ? "Empty" : "Not Empty", result.isPassed(),
+            result.getElapsedTime());
+
+      accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+
+      accessor.getLogger().methodEnded(accessor);
+      return passFail.isPass();
+   }
+
+   @Override
+   public String elementMask(String value) {
+      return value;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java
new file mode 100644
index 0000000..78f0895
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java
@@ -0,0 +1,910 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.CharElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingCharElement extends CharElement {
+
+   public NonMappingCharElement(CharElement element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingCharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingCharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public NonMappingCharElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, CharElement cause, char value) throws InterruptedException {
+
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, char value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, char value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, char minValue, char maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, char value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, char value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, char minValue, char maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minimum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean checkNot(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean check(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the string starting at the element is not set to "value".
+    * 
+    * @param value Expected value
+    * @return if the check passed
+    */
+   @Override
+   public boolean checkNot(ITestAccessor accessor, String value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the string starting at the element is not set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value
+    * @return if the check passed
+    */
+   @Override
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the string starting at the element is set to "value".
+    * 
+    * @param value Expected value
+    * @return if the check passed
+    */
+   @Override
+   public boolean check(ITestAccessor accessor, String value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the string starting at the element is set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value
+    * @return if the check passed
+    */
+   @Override
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public char checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed
+    */
+   public char checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   @Override
+   public Character get(ITestEnvironmentAccessor accessor) {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Returns the string of length "stringLength" starting as the position of the element.
+    * 
+    * @param stringLength the length of the string to return
+    * @return the string starting with this element
+    */
+   @Override
+   public String getString(ITestEnvironmentAccessor accessor, int stringLength) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   /**
+    * Sets the element and the next ("value".length() -1) bytes to "value".charAt().
+    * 
+    * @param value the string to set the bytes to
+    */
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) {
+
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Sets the element and the next ("value".length() -1) bytes to "value".charAt(). <b>No Log Record gets created in
+    * the Script Log File.</b>
+    * 
+    * @param value the string to set the bytes to
+    */
+   @Override
+   public void setNoLog(ITestEnvironmentAccessor accessor, String value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, char value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Sets the element to the "value" passed and immediately sends the message that contains it.
+    * 
+    * @param value The value to set.
+    */
+   public void setAndSend(ITestEnvironmentAccessor accessor, char value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Sets the element to the "value" passed. <b>No Log Record gets created in the Script Log File.</b>
+    * 
+    * @param value The value to set.
+    */
+   public void setNoLog(ITestEnvironmentAccessor accessor, char value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char waitForNotRange(ITestEnvironmentAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char waitForNotRange(ITestEnvironmentAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char waitForRange(ITestEnvironmentAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char waitForRange(ITestEnvironmentAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public char waitNotValue(ITestEnvironmentAccessor accessor, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value found. Either value expected or value found at timeout.
+    */
+   public char waitForValue(ITestEnvironmentAccessor accessor, char value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   /**
+    * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value found. Either value expected or value found at timeout.
+    */
+   @Override
+   protected String waitForValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+
+      throwNoMappingElementException();
+      return null;
+   }
+
+   /**
+    * Waits until the element does not equal the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value found. Either value expected or value found at timeout.
+    */
+   @Override
+   protected String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public void setValue(Character value) {
+
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public Character getValue() {
+      throwNoMappingElementException();
+      return ' ';
+   }
+
+   @Override
+   public String toString(Character obj) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java
new file mode 100644
index 0000000..738ba7e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.condition.IDiscreteElementCondition;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.EmptyEnum_Element;
+import org.eclipse.osee.ote.message.elements.IElementVisitor;
+import org.eclipse.osee.ote.message.enums.EmptyEnum;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+public class NonMappingEmptyEnumElement extends EmptyEnum_Element {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingEmptyEnumElement(EmptyEnum_Element element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingEmptyEnumElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingEmptyEnumElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public NonMappingEmptyEnumElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   @Override
+   public void checkForwarding(ITestAccessor accessor, EmptyEnum_Element cause, EmptyEnum value) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public EmptyEnum elementMask(EmptyEnum value) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum get(ITestEnvironmentAccessor accessor) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   protected Element getNonMappingElement() {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum getValue() {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, EmptyEnum enumeration) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setValue(EmptyEnum obj) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public String toString(EmptyEnum obj) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum valueOf(MemoryResource mem) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public void visit(IElementVisitor visitor) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, EmptyEnum[] list, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, EmptyEnum[] list) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public EmptyEnum checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum[] list, boolean isInList, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainNotNT(ITestAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainNotRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainNT(ITestAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum checkMaintainRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkNotNT(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkNotRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum pulsedValue, EmptyEnum nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean checkNT(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public int compareTo(DiscreteElement<EmptyEnum> o) {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   @Override
+   public EmptyEnum get() {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum getNoLog() {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public void set(EmptyEnum value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void set(ITestEnvironmentAccessor accessor, EmptyEnum value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setNoLog(EmptyEnum value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setNoLog(ITestEnvironmentAccessor accessor, EmptyEnum value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public synchronized void toggle(ITestEnvironmentAccessor accessor, EmptyEnum value1, EmptyEnum value2, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public String toString() {
+      throwNoMappingElementException();
+      return "non mapping empty enum";
+   }
+
+   @Override
+   public String valueOf() {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum waitForList(ITestAccessor accessor, EmptyEnum[] list, boolean isInList, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum waitForNotRange(ITestEnvironmentAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum waitForNotValue(ITestEnvironmentAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum waitForRange(ITestEnvironmentAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public EmptyEnum waitForValue(ITestEnvironmentAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   protected CheckPoint waitWithCheckPoint(ITestAccessor accessor, CheckGroup checkGroup, String expected, IDiscreteElementCondition<EmptyEnum> condition, boolean maintain, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java
new file mode 100644
index 0000000..02e8f81
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java
@@ -0,0 +1,381 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingEnumeratedElement<T extends Enum<T> & IEnumValue<T>> extends EnumeratedElement<T> {
+
+   public NonMappingEnumeratedElement(EnumeratedElement<T> element) {
+      this(element.getMessage(), element.getElementName(), element.getEnumClass(), element.getMsgData(),
+         element.getByteOffset(), element.getMsb(), element.getLsb());
+
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingEnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+      super(msg, elementName, clazz, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+   }
+
+   public NonMappingEnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(msg, elementName, clazz, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingEnumeratedElement(Message message, String elementName, Class<T> clazz, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, clazz, messageData, bitOffset, bitLength);
+   }
+
+   /**
+    * Verifies that the element is set to a value IN or NOT IN the "list" passed. "wantInList" determines if checking
+    * for IN the list or NOT.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param wantInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+    * test for IN the "list".
+    * @param list List of values to check for
+    * @return if check passed
+    */
+   @Override
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, T[] list) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value IN or NOT IN the "list" passed. "isInList" determines if checking for
+    * IN the list or NOT.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param isInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+    * test for IN the "list".
+    * @param list List of values to check for
+    * @param milliseconds Number of milliseconds to wait
+    * @return if check passed
+    */
+   @Override
+   public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, T[] list, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value in (or not in as determined by "isInList") the list for the entire
+    * time passed into milliseconds.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param list The list of values to check against
+    * @param isInList If the value is expected to be in or not in the "list"
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public T checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   /**
+    * Waits until the element is set to a value either in or not in the "list" as determined by "isInList".
+    * 
+    * @param list The list of values to check against
+    * @param isInList If the value is expected to be in or not in the "list"
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public T waitForList(ITestAccessor accessor, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a time-out.
+    * 
+    * @param enumeration The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public T waitForNotValue(ITestEnvironmentAccessor accessor, T enumeration, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   /**
+    * Sets the element to the first enumeration for the wait time and then it sets it to the second
+    * enumeration.
+    * 
+    */
+   public void toggle(ITestEnvironmentAccessor accessor, T enumeration1, T enumeration2, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   /**
+    * Returns the current value of the element.
+    * 
+    * @return The current value of the element.
+    */
+   public T get(ITestEnvironmentAccessor accessor) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param enumeration The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, T enumeration) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, T enumeration) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   /**
+    * Waits until the element is set to a value not in the "list" passed
+    * 
+    * @param list The list of values to check against
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForNotInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   /**
+    * Waits until the element is set to a value in the "list" passed
+    * 
+    * @param list The list of values to check against
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public T waitForInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is
+    *           going to log then the reference to the CheckGroup must be passed and this method
+    *           will add the result of the check to the group with out logging a point.
+    *           <p>
+    *           If an outside method is not going to log the check then a <b>null </b> reference
+    *           should be passed and this method will log the test point.
+    * @param enumeration Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T enumeration) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is
+    *           going to log then the reference to the CheckGroup must be passed and this method
+    *           will add the result of the check to the group with out logging a point.
+    *           <p>
+    *           If an outside method is not going to log the check then a <b>null </b> reference
+    *           should be passed and this method will log the test point.
+    * @param enumeration value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T enumeration) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is
+    *           going to log then the reference to the CheckGroup must be passed and this method
+    *           will add the result of the check to the group with out logging a point.
+    *           <p>
+    *           If an outside method is not going to log the check then a <b>null </b> reference
+    *           should be passed and this method will log the test point.
+    * @param enumeration Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of
+    * "milliseconds" passed. Passes if at any point with in the time allowed, the element is set to
+    * a value other than "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is
+    *           going to log then the reference to the CheckGroup must be passed and this method
+    *           will add the result of the check to the group with out logging a point.
+    *           <p>
+    *           If an outside method is not going to log the check then a <b>null </b> reference
+    *           should be passed and this method will log the test point.
+    * @param enumeration value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into
+    * "milliseconds". Returns value found that caused failure or last value observed if time
+    * expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is
+    *           going to log then the reference to the CheckGroup must be passed and this method
+    *           will add the result of the check to the group with out logging a point.
+    *           <p>
+    *           If an outside method is not going to log the check then a <b>null </b> reference
+    *           should be passed and this method will log the test point.
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public T checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   /**
+    * Verifies that the element is set to a value other than the "value" passed for the entire time
+    * passed into "milliseconds". Returns value found that caused failure or last value observed if
+    * time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is
+    *           going to log then the reference to the CheckGroup must be passed and this method
+    *           will add the result of the check to the group with out logging a point.
+    *           <p>
+    *           If an outside method is not going to log the check then a <b>null </b> reference
+    *           should be passed and this method will log the test point.
+    * @return last value observed
+    */
+   public T checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   @Override
+   public void checkPulse(ITestAccessor accessor, T value) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   protected T toEnum(int intValue) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public T[] getEnumValues() {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+
+   @Override
+   public void setbyEnumIndex(int index) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setValue(T obj) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public String toString(T obj) {
+      throwNoMappingElementException();
+      return super.toString(obj);
+   }
+
+   @Override
+   public String valueOf() {
+      throwNoMappingElementException();
+      return super.valueOf();
+   }
+
+   @Override
+   public T valueOf(MemoryResource otherMem) {
+      throwNoMappingElementException();
+      return super.valueOf(otherMem);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java
new file mode 100644
index 0000000..84975d8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.FixedPointElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingFixedPointElement extends FixedPointElement {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingFixedPointElement(FixedPointElement element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), 0, false, element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, resolution, signed, byteOffset, msb, lsb);
+   }
+
+   public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double minVal, boolean signed, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, resolution, minVal, signed, byteOffset, msb, lsb);
+   }
+
+   public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, resolution, signed, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double minVal, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, resolution, minVal, signed, byteOffset, msb, lsb, originalLsb,
+         originalMsb);
+   }
+
+   public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double minVal, boolean signed, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, resolution, minVal, signed, bitOffset, bitLength);
+   }
+
+   @Override
+   public void checkForwarding(ITestAccessor accessor, FixedPointElement cause, double value) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * @return Returns the minVal.
+    */
+   @Override
+   public double getMinVal() {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * @return Returns the resolution.
+    */
+   @Override
+   public double getResolution() {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * @return Returns the signed.
+    */
+   @Override
+   public boolean isSigned() {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java
new file mode 100644
index 0000000..e6beb91
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingFloat32Element extends Float32Element {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingFloat32Element(Float32Element element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingFloat32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingFloat32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public NonMappingFloat32Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   @Override
+   public void checkForwarding(ITestAccessor accessor, Float32Element cause, double value) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java
new file mode 100644
index 0000000..4b9d83d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingFloat64Element extends Float64Element {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingFloat64Element(Float64Element element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingFloat64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingFloat64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   public NonMappingFloat64Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   @Override
+   public void checkForwarding(ITestAccessor accessor, Float64Element cause, double value) throws InterruptedException {
+      throwNoMappingElementException();
+
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java
new file mode 100644
index 0000000..ee796e7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java
@@ -0,0 +1,841 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingIntegerElement extends IntegerElement {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingIntegerElement(IntegerElement element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingIntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public NonMappingIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public String toString(Integer obj) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   @Override
+   public void setValue(Integer value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public Integer getValue() {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   @Override
+   public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public int checkMaintain(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public int checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed
+    */
+   public int checkMaintainNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed
+    */
+   public int checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   // /**
+   // * Verifies that the element is set to a value within the range specified for the entire time
+   // specified. Assumes range is inclusive.
+   // *
+   //   // * @param minValue The minimum value of the range.
+   // * @param maxValue The maximum value of the range.
+   // * @param milliseconds Number of milliseconds to wait before failing.
+   // * @return last value observed
+   //   // */
+   // public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int
+   // milliseconds) throws InterruptedException {
+   // return checkMaintainRange(accessor, (CheckGroup)null, minValue, true, maxValue, true,
+   // milliseconds);}
+   //
+   // /**
+   // * Verifies that the element is set to a value within the range specified for the entire time
+   // specified.
+   // *
+   //   // * @param minValue The minimum value of the range.
+   // * @param minInclusive If the minumum value of the range is inclusive.
+   // * @param maxValue The maximum value of the range.
+   // * @param maxInclusive If the maximum value of the range is inclusive.
+   // * @param milliseconds Number of milliseconds to wait before failing.
+   // * @return last value observed
+   //   // */
+   // public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int
+   // maxValue, boolean maxInclusive,
+   // int milliseconds) throws InterruptedException {
+   // return checkMaintainRangeBase(accessor, (CheckGroup)null, minValue, minInclusive, maxValue,
+   // maxInclusive, milliseconds);
+   // }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Returns the current value of the element.
+    * 
+    * @return The current value of the element.
+    */
+   @Override
+   public Integer get(ITestEnvironmentAccessor accessor) {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void setNoLog(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value found. Either value expected or value found at timeout.
+    */
+   public int waitForValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java
new file mode 100644
index 0000000..a5988bb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java
@@ -0,0 +1,831 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingLongIntegerElement extends LongIntegerElement {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingLongIntegerElement(LongIntegerElement element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingLongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingLongIntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public NonMappingLongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public void setValue(Long value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public Long getValue() {
+      throwNoMappingElementException();
+      return 0L;
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public int checkMaintain(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public int checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed
+    */
+   public int checkMaintainNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed
+    */
+   public int checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   // /**
+   // * Verifies that the element is set to a value within the range specified for the entire time
+   // specified. Assumes range is inclusive.
+   // *
+   //   // * @param minValue The minimum value of the range.
+   // * @param maxValue The maximum value of the range.
+   // * @param milliseconds Number of milliseconds to wait before failing.
+   // * @return last value observed
+   //   // */
+   // public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int
+   // milliseconds) throws InterruptedException {
+   // return checkMaintainRange(accessor, (CheckGroup)null, minValue, true, maxValue, true,
+   // milliseconds);}
+   //
+   // /**
+   // * Verifies that the element is set to a value within the range specified for the entire time
+   // specified.
+   // *
+   //   // * @param minValue The minimum value of the range.
+   // * @param minInclusive If the minumum value of the range is inclusive.
+   // * @param maxValue The maximum value of the range.
+   // * @param maxInclusive If the maximum value of the range is inclusive.
+   // * @param milliseconds Number of milliseconds to wait before failing.
+   // * @return last value observed
+   //   // */
+   // public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int
+   // maxValue, boolean maxInclusive,
+   // int milliseconds) throws InterruptedException {
+   // return checkMaintainRangeBase(accessor, (CheckGroup)null, minValue, minInclusive, maxValue,
+   // maxInclusive, milliseconds);
+   // }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Returns the current value of the element.
+    * 
+    * @return The current value of the element.
+    */
+   @Override
+   public Long get(ITestEnvironmentAccessor accessor) {
+      throwNoMappingElementException();
+      return 0L;
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, long value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void setNoLog(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value found. Either value expected or value found at timeout.
+    */
+   public int waitForValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java
new file mode 100644
index 0000000..c72f475
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingRecordElement extends RecordElement {
+
+   public NonMappingRecordElement(RecordElement element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getBitLength());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingRecordElement(Message message, String elementName, int index, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
+      super(message, elementName, index, messageData, firstRecordBitOffset, recordBitSize);
+   }
+
+   public NonMappingRecordElement(RecordElement message, String elementName, int offset, MessageData messageData, int firstRecordByteOffset, int recordByteSize) {
+      super(message, elementName, offset, messageData, firstRecordByteOffset, recordByteSize);
+   }
+
+   public NonMappingRecordElement(Message message, String elementName, MessageData messageData, int firstRecordByteOffset, int recordByteSize) {
+      super(message, elementName, messageData, firstRecordByteOffset, recordByteSize);
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+
+   public int compareTo(RecordElement o) {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java
new file mode 100644
index 0000000..be36e91
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java
@@ -0,0 +1,844 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingSignedInteger16Element extends IntegerElement {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingSignedInteger16Element(SignedInteger16Element element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingSignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingSignedInteger16Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public NonMappingSignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   /**
+    * Checks that this element correctly forwards a message sent from cause with the value passed.
+    * 
+    * @param cause The originator of the signal
+    * @param value The value sent by cause and being forwarded by this element
+    */
+   @Override
+   public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value
+    * @return if the check passed
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is NOT set to "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against
+    * @return if the check passed
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive. Therefore observed value may not equal either of the range values.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * This function will verify that this signal is pulsed for 2 cycles.
+    * 
+    * @param value The value to be checked
+    */
+   public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+    * @return if the check passed
+    */
+   public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+    * inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+    * inclusive or not.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+    * @return if the check passed
+    */
+   public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public int checkMaintain(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   public int checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @return last value observed
+    */
+   public int checkMaintainNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed
+    */
+   public int checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   // /**
+   // * Verifies that the element is set to a value within the range specified for the entire time
+   // specified. Assumes range is inclusive.
+   // *
+   //   // * @param minValue The minimum value of the range.
+   // * @param maxValue The maximum value of the range.
+   // * @param milliseconds Number of milliseconds to wait before failing.
+   // * @return last value observed
+   //   // */
+   // public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int
+   // milliseconds) throws InterruptedException {
+   // return checkMaintainRange(accessor, (CheckGroup)null, minValue, true, maxValue, true,
+   // milliseconds);}
+   //
+   // /**
+   // * Verifies that the element is set to a value within the range specified for the entire time
+   // specified.
+   // *
+   //   // * @param minValue The minimum value of the range.
+   // * @param minInclusive If the minumum value of the range is inclusive.
+   // * @param maxValue The maximum value of the range.
+   // * @param maxInclusive If the maximum value of the range is inclusive.
+   // * @param milliseconds Number of milliseconds to wait before failing.
+   // * @return last value observed
+   //   // */
+   // public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int
+   // maxValue, boolean maxInclusive,
+   // int milliseconds) throws InterruptedException {
+   // return checkMaintainRangeBase(accessor, (CheckGroup)null, minValue, minInclusive, maxValue,
+   // maxInclusive, milliseconds);
+   // }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+    * range is inclusive.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Verifies that the element is set to a value within the range specified for the entire time specified.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Returns the current value of the element.
+    * 
+    * @return The current value of the element.
+    */
+   @Override
+   public Integer get(ITestEnvironmentAccessor accessor) {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void set(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Sets the element to the "value" passed.
+    * 
+    * @param value The value to set.
+    */
+   public void setNoLog(ITestEnvironmentAccessor accessor, int value) {
+      throwNoMappingElementException();
+   }
+
+   /**
+    * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value found. Either value expected or value found at timeout.
+    */
+   public int waitForValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   public int waitForNotValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param maxValue The maximum value of the range.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   /**
+    * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+    * 
+    * @param minValue The minimum value of the range.
+    * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+    * to the range value.
+    * @param maxValue The maximum value of the range.
+    * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+    * to the range value.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+
+   @Override
+   public Integer getValue() {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+   @Override
+   public void setValue(Integer value) {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public Integer valueOf(MemoryResource mem) {
+      throwNoMappingElementException();
+      return 0;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java
new file mode 100644
index 0000000..6bb5c7e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * 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.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingStringElement extends StringElement {
+
+   /**
+    * Copy constructor.
+    */
+   public NonMappingStringElement(StringElement element) {
+      super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+         element.getMsb(), element.getLsb());
+      for (Object obj : element.getElementPath()) {
+         this.getElementPath().add(obj);
+      }
+   }
+
+   public NonMappingStringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb);
+   }
+
+   public NonMappingStringElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+      super(message, elementName, messageData, bitOffset, bitLength);
+   }
+
+   public NonMappingStringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+      super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+   }
+
+   @Override
+   public String get(ITestEnvironmentAccessor accessor) {
+      throwNoMappingElementException();
+      return null;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean checkTrimWhiteSpace(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value Expected value.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+    * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @param value value to test against.
+    * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+    * @return If the check passed.
+    */
+   @Override
+   public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return false;
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed. Either value expected or value found at timeout.
+    */
+   @Override
+   public String checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return "";
+   }
+
+   /**
+    * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+    * value found that caused failure or last value observed if time expires.
+    * 
+    * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+    * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+    * logging a point.
+    * <p>
+    * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+    * will log the test point.
+    * @return last value observed
+    */
+   @Override
+   public String checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return "";
+   }
+
+   /**
+    * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+    * 
+    * @param value The expected value to wait for.
+    * @param milliseconds Number of milliseconds to wait before failing.
+    * @return last value observed
+    */
+   @Override
+   public String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+      throwNoMappingElementException();
+      return "";
+   }
+
+   @Override
+   public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public void setAndSend(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+      throwNoMappingElementException();
+   }
+
+   @Override
+   public boolean isNonMappingElement() {
+      return true;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/DataType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/DataType.java
new file mode 100644
index 0000000..5f9bdbb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/DataType.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.message.enums;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.interfaces.INamespace;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface DataType extends Serializable, INamespace {
+
+   String name();
+
+   int getToolingDepth();
+
+   int getToolingBufferSize();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java
new file mode 100644
index 0000000..ae5c182
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/EmptyEnum.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.message.enums;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import javax.print.attribute.EnumSyntax;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class EmptyEnum extends EnumBase implements Comparable<EmptyEnum> {
+
+   private static final long serialVersionUID = 1305742348409814145L;
+   private static final HashMap<Integer, EmptyEnum> valuesMap = new HashMap<>(16);
+
+   private final int value;
+
+   private EmptyEnum(int value) {
+      super(value);
+      this.value = value;
+   }
+
+   // public static EmptyEnum getEnum(String str) {
+   // return (EmptyEnum) getEnum(str, stringTable, enumValueTable);
+   // }
+
+   public static EmptyEnum toEnum(int value) {
+      EmptyEnum newValue = valuesMap.get(value);
+      if (newValue == null) {
+         newValue = new EmptyEnum(value);
+         valuesMap.put(value, newValue);
+      }
+      return newValue;
+   }
+
+   //   private static void printTable()
+   //   {
+   //      for( int value : valuesMap.keySet())
+   //      {
+   //         System.out.println(value + " -> " + valuesMap.get(value));
+   //      }
+   //   }
+   public static EmptyEnum toEnum(EnumBase otherEnum) {
+      return toEnum(otherEnum.getValue());
+   }
+
+   @Override
+   protected String[] getStringTable() {
+      List<String> retVal = new LinkedList<>();
+      for (EmptyEnum current : valuesMap.values()) {
+         retVal.add("EMPTY_ENUM_" + current.getValue());
+      }
+      return retVal.toArray(new String[16]);
+   }
+
+   @Override
+   protected EnumSyntax[] getEnumValueTable() {
+      EnumSyntax[] retVal = new EnumSyntax[0];
+      return valuesMap.values().toArray(retVal);
+   }
+
+   @Override
+   public String getName() {
+      return "EMPTY_ENUM_" + getValue();
+   }
+
+   @Override
+   public String toString() {
+      return getName();
+   }
+
+   @Override
+   public int getValue() {
+      return value;
+   }
+
+   @Override
+   public int compareTo(EmptyEnum o) {
+      return value - o.value;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/ADDRESS_TYPE.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/ADDRESS_TYPE.java
new file mode 100644
index 0000000..5f0a443
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/ADDRESS_TYPE.java
@@ -0,0 +1,83 @@
+/*
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public enum ADDRESS_TYPE implements IEnumValue<ADDRESS_TYPE> {
+	
+   IPV4(0),
+   IPV6(1),
+   
+	__UNDEFINED(-99999);
+
+   private int value;
+   private static int maxValue = 0;
+   
+   private static ADDRESS_TYPE[] lbaValues;
+   private static ADDRESS_TYPE[] lookup = null;
+   
+   static {
+	   lbaValues();
+	   if(maxValue < 32000){
+		   lookup = new ADDRESS_TYPE[maxValue + 1];
+		   for(int i = 0; i < lbaValues.length; i++){
+			   lookup[lbaValues[i].value] = lbaValues[i];
+		   }
+	   }
+   }
+   
+   private ADDRESS_TYPE(int value) {
+      this.value = value;
+   }
+   
+   @Override
+   public int getIntValue(){
+      return value;
+   }
+   
+   public static ADDRESS_TYPE toEnum(int value){
+	  	  if(lookup == null){
+		  for(ADDRESS_TYPE myEnum: values()){
+			 if(myEnum.getIntValue() == value){
+			    return myEnum;
+			 }
+		  }
+		  __UNDEFINED.value = value;
+		  return __UNDEFINED;
+	  } else if(value < 0 || value >= lookup.length ){
+		  __UNDEFINED.value = value;
+		  return __UNDEFINED;
+	  } else {
+		  ADDRESS_TYPE enumeration = lookup[value];
+		  if(enumeration == null){
+			  __UNDEFINED.value = value;
+			  return __UNDEFINED;
+		  } else {
+			  return enumeration;
+		  }
+	  }  
+   }
+   
+   @Override
+   public ADDRESS_TYPE getEnum(int value){
+	  return toEnum(value);	  
+   }
+   
+   public static ADDRESS_TYPE[] lbaValues(){
+      if(lbaValues == null){
+      	 int count = 0;
+         lbaValues = new ADDRESS_TYPE[values().length-1];
+         for(ADDRESS_TYPE myEnum: values()){
+			 if(!"__UNDEFINED".equals(myEnum.name())){
+			    lbaValues[count++] = myEnum;
+			    if(myEnum.value > maxValue){
+			    	maxValue = myEnum.value;
+			    }
+			 }
+	  	 }
+      }
+      return lbaValues;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableRequest.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableRequest.java
new file mode 100644
index 0000000..194e796
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableRequest.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class FileAvailableRequest extends OteEventMessage {
+   public static final int _BYTE_SIZE = 250;
+   public static final String _TOPIC = "ote/server/FileAvailableRequest";
+   public static final int _MESSAGE_ID = -1;
+
+   public final StringElement FILE;
+
+   public FileAvailableRequest() {
+      super(FileAvailableRequest.class.getSimpleName(), _TOPIC, _BYTE_SIZE);
+
+      int currentOffset = 0;
+      int bitLength;
+      FILE = new StringElement(this, "FILE", getDefaultMessageData(), currentOffset, bitLength=(8*250)); currentOffset+=bitLength;
+
+      if (currentOffset > _BYTE_SIZE*8) {
+         throw new IllegalStateException("Total size of elements exceeds defined message size");
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableStatus.java
new file mode 100644
index 0000000..7027b47
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableStatus.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class FileAvailableStatus extends OteEventMessage{
+   public static final int _BYTE_SIZE = 251;
+   public static final String _TOPIC = "ote/server/FileAvailableStatus";
+   public static final int _MESSAGE_ID = -1;
+
+   public final StringElement FILE;
+   public final BooleanElement EXISTS;
+
+   public FileAvailableStatus() {
+      super(FileAvailableRequest.class.getSimpleName(), _TOPIC, _BYTE_SIZE);
+
+      int currentOffset = 0;
+      int bitLength;
+      FILE = new StringElement(this, "FILE", getDefaultMessageData(), currentOffset, bitLength=(8*250)); currentOffset+=bitLength;
+      EXISTS = new BooleanElement(this, "EXISTS", getDefaultMessageData(), currentOffset, bitLength=1); currentOffset+=bitLength;
+
+      if (currentOffset > _BYTE_SIZE*8) {
+         throw new IllegalStateException("Total size of elements exceeds defined message size");
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/MyObjectInputStream.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/MyObjectInputStream.java
new file mode 100644
index 0000000..caf4936
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/MyObjectInputStream.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.message.event;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
+
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+
+public class MyObjectInputStream extends ObjectInputStream {
+
+   @SuppressWarnings({ "unchecked", "rawtypes" })
+   @Override
+   public Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
+      try {
+         return ExportClassLoader.getInstance().loadClass(desc.getName());
+      } catch (Exception e) {
+      }
+      return super.resolveClass(desc);
+   }
+
+   public MyObjectInputStream(InputStream in) throws IOException {
+      super(in);
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessage.java
new file mode 100644
index 0000000..ede78c1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessage.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.message.event;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+
+/**
+ * This class is a version of OTEByteMessage used for code that is part of the release.
+ * 
+ *
+ */
+public class OteEventMessage extends Message<MessageSystemTestEnvironment, OteEventMessageData, OteEventMessage>{
+
+   private int currentOffset = 0;
+   
+   private final OteEventMessageData data;
+   
+   public OteEventMessage(String name, String topic, int defaultByteSize) {
+      super(name, defaultByteSize, 0, false, 0, 0);
+      data = new OteEventMessageData(this, topic, defaultByteSize);
+      setDefaultMessageData(data);
+      setMemSource(OteEventMessageType.OTE_EVENT_MESSAGE);
+   }
+   
+   public OteEventMessage(byte[] bytedata) {
+	  super("holder", 0, 0, false, 0, 0);
+	  data = new OteEventMessageData(this, bytedata.length);
+      data.getMem().setData(bytedata);
+	  setDefaultMessageData(data);
+      setMemSource(OteEventMessageType.OTE_EVENT_MESSAGE);
+   }
+
+   public OteEventMessageHeader getHeader(){
+	   return getDefaultMessageData().getMsgHeader();
+   }
+   
+   protected <T extends Enum<T> & IEnumValue<T>> EnumeratedElement<T> createEnumeratedElement(String name, int size, Class<T> clazz) {
+      EnumeratedElement<T> el = new EnumeratedElement<>(this, name, clazz, getDefaultMessageData(), currentOffset, 0, size*8-1);
+      currentOffset+=size;
+      return el;
+   }
+   
+   protected IntegerElement createIntegerElement(String string, int size) {
+      IntegerElement el = new IntegerElement(this, string, getDefaultMessageData(), currentOffset, 0, size*8-1);
+      currentOffset+=size;
+      return el;
+   }
+
+   protected ArrayElement createArrayElement(String string, int size) {
+      ArrayElement el = new ArrayElement(this, string, getDefaultMessageData(), currentOffset, 0, size*8-1);
+      currentOffset+=size;
+      return el;
+   }
+   
+   public static int sizeBytesBits(int size){
+      return 8*size-1;
+   }
+   
+   public void setResponse(OteEventMessage msg){
+      getHeader().RESPONSE_ID.setValue(msg.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageData.java
new file mode 100644
index 0000000..3f44975
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageData.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * 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.message.event;
+
+import org.eclipse.osee.ote.message.data.IMessageDataVisitor;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+
+public class OteEventMessageData extends MessageData{
+   
+   private final OteEventMessageHeader header;
+   
+   public OteEventMessageData(OteEventMessage msg, String topic, int dataByteSize) {
+      super(msg.getName(), OteEventMessageHeader.HEADER_SIZE + dataByteSize, OteEventMessageHeader.HEADER_SIZE, OteEventMessageType.OTE_EVENT_MESSAGE);
+      this.header = new OteEventMessageHeader(msg, topic, 0, getMem().slice(0, OteEventMessageHeader.HEADER_SIZE));
+   }
+   
+   public OteEventMessageData(OteEventMessage msg, int dataByteSize) {
+	   super("default", OteEventMessageHeader.HEADER_SIZE + dataByteSize, OteEventMessageHeader.HEADER_SIZE, OteEventMessageType.OTE_EVENT_MESSAGE);
+	   this.header = new OteEventMessageHeader(msg, "", 0, getMem().slice(0, OteEventMessageHeader.HEADER_SIZE));
+   }
+
+@Override
+   public OteEventMessageHeader getMsgHeader() {
+      return header;
+   }
+
+   @Override
+   public void initializeDefaultHeaderValues() {
+   }
+
+   @Override
+   public int getPayloadSize() {
+      return super.getDefaultDataByteSize() - OteEventMessageHeader.HEADER_SIZE;
+   }
+
+	@Override
+	public void visit(IMessageDataVisitor visitor) {
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageHeader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageHeader.java
new file mode 100644
index 0000000..cdfc448
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageHeader.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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.message.event;
+
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+
+import org.eclipse.osee.ote.message.IMessageHeader;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class OteEventMessageHeader implements IMessageHeader{
+
+   public static final int HEADER_SIZE = 164+53; 
+   public static final int MARKER_VALUE = 0xFADE;
+   private final HeaderData headerData;
+   private final Object[] paths;
+
+   public final IntegerElement MARKER;
+   public final StringElement TOPIC;
+   public final IntegerElement MESSAGE_ID;
+   public final IntegerElement MESSAGE_SEQUENCE_NUMBER;
+   public final LongIntegerElement UUID_LOW;
+   public final LongIntegerElement UUID_HIGH;
+   public final IntegerElement TTL;
+   public final StringElement RESPONSE_TOPIC;
+   public final IntegerElement RESPONSE_ID;
+   public final SOCKET_ADDRESS_RECORD ADDRESS;   
+   
+   private final String name;
+
+   public OteEventMessageHeader(OteEventMessage msg, String topic, int messageId, MemoryResource data) {
+     this.name = msg.getName();
+     headerData = new HeaderData("OteEventMessageHeader", data);
+      paths = new Object[]{(msg == null ? "message" : msg.getClass().getName()), "HEADER(OteEventMessageHeader)"};
+      MARKER = new IntegerElement(msg, "MARKER", headerData, 0, 0, 15);
+      TOPIC = new StringElement(msg, "TOPIC", headerData, 2, 0, 8*96);
+      MESSAGE_ID = new IntegerElement(msg, "MESSAGE_ID", headerData, 66+32, 0, 31);
+      MESSAGE_SEQUENCE_NUMBER = new IntegerElement(msg, "MESSAGE_ID", headerData, 66+32, 0, 31);
+      UUID_LOW = new LongIntegerElement(msg, "UUID_LOW", headerData, 74+32, 0, 63);
+      UUID_HIGH = new LongIntegerElement(msg, "UUID_HIGH", headerData, 82+32, 0, 63);
+      TTL = new IntegerElement(msg, "TTL", headerData, 90+32, 0, 31);
+      RESPONSE_TOPIC = new StringElement(msg, "TOPIC", headerData, 94+32, 0, 8*64);
+      RESPONSE_ID = new IntegerElement(msg, "RESPONSE_ID", headerData, 158+32, 0, 31);
+      ADDRESS = new SOCKET_ADDRESS_RECORD(msg, "ADDRESS", headerData, 164+32, 0, SOCKET_ADDRESS_RECORD.SIZE*8-1);
+
+      TOPIC.setValue(topic);
+      MARKER.setValue(MARKER_VALUE);
+      MESSAGE_ID.setValue(messageId);
+      addElement(MARKER);
+      addElement(TOPIC);
+      addElement(MESSAGE_ID);
+   }
+   
+   private <T extends Element> T addElement(T instance) {
+      instance.addPath(paths);
+      return instance;
+   }
+
+   @Override
+   public int getHeaderSize() {
+      return HEADER_SIZE;
+   }
+
+   @Override
+   public byte[] getData() {
+      return headerData.toByteArray();
+   }
+
+   @Override
+   public Element[] getElements() {
+      return new Element[]{MARKER, TOPIC};
+   }
+
+   @Override
+   public void setNewBackingBuffer(byte[] data) {
+      headerData.setNewBackingBuffer(data);
+   }
+
+   @Override
+   public String toXml() {
+      StringBuilder builder = new StringBuilder(256);
+      builder.append("<OteEventMessageHeader> ").
+         append("MARKER=\"").append(MARKER.getValue()).append("\" ").
+         append("TOPIC=\"").append(TOPIC.getValue()).append("\" ").
+         append("MESSAGE_ID=\"").append(MESSAGE_ID.getValue()).append("\" ").
+      append("</OteEventMessageHeader>");
+      return builder.toString();
+   }
+
+   @Override
+   public String getMessageName() {
+      return name;
+   }
+
+   public InetSocketAddress getSourceInetSocketAddress() throws UnknownHostException {
+      return new InetSocketAddress(ADDRESS.getAddress(), ADDRESS.getPort());
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageType.java
new file mode 100644
index 0000000..496a85a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageType.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.message.event;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public enum OteEventMessageType implements DataType {
+   OTE_EVENT_MESSAGE(2, 2048);
+
+   private final int depth;
+   private final int bufferSize;
+
+   private OteEventMessageType(int depth, int bufferSize) {
+      this.depth = depth;
+      this.bufferSize = bufferSize;
+   }
+
+   @Override
+   public int getToolingBufferSize() {
+      return bufferSize;
+   }
+
+   @Override
+   public int getToolingDepth() {
+      return depth;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageUtil.java
new file mode 100644
index 0000000..f3e9213
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageUtil.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * 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.message.event;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class OteEventMessageUtil {
+	
+	public final static String BYTE_KEY = "oteeventbytes";
+	
+	public final static String BYTE_KEY_2 = "bytes";
+	
+	private static EventAdmin eventAdmin;
+	
+	private static EventAdmin getEventAdmin(){
+	   if(eventAdmin == null){
+	      eventAdmin = ServiceUtility.getService(EventAdmin.class);
+	   }
+	   return eventAdmin;
+	}
+	
+   public static void sendEvent(OteEventMessage message) {
+      sendEvent(message, getEventAdmin());
+   }
+   
+   public static void postEvent(OteEventMessage message) {
+      postEvent(message, getEventAdmin());
+   }
+
+   public static void sendEvent(OteEventMessage message, EventAdmin eventAdmin) {
+      message.getHeader().UUID_HIGH.setNoLog((long) 0x0);
+      message.getHeader().UUID_LOW.setNoLog((long) 0x0);
+      Map<String, Object> data = new HashMap<>();
+      data.put(BYTE_KEY, message.getData());
+      Event newevent = new Event(message.getHeader().TOPIC.getValue(), data);
+      eventAdmin.sendEvent(newevent);
+   }
+   
+   public static void postEvent(OteEventMessage message, EventAdmin eventAdmin) {
+      message.getHeader().UUID_HIGH.setNoLog((long) 0x0);
+      message.getHeader().UUID_LOW.setNoLog((long) 0x0);
+      Map<String, Object> data = new HashMap<>();
+      data.put(BYTE_KEY, message.getData());
+      Event newevent = new Event(message.getHeader().TOPIC.getValue(), data);
+      eventAdmin.postEvent(newevent);
+   }
+   
+   public static void sendEvent(OteEventMessage message, OteUdpEndpointSender sender) throws InterruptedException {
+      sender.send(message);
+   }
+   
+   public static void postEvent(OteEventMessage message, OteUdpEndpointSender sender) throws InterruptedException {
+      sender.send(message);
+   }
+
+   public static UUID getUUID(OteEventMessage msg) {
+      return new UUID(msg.getHeader().UUID_HIGH.getValue(), msg.getHeader().UUID_LOW.getValue());
+   }
+   
+   public static UUID getUUID(byte[] data) {
+      long low = getLong(data, 74);
+      long high = getLong(data, 82);
+      return new UUID(high, low);
+   }
+
+   private static long getLong(byte[] data, int index){
+      return
+      (long)(0xff & data[index]) << 56  |
+      (long)(0xff & data[index+1]) << 48  |
+      (long)(0xff & data[index+2]) << 40  |
+      (long)(0xff & data[index+3]) << 32  |
+      (long)(0xff & data[index+4]) << 24  |
+      (long)(0xff & data[index+5]) << 16  |
+      (long)(0xff & data[index+6]) << 8   |
+      (long)(0xff & data[index+7]) << 0;
+   }
+   
+   public static void setUUID(OteEventMessage msg, UUID id) {
+      msg.getHeader().UUID_HIGH.setValue(id.getMostSignificantBits());
+      msg.getHeader().UUID_LOW.setValue(id.getLeastSignificantBits());
+   }
+
+   public static OteEventMessage getOteEventMessage(Event event) {
+      Object obj = event.getProperty(BYTE_KEY);
+      if (obj != null && obj instanceof byte[]) {
+         return new OteEventMessage((byte[]) obj);
+      } else {
+         obj = event.getProperty(BYTE_KEY_2);
+         if(obj != null && obj instanceof byte[]){
+            return new OteEventMessage((byte[]) obj);
+         }
+      }
+      return null;
+   }
+   
+   public static byte[] getBytes(Event event) {
+      Object obj = event.getProperty(BYTE_KEY);
+      if (obj != null && obj instanceof byte[]) {
+         return (byte[]) obj;
+      } else {
+         obj = event.getProperty(BYTE_KEY_2);
+         if (obj != null && obj instanceof byte[]) {
+            return (byte[]) obj;
+         }
+         return null;
+      }
+   }
+
+   public static void putBytes(Event event, OteEventMessage signal) {
+      signal.getDefaultMessageData().getMem().setData(getBytes(event));
+   }
+
+   public static ServiceRegistration<EventHandler> subscribe(String topic, EventHandler handler){
+      Dictionary<String, String> props = new Hashtable<>();
+      props.put("event.topics", topic);
+      return ServiceUtility.getContext().registerService(EventHandler.class, handler, props);
+   }
+   
+   public static ServiceRegistration<EventHandler> subscribe(OteEventMessage signal, EventHandler eventHandler) {
+      BundleContext context = ServiceUtility.getContext();
+      if (context == null) {
+         return null;
+      }
+      Hashtable<String, Object> props = new Hashtable<>();
+      props.put("event.topics", signal.getHeader().TOPIC.getValue());
+      return context.registerService(EventHandler.class, eventHandler, props);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SOCKET_ADDRESS_RECORD.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SOCKET_ADDRESS_RECORD.java
new file mode 100644
index 0000000..bd3d88a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SOCKET_ADDRESS_RECORD.java
@@ -0,0 +1,67 @@
+package org.eclipse.osee.ote.message.event;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+
+public class SOCKET_ADDRESS_RECORD extends ArrayElement{
+
+   public static final int SIZE = 21;
+   
+   private final EnumeratedElement<ADDRESS_TYPE> type;   
+   private final ArrayElement ipaddress;
+   private final IntegerElement port;
+   
+   public SOCKET_ADDRESS_RECORD(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+      super(msg, elementName, messageData, byteOffset, msb, lsb);
+      
+      type = new EnumeratedElement<>(msg, "type", ADDRESS_TYPE.class, messageData, byteOffset, 0, 7);
+      ipaddress = new ArrayElement(msg, "ipaddress", messageData, byteOffset + 1, 0, 8*16-1);
+      port = new IntegerElement(msg, "port",  messageData, ipaddress.getByteOffset() + 16, 0, 31);
+   }
+
+   public void setAddress(InetAddress address){
+      byte[] bytes = address.getAddress();
+      
+      if(bytes.length == 4){
+         type.setValue(ADDRESS_TYPE.IPV4);
+      } else {
+         type.setValue(ADDRESS_TYPE.IPV6);
+      }
+      
+      ipaddress.zeroize();
+      for(int i = 0; i < bytes.length; i++){
+         ipaddress.setValue(i, bytes[i]);
+      }
+   }
+   
+   public InetAddress getAddress() throws UnknownHostException{
+      byte[] bytes = null;
+      if(type.getValue() == ADDRESS_TYPE.IPV4){
+         bytes = new byte[4];
+         for(int i = 0; i < 4; i++){
+            bytes[i] = ipaddress.getValue(i);
+         }
+      } else {
+         bytes = new byte[16];
+         for(int i = 0; i < 6; i++){
+            bytes[i] = ipaddress.getValue(i);
+         }
+      }
+      return InetAddress.getByAddress(bytes);
+   }
+   
+   public int getPort(){
+      return port.getValue();
+   }
+   
+   public void setPort(int port){
+      this.port.setValue(port);
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SerializedClassMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SerializedClassMessage.java
new file mode 100644
index 0000000..eda4166
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SerializedClassMessage.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.message.event;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+
+public class SerializedClassMessage<T> extends OteEventMessage {
+
+	public static final int _BYTE_SIZE = 0;
+
+	public ArrayElement OBJECT;
+
+	public SerializedClassMessage(String topic) {
+		super(SerializedClassMessage.class.getSimpleName(), topic, _BYTE_SIZE);
+		OBJECT = new ArrayElement(this, "CLAZZ", getDefaultMessageData(), 0, 0, 0);
+		addElements(OBJECT);
+	}
+	
+
+	public SerializedClassMessage(String topic, Serializable object) throws IOException {
+		this(topic);
+		setObject(object);
+	}
+	
+	public SerializedClassMessage(byte[] bytes) {
+		super(bytes);
+		OBJECT = new ArrayElement(this, "CLAZZ", getDefaultMessageData(), 0, 0, 0);
+		addElements(OBJECT);
+	}
+
+	public void setObject(Serializable obj) throws IOException{
+		ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		GZIPOutputStream gos = new GZIPOutputStream(bos);
+		ObjectOutputStream oos = new ObjectOutputStream(gos);
+		oos.writeObject(obj);
+		oos.close();
+		byte[] data = bos.toByteArray();
+		int offset = OBJECT.getByteOffset() + getHeaderSize();
+		byte[] newData = new byte[data.length + offset];
+		System.arraycopy(getData(), 0, newData, 0, offset);
+		System.arraycopy(data, 0, newData, offset, data.length);
+		getDefaultMessageData().setNewBackingBuffer(newData);
+	}
+	
+	@SuppressWarnings("unchecked")
+   public T getObject() throws IOException, ClassNotFoundException{
+		int offset = OBJECT.getByteOffset() + getHeaderSize();
+		ByteArrayInputStream bis = new ByteArrayInputStream(getData(), offset, getData().length - offset);
+		GZIPInputStream gis = new GZIPInputStream(bis);
+		MyObjectInputStream ois = new MyObjectInputStream(gis);
+		try{
+		   Object obj = ois.readObject();
+		   return (T)obj;
+		} finally {
+		   ois.close();
+		}
+	}
+	
+}  
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEndpointSendEventMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEndpointSendEventMessage.java
new file mode 100644
index 0000000..cb12d80
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEndpointSendEventMessage.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * 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.message.event.send;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.internal.message.event.send.NotifyOnResponse;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageFutureImpl;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageFutureMultipleResponseImpl;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageResponseFutureImpl;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class OteEndpointSendEventMessage {
+
+   private final OteUdpEndpoint endpoint;
+   private final Lock lock;
+   private final Condition responseReceived;
+   private final InetSocketAddress destination;
+
+   public OteEndpointSendEventMessage(OteUdpEndpoint eventAdmin, InetSocketAddress destination){
+      this.endpoint = eventAdmin;
+      this.destination = destination;
+      lock = new ReentrantLock();
+      responseReceived = lock.newCondition();
+   }
+
+   /**
+    * sends a message and returns immediately
+    */
+   public void asynchSend(OteEventMessage message) {
+      updateHeaderInfo(message);
+      endpoint.getOteEndpointThreadedSender(destination).send(message);
+   }
+
+   /**
+    * Registers for a callback of the given message type as specified by the RESPONSE_TOPIC element in the sent message
+    * and the class type passed in, then sends the given message and returns immediately.  The returned value can be used to
+    * wait for the response using waitForCompletion().  The callback expects you to handle both the response and the timeout case.
+    *
+    * @param clazz - Type of OteEventMessage for the response
+    * @param message - message to send
+    * @param callable - callback executed when the response is recieved or if a timeout occurs or called immediately after the send if
+    *                   no response is expected
+    * @param timeout - amount of time in milliseconds to wait for response before calling timeout on the passed in OteEventMessageCallable
+    * @return   <T extends OteEventMessage> Future<T> - a future that contains the response message
+    */
+   public <T extends OteEventMessage, R extends OteEventMessage> OteEventMessageFuture<T, R> asynchSendAndResponse(Class<R> clazz, T message, OteEventMessageCallable<T, R> callable, long timeout){
+      int responseId = updateHeaderInfo(message);
+      String responseTopic = message.getHeader().RESPONSE_TOPIC.getValue();
+      OteEventMessageFutureImpl<T, R> response = new OteEventMessageFutureImpl<>(clazz, callable, message, responseTopic, responseId, timeout);
+      endpoint.getOteEndpointThreadedSender(destination).send(message);
+      return response;
+   }
+
+   /**
+    * Registers for a callback of the given message type as specified by the RESPONSE_TOPIC element in the sent message
+    * and the class type passed in, then sends the given message and returns immediately.  The returned value can be used to
+    * wait for the response using waitForCompletion().  The callback expects you to handle both the response and the timeout case and to determine
+    * when the appropriate number of responses has been received, by specifying it is complete.
+    *
+    * @param clazz - Type of OteEventMessage for the response
+    * @param message - message to send
+    * @param callable - callback executed when the response is recieved or if a timeout occurs or called immediately after the send if
+    *                   no response is expected
+    * @param timeout - amount of time in milliseconds to wait for response before calling timeout on the passed in OteEventMessageCallable
+    * @return   <T extends OteEventMessage> Future<T> - a future that contains the response message
+    */
+   public <T extends OteEventMessage, R extends OteEventMessage> OteEventMessageFuture<T, R> asynchSendAndMultipleResponse(Class<R> clazz, T message, OteEventMessageCallable<T, R> callable, long timeout){
+      int responseId = updateHeaderInfo(message);
+      String responseTopic = message.getHeader().RESPONSE_TOPIC.getValue();
+      OteEventMessageFutureImpl<T, R> response = new OteEventMessageFutureMultipleResponseImpl<>(clazz, callable, message, responseTopic, responseId, timeout);
+      endpoint.getOteEndpointThreadedSender(destination).send(message);
+      return response;
+   }
+
+   /**
+    * Registers for a callback of the given message type and topic.
+    *
+    * @param clazz - Type of OteEventMessage for the response
+    * @param callable - callback executed when the response is recieved
+    * @return   a future that you should cancel when done listening so resources can be cleaned up.
+    */
+   public <R extends OteEventMessage> OteEventMessageResponseFuture<R> asynchResponse(Class<R> clazz, String topic, OteEventMessageResponseCallable<R> callable){
+      OteEventMessageResponseFutureImpl<R> response = new OteEventMessageResponseFutureImpl<>(clazz, callable, topic);
+      return response;
+   }
+
+   /**
+    * Sends a message and waits for a response.
+    *
+    * @param class - return type
+    * @param message - message to send
+    * @param timeout - timeout in milliseconds
+    * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+    *          message specified by the RESPONSE_TOPIC field in the passed in message header.
+    * @throws Exception
+    */
+   public <T extends OteEventMessage> T synchSendAndResponse(Class<T> clazz, String responseTopic, OteEventMessage message, long timeout) throws OTEException {
+      lock.lock();
+      try{
+         int responseId = updateHeaderInfo(message);
+         message.getHeader().RESPONSE_TOPIC.setValue(responseTopic);
+         NotifyOnResponse<T> response = new NotifyOnResponse<>(clazz, responseTopic, responseId, lock, responseReceived);
+         try{
+            endpoint.getOteEndpointThreadedSender(destination).send(message);
+            long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+            while(nanos > 0 && !response.hasResponse()) {
+               try {
+                  nanos = responseReceived.awaitNanos(nanos);
+               } catch (InterruptedException e) {
+                  e.printStackTrace();
+               }
+            }
+         } finally {
+            response.dispose();
+         }
+         return response.getMessage();
+      } finally {
+         lock.unlock();
+      }
+   }
+
+   /**
+    * Sends a message and waits for a response.
+    *
+    * @param T - response Message to populate type
+    * @param message - message to send
+    * @param timeout - timeout in milliseconds
+    * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+    *          message specified by the RESPONSE_TOPIC field in the passed in message header.
+    * @throws Exception
+    */
+   public <T extends OteEventMessage> T synchSendAndResponse(T responseMessage, OteEventMessage sendMessage, long timeout) throws OTEException {
+      lock.lock();
+      try{
+         int responseId = updateHeaderInfo(sendMessage);
+         sendMessage.getHeader().RESPONSE_TOPIC.setValue(responseMessage.getHeader().TOPIC.getValue());
+         NotifyOnResponse<T> response = new NotifyOnResponse<>(responseMessage, responseId, lock, responseReceived);
+         try{
+            endpoint.getOteEndpointThreadedSender(destination).send(sendMessage);
+            long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+            while(nanos > 0 && !response.hasResponse()) {
+               try {
+                  nanos = responseReceived.awaitNanos(nanos);
+               } catch (InterruptedException e) {
+                  e.printStackTrace();
+               }
+            }
+         } finally {
+            response.dispose();
+         }
+         return response.getMessage();
+      } finally {
+         lock.unlock();
+      }
+   }
+
+
+   /**
+    * Increment the sequence number and set the source InetSocketAddress
+    *
+    * @param message
+    * @return returns the sequence number that was set
+    */
+   private int updateHeaderInfo(OteEventMessage message){
+      int responseId = message.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue();
+      if(responseId >= Integer.MAX_VALUE){
+         responseId = 1;
+      } else {
+         responseId++;
+      }
+      message.getHeader().MESSAGE_SEQUENCE_NUMBER.setValue(responseId);
+
+      message.getHeader().ADDRESS.setAddress(endpoint.getLocalEndpoint().getAddress());
+      message.getHeader().ADDRESS.setPort(endpoint.getLocalEndpoint().getPort());
+      return responseId;
+   }
+
+   /**
+    * Sends a message and waits for a response without creating a sender thread
+    *
+    * @param T - response Message to populate type
+    * @param message - message to send
+    * @param timeout - timeout in milliseconds
+    * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+    *          message specified by the RESPONSE_TOPIC field in the passed in message header.
+    * @throws Exception
+    */
+   public <T extends OteEventMessage> T synchSendAndResponseInline(T responseMessage, OteEventMessage sendMessage, long timeout) {
+      lock.lock();
+      try{
+         int responseId = updateHeaderInfo(sendMessage);
+         sendMessage.getHeader().RESPONSE_TOPIC.setValue(responseMessage.getHeader().TOPIC.getValue());
+         NotifyOnResponse<T> response = new NotifyOnResponse<>(responseMessage, responseId, lock, responseReceived);
+         try{
+            endpoint.getOteEndpointInlineSender(destination).send(sendMessage);
+            long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+            while(nanos > 0 && !response.hasResponse()) {
+               try {
+                  nanos = responseReceived.awaitNanos(nanos);
+               } catch (InterruptedException e) {
+                  e.printStackTrace();
+               }
+            }
+         } finally {
+            response.dispose();
+         }
+         return response.getMessage();
+      } finally {
+         lock.unlock();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageCallable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageCallable.java
new file mode 100644
index 0000000..fc9a2b8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageCallable.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.message.event.send;
+
+public interface OteEventMessageCallable<T,R> {
+
+   void timeout(T transmitted);
+   
+   void call(T transmitted, R recieved, OteEventMessageFuture<?, ?> future);
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageFuture.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageFuture.java
new file mode 100644
index 0000000..6b7a461
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageFuture.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+
+
+public interface OteEventMessageFuture<T extends OteEventMessage, R extends OteEventMessage> {
+
+   void cancel();
+   
+   void waitForCompletion();
+   
+   public boolean isDone();
+   
+   public boolean isTimedOut();
+   
+   public boolean gotResponse();
+
+   void complete();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseCallable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseCallable.java
new file mode 100644
index 0000000..6c14cd0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseCallable.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.message.event.send;
+
+public interface OteEventMessageResponseCallable<R> {
+
+   void call(R received);
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseFuture.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseFuture.java
new file mode 100644
index 0000000..5467847
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseFuture.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public interface OteEventMessageResponseFuture<R extends OteEventMessage> {
+
+   void cancel();
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteSendEventMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteSendEventMessage.java
new file mode 100644
index 0000000..5a834eb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteSendEventMessage.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * 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.message.event.send;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.internal.message.event.send.NotifyOnResponse;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageFutureImpl;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageResponseFutureImpl;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.service.event.EventAdmin;
+
+public class OteSendEventMessage {
+
+   private final EventAdmin eventAdmin;
+   private final Lock lock;
+   private final Condition responseReceived;
+   
+   public OteSendEventMessage(EventAdmin eventAdmin){
+      this.eventAdmin = eventAdmin;
+      lock = new ReentrantLock();
+      responseReceived = lock.newCondition();
+   }
+   
+   /**
+    * sends a message and returns immediately
+    */
+   public void asynchSend(OteEventMessage message) {
+      incrementSequenceNumber(message);
+      OteEventMessageUtil.postEvent(message, eventAdmin);
+   }
+   
+   /**
+    * Registers for a callback of the given message type as specified by the RESPONSE_TOPIC element in the sent message 
+    * and the class type passed in, then sends the given message and returns immediately.  The returned value can be used to 
+    * wait for the response using waitForCompletion().  The callback expects you to handle both the response and the timeout case. 
+    * 
+    * @param clazz - Type of OteEventMessage for the response
+    * @param message - message to send
+    * @param callable - callback executed when the response is recieved or if a timeout occurs or called immediately after the send if 
+    *                   no response is expected
+    * @param timeout - amount of time in milliseconds to wait for response before calling timeout on the passed in OteEventMessageCallable
+    * @return   <T extends OteEventMessage> Future<T> - a future that contains the response message
+    */
+   public <T extends OteEventMessage, R extends OteEventMessage> OteEventMessageFuture<T, R> asynchSendAndResponse(Class<R> clazz, T message, OteEventMessageCallable<T, R> callable, long timeout){
+      int responseId = incrementSequenceNumber(message);
+      String responseTopic = message.getHeader().RESPONSE_TOPIC.getValue();
+      OteEventMessageFutureImpl<T, R> response = new OteEventMessageFutureImpl<>(clazz, callable, message, responseTopic, responseId, timeout);
+      OteEventMessageUtil.postEvent(message, eventAdmin);
+      return response;
+   }
+   
+   /**
+    * Registers for a callback of the given message type and topic. 
+    * 
+    * @param clazz - Type of OteEventMessage for the response
+    * @param callable - callback executed when the response is recieved
+    * @return   a future that you should cancel when done listening so resources can be cleaned up.
+    */
+   public <R extends OteEventMessage> OteEventMessageResponseFuture<R> asynchResponse(Class<R> clazz, String topic, OteEventMessageResponseCallable<R> callable){
+      OteEventMessageResponseFutureImpl<R> response = new OteEventMessageResponseFutureImpl<>(clazz, callable, topic);
+      return response;
+   }
+   
+   /**
+    * Sends a message and waits for a response.
+    * 
+    * @param class - return type
+    * @param message - message to send 
+    * @param timeout - timeout in milliseconds
+    * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the 
+    *          message specified by the RESPONSE_TOPIC field in the passed in message header.
+    * @throws Exception 
+    */
+   public <T extends OteEventMessage> T synchSendAndResponse(Class<T> clazz, String responseTopic, OteEventMessage message, long timeout) throws OTEException {
+      lock.lock();
+      try{
+         int responseId = incrementSequenceNumber(message);
+         message.getHeader().RESPONSE_TOPIC.setValue(responseTopic);
+         NotifyOnResponse<T> response = new NotifyOnResponse<>(clazz, responseTopic, responseId, lock, responseReceived);
+         try{
+            OteEventMessageUtil.postEvent(message, eventAdmin);
+            long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+            while(nanos > 0 && !response.hasResponse()) {
+               try {
+                  nanos = responseReceived.awaitNanos(nanos);
+               } catch (InterruptedException e) {
+                  e.printStackTrace();
+               }
+            }
+         } finally {
+            response.dispose();
+         }
+         return response.getMessage();
+      } finally {
+         lock.unlock();
+      }
+   }
+   
+   /**
+    * Sends a message and waits for a response.
+    * 
+    * @param T - response Message to populate type
+    * @param message - message to send 
+    * @param timeout - timeout in milliseconds
+    * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the 
+    *          message specified by the RESPONSE_TOPIC field in the passed in message header.
+    * @throws Exception 
+    */
+   public <T extends OteEventMessage> T synchSendAndResponse(T responseMessage, OteEventMessage sendMessage, long timeout) throws OTEException {
+      lock.lock();
+      try{
+         int responseId = incrementSequenceNumber(sendMessage);
+         sendMessage.getHeader().RESPONSE_TOPIC.setValue(responseMessage.getHeader().TOPIC.getValue());
+         NotifyOnResponse<T> response = new NotifyOnResponse<>(responseMessage, responseId, lock, responseReceived);
+         try{
+            OteEventMessageUtil.postEvent(sendMessage, eventAdmin);
+            long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+            while(nanos > 0 && !response.hasResponse()) {
+               try {
+                  nanos = responseReceived.awaitNanos(nanos);
+               } catch (InterruptedException e) {
+                  e.printStackTrace();
+               }
+            }
+         } finally {
+            response.dispose();
+         }
+         return response.getMessage();
+      } finally {
+         lock.unlock();
+      }
+   }
+
+   
+   
+   private int incrementSequenceNumber(OteEventMessage message){
+      int responseId = message.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue();
+      if(responseId >= Integer.MAX_VALUE){
+         responseId = 1;
+      } else {
+         responseId++;
+      }
+      message.getHeader().MESSAGE_SEQUENCE_NUMBER.setValue(responseId);
+      return responseId;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java
new file mode 100644
index 0000000..a40a419
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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.message.instrumentation;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class BaseIOInstrumentation implements IOInstrumentation {
+
+   private final List<InetSocketAddress> addresses;
+   private final DatagramChannel channel;
+
+   public BaseIOInstrumentation() throws IOException {
+      addresses = new ArrayList<>();
+      channel = DatagramChannel.open();
+      channel.configureBlocking(true);
+
+   }
+
+   @Override
+   public void command(byte[] cmd) {
+   }
+
+   @Override
+   public void register(InetSocketAddress address) {
+      if (address == null) {
+         throw new IllegalArgumentException("address cannot be null");
+      }
+      addresses.add(address);
+   }
+
+   @Override
+   public void unregister(InetSocketAddress address) {
+      addresses.remove(address);
+   }
+
+   public void send(byte[] bytes) {
+      send(ByteBuffer.wrap(bytes));
+   }
+
+   public void send(byte[] bytes, int offset, int length) {
+      send(ByteBuffer.wrap(bytes, offset, length));
+   }
+
+   public void send(ByteBuffer bytes) {
+      bytes.mark();
+      int size = addresses.size();
+      for (int i = 0; i < size; i++) {
+         try {
+            channel.send(bytes, addresses.get(i));
+            bytes.reset();
+         } catch (Exception ex) {
+            OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex.toString(), ex);
+         }
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java
new file mode 100644
index 0000000..ed0f72f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.message.instrumentation;
+
+import java.net.InetSocketAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOInstrumentation extends Remote {
+
+   void register(InetSocketAddress address) throws RemoteException;
+
+   void command(byte[] cmd) throws RemoteException;
+
+   void unregister(InetSocketAddress address) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java
new file mode 100644
index 0000000..2ad899c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.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.message.interfaces;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageManager<T extends MessageData, U extends Message<? extends ITestEnvironmentMessageSystemAccessor, T, U>> {
+   void destroy();
+
+   <CLASSTYPE extends U> CLASSTYPE createMessage(Class<CLASSTYPE> messageClass) throws TestException;
+
+   <CLASSTYPE extends U> int getReferenceCount(CLASSTYPE classtype);
+
+   <CLASSTYPE extends U> CLASSTYPE findInstance(Class<CLASSTYPE> clazz, boolean writer);
+
+   Collection<U> getAllMessages();
+
+   Collection<U> getAllReaders();
+
+   Collection<U> getAllWriters();
+
+   Collection<U> getAllReaders(DataType type);
+
+   Collection<U> getAllWriters(DataType type);
+
+   void init() throws Exception;
+
+   void publishMessages(boolean publish);
+
+   boolean isPhysicalTypeAvailable(DataType physicalType);
+
+   IMessageRequestor<T, U> createMessageRequestor(String name);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java
new file mode 100644
index 0000000..aa51bef
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.message.interfaces;
+
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageRequestor<T extends MessageData, U extends Message<? extends ITestEnvironmentMessageSystemAccessor, T, U>> {
+   <CLASSTYPE extends U> CLASSTYPE getMessageReader(Class<CLASSTYPE> type) throws TestException;
+
+   <CLASSTYPE extends U> CLASSTYPE getMessageWriter(Class<CLASSTYPE> type) throws TestException;
+
+   String getName();
+
+   void remove(U message) throws TestException;
+
+   void dispose();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java
new file mode 100644
index 0000000..12b9896
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.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.message.interfaces;
+
+import org.eclipse.osee.ote.message.Message;
+
+/**
+ * @author Andy Jury
+ */
+public interface IMessageScheduleChangeListener {
+
+   public void onRateChanged(Message<?, ?, ?> message, double oldRate, double newRate);
+
+   public void isScheduledChanged(boolean isScheduled);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java
new file mode 100644
index 0000000..5779093
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.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.message.interfaces;
+
+import java.net.InetSocketAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public interface IMsgToolServiceClient extends Remote {
+   InetSocketAddress getAddressByType(String messageName, DataType memType) throws RemoteException;
+
+   void changeRate(String msgName, double rate) throws RemoteException;
+
+   void changeIsScheduled(String msgName, boolean isScheduled) throws RemoteException;
+
+   UUID getTestSessionKey() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/INamespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/INamespace.java
new file mode 100644
index 0000000..71764b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/INamespace.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * 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.message.interfaces;
+
+public interface INamespace {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java
new file mode 100644
index 0000000..59c8ed4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.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.message.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageReader {
+   void set(byte[] data);
+
+   byte[] get();
+
+   void set(IOSEEMessageWriterListener listener);
+
+   void takeNextSample();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java
new file mode 100644
index 0000000..039f77f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.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.message.interfaces;
+
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageReaderListener extends IOSEEMessageListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java
new file mode 100644
index 0000000..3ccf8c0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.message.interfaces;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageWriter {
+   void set(byte[] data);
+
+   byte[] get();
+
+   void set(IOSEEMessageWriterListener listener);
+
+   void send() throws MessageSystemException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java
new file mode 100644
index 0000000..c4b03a1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.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.message.interfaces;
+
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageWriterListener extends IOSEEMessageListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java
new file mode 100644
index 0000000..a149430
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.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.message.interfaces;
+
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.Set;
+
+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.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.message.tool.rec.IMessageEntryFactory;
+
+/**
+ * defines the operations clients can request of a remote message manager service
+ * 
+ * @author Andrew M. Finkbeiner
+ */
+public interface IRemoteMessageService {
+
+   void unsubscribeToMessage(UnSubscribeToMessage cmd);
+
+   /**
+    * Sets a message element to a specified value
+    */
+   void setElementValue(SetElementValue cmd);
+
+   void zeroizeElement(ZeroizeElement cmd);
+
+   /**
+    * Notifies service to send message updates to the specified ip address
+    */
+   SubscriptionDetails subscribeToMessage(SubscribeToMessage cmd);
+
+   Set<? extends DataType> getAvailablePhysicalTypes();
+
+   boolean startRecording(RecordCommand cmd);
+
+   InetSocketAddress getRecorderSocketAddress();
+
+   InetSocketAddress getMsgUpdateSocketAddress();
+
+   void stopRecording();
+
+   void terminateService();
+
+   void reset();
+
+   void setupRecorder(IMessageEntryFactory factory);
+
+   public Map<String, Throwable> getCancelledSubscriptions();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java
new file mode 100644
index 0000000..478a857
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.message.interfaces;
+
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestAccessor extends ITestEnvironmentMessageSystemAccessor {
+   public TestCase getTestCase();
+
+   @Override
+   public TestScript getTestScript();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java
new file mode 100644
index 0000000..b8e4de0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.message.interfaces;
+
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentMessageSystem extends ITestEnvironment {
+
+   @Override
+   void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+   @Override
+   void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java
new file mode 100644
index 0000000..c3dccb9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.message.interfaces;
+
+import java.util.Set;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentMessageSystemAccessor extends ITestEnvironmentAccessor {
+   IMessageManager getMsgManager();
+
+   boolean isPhysicalTypeAvailable(DataType physicalType);
+
+   Set<? extends DataType> getDataTypes();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/Namespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/Namespace.java
new file mode 100644
index 0000000..9a16f68
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/Namespace.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.message.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Namespace implements INamespace {
+
+   private final String namespace;
+
+   public Namespace(String string) {
+      namespace = string;
+   }
+
+   @Override
+   public String toString() {
+      return namespace;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      Namespace ns = (Namespace) obj;
+      return namespace.equals(ns.namespace);
+   }
+
+   @Override
+   public int hashCode() {
+      return namespace.hashCode();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/internal/MessageIoManagementStarter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/internal/MessageIoManagementStarter.java
new file mode 100644
index 0000000..eb725d5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/internal/MessageIoManagementStarter.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * 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.message.internal;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.message.io.IMessageIoManagementService;
+import org.eclipse.osee.ote.message.io.MessageIoManagementService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageIoManagementStarter extends ServiceTracker {
+
+   private ServiceRegistration registration;
+
+   public MessageIoManagementStarter(BundleContext context) {
+      super(context, TestEnvironmentInterface.class.getName(), null);
+   }
+
+   @Override
+   public synchronized TestEnvironmentInterface addingService(ServiceReference reference) {
+      TestEnvironmentInterface manager = (TestEnvironmentInterface) super.addingService(reference);
+      registration =
+         context.registerService(IMessageIoManagementService.class.getName(), new MessageIoManagementService(), null);
+      return manager;
+   }
+
+   @Override
+   public synchronized void removedService(ServiceReference reference, Object service) {
+	  unregister();
+      super.removedService(reference, service);
+   }
+
+   @Override
+   public synchronized void close() {
+	  unregister();
+      super.close();
+   }
+   
+   private void unregister(){
+	   if (registration != null) {
+		   try{
+			   registration.unregister();
+		   } catch (IllegalStateException ex){
+			   //do nothing, we're just making sure it got cleaned up
+		   } finally {
+			   registration = null;
+		   }
+	   }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoDriver.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoDriver.java
new file mode 100644
index 0000000..d0ff213
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoDriver.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.message.io;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageIoDriver {
+   void start();
+
+   void stop();
+
+   boolean isStarted();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoManagementService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoManagementService.java
new file mode 100644
index 0000000..f288374
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoManagementService.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.message.io;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageIoManagementService {
+
+   void install(IMessageIoDriver ioDriver);
+
+   void uninstall(IMessageIoDriver ioDriver);
+
+   void startIO();
+
+   void stopIO();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/MessageIoManagementService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/MessageIoManagementService.java
new file mode 100644
index 0000000..591f869
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/MessageIoManagementService.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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.message.io;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageIoManagementService implements IMessageIoManagementService {
+
+   private final HashSet<IMessageIoDriver> drivers = new HashSet<>();
+
+   private final Lock lock = new ReentrantLock();
+   private boolean ioStarted = false;
+
+   @Override
+   public void install(IMessageIoDriver ioDriver) {
+      lock.lock();
+      if (!drivers.add(ioDriver)) {
+         // driver was already installed
+         lock.unlock();
+         return;
+      }
+      if (ioStarted) {
+         // make sure we release the lock before entering unknown code
+         lock.unlock();
+         ioDriver.start();
+      } else {
+         lock.unlock();
+      }
+   }
+
+   @Override
+   public void startIO() {
+      lock.lock();
+      ioStarted = true;
+
+      Set<IMessageIoDriver> copiedDrivers = new HashSet<>(drivers);
+      lock.unlock();
+      for (IMessageIoDriver driver : copiedDrivers) {
+         driver.start();
+      }
+
+   }
+
+   @Override
+   public void stopIO() {
+      lock.lock();
+      ioStarted = false;
+      Set<IMessageIoDriver> copiedDrivers = new HashSet<>(drivers);
+      lock.unlock();
+      for (IMessageIoDriver driver : copiedDrivers) {
+         driver.stop();
+      }
+   }
+
+   @Override
+   public void uninstall(IMessageIoDriver ioDriver) {
+      lock.lock();
+      boolean changed = drivers.remove(ioDriver);
+      lock.unlock();
+      if (changed && ioDriver.isStarted()) {
+         ioDriver.stop();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java
new file mode 100644
index 0000000..79fb807
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.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.message.listener;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageListener {
+   void onDataAvailable(MessageData data, DataType type) throws MessageSystemException;
+
+   void onInitListener() throws MessageSystemException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java
new file mode 100644
index 0000000..dd30998
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * 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.message.listener;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Locale;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageListenerTrace;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.TimeTrace;
+import org.eclipse.osee.ote.message.condition.ICondition;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.MsgWaitResult;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IOSEEMessageReaderListener;
+import org.eclipse.osee.ote.message.interfaces.IOSEEMessageWriterListener;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class MessageSystemListener implements IOSEEMessageReaderListener, IOSEEMessageWriterListener, ITimeout {
+   
+   private volatile boolean isTimedOut = false;
+   private int masterMessageCount = 0;
+   private final WeakReference<Message> message;
+   
+   private int messageCount = 0;
+
+   /**
+    * A thread pool for handling slow listeners. We start the pool with 5 threads, which should in most cases be more
+    * than enough threads to handle the listeners. Because the queue is static, it will be shared by all
+    * "slow listeners". Because of the expense of thread creation, we want to avoid creating threads when possible. To
+    * accomplish this, we start with more threads than we think we'll need, and we keep any newly created threads around
+    * for a long period of time. We assume that if we need a lot of threads now, we may continue to need a lot of
+    * threads for an extended period of time.
+    * <p>
+    * We use a SynchronousQueue in order to avoid queueing. We prefer to create a new thread to handle requests if
+    * necessary to help ensure that listeners are notified as quickly as possible and without delays caused by other
+    * listeners.
+    */
+   private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, Integer.MAX_VALUE, 60 * 30,
+      TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
+
+   private final CopyOnWriteNoIteratorList<IOSEEMessageListener> fastListeners = new CopyOnWriteNoIteratorList<>(IOSEEMessageListener.class);
+   private final CopyOnWriteNoIteratorList<IOSEEMessageListener> slowListeners = new CopyOnWriteNoIteratorList<>(IOSEEMessageListener.class);
+   private volatile boolean disposed = false;
+   private MessageListenerTrace timeTrace;
+
+   /**
+    * This class takes in a message in the constructor so that it can tell the message to update when it recieves new
+    * data.
+    */
+   public MessageSystemListener(Message msg) {
+      super();
+      this.message = new WeakReference<>(msg);
+   }
+
+   /**
+    * returns the number of received messages since the last call to waitForData
+    */
+   public synchronized int getLocalMessageCount() {
+      return messageCount;
+   }
+
+   public synchronized int getMasterMessageCount() {
+      return masterMessageCount;
+   }
+
+   /**
+    * return whether new data has been received since the last call to waitForData
+    */
+   @Override
+   public boolean isTimedOut() {
+      return this.isTimedOut;
+   }
+
+   @Override
+   public void setTimeout(boolean timeout) {
+      this.isTimedOut = timeout;
+   }
+
+   public synchronized boolean waitForData() throws InterruptedException {
+      messageCount = 0;
+      if (this.isTimedOut) {
+         return true;
+      }
+      while (messageCount == 0 && !isTimedOut) {
+         wait(); // the test environment will notify us after a specified time out
+      }
+      return isTimedOut;
+   }
+
+   public synchronized boolean waitForMessageNumber(int count) throws InterruptedException {
+      while (masterMessageCount < count) {
+         messageCount = 0;
+         wait();// onDataAvailable
+         if (isTimedOut()) {//we timed out
+            return false;
+         }
+      }
+      return true;
+   }
+
+   public MsgWaitResult waitForCondition(ITestEnvironmentAccessor accessor, ICondition condition, boolean maintain, int milliseconds) throws InterruptedException {
+      long time = 0l;
+      boolean pass;
+      if (milliseconds > 0) {
+         ICancelTimer cancelTimer;
+         synchronized (this) {
+            pass = condition.check();
+            time = accessor.getEnvTime();
+            boolean done = pass ^ maintain;
+            cancelTimer = accessor.setTimerFor(this, milliseconds);
+            while (!done) {
+               if (waitForData()) {
+                  // we timed out
+                  break;
+               } else {
+                  pass = condition.checkAndIncrement();
+                  done = pass ^ maintain;
+               }
+            }
+            time = accessor.getEnvTime() - time;
+         }
+         cancelTimer.cancelTimer();
+      } else {
+         pass = condition.check();
+      }
+      return new MsgWaitResult(time, condition.getCheckCount(), pass);
+   }
+
+   /**
+    * Registers a listener for the message. If the listener will not respond quickly (for example, if the listener is
+    * going to make RMI calls, or other network activites which it will wait for the remote side to respond), then it
+    * should identify itself as a slow listener by passing the SLOW enumeration for listenerSpeed. "Slow" listeners will be 
+    * notified by a separate thread, thereby not forcing other listener notifications to be delayed, and subsequent messages 
+    * from being processed.
+    * 
+    * @param listener - The listener to be added
+    * @param listenerSpeed - An enum that is either FAST/SLOW
+    * @return Returns boolean success indication.
+    */
+   public boolean addListener(IOSEEMessageListener listener, SPEED listenerSpeed) {
+	  CopyOnWriteNoIteratorList c = listenerSpeed == SPEED.FAST ? fastListeners : slowListeners;
+      if (!c.contains(listener)) {
+         c.add(listener);
+      }
+      return true;
+   }
+
+   /**
+    * Adds the listener as a "fast" listener.
+    * 
+    * @see MessageSystemListener#addListener(IOSEEMessageListener, SPEED)
+    */
+   public boolean addListener(IOSEEMessageListener listener) {
+      return addListener(listener, SPEED.FAST);
+   }
+
+   /**
+    * Checks to see if the specified listener is registered
+    * 
+    * @return true if the listener is register false otherwise
+    */
+   public boolean containsListener(final IOSEEMessageListener listener, final SPEED listenerSpeed) {
+      return listenerSpeed.equals(SPEED.FAST) ? fastListeners.contains(listener) : slowListeners.contains(listener);
+   }
+
+   /**
+    * Convience method.
+    * 
+    * @return Returns presence boolean indication.
+    * @see #containsListener(IOSEEMessageListener, SPEED)
+    */
+   public boolean containsListener(final IOSEEMessageListener listener) {
+      return containsListener(listener, SPEED.FAST);
+
+   }
+
+   public boolean removeListener(IOSEEMessageListener listener, SPEED listenerSpeed) {
+
+      return listenerSpeed == SPEED.FAST ? fastListeners.remove(listener) : slowListeners.remove(listener);
+   }
+
+   public boolean removeListener(IOSEEMessageListener listener) {
+      return removeListener(listener, SPEED.FAST) || removeListener(listener, SPEED.SLOW);
+   }
+
+   @Override
+   public synchronized void onDataAvailable(final MessageData data, DataType type) throws MessageSystemException {
+      if(disposed) return;
+      boolean isTimeTrace = timeTrace != null;
+      if(isTimeTrace){
+         timeTrace.addStartNotify();
+      }
+      if (message.get().getMemType() == type) {
+         messageCount++;
+         masterMessageCount++;
+         notifyAll();
+      }
+
+      long start = 0, elapsed;
+      IOSEEMessageListener[] ref = fastListeners.get();
+      for (int i = 0; i < ref.length; i++) {
+         IOSEEMessageListener listener = ref[i];
+         if(isTimeTrace){
+            timeTrace.addStartListener(listener);
+         }
+         listener.onDataAvailable(data, type);
+         if(isTimeTrace){
+            timeTrace.addEndListener(listener);
+         }
+      }
+     
+      ref = slowListeners.get();
+      for (int i = 0; i < ref.length; i++){
+         IOSEEMessageListener listener = ref[i];
+         if(isTimeTrace){
+            timeTrace.addStartListener(listener);
+         }
+         threadPool.execute(new SlowListenerNotifier(listener, data, type, false));
+         if(isTimeTrace){
+            timeTrace.addEndListener(listener);
+         }
+      }
+      if(isTimeTrace){
+         timeTrace.addEndNotify();
+      }
+   }
+
+   @Override
+   public synchronized void onInitListener() throws MessageSystemException {
+      if(disposed) return;
+      IOSEEMessageListener[] ref = fastListeners.get();
+      for (int i = 0; i < ref.length; i++) {
+         IOSEEMessageListener listener = ref[i];
+         listener.onInitListener();
+      }
+      
+      ref = slowListeners.get();
+      for (int i = 0; i < ref.length; i++){
+         IOSEEMessageListener listener = ref[i];
+         threadPool.execute(new SlowListenerNotifier(listener, null, null, true));
+      }
+   }
+
+   /**
+    * Manages the notification of a slow IOSEEMessageListener. The implementation prevents multiple calls into the
+    * listener at the same time.
+    * 
+    * @author David Diepenbrock
+    */
+   private static final class SlowListenerNotifier implements Runnable {
+
+      /**
+       * Indicates if we are performing the onInitListener() call or onDataAvailable() call
+       */
+      private final boolean isOnInit;
+
+      private final IOSEEMessageListener listener;
+
+      private final MessageData data;
+
+      private final DataType type;
+
+      public SlowListenerNotifier(IOSEEMessageListener listener, MessageData data, DataType type, boolean isOnInit) {
+         this.listener = listener;
+         this.data = data;
+         this.type = type;
+         this.isOnInit = isOnInit;
+      }
+
+      @Override
+      public void run() {
+         synchronized (listener) {
+            if (isOnInit) {
+               listener.onInitListener();
+            } else {
+               listener.onDataAvailable(data, type);
+            }
+         }
+      }
+   }
+
+   public Collection<IOSEEMessageListener> getRegisteredFastListeners() {
+      return fastListeners.fillCollection(new ArrayList<IOSEEMessageListener>(fastListeners.length()));
+   }
+
+   public Collection<IOSEEMessageListener> getRegisteredSlowListeners() {
+      return slowListeners.fillCollection(new ArrayList<IOSEEMessageListener>(slowListeners.length()));
+   }
+
+   public void dispose() {
+      this.disposed = true;
+      this.clearListeners();
+   }
+
+   public void clearListeners() {
+      this.fastListeners.clear();
+      this.slowListeners.clear();
+   }
+
+   public synchronized void setMessageListenerTrace(Message message, MessageListenerTrace timeTrace) {
+      this.timeTrace = timeTrace;  
+   }
+
+   public synchronized MessageListenerTrace clearListenerTrace(Message message) {
+      MessageListenerTrace trace = this.timeTrace;
+      this.timeTrace = null;
+      return trace;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/SPEED.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/SPEED.java
new file mode 100644
index 0000000..07c2e1d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/SPEED.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.message.listener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum SPEED {
+   FAST,
+   SLOW
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java
new file mode 100644
index 0000000..49510ef
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.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.message.log.record;
+
+import java.io.File;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class MessageJarConfigrecord extends TestRecord {
+
+   private final String[] jarVersions;
+
+   private static final long serialVersionUID = 6919229589873467398L;
+
+   /**
+    * ScriptConfigRecord Constructor. Constructs test script configuration log message with timestamp.
+    * 
+    * @param script The test script who's configuration is to be recorded.
+    */
+   public MessageJarConfigrecord(TestScript script, String[] jarVersions, Map<String, File> availableJars) {
+      super(script.getTestEnvironment(), Level.CONFIG, script.getClass().getName(), false);
+      this.jarVersions = jarVersions;
+   }
+
+   /**
+    * Convert an element to XML format.
+    * 
+    * @return XML formated config element.
+    */
+   @Override
+   public Element toXml(Document doc) {
+      Element jarConfig = doc.createElement("JarConfig");
+      doc.appendChild(jarConfig);
+
+      for (String version : jarVersions) {
+         Element el = doc.createElement("Jar");
+         el.setTextContent(version);
+         jarConfig.appendChild(el);
+      }
+      return jarConfig;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/AlarmClock.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/AlarmClock.java
new file mode 100644
index 0000000..abd5292
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/AlarmClock.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.message.timer;
+
+import java.util.TimerTask;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class AlarmClock extends TimerTask implements ICancelTimer {
+   private final ITimeout sleeper;
+
+   public AlarmClock(ITimeout sleeper) {
+      super();
+      this.sleeper = sleeper;
+      sleeper.setTimeout(false);
+   }
+
+   /**
+    * @see java.lang.Runnable#run()
+    */
+   @Override
+   public void run() {
+      synchronized (sleeper) {
+         sleeper.notify();
+         sleeper.setTimeout(true);
+      }
+   }
+
+   @Override
+   public void cancelTimer() {
+      this.cancel();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java
new file mode 100644
index 0000000..1f8e8f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.message.timer;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+
+/**
+ * This class is used as a 'Time Out' object while waiting for the desired message element value.
+ * 
+ * @author Ryan D. Brooks
+ */
+public class CycleCountDown implements ICancelTimer {
+   private int cycleCount;
+   private volatile boolean completed; 
+   private final ITimeout objToNotify;
+   private final IScriptControl scriptLock;
+
+   /**
+    * @param objToNotify The Object that is in wait() on which we will call notifyAll()
+    * @param cycleCount The number of cycles to countdown.
+    */
+   public CycleCountDown(IScriptControl scriptLock, ITimeout objToNotify, int cycleCount) {
+      super();
+      this.scriptLock = scriptLock;
+      this.cycleCount = cycleCount;
+      this.objToNotify = objToNotify;
+      this.completed = false;
+      objToNotify.setTimeout(false);
+   }
+
+   /**
+    * @return true if the countdown is complete/canceled, otherwise false
+    */
+   public boolean cycleOccurred() {
+      if (cycleCount == 0 && !completed) {
+         completed = true;
+         synchronized (objToNotify) {
+            objToNotify.setTimeout(true);
+            objToNotify.notifyAll();
+         }
+      }
+      else {
+         cycleCount--;
+      }
+      return completed;
+   }
+
+   @Override
+   public void cancelTimer() {
+      this.completed = true;
+      if (this.scriptLock != null) {
+         this.scriptLock.lock();
+      }
+   }
+  
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/RealTime.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/RealTime.java
new file mode 100644
index 0000000..21c1b4b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/RealTime.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * 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.message.timer;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.ScheduledFuture;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.TimerControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class RealTime extends TimerControl {
+   private final HashMap<EnvironmentTask, ScheduledFuture<?>> handleMap =
+         new HashMap<EnvironmentTask, ScheduledFuture<?>>(32);
+
+   /**
+    * Constructor
+    */
+   public RealTime() {
+      super((Runtime.getRuntime().availableProcessors() + 1) / 2 + 1);
+   }
+
+   @Override
+   public void addTask(final EnvironmentTask task, final TestEnvironment environment) {
+      if (!handleMap.containsKey(task)) {
+         final WeakReference<TestEnvironment> te = new WeakReference<>(environment);
+         final ScheduledFuture<?> handle = schedulePeriodicTask(new Runnable() {
+            final Benchmark bm = new Benchmark(task.getClass().getName() + ":" + task.getHzRate() + "Hz",
+                  (long) (1000000.0 / task.getHzRate()));
+
+            @Override
+            public void run() {
+
+               try {
+                  bm.samplePoint();
+                  if (task.isRunning()) {
+                     task.runOneCycle();
+                  }
+               } catch (Throwable ex) {
+                  ScheduledFuture<?> h = handleMap.get(task);
+                  if (h != null) {
+                     h.cancel(false);
+                  }
+                  te.get().handleException(ex, "exception while running one cycle for task " + task.toString(),
+                        Level.SEVERE, false);
+               }
+            }
+
+         }, 0, (long) Math.rint(1000.0 / task.getHzRate()));
+         handleMap.put(task, handle);
+      }
+   }
+
+   @Override
+   public void removeTask(EnvironmentTask task) {
+      ScheduledFuture<?> handle = handleMap.remove(task);
+      if (handle != null) {
+         handle.cancel(false);
+      }
+   }
+
+   @Override
+   public long getEnvTime() {
+      return System.currentTimeMillis();
+   }
+
+   @Override
+   public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+      synchronized (obj) {
+         obj.wait(milliseconds);
+      }
+   }
+
+   @Override
+   public ICancelTimer setTimerFor(final ITimeout objToNotify, int milliseconds) {
+      objToNotify.setTimeout(false);
+      final ScheduledFuture<?> handle = scheduleOneShotTask(new Runnable() {
+
+         @Override
+         public void run() {
+            synchronized (objToNotify) {
+               objToNotify.setTimeout(true);
+               objToNotify.notifyAll();
+            }
+         }
+      }, milliseconds);
+
+      return new ICancelTimer() {
+
+         @Override
+         public void cancelTimer() {
+            handle.cancel(false);
+         }
+      };
+   }
+
+   @Override
+   public int getCycleCount() {
+      return (int) System.currentTimeMillis() / 20;
+   }
+
+   @Override
+   public void incrementCycleCount() {
+   }
+
+   public List<CycleCountDown> getCycleCounters() {
+      return null;
+   }
+
+   public void setCycleCounters(List<CycleCountDown> cycleCounters) {
+   }
+
+   @Override
+   public void setCycleCount(int cycle) {
+   }
+
+   @Override
+   public void dispose() {
+   }
+
+   @Override
+   public void cancelAllTasks() {
+      for (ScheduledFuture<?> handle : handleMap.values()) {
+         handle.cancel(false);
+      }
+      handleMap.clear();
+   }
+
+   @Override
+   public void step() {
+   }
+
+   @Override
+   public long getTimeOfDay() {
+      return getEnvTime();
+   }
+
+   @Override
+   public boolean isRealtime() {
+      return true;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java
new file mode 100644
index 0000000..2c78d21
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/SimulatedTime.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.message.timer;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.TimerControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+/**
+ * We use a frequency resolution of 300hz.
+ * 
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SimulatedTime extends TimerControl {
+
+   private static final class Task {
+      private final EnvironmentTask task;
+      private final TestEnvironment env;
+
+      public Task(EnvironmentTask task, TestEnvironment env) {
+         super();
+         this.task = task;
+         this.env = env;
+      }
+
+      public void doTask(int cycleCount) {
+         try {
+            task.baseRunOneCycle(cycleCount);
+         } catch (Throwable ex) {
+            OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE,
+                  "Aborting the test script because an Environment Task is failing", ex);
+            env.getRunManager().abort(ex, false);
+         }
+      }
+   }
+   private final Collection<CycleCountDown> cycleCounters;
+   private final Collection<CycleCountDown> scriptCycleCounters;
+   private final IScriptControl scriptControl;
+   private int cycleCount;
+   private final CopyOnWriteArrayList<Task> tasks = new CopyOnWriteArrayList<>();
+
+   private final long sysTime;
+
+   /**
+    * @param scriptControl -
+    */
+   public SimulatedTime(IScriptControl scriptControl) throws IOException {
+      super(3);
+      this.scriptControl = scriptControl;
+      cycleCounters = new HashSet<>(32);
+      scriptCycleCounters = new HashSet<>(32);
+      cycleCount = 0;
+      sysTime = System.currentTimeMillis();
+   }
+
+   @Override
+   public long getEnvTime() {
+      return (long) (cycleCount * 1000.0 / EnvironmentTask.cycleResolution);
+   }
+
+   @Override
+   public ICancelTimer setTimerFor(ITimeout objToNotify, int milliseconds) {
+      CycleCountDown cycleCountDown = new CycleCountDown(scriptControl, objToNotify,
+            (int) Math.rint(milliseconds / (1000.0 / EnvironmentTask.cycleResolution)) - 1);
+      synchronized (cycleCounters) {
+         if(getRunManager().isCurrentThreadScript()){
+            scriptCycleCounters.add(cycleCountDown);
+         } else {
+            cycleCounters.add(cycleCountDown);
+         }
+      }
+
+      unlockScriptControl();
+
+      return cycleCountDown;
+   }
+
+   protected void unlockScriptControl() {
+      try {
+         scriptControl.unlock();
+      } catch (IllegalMonitorStateException ex) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+      }
+   }
+
+   @Override
+   public void addTask(EnvironmentTask envTask, TestEnvironment environment) {
+      for (Task task : tasks) {
+         if (task.task == envTask) {
+            return;
+         }
+      }
+
+      tasks.add(new Task(envTask, environment));
+   }
+
+   @Override
+   public void removeTask(EnvironmentTask task) {
+      Task itemToRemove = null;
+      for (Task t : tasks) {
+         if (t.task == task) {
+            itemToRemove = t;
+            break;
+         }
+      }
+      if (itemToRemove != null) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.FINE, "removing environment task " + task.toString());
+         tasks.remove(itemToRemove);
+      }
+   }
+
+   @Override
+   public void step() {
+
+      for (Task t : tasks) {
+         t.doTask(cycleCount);
+      }
+      incrementCycleCount();
+   }
+
+   @Override
+   public int getCycleCount() {
+      return cycleCount;
+   }
+
+   public Collection<CycleCountDown> getCycleCounters() {
+      return scriptCycleCounters;
+   }
+
+   @Override
+   public void incrementCycleCount() {
+      cycleCount++;
+   }
+
+   @Override
+   public void setCycleCount(int cycle) {
+      cycleCount = cycle;
+   }
+
+   @Override
+   public void cancelAllTasks() {
+      for (Task t : tasks) {
+         t.task.cancel();
+      }
+      tasks.clear();
+   }
+
+   public void removeOccurredCycleCounters() {
+      synchronized (cycleCounters) {
+         Iterator<CycleCountDown> iter = cycleCounters.iterator();
+         while (iter.hasNext()) {
+            CycleCountDown counter = iter.next();
+            if (counter.cycleOccurred()) {
+               iter.remove();
+            }
+         }
+         iter = scriptCycleCounters.iterator();
+         while (iter.hasNext()) {
+            CycleCountDown counter = iter.next();
+            if (counter.cycleOccurred()) {
+               iter.remove();
+            }
+         }
+      }
+   }
+
+   @Override
+   public void dispose() {
+      cycleCounters.clear();
+      scriptCycleCounters.clear();
+      tasks.clear();
+   }
+
+   @Override
+   public long getTimeOfDay() {
+      return sysTime + getEnvTime();
+   }
+
+   @Override
+   public boolean isRealtime() {
+      return false;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java
new file mode 100644
index 0000000..b4e4f35
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.message.tool;
+
+import java.io.IOException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IFileTransferHandle {
+   void stop() throws IOException;
+
+   void addListener(IUdpTransferListener listener);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java
new file mode 100644
index 0000000..302f8f8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.message.tool;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IUdpTransferListener {
+   /**
+    * called by the file transfer handler when a file transfer is complete
+    * 
+    * @param config the transfer configuration
+    */
+   void onTransferComplete(TransferConfig config);
+
+   /**
+    * called when the an error is experienced during transfer operations. The handle for this transfer will be
+    * automatically stopped prior to this method being called
+    */
+   void onTransferException(TransferConfig config, Throwable t);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/MessageMode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/MessageMode.java
new file mode 100644
index 0000000..c87a95d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/MessageMode.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.message.tool;
+
+import java.io.Serializable;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public enum MessageMode implements Serializable {
+   READER,
+   WRITER;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java
new file mode 100644
index 0000000..fdbd070
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.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.message.tool;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class SubscriptionDetails implements Serializable {
+
+   private static final long serialVersionUID = -3968654375167145281L;
+
+   private final SubscriptionKey key;
+   private final byte[] currentData;
+   private final Set<DataType> availableMemTypes;
+
+   public SubscriptionDetails(SubscriptionKey key, byte[] currentData, Set<DataType> availableMemTypes) {
+      this.key = key;
+      this.currentData = currentData;
+      this.availableMemTypes = new HashSet<>(availableMemTypes);
+   }
+
+   public SubscriptionKey getKey() {
+      return key;
+   }
+
+   public byte[] getCurrentData() {
+      return currentData;
+   }
+
+   public Set<DataType> getAvailableMemTypes() {
+      return availableMemTypes;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java
new file mode 100644
index 0000000..a3da131
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * 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.message.tool;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public final class SubscriptionKey implements Serializable {
+
+   private static final long serialVersionUID = 4385205425559852952L;
+
+   private final int id;
+   private final DataType type;
+   private final MessageMode mode;
+   private final String messageClassName;
+
+   public SubscriptionKey(int id, DataType type, MessageMode mode, String messageClassName) {
+      this.id = id;
+      this.type = type;
+      this.mode = mode;
+      this.messageClassName = messageClassName;
+   }
+
+   public int getId() {
+      return id;
+   }
+
+   public DataType getType() {
+      return type;
+   }
+
+   public MessageMode getMode() {
+      return mode;
+   }
+
+   public String getMessageClassName() {
+      return messageClassName;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/TransferConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/TransferConfig.java
new file mode 100644
index 0000000..c2ad745
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/TransferConfig.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * 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.message.tool;
+
+import java.net.InetSocketAddress;
+import java.nio.channels.SelectionKey;
+
+public final class TransferConfig {
+   public static enum Direction {
+      SOCKET_TO_FILE(SelectionKey.OP_READ),
+      FILE_TO_SOCKET(SelectionKey.OP_WRITE);
+
+      private int accessType;
+
+      private Direction(int accessType) {
+         this.accessType = accessType;
+      }
+
+      public int getSelectionAccessOperation() {
+         return accessType;
+      }
+
+   }
+   private final String fileName;
+   private final InetSocketAddress sourceAddress;
+   private final InetSocketAddress destinationAddress;
+   private final Direction direction;
+   private final int blockCount;
+   private final boolean appendMode;
+   
+   public TransferConfig(final String fileName, final InetSocketAddress sourceAddress, final InetSocketAddress destinationAddress, final Direction direction, final int blockCount) {
+	   this(fileName, sourceAddress, destinationAddress, direction, blockCount, false);
+   }
+
+   public TransferConfig(final String fileName, final InetSocketAddress sourceAddress, final InetSocketAddress destinationAddress, final Direction direction, final int blockCount, boolean appendMode) {
+	      super();
+	      this.fileName = fileName;
+	      this.sourceAddress = sourceAddress;
+	      this.destinationAddress = destinationAddress;
+	      this.direction = direction;
+	      this.blockCount = blockCount;
+	      this.appendMode = appendMode;
+	   }
+
+   /**
+    * @return the direction
+    */
+   public Direction getDirection() {
+      return direction;
+   }
+
+   /**
+    * @return the fileChannel
+    */
+   public String getFileName() {
+      return fileName;
+   }
+
+   /**
+    * @return the destination of the data
+    */
+   public InetSocketAddress getDestinationAddress() {
+      return destinationAddress;
+   }
+
+   /**
+    * @return the sourceAddress
+    */
+   public InetSocketAddress getSourceAddress() {
+      return sourceAddress;
+   }
+
+   /**
+    * @return the blockCount
+    */
+   public int getBlockCount() {
+      return blockCount;
+   }
+
+   public boolean isAppendMode() {
+	   return appendMode;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java
new file mode 100644
index 0000000..9b6db88
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * 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.message.tool;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.DatagramChannel;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+public class UdpFileTransferHandler {
+
+   private final Thread thread;
+   private final Selector selector;
+   private volatile boolean done = false;
+
+   private final HashMap<SelectionKey, Handle> handles = new HashMap<>();
+   private final Object gate = new Object();
+
+   private final class Handle implements IFileTransferHandle {
+      private final CopyOnWriteArrayList<IUdpTransferListener> listeners =
+         new CopyOnWriteArrayList<IUdpTransferListener>();
+      private final SelectionKey key;
+      private final TransferConfig config;
+      private final FileLock lock;
+
+      public Handle(SelectionKey key, TransferConfig config, FileLock lock) {
+         if (key == null) {
+            throw new IllegalArgumentException("The selection key cannot be null");
+         }
+         if (config == null) {
+            throw new IllegalArgumentException("The transfer configuration cannot be null");
+         }
+         if (lock == null) {
+            throw new IllegalArgumentException("The file lock cannot be null");
+         }
+         this.key = key;
+         this.config = config;
+         this.lock = lock;
+      }
+
+      @Override
+      public void addListener(IUdpTransferListener listener) {
+         if (!listeners.contains(listener)) {
+            listeners.add(listener);
+         }
+      }
+
+      @Override
+      public void stop() throws IOException {
+         synchronized (gate) {
+            handles.remove(key);
+            key.cancel();
+            //selector.wakeup();
+            OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "stopping transfer for " + config.getFileName());
+            key.channel().close();
+            lock.channel().close();
+            for (IUdpTransferListener listener : listeners) {
+               listener.onTransferComplete(config);
+            }
+            listeners.clear();
+         }
+      }
+
+   }
+
+   public UdpFileTransferHandler() throws IOException {
+      selector = Selector.open();
+      thread = new Thread(new Runnable() {
+
+         @Override
+         public void run() {
+            try {
+               while (!done) {
+                  selector.select();
+                  processReadySet(selector.selectedKeys());
+                  synchronized (gate) {
+                     // we do this to prevent entry to the selector.select() when
+                     // registering new channels from a different thread. Otherwise
+                     // we would deadlock
+                  }
+               }
+            } catch (ClosedByInterruptException ex) {
+               if (!done) {
+                  // interrupted but we were not stopped
+                  OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+               }
+            } catch (IOException ex) {
+               OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+            }
+         }
+
+      });
+      thread.setName("UDP File Transfer Handler");
+   }
+
+   /**
+    * @return true if successful or false if a lock on the file was not obtained
+    */
+   public IFileTransferHandle registerTransfer(TransferConfig config) throws IOException, FileNotFoundException {
+      synchronized (gate) {
+         selector.wakeup();
+         return addTransfer(config);
+      }
+   }
+
+   private synchronized IFileTransferHandle addTransfer(final TransferConfig config) throws IOException, FileNotFoundException {
+      File file = new File(config.getFileName());
+      final FileChannel fileChannel;
+      final FileLock lock;
+      if (config.getDirection() == TransferConfig.Direction.SOCKET_TO_FILE) {
+         FileOutputStream fos = new FileOutputStream(file, config.isAppendMode());
+         fileChannel = fos.getChannel();
+         lock = fileChannel.tryLock(0l, Long.MAX_VALUE, false);
+      } else {
+         FileInputStream fis = new FileInputStream(file);
+         fileChannel = fis.getChannel();
+         lock = fileChannel.tryLock(0l, Long.MAX_VALUE, true);
+      }
+      
+      if (lock == null) {
+         return null;
+      }
+      fileChannel.position(0);
+      final DatagramChannel sourceChannel = DatagramChannel.open();
+      sourceChannel.configureBlocking(false);
+      final DatagramSocket socket = sourceChannel.socket();
+      socket.bind(config.getDestinationAddress());
+      sourceChannel.connect(config.getSourceAddress());
+      System.out.println("file side bind address=" + socket.getLocalAddress() + ":" + socket.getLocalPort());
+      System.out.println("connected socket address=" + config.getSourceAddress());
+
+      if (config.getDirection() == TransferConfig.Direction.SOCKET_TO_FILE && socket.getReceiveBufferSize() < config.getBlockCount()) {
+         socket.setReceiveBufferSize(config.getBlockCount());
+         System.out.println("internal UDP receive buffer size =" + socket.getReceiveBufferSize());
+      }
+      final SelectionKey key = sourceChannel.register(selector, config.getDirection().getSelectionAccessOperation());
+      Handle h = new Handle(key, config, lock);
+      handles.put(key, h);
+      return h;
+   }
+
+   public void start() throws IOException {
+      thread.start();
+   }
+
+   public void stop(int time) throws InterruptedException, IOException {
+      done = true;
+      thread.interrupt();
+      thread.join(time);
+      stopAllTransfers();
+      handles.clear();
+      selector.close();
+   }
+
+   private void processReadySet(final Set<SelectionKey> readySet) throws ClosedByInterruptException, IOException {
+      /* iterate through the set of readable channels */
+      final Iterator<SelectionKey> keys = readySet.iterator();
+      while (keys.hasNext()) {
+         final SelectionKey key = keys.next();
+         if (key.isValid()) {
+            final Handle handle = handles.get(key);
+            final FileChannel fileChannel = handle.lock.channel();
+            final DatagramChannel channel = (DatagramChannel) key.channel();
+            final long pos = fileChannel.position();
+            try {
+               if ((key.interestOps() & SelectionKey.OP_READ) > 0) {
+                  final long count = fileChannel.transferFrom(channel, pos, handle.config.getBlockCount());
+                  fileChannel.position(pos + count);
+                  if (count == 0) {
+                     System.out.println("warning! read zero bytes");
+                  }
+               } else if ((key.interestOps() & SelectionKey.OP_WRITE) > 0) {
+                  final long count = fileChannel.transferTo(pos, handle.config.getBlockCount(), channel);
+                  if (count == 0) {
+                     System.out.println("warning! wrote zero bytes");
+                  }
+                  fileChannel.position(pos + count);
+                  if (fileChannel.position() >= fileChannel.size()) {
+                     synchronized (this) {
+                        System.out.println("done transfering file " + handle.config.getFileName());
+                        handle.stop();
+                     }
+                  }
+               }
+            } catch (ClosedChannelException ex) {
+               handle.stop();
+            } catch (Throwable t) {
+               try {
+                  handle.key.cancel();
+                  handle.key.channel().close();
+                  handle.lock.release();
+                  handle.lock.channel().close();
+               } finally {
+                  for (IUdpTransferListener listener : handle.listeners) {
+                     listener.onTransferException(handle.config, t);
+                  }
+                  handle.listeners.clear();
+               }
+            }
+         }
+         keys.remove();
+      }
+   }
+
+   public static void main(String[] args) {
+      try {
+         final UdpFileTransferHandler rec = new UdpFileTransferHandler();
+         String file = args[0];
+         InetAddress ipAddr = InetAddress.getByName(args[1]);
+         int remotePort = Integer.parseInt(args[2]);
+         int localPort = Integer.parseInt(args[3]);
+         TransferConfig.Direction direction = TransferConfig.Direction.values()[Integer.parseInt(args[4])];
+         InetSocketAddress address = new InetSocketAddress(ipAddr, remotePort);
+         if (direction == TransferConfig.Direction.FILE_TO_SOCKET) {
+            System.out.printf("Transfering %s to %s via local port %d\n", file, address.toString(), localPort);
+         } else {
+            System.out.printf("Writing to %s data recieved from %s via local port %d\n", file, address.toString(),
+               localPort);
+         }
+         TransferConfig config =
+            new TransferConfig(file, address, new InetSocketAddress(InetAddress.getLocalHost(), localPort), direction,
+               7 * 188);
+         rec.registerTransfer(config);
+         System.in.read();
+         rec.stop(2500);
+      } catch (UnknownHostException ex) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+      } catch (FileNotFoundException ex) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+      } catch (IOException ex) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+      } catch (InterruptedException ex) {
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+      }
+   }
+
+   /**
+    * stops all currently running file transfers but does not shutdown the file transfer service
+    */
+   public synchronized void stopAllTransfers() throws IOException {
+      OseeLog.log(MessageSystemTestEnvironment.class, Level.FINE, "stopping all transfers");
+      for (Handle handle : handles.values()) {
+         handle.stop();
+      }
+      handles.clear();
+   }
+
+   public synchronized boolean hasActiveTransfers() {
+      return !handles.isEmpty();
+   }
+
+   public boolean isRunning() {
+      final Thread.State state = thread.getState();
+      return state != Thread.State.NEW && state != Thread.State.TERMINATED && !done;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java
new file mode 100644
index 0000000..8d1abc7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * 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.message.tool.rec;
+
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.CharElement;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.EmptyEnum_Element;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.FixedPointElement;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.eclipse.osee.ote.message.elements.IElementVisitor;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.eclipse.osee.ote.message.elements.RealElement;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.elements.RecordMap;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.tool.rec.entry.ArrayElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.BooleanElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.CharElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.EmptyEnumEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.EnumeratedElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.IntegerElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.LongIntegerElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.RealElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.RecordElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.RecordMapEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.SignedInteger16ElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.StringElementEntry;
+
+public class ElementEntryFactory {
+
+   private static final class ElementVisitor implements IElementVisitor {
+
+      private IElementEntry entry = null;
+
+      public IElementEntry getEntry() {
+         return entry;
+      }
+
+      @Override
+      public void asCharElement(CharElement element) {
+         entry = new CharElementEntry(element);
+      }
+
+      @Override
+      public void asEnumeratedElement(EnumeratedElement<?> element) {
+         entry = new EnumeratedElementEntry(element);
+      }
+
+      @Override
+      public void asFixedPointElement(FixedPointElement element) {
+         entry = new RealElementEntry(element);
+      }
+
+      @Override
+      public void asFloat32(Float32Element element) {
+         entry = new RealElementEntry(element);
+      }
+
+      @Override
+      public void asFloat64(Float64Element element) {
+         entry = new RealElementEntry(element);
+      }
+
+      @Override
+      public void asGenericElement(Element element) {
+      }
+
+      @Override
+      public void asIntegerElement(IntegerElement element) {
+         entry = new IntegerElementEntry(element);
+      }
+
+      @Override
+      public void asRealElement(RealElement element) {
+         entry = new RealElementEntry(element);
+      }
+
+      @Override
+      public void asRecordElement(RecordElement element) {
+         entry = new RecordElementEntry(element);
+      }
+
+      @Override
+      public void asStringElement(StringElement element) {
+         entry = new StringElementEntry(element);
+      }
+
+      @Override
+      public void asBooleanElement(BooleanElement element) {
+         entry = new BooleanElementEntry(element);
+      }
+
+      @Override
+      public void asRecordMap(RecordMap<? extends RecordElement> element) {
+         entry = new RecordMapEntry(element);
+      }
+
+      @Override
+      public void asEmptyEnumElement(EmptyEnum_Element element) {
+         entry = new EmptyEnumEntry(element);
+      }
+
+      @Override
+      public void asArrayElement(ArrayElement element) {
+         entry = new ArrayElementEntry(element);
+      }
+
+      @Override
+      public void asLongIntegerElement(LongIntegerElement element) {
+         entry = new LongIntegerElementEntry(element);
+      }
+
+      @Override
+      public void asSignedInteger16Element(SignedInteger16Element element) {
+         entry = new SignedInteger16ElementEntry(element);
+      }
+
+   }
+
+   public static IElementEntry createEntry(Element element) {
+
+      ElementVisitor visitor = new ElementVisitor();
+      element.visit(visitor);
+      IElementEntry entry = visitor.getEntry();
+      if (entry != null) {
+         return entry;
+      }
+      throw new IllegalArgumentException("factory cannot generate an entry for class " + element.getClass().getName());
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java
new file mode 100644
index 0000000..2676cd6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.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.message.tool.rec;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.tool.rec.entry.IMessageEntry;
+
+public interface IMessageEntryFactory<T extends Message<?, ?, T>> {
+
+   public IMessageEntry createMessageEntry(MessageRecordConfig config, MessageRecorder recorder) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java
new file mode 100644
index 0000000..80d0698
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * 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.message.tool.rec;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public class MessageRecordConfig {
+   private final Message msg;
+   private final Element[] headerElements;
+   private final Element[] bodyElements;
+   private final DataType type;
+   private final boolean headerDump;
+   private final boolean bodyDump;
+
+   public MessageRecordConfig(final Message msg, final DataType type, final boolean headerDump, final Element[] headerElements, final boolean bodyDump, final Element[] bodyElements) {
+      this.msg = msg;
+      this.headerElements = headerElements;
+      this.bodyElements = bodyElements;
+      this.type = type;
+      this.headerDump = headerDump;
+      this.bodyDump = bodyDump;
+   }
+
+   public MessageRecordConfig(final Message msg, final DataType type, Element[] hdrElements) {
+      this.msg = msg;
+      this.headerElements = hdrElements;
+      Collection<Element> elements = msg.getElements();
+      this.bodyElements = elements.toArray(new Element[elements.size()]);
+      this.type = type;
+      this.headerDump = true;
+      this.bodyDump = true;
+   }
+
+   //	public MessageRecordConfig(final Message<?, ? ,?> msg, final MemType type) {
+   //		super();
+   //		this.msg = msg;
+   //		this.headerElements = msg.getActiveDataSource().getMsgHeader().getElements();
+   //		Collection<Element> vals = msg.getElementMap().values();
+   //		this.bodyElements = vals.toArray(new Element[vals.size()]);
+   //		this.type = type;
+   //	}
+   //
+   //	public MessageRecordConfig(final Message<?, ? ,?> msg, Element[] hdrElements) {
+   //		super();
+   //		this.msg = msg;
+   //		this.headerElements = hdrElements;
+   //		Collection<Element> vals = msg.getElementMap().values();
+   //		this.bodyElements = vals.toArray(new Element[vals.size()]);
+   //		this.type = msg.getMemType();
+   //	}
+
+   public Element[] getBodyElements() {
+      return bodyElements;
+   }
+
+   public Element[] getHeaderElements() {
+      return headerElements;
+   }
+
+   public boolean getBodyDump() {
+      return bodyDump;
+   }
+
+   public boolean getHeaderDump() {
+      return headerDump;
+   }
+
+   public Message getMsg() {
+      return msg;
+   }
+
+   public DataType getType() {
+      return type;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java
new file mode 100644
index 0000000..87e6a25
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * 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.message.tool.rec;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.WritableByteChannel;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.tool.rec.entry.IMessageEntry;
+
+public class MessageRecorder {
+   private static final int NUM_BUFFERS = 3;
+   private WritableByteChannel channel;
+
+   private final ArrayList<IMessageEntry> msgsToRecord = new ArrayList<>(64);
+   private final Lock recLock = new ReentrantLock();
+   private volatile boolean isRecording = false;
+   private final IMessageEntryFactory factory;
+
+   private final ExecutorService taskHandler = Executors.newFixedThreadPool(2);
+   private final ArrayBlockingQueue<ByteBuffer> bufferQueue = new ArrayBlockingQueue<>(NUM_BUFFERS);
+
+   public MessageRecorder(IMessageEntryFactory factory) {
+      this.factory = factory;
+      try {
+         for (int i = 0; i < NUM_BUFFERS; i++) {
+            bufferQueue.put(ByteBuffer.allocateDirect(256000));
+         }
+      } catch (InterruptedException e) {
+         // this should be absolutely impossible
+         throw new Error("What on Earth has happened here!", e);
+      }
+   }
+
+   public void startRecording(Collection<MessageRecordConfig> list, WritableByteChannel channel) throws OseeCoreException {
+      if (list == null) {
+         throw new IllegalArgumentException("list cannot be null");
+      }
+      if (channel == null) {
+         throw new IllegalArgumentException("channel cannot be null");
+      }
+      recLock.lock();
+      try {
+         this.channel = channel;
+         for (MessageRecordConfig config : list) {
+            IMessageEntry handler = factory.createMessageEntry(config, this);
+            msgsToRecord.add(handler);
+            handler.enable(true);
+         }
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "recording " + list.size() + "messages");
+         isRecording = true;
+      } finally {
+         recLock.unlock();
+      }
+   }
+
+   public ByteBuffer acquireOutputBuffer() throws InterruptedException {
+      return bufferQueue.take();
+   }
+
+   public void releaseOutputBuffer(ByteBuffer buffer) throws InterruptedException {
+      bufferQueue.put(buffer);
+   }
+
+   public WritableByteChannel getChannel() {
+      return channel;
+   }
+
+   public Future<?> submitTask(Runnable task) {
+      return taskHandler.submit(task);
+   }
+
+   public boolean isRecording() {
+      return isRecording;
+   }
+
+   public void stopRecording(boolean closeOutputChannel) throws IOException {
+      OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "stopping message recorder...");
+      isRecording = false;
+      recLock.lock();
+      try {
+         for (IMessageEntry handler : msgsToRecord) {
+            handler.enable(false);
+         }
+         msgsToRecord.clear();
+         if (closeOutputChannel) {
+            channel.close();
+         }
+      } finally {
+         recLock.unlock();
+         OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "message recorder stopped");
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java
new file mode 100644
index 0000000..9f83a04
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.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.message.tool.rec;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RecUtil {
+   private static final int ASCII_A_ADDITIVE = 'A' - 10;
+   private static final int ASCII_0_ADDITIVE = '0';
+
+   /**
+    * a very fast way of converting a byte into a two digit, zero padded hex value that is written directly into a byte
+    * buffer
+    */
+   public static void byteToAsciiHex(byte byteValue, ByteBuffer buffer) {
+      int value = byteValue & 0xFF;
+      int code = value >>> 4;
+      code += code >= 10 ? ASCII_A_ADDITIVE : ASCII_0_ADDITIVE;
+      buffer.put((byte) code);
+      code = value & 0x0F;
+      code += code >= 10 ? ASCII_A_ADDITIVE : ASCII_0_ADDITIVE;
+      buffer.put((byte) code);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java
new file mode 100644
index 0000000..057bffc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * 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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.tool.rec.RecUtil;
+
+public class ArrayElementEntry implements IElementEntry {
+
+   private final ArrayElement element;
+   private final byte[] nameAsBytes;
+   private static final byte[] LENGTH_BYTES = ".LENGTH".getBytes();
+
+   public ArrayElementEntry(ArrayElement element) {
+      this.element = element;
+      nameAsBytes = element.getElementPathAsString().getBytes();
+   }
+
+   @Override
+   public ArrayElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      int msgLimit = limit - element.getArrayStartOffset();
+      int length = element.getArrayEndOffset() - element.getArrayStartOffset();
+      length = msgLimit < length ? msgLimit : length;
+      buffer.put(nameAsBytes).put(LENGTH_BYTES).put(COMMA).put(Integer.toString(length).getBytes()).put(COMMA).put(
+         nameAsBytes).put(COMMA);
+      for (int i = 0; i < length; i++) {
+         RecUtil.byteToAsciiHex(element.getValue(mem, i), buffer);
+         buffer.put((byte) ' ');
+      }
+      buffer.put(COMMA);
+   }
+
+   public static void main(String[] args) {
+      ByteBuffer buffer = ByteBuffer.allocate(100);
+
+      RecUtil.byteToAsciiHex((byte) 21, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 255, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 1, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 254, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 128, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 16, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 17, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 0, buffer);
+      buffer.put((byte) ' ');
+      RecUtil.byteToAsciiHex((byte) 12, buffer);
+      buffer.flip();
+      byte[] data = new byte[buffer.remaining()];
+      buffer.get(data);
+      String ascii = new String(data);
+      System.out.println(ascii);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java
new file mode 100644
index 0000000..2d00042
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+
+public class BooleanElementEntry implements IElementEntry {
+
+   private final BooleanElement element;
+   private final byte[] nameAsBytes;
+
+   public BooleanElementEntry(BooleanElement element) {
+      this.element = element;
+      StringBuilder sb = new StringBuilder();
+      for (int i = 1; i < element.getElementPath().size(); i++) {
+         sb.append(element.getElementPath().get(i));
+      }
+      nameAsBytes = sb.toString().getBytes();
+      //		nameAsBytes = element.getName().getBytes();
+   }
+
+   @Override
+   public BooleanElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java
new file mode 100644
index 0000000..6bca2c0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.CharElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class CharElementEntry implements IElementEntry {
+
+   private final CharElement element;
+   private final byte[] nameAsBytes;
+
+   public CharElementEntry(CharElement element) {
+      this.element = element;
+      nameAsBytes = element.getName().getBytes();
+   }
+
+   @Override
+   public CharElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put((byte) element.valueOf(mem).charValue()).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java
new file mode 100644
index 0000000..68d1d30
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.EmptyEnum_Element;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class EmptyEnumEntry implements IElementEntry {
+
+   private final EmptyEnum_Element element;
+   private final byte[] nameAsBytes;
+
+   public EmptyEnumEntry(final EmptyEnum_Element element) {
+      this.element = element;
+      nameAsBytes = element.getName().getBytes();
+   }
+
+   @Override
+   public Element getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java
new file mode 100644
index 0000000..750a378
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public class EnumeratedElementEntry implements IElementEntry {
+
+   private final byte[] nameAsBytes;
+   private final byte[][] valueToBytes;
+   private final EnumeratedElement<?> element;
+   private static final byte[] SPACE_LEFT_PAREN = new byte[] {' ', '('};
+
+   public EnumeratedElementEntry(EnumeratedElement<?> element) {
+      this.element = element;
+      nameAsBytes = element.getElementPathAsString().getBytes();
+      valueToBytes = new byte[element.getEnumValues().length][];
+      for (Enum<?> val : element.getEnumValues()) {
+         valueToBytes[val.ordinal()] = val.name().getBytes();
+      }
+   }
+
+   @Override
+   public EnumeratedElement<?> getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      Enum<?> val = element.valueOf(mem);
+      byte[] bytes = Integer.toString(((IEnumValue<?>) val).getIntValue()).getBytes();
+      buffer.put(nameAsBytes).put(COMMA).put(valueToBytes[val.ordinal()]);
+      buffer.put(SPACE_LEFT_PAREN).put(bytes).put(RIGHT_PAREN).put(COMMA);
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java
new file mode 100644
index 0000000..15f4221
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+
+public interface IElementEntry {
+   public static final byte COMMA = ',';
+   public static final byte EQUALS = '=';
+   public static final byte LEFT_PAREN = '(';
+   public static final byte RIGHT_PAREN = ')';
+   public static final byte TICK = '\'';
+
+   public Element getElement();
+
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java
new file mode 100644
index 0000000..a391ca7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * 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.message.tool.rec.entry;
+
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+public interface IMessageEntry extends IOSEEMessageListener {
+   public void enable(boolean enable);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java
new file mode 100644
index 0000000..2132014
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+
+public class IntegerElementEntry implements IElementEntry {
+
+   private final IntegerElement element;
+   private final byte[] nameAsBytes;
+
+   public IntegerElementEntry(IntegerElement element) {
+      this.element = element;
+      nameAsBytes = element.getElementPathAsString().getBytes();
+   }
+
+   @Override
+   public IntegerElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java
new file mode 100644
index 0000000..c273668
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+
+public class LongIntegerElementEntry implements IElementEntry {
+
+   private final LongIntegerElement element;
+   private final byte[] nameAsBytes;
+
+   public LongIntegerElementEntry(LongIntegerElement element) {
+      this.element = element;
+      nameAsBytes = element.getElementPathAsString().getBytes();
+   }
+
+   @Override
+   public LongIntegerElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java
new file mode 100644
index 0000000..31b61db
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.RealElement;
+
+public class RealElementEntry implements IElementEntry {
+
+   private final RealElement element;
+   private final byte[] nameAsBytes;
+
+   public RealElementEntry(RealElement element) {
+      this.element = element;
+      nameAsBytes = element.getElementPathAsString().getBytes();
+   }
+
+   @Override
+   public RealElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java
new file mode 100644
index 0000000..90bb826
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.tool.rec.ElementEntryFactory;
+
+public class RecordElementEntry implements IElementEntry {
+
+   private final RecordElement element;
+   private final IElementEntry[] entries;
+   private final byte[] nameAsBytes;
+
+   public RecordElementEntry(RecordElement element) {
+      this.element = element;
+      nameAsBytes = element.getName().getBytes();
+      Collection<Element> elements = element.getElementMap().values();
+      entries = new IElementEntry[elements.size()];
+      int i = 0;
+      for (Element elem : elements) {
+         entries[i] = ElementEntryFactory.createEntry(elem);
+         i++;
+      }
+   }
+
+   @Override
+   public RecordElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      //       for (IElementEntry entry : entries) {
+      //    	   if (entry.getElement().getByteOffset() < limit) {
+      //    		   buffer.put(nameAsBytes).put((byte)'.');
+      //    		   entry.write(buffer, mem, limit);
+      //    		   buffer.put(COMMA);
+      //    	   }
+      //       }
+   }
+
+   public void write(byte[] prefix, ByteBuffer buffer, MemoryResource mem, int limit) {
+      //	       for (IElementEntry entry : entries) {
+      //	    	   if (entry.getElement().getByteOffset() < limit) {
+      //	    		   buffer.put(prefix).put(nameAsBytes).put((byte)'.');
+      //	    		   entry.write(buffer, mem, limit);
+      //	    		   buffer.put(COMMA);
+      //	    	   }
+      //	       }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java
new file mode 100644
index 0000000..0126519
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.elements.RecordMap;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RecordMapEntry implements IElementEntry {
+
+   private final RecordMap<? extends RecordElement> element;
+   private final RecordElementEntry[] entries;
+
+   public RecordMapEntry(final RecordMap<? extends RecordElement> element) {
+      this.element = element;
+      entries = new RecordElementEntry[element.length()];
+
+      for (int i = 0; i < element.length(); i++) {
+         entries[i] = new RecordElementEntry(element.get(i));
+      }
+   }
+
+   @Override
+   public Element getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      //      for (int i = 0; i < element.length(); i++) {
+      //    	  if (entries[i].getElement().getByteOffset() < limit) {
+      //    		  final byte[] prefix = String.format("[%d]", i).getBytes();
+      //    		  entries[i].write(prefix, buffer, mem, limit);
+      //    		  buffer.put(COMMA);
+      //    	  }
+      //      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java
new file mode 100644
index 0000000..85a289b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+
+public class SignedInteger16ElementEntry implements IElementEntry {
+
+   private final SignedInteger16Element element;
+   private final byte[] nameAsBytes;
+
+   public SignedInteger16ElementEntry(SignedInteger16Element element) {
+      this.element = element;
+      nameAsBytes = element.getName().getBytes();
+   }
+
+   @Override
+   public SignedInteger16Element getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java
new file mode 100644
index 0000000..a62cb1a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.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.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class StringElementEntry implements IElementEntry {
+
+   private final StringElement element;
+   private final byte[] nameAsBytes;
+
+   public StringElementEntry(final StringElement element) {
+      this.element = element;
+      nameAsBytes = element.getName().getBytes();
+   }
+
+   @Override
+   public StringElement getElement() {
+      return element;
+   }
+
+   @Override
+   public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+      mem.setOffset(element.getMsgData().getMem().getOffset());
+      buffer.put(nameAsBytes).put(COMMA).put(TICK).put(element.valueOf(mem).getBytes()).put(TICK).put(COMMA);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/AVAILABLE_PHYSICAL_TYPES_REQ.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/AVAILABLE_PHYSICAL_TYPES_REQ.java
new file mode 100644
index 0000000..3188e56
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/AVAILABLE_PHYSICAL_TYPES_REQ.java
@@ -0,0 +1,14 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class AVAILABLE_PHYSICAL_TYPES_REQ extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/availabletypesreq";
+   
+	public AVAILABLE_PHYSICAL_TYPES_REQ() {
+		super("AVAILABLE_PHYSICAL_TYPES_REQ", TOPIC, 0);
+		
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/BooleanResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/BooleanResponse.java
new file mode 100644
index 0000000..f9a161f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/BooleanResponse.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class BooleanResponse extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/boolresponse";
+   
+   private static int SIZE = 1;
+   
+   public BooleanElement VALUE;
+   
+	public BooleanResponse() {
+		super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+		VALUE = new BooleanElement(this, "IS_SCHEDULED", getDefaultMessageData(), 0, 0, 7);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConfigurationAndResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConfigurationAndResponse.java
new file mode 100644
index 0000000..44aa10a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConfigurationAndResponse.java
@@ -0,0 +1,45 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+
+import org.eclipse.osee.ote.Configuration;
+
+public class ConfigurationAndResponse implements Serializable {
+
+   private static final long serialVersionUID = 8496858852630392143L;
+
+   private final String address;
+   private final int port;
+   private final boolean install;
+   private final Configuration configuration;
+   private final String id;
+   
+   public ConfigurationAndResponse(String address, int port, Configuration configuration, boolean install, String id){
+      this.address = address;
+      this.port = port;
+      this.configuration = configuration;
+      this.install = install;
+      this.id = id;
+   }
+   
+   public String getAddress(){
+      return address;
+   }
+   
+   public int getPort(){
+      return port;
+   }
+   
+   public Configuration getConfiguration(){
+      return configuration;
+   }
+   
+   public boolean install(){
+      return install;
+   }
+   
+   public String getId(){
+      return id;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleInputMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleInputMessage.java
new file mode 100644
index 0000000..7162047
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleInputMessage.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+public class ConsoleInputMessage extends ConsoleMessage {
+
+   public static String TOPIC = "ote/message/consoleinput";
+
+   public ConsoleInputMessage() {
+      super(ConsoleInputMessage.class.getSimpleName(), TOPIC);
+   }
+}  
+
+	
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleMessage.java
new file mode 100644
index 0000000..9038b7f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleMessage.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+
+public class ConsoleMessage extends OteEventMessage {
+
+   public static final int _BYTE_SIZE = 0;
+   public ArrayElement STRINGDATA;
+
+   public ConsoleMessage(String name, String topic) {
+      super(ConsoleMessage.class.getSimpleName(), topic, _BYTE_SIZE);
+      STRINGDATA = new ArrayElement(this, "STRINGDATA", getDefaultMessageData(), 0, 0, 0);
+      addElements(STRINGDATA);
+   }
+   
+   public void setString(String str) throws IOException{
+      byte[] data = str.getBytes();
+      int offset = STRINGDATA.getByteOffset() + getHeaderSize();
+      byte[] newData = new byte[data.length + offset];
+      System.arraycopy(getData(), 0, newData, 0, offset);
+      System.arraycopy(data, 0, newData, offset, data.length);
+      getDefaultMessageData().setNewBackingBuffer(newData);
+   }
+   
+   public String getString() throws IOException, ClassNotFoundException{
+      int offset = STRINGDATA.getByteOffset() + getHeaderSize();
+      byte[] stringData = new byte[getData().length - offset];
+      System.arraycopy(getData(), offset, stringData, 0, stringData.length);
+      return new String(stringData);
+   }
+   
+   public void setStringData(ByteBuffer buffer) {
+      int offset = STRINGDATA.getByteOffset() + getHeaderSize();
+      byte[] newData = new byte[buffer.remaining() + offset];
+      System.arraycopy(getData(), 0, newData, 0, offset);
+      buffer.get(newData, offset, buffer.remaining());
+      getDefaultMessageData().setNewBackingBuffer(newData);
+   }
+}  
+
+	
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleOutputMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleOutputMessage.java
new file mode 100644
index 0000000..40cfcea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleOutputMessage.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+
+public class ConsoleOutputMessage extends ConsoleMessage {
+
+   public static String TOPIC = "ote/message/consoleoutput";
+
+   public ConsoleOutputMessage() {
+      super(ConsoleOutputMessage.class.getSimpleName(), TOPIC);
+   }
+
+}  
+
+	
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/DisconnectRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/DisconnectRemoteTestEnvironment.java
new file mode 100644
index 0000000..5f02abb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/DisconnectRemoteTestEnvironment.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+public class DisconnectRemoteTestEnvironment implements Serializable {
+
+   private static final long serialVersionUID = 1100894850334052780L;
+  
+   private UUID id;
+   
+   public DisconnectRemoteTestEnvironment(UUID id){
+      this.id = id;
+   }
+
+   public UUID getId() {
+      return id;
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_REQ.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_REQ.java
new file mode 100644
index 0000000..3cdb9e9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_REQ.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class GET_INET_ADDRESS_REQ extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/addressreq";
+   
+   public final EnumeratedElement<SOCKET_ID> SOCKET_ID;   
+   
+	public GET_INET_ADDRESS_REQ() {
+		super("GET_INET_ADDRESS_REQ", TOPIC, 1);
+		SOCKET_ID = createEnumeratedElement("SOCKET_ID", 1, SOCKET_ID.class);
+		
+		getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(GET_INET_ADDRESS_RESP.TOPIC);
+	}
+	
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_RESP.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_RESP.java
new file mode 100644
index 0000000..75c51b4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_RESP.java
@@ -0,0 +1,20 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.SOCKET_ADDRESS_RECORD;
+
+public class GET_INET_ADDRESS_RESP extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/addressresp";
+   
+   public final EnumeratedElement<SOCKET_ID> SOCKET_ID;   
+   public final SOCKET_ADDRESS_RECORD ADDRESS;   
+   
+	public GET_INET_ADDRESS_RESP() {
+		super("GET_INET_ADDRESS_RESP", TOPIC, 22);
+		SOCKET_ID = createEnumeratedElement("SOCKET_ID", 1, SOCKET_ID.class);
+		ADDRESS = new SOCKET_ADDRESS_RECORD(this, "ADDRESS", getDefaultMessageData(), 1, 0, SOCKET_ADDRESS_RECORD.SIZE*8-1);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/JobStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/JobStatus.java
new file mode 100644
index 0000000..4096e0b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/JobStatus.java
@@ -0,0 +1,90 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+import java.net.URL;
+
+public class JobStatus implements Serializable {
+
+   private static final long serialVersionUID = -5316721802558614714L;
+   private URL updatedJobStatus;
+   private String jobId;
+   
+   private int totalUnitsOfWork;
+   private int unitsWorked;
+   private String errorLog;
+   private boolean jobComplete;
+   private boolean success;
+   
+   public JobStatus(){
+      errorLog = "";
+      jobComplete = false;
+      success = true;
+      totalUnitsOfWork = 0;
+      unitsWorked = 0;
+   }
+   
+   public int getTotalUnitsOfWork() {
+      return totalUnitsOfWork;
+   }
+   
+   public int getUnitsWorked() {
+      return unitsWorked;
+   }
+
+   public String getErrorLog() {
+      return errorLog;
+   }
+
+   public boolean isJobComplete() {
+      return jobComplete;
+   }
+
+   public void setTotalUnitsOfWork(int i) {
+      totalUnitsOfWork = i;
+   }
+
+   public void jobComplete() {
+      jobComplete = true;
+   }
+
+   public void incrememtUnitsWorked() {
+      unitsWorked++;
+   }
+   
+   public void setUnitsWorked(int unitsWorked) {
+      this.unitsWorked = unitsWorked;
+   }
+
+   public void setErrorLog(String log) {
+      this.errorLog = log;
+   }
+
+   public void setJobComplete(boolean jobComplete) {
+      this.jobComplete = jobComplete;
+   }
+   
+   public boolean isSuccess() {
+      return success;
+   }
+
+   public void setSuccess(boolean success) {
+      this.success = success;
+   }
+
+   public URL getUpdatedJobStatus() {
+      return updatedJobStatus;
+   }
+
+   public void setUpdatedJobStatus(URL updatedJobStatus) {
+      this.updatedJobStatus = updatedJobStatus;
+   }
+
+   public String getJobId() {
+      return jobId;
+   }
+
+   public void setJobId(String jobId) {
+      this.jobId = jobId;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/MESSAGE_META_DATA_STAT.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/MESSAGE_META_DATA_STAT.java
new file mode 100644
index 0000000..8fcde75
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/MESSAGE_META_DATA_STAT.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.eclipse.osee.ote.message.elements.RealElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class MESSAGE_META_DATA_STAT extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/metadatastat";
+   
+   private static int SIZE = 256+4+1;
+   
+   public StringElement MESSAGE;
+   public BooleanElement IS_SCHEDULED;
+   public RealElement RATE;
+   
+	public MESSAGE_META_DATA_STAT() {
+		super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+		MESSAGE = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+		IS_SCHEDULED = new BooleanElement(this, "IS_SCHEDULED", getDefaultMessageData(), MESSAGE.getByteOffset()+MESSAGE.getBitLength()/8, 0, 7);
+		RATE = new Float64Element(this, "IS_WRITER", getDefaultMessageData(), IS_SCHEDULED.getByteOffset()+IS_SCHEDULED.getBitLength()/8, 0, 63);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RECORDING_COMPLETE.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RECORDING_COMPLETE.java
new file mode 100644
index 0000000..cfd525b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RECORDING_COMPLETE.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RECORDING_COMPLETE extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/recordingComplete";
+   
+	public RECORDING_COMPLETE() {
+		super("RECORDING_COMPLETE", TOPIC, 0);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestHostEnvironmentProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestHostEnvironmentProperties.java
new file mode 100644
index 0000000..052e615
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestHostEnvironmentProperties.java
@@ -0,0 +1,15 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RequestHostEnvironmentProperties extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/propertiesreq";
+   
+	public RequestHostEnvironmentProperties() {
+		super("RequestHostEnvironmentProperties", TOPIC, 1);
+		
+		getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(SerializedEnhancedProperties.EVENT);
+	}
+	
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestRemoteTestEnvironment.java
new file mode 100644
index 0000000..a3f4a83
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestRemoteTestEnvironment.java
@@ -0,0 +1,35 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+
+public class RequestRemoteTestEnvironment implements Serializable {
+   
+   private static final long serialVersionUID = -6720107128761044291L;
+  
+   private IRemoteUserSession session;
+   private UUID id;
+   private TestEnvironmentConfig config;
+   
+   public RequestRemoteTestEnvironment(IRemoteUserSession session, UUID id, TestEnvironmentConfig config){
+      this.session = session;
+      this.id = id;
+      this.config = config;
+   }
+
+   public IRemoteUserSession getSession() {
+      return session;
+   }
+
+   public UUID getId() {
+      return id;
+   }
+
+   public TestEnvironmentConfig getConfig() {
+      return config;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsCancel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsCancel.java
new file mode 100644
index 0000000..d4889ea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsCancel.java
@@ -0,0 +1,29 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsCancel extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/runtests/cancel";
+   
+   private static int SIZE = 256+1;
+   
+   public StringElement GUID;
+   public BooleanElement CANCEL_ALL;
+   
+	public RunTestsCancel() {
+		super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+		GUID = new StringElement(this, "GUID", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+		CANCEL_ALL = new BooleanElement(this, "CANCEL_ALL", getDefaultMessageData(), GUID.getByteOffset()+GUID.getBitLength()/8, 0, 7);
+		
+		getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+	}
+
+   public RunTestsCancel(byte[] bytes) {
+      this();
+      setData(bytes);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultReq.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultReq.java
new file mode 100644
index 0000000..d5e2f4a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultReq.java
@@ -0,0 +1,25 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsGetCommandResultReq extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/runtests/commandresultreq";
+   
+   private static int SIZE = 256;
+   
+   public StringElement GUID;
+   
+	public RunTestsGetCommandResultReq() {
+		super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+		GUID = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+		getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+	}
+
+   public RunTestsGetCommandResultReq(byte[] bytes) {
+      this();
+      setData(bytes);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultResp.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultResp.java
new file mode 100644
index 0000000..cfc1c6e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultResp.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class RunTestsGetCommandResultResp extends SerializedClassMessage<ITestCommandResult> {
+
+	public static final String TOPIC = "ote/message/runtests/commandresultresp";
+	
+	public RunTestsGetCommandResultResp() {
+		super(TOPIC);
+	}
+	
+	public RunTestsGetCommandResultResp(ITestCommandResult commandAdded) throws IOException {
+		super(TOPIC, commandAdded);
+	}
+	
+	public RunTestsGetCommandResultResp(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsCancelled.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsCancelled.java
new file mode 100644
index 0000000..cc8aec6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsCancelled.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsIsCancelled extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/runtests/iscanceled";
+   
+   private static int SIZE = 256;
+   
+   public StringElement GUID;
+   
+	public RunTestsIsCancelled() {
+		super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+		GUID = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+		
+		getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+	}
+
+   public RunTestsIsCancelled(byte[] bytes) {
+      this();
+      setData(bytes);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsDone.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsDone.java
new file mode 100644
index 0000000..5ad7b3c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsDone.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsIsDone extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/runtests/isdone";
+   
+   private static int SIZE = 256;
+   
+   public StringElement GUID;
+   
+	public RunTestsIsDone() {
+		super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+		GUID = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+		
+		getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+	}
+
+   public RunTestsIsDone(byte[] bytes) {
+      this();
+      setData(bytes);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsSerialized.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsSerialized.java
new file mode 100644
index 0000000..12c3a6e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsSerialized.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ConfigurationAndResponse * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class RunTestsSerialized extends SerializedClassMessage<RunTests> {
+
+   public static final String RUNTESTS_NAMESPACE = "ote/message/runtests/";
+	public static final String TOPIC = RUNTESTS_NAMESPACE + "serialized";
+	
+	public RunTestsSerialized() {
+		super(TOPIC);
+	}
+	
+	public RunTestsSerialized(RunTests commandAdded) throws IOException {
+		super(TOPIC, commandAdded);
+	}
+	
+	public RunTestsSerialized(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SOCKET_ID.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SOCKET_ID.java
new file mode 100644
index 0000000..550e939
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SOCKET_ID.java
@@ -0,0 +1,83 @@
+/*
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public enum SOCKET_ID implements IEnumValue<SOCKET_ID> {
+	
+   MSG_UPDATES(0),
+   RECORDER(1),
+   
+	__UNDEFINED(-99999);
+
+   private int value;
+   private static int maxValue = 0;
+   
+   private static SOCKET_ID[] lbaValues;
+   private static SOCKET_ID[] lookup = null;
+   
+   static {
+	   lbaValues();
+	   if(maxValue < 32000){
+		   lookup = new SOCKET_ID[maxValue + 1];
+		   for(int i = 0; i < lbaValues.length; i++){
+			   lookup[lbaValues[i].value] = lbaValues[i];
+		   }
+	   }
+   }
+   
+   private SOCKET_ID(int value) {
+      this.value = value;
+   }
+   
+   @Override
+   public int getIntValue(){
+      return value;
+   }
+   
+   public static SOCKET_ID toEnum(int value){
+	  	  if(lookup == null){
+		  for(SOCKET_ID myEnum: values()){
+			 if(myEnum.getIntValue() == value){
+			    return myEnum;
+			 }
+		  }
+		  __UNDEFINED.value = value;
+		  return __UNDEFINED;
+	  } else if(value < 0 || value >= lookup.length ){
+		  __UNDEFINED.value = value;
+		  return __UNDEFINED;
+	  } else {
+		  SOCKET_ID enumeration = lookup[value];
+		  if(enumeration == null){
+			  __UNDEFINED.value = value;
+			  return __UNDEFINED;
+		  } else {
+			  return enumeration;
+		  }
+	  }  
+   }
+   
+   @Override
+   public SOCKET_ID getEnum(int value){
+	  return toEnum(value);	  
+   }
+   
+   public static SOCKET_ID[] lbaValues(){
+      if(lbaValues == null){
+      	 int count = 0;
+         lbaValues = new SOCKET_ID[values().length-1];
+         for(SOCKET_ID myEnum: values()){
+			 if(!"__UNDEFINED".equals(myEnum.name())){
+			    lbaValues[count++] = myEnum;
+			    if(myEnum.value > maxValue){
+			    	maxValue = myEnum.value;
+			    }
+			 }
+	  	 }
+      }
+      return lbaValues;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/STOP_RECORDING_CMD.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/STOP_RECORDING_CMD.java
new file mode 100644
index 0000000..079a102
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/STOP_RECORDING_CMD.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class STOP_RECORDING_CMD extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/recordstop";
+   
+	public STOP_RECORDING_CMD() {
+		super("STOP_RECORDING_CMD", TOPIC, 0);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedAvailablePhysicalTypesMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedAvailablePhysicalTypesMessage.java
new file mode 100644
index 0000000..24b8a1b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedAvailablePhysicalTypesMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ConfigurationAndResponse * 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.remote.messages;
+
+import java.io.IOException;
+import java.util.HashSet;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedAvailablePhysicalTypesMessage extends SerializedClassMessage<HashSet<DataType>> {
+
+	public static final String EVENT = "ote/message/serialavailabletypes";
+	
+	public SerializedAvailablePhysicalTypesMessage() {
+		super(EVENT);
+	}
+	
+	public SerializedAvailablePhysicalTypesMessage(HashSet<DataType> commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedAvailablePhysicalTypesMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConfigurationAndResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConfigurationAndResponse.java
new file mode 100644
index 0000000..c53cb9e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConfigurationAndResponse.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ConfigurationAndResponse * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedConfigurationAndResponse extends SerializedClassMessage<ConfigurationAndResponse> {
+
+	public static final String EVENT = "ote/message/serialconfigandresponse";
+	
+	public SerializedConfigurationAndResponse() {
+		super(EVENT);
+	}
+	
+	public SerializedConfigurationAndResponse(ConfigurationAndResponse commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedConfigurationAndResponse(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConnectionRequestResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConnectionRequestResult.java
new file mode 100644
index 0000000..1fed316
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConnectionRequestResult.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedConnectionRequestResult extends SerializedClassMessage<ConnectionRequestResult> {
+
+	public static final String EVENT = "ote/message/connectionrequestresult";
+	
+	public SerializedConnectionRequestResult() {
+		super(EVENT);
+	}
+	
+	public SerializedConnectionRequestResult(ConnectionRequestResult commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedConnectionRequestResult(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedDisconnectRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedDisconnectRemoteTestEnvironment.java
new file mode 100644
index 0000000..c9f0c39
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedDisconnectRemoteTestEnvironment.java
@@ -0,0 +1,22 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedDisconnectRemoteTestEnvironment   extends SerializedClassMessage<DisconnectRemoteTestEnvironment> {
+
+   public static final String TOPIC = "ote/message/serialdisconnecttestenv";
+
+   public SerializedDisconnectRemoteTestEnvironment() {
+      super(TOPIC);
+   }
+   
+   public SerializedDisconnectRemoteTestEnvironment(DisconnectRemoteTestEnvironment commandAdded) throws IOException {
+      super(TOPIC, commandAdded);
+   }
+   
+   public SerializedDisconnectRemoteTestEnvironment(byte[] bytes){
+      super(bytes);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedEnhancedProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedEnhancedProperties.java
new file mode 100644
index 0000000..9552f8f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedEnhancedProperties.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ConfigurationAndResponse * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedEnhancedProperties extends SerializedClassMessage<EnhancedProperties> {
+
+	public static final String EVENT = "ote/message/enhancedproperties";
+	
+	public SerializedEnhancedProperties() {
+		super(EVENT);
+	}
+	
+	public SerializedEnhancedProperties(EnhancedProperties commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedEnhancedProperties(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedOTEJobStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedOTEJobStatus.java
new file mode 100644
index 0000000..8fbf3de
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedOTEJobStatus.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedOTEJobStatus extends SerializedClassMessage<JobStatus> {
+
+	public static final String EVENT = "ote/message/otejobstatus";
+	
+	public SerializedOTEJobStatus() {
+		super(EVENT);
+	}
+	
+	public SerializedOTEJobStatus(JobStatus commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedOTEJobStatus(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRecordCommandMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRecordCommandMessage.java
new file mode 100644
index 0000000..90daafc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRecordCommandMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedRecordCommandMessage extends SerializedClassMessage<RecordCommand> {
+
+	public static final String EVENT = "ote/message/recordstart";
+	
+	public SerializedRecordCommandMessage() {
+		super(EVENT);
+	}
+	
+	public SerializedRecordCommandMessage(RecordCommand commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedRecordCommandMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRequestRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRequestRemoteTestEnvironment.java
new file mode 100644
index 0000000..b321c21
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRequestRemoteTestEnvironment.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedRequestRemoteTestEnvironment  extends SerializedClassMessage<RequestRemoteTestEnvironment> {
+
+   public static final String TOPIC = "ote/message/serialrequesttestenv";
+
+   public SerializedRequestRemoteTestEnvironment() {
+      super(TOPIC);
+      
+      getHeader().RESPONSE_TOPIC.setValue(SerializedConnectionRequestResult.EVENT);
+   }
+   
+   public SerializedRequestRemoteTestEnvironment(RequestRemoteTestEnvironment commandAdded) throws IOException {
+      super(TOPIC, commandAdded);
+   }
+   
+   public SerializedRequestRemoteTestEnvironment(byte[] bytes){
+      super(bytes);
+   }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSetElementMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSetElementMessage.java
new file mode 100644
index 0000000..0f6ba56
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSetElementMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedSetElementMessage extends SerializedClassMessage<SetElementValue> {
+
+	public static final String EVENT = "ote/message/setelement";
+	
+	public SerializedSetElementMessage() {
+		super(EVENT);
+	}
+	
+	public SerializedSetElementMessage(SetElementValue commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedSetElementMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscribeToMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscribeToMessage.java
new file mode 100644
index 0000000..ad86df8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscribeToMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedSubscribeToMessage extends SerializedClassMessage<SubscribeToMessage> {
+
+	public static final String EVENT = "ote/message/subscriptiondetails";
+	
+	public SerializedSubscribeToMessage() {
+		super(EVENT);
+	}
+	
+	public SerializedSubscribeToMessage(SubscribeToMessage commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedSubscribeToMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscriptionDetailsMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscriptionDetailsMessage.java
new file mode 100644
index 0000000..5845874
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscriptionDetailsMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+
+public class SerializedSubscriptionDetailsMessage extends SerializedClassMessage<SubscriptionDetails> {
+
+	public static final String EVENT = "ote/message/subscribeserial";
+	
+	public SerializedSubscriptionDetailsMessage() {
+		super(EVENT);
+	}
+	
+	public SerializedSubscriptionDetailsMessage(SubscriptionDetails commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedSubscriptionDetailsMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedUnSubscribeMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedUnSubscribeMessage.java
new file mode 100644
index 0000000..e966562
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedUnSubscribeMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedUnSubscribeMessage extends SerializedClassMessage<UnSubscribeToMessage> {
+
+	public static final String EVENT = "ote/message/unsubscribeserial";
+	
+	public SerializedUnSubscribeMessage() {
+		super(EVENT);
+	}
+	
+	public SerializedUnSubscribeMessage(UnSubscribeToMessage commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedUnSubscribeMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedZeroizeElementMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedZeroizeElementMessage.java
new file mode 100644
index 0000000..c2fbe5f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedZeroizeElementMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedZeroizeElementMessage extends SerializedClassMessage<ZeroizeElement> {
+
+	public static final String EVENT = "ote/message/zeroizeelement";
+	
+	public SerializedZeroizeElementMessage() {
+		super(EVENT);
+	}
+	
+	public SerializedZeroizeElementMessage(ZeroizeElement commandAdded) throws IOException {
+		super(EVENT, commandAdded);
+	}
+	
+	public SerializedZeroizeElementMessage(byte[] bytes){
+		super(bytes);
+	}
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentServerShutdown.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentServerShutdown.java
new file mode 100644
index 0000000..83c3fa2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentServerShutdown.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class TestEnvironmentServerShutdown extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/servershutdown";
+   
+   private static int SIZE = 512;
+   
+   public StringElement SERVER_ID;
+   
+	public TestEnvironmentServerShutdown() {
+		super("TestEnvironmentSetBatchMode", TOPIC, SIZE);
+		SERVER_ID = new StringElement(this, "SERVER_ID", getDefaultMessageData(), 0, 0, 512*8-1);
+	}
+
+   public TestEnvironmentServerShutdown(byte[] bytes) {
+      this();
+      setBackingBuffer(bytes);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentSetBatchMode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentSetBatchMode.java
new file mode 100644
index 0000000..3a496ee
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentSetBatchMode.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class TestEnvironmentSetBatchMode extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/setbatchmode";
+   
+   private static int SIZE = 1;
+   
+   public BooleanElement SET_BATCH_MODE;
+   
+	public TestEnvironmentSetBatchMode() {
+		super("TestEnvironmentSetBatchMode", TOPIC, SIZE);
+		SET_BATCH_MODE = new BooleanElement(this, "SET_BATCH_MODE", getDefaultMessageData(), 0, 0, 7);
+	}
+
+   public TestEnvironmentSetBatchMode(byte[] bytes) {
+      this();
+      setBackingBuffer(bytes);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentTransferFile.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentTransferFile.java
new file mode 100644
index 0000000..6fb5e9e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentTransferFile.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.SOCKET_ADDRESS_RECORD;
+
+public class TestEnvironmentTransferFile extends OteEventMessage {
+
+   public static String TOPIC = "ote/message/transferfile";
+   
+   private static int SIZE = SOCKET_ADDRESS_RECORD.SIZE + 1024;
+   
+   public SOCKET_ADDRESS_RECORD ADDRESS;
+   public StringElement FILE_PATH;
+   
+	public TestEnvironmentTransferFile() {
+		super("TestEnvironmentSetBatchMode", TOPIC, SIZE);
+		ADDRESS = new SOCKET_ADDRESS_RECORD(this, "ADDRESS", getDefaultMessageData(), 0, 0, SOCKET_ADDRESS_RECORD.SIZE*8-1);
+		FILE_PATH = new StringElement(this, "FILE_PATH", getDefaultMessageData(), SOCKET_ADDRESS_RECORD.SIZE, 0, 1024*8-1);
+	}
+
+   public TestEnvironmentTransferFile(byte[] bytes) {
+      this();
+      setBackingBuffer(bytes);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.feature/.project b/org.eclipse.osee.ote.feature/.project
new file mode 100644
index 0000000..2fa1d35
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.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.ote.feature/build.properties b/org.eclipse.osee.ote.feature/build.properties
new file mode 100644
index 0000000..34dfbf4
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               build.properties,\
+               feature.properties,\
+               license.html
diff --git a/org.eclipse.osee.ote.feature/feature.properties b/org.eclipse.osee.ote.feature/feature.properties
new file mode 100644
index 0000000..b1b38f2
--- /dev/null
+++ b/org.eclipse.osee.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 OTE 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 OTE
+
+# "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.ote.feature/feature.xml b/org.eclipse.osee.ote.feature/feature.xml
new file mode 100644
index 0000000..8c765d6
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/feature.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.osee.ote.feature"
+      label="%featureName"
+      version="0.25.3.qualifier"
+      provider-name="%providerName">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.osee.ote.rest"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+
+</feature>
diff --git a/org.eclipse.osee.ote.feature/license.html b/org.eclipse.osee.ote.feature/license.html
new file mode 100644
index 0000000..c6af966
--- /dev/null
+++ b/org.eclipse.osee.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.ote.feature/pom.xml b/org.eclipse.osee.ote.feature/pom.xml
new file mode 100644
index 0000000..c9098a9
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/pom.xml
@@ -0,0 +1,13 @@
+<project
+	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.feature</artifactId>
+	<packaging>eclipse-feature</packaging>
+	<name>OSEE OTEFeature - (Incubation)</name>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.feature/sourceTemplateFeature/.gitkeep b/org.eclipse.osee.ote.feature/sourceTemplateFeature/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/sourceTemplateFeature/.gitkeep
diff --git a/org.eclipse.osee.ote.help.ui.test/.classpath b/org.eclipse.osee.ote.help.ui.test/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/.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.help.ui.test/.project b/org.eclipse.osee.ote.help.ui.test/.project
new file mode 100644
index 0000000..6600992
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.help.ui.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.ote.help.ui.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.help.ui.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..862b737
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Help UI Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.help.ui.test
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Fragment-Host: org.eclipse.osee.ote.help.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit,
+ org.eclipse.core.runtime
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.osgi.framework
diff --git a/org.eclipse.osee.ote.help.ui.test/build.properties b/org.eclipse.osee.ote.help.ui.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.help.ui.test/pom.xml b/org.eclipse.osee.ote.help.ui.test/pom.xml
new file mode 100644
index 0000000..b8f64a4
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/pom.xml
@@ -0,0 +1,30 @@
+<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.help.ui.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+	<name>OSEE OTE Help UI Test - (Incubation)</name>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<testSuite>org.eclipse.osee.ote.help.ui.test</testSuite>
+					<testClass>org.eclipse.osee.ote.help.ui.OteHelpUiTestSuite</testClass>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpContextTest.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpContextTest.java
new file mode 100644
index 0000000..509d96a
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpContextTest.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * 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.help.ui;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.core.data.HelpContext;
+import org.eclipse.osee.framework.jdk.core.util.Compare;
+import org.eclipse.osee.ote.help.ui.util.ContextParser;
+import org.eclipse.osee.ote.help.ui.util.ContextParser.ContextEntry;
+import org.eclipse.osee.ote.help.ui.util.HelpTestUtil;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Angel Avila
+ */
+public class HelpContextTest {
+
+   private static final String PLUGIN_ID = "org.eclipse.osee.ote.help.ui";
+
+   private static Map<String, HelpContext> contexts;
+   private static ContextParser parser;
+
+   @BeforeClass
+   public static void setUp() throws Exception {
+      contexts = getContexts(OteHelpContext.class);
+      parser = new ContextParser("contexts/contexts.xml");
+      parser.parse();
+   }
+
+   @Test
+   public void testAdd() throws Exception {
+      assertEquals(12, contexts.size());
+   }
+
+   @Test
+   public void testContextsXml() throws Exception {
+      assertEquals(contexts.size(), parser.getEntries().size());
+
+      Assert.assertFalse(Compare.isDifferent(contexts.keySet(), parser.getIds()));
+      for (HelpContext context : contexts.values()) {
+         assertEquals(PLUGIN_ID, context.getPluginId());
+
+         String id = context.getName();
+         ContextEntry entry = parser.getEntry(id);
+         assertNotNull(entry);
+      }
+   }
+
+   @Ignore
+   @Test
+   public void testHrefFiles() throws Exception {
+      for (ContextEntry entry : parser.getEntries()) {
+         for (String reference : entry.getReferences()) {
+            URL url = HelpTestUtil.getResource(reference);
+            assertNotNull(String.format("[%s] was not valid", reference), url);
+         }
+      }
+   }
+
+   private static Map<String, HelpContext> getContexts(Class<?> clazz) throws IllegalArgumentException, IllegalAccessException {
+      Map<String, HelpContext> contexts = new HashMap<>();
+      for (Field field : clazz.getFields()) {
+         Object object = field.get(null);
+         if (object instanceof HelpContext) {
+            HelpContext context = (HelpContext) object;
+            contexts.put(context.getName(), context);
+         }
+      }
+      return contexts;
+   }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpTableOfContentTest.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpTableOfContentTest.java
new file mode 100644
index 0000000..2e76b65
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpTableOfContentTest.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.help.ui;
+
+import static org.junit.Assert.assertNotNull;
+import java.net.URL;
+import java.util.Set;
+import org.eclipse.osee.ote.help.ui.util.HelpTestUtil;
+import org.eclipse.osee.ote.help.ui.util.HtmlParser;
+import org.eclipse.osee.ote.help.ui.util.TocParser;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Angel Avila
+ */
+public class HelpTableOfContentTest {
+
+   private static final String PLUGIN_ID = "org.eclipse.osee.ote.help.ui";
+
+   private static TocParser parser;
+
+   @BeforeClass
+   public static void setUp() throws Exception {
+      parser = new TocParser("toc.xml");
+      parser.parse();
+   }
+
+   @Ignore
+   @Test
+   public void testAllTocReferencesExist() throws Exception {
+      for (String reference : parser.getEntries()) {
+         URL url = HelpTestUtil.getResource(reference);
+         assertNotNull(String.format("[%s] was not valid", reference), url);
+      }
+   }
+
+   @Ignore
+   @Test
+   public void testTocReferencesValid() throws Exception {
+      HtmlParser htmlParser = new HtmlParser(PLUGIN_ID);
+
+      for (String reference : parser.getEntries()) {
+         URL url = HelpTestUtil.getResource(reference);
+
+         Set<String> entries = htmlParser.parse(url);
+         for (String resource : entries) {
+            URL referencedUrl = HelpTestUtil.getResource(reference);
+            assertNotNull(String.format("[%s] was not valid", resource), referencedUrl);
+         }
+
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/OteHelpUiTestSuite.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/OteHelpUiTestSuite.java
new file mode 100644
index 0000000..e01b751
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/OteHelpUiTestSuite.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.help.ui;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * @author Angel Avila
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({HelpContextTest.class, HelpTableOfContentTest.class})
+public class OteHelpUiTestSuite {
+   // Test Suite
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/ContextParser.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/ContextParser.java
new file mode 100644
index 0000000..72a2610
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/ContextParser.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * 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.help.ui.util;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Angel Avila
+ */
+public class ContextParser {
+
+   private static final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
+
+   private static final String CONTEXT = "context";
+   private static final String TOPIC = "topic";
+   private static final String HREF = "href";
+   private static final String ID_TAG = "id";
+
+   public Map<String, ContextEntry> entries = new HashMap<>();
+   public String path;
+
+   private String localName;
+   private String uri;
+   private ContextEntry currentEntry;
+
+   public ContextParser(String path) {
+      this.path = path;
+   }
+
+   public void parse() throws Exception {
+      entries.clear();
+      URL url = HelpTestUtil.getResource(path);
+
+      InputStream inputStream = null;
+      try {
+         inputStream = new BufferedInputStream(url.openStream());
+         XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
+         while (streamReader.hasNext()) {
+            process(streamReader);
+            streamReader.next();
+         }
+
+      } finally {
+         Lib.close(inputStream);
+      }
+   }
+
+   private void process(XMLStreamReader reader) {
+      int eventType = reader.getEventType();
+      switch (eventType) {
+         case XMLStreamConstants.START_ELEMENT:
+            localName = reader.getLocalName();
+            uri = reader.getNamespaceURI();
+            if (CONTEXT.equals(localName)) {
+
+               String id = reader.getAttributeValue(uri, ID_TAG);
+               if (Strings.isValid(id)) {
+                  currentEntry = new ContextEntry(id);
+               }
+
+            } else if (TOPIC.equals(localName) && currentEntry != null) {
+               String reference = reader.getAttributeValue(uri, HREF);
+               if (Strings.isValid(reference)) {
+                  String path = normalizePath(reference);
+                  currentEntry.getReferences().add(path);
+               }
+            }
+            break;
+         case XMLStreamConstants.END_ELEMENT:
+            localName = reader.getLocalName();
+            uri = reader.getNamespaceURI();
+            if (CONTEXT.equals(localName) && currentEntry != null) {
+               entries.put(currentEntry.getId(), currentEntry);
+               reset();
+            }
+            break;
+      }
+   }
+
+   private String normalizePath(String reference) {
+      return reference.replaceAll("\\.html#.*", ".html");
+   }
+
+   private void reset() {
+      localName = null;
+      uri = null;
+      currentEntry = null;
+   }
+
+   public Collection<ContextEntry> getEntries() {
+      return entries.values();
+   }
+
+   public ContextEntry getEntry(String id) {
+      return entries.get(id);
+   }
+
+   public Set<String> getIds() {
+      return entries.keySet();
+   }
+
+   public final class ContextEntry {
+      private final String id;
+      private final Set<String> references = new LinkedHashSet<>();
+
+      public ContextEntry(String id) {
+         super();
+         this.id = id;
+      }
+
+      public String getId() {
+         return id;
+      }
+
+      public Set<String> getReferences() {
+         return references;
+      }
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HelpTestUtil.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HelpTestUtil.java
new file mode 100644
index 0000000..e84b93d
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HelpTestUtil.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.help.ui.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.io.File;
+import java.net.URL;
+import org.eclipse.core.runtime.FileLocator;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * @author Angel Avila
+ */
+public final class HelpTestUtil {
+
+   private HelpTestUtil() {
+      // Utility Class
+   }
+
+   public static URL getResource(String resource) throws Exception {
+      Bundle bundle = FrameworkUtil.getBundle(HelpTestUtil.class);
+      URL url = bundle.getResource(resource);
+
+      assertNotNull(String.format("Resource not found: [%s]", resource), url);
+
+      url = FileLocator.toFileURL(url);
+      File file = new File(url.toURI());
+      assertEquals(String.format("[%s] does not exist", resource), true, file.exists());
+      assertEquals(String.format("[%s] unreadable", resource), true, file.canRead());
+
+      return url;
+   }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HtmlParser.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HtmlParser.java
new file mode 100644
index 0000000..f912676
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HtmlParser.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * 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.help.ui.util;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+;
+
+/**
+ * @author Angel Avila
+ */
+public class HtmlParser {
+
+   private static final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
+
+   private static final String LINK_NODE = "link";
+   private static final String HREF_TAG = "href";
+   private static final String SRC_TAG = "src";
+
+   private final String pathHint;
+
+   public HtmlParser(String pathHint) {
+      this.pathHint = pathHint;
+   }
+
+   private String getPath(String fullPath) {
+      StringBuilder builder = new StringBuilder();
+
+      String[] parts = fullPath.split("/");
+      boolean found = false;
+      for (String part : parts) {
+         if (found && !part.endsWith(".html")) {
+            builder.append(part);
+            builder.append("/");
+         }
+         if (pathHint.equals(part)) {
+            found = true;
+         }
+      }
+      return builder.toString();
+   }
+
+   public Set<String> parse(URL url) throws Exception {
+      Set<String> entries = new HashSet<>();
+      entries.clear();
+
+      String pathPrefix = getPath(url.toString());
+
+      InputStream inputStream = null;
+      try {
+         inputStream = new BufferedInputStream(url.openStream());
+         XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
+         while (streamReader.hasNext()) {
+            process(streamReader, pathPrefix, entries);
+            streamReader.next();
+         }
+
+      } finally {
+         Lib.close(inputStream);
+      }
+
+      return entries;
+   }
+
+   private void process(XMLStreamReader reader, String pathPrefix, Set<String> entries) {
+      int eventType = reader.getEventType();
+      switch (eventType) {
+         case XMLStreamConstants.START_ELEMENT:
+            String localName = reader.getLocalName();
+            for (int index = 0; index < reader.getAttributeCount(); index++) {
+
+               String attributeName = reader.getAttributeLocalName(index);
+               String value = reader.getAttributeValue(index);
+
+               if (Strings.isValid(value)) {
+                  if (!LINK_NODE.equals(localName)) {
+                     if (HREF_TAG.equals(attributeName) || SRC_TAG.equals(attributeName)) {
+                        processResource(pathPrefix, entries, value);
+                     }
+                  }
+               }
+            }
+            break;
+      }
+   }
+
+   private void processResource(String pathPrefix, Set<String> references, String value) {
+      if (!isExternalLink(value)) {
+         String reference = normalizePath(pathPrefix, value);
+         references.add(reference);
+      }
+   }
+
+   private String normalizePath(String pathPrefix, String reference) {
+      String path = reference.replaceAll("\\.html#.*", ".html");
+      return String.format("%s%s", pathPrefix, path);
+   }
+
+   private boolean isExternalLink(String resource) {
+      return resource.contains("://");
+   }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/TocParser.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/TocParser.java
new file mode 100644
index 0000000..fed7108
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/TocParser.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * 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.help.ui.util;
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+
+/**
+ * @author Angel Avila
+ */
+public class TocParser {
+
+   private static final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
+
+   private static final String TOC = "toc";
+   private static final String TOPIC = "topic";
+   private static final String HREF = "href";
+
+   public Set<String> entries = new HashSet<>();
+   public String path;
+
+   private String localName;
+   private String uri;
+
+   public TocParser(String path) {
+      this.path = path;
+   }
+
+   public void parse() throws Exception {
+      entries.clear();
+      URL url = HelpTestUtil.getResource(path);
+
+      InputStream inputStream = null;
+      try {
+         inputStream = new BufferedInputStream(url.openStream());
+         XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
+         while (streamReader.hasNext()) {
+            process(streamReader);
+            streamReader.next();
+         }
+
+      } finally {
+         Lib.close(inputStream);
+      }
+   }
+
+   private void process(XMLStreamReader reader) {
+      int eventType = reader.getEventType();
+      switch (eventType) {
+         case XMLStreamConstants.START_ELEMENT:
+            localName = reader.getLocalName();
+            uri = reader.getNamespaceURI();
+            if (TOC.equals(localName)) {
+               processReference(reader, TOPIC);
+            } else if (TOPIC.equals(localName)) {
+               processReference(reader, HREF);
+            }
+            break;
+         case XMLStreamConstants.END_ELEMENT:
+            localName = reader.getLocalName();
+            uri = reader.getNamespaceURI();
+            reset();
+            break;
+      }
+   }
+
+   private void processReference(XMLStreamReader reader, String tag) {
+      String reference = reader.getAttributeValue(uri, tag);
+      if (Strings.isValid(reference)) {
+         String path = normalizePath(reference);
+         entries.add(path);
+      }
+   }
+
+   private String normalizePath(String reference) {
+      return reference.replaceAll("\\.html#.*", ".html");
+   }
+
+   private void reset() {
+      localName = null;
+      uri = null;
+   }
+
+   public Set<String> getEntries() {
+      return entries;
+   }
+}
diff --git a/org.eclipse.osee.ote.help.ui/.classpath b/org.eclipse.osee.ote.help.ui/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.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.help.ui/.gitignore b/org.eclipse.osee.ote.help.ui/.gitignore
new file mode 100644
index 0000000..07cf0fe
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.gitignore
@@ -0,0 +1 @@
+/toc.xml
diff --git a/org.eclipse.osee.ote.help.ui/.project b/org.eclipse.osee.ote.help.ui/.project
new file mode 100644
index 0000000..0c5be64
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.help.ui</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.help.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.osee.ote.help.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..8141126
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,32 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=2
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/org.eclipse.osee.ote.help.ui/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.help.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..94b2136
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Help (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.help.ui;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.help.ui
+Import-Package: org.eclipse.osee.framework.core.data
diff --git a/org.eclipse.osee.ote.help.ui/about.html b/org.eclipse.osee.ote.help.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 25, 2008</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content 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 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>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.help.ui/build-helper.xml b/org.eclipse.osee.ote.help.ui/build-helper.xml
new file mode 100644
index 0000000..e7e8f2f
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/build-helper.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.osee.ote.help.ui" basedir="." default="all">
+	<property name="osee.base.help.plugin" value="../org.eclipse.osee.framework.help.ui" />
+	<property name="ant.file.imported" value="${osee.base.help.plugin}/scripts" />
+	<import file="${ant.file.imported}/help-build-common.xml" />
+
+	<description>Generate Eclipse help content for the OSEE OTE user
+		guide</description>
+
+	<property name="osee.help.doc.url.base" value="http://wiki.eclipse.org" />
+
+	<target name="all" description="Generate Eclipse help content for the OSEE OTE user guide">
+		<sequential>
+			<delete failonerror="false">
+				<fileset dir="OSEE" />
+				<fileset dir="images" />
+			</delete>
+
+			<mediawiki-to-eclipse-help 
+				wikiBaseUrl="${osee.help.doc.url.base}" 
+				validate="true" failonvalidationerror="true" 
+				prependImagePrefix="images" 
+				formatoutput="true" 
+				defaultAbsoluteLinkTarget="osee_external" 
+				dest="${basedir}" 
+				navigationimages="true" 
+				title="OSEE OTE User's Guide" 
+				generateUnifiedToc="true">
+				<path name="OSEE/OTE/Users_Guide/Getting_Started" title="Getting Started" />
+				<path name="OSEE/OTE/Users_Guide/Concepts" title="Concepts" />
+				<path name="OSEE/OTE/Users_Guide/Features" title="Features" />
+				<path name="OSEE/OTE/Users_Guide/Tips" title="Tips and Tricks" />
+				<path name="OSEE/OTE/Users_Guide/New" title="What's New" />
+				<stylesheet url="book.css" />
+				<pageAppendum>
+
+					= Updating This Document =
+
+					This document is maintained in a collaborative wiki. If you wish to
+					update or modify this document please visit
+					{url}</pageAppendum>
+			</mediawiki-to-eclipse-help>
+			<mkdir dir="images" />
+			<copy todir="${basedir}/images" overwrite="true">
+				<fileset dir="${ant.file.imported}/commonImages" />
+			</copy>
+		</sequential>
+	</target>
+</project>
diff --git a/org.eclipse.osee.ote.help.ui/build.properties b/org.eclipse.osee.ote.help.ui/build.properties
new file mode 100644
index 0000000..9c060cb
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/build.properties
@@ -0,0 +1,11 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               plugin.xml,\
+               toc.xml,\
+               contexts/,\
+               intro/,\
+               about.html,\
+               .,\
+               OSEE/,\
+               images/
diff --git a/org.eclipse.osee.ote.help.ui/contexts/contexts.xml b/org.eclipse.osee.ote.help.ui/contexts/contexts.xml
new file mode 100644
index 0000000..91ca7f9
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/contexts/contexts.xml
@@ -0,0 +1,74 @@
+<contexts>
+	<context id="ote_navigator" title="OTE Navigator">
+		<description>OTE navigator is a view that provides quick navigation to many of the GUI's and features of OTE.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#OTE_Navigator" label="OTE Navigator"/>
+	</context>
+	
+	<context id="test_manager">
+		<description>The Test Manager is the application that is used to run test programs in OTE.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Overview_Page" label="Test Manager - Overview Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Hosts_Page" label="Test Manager - Hosts Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Scripts_Page" label="Test Manager - Scripts Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Advanced_Page" label="Test Manager - Advanced Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Source_Page" label="Test Manager - Source Page"/>
+	</context>
+	<context id="test_manager_overview_page" title="Test Manager - Overview Page">
+		<description>The Overview page of Test Manager allows for some brief overview information related to the configuration of the Test Manager.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Overview_Page" label="Test Manager - Overview Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+	</context>
+	<context id="test_manager_hosts_page" title="Test Manager - Hosts Page">
+		<description>Displays available test servers, and allows you to connect to them and look at there current status.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Hosts_Page" label="Test Manager - Hosts Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+	</context>
+	<context id="test_manager_scripts_page" title="Test Manager - Scripts Page">
+		<description>Controls the execution of test programs.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Scripts_Page" label="Test Manager - Scripts Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>		
+	</context>
+	<context id="test_manager_advanced_page" title="Test Manager - Advanced Page">
+		<description>The Advanced Page of the Test Manager is the page where configuration options can be set.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Advanced_Page" label="Test Manager - Advanced Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>		
+	</context>	
+	<context id="test_manager_source_page" title="Test Manager - Source Page">
+		<description>The Source page of Test Manager allows the user to enter source code location to run against.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Source_Page" label="Test Manager - Source Page"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>		
+	</context>	
+	
+	<context id="message_view" title="Message View">
+		<description>The Message View tool provides a listing of all messages in the currently checked out Messages.jar file.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_View" label="Message View"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Search" label="Message View - Search"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Watch" label="Message View - Watch"/>
+	</context>
+	<context id="message_view_search" title="Message View - Search">
+		<description>The Message View search text box allows users to search for messages.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Search" label="Message View - Search"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_View" label="Message View"/>		
+	</context>
+	<context id="message_view_watch" title="Message View - Watch">
+		<description>The Message View Right-Click Menu allows users to select messages and message elements to watch.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Watch" label="Message View - Watch"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_View" label="Message View"/>		
+	</context>	
+	
+	<context id="message_watch" title="Message Watch">
+		<description>The Message Watch tool provides capability to monitor and simulate messages and element values.</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_Watch" label="Message Watch"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Adding Elements" label="Message Watch - Adding Elements"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Removing Elements" label="Message Watch - Removing Elements"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Setting Elements" label="Message Watch - Setting Elements"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Read vs Write Buffer" label="Message Watch - Read vs Write Buffer"/>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Sort" label="Message Watch - Sort"/>			
+	</context>
+
+	<context id="mux_view" title="Mux View">
+		<description>The mux view allows the user to monitor and simulate mux messages</description>
+		<topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Mux_View" label="Mux View"/>
+	</context>
+
+</contexts>
diff --git a/org.eclipse.osee.ote.help.ui/intro/overviewExtensionContent.xml b/org.eclipse.osee.ote.help.ui/intro/overviewExtensionContent.xml
new file mode 100644
index 0000000..61b19ca
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/intro/overviewExtensionContent.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<introContent>
+	<extensionContent id="org.eclipse.osee" name="OSEE"
+		style="css/overview.css" path="overview/@">
+		<group id="content-group" style-id="content-group">
+			<link label="OTE"
+				url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.osee.ote.help.ui&amp;class=org.eclipse.mylyn.internal.tasks.ui.actions.ShowTasksUiLegendAction&amp;id=org.eclipse.mylyn.doc.legend.show.action"
+				id="ote-overview" style-id="content-link">
+				<text>See the OSEE OTE Perspective</text>
+			</link>
+		</group>
+	</extensionContent>
+</introContent>
diff --git a/org.eclipse.osee.ote.help.ui/intro/tutorialsExtensionContent.xml b/org.eclipse.osee.ote.help.ui/intro/tutorialsExtensionContent.xml
new file mode 100644
index 0000000..efb3254
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/intro/tutorialsExtensionContent.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<introContent>
+	<extensionContent id="org.eclipse.osee" name="AST"
+		style="css/tutorials.css" path="tutorials/@">
+<!--  		<group label="Task-focused programming" id="AST" style-id="content-group">
+			<link 
+				url="http://org.eclipse.ui.intro/showStandby?partId=org.eclipse.platform.cheatsheet&amp;input=org.eclipse.mylyn.cheatsheet.query" 
+				label="Use the Task List" id="mylyn-query"	style-id="content-link">
+				<text>Learn how to create tasks and task repository queries</text>
+			</link>
+			<link
+				url="http://www.eclipse.org/mylyn/start/"
+				label="Visit the Mylyn homepage" id="mylyn-task" style-id="content-link">
+				<text>Learn about the benefits of task-focused programming with Mylyn</text>
+			</link>
+		</group>-->
+	</extensionContent>
+</introContent>
+
+<!--
+<link
+	url="http://org.eclipse.ui.intro/showStandby?partId=org.eclipse.platform.cheatsheet&amp;input=org.eclipse.mylyn.cheatsheet.taskfocus"
+	label="Focus on Java" id="osee-task" style-id="content-link">
+	<text>Learn how to reduce information overload and multitask with ease.</text>
+</link>
+-->
diff --git a/org.eclipse.osee.ote.help.ui/plugin.xml b/org.eclipse.osee.ote.help.ui/plugin.xml
new file mode 100644
index 0000000..4354da5
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+	<extension
+         id="org.eclipse.osee.ote.help.ui.docs"
+         name="OSEE OTE User&apos;s Guide"
+         point="org.eclipse.help.toc">
+      <toc
+            category="OSEE"
+            file="toc.xml"
+            primary="true">
+      </toc>
+   </extension>
+ <extension
+       point="org.eclipse.ui.intro.configExtension">
+    <configExtension
+          configId="org.eclipse.ui.intro.universalConfig"
+          content="$nl$/intro/overviewExtensionContent.xml">
+    </configExtension>
+    <configExtension
+          configId="org.eclipse.ui.intro.universalConfig"
+          content="$nl$/intro/tutorialsExtensionContent.xml">
+    </configExtension>
+ </extension>
+ <extension
+       point="org.eclipse.help.contexts">
+    <contexts
+          file="contexts/contexts.xml">
+    </contexts>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.help.ui/pom.xml b/org.eclipse.osee.ote.help.ui/pom.xml
new file mode 100644
index 0000000..6ddd3c9
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/pom.xml
@@ -0,0 +1,106 @@
+<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.help.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Help (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>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>${maven-antrun-version}</version>
+				<executions>
+					<execution>
+						<id>help-clean-up</id>
+						<phase>clean</phase>
+						<configuration>
+							<target>
+								<property name="plugin_classpath" refid="maven.plugin.classpath" />
+								<taskdef resource="net/sf/antcontrib/antlib.xml">
+									<classpath>
+										<pathelement path="${classpath}" />
+										<pathelement path="${plugin_classpath}" />
+									</classpath>
+								</taskdef>
+
+								<if>
+									<equals arg1="${osee-create-help-docs}" arg2="true" />
+									<then>
+										<property name="compile_classpath" refid="maven.compile.classpath" />
+										<delete dir="images" />
+										<delete dir="OSEE" />
+									</then>
+								</if>
+							</target>
+						</configuration>
+						<goals>
+							<goal>run</goal>
+						</goals>
+					</execution>
+
+					<execution>
+						<id>help-build</id>
+						<phase>generate-sources</phase>
+						<configuration>
+							<target>
+								<property name="plugin_classpath" refid="maven.plugin.classpath" />
+								<taskdef resource="net/sf/antcontrib/antlib.xml">
+									<classpath>
+										<pathelement path="${classpath}" />
+										<pathelement path="${plugin_classpath}" />
+									</classpath>
+								</taskdef>
+
+								<if>
+									<equals arg1="${osee-create-help-docs}" arg2="true" />
+									<then>
+
+										<if>
+											<isset property="http.proxyHost" />
+											<then>
+												<echo message="Set Proxy: [${http.proxyHost}:${http.proxyPort}]" />
+												<echo message="Exclude ProxyHosts: [${http.nonProxyHosts}]" />
+												<setproxy nonproxyhosts="${http.nonProxyHosts}"
+													proxyhost="${http.proxyHost}" proxyport="${http.proxyPort}" />
+											</then>
+										</if>
+
+										<property name="compile_classpath" refid="maven.compile.classpath" />
+										<ant target="all" inheritRefs="true" antfile="build-helper.xml" />
+									</then>
+								</if>
+							</target>
+						</configuration>
+						<goals>
+							<goal>run</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.help.ui/src/org/eclipse/osee/ote/help/ui/OteHelpContext.java b/org.eclipse.osee.ote.help.ui/src/org/eclipse/osee/ote/help/ui/OteHelpContext.java
new file mode 100644
index 0000000..9e9ab4d
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/src/org/eclipse/osee/ote/help/ui/OteHelpContext.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.help.ui;
+
+import static org.eclipse.osee.framework.core.data.HelpContextRegistry.asContext;
+import org.eclipse.osee.framework.core.data.HelpContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteHelpContext {
+
+   private OteHelpContext() {
+      // Private Constructor
+   }
+
+   private static final String PLUGIN_ID = "org.eclipse.osee.ote.help.ui";
+
+   public static final HelpContext OTE_NAVIGATOR = toContext("ote_navigator");
+   public static final HelpContext TEST_MANAGER = toContext("test_manager");
+   public static final HelpContext TEST_MANAGER__OVERVIEW = toContext("test_manager_overview_page");
+   public static final HelpContext TEST_MANAGER__HOSTS = toContext("test_manager_hosts_page");
+   public static final HelpContext TEST_MANAGER__SCRIPTS = toContext("test_manager_scripts_page");
+   public static final HelpContext TEST_MANAGER__ADVANCED = toContext("test_manager_advanced_page");
+   public static final HelpContext TEST_MANAGER__SOURCE = toContext("test_manager_source_page");
+   public static final HelpContext MESSAGE_VIEW = toContext("message_view");
+   public static final HelpContext MESSAGE_VIEW__SEARCH = toContext("message_view_search");
+   public static final HelpContext MESSAGE_VIEW__WATCH = toContext("message_view_watch");
+   public static final HelpContext MESSAGE_WATCH = toContext("message_watch");
+   public static final HelpContext MUX_VIEW = toContext("mux_view");
+
+   private static HelpContext toContext(String id) {
+      return asContext(PLUGIN_ID, id);
+   }
+}
diff --git a/org.eclipse.osee.ote.io/.classpath b/org.eclipse.osee.ote.io/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.io/.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.io/.project b/org.eclipse.osee.ote.io/.project
new file mode 100644
index 0000000..4a01453
--- /dev/null
+++ b/org.eclipse.osee.ote.io/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.io</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.io/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.io/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..945edd4
--- /dev/null
+++ b/org.eclipse.osee.ote.io/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE IO (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.io;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.properties,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.ote.io
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-Activator: org.eclipse.osee.ote.io.internal.EarlyIORedirect
diff --git a/org.eclipse.osee.ote.io/OSGI-INF/org.eclipse.osee.ote.io.xml b/org.eclipse.osee.ote.io/OSGI-INF/org.eclipse.osee.ote.io.xml
new file mode 100644
index 0000000..dc70ecf
--- /dev/null
+++ b/org.eclipse.osee.ote.io/OSGI-INF/org.eclipse.osee.ote.io.xml
@@ -0,0 +1,8 @@
+<?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="true" name="org.eclipse.osee.ote.io">
+   <implementation class="org.eclipse.osee.ote.io.internal.SystemOutputImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.io.SystemOutput"/>
+   </service>
+   <reference bind="bindOTEServerFolder" cardinality="1..1" interface="org.eclipse.osee.ote.io.OTEServerFolder" name="OTEServerFolder" policy="static" unbind="unbindOTEServerFolder"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.io/OSGI-INF/ote.server.folder.component.xml b/org.eclipse.osee.ote.io/OSGI-INF/ote.server.folder.component.xml
new file mode 100644
index 0000000..53410ca
--- /dev/null
+++ b/org.eclipse.osee.ote.io/OSGI-INF/ote.server.folder.component.xml
@@ -0,0 +1,7 @@
+<?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="true" name="org.eclipse.osee.ote.io.server.folder">
+   <implementation class="org.eclipse.osee.ote.io.internal.OTEFolderImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.io.OTEServerFolder"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.io/build.properties b/org.eclipse.osee.ote.io/build.properties
new file mode 100644
index 0000000..6210e84
--- /dev/null
+++ b/org.eclipse.osee.ote.io/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.io/pom.xml b/org.eclipse.osee.ote.io/pom.xml
new file mode 100644
index 0000000..f1cb9d4
--- /dev/null
+++ b/org.eclipse.osee.ote.io/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.io</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE IO</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.io/src/org/eclipse/osee/ote/io/OTEServerFolder.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/OTEServerFolder.java
new file mode 100644
index 0000000..de46898
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/OTEServerFolder.java
@@ -0,0 +1,107 @@
+package org.eclipse.osee.ote.io;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * This class is used to help manage the OTE Server Folder area.  This includes the runtime cache and 
+ * the batches area.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface OTEServerFolder {
+   
+   /**
+    * This class will clean out all batch folders that have been marked for delete.  It 
+    * will not clean out sub-folders so if those exist the folder will not be completely
+    * removed.
+    */
+   public void cleanOldBatchFolders();
+   
+   public File getRootFolder();
+   
+   public File getServerFolder();
+   
+   /**
+    * This is the root folder for all batch folders.
+    * 
+    * @return
+    */
+   public File getBatchesFolder();
+   
+   public File getCacheFolder();
+
+   /**
+    * This is the root folder for miscellaneous files that might want to be stored.
+    * 
+    * @return
+    */
+   public File getMiscFiles();
+
+   /**
+    * This is the batch log file that contains all LEVEL.SEVERE and above log events that happened during 
+    * a batch.
+    * 
+    * @param batchFolder
+    * @return
+    */
+   public File getBatchLogFile(File batchFolder);
+
+   /**
+    * Generates a new File at the batches root folder with the current time as it's name.  This method does 
+    * not call mkdirs.
+    * 
+    * @return
+    */
+   public File getNewBatchFolder();
+   
+   /**
+    * Generates a new File at the batches root folder with the current time as it's name and the suffix appended to it.  This method does 
+    * not call mkdirs.
+    * 
+    * @return
+    */
+   public File getNewBatchFolder(String suffix);
+   
+   public File getNewServerFolder();
+   
+   public File getCurrentServerFolder();
+   
+   public void markFolderForDelete(File folder);
+   
+   public void unmarkFolderForDelete(File folder);
+
+   /**
+    * Returns a file that is the results summary of the given outfile.  The format of the returned file
+    * if it has content is: <script name>,<results string>,<elapsed time>.  There is no guarantee that the 
+    * returned file exists or that it has any data, the user must check for existence and validity.
+    * 
+    * @param outfile
+    * @return
+    */
+   public File getResultsFile(File outfile);
+
+   /**
+    * Returns a file that specifies the status of a given batch.  Possible values in the file are 'in queue',
+    * 'running', and 'complete'.  There is no guarantee that the file exists or that it has any content.
+    * 
+    * @param batchFolder
+    * @return
+    */
+   public File getBatchStatusFile(File batchFolder);
+
+   /**
+    * Returns a file tht specifies the runlist of a batch.  It will be of the format scripts<newline>scripts<newline>...
+    * There is no guarantee that the file exists or that it has any content.
+    * 
+    * @param batchFolder
+    * @return
+    */
+   public File getBatchRunList(File batchFolder);
+
+   public List<File> getRunningServerFolders();
+
+   public void removeServerRunningFile(File serverFolder);
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutput.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutput.java
new file mode 100644
index 0000000..2be2268
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutput.java
@@ -0,0 +1,7 @@
+package org.eclipse.osee.ote.io;
+
+public interface SystemOutput {
+   public void addListener(SystemOutputListener listener);   
+   public void removeListener(SystemOutputListener listener);   
+   public void write(String input);
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutputListener.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutputListener.java
new file mode 100644
index 0000000..f84a633
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutputListener.java
@@ -0,0 +1,15 @@
+package org.eclipse.osee.ote.io;
+
+import java.io.IOException;
+
+public interface SystemOutputListener {
+
+   public void close() throws IOException;
+
+   public void flush() throws IOException;
+
+   public void write(byte[] b, int off, int len) throws IOException;
+
+   public void write(byte[] b) throws IOException;
+   
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/EarlyIORedirect.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/EarlyIORedirect.java
new file mode 100644
index 0000000..7e020cf
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/EarlyIORedirect.java
@@ -0,0 +1,77 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class EarlyIORedirect implements BundleActivator {
+
+   private static EarlyIORedirect instance;
+
+   public static EarlyIORedirect getInstance(){
+      return instance;
+   }
+   
+   private PrintStream oldErr;
+   private PrintStream oldOut;
+   private InputStream oldIn;
+   private SpecializedOut out;
+   private SpecializedInputStream in;
+   private String newline;
+   
+   @Override
+   public void start(BundleContext context) throws Exception {
+      instance = this;
+      oldErr = System.err;
+      oldOut = System.out;
+      oldIn = System.in;
+      if(OtePropertiesCore.ioRedirect.getBooleanValue(false)){
+         out = new SpecializedOut(new SpecializedOutputStream());//outputStream == null ? oldOut : outputStream));
+         newline = OtePropertiesCore.lineSeparator.getValue();
+         in = new SpecializedInputStream(oldIn);
+         if(!OtePropertiesCore.ioRedirectFile.getBooleanValue(false)){
+            out.addListener(new SystemOutputListerImpl(System.out));
+         }
+         System.setIn(in);
+         System.setOut(out);
+         System.setErr(out);      
+      }
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      if(out != null){
+         out.flush();    
+      }
+   }
+   
+   public void addListener(SystemOutputListener listener){
+      if(out != null){
+         out.addListener(listener);
+      }
+   }
+   
+   public void removeListener(SystemOutputListener listener){
+      if(out != null){
+         out.removeListener(listener);
+      }
+   }
+   
+   public void write(String input){
+      if(in != null){
+//         System.out.println(input);
+         in.add(input+newline);
+      }
+   }
+   
+   public void resetIO(){
+      System.setIn(oldIn);
+      System.setOut(oldOut);
+      System.setErr(oldErr);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/OTEFolderImpl.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/OTEFolderImpl.java
new file mode 100644
index 0000000..f9e367c
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/OTEFolderImpl.java
@@ -0,0 +1,327 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream.GetField;
+import java.net.UnknownHostException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class OTEFolderImpl implements OTEServerFolder{
+   
+   private static int DAYS;
+   
+   static {
+      String strDays = OtePropertiesCore.batchFolderDays.getValue();
+      if(strDays!=null){
+         try{
+         DAYS = Integer.parseInt(strDays);
+         } catch (NumberFormatException ex){
+            DAYS = 7;
+         }
+      } else {
+         DAYS = 7;
+      }
+   }
+   
+   private static final String DELETE_MARKER = ".delete";
+   private static final String LOG_FILE = ".log";
+   private static final String STATUS_FILE = ".status";
+   private static final String RUNLIST_FILE = ".runlist";
+   private static final String RESULTS_FILE = ".result";
+   private static final String RUNNING_MARKER = ".running";
+   
+   private static File OTESERVER = determineOteServerFolder();
+   private static File BATCHES = new File(OTESERVER, "batches");
+   private static File JARCACHE = new File(OTESERVER, "runtimeCache");
+   private static File SERVERS = new File(OTESERVER, "servers");
+   private static File MISCFILES = new File(OTESERVER, "miscFiles");
+
+   private static SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd___kk_mm_ss");
+   
+   private File currentServerFolder; 
+   
+   private static File determineOteServerFolder() {
+      String userHome = OtePropertiesCore.userHome.getValue();
+      if (userHome.equals("/root")){
+         userHome = "/home/mptest";
+      }
+      File oteServerFolder = new File(userHome, "/OTESERVER");
+      try {
+         oteServerFolder = new File(oteServerFolder, java.net.InetAddress.getLocalHost().getHostName());
+      } catch (UnknownHostException ex) {
+       OseeLog.log(OTEFolderImpl.class, Level.WARNING, "Unknown host from java.net.InetAddress.getLocalHost() -");
+      }
+      oteServerFolder.setReadable(true);
+      oteServerFolder.setExecutable(true);
+      oteServerFolder.setWritable(true);
+      
+      return oteServerFolder;
+  
+//      File oteStationParent = new File(OtePropertiesCore.oteServerFolder.getValue("undefined"));
+//      if (!oteStationParent.exists() || !oteStationParent.isDirectory()) {
+//         OseeLog.log(OTEFolderImpl.class, Level.WARNING, "ote server folder parent does not exist folder -" + oteStationParent.getAbsolutePath());
+//         oteStationParent = new File(OtePropertiesCore.userHome.getValue(), "OTESERVER");
+//         return oteStationParent;
+//      }
+//      File stationsFolder = new File(oteStationParent, "stations");
+//      File stationFolder = new File(stationsFolder, OtePropertiesCore.oteStationName.getValue("unknown-station"));
+//      return new File(stationFolder, OtePropertiesCore.userName.getValue());
+   }
+   
+   public OTEFolderImpl(){
+      currentServerFolder = getNewServerFolder();
+      String serverIOPath = OtePropertiesCore.ioRedirectPath.getValue(currentServerFolder.getAbsolutePath());
+      currentServerFolder = new File(serverIOPath);
+   }
+   
+   /**
+    * ds component method
+    */
+   public void start(){
+      cleanOldBatchFolders();
+      cleanOldServerFolders();
+   }
+   
+   /**
+    * ds component method
+    */
+   public void stop(){
+      
+   }
+   
+   /**
+    * This will not clean sub-folders
+    */
+   @Override
+   public void cleanOldBatchFolders(){
+      Date dateBefore = new Date(new Date().getTime() -(DAYS * 24 * 3600 * 1000));
+      Date dateNoMatterwhat = new Date(new Date().getTime() -(28L * 24L * 3600L * 1000L));//4 weeks
+      if(BATCHES.exists()){
+         File[] files = BATCHES.listFiles();
+         if(files != null){
+            for(File file:files){
+               if(file.isDirectory()){
+                  boolean olderFileOrUnknown = true;
+                  boolean removeNoMatterWhat = false;
+                  try {
+                     Date fileDate = format.parse(file.getName());
+                     if(fileDate == null){
+                        OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+                     } else {
+                        olderFileOrUnknown = fileDate.before(dateBefore);
+                        removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+                     }
+                  } catch (ParseException e) {
+                     int index = file.getName().lastIndexOf("__");
+                     if(index > 1){
+                        try{
+                           Date fileDate = format.parse(file.getName().substring(0, index-1));
+                           if(fileDate == null){
+                              OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+                           } else {
+                              olderFileOrUnknown = fileDate.before(dateBefore);
+                              removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+                           }
+                        } catch (ParseException e2){
+                           OseeLog.log(getClass(), Level.SEVERE, e2);
+                        }
+                     } else {
+                        OseeLog.log(getClass(), Level.SEVERE, e);
+                     }
+                  }
+                  File delete = new File(file, DELETE_MARKER);
+                  boolean deleteFolder = delete.exists();
+                  if((deleteFolder && olderFileOrUnknown) || removeNoMatterWhat){
+                     File[] toDelete = file.listFiles();
+                     for(File f:toDelete){
+                        f.delete();
+                     }
+                     file.delete();
+                  }
+               }
+            }
+         }
+      }
+   }
+   
+   public void cleanOldServerFolders(){
+      Date dateBefore = new Date(new Date().getTime() -(DAYS * 24 * 3600 * 1000));
+      Date dateNoMatterwhat = new Date(new Date().getTime() -(28L * 24L * 3600L * 1000L));//4 weeks
+      if(SERVERS.exists()){
+         File[] files = SERVERS.listFiles();
+         if(files != null){
+            for(File file:files){
+               if(file.isDirectory()){
+                  boolean olderFileOrUnknown = true;
+                  boolean removeNoMatterWhat = false;
+                  try {
+                     Date fileDate = format.parse(file.getName());
+                     if(fileDate == null){
+                        OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+                     } else {
+                        olderFileOrUnknown = fileDate.before(dateBefore);
+                        removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+                     }
+                  } catch (ParseException e) {
+                     int index = file.getName().lastIndexOf("__");
+                     if(index > 1){
+                        try{
+                           Date fileDate = format.parse(file.getName().substring(0, index-1));
+                           if(fileDate == null){
+                              OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+                           } else {
+                              olderFileOrUnknown = fileDate.before(dateBefore);
+                              removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+                           }
+                        } catch (ParseException e2){
+                           OseeLog.log(getClass(), Level.SEVERE, e2);
+                        }
+                     } else {
+                        OseeLog.log(getClass(), Level.SEVERE, e);
+                     }
+                  }
+                  File running = new File(file, RUNNING_MARKER);
+                  boolean deleteFolder = !running.exists();
+                  if((deleteFolder && olderFileOrUnknown) || removeNoMatterWhat){
+                     File[] toDelete = file.listFiles();
+                     for(File f:toDelete){
+                        f.delete();
+                     }
+                     file.delete();
+                  }
+               }
+            }
+         }
+      }
+   }
+   
+   
+   
+   @Override
+   public File getRootFolder(){
+      return OTESERVER;
+   }
+   
+   @Override
+   public File getServerFolder(){
+      return SERVERS;
+   }
+   
+   @Override
+   public File getBatchesFolder(){
+      return BATCHES;
+   }
+   
+   @Override
+   public File getCacheFolder(){
+      return JARCACHE;
+   }
+
+   @Override
+   public File getMiscFiles() {
+      return MISCFILES;
+   }
+   
+   @Override
+   public File getNewServerFolder() {
+      return new File(getServerFolder(), format.format(new Date()));
+   }
+   
+   @Override
+   public File getCurrentServerFolder() {
+      return currentServerFolder;
+   }
+
+   @Override
+   public File getNewBatchFolder() {
+      return new File(getBatchesFolder(), format.format(new Date()));
+   }
+   
+   @Override
+   public File getNewBatchFolder(String suffix) {
+      if(suffix != null && suffix.length() > 0){
+         return new File(getBatchesFolder(), format.format(new Date())+"__" + suffix);
+      } else {
+         return getNewBatchFolder();
+      }
+   }
+   
+   @Override
+   public File getResultsFile(File outfile){
+      return new File(outfile.getAbsolutePath() + RESULTS_FILE);
+   }
+   
+   @Override
+   public void markFolderForDelete(File folder) {
+      FileOutputStream fos = null;
+      try {
+         folder.mkdirs();
+         fos = new FileOutputStream(new File(folder, DELETE_MARKER));
+      } catch (FileNotFoundException e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+      } finally {
+         if(fos != null){
+            try {
+               fos.close();
+            } catch (IOException e) {
+               e.printStackTrace();
+            }
+         }
+      }
+   }
+   
+   @Override
+   public void unmarkFolderForDelete(File folder) {
+      File delete = new File(folder, DELETE_MARKER);
+      if(delete.exists()){
+         delete.delete();
+      }
+   }
+
+   @Override
+   public File getBatchLogFile(File batchFolder) {
+      return new File(batchFolder, LOG_FILE);
+   }
+
+   @Override
+   public File getBatchStatusFile(File batchFolder) {
+      return new File(batchFolder, STATUS_FILE);
+   }
+
+   @Override
+   public File getBatchRunList(File batchFolder) {
+      return new File(batchFolder, RUNLIST_FILE);
+   }
+
+   @Override
+   public List<File> getRunningServerFolders() {
+      List<File> files = new ArrayList<>();
+      for(File serverDir:SERVERS.listFiles()){
+         File running = new File(serverDir, RUNNING_MARKER);
+         if(running.exists()){
+            files.add(serverDir);
+         }
+      }
+      return files;
+   }
+
+   @Override
+   public void removeServerRunningFile(File serverFolder) {
+      File file = new File(serverFolder, RUNNING_MARKER);
+      if(file.exists()){
+         file.delete();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedInputStream.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedInputStream.java
new file mode 100644
index 0000000..520ab0a
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedInputStream.java
@@ -0,0 +1,76 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class SpecializedInputStream extends InputStream {
+
+   private StringBuffer buffer = new StringBuffer();
+   private ReentrantLock lock;
+   private Condition newData;
+   private InputStream monitorIn;
+   private Thread th;
+   
+   public SpecializedInputStream(InputStream in){
+      monitorIn = in;
+      lock = new ReentrantLock();
+      newData = lock.newCondition();
+      th = new Thread(new Runnable(){
+
+         @Override
+         public void run() {
+            InputStreamReader isr=new InputStreamReader(monitorIn);
+            BufferedReader br=new BufferedReader(isr);
+            boolean validSystemIn = true;
+            while(validSystemIn){
+               try{
+                  String line = br.readLine();
+                  if(line != null){
+                     add(line); 
+                  } else {
+                     validSystemIn = false;
+                  }
+               } catch (Throwable th){
+                  
+               }
+            }
+         }
+         
+      });
+      th.setDaemon(true);
+      th.setName("OTE System.in monitor");
+      th.start();
+   }
+   
+   @Override
+   public int read() throws IOException {
+      int mychar = 0;
+      lock.lock();
+      try{
+         if(buffer.length() == 0){
+            newData.awaitUninterruptibly();
+         }
+         mychar = buffer.charAt(0) & 0xFF;
+         buffer.deleteCharAt(0);
+      } catch (Throwable th){
+      } finally {
+         lock.unlock();
+      }
+      return mychar;
+   }
+   
+   public void add(String str){
+      lock.lock();
+      try{
+         buffer.append(str);
+         newData.signalAll();
+      } finally {
+         lock.unlock();
+      }
+   }
+ 
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOut.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOut.java
new file mode 100644
index 0000000..51be19a
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOut.java
@@ -0,0 +1,23 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.PrintStream;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+
+public class SpecializedOut extends PrintStream {
+
+   private SpecializedOutputStream specialOut;
+
+   public SpecializedOut(SpecializedOutputStream out) {
+      super(out);
+      this.specialOut = out;
+   }
+   
+   public void addListener(SystemOutputListener listener){
+      specialOut.add(listener);
+   }
+   
+   public void removeListener(SystemOutputListener listener){
+      specialOut.remove(listener);
+   }
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOutputStream.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOutputStream.java
new file mode 100644
index 0000000..5f4b6ac
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOutputStream.java
@@ -0,0 +1,58 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+
+public class SpecializedOutputStream extends OutputStream {
+
+   private CopyOnWriteArrayList<SystemOutputListener> listeners;
+
+   public SpecializedOutputStream() {
+      this.listeners = new CopyOnWriteArrayList<>();
+   }
+
+   public void add(SystemOutputListener listener){
+      listeners.add(listener);
+   }
+   
+   public void remove(SystemOutputListener listner){
+      listeners.remove(listner);
+   }
+   
+   @Override
+   public void write(int arg0) throws IOException {
+      
+   }
+
+   @Override
+   public void close() throws IOException {
+      for(SystemOutputListener listner:listeners){
+         listner.close();
+      }
+   }
+
+   @Override
+   public void flush() throws IOException {
+      for(SystemOutputListener listner:listeners){
+         listner.flush();
+      }
+   }
+
+   @Override
+   public void write(byte[] b, int off, int len) throws IOException {
+      for(SystemOutputListener listner:listeners){
+         listner.write(b, off, len);
+      }
+   }
+
+   @Override
+   public void write(byte[] b) throws IOException {
+      for(SystemOutputListener listner:listeners){
+         listner.write(b);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputImpl.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputImpl.java
new file mode 100644
index 0000000..db65ac4
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputImpl.java
@@ -0,0 +1,71 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.io.SystemOutput;
+import org.eclipse.osee.ote.io.SystemOutputListener;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class SystemOutputImpl implements SystemOutput {
+
+   private static final String SYSTEM_OUT_FILE = "systemout.txt";
+
+   private BufferedOutputStream outputStream;
+ 
+   private OTEServerFolder serverFolder;
+   
+   public void start() {
+      if(OtePropertiesCore.ioRedirect.getBooleanValue(false)){
+         if(OtePropertiesCore.ioRedirectFile.getBooleanValue(false)){
+            File wd = serverFolder.getCurrentServerFolder();
+            wd.mkdirs();
+            if(wd.exists() && wd.isDirectory()){
+               try {
+                  outputStream = new BufferedOutputStream(new FileOutputStream(new File(wd, SYSTEM_OUT_FILE)));
+                  EarlyIORedirect.getInstance().addListener(new SystemOutputListerImpl(outputStream));
+               } catch (FileNotFoundException e) {
+                  e.printStackTrace();
+               }
+            }            
+         }
+      }
+   }
+
+   public void stop(){
+      try {
+         if(outputStream != null){
+            outputStream.flush();
+         }
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+   }
+   
+   public void bindOTEServerFolder(OTEServerFolder folder) {
+      this.serverFolder = folder;
+   }
+   
+   public void unbindOTEServerFolder(OTEServerFolder folder) {
+      this.serverFolder = null;
+   }
+   
+   @Override
+   public void addListener(SystemOutputListener listener){
+      EarlyIORedirect.getInstance().addListener(listener);
+   }
+   
+   @Override
+   public void removeListener(SystemOutputListener listener){
+      EarlyIORedirect.getInstance().removeListener(listener);
+   }
+   
+   @Override
+   public synchronized void write(String input){
+      EarlyIORedirect.getInstance().write(input);
+   }
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputListerImpl.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputListerImpl.java
new file mode 100644
index 0000000..ccc651f
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputListerImpl.java
@@ -0,0 +1,36 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+
+public class SystemOutputListerImpl implements SystemOutputListener {
+
+   private OutputStream outputStream;
+
+   public SystemOutputListerImpl(OutputStream outputStream) {
+      this.outputStream = outputStream;
+   }
+
+   @Override
+   public void close() throws IOException {
+      outputStream.close();
+   }
+
+   @Override
+   public void flush() throws IOException {
+      outputStream.flush();
+   }
+
+   @Override
+   public void write(byte[] b, int off, int len) throws IOException {
+      outputStream.write(b, off, len);
+   }
+
+   @Override
+   public void write(byte[] b) throws IOException {
+      outputStream.write(b);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.jms/.classpath b/org.eclipse.osee.ote.jms/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/.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.jms/.project b/org.eclipse.osee.ote.jms/.project
new file mode 100644
index 0000000..a221997
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.jms</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.jms/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.jms/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..caaae93
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE JMS (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.jms
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: 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;resolution:=optional,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.elements,
+ org.eclipse.osee.ote.message.event,
+ org.eclipse.osee.ote.service;resolution:=optional,
+ org.osgi.service.event;version="1.3.0"
+Require-Bundle: org.eclipse.core.runtime
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.ote.jms/OSGI-INF/ote.endpoint.bridge.component.xml b/org.eclipse.osee.ote.jms/OSGI-INF/ote.endpoint.bridge.component.xml
new file mode 100644
index 0000000..8593ec6
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/OSGI-INF/ote.endpoint.bridge.component.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" immediate="true" name="org.eclipse.osee.ote.jms.bridge.endpoint">
+   <property name="event.topics" type="String" value="ote/*"/>
+   <implementation class="org.eclipse.osee.ote.jms.bridge.EventToEndpoint"/>
+   <service>
+      <provide interface="org.osgi.service.event.EventHandler"/>
+   </service>
+   <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.jms/build.properties b/org.eclipse.osee.ote.jms/build.properties
new file mode 100644
index 0000000..6210e84
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.jms/pom.xml b/org.eclipse.osee.ote.jms/pom.xml
new file mode 100644
index 0000000..92d1d5d
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/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.jms</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE JMS</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.jms/src/org/eclipse/osee/ote/jms/bridge/EventToEndpoint.java b/org.eclipse.osee.ote.jms/src/org/eclipse/osee/ote/jms/bridge/EventToEndpoint.java
new file mode 100644
index 0000000..da4e6f7
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/src/org/eclipse/osee/ote/jms/bridge/EventToEndpoint.java
@@ -0,0 +1,45 @@
+package org.eclipse.osee.ote.jms.bridge;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+public class EventToEndpoint  implements EventHandler {
+
+   private OteUdpEndpoint endpoint;
+
+   public void bindOteUdpEndpoint(OteUdpEndpoint endpoint){
+      this.endpoint = endpoint;
+   }
+   
+   public void unbindOteUdpEndpoint(OteUdpEndpoint endpoint){
+      this.endpoint = null;
+   }
+   
+   @Override
+   public void handleEvent(Event arg0) {
+      OteEventMessage oteEventMessage = OteEventMessageUtil.getOteEventMessage(arg0);
+      if(oteEventMessage != null && oteEventMessage.getHeader().TTL.getValue().intValue() == 0){
+         oteEventMessage.getHeader().ADDRESS.setAddress(endpoint.getLocalEndpoint().getAddress());
+         oteEventMessage.getHeader().ADDRESS.setPort(endpoint.getLocalEndpoint().getPort());
+         CopyOnWriteNoIteratorList<OteUdpEndpointSender> broadcastSenders = endpoint.getBroadcastSenders();
+         OteUdpEndpointSender[] oteUdpEndpointSenders = broadcastSenders.get();
+         for(int i = 0; i < oteUdpEndpointSenders.length; i++){
+            try{
+               oteUdpEndpointSenders[i].send(oteEventMessage);
+            } catch (OTEException ex){
+               OseeLog.log(getClass(), Level.SEVERE, ex);
+            }
+         }
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master.feature/.project b/org.eclipse.osee.ote.master.feature/.project
new file mode 100644
index 0000000..7c6f69a
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master.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.ote.master.feature/build.properties b/org.eclipse.osee.ote.master.feature/build.properties
new file mode 100644
index 0000000..64f93a9
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.osee.ote.master.feature/feature.xml b/org.eclipse.osee.ote.master.feature/feature.xml
new file mode 100644
index 0000000..a6ec3be
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/feature.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.osee.ote.master.feature"
+      label="Feature"
+      version="0.25.3.qualifier"
+      provider-name="Eclipse Open System Engineering Environment">
+
+   <description url="http://www.example.com/description">
+      [Enter Feature Description here.]
+   </description>
+
+   <copyright url="http://www.example.com/copyright">
+      [Enter Copyright Description here.]
+   </copyright>
+
+   <license url="http://www.example.com/license">
+      [Enter License Description here.]
+   </license>
+
+   <plugin
+         id="org.eclipse.jetty.continuation"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.jetty.http"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.jetty.io"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.jetty.security"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.jetty.server"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.jetty.servlet"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.jetty.util"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.master"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osee.ote.master.rest"
+         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.core.net"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.security"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.ote.master.feature/pom.xml b/org.eclipse.osee.ote.master.feature/pom.xml
new file mode 100644
index 0000000..18bd8bc
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/pom.xml
@@ -0,0 +1,13 @@
+<project
+	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.master.feature</artifactId>
+	<packaging>eclipse-feature</packaging>
+	<name>OSEE OTE Master Feature - (Incubation)</name>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.feature/sourceTemplateFeature/.gitkeep b/org.eclipse.osee.ote.master.feature/sourceTemplateFeature/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/sourceTemplateFeature/.gitkeep
diff --git a/org.eclipse.osee.ote.master.product/.project b/org.eclipse.osee.ote.master.product/.project
new file mode 100644
index 0000000..d62b3f9
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master.product</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.product/customize-product.xml b/org.eclipse.osee.ote.master.product/customize-product.xml
new file mode 100644
index 0000000..5db9f87
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/customize-product.xml
@@ -0,0 +1,103 @@
+<project name="Customize OSEE OTE Master Product" default="run">
+
+	<!-- *************************************************************** -->
+	<!-- MAIN RUN -->
+	<!-- *************************************************************** -->
+	<target name="run">
+		<echo>Customize OSEE OTE Master Product</echo>
+		<echo>Product-Name: [${product-name}]</echo>
+		<echo>Archive-Name: [${zip-product-name}]</echo>
+		<echo>Products-Path: [${products-directory}]</echo>
+		<echo>Output-Path: [${output-directory}]</echo>
+		<echo>Resources-Path: [${resources-directory}]</echo>
+		<echo />
+
+		<property name="defaultWorkspaceName" value="workspace" />
+		<property name="additionalExecIniArgs" value=" " />
+
+		<updateProduct os="win32" ws="win32" arch="x86" jreVersion="1.8.0_45" />
+		<updateProduct os="win32" ws="win32" arch="x86_64" jreVersion="1.8.0_45" />
+		<updateProduct os="linux" ws="gtk" arch="x86" jreVersion="1.8.0_45" />
+		<updateProduct os="linux" ws="gtk" arch="x86_64" jreVersion="1.8.0_45" />
+		<updateProduct os="macosx" ws="cocoa" arch="x86_64" jreVersion="_" />
+
+		<!-- 
+		<updateProduct os="solaris" ws="gtk" arch="sparc" jreVersion="1.6.0_24" />
+		<updateProduct os="macosx" ws="carbon" arch="x86" jreVersion="_" />
+		<updateProduct os="macosx" ws="cocoa" arch="x86" jreVersion="_" /> 
+		-->
+	</target>
+
+	<!-- *************************************************************** -->
+	<!-- MAIN RUN -->
+	<!-- *************************************************************** -->
+	<macrodef name="updateProduct">
+		<attribute name="os" />
+		<attribute name="ws" />
+		<attribute name="arch" />
+		<attribute name="jreVersion" />
+		<sequential>
+			<var name="productPath" value="${products-directory}/${product-name}/@{os}/@{ws}/@{arch}" />
+			<var name="productConfigPath" value="${productPath}/configuration" />
+			<var name="productPluginPath" value="${productPath}/plugins" />
+			<var name="productEtcPath" value="${productPath}/etc" />
+			
+			<mkdir dir="${productEtcPath}" />
+			<copy todir="${productEtcPath}">
+				<fileset dir="${etc-content-directory}" />
+			</copy>
+
+			<!-- Add JRE 
+			<if>
+				<equals arg1="@{os}" arg2="macosx" />
+				<then> -->
+					<!-- NO JRE for MACOSX -->
+			<!--		</then>
+				<else>
+					<var name="jreResource" value="${resources-directory}/../jres/jre_@{jreVersion}_@{os}_@{arch}.zip" />
+					<unzip src="${jreResource}" dest="${productPath}" />
+					<chmod perm="ugo+x" dir="${productPath}/jre" includes="**/*" />
+				</else>
+			</if>
+			-->
+			
+			<!-- Update Configuration Area 
+			<delete dir="${productConfigPath}/.settings" failonerror="false" quiet="true" />
+			<delete dir="${productConfigPath}/org.eclipse.update" failonerror="false" quiet="true" />
+			<mkdir dir="${productConfigPath}/.settings" />
+			<copy file="${resources-directory}/org.eclipse.core.net.prefs" tofile="${productConfigPath}/.settings/org.eclipse.core.net.prefs" overwrite="true" />
+-->
+			<!-- Update Configuration INI 
+			<customizeConfigIni configpath="${productConfigPath}" pluginspath="${productPluginPath}" configarch="@{arch}" />
+-->
+			<!-- Extra Launches 
+			<generateExecutable os="@{os}" productDir="${productPath}" execName="oseeDebug" eclipseArgs="-console${line.separator}-consoleLog" extravmargs="-Xmx1G${line.separator}-Xdebug${line.separator}-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9009" additionalVmArgs="-Dosee.default.broker.uri=tcp://osee-installs.msc.az.boeing.com:61616${line.separator}${additionalExecIniArgs}" />
+			<generateExecutable os="@{os}" productDir="${productPath}" execName="oseeBigMemory" eclipseArgs="-console${line.separator}-consoleLog" extravmargs="-Xmx2G${line.separator}" additionalVmArgs="-Dosee.default.broker.uri=tcp://osee-installs.msc.az.boeing.com:61616${line.separator}${additionalExecIniArgs}" />
+-->
+			<!-- Copy Icon if Win32 
+			<if>
+				<equals arg1="@{os}" arg2="win32" />
+				<then>
+					<copy file="${resources-directory}/../icons/win32/osee.ico" tofile="${productPath}/OSEE.ico" />
+				</then>
+			</if>
+-->
+			<!-- Zip Product -->
+			<var name="productZipName" value="${products-directory}/${product-name}-@{os}.@{ws}.@{arch}.zip" />
+			<var name="productTarName" value="${products-directory}/${product-name}-@{os}.@{ws}.@{arch}.tar" />
+			<if>
+				<equals arg1="@{os}" arg2="win32" />
+				<then>
+					<zip destfile="${productZipName}" basedir="${productPath}" update="true" />
+				</then>
+				<else>
+					<tar destfile="${productTarName}" basedir="${productPath}" longfile="gnu" />
+					<gzip src="${productTarName}" destfile="${productTarName}.gz" />
+					<delete file="${productTarName}" quiet="true" />
+				</else>
+			</if>
+		</sequential>
+	</macrodef>
+
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.product/etc/ote.server.config.json b/org.eclipse.osee.ote.master.product/etc/ote.server.config.json
new file mode 100644
index 0000000..1272c61
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/etc/ote.server.config.json
@@ -0,0 +1,8 @@
+{
+    "config": [
+         {
+                 "service.pid": "org.eclipse.osee.http.jetty.internal.osgi.InMemoryJettyHttpService",
+                 "jetty.server.context.session.inactive.interval": 3600
+         }
+    ]
+}
diff --git a/org.eclipse.osee.ote.master.product/org.eclipse.osee.ote.master.product b/org.eclipse.osee.ote.master.product/org.eclipse.osee.ote.master.product
new file mode 100644
index 0000000..3e9b8df
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/org.eclipse.osee.ote.master.product
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="OteMasterProduct" uid="org.eclipse.osee.ote.master.product" id="org.eclipse.osee.ote.master.rest.OTEMasterServerProduct" application="org.eclipse.osee.ote.master.app" version="0.23.2.qualifier" useFeatures="true" includeLaunchers="true">
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <programArgs>-console
+      </programArgs>
+      <vmArgs>-Dorg.osgi.service.http.port=8008
+-Ddequinox.ds.debug=true
+-Ddequinox.ds.print=true
+-Dcm.config.uri=&quot;etc/ote.server.config.json&quot;
+      </vmArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+      </vmArgsMac>
+   </launcherArgs>
+
+   <windowImages/>
+
+   <launcher>
+      <solaris/>
+      <win useIco="false">
+         <bmp/>
+      </win>
+   </launcher>
+
+   <vm>
+      <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8</windows>
+   </vm>
+
+   <plugins>
+   </plugins>
+
+   <features>
+      <feature id="org.eclipse.osee.x.core.external.feature"/>
+      <feature id="org.eclipse.osee.x.core.feature"/>
+      <feature id="org.eclipse.osee.ote.master.feature"/>
+      <feature id="org.eclipse.osee.ote.server.external.feature"/>
+      <feature id="org.eclipse.osee.core.feature"/>
+   </features>
+
+   <configurations>
+      <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="4" />
+      <plugin id="org.eclipse.equinox.cm" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.equinox.http.jetty" autoStart="true" startLevel="0" />
+   </configurations>
+
+</product>
diff --git a/org.eclipse.osee.ote.master.product/pom.xml b/org.eclipse.osee.ote.master.product/pom.xml
new file mode 100644
index 0000000..ed2ebb4
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/pom.xml
@@ -0,0 +1,72 @@
+<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.master.product</artifactId>
+	<packaging>eclipse-repository</packaging>
+	<name>OSEE Lookup - Product</name>
+	<version>0.25.3-SNAPSHOT</version>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-p2-director-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<executions>
+					<execution>
+						<id>materialize-products</id>
+						<goals>
+							<goal>materialize-products</goal>
+						</goals>
+					</execution>
+					<!-- <execution> <id>archive-products</id> <goals> <goal>archive-products</goal> 
+						</goals> </execution> -->
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>${maven-antrun-version}</version>
+				<executions>
+					<execution>
+						<id>customize-osee-ote-master</id>
+						<phase>package</phase>
+						<configuration>
+							<target>
+								<property name="plugin_classpath" refid="maven.plugin.classpath" />
+								<taskdef resource="net/sf/antcontrib/antlib.xml">
+									<classpath>
+										<pathelement path="${classpath}" />
+										<pathelement path="${plugin_classpath}" />
+									</classpath>
+								</taskdef>
+
+								<property name="product-name" value="org.eclipse.osee.ote.master.product" />
+								<property name="zip-product-name" value="${product-name}" />
+								<property name="products-directory" value="${project.build.directory}/products" />
+								<property name="output-directory" value="${project.build.directory}" />
+								<property name="resources-directory" value="${project.basedir}/resources" />
+								<property name="etc-content-directory" value="${project.basedir}/etc" />
+
+								<ant antfile="customize-product.xml" target="run"
+									inheritRefs="true" />
+							</target>
+						</configuration>
+						<goals>
+							<goal>run</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/org.eclipse.osee.ote.master.rest.client/.classpath b/org.eclipse.osee.ote.master.rest.client/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.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.master.rest.client/.project b/org.eclipse.osee.ote.master.rest.client/.project
new file mode 100644
index 0000000..e4b3b68
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master.rest.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>
+		<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.master.rest.client/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest.client/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5541a49
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Client Rest (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest.client
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: com.google.inject,
+ com.google.inject.binder,
+ com.google.inject.matcher,
+ com.google.inject.spi,
+ javax.ws.rs;version="2.0.0",
+ javax.ws.rs.client;version="2.0.0",
+ javax.ws.rs.core;version="2.0.0",
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.jaxrs,
+ org.eclipse.osee.jaxrs.client,
+ org.eclipse.osee.ote.master.rest.model
+Export-Package: org.eclipse.osee.ote.master.rest.client
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest.client/OSGI-INF/ote.master.rest.client.xml b/org.eclipse.osee.ote.master.rest.client/OSGI-INF/ote.master.rest.client.xml
new file mode 100644
index 0000000..6c2a6e5
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/OSGI-INF/ote.master.rest.client.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" modified="update">
+   <implementation class="org.eclipse.osee.ote.master.rest.client.internal.OTEMasterServerImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.master.rest.client.OTEMasterServer"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.master.rest.client/build.properties b/org.eclipse.osee.ote.master.rest.client/build.properties
new file mode 100644
index 0000000..6210e84
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.master.rest.client/pom.xml b/org.eclipse.osee.ote.master.rest.client/pom.xml
new file mode 100644
index 0000000..6eaea93
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.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.master.rest.client</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Master Client Rest</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.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServer.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServer.java
new file mode 100644
index 0000000..3ef9077
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServer.java
@@ -0,0 +1,12 @@
+package org.eclipse.osee.ote.master.rest.client;
+
+import java.net.URI;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public interface OTEMasterServer {
+   Future<OTEMasterServerAvailableNodes> getAvailableServers(URI uri);
+   Future<OTEMasterServerResult> addServer(URI uri, OTEServer server);
+   Future<OTEMasterServerResult> removeServer(URI uri, OTEServer server);
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerAvailableNodes.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerAvailableNodes.java
new file mode 100644
index 0000000..f69f2ee
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerAvailableNodes.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.master.rest.client;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class OTEMasterServerAvailableNodes extends OTEMasterServerResult {
+
+   private List<OTEServer> oteServers;
+   
+   public OTEMasterServerAvailableNodes(){
+      oteServers = new ArrayList<>();
+   }
+   
+   public List<OTEServer> getServers(){
+      return oteServers;
+   }
+   
+   public void setServers(OTEServer[] servers) {
+      oteServers.clear();
+      for(OTEServer server:servers){
+         oteServers.add(server);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerResult.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerResult.java
new file mode 100644
index 0000000..df14451
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerResult.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.master.rest.client;
+
+public class OTEMasterServerResult {
+
+   private Throwable th = null;
+   private boolean success = true;
+   
+   public Throwable getThrowable() {
+      return th;
+   }
+   public void setThrowable(Throwable th) {
+      this.th = th;
+   }
+   public boolean isSuccess() {
+      return success;
+   }
+   public void setSuccess(boolean success) {
+      this.success = success;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/AddServer.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/AddServer.java
new file mode 100644
index 0000000..afba074
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/AddServer.java
@@ -0,0 +1,50 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.jaxrs.client.JaxRsWebTarget;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class AddServer implements Callable<OTEMasterServerResult> {
+
+   private final JaxRsClient webClientProvider;
+   private final OTEServer server;
+   private final URI uri;
+
+   public AddServer(JaxRsClient webClientProvider, URI uri, OTEServer server) {
+      this.webClientProvider = webClientProvider;
+      this.uri = uri;
+      this.server = server;
+   }
+
+   @Override
+   public OTEMasterServerResult call() throws Exception {
+      OTEMasterServerResult result = new OTEMasterServerResult();
+      try {
+         URI targetUri =
+               UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).build();
+
+         if(HttpUtil.canConnect(targetUri)){
+            JaxRsWebTarget target = webClientProvider.target(targetUri);
+            javax.ws.rs.client.Invocation.Builder builder = target.request(MediaType.APPLICATION_XML);
+            builder.post(Entity.xml(server));
+         } else {
+            result.setSuccess(false);
+         }
+      } catch (Throwable th) {
+         result.setSuccess(false);
+         //         result.setThrowable(th);
+      }
+      return result;
+   }
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/GetAvailableServers.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/GetAvailableServers.java
new file mode 100644
index 0000000..57bc86f
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/GetAvailableServers.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.URI;
+import java.util.concurrent.Callable;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerAvailableNodes;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class GetAvailableServers implements Callable<OTEMasterServerAvailableNodes> {
+
+   private final JaxRsClient webClientProvider;
+   private final URI uri;
+
+   public GetAvailableServers(JaxRsClient webClientProvider, URI uri) {
+      this.webClientProvider = webClientProvider;
+      this.uri = uri;
+   }
+
+   @Override
+   public OTEMasterServerAvailableNodes call() throws Exception {
+      URI targetUri =
+         UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).build();
+
+      OTEMasterServerAvailableNodes result = new OTEMasterServerAvailableNodes();
+      try {
+         OTEServer[] servers =
+            webClientProvider.target(targetUri).request(MediaType.APPLICATION_XML).get(OTEServer[].class);
+         result.setServers(servers);
+         result.setSuccess(true);
+      } catch (Throwable th) {
+         result.setSuccess(false);
+         result.setThrowable(th);
+      }
+      return result;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/HttpUtil.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/HttpUtil.java
new file mode 100644
index 0000000..1f7edc3
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/HttpUtil.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class HttpUtil {
+
+   public static boolean canConnect(URI targetUri) {
+      try{
+         HttpURLConnection connection = (HttpURLConnection)targetUri.toURL().openConnection();
+         connection.setRequestMethod("HEAD");
+         int responseCode = connection.getResponseCode();
+         if(responseCode == 200){
+            return true;
+         }
+      } catch (Throwable th){
+         OseeLog.log(HttpUtil.class, Level.INFO, th);
+      }
+      return false;
+   }
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/OTEMasterServerImpl.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/OTEMasterServerImpl.java
new file mode 100644
index 0000000..2a5e334
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/OTEMasterServerImpl.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServer;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerAvailableNodes;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class OTEMasterServerImpl implements OTEMasterServer {
+
+   static final String CONTEXT_NAME = "otemaster";
+   static final String CONTEXT_SERVERS = "servers";
+
+   private volatile JaxRsClient client;
+   private ExecutorService executor;
+
+   public void start(Map<String, Object> props) {
+      executor = Executors.newCachedThreadPool(new ThreadFactory() {
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setName("OTE Master Client " + th.getId());
+            th.setDaemon(false);
+            return th;
+         }
+      });
+      update(props);
+   }
+
+   public void stop() {
+      if (executor != null) {
+         executor.shutdown();
+      }
+      client = null;
+   }
+
+   public void update(Map<String, Object> props) {
+      client = JaxRsClient.newBuilder().properties(props).build();
+   }
+
+   @Override
+   public Future<OTEMasterServerAvailableNodes> getAvailableServers(URI uri) {
+      return executor.submit(new GetAvailableServers(client, uri));
+   }
+
+   @Override
+   public Future<OTEMasterServerResult> addServer(URI uri, OTEServer server) {
+      return executor.submit(new AddServer(client, uri, server));
+   }
+
+   @Override
+   public Future<OTEMasterServerResult> removeServer(URI uri, OTEServer server) {
+      return executor.submit(new RemoveServer(client, uri, server));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/RemoveServer.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/RemoveServer.java
new file mode 100644
index 0000000..b91f43f
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/RemoveServer.java
@@ -0,0 +1,46 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import javax.ws.rs.core.UriBuilder;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class RemoveServer implements Callable<OTEMasterServerResult> {
+
+   private final JaxRsClient webClientProvider;
+   private final OTEServer server;
+   private final URI uri;
+
+   public RemoveServer(JaxRsClient webClientProvider, URI uri, OTEServer server) {
+      this.webClientProvider = webClientProvider;
+      this.uri = uri;
+      this.server = server;
+   }
+
+   @Override
+   public OTEMasterServerResult call() throws Exception {
+      OTEMasterServerResult result = new OTEMasterServerResult();
+      try {
+         URI mainTarget  =
+               UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).build();
+         URI targetUri  =
+               UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).path(server.getUUID().toString()).build();
+         if(HttpUtil.canConnect(mainTarget)){
+            webClientProvider.target(targetUri).request().delete();
+         } else {
+            result.setSuccess(false);   
+         }
+      } catch (Throwable th) {
+         result.setSuccess(false);
+         result.setThrowable(th);
+      }
+      return result;
+   }
+}
diff --git a/org.eclipse.osee.ote.master.rest.model/.classpath b/org.eclipse.osee.ote.master.rest.model/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/.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.master.rest.model/.project b/org.eclipse.osee.ote.master.rest.model/.project
new file mode 100644
index 0000000..322c3ad
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master.rest.model</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.master.rest.model/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest.model/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..72e9960
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Rest Model (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest.model
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.master.rest.model
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest.model/build.properties b/org.eclipse.osee.ote.master.rest.model/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.master.rest.model/pom.xml b/org.eclipse.osee.ote.master.rest.model/pom.xml
new file mode 100644
index 0000000..2f4ca45
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/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.master.rest.model</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Master Rest Model</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.master.rest.model/src/org/eclipse/osee/ote/master/rest/model/OTEServer.java b/org.eclipse.osee.ote.master.rest.model/src/org/eclipse/osee/ote/master/rest/model/OTEServer.java
new file mode 100644
index 0000000..76fed87
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/src/org/eclipse/osee/ote/master/rest/model/OTEServer.java
@@ -0,0 +1,107 @@
+package org.eclipse.osee.ote.master.rest.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class OTEServer {
+
+   private String uuid;
+   private String type;
+   private String startTime;
+   private String name;
+   private String station;
+   private String version;
+   private String comment;
+   private String owner;
+   private String oteRestServer;
+   private String oteActivemqServer;
+   private String connectedUsers;
+   
+   public String getStation() {
+      return station;
+   }
+
+   public void setStation(String station) {
+      this.station = station;
+   }
+
+   public String getVersion() {
+      return version;
+   }
+
+   public void setVersion(String version) {
+      this.version = version;
+   }
+
+   public String getComment() {
+      return comment;
+   }
+
+   public void setComment(String comment) {
+      this.comment = comment;
+   }
+
+   public String getOwner() {
+      return owner;
+   }
+
+   public void setOwner(String owner) {
+      this.owner = owner;
+   }
+
+   public String getOteRestServer() {
+      return oteRestServer;
+   }
+
+   public void setOteRestServer(String oteRestServer) {
+      this.oteRestServer = oteRestServer;
+   }
+
+   public String getOteActivemqServer() {
+      return oteActivemqServer;
+   }
+
+   public void setOteActivemqServer(String oteActivemqServer) {
+      this.oteActivemqServer = oteActivemqServer;
+   }
+
+   public String getConnectedUsers() {
+      return connectedUsers;
+   }
+
+   public void setConnectedUsers(String connectedUsers) {
+      this.connectedUsers = connectedUsers;
+   }
+
+   public void setUUID(String uuid){
+      this.uuid = uuid;
+   }
+   
+   public String getType() {
+      return type;
+   }
+   
+   public void setType(String type) {
+      this.type = type;
+   }
+   
+   public String getStartTime() {
+      return startTime;
+   }
+   
+   public void setStartTime(String startTime) {
+      this.startTime = startTime;
+   }
+   
+   public String getName() {
+      return name;
+   }
+   
+   public void setName(String name) {
+      this.name = name;
+   }
+   public String getUUID() {
+      return uuid;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.master.rest.test/.classpath b/org.eclipse.osee.ote.master.rest.test/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/.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.master.rest.test/.project b/org.eclipse.osee.ote.master.rest.test/.project
new file mode 100644
index 0000000..fec674e
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master.rest.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.ote.master.rest.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9a193e2
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Rest Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest.test
+Bundle-Version: 0.25.3.qualifier
+Fragment-Host: org.eclipse.osee.ote.master.rest.client;bundle-version="0.11.1"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit,
+ org.apache.felix.gogo.command,
+ org.apache.felix.gogo.runtime,
+ org.apache.felix.gogo.shell,
+ org.eclipse.equinox.ds,
+ org.eclipse.equinox.console
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest.test/build.properties b/org.eclipse.osee.ote.master.rest.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.master.rest.test/src/org/eclipse/osee/ote/master/rest/test/ClientAPITest.java b/org.eclipse.osee.ote.master.rest.test/src/org/eclipse/osee/ote/master/rest/test/ClientAPITest.java
new file mode 100644
index 0000000..2959aec
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/src/org/eclipse/osee/ote/master/rest/test/ClientAPITest.java
@@ -0,0 +1,120 @@
+package org.eclipse.osee.ote.master.rest.test;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServer;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerAvailableNodes;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+public class ClientAPITest {
+
+   private static final String TEST_URI = "http://localhost:8008/";
+   
+   @Test
+   public void testAdd() throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException {
+      OTEMasterServer oteMaster = getService(OTEMasterServer.class);
+      Assert.assertNotNull(oteMaster);
+      OTEServer server = createServer();
+      
+      Future<OTEMasterServerResult> addServer = oteMaster.addServer(new URI(TEST_URI), server);
+      OTEMasterServerResult oteMasterServerResult = addServer.get(15, TimeUnit.SECONDS);
+      Assert.assertNotNull(oteMasterServerResult);
+      Assert.assertTrue(oteMasterServerResult.isSuccess());
+      
+      Future<OTEMasterServerResult> removeServer = oteMaster.removeServer(new URI(TEST_URI), server);
+      OTEMasterServerResult oteMasterServerResult2 = removeServer.get(15, TimeUnit.SECONDS);
+      Assert.assertNotNull(oteMasterServerResult2);
+      Assert.assertTrue(oteMasterServerResult2.isSuccess());
+      
+      Thread.sleep(1000);
+      
+      Future<OTEMasterServerAvailableNodes> availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+      OTEMasterServerAvailableNodes nodes = availableServers.get(45, TimeUnit.SECONDS);
+      Assert.assertNotNull(nodes);
+      Assert.assertTrue(nodes.isSuccess());
+      Assert.assertEquals(0, nodes.getServers().size());
+   }
+
+   private OTEServer createServer() {
+      OTEServer server = new OTEServer();
+      server.setUUID(UUID.randomUUID().toString());
+      server.setName("test");
+      server.setStartTime(new Date().toString());
+      server.setType("oteserver");
+      server.setOteActivemqServer("tcp://localhost:8998");
+      server.setOteRestServer("http://localhost:8009");
+      return server;
+   }
+   
+   @Test
+   public void testGet() throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException {
+      OTEMasterServer oteMaster = getService(OTEMasterServer.class);
+      Assert.assertNotNull(oteMaster);
+      
+      Future<OTEMasterServerAvailableNodes> availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+      OTEMasterServerAvailableNodes nodes = availableServers.get(45, TimeUnit.SECONDS);
+      Assert.assertNotNull(nodes);
+      Assert.assertTrue(nodes.isSuccess());
+      Assert.assertEquals(0, nodes.getServers().size());
+      
+      OTEServer server = createServer();
+      Future<OTEMasterServerResult> addServer = oteMaster.addServer(new URI(TEST_URI), server);
+      OTEMasterServerResult oteMasterServerResult = addServer.get(15, TimeUnit.SECONDS);
+      Assert.assertNotNull(oteMasterServerResult);
+      Assert.assertTrue(oteMasterServerResult.isSuccess());
+      
+      Thread.sleep(1000);
+      
+      availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+      nodes = availableServers.get(45, TimeUnit.SECONDS);
+      Assert.assertNotNull(nodes);
+      Assert.assertTrue(nodes.isSuccess());
+      Assert.assertEquals(1, nodes.getServers().size());
+      
+      Future<OTEMasterServerResult> removeServer = oteMaster.removeServer(new URI(TEST_URI), server);
+      OTEMasterServerResult oteMasterServerResult2 = removeServer.get(10, TimeUnit.SECONDS);
+      Assert.assertNotNull(oteMasterServerResult2);
+      Assert.assertTrue(oteMasterServerResult2.isSuccess());
+      
+      Thread.sleep(1000);
+      
+      availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+      nodes = availableServers.get(45, TimeUnit.SECONDS);
+      Assert.assertNotNull(nodes);
+      Assert.assertTrue(nodes.isSuccess());
+      Assert.assertEquals(0, nodes.getServers().size());
+      
+   }
+   
+
+   @SuppressWarnings({ "rawtypes", "unchecked" })
+   public static <T> T getService(Class<T> clazz){
+      BundleContext context = getContext();
+      if(context == null){
+         return null;
+      }
+      ServiceReference serviceReference = context.getServiceReference(clazz.getName());
+      if(serviceReference == null){
+         return null;
+      }
+      return (T)getContext().getService(serviceReference);
+   }
+
+   public static BundleContext getContext(){
+      return FrameworkUtil.getBundle(ClientAPITest.class).getBundleContext();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest/.classpath b/org.eclipse.osee.ote.master.rest/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/.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.master.rest/.project b/org.eclipse.osee.ote.master.rest/.project
new file mode 100644
index 0000000..ee8542e
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master.rest</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.master.rest/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1f9082b
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Rest (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: javax.ws.rs,
+ javax.ws.rs.core,
+ javax.ws.rs.ext,
+ org.eclipse.osee.ote.master,
+ org.eclipse.osee.ote.master.rest.model
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest/OSGI-INF/ote.master.rest.application.xml b/org.eclipse.osee.ote.master.rest/OSGI-INF/ote.master.rest.application.xml
new file mode 100644
index 0000000..e1b24be
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/OSGI-INF/ote.master.rest.application.xml
@@ -0,0 +1,8 @@
+<?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="true" name="org.eclipse.osee.ote.rest.internal.OTERestApplication">
+   <implementation class="org.eclipse.osee.ote.master.rest.internal.OTERestApplication"/>
+   <service>
+      <provide interface="javax.ws.rs.core.Application"/>
+   </service>
+   <reference bind="bindOTELookup" cardinality="1..1" interface="org.eclipse.osee.ote.master.OTELookup" name="OTELookup" policy="static" unbind="unbindOTELookup"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.master.rest/build.properties b/org.eclipse.osee.ote.master.rest/build.properties
new file mode 100644
index 0000000..3e5f9ad
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               OSGI-INF/
diff --git a/org.eclipse.osee.ote.master.rest/plugin.xml b/org.eclipse.osee.ote.master.rest/plugin.xml
new file mode 100644
index 0000000..b2deffd
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/plugin.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         id="OTEMasterServerProduct"
+         name="OTE Master Server Product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="org.eclipse.osee.ote.master.app"
+            description="OTE Master Server"
+            name="OteMasterProduct">
+         <property
+               name="appName"
+               value="OteMasterProduct">
+         </property>
+        
+      </product>
+   </extension>
+   <extension
+         id="org.eclipse.osee.ote.master.app"
+         name="OTE Master Server"
+         point="org.eclipse.core.runtime.applications">
+      <application
+            cardinality="singleton-global"
+            thread="main"
+            visible="true">
+         <run
+               class="org.eclipse.osee.ote.master.rest.internal.OTEMasterApplication">
+         </run>
+      </application>
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.master.rest/pom.xml b/org.eclipse.osee.ote.master.rest/pom.xml
new file mode 100644
index 0000000..c21e382
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/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.master.rest</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Master Rest</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.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEAvailableServersResource.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEAvailableServersResource.java
new file mode 100644
index 0000000..a977794
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEAvailableServersResource.java
@@ -0,0 +1,116 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+@Path("servers")
+public class OTEAvailableServersResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+
+   @GET
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public List<OTEServer> getOTEServers() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+      OTELookup oteLookup = OTERestApplication.getOTELookup();
+      List<OTELookupServerEntry> availableServers = oteLookup.getAvailableServers();
+      List<OTEServer> servers = new ArrayList<>();
+      for (OTELookupServerEntry entry : availableServers) {
+         servers.add(Util.convert(entry));
+      }
+      return servers;
+   }
+
+   @GET
+   @Produces(MediaType.TEXT_HTML)
+   public String getAsHtml() {
+      OTELookup oteLookup = OTERestApplication.getOTELookup();
+      List<OTELookupServerEntry> availableServers = oteLookup.getAvailableServers();
+
+      StringBuilder builder = new StringBuilder();
+      builder.append("<html><body>");
+      builder.append("<table border=\"1\">");
+
+      builder.append("<tr>\n");
+      builder.append("<th>");
+      builder.append("Station");
+      builder.append("</th>");
+      builder.append("<th>");
+      builder.append("Name");
+      builder.append("</th>");
+      builder.append("<th>");
+      builder.append("ConnectedUsers");
+      builder.append("</th>");
+      builder.append("<th>");
+      builder.append("StartTime");
+      builder.append("</th>");
+      builder.append("</tr>\n");
+
+      for (OTELookupServerEntry entry : availableServers) {
+         builder.append("<tr>\n");
+         builder.append("<td>");
+         builder.append(entry.getStation());
+         builder.append("</td>");
+         builder.append("<td>");
+         builder.append(entry.getName());
+         builder.append("</td>");
+         builder.append("<td>");
+         builder.append(entry.getConnectedUsers());
+         builder.append("</td>");
+         builder.append("<td>");
+         builder.append(entry.getStartTime());
+         builder.append("</td>");
+         builder.append("</tr>\n");
+      }
+      builder.append("</table>");
+      builder.append("<br/>");
+      builder.append("</body></html>");
+      return builder.toString();
+   }
+
+   @POST
+   @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public void updateServer(OTEServer server) throws Exception {
+      OTELookup oteLookup = OTERestApplication.getOTELookup();
+      oteLookup.addServer(Util.convert(server));
+   }
+
+   @DELETE
+   @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public void removeServer(OTEServer server) throws Exception {
+      OTELookup oteLookup = OTERestApplication.getOTELookup();
+      oteLookup.removeServer(Util.convert(server));
+   }
+   
+   @DELETE
+   @Path("{uuid}")
+   public void removeServer(@PathParam("uuid") String uuid) throws Exception {
+      OTELookup oteLookup = OTERestApplication.getOTELookup();
+      oteLookup.removeServer(UUID.fromString(uuid));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEMasterApplication.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEMasterApplication.java
new file mode 100644
index 0000000..bdf922b
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEMasterApplication.java
@@ -0,0 +1,22 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+
+public class OTEMasterApplication implements IApplication {
+
+   @Override
+   public Object start(IApplicationContext context) throws Exception {
+      Object obj = new Object();
+      synchronized (obj) {
+         obj.wait();
+      }
+      return IApplication.EXIT_OK;
+   }
+
+   @Override
+   public void stop() {
+
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTERestApplication.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTERestApplication.java
new file mode 100644
index 0000000..2fc7b10
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTERestApplication.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+import org.eclipse.osee.ote.master.OTELookup;
+
+@ApplicationPath("otemaster")
+public class OTERestApplication extends Application {
+
+   private static OTELookup oteLookup;
+
+   @Override
+   public Set<Class<?>> getClasses() {
+      Set<Class<?>> classes = new HashSet<>();
+      classes.add(OTEAvailableServersResource.class);
+      return classes;
+   }
+
+   public void start() {
+   }
+
+   public void stop() {
+   }
+
+   public void bindOTELookup(OTELookup oteLookupSrv) {
+      OTERestApplication.oteLookup = oteLookupSrv;
+   }
+
+   public void unbindOTELookup(OTELookup oteLookupSrv) {
+      OTERestApplication.oteLookup = null;
+   }
+
+   static OTELookup getOTELookup() {
+      return oteLookup;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/Util.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/Util.java
new file mode 100644
index 0000000..eafaaf6
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/Util.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+import org.eclipse.osee.ote.master.OTEServerType;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+class Util {
+
+   
+   static OTEServer convert(OTELookupServerEntry entry){
+      OTEServer server = new OTEServer();
+      server.setComment(entry.getComment());
+      server.setConnectedUsers(entry.getConnectedUsers());
+      server.setName(entry.getName());
+      server.setOteActivemqServer(entry.getOteActivemqServer().toString());
+      server.setOteRestServer(entry.getOteRestServer().toString());
+      server.setOwner(entry.getOwner());
+      server.setStartTime(entry.getStartTime().toString());
+      server.setType(entry.getType().getName());
+      server.setStation(entry.getStation());
+      server.setUUID(entry.getUUID().toString());
+      server.setVersion(entry.getVersion());
+      return server;
+   }
+
+   public static OTELookupServerEntry convert(OTEServer server) throws ParseException, URISyntaxException {
+      UUID uuid = UUID.fromString(server.getUUID());
+      URI uri = new URI(server.getOteActivemqServer());
+      DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
+      Date date = df.parse(server.getStartTime());
+      
+      OTELookupServerEntry entry = new OTELookupServerEntry(uuid, uri, server.getName(), new OTEServerTypeGeneric(server.getType()) ,date);
+      entry.setComment(server.getComment());
+      entry.setConnectedUsers(server.getConnectedUsers());
+      entry.setOteActivemqServer(new URI(server.getOteActivemqServer()));
+      entry.setOteRestServer(new URI(server.getOteRestServer()));
+      entry.setOwner(server.getOwner());
+      entry.setStation(server.getStation());
+      entry.setVersion(server.getVersion());
+      return entry;
+   }
+   
+   private static class OTEServerTypeGeneric implements OTEServerType{
+      private final String type;
+      
+      public OTEServerTypeGeneric(String type) {
+         this.type = type;
+      }
+      
+      @Override
+      public String getName(){
+         return this.type;
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.master.test/.classpath b/org.eclipse.osee.ote.master.test/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/.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.master.test/.project b/org.eclipse.osee.ote.master.test/.project
new file mode 100644
index 0000000..0509b92
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master.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.ote.master.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2821f40
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.test
+Bundle-Version: 0.25.3.qualifier
+Fragment-Host: org.eclipse.osee.ote.master;bundle-version="0.11.1"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit;bundle-version="4.10.0"
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.test/build.properties b/org.eclipse.osee.ote.master.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.master.test/pom.xml b/org.eclipse.osee.ote.master.test/pom.xml
new file mode 100644
index 0000000..93e90e9
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/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.master.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+	<name>OTE Master Test</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.master.test/src/org/eclipse/osee/ote/master/internal/OTELookupImplTest.java b/org.eclipse.osee.ote.master.test/src/org/eclipse/osee/ote/master/internal/OTELookupImplTest.java
new file mode 100644
index 0000000..ef4897c
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/src/org/eclipse/osee/ote/master/internal/OTELookupImplTest.java
@@ -0,0 +1,177 @@
+package org.eclipse.osee.ote.master.internal;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+import org.eclipse.osee.ote.master.OTEServerType;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class OTELookupImplTest {
+
+   OTEServerType basicType = new OTEServerType() {
+      @Override
+      public String getName() {
+         return "test";
+      }
+   };
+   
+   private OTELookupServerEntry create(String name) throws URISyntaxException {
+      UUID uuid = UUID.randomUUID();
+      URI uri = new URI("http://localhost:8085/ote");
+      OTELookupServerEntry entry = new OTELookupServerEntry(uuid, uri, name, basicType, new Date());
+      return entry;
+   }
+   
+   @Test
+   public void testAdd() throws URISyntaxException {
+      OTELookup lookup = new OTELookupImpl();
+      
+      OTELookupServerEntry entry = create("test1");
+      lookup.addServer(entry);
+      List<OTELookupServerEntry> servers = lookup.getAvailableServers();
+      
+      Assert.assertTrue(servers.contains(entry));
+      Assert.assertEquals(1, servers.size());
+   }
+   
+   @Test
+   public void testUpdate() throws URISyntaxException {
+      OTELookup lookup = new OTELookupImpl();
+      
+      OTELookupServerEntry entry = create("oldname");
+      lookup.addServer(entry);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+      lookup.addServer(entry);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+   }
+   
+   @Test
+   public void testRemove() throws URISyntaxException {
+      OTELookup lookup = new OTELookupImpl();
+
+      OTELookupServerEntry entry1 = create("name1");
+      lookup.addServer(entry1);
+      
+      OTELookupServerEntry entry2 = create("name2");
+      lookup.addServer(entry2);
+      
+      OTELookupServerEntry entry3 = create("name3");
+      lookup.addServer(entry3);
+      
+      Assert.assertEquals(3, lookup.getAvailableServers().size());
+      
+      lookup.removeServer(entry1);
+      
+      Assert.assertEquals(2, lookup.getAvailableServers().size());
+      
+      lookup.removeServer(entry1);
+      
+      Assert.assertEquals(2, lookup.getAvailableServers().size());
+      
+      lookup.removeServer(entry2);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+      lookup.removeServer(entry3);
+      
+      Assert.assertEquals(0, lookup.getAvailableServers().size());
+   }
+   
+   @Ignore
+   @Test
+   public void testTimeoutRemoval() throws URISyntaxException, InterruptedException {
+      OTELookupImpl lookup = new OTELookupImpl();
+      lookup.setTimeoutSeconds(10);
+      lookup.start();
+      
+      OTELookupServerEntry entry1 = create("name1");
+      lookup.addServer(entry1);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+      Thread.sleep(1000*15);
+      
+      Assert.assertEquals(0, lookup.getAvailableServers().size());
+      
+   }
+   
+   @Ignore
+   @Test
+   public void testTimeoutRemovalLong() throws URISyntaxException, InterruptedException {
+      OTELookupImpl lookup = new OTELookupImpl();
+      lookup.setTimeoutSeconds(60*3);
+      lookup.start();
+      
+      OTELookupServerEntry entry1 = create("name1");
+      lookup.addServer(entry1);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+      Thread.sleep(1000*60);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+      Thread.sleep(1000*60);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+      Thread.sleep(1000*40);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+      Thread.sleep(1000*40);
+      
+      Assert.assertEquals(0, lookup.getAvailableServers().size());
+      
+   }
+   
+   @Ignore
+   @Test
+   public void testTimeoutRemovalLonger() throws URISyntaxException, InterruptedException {
+      OTELookupImpl lookup = new OTELookupImpl();
+      lookup.setTimeoutSeconds(30);
+      lookup.start();
+      
+      OTELookupServerEntry entry1 = create("name1");
+      lookup.addServer(entry1);
+      
+      Assert.assertEquals(1, lookup.getAvailableServers().size());
+      
+      Thread.sleep((1000*15));
+      
+      lookup.addServer(entry1);
+      
+      Thread.sleep((1000*15));
+      
+      lookup.addServer(entry1);
+      
+      Thread.sleep((1000*15));
+
+      lookup.addServer(entry1);
+      
+      Thread.sleep((1000*15));
+      
+      lookup.addServer(entry1);
+      
+      Thread.sleep((1000*15));
+      
+      lookup.addServer(entry1);
+      
+      Thread.sleep((1000*45));
+      
+      Assert.assertEquals(0, lookup.getAvailableServers().size());
+      
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master/.classpath b/org.eclipse.osee.ote.master/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.master/.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.master/.project b/org.eclipse.osee.ote.master/.project
new file mode 100644
index 0000000..bd8756a
--- /dev/null
+++ b/org.eclipse.osee.ote.master/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.master</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.master/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9c78db9
--- /dev/null
+++ b/org.eclipse.osee.ote.master/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.master
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master/OSGI-INF/ote.master.lookup.xml b/org.eclipse.osee.ote.master/OSGI-INF/ote.master.lookup.xml
new file mode 100644
index 0000000..bae9ea3
--- /dev/null
+++ b/org.eclipse.osee.ote.master/OSGI-INF/ote.master.lookup.xml
@@ -0,0 +1,7 @@
+<?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.master.lookup">
+   <implementation class="org.eclipse.osee.ote.master.internal.OTELookupImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.master.OTELookup"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.master/build.properties b/org.eclipse.osee.ote.master/build.properties
new file mode 100644
index 0000000..6210e84
--- /dev/null
+++ b/org.eclipse.osee.ote.master/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.master/pom.xml b/org.eclipse.osee.ote.master/pom.xml
new file mode 100644
index 0000000..b4c800d
--- /dev/null
+++ b/org.eclipse.osee.ote.master/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.master</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Master</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.master/src/org/eclipse/osee/ote/master/OTELookup.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookup.java
new file mode 100644
index 0000000..16037c5
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookup.java
@@ -0,0 +1,14 @@
+package org.eclipse.osee.ote.master;
+
+import java.util.List;
+import java.util.UUID;
+
+public interface OTELookup {
+   List<OTELookupServerEntry> getAvailableServers();
+
+   void addServer(OTELookupServerEntry server);
+
+   void removeServer(OTELookupServerEntry server);
+
+   void removeServer(UUID fromString);
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookupServerEntry.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookupServerEntry.java
new file mode 100644
index 0000000..60e32ff
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookupServerEntry.java
@@ -0,0 +1,175 @@
+package org.eclipse.osee.ote.master;
+
+import java.net.URI;
+import java.util.Date;
+import java.util.UUID;
+
+public class OTELookupServerEntry {
+
+   private final UUID uuid;
+   private final OTEServerType type;
+   private final Date startTime;
+   private final String name;
+   private String station;
+   private String version;
+   private String comment;
+   private String owner;
+   private URI oteRestServer;
+   private URI oteActivemqServer;
+   private String connectedUsers;
+
+   private Date lastUpdate;
+
+   public OTELookupServerEntry(UUID uuid, URI oteActivemqServer, String name, OTEServerType type, Date startTime) {
+      this.name = name;
+      this.uuid = uuid;
+      this.startTime = startTime;
+      this.type = type;
+      this.oteActivemqServer = oteActivemqServer;
+   }
+
+   public UUID getUUID() {
+      return uuid;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public Date getStartTime() {
+      return startTime;
+   }
+
+   public OTEServerType getType() {
+      return type;
+   }
+
+   public URI getURI() {
+      return oteActivemqServer;
+   }
+
+   @Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((name == null) ? 0 : name.hashCode());
+      result = prime * result + ((startTime == null) ? 0 : startTime.hashCode());
+      result = prime * result + ((type == null) ? 0 : type.hashCode());
+      result = prime * result + ((oteActivemqServer == null) ? 0 : oteActivemqServer.hashCode());
+      result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      OTELookupServerEntry other = (OTELookupServerEntry) obj;
+      if (name == null) {
+         if (other.name != null)
+            return false;
+      } else if (!name.equals(other.name))
+         return false;
+      if (startTime == null) {
+         if (other.startTime != null)
+            return false;
+      } else if (!startTime.equals(other.startTime))
+         return false;
+      if (type == null) {
+         if (other.type != null)
+            return false;
+      } else if (!type.getName().equals(other.type.getName()))
+         return false;
+      if (oteActivemqServer == null) {
+         if (other.oteActivemqServer != null)
+            return false;
+      } else if (!oteActivemqServer.equals(other.oteActivemqServer))
+         return false;
+      if (uuid == null) {
+         if (other.uuid != null)
+            return false;
+      } else if (!uuid.equals(other.uuid))
+         return false;
+      return true;
+   }
+
+   synchronized public void setUpdateTime(Date date) {
+      lastUpdate = date;
+   }
+
+   synchronized public Date getUpdateTime() {
+      return lastUpdate;
+   }
+   
+   public String getStation() {
+      return station;
+   }
+
+   public void setStation(String station) {
+      this.station = station;
+   }
+
+   public String getVersion() {
+      return version;
+   }
+
+   public void setVersion(String version) {
+      this.version = version;
+   }
+
+   public String getComment() {
+      return comment;
+   }
+
+   public void setComment(String comment) {
+      this.comment = comment;
+   }
+
+   public String getOwner() {
+      return owner;
+   }
+
+   public void setOwner(String owner) {
+      this.owner = owner;
+   }
+
+   public URI getOteRestServer() {
+      return oteRestServer;
+   }
+
+   public void setOteRestServer(URI oteRestServer) {
+      this.oteRestServer = oteRestServer;
+   }
+
+   public URI getOteActivemqServer() {
+      return oteActivemqServer;
+   }
+
+   public void setOteActivemqServer(URI oteActivemqServer) {
+      this.oteActivemqServer = oteActivemqServer;
+   }
+
+   public String getConnectedUsers() {
+      return connectedUsers;
+   }
+
+   public void setConnectedUsers(String connectedUsers) {
+      this.connectedUsers = connectedUsers;
+   }
+
+   public Date getLastUpdate() {
+      return lastUpdate;
+   }
+
+   public void setLastUpdate(Date lastUpdate) {
+      this.lastUpdate = lastUpdate;
+   }
+
+   public UUID getUuid() {
+      return uuid;
+   }
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTEServerType.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTEServerType.java
new file mode 100644
index 0000000..dfcfb33
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTEServerType.java
@@ -0,0 +1,5 @@
+package org.eclipse.osee.ote.master;
+
+public interface OTEServerType {
+   String getName();
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/LookupTimeoutMonitor.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/LookupTimeoutMonitor.java
new file mode 100644
index 0000000..17e62f2
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/LookupTimeoutMonitor.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.master.internal;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+
+class LookupTimeoutMonitor implements Runnable {
+
+   private final OTELookup oteLookup;
+   private int timeoutSeconds;
+   
+   public LookupTimeoutMonitor(OTELookup oteLookup, int timeoutSeconds) {
+      this.oteLookup = oteLookup;
+      this.timeoutSeconds = timeoutSeconds;
+   }
+
+   @Override
+   public void run() {
+      try{
+         List<OTELookupServerEntry> availableServers = oteLookup.getAvailableServers();
+         Calendar cal = Calendar.getInstance();
+         cal.setTime(new Date());
+         cal.add(Calendar.SECOND, timeoutSeconds*-1);
+         List<OTELookupServerEntry> toRemove = new ArrayList<>();
+         for(OTELookupServerEntry entry: availableServers){
+            if(entry.getUpdateTime().before(cal.getTime())){
+               toRemove.add(entry);
+            }
+         }
+         for(OTELookupServerEntry entry: toRemove){
+            oteLookup.removeServer(entry);
+         }
+      } catch (Throwable th){
+         th.printStackTrace();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/OTELookupImpl.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/OTELookupImpl.java
new file mode 100644
index 0000000..ac77097
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/OTELookupImpl.java
@@ -0,0 +1,101 @@
+package org.eclipse.osee.ote.master.internal;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+
+public class OTELookupImpl implements OTELookup {
+
+   private final List<OTELookupServerEntry> servers;
+  
+   private ScheduledExecutorService executor;
+   private ScheduledFuture<?> scheduleAtFixedRate;
+   private int timeoutSeconds = 60*3;
+
+   public OTELookupImpl() {
+      servers = new CopyOnWriteArrayList<>();
+   }
+
+   @Override
+   public List<OTELookupServerEntry> getAvailableServers() {
+      return servers;
+   }
+
+   @Override
+   public void addServer(OTELookupServerEntry server) {
+      OTELookupServerEntry oldone = find(server);
+      if (oldone == null) {
+         server.setUpdateTime(new Date());
+         servers.add(server);
+      } else {
+         oldone.setConnectedUsers(server.getConnectedUsers());
+         oldone.setUpdateTime(new Date());
+      }
+   }
+
+   @Override
+   public void removeServer(OTELookupServerEntry server) {
+      OTELookupServerEntry oldone = find(server);
+      if (oldone != null) {
+         servers.remove(oldone);
+      }
+   }
+
+   private OTELookupServerEntry find(OTELookupServerEntry otherEntry) {
+      for (OTELookupServerEntry entry : servers) {
+         if (entry.equals(otherEntry)) {
+            return entry;
+         }
+      }
+      return null;
+   }
+   
+   private OTELookupServerEntry find(UUID otherEntry) {
+      for (OTELookupServerEntry entry : servers) {
+         if (entry.getUUID().equals(otherEntry)) {
+            return entry;
+         }
+      }
+      return null;
+   }
+   
+   public void start(){
+      executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setName("OTELookupServerUpdateMonitor");
+            th.setDaemon(true);
+            return th;
+         }
+      });
+      scheduleAtFixedRate = executor.scheduleAtFixedRate(new LookupTimeoutMonitor(this, timeoutSeconds), 0, 5, TimeUnit.SECONDS);
+   }
+   
+   public void stop(){
+      scheduleAtFixedRate.cancel(true);
+      executor.shutdown();
+   }
+   
+   void setTimeoutSeconds(int timeoutSeconds){
+      this.timeoutSeconds = timeoutSeconds;
+   }
+
+   @Override
+   public void removeServer(UUID serverid) {
+      OTELookupServerEntry oldone = find(serverid);
+      if (oldone != null) {
+         servers.remove(oldone);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/.classpath b/org.eclipse.osee.ote.messaging.dds/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/.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.messaging.dds/.pmd b/org.eclipse.osee.ote.messaging.dds/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/.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.messaging.dds/.project b/org.eclipse.osee.ote.messaging.dds/.project
new file mode 100644
index 0000000..f1f576b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.messaging.dds</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.messaging.dds/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c735fb4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: DDS Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.messaging.dds;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote.messaging.dds,
+ org.eclipse.osee.ote.messaging.dds.condition,
+ org.eclipse.osee.ote.messaging.dds.entity,
+ org.eclipse.osee.ote.messaging.dds.listener,
+ org.eclipse.osee.ote.messaging.dds.qos,
+ org.eclipse.osee.ote.messaging.dds.service,
+ org.eclipse.osee.ote.messaging.dds.status,
+ org.eclipse.osee.ote.messaging.dds.test,
+ org.eclipse.osee.ote.messaging.dds.test.data
+Require-Bundle: org.eclipse.osee.framework.jdk.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.ote.messaging.dds/build.properties b/org.eclipse.osee.ote.messaging.dds/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.messaging.dds/pom.xml b/org.eclipse.osee.ote.messaging.dds/pom.xml
new file mode 100644
index 0000000..2cee6bd
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/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.messaging.dds</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE DDS (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.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java
new file mode 100644
index 0000000..926b4dc
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Provides the DDS system with a generic means of handling any data type. Any messages that are sent through the system
+ * must implement this interface so that the DDS system has a means of handling them in a platform independent manner.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface Data {
+
+   /**
+    * This method is used to get a byte array representation of the data. This data should be in such a form that it can
+    * be passed to the <code>setFromByteArray</code> method to acquire the "same" object.
+    * 
+    * @return A byte array version of the state information for this <code>Data</code>
+    */
+   public byte[] toByteArray();
+
+   public ByteBuffer toByteBuffer();
+
+   /**
+    * This method is used to restore a data item's state from a byte array. This method should work in such a manner
+    * that the array received from a <code>Data</code>'s <code>toByteArray</code> method can be passed to this method to
+    * construct an object that is the "same".
+    * 
+    * @param input The byte array to build the state information from.
+    */
+   public void setFromByteArray(byte[] input);
+
+   public void setFromByteBuffer(ByteBuffer buffer);
+
+   public void copyFrom(Data buffer);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public Object getKeyValue();
+
+   public int getOffset();
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java
new file mode 100644
index 0000000..a80995e
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+import java.lang.ref.WeakReference;
+import org.eclipse.osee.ote.messaging.dds.entity.SampleInfo;
+
+/**
+ * Provides a coupling mechanism for <code>SampleInfo</code> with <code>Data</code> instances.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataSample {
+   private final WeakReference<Data> data;
+   private final SampleInfo sampleInfo;
+
+   /**
+    * Create a data sample that is used for propogating data through the system.
+    */
+   public DataSample(Data data, SampleInfo sampleInfo) {
+      this.data = new WeakReference<>(data);
+      this.sampleInfo = sampleInfo;
+   }
+
+   /**
+    * Create a data sample that can be used for receiving propogated data.
+    */
+   public DataSample(Data data) {
+      super();
+      this.data = new WeakReference<>(data);
+      this.sampleInfo = new SampleInfo();
+   }
+
+   /**
+    * @return Returns the data.
+    */
+   public Data getData() {
+      return data.get();
+   }
+
+   /**
+    * @return Returns the sampleInfo.
+    */
+   public SampleInfo getSampleInfo() {
+      return sampleInfo;
+   }
+
+   /**
+    * @param sourceSampleInfo The sampleInfo to set.
+    */
+   public void setSampleInfo(SampleInfo sourceSampleInfo) {
+      sampleInfo.copyFrom(sourceSampleInfo);
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.java
new file mode 100644
index 0000000..aecdcc4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.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.messaging.dds;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+
+/**
+ * Provides a coupling of items used for propogating the publication of data.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataStoreItem {
+   private final DataSample theDataSample;
+   private final TopicDescription theTopicDescription;
+   private final DataWriter theWriter;
+
+   /**
+    * Create a new <code>DataStoreItem</code> that stores references to all of the necessary information for the system
+    * to propogate the data.
+    */
+   public DataStoreItem(DataSample theData, TopicDescription theTopicDescription, DataWriter theWriter) {
+      super();
+      this.theDataSample = theData;
+      this.theTopicDescription = theTopicDescription;
+      this.theWriter = theWriter;
+   }
+
+   /**
+    * @return Returns the theData.
+    */
+   public DataSample getTheDataSample() {
+      return theDataSample;
+   }
+
+   /**
+    * @return Returns the theTopic.
+    */
+   public TopicDescription getTheTopicDescription() {
+      return theTopicDescription;
+   }
+
+   /**
+    * @return Returns the theWriter.
+    */
+   public DataWriter getTheWriter() {
+      return theWriter;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java
new file mode 100644
index 0000000..9475ac9
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * <code>Duration</code> is used to specify a difference in time with nano-second resolution.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Duration extends Time {
+   public final static Duration ZERO_DURATION = new Duration(0, 0);
+   private Time startTime;
+
+   /**
+    * Construct a new <code>Duration</code> with specific values.
+    * 
+    * @param seconds - The number of seconds for the duration.
+    * @param nanoSeconds - The number of nano-seconds for the duration.
+    */
+   public Duration(long seconds, long nanoSeconds) {
+      super(seconds, nanoSeconds);
+   }
+
+   /**
+    * Mark an instant in time as a "start" point. This is used in conjunction with the <code>expired()</code> method.
+    */
+   public void markStart() {
+      startTime = new Time();
+   }
+
+   /**
+    * Check if the time specified by this <code>Duration</code> is less than the amount of time since
+    * <code>markStart()</code> was called.
+    * 
+    * @return <b>true</b> iff the time since <code>markStart()</code> is greater than this duration.
+    */
+   public boolean expired() {
+      return new Time().millisSince(startTime) > this.getMilliseconds();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.java
new file mode 100644
index 0000000..06e53ca
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.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.messaging.dds;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IDestination {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java
new file mode 100644
index 0000000..8ae6293
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IOteData extends Data {
+   /**
+    * signals the end of processing for this data instance. This will return it to the data cache so that it can be
+    * reused
+    */
+   void finish();
+
+   /**
+    * gets the data buffer associated with this instance.
+    */
+   ByteBuffer getDataBuffer();
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.java
new file mode 100644
index 0000000..e05c6c0
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.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.messaging.dds;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISource {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceHandle.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceHandle.java
new file mode 100644
index 0000000..5411e67
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceHandle.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.messaging.dds;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class InstanceHandle {
+   // DONT_NEED this class with the current implemention level of the system
+   public void copyFrom(InstanceHandle instanceHandle) {
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceStateKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceStateKind.java
new file mode 100644
index 0000000..67a3693
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceStateKind.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * The class which stores all of the available states which an instance can be in. The name of any of the values can be
+ * acquired from the <code>getKindName()</code> method inherited from <code>Kind</code>.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class InstanceStateKind extends Kind {
+
+   public final static InstanceStateKind ALIVE = new InstanceStateKind("Alive instance state", 1);
+   public final static InstanceStateKind NOT_ALIVE_DISPOSED = new InstanceStateKind(
+      "Not alive disposed instance state", 2);
+   public final static InstanceStateKind NOT_ALIVE_NO_WRITERS = new InstanceStateKind(
+      "Not alive no writers instance state", 3);
+
+   /**
+    * Local constructor for creating <code>InstanceStateKind</code> objects.
+    * 
+    * @param kindName The name of the kind
+    * @param kindId The id value of the kind
+    */
+   private InstanceStateKind(String kindName, long kindId) {
+      super(kindName, kindId);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.java
new file mode 100644
index 0000000..92a0671
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * Base class for the various *Kind enumerations specified in the DDS specification. This provides the basic structure
+ * and accessor methods that are common for these enumerations.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class Kind {
+   private final String kindName;
+   private final long kindId;
+
+   protected Kind(String kindName, long kindId) {
+      super();
+      this.kindName = kindName;
+      this.kindId = kindId;
+   }
+
+   public String getKindName() {
+      return kindName;
+   }
+
+   public long getKindId() {
+      return kindId;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java
new file mode 100644
index 0000000..fc0726b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * This class is used to mark areas of code that are in the DDS Specification but are not currently implemented.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class NotImplementedException extends RuntimeException {
+
+   private static final long serialVersionUID = 8437766402272756599L;
+
+   /**
+    * Creates a new exception with a message specifying that the given functionality is not implemented.
+    */
+   public NotImplementedException() {
+      super("This functionality has not been implemented");
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java
new file mode 100644
index 0000000..00ab888
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * Provides function status for many of the DDS specification routines. These are used to communicate the result of
+ * function calls, and the usage of them is specified in the DDS specification.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class ReturnCode {
+   public static final ReturnCode OK = new ReturnCode(1, "Successful return");
+   public static final ReturnCode ERROR = new ReturnCode(2, "Generic unspecified error");
+   public static final ReturnCode BAD_PARAMETER = new ReturnCode(3, "Illegal parameter value");
+   public static final ReturnCode UNSUPPORTED = new ReturnCode(4, "Unsupported operation");
+   public static final ReturnCode ALREADY_DELETED = new ReturnCode(5,
+      "The object target of this operation has already been deleted");
+   public static final ReturnCode OUT_OF_RESOURCES = new ReturnCode(6,
+      "Service ran out of resources needed to complete the operation");
+   public static final ReturnCode NOT_ENABLED = new ReturnCode(7, "Operation invoked on an entity not yet enabled");
+   public static final ReturnCode IMMUTABLE_POLICY = new ReturnCode(8,
+      "Application attempted to modify an immutable QoS policy");
+   public static final ReturnCode INCONSISTENT_POLICY = new ReturnCode(9,
+      "Application specified a set of polices that are not consistent with each other");
+   public static final ReturnCode PRECONDITION_NOT_MET = new ReturnCode(10,
+      "A pre-condition for the operation was not met");
+   public static final ReturnCode TIMEOUT = new ReturnCode(11, "The operation timed out");
+   public static final ReturnCode NO_DATA = new ReturnCode(12,
+      "Indicates a transient situation where the operation did not return any data but there is no inherent error");
+
+   private final int value;
+   private final String description;
+
+   /**
+    * Creates a new <code>ReturnCode</code> with a given value and description.
+    */
+   private ReturnCode(int value, String description) {
+      super();
+      this.value = value;
+      this.description = description;
+   }
+
+   /**
+    * @return Returns the description.
+    */
+   public String getDescription() {
+      return description;
+   }
+
+   /**
+    * @return Returns the value.
+    */
+   public int getValue() {
+      return value;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java
new file mode 100644
index 0000000..f95a73b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * The class which stores all of the available read states for a sample. The name of any of the values can be acquired
+ * from the <code>getKindName()</code> method inherited from <code>Kind</code>.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleStateKind extends Kind {
+
+   public final static SampleStateKind READ = new SampleStateKind("Read sample state", 1);
+   public final static SampleStateKind NOT_READ = new SampleStateKind("Not read sample state", 2);
+
+   /**
+    * Local constructor for creating <code>SampleStateKind</code> objects.
+    * 
+    * @param kindName The name of the kind
+    * @param kindId The id value of the kind
+    */
+   private SampleStateKind(String kindName, long kindId) {
+      super(kindName, kindId);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java
new file mode 100644
index 0000000..77cb886
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * The class which stores all of the available kinds of status. The name of any of the values can be acquired from the
+ * <code>getKindName()</code> method inherited from <code>Kind</code>.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class StatusKind extends Kind {
+   public final static StatusKind INCONSISTENT_TOPIC_STATUS = new StatusKind("INCONSISTENT_TOPIC_STATUS", 0x0001 << 0);
+   public final static StatusKind OFFERED_DEADLINE_MISSED_STATUS = new StatusKind("OFFERED_DEADLINE_MISSED_STATUS",
+      0x0001 << 1);
+   public final static StatusKind REQUESTED_DEADLINE_MISSED_STATUS = new StatusKind("REQUESTED_DEADLINE_MISSED_STATUS",
+      0x0001 << 2);
+   public final static StatusKind OFFERED_INCOMPATIBLE_QOS_STATUS = new StatusKind("OFFERED_INCOMPATIBLE_QOS_STATUS",
+      0x0001 << 5);
+   public final static StatusKind REQUESTED_INCOMPATIBLE_QOS_STATUS = new StatusKind(
+      "REQUESTED_INCOMPATIBLE_QOS_STATUS", 0x0001 << 6);
+   public final static StatusKind SAMPLE_LOST_STATUS = new StatusKind("SAMPLE_LOST_STATUS", 0x0001 << 7);
+   public final static StatusKind SAMPLE_REJECTED_STATUS = new StatusKind("SAMPLE_REJECTED_STATUS", 0x0001 << 8);
+   public final static StatusKind DATA_ON_READERS_STATUS = new StatusKind("DATA_ON_READERS_STATUS", 0x0001 << 9);
+   public final static StatusKind DATA_AVAILABLE_STATUS = new StatusKind("DATA_AVAILABLE_STATUS", 0x0001 << 10);
+   public final static StatusKind LIVELINESS_LOST_STATUS = new StatusKind("LIVELINESS_LOST_STATUS", 0x0001 << 11);
+   public final static StatusKind LIVELINESS_CHANGED_STATUS = new StatusKind("LIVELINESS_CHANGED_STATUS", 0x0001 << 12);
+   public final static StatusKind PUBLICATION_MATCH_STATUS = new StatusKind("PUBLICATION_MATCH_STATUS", 0x0001 << 13);
+   public final static StatusKind SUBSCRIPTION_MATCH_STATUS = new StatusKind("SUBSCRIPTION_MATCH_STATUS", 0x0001 << 14);
+
+   /**
+    * Local constructor for creating <code>StatusKind</code> objects.
+    * 
+    * @param kindName The name of the kind
+    * @param kindId The id value of the kind
+    */
+   private StatusKind(String kindName, long kindId) {
+      super(kindName, kindId);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.java
new file mode 100644
index 0000000..2d37714
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.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.messaging.dds;
+
+/**
+ * Provides a time class for marking time with nano-second resolution. This class is not fully implemented yet to
+ * provide proper nano-second data, as it is not being used yet.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Time {
+   protected long seconds;
+   protected long nanoSeconds;
+
+   /**
+    * Creates a <code>Time</code> object with the current time accurate to the second.
+    */
+   public Time() {
+      seconds = System.currentTimeMillis() / 1000;
+      nanoSeconds = 0;
+   }
+
+   public Time(long seconds, long nanoSeconds) {
+      super();
+      this.seconds = seconds;
+      this.nanoSeconds = nanoSeconds;
+   }
+
+   public void copyFrom(Time sourceTime) {
+      this.seconds = sourceTime.seconds;
+      this.nanoSeconds = sourceTime.nanoSeconds;
+   }
+
+   /**
+    * @return Returns the nanoSeconds.
+    */
+   public long getNanoSeconds() {
+      return nanoSeconds;
+   }
+
+   /**
+    * @return Returns the seconds.
+    */
+   public long getSeconds() {
+      return seconds;
+   }
+
+   public long getMilliseconds() {
+      return seconds * 1000 + nanoSeconds / 1000;
+   }
+
+   protected long millisSince(Time time) {
+      return this.getMilliseconds() - time.getMilliseconds();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ViewStateKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ViewStateKind.java
new file mode 100644
index 0000000..df9697c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ViewStateKind.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.messaging.dds;
+
+/**
+ * The class which stores all of the available view states for a sample. The name of any of the values can be acquired
+ * from the <code>getKindName()</code> method inherited from <code>Kind</code>.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class ViewStateKind extends Kind {
+
+   public final static ViewStateKind NEW = new ViewStateKind("New view state", 1);
+   public final static ViewStateKind NOT_NEW = new ViewStateKind("Not new view state", 2);
+
+   /**
+    * Local constructor for creating <code>ViewStateKind</code> objects.
+    * 
+    * @param kindName The name of the kind
+    * @param kindId The id value of the kind
+    */
+   private ViewStateKind(String kindName, long kindId) {
+      super(kindName, kindId);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.java
new file mode 100644
index 0000000..6c32595
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.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.messaging.dds.condition;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Condition {
+   protected boolean trigger;
+
+   public Condition() {
+      this.trigger = false;
+
+      // This class, and the use of it has not been implemented
+      throw new NotImplementedException();
+   }
+
+   public boolean getTrigger() {
+      return trigger;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/GuardCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/GuardCondition.java
new file mode 100644
index 0000000..1237d73
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/GuardCondition.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.messaging.dds.condition;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class GuardCondition extends Condition {
+
+   public GuardCondition() {
+
+      // This class, and the use of it has not been implemented
+      throw new NotImplementedException();
+   }
+
+   public void setTrigger(boolean trigger) {
+      this.trigger = trigger;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.java
new file mode 100644
index 0000000..b8211ab
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * 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.messaging.dds.condition;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class QueryCondition {
+   private final String queryExpression;
+   private Collection<String> queryArguments;
+
+   public QueryCondition(String queryExpression, Collection<String> queryArguments) {
+      super();
+      this.queryExpression = queryExpression;
+      this.queryArguments = Collections.synchronizedList(new ArrayList<String>(queryArguments));
+
+      // This class, and the use of it has not been implemented
+      throw new NotImplementedException();
+   }
+
+   /**
+    * @return Returns the queryArguments.
+    */
+   public Collection<String> getQueryArguments() {
+      return queryArguments;
+   }
+
+   /**
+    * @param queryArguments The queryArguments to set.
+    */
+   public ReturnCode setQueryArguments(Collection<String> queryArguments) {
+      this.queryArguments = Collections.synchronizedList(new ArrayList<String>(queryArguments));
+      return ReturnCode.OK;
+   }
+
+   /**
+    * @return Returns the queryExpression.
+    */
+   public String getQueryExpression() {
+      return queryExpression;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.java
new file mode 100644
index 0000000..5ca0d60
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.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.messaging.dds.condition;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class ReadCondition {
+   private final DataReader dataReader;
+   private final Collection<?> sampleStateKinds;
+   private final Collection<?> viewStateKinds;
+   private final Collection<?> instanceStateKinds;
+
+   public ReadCondition(DataReader dataReader, Collection<?> sampleStateKinds, Collection<?> viewStateKinds, Collection<?> instanceStateKinds) {
+      super();
+      this.dataReader = dataReader;
+      this.sampleStateKinds = sampleStateKinds;
+      this.viewStateKinds = viewStateKinds;
+      this.instanceStateKinds = instanceStateKinds;
+
+      // This class, and the use of it has not been implemented
+      throw new NotImplementedException();
+   }
+
+   /**
+    * @return Returns the dataReader.
+    */
+   public DataReader getDataReader() {
+      return dataReader;
+   }
+
+   /**
+    * @return Returns the instanceStateKinds.
+    */
+   public Collection<?> getInstanceStateKinds() {
+      return instanceStateKinds;
+   }
+
+   /**
+    * @return Returns the sampleStateKinds.
+    */
+   public Collection<?> getSampleStateKinds() {
+      return sampleStateKinds;
+   }
+
+   /**
+    * @return Returns the viewStateKinds.
+    */
+   public Collection<?> getViewStateKinds() {
+      return viewStateKinds;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java
new file mode 100644
index 0000000..2613005
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.messaging.dds.condition;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.Entity;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class StatusCondition extends Condition {
+
+   private final Collection<?> enabledStatuses;
+   private final Entity parentEntity;
+
+   public StatusCondition(Entity parentEntity) {
+
+      this.parentEntity = parentEntity;
+      enabledStatuses = null; // UNSURE find out if this should be something else?
+
+      // This class, and the use of it has not been implemented
+      throw new NotImplementedException();
+   }
+
+   public ReturnCode setEnabledStatuses(Collection<?> mask) {
+      return ReturnCode.ERROR;
+   }
+
+   public Collection<?> getEnabledStatuses() {
+      return enabledStatuses;
+   }
+
+   /**
+    * @return Returns the entity.
+    */
+   public Entity getParentEntity() {
+      return parentEntity;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/WaitSet.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/WaitSet.java
new file mode 100644
index 0000000..384e8d4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/WaitSet.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * 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.messaging.dds.condition;
+
+import java.util.Collection;
+import java.util.concurrent.locks.Condition;
+import org.eclipse.osee.ote.messaging.dds.Duration;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class WaitSet {
+   public WaitSet() {
+
+      // This class, and the use of it has not been implemented
+      throw new NotImplementedException();
+   }
+
+   /**
+    * Not Implemented. Attach a condition to this <code>WaitSet</code>.
+    * 
+    * @param condition The condition to attach
+    * @return ERROR - This method is not implemented
+    */
+   public ReturnCode attachCondition(Condition condition) {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return ReturnCode.ERROR;
+
+   }
+
+   /**
+    * Not Implemented. Detach a condition from this <code>WaitSet</code>.
+    * 
+    * @param condition The condition to detach
+    * @return ERROR - This method is not implemented
+    */
+   public ReturnCode detachCondition(Condition condition) {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return ReturnCode.ERROR;
+
+   }
+
+   /**
+    * Not Implemented. Block execution until a <code>Condition</code> in this <code>WaitSet</code> is triggered. The
+    * provided collection will be used to return a list of the triggered conditions when then call unblocks. The timeout
+    * parameter is used to specify a maximum amount of time that should be consumed by this call, allowing the block to
+    * release with out any of the conditions being met.
+    * 
+    * @param conditions A collection to place the triggered conditions in.
+    * @param timeout A max amount of time to wait on this <code>WaitSet</code>
+    * @return ERROR - This method is not implemented
+    */
+   public ReturnCode wait(Collection<?> conditions, Duration timeout) {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return ReturnCode.ERROR;
+
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/package.html
new file mode 100644
index 0000000..826f4e0
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides classes that support waiting on conditions generated within the DDS system.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java
new file mode 100644
index 0000000..e81cd85
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java
@@ -0,0 +1,625 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.Duration;
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.SampleStateKind;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.ViewStateKind;
+import org.eclipse.osee.ote.messaging.dds.condition.QueryCondition;
+import org.eclipse.osee.ote.messaging.dds.condition.ReadCondition;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+
+/**
+ * The base class which all application specific data readers must extend. Access to read information in the DDS system
+ * is all made possible by this class. This class is partially implemented.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataReader extends DomainEntity {
+   private TopicDescription topicDescription;
+   private Subscriber subscriber;
+   private ByteBuffer dataBuffer;
+   private boolean deleted;
+   private DataStoreItem item;
+
+   /**
+    * Creates a reader with all of the necessary information. This constructor is only visible to the DDS system,
+    * applications should use {@link DomainParticipant#createTopic(String, String, TopicListener)} to create a Topic.
+    */
+   public DataReader(TopicDescription topicDescription, Subscriber subscriber, Boolean enabled, DataReaderListener listener, EntityFactory parentFactory) {
+      super(enabled.booleanValue(), listener, parentFactory);
+      this.topicDescription = topicDescription;
+      this.subscriber = subscriber;
+      this.dataBuffer = ByteBuffer.wrap(new byte[0]);
+      this.deleted = false;
+   }
+
+   /**
+    * Provides access to the deletion flag for this <code>DataReader</code>.
+    * 
+    * @return <b>true</b> iff this has been marked as deleted.
+    */
+   boolean isDeleted() { // package scope since this is system-level code
+      return deleted;
+   }
+
+   /**
+    * Set this item as deleted. This should only be called on the item by the factory which created this reader, and
+    * when the <code>deleteReader()</code> method is called.
+    */
+   void markAsDeleted() { // package scope so that factories of this item can mark it as deleted
+      deleted = true;
+   }
+
+   /**
+    * Retrieve access to the listener assigned to this <code>DataReader</code>. The reader is not guaranteed to have a
+    * listener, so this method may return <b>null</b>, and the user of this method should handle that appropriately.
+    */
+   public DataReaderListener getListener() {
+      return (DataReaderListener) super.getBaseListener();
+   }
+
+   /**
+    * Set the listener for this <code>DataReader</code>. If another listener was already assigned then it will be
+    * overridden with out any error. Additionally, <b>null</b> may be passed as the listener to remove the current
+    * listener from this reader.
+    * 
+    * @param listener - The listener to invoke when events occur.
+    * @param mask - Not implemented, <b>null</b> is acceptable.
+    * @return {@link ReturnCode#OK}
+    */
+   public ReturnCode setListener(DataReaderListener listener, StatusKind mask) {
+      return super.setBaseListener(listener, mask);
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode read(Collection<?> dataSamples, long maxSamples, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode take(Collection<?> dataSamples, long maxSamples, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode readWithCondition(Collection<?> dataSamples, long maxSamples, ReadCondition readCondition) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode takeWithCondition(Collection<?> dataSamples, long maxSamples, ReadCondition readCondition) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * Method for reading or taking the next available <code>DataSample</code> for this reader.
+    * 
+    * @param dataSample - A <code>DataSample</code> which the information will be placed in.
+    * @param isTake - a <code>boolean</code> stating whether the data should be taken by this call. <li>
+    * {@link ReturnCode#NOT_ENABLED} if this reader is not enabled. <li>{@link ReturnCode#NO_DATA} if no data is
+    * available to read or take. <li>{@link ReturnCode#OK} otherwise. </ul>
+    */
+   private ReturnCode readOrTakeNextSample(DataSample dataSample, boolean isTake) {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      DataSample retDataSample = item.getTheDataSample();
+
+      if (retDataSample == null) {
+         return ReturnCode.NO_DATA;
+      }
+
+      // Copy our information in to the supplied buffers
+      //dataSample.getData().setFromByteArray(retDataSample.getData().toByteArray());
+      dataSample.getData().copyFrom(retDataSample.getData());
+      dataSample.setSampleInfo(retDataSample.getSampleInfo());
+
+      // update the local references sample info accordingly
+      dataSample.getSampleInfo().setSampleStateKind(SampleStateKind.READ);
+      dataSample.getSampleInfo().setViewStateKind(ViewStateKind.NOT_NEW);
+      if (isTake) {
+         item = null;
+      }
+      return ReturnCode.OK;
+
+   }
+
+   /**
+    * Method for reading the next available <code>DataSample</code> for this reader.
+    * 
+    * @param dataSample - A <code>DataSample</code> which the information will be placed in. <li>
+    * {@link ReturnCode#NOT_ENABLED} if this reader is not enabled. <li>{@link ReturnCode#NO_DATA} if no data is
+    * available to read or take. <li>{@link ReturnCode#OK} otherwise. </ul>
+    */
+   public ReturnCode readNextSample(DataSample dataSample) {
+      return readOrTakeNextSample(dataSample, false);
+   }
+
+   /**
+    * Method for taking the next available <code>DataSample</code> for this reader.
+    * 
+    * @param dataSample - A <code>DataSample</code> which the information will be placed in. <li>
+    * {@link ReturnCode#NOT_ENABLED} if this reader is not enabled. <li>{@link ReturnCode#NO_DATA} if no data is
+    * available to read or take. <li>{@link ReturnCode#OK} otherwise. </ul>
+    */
+   public ReturnCode takeNextSample(DataSample dataSample) {
+      return readOrTakeNextSample(dataSample, true);
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode readInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode takeInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode readNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode takeNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode readNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, ReadCondition readCondition) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode takeNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, ReadCondition readCondition) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode returnLoan(Collection<?> dataSamples) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode getKeyValue(Data keyHolder, InstanceHandle instanceHandle) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReadCondition createReadCondition(Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public QueryCondition createQueryCondition(Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates, String queryExpression, Collection<?> queryParameters) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode deleteReadCondition(ReadCondition readCondition) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public LivelinessChangedStatus getLivelinessChangedStatus() {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public RequestedDeadlineMissedStatus getRequestedDeadlineMissedStatus() {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public RequestedIncompatibleQosStatus getRequestedIncompatibleQosStatus() {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public SampleRejectedStatus getSampleRejectedStatus() {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public SubscriptionMatchStatus getSubscriptionMatchStatus() {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * @return Returns the topicDescription.
+    */
+   public TopicDescription getTopicDescription() {
+      return topicDescription;
+   }
+
+   /**
+    * @return Returns the subscriber.
+    */
+   public Subscriber getSubscriber() {
+      return subscriber;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode waitForHistoricalData(Duration duration) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode getMatchedPublicationData(PublicationBuiltinTopicData publicationData, InstanceHandle instanceHandle) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode getMatchedPublications(Collection<?> instanceHandles) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+      // object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   public void dispose(){
+      topicDescription = null;
+      subscriber = null;
+      super.dispose();
+   }
+   
+   /**
+    * This is intended to be called whenever new data is "published" to the Service. Calls onDataAvailable on the
+    * attached <code>DataReaderListener</code> as appropriate.
+    */
+   void store(Data theData) { // package scope
+      // Get the data portion from theData
+      ByteBuffer incomingBuffer = theData.toByteBuffer();
+
+      // Check the size, increase the size of dataBuffer only if needed
+      if (incomingBuffer.remaining() != dataBuffer.remaining()) {
+         dataBuffer = ByteBuffer.wrap(new byte[incomingBuffer.remaining()]);
+      }
+
+      incomingBuffer.mark();
+      dataBuffer.put(incomingBuffer);
+      incomingBuffer.reset();
+      dataBuffer.rewind();
+      getListener().onDataAvailable(this);
+   }
+
+   public synchronized void processNewData(DataStoreItem item) {
+      this.item = item;
+      DataReaderListener listener = getListener();
+      if (listener != null) {
+         listener.onDataAvailable(this);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java
new file mode 100644
index 0000000..2dea7f1
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java
@@ -0,0 +1,376 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import java.util.Collection;
+
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.Time;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+
+/**
+ * The base class which all application specific data writers must extend. Access to write information in the DDS system
+ * is all made possible by this class. This class is partially implemented.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataWriter extends DomainEntity {
+   private Topic topic;
+   private Publisher publisher;
+   private boolean deleted;
+   private boolean publishBackToLocalDDSReaders = true;
+
+   /**
+    * Creates a reader with all of the necessary information. This constructor is only visible to the DDS system,
+    * applications should use {@link DomainParticipant#createTopic(String, String, TopicListener)} to create a Topic.
+    */
+   public DataWriter(Topic topic, Publisher publisher, Boolean enabled, DataWriterListener listener, EntityFactory parentFactory) {
+      super(enabled.booleanValue(), listener, parentFactory);
+      this.topic = topic;
+      this.publisher = publisher;
+      this.deleted = false;
+
+      topic.addDataWriter(this);
+   }
+   
+   public DataWriter(){
+	   super(true, null, null);
+	   topic = null;
+	   publisher = null;
+   }
+
+   /**
+    * Provides access to the deletion flag for this <code>DataReader</code>.
+    * 
+    * @return <b>true</b> iff this has been marked as deleted.
+    */
+   boolean isDeleted() { // package scope since this is system-level code
+      return deleted;
+   }
+
+   /**
+    * Set this item as deleted. This should only be called on the item by the factory which created this reader, and
+    * when the <code>deleteWriter()</code> method is called.
+    */
+   void markAsDeleted() { // package scope so that factories of this item can mark it as deleted
+      topic.removeDataWriter(this);
+      deleted = true;
+   }
+
+   /**
+    * Retrieve access to the listener assigned to this <code>DataWriter</code>. The writer is not guaranteed to have a
+    * listener, so this method may return <b>null</b>, and the user of this method should handle that appropriately.
+    */
+   public DataWriterListener getListener() {
+      return (DataWriterListener) super.getBaseListener();
+   }
+
+   /**
+    * Set the listener for this <code>DataWriter</code>. If another listener was already assigned then it will be
+    * overridden with out any error. Additionally, <b>null</b> may be passed as the listener to remove the current
+    * listener from this writer.
+    * 
+    * @param listener - The listener to invoke when events occur.
+    * @param mask - Not implemented, <b>null</b> is acceptable.
+    * @return {@link ReturnCode#OK}
+    */
+   public ReturnCode setListener(DataWriterListener listener, StatusKind mask) {
+      return super.setBaseListener(listener, mask);
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public InstanceHandle register(Data data) {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public InstanceHandle registerWithTimestamp(Data data, Time timestamp) {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public InstanceHandle unregister(Data data, InstanceHandle handle) {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public InstanceHandle unregisterWithTimestamp(Data data, InstanceHandle handle, Time timestamp) {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode getKeyValue(Data keyHolder, InstanceHandle handle) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   // PARTIAL InstanceHandle is not used
+   /**
+    * Method for writing data to the DDS system. This should be overridden to provide type-specific methods for writing
+    * data to the system.
+    * 
+    * @param destination TODO
+    * @param source TODO <li>{@link ReturnCode#NOT_ENABLED} if this writer is not enabled. <li>{@link ReturnCode#OK}
+    * otherwise. </ul>
+    */
+   public ReturnCode write(IDestination destination, ISource source, Data data, InstanceHandle handle) {
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+      //TUNE find a way to reuse the DataSample and DataStoreItem objects instead new'ing them everytime
+      DataSample dataSample = new DataSample(data, new SampleInfo());
+      publisher.publishData(destination, source, new DataStoreItem(dataSample, topic, this));
+
+      return ReturnCode.OK;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode writeWithTimestamp(Data data, InstanceHandle handle, Time timestamp) {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode dispose(Data data, InstanceHandle handle) {
+      dispose();
+      return ReturnCode.UNSUPPORTED;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode diposeWithTimestamp(Data data, InstanceHandle handle, Time timestamp) {
+      dispose();
+      return ReturnCode.UNSUPPORTED;
+   }
+   
+   public void dispose(){
+      topic = null;
+      publisher = null;
+      super.dispose();
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public LivelinessLostStatus getLivelinessLostStatus() {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public OfferedDeadlineMissedStatus getOfferedDeadlineMissedStatus() {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public OfferedIncompatibleQosStatus getOfferedIncompatibleQosStatus() {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public PublicationMatchStatus getPublicationMatchStatus() {
+
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return null;
+   }
+
+   /**
+    * @return Returns the topic.
+    */
+   public Topic getTopic() {
+      return topic;
+   }
+
+   /**
+    * @return Returns the publisher.
+    */
+   public Publisher getPublisher() {
+      return publisher;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void assertLiveliness() {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode getMatchedSubscriptionData(SubscriptionBuiltinTopicData subscriptionData, InstanceHandle subscriptionHandle) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode getMatchedSubscriptions(Collection<?> subscriptionHandles) {
+
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * @return the publishBackToLocalDDSReaders
+    */
+   public boolean isPublishBackToLocalDDSReaders() {
+      return publishBackToLocalDDSReaders;
+   }
+
+   /**
+    * @param publishBackToLocalDDSReaders the publishBackToLocalDDSReaders to set
+    */
+   public void setPublishBackToLocalDDSReaders(boolean publishBackToLocalDDSReaders) {
+      this.publishBackToLocalDDSReaders = publishBackToLocalDDSReaders;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java
new file mode 100644
index 0000000..97425a6
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+
+/**
+ * The base class which all of the entity classes in the DDS system extend, except for the
+ * <code>DomainParticipant</code>. This intermediate class is in place simply to clarify that a
+ * <code>DomainParticipant</code> can contain any other type of entity, except another <code>DomainParticipant</code>.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class DomainEntity extends Entity {
+
+   public DomainEntity(boolean enabled, Listener listener, EntityFactory parentFactory) {
+      super(enabled, listener, parentFactory);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java
new file mode 100644
index 0000000..4968e95
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java
@@ -0,0 +1,619 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+import org.eclipse.osee.ote.messaging.dds.listener.PublisherListener;
+import org.eclipse.osee.ote.messaging.dds.listener.SubscriberListener;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.DomainId;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.service.TypeRegistry;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+
+/**
+ * Provides functionality for applications to participate within a domain as described in the DDS specification. The
+ * DomainParticipant is a factory used by the application to create {@link Publisher}'s and {@link Subscriber}'s to
+ * interact with the system.
+ * <p>
+ * In addition to the functionality described in the DDS specification, this class provides particular functionality to
+ * interact with middleware which could be used to link this with another data system. The middleware is provided a
+ * special publisher to inject data into this system, and receives data from all other publishers by means of the
+ * {@link DomainParticipantListener}.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DomainParticipant extends Entity implements EntityFactory {
+   private final DomainId domainId;
+   // These collections REALLY need to be thread safe!!!
+   private final CopyOnWriteArrayList<Publisher> publishers;
+   private final CopyOnWriteArrayList<Subscriber> subscribers;
+   private final CompositeKeyHashMap<String, String, Topic> topics;
+
+   private final TypeRegistry typeRegistry;
+   private Publisher middlewarePublisher; // Publisher who can send anything
+
+   // DONT_NEED The builtinSubscriber is here for future functionality that is described in the DDS specification but has not been implemented or used.
+   private final Subscriber builtinSubscriber;
+
+   /**
+    * @param domainId The domain this participant will belong to
+    * @param domain A reference to the collection of all participants in this domain.
+    * @param enabled Flag which indicates if this is enabled.
+    * @param listener The listener attached to this.
+    * @param parentFactory A reference to the factory that is creating this.
+    * @param threadedPublishing <code>True</code> if we should create a separate thread for processing published data.
+    * If <code>False</code>, the published data will be processed within the thread which makes the call to write data
+    * into the system (or resume publications).
+    * @param typeCapacity The initial capacity to use when creating the <code>Map</code> for the {@link TypeRegistry}.
+    * @param typeFactor The load factor to use when creating the <code>Map</code> for the {@link TypeRegistry}.
+    */
+   DomainParticipant(DomainId domainId, Collection<DomainParticipant> domain, boolean enabled, DomainParticipantListener listener, EntityFactory parentFactory, boolean threadedPublishing, int typeCapacity, float typeFactor) {
+      super(enabled, listener, parentFactory);
+
+      this.domainId = domainId;
+      this.publishers = new CopyOnWriteArrayList<>(); // Thread Safe
+      this.subscribers = new CopyOnWriteArrayList<>(); // Thread Safe
+      this.topics = new CompositeKeyHashMap<>(512, true);
+      this.middlewarePublisher = null;
+      this.typeRegistry = new TypeRegistry(typeCapacity, typeFactor);
+
+      this.builtinSubscriber = null;
+   }
+
+   /**
+    * Creates the DomainParticipant with default settings for typeCapacity and typeFactor.
+    * 
+    * @see DomainParticipant#DomainParticipant(DomainId, Collection, boolean, DomainParticipantListener, EntityFactory,
+    * boolean, int, float)
+    */
+   DomainParticipant(DomainId domainId, Collection<DomainParticipant> domain, boolean enabled, DomainParticipantListener listener, EntityFactory parentFactory, boolean threadedPublishing) {
+      this(domainId, domain, enabled, listener, parentFactory, threadedPublishing, 256, .75f);
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the builtinSubscriber.
+    */
+   public Subscriber getBuiltinSubscriber() {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return builtinSubscriber;
+   }
+
+   /**
+    * Gets the listener attached to this <code>DomainParticipant</code>.
+    */
+   public DomainParticipantListener getListener() {
+      return (DomainParticipantListener) super.getBaseListener();
+   }
+
+   /**
+    * Sets the listener attached to this <code>DomainParticipant</code>. This replaces the existing listener.
+    * 
+    * @param listener The listener to attach.
+    * @param mask A mask identifying which communication statuses the listener should be invoked.
+    * @return The {@link ReturnCode}returned by {@link Entity#setBaseListener(Listener, StatusKind)}.
+    * @see Entity#setBaseListener(Listener, StatusKind)
+    */
+   public ReturnCode setListener(DomainParticipantListener listener, StatusKind mask) {
+      return super.setBaseListener(listener, mask);
+   }
+
+   /**
+    * Creates a publisher with the passed listener attached.
+    * 
+    * @param publisherListener The listener to attach to the newly created Publisher.
+    * @return The newly created publisher, or null if an error occurred in creation.
+    */
+   private Publisher createAPublisher(PublisherListener publisherListener) {
+      Publisher publisher = null;
+      try {
+         publisher = new Publisher(this, this.isEnabled(), publisherListener);
+         publishers.add(publisher);
+      } catch (OutOfMemoryError er) {
+         er.printStackTrace();
+         publisher = null;
+      }
+
+      return publisher;
+   }
+
+   /**
+    * Creates a middlewarePublisher. If a middlewarePublisher has already been created this will return a reference to
+    * the existing middlewarePublisher. The middlewarePublisher is provided as a link for an outside system to be able
+    * to inject data into this system.
+    * 
+    * @param publisherListener The listener to attach to the newly created <code>Publisher</code>. Note that this can be
+    * null.
+    * @return A <code>Publisher</code> with the passed in listener assigned to it, or null if an error occurred in
+    * creation.
+    */
+   public Publisher getMiddlewarePublisherInstance(PublisherListener publisherListener) {
+      if (middlewarePublisher == null) {
+         middlewarePublisher = createAPublisher(publisherListener);
+      }
+      return middlewarePublisher;
+   }
+
+   /**
+    * Creates a new <code>Publisher</code> with a particular listener assigned to it. The publisher will be created
+    * enabled iff this <code>DomainParticipant</code> is enabled. If an OutOfMemoryError is thrown while attempting get
+    * the new publisher, <b>null </b> will be returned.
+    * 
+    * @param publisherListener The listener to be attached.
+    * @return The newly created <code>Publisher</code>, or null if an error occurred in creation.
+    */
+   public Publisher createPublisher(PublisherListener publisherListener) {
+      Publisher publisher = createAPublisher(publisherListener);
+      if (publisher != null) {
+         publishers.add(publisher);
+      }
+      return publisher;
+   }
+
+   /**
+    * Removes the passed <code>Publisher</code> iff the publisher was created by this <code>DomainParticipant</code> and
+    * does not have any attached <code>DataWriter</code> 's.
+    * 
+    * @param publisher The publisher to be removed.
+    * @return {@link ReturnCode#OK}if the publisher was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if
+    * the publisher had writers or was not created by this DomainParticipant, or {@link ReturnCode#ERROR}.
+    */
+   public ReturnCode deletePublisher(Publisher publisher) {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      // Check that a publisher was supplied
+      if (publisher == null) {
+         return ReturnCode.ERROR;
+      }
+
+      // Check the pre-condition
+      if (publisher.hasDataWriters()) {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+
+      // Attempt to remove, if it did not exist in our list then return an error,
+      // since it can only be removed from the <code>DomainParticipant</code> which created it.
+      if (publishers.remove(publisher)) {
+         return ReturnCode.OK;
+      } else {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+   }
+
+   /**
+    * Creates a <code>Subscriber</code> with the provided listener attached.
+    * 
+    * @param subscriberListener The listener to be attached.
+    * @return The newly created <code>Subscriber</code>, or null if an error occurred in creation.
+    */
+   public Subscriber createSubscriber(SubscriberListener subscriberListener) {
+      Subscriber subscriber = null;
+      try {
+         subscriber = new Subscriber(this, this.isEnabled(), subscriberListener);
+         subscribers.add(subscriber);
+      } catch (OutOfMemoryError er) {
+         er.printStackTrace();
+         subscriber = null;
+      }
+      return subscriber;
+   }
+
+   /**
+    * Removes the passed <code>Subscriber</code> iff the subscriber was created by this <code>DomainParticipant</code>
+    * and does not have any attached <code>DataReader</code> 's.
+    * 
+    * @param subscriber The subscriber to be removed.
+    * @return {@link ReturnCode#OK}if the subscriber was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if
+    * the subscriber had readers or was not created by this DomainParticipant, or {@link ReturnCode#ERROR}.
+    */
+   public ReturnCode deleteSubscriber(Subscriber subscriber) {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      // Check that a subscriber was supplied
+      if (subscriber == null) {
+         return ReturnCode.ERROR;
+      }
+
+      // Check the pre-condition
+      if (subscriber.hasDataReaders()) {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+
+      // Attempt to remove, if it did not exist in our list then return an error,
+      // since it can only be removed from the <code>DomainParticipant</code> which created it.
+      if (subscribers.remove(subscriber)) {
+         return ReturnCode.OK;
+      } else {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+   }
+
+   /**
+    * Creates a <code>Topic</code> on this <code>DomainParticipant</code> with the give name. If a <code>Topic</code>
+    * already exists with the given name, then the existing topic will be returned IF the typeName matches that of the
+    * existing <code>Topic</code>. If the type's do not match, <b>null </b> is returned.
+    * 
+    * @param name The name of the topic to create.
+    * @param typeName The name of the type associated with the topic.
+    * @param topicListener The listener to be attached to the created topic if it is newly created. If the topic already
+    * exists, the provided listener is ignored.
+    * @return A new <code>Topic</code> if one does not already exist, or an existing topic with the same
+    * <code>name</code> and <code>typeName</code>, otherwise <b>null </b>
+    */
+   public Topic createTopic(String name, String namespace, String typeName, TopicListener topicListener) {
+
+      Topic topic = null;
+
+      // Even before that, check that the type was registered
+      TypeSignature typeSignature = typeRegistry.lookupSignature(typeName);
+      if (typeSignature == null) {
+         throw new RuntimeException(String.format("No type signature with name [%s] was found.", typeName));
+      } else {
+
+         // First check to see if the topic already exists
+         TopicDescription topicDescription = lookupTopicDescription(namespace, name);
+         if (topicDescription != null && topicDescription instanceof Topic) {
+
+            topic = (Topic) topicDescription;
+
+            // Make sure that the type name is the same, otherwise it is failure
+            if (topic.getTypeName().equals(typeName)) {
+               // Track that another create has been called for this topic
+               topic.incrementCount();
+            } else {
+               // There is a violation, and no topic will be returned since a topic
+               // with this name already exists, but the types do not match
+               throw new RuntimeException(
+                  String.format(
+                     "found topic name:[%s] namespace:[%s] but there was a type incompatibility between [%s] (from topic [%s]) and [%s].",
+                     name, namespace, topic.getTypeName(), topic.getName(), typeName));
+            }
+         } else { // Otherwise, the topic did not already exist
+            topic = new Topic(this, typeSignature, name, namespace, this.isEnabled(), topicListener, this);
+            topics.put(namespace, name, topic);
+         }
+      }
+      return topic;
+   }
+
+   /**
+    * This method deletes a <code>Topic</code> previously created by this <code>DomainParticipant</code>. No action will
+    * be taken if the topic still has data readers/writers attached to it, or if it was not created by this
+    * <code>DomainParticipant</code>.
+    * 
+    * @param topic The topic to delete.
+    * @return {@link ReturnCode#OK}if the topic was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if the
+    * topic has readers/writers or was not created by this DomainParticipant, {@link ReturnCode#NOT_ENABLED}if this
+    * DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+    */
+   public ReturnCode deleteTopic(Topic topic) {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      // Check the pre-condition
+      if (topic.hasDataReaders()) {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+      // Check the pre-condition
+      if (topic.hasDataWriters()) {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+
+      // Check that a topic was supplied
+      if (topic == null) {
+         return ReturnCode.ERROR;
+      }
+
+      // Attempt to remove, if it did not exist in our list then return an error,
+      // since it can only be removed from the <code>DomainParticipant</code> which created it.
+      if (topics.containsKey(topic.getNamespace() + topic.getName())) {
+         // Reduce the count of creations by 1
+         topic.decrementCount();
+
+         // If the creation count is zero, then remove it from the list
+         if (topic.getCount() <= 0) {
+            topics.removeValues(topic.getNamespace() + topic.getName());
+         }
+
+         return ReturnCode.OK;
+      } else {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+   }
+
+   /**
+    * Get a <code>TopicDescription</code> that matches a particular name. PARTIAL: Since the
+    * <code>ContentFilteredTopic</code> and <code>MultiTopic</code> classes are not implemented, this method simply
+    * searches the list of <code>Topic</code> classes.
+    * 
+    * @param namespace The name to match against the <code>TopicDescription</code>.
+    * @return The <code>TopicDescription</code> that has the specified name, <b>null </b> if no such one exists.
+    */
+   public TopicDescription lookupTopicDescription(String namespace, String topic) {
+      //PARTIAL ContentFilteredTopic and MultiTopic are not implemented, so this only searches Topic.
+      return findTopicByName(namespace, topic);
+   }
+
+   /**
+    * Searches the current list of Topics for this DomainParticipant for a topic whose name matches the provided
+    * topicName
+    * 
+    * @param topicName The topic name to match
+    * @return A reference to the existing topic whose name matches topicName, or null if no such topic exists.
+    */
+   private Topic findTopicByName(String namespace, String topicName) {
+      return topics.get(namespace, topicName);
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return {@link ReturnCode#OK}if the participant was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}
+    * if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+    */
+   public ReturnCode ignoreParticipant() {
+      // UNSURE this is stubbed for now, until we determine it's necessity
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return {@link ReturnCode#OK}if the topic was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}if
+    * this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+    */
+   public ReturnCode ignoreTopic() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return {@link ReturnCode#OK}if the publication was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}
+    * if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+    */
+   public ReturnCode ignorePublication() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return {@link ReturnCode#OK}if the subscription was successfully set to be ignored,
+    * {@link ReturnCode#NOT_ENABLED}if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+    */
+   public ReturnCode ignoreSubscription() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * Gets the <code>DomainId</code> that this <code>DomainParticipant</code> belongs to.
+    * 
+    * @return The <code>DomainId</code> of this participant.
+    */
+   public DomainId getDomainId() {
+      return domainId;
+   }
+
+   /**
+    * Performs a deep deletion of contained entities (Publishers, Subscribers, Topics). This will cause a recursive call
+    * of <code>deleteContainedEntities</code> through out all of the contained entities. This can only be performed if
+    * the <code>DomainParticipant</code> is enabled.
+    * 
+    * @return {@link ReturnCode#OK}if the all entities were successfully deleted, or {@link ReturnCode#NOT_ENABLED}if
+    * this DomainParticipant is not enabled.
+    */
+   public ReturnCode deleteContainedEntities() {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      for (Publisher publisher : publishers) {
+         publisher.deleteContainedEntities();
+      }
+      publishers.clear();
+
+      for (Subscriber subscriber : subscribers) {
+         subscriber.deleteContainedEntities();
+      }
+
+      subscribers.clear();
+
+      this.middlewarePublisher = null;
+
+      // Topics do not contain anything else
+      topics.clear();
+
+      return ReturnCode.OK;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void assertLiveliness() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+   }
+
+   /**
+    * Returns true iff this <code>DomainParticipant</code> contains at least one publisher, subscriber or topic.
+    * 
+    * @return <b>true </b> if this contains an entity, <b>false </b> otherwise.
+    */
+   public boolean hasEntities() {
+      return !(publishers.isEmpty() && subscribers.isEmpty() && topics.isEmpty());
+   }
+
+   /**
+    * Propagates the published data to each <code>Subscriber</code> of this <code>DomainParticipant</code>. Notifies the
+    * middleware (by means of the {@link DomainParticipantListener}of the new data unless it originated from the
+    * middlewarePublisher. The middleware is only notified of data originating from this <code>DomainPariticipant</code>
+    * , that is, data published from other participants in the domain will not be sent to the middleware.
+    * 
+    * @param destination TODO
+    * @param source TODO
+    * @param dataStoreItem The <code>DataStoreItem</code> that was published.
+    */
+   void processPublishedData(IDestination destination, ISource source, DataStoreItem dataStoreItem) { // package scope since it is a
+      // system-level call
+
+      // Notify the middleware of new data, unless it was published by the middlewarePublisher
+      // When data is published by the middlewarePublisher it does not have an associated DataWriter
+
+      DataWriter writer = dataStoreItem.getTheWriter();
+      if (writer != null) {
+         // Invoke the DomainParticipantListener if available
+         DomainParticipantListener domainParticipantListener = getListener();
+         if (domainParticipantListener != null) {
+            domainParticipantListener.onPublishNotifyMiddleware(destination, source, dataStoreItem);
+         }
+
+         // If the writer has a listener, then invoke it
+         DataWriterListener writerListener = writer.getListener();
+         if (writerListener != null) {
+            writerListener.onDataSentToMiddleware(writer);
+         }
+
+      }
+
+      if (writer == null || writer != null && writer.isPublishBackToLocalDDSReaders()) {
+         // Notify all of the subscribers in our domain
+         for (Subscriber domainSubscribers : subscribers) {
+            domainSubscribers.processNewData(dataStoreItem);
+         }
+      }
+   }
+
+   /**
+    * Gets the <code>TypeRegistry</code> used by {@link TypeSupport}to store the types registered for this
+    * <code>DomainParticipant</code>.
+    * 
+    * @return Returns the typeRegistry.
+    */
+   public TypeRegistry getTypeRegistry() {
+      return typeRegistry;
+   }
+
+   /**
+    * Gets the Middleware <code>Publisher</code> if one has been created.
+    * 
+    * @return Returns the <code>Publisher</code> for the middleware, or null if it has not been created.
+    * @see DomainParticipant
+    */
+   public Publisher getMiddlewarePublisher() {
+      return middlewarePublisher;
+   }
+
+   /**
+    * Gets the current <code>Collection</code> of <code>Publisher</code>'s for this <code>DomainPariticpant</code>.
+    * 
+    * @return Returns the <code>Collection</code> of <code>Publisher</code> 's.
+    */
+   public CopyOnWriteArrayList<Publisher> getPublishers() {
+      return publishers;
+   }
+
+   public void dispose() {
+      for (Topic topic : topics.values()) {
+         topic.clearDataReaders();
+         topic.clearDataWriters();
+      }
+      topics.clear();
+      for (Subscriber subscriber : subscribers) {
+         if (subscriber.deleteContainedEntities() == ReturnCode.NOT_ENABLED) {
+            System.err.println("failed to delete subscriber because it was not enabled");
+         }
+      }
+      subscribers.clear();
+
+      for (Publisher publisher : publishers) {
+         publisher.dispose();
+      }
+      publishers.clear();
+
+      typeRegistry.clear();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java
new file mode 100644
index 0000000..24d4dfe
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
+import org.eclipse.osee.ote.messaging.dds.service.DomainId;
+
+/**
+ * This is the entry point of the DDS system. This is a singleton factory class used by the application to create
+ * <code>DomainParticipant</code> 's.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DomainParticipantFactory implements EntityFactory {
+   private static DomainParticipantFactory factory = null;
+   private final Map<DomainId, Collection<DomainParticipant>> domainMap;
+
+   private DomainParticipantFactory() {
+      // This map is very important since data must be sent to all
+      domainMap = Collections.synchronizedMap(new HashMap<DomainId, Collection<DomainParticipant>>(10, .75f));
+   }
+
+   /**
+    * This is a singleton class so this will always return the same DomainParticipantFactory.
+    * 
+    * @return The instance of the <code>DomainParticipantFactory</code>
+    */
+   public static DomainParticipantFactory getInstance() {
+      if (factory == null) {
+         factory = new DomainParticipantFactory();
+      }
+
+      return factory;
+   }
+
+   /**
+    * Creates a <code>DomainParticipant</code> that belongs to this <code>DomainParticipantFactory</code>
+    * 
+    * @param domainId The ID of the domain that the <code>DomainParticipant</code> should belong to. All participants
+    * will receive publications from any publisher in the domain.
+    * @param listener The listener to attach to the <code>DomainParticipant</code>.
+    * @param threadedPublishing <b>true </b> if the participant should use a separate thread for processing
+    * publications.
+    * @return A DomainParticipant in the domainId with provided listener attached.
+    */
+   public DomainParticipant createParticipant(DomainId domainId, DomainParticipantListener listener, boolean threadedPublishing) {
+
+      Collection<DomainParticipant> domain = domainMap.get(domainId);
+
+      // If there is not a collection for this ID yet, then make one and add it to the hash
+      if (domain == null) {
+         domain = Collections.synchronizedList(new ArrayList<DomainParticipant>(1));
+         domainMap.put(domainId, domain);
+      }
+
+      // Get a new DomainParticipant
+      DomainParticipant participant =
+         new DomainParticipant(domainId, domain, this.isEnabled(), listener, this, threadedPublishing);
+
+      // Add the participant to that domain collection
+      domain.add(participant);
+
+      return participant;
+   }
+
+   /**
+    * Removes a <code>DomainParticipant</code> from the <code>DomainParticipantFactory</code>. If the participant
+    * contains entities the method will fail. This can be satisfied by calling
+    * {@link DomainParticipant#deleteContainedEntities()}on the participant.
+    * 
+    * @param participant The participant to be removed.
+    * @return {@link ReturnCode#OK}if successful, otherwise {@link ReturnCode#PRECONDITION_NOT_MET}.
+    */
+   public ReturnCode deleteParticipant(DomainParticipant participant) {
+      // Check the pre-conditions
+      // NOTE: This can be satisfied by calling deleteContainedEntities() on the participant
+      if (participant.hasEntities()) {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+
+      // Remove the participant and return OK status
+      Collection<DomainParticipant> domain = domainMap.get(participant.getDomainId());
+
+      // If the domain doesn't exist, return ALREADY_DELETED
+      if (domain == null) {
+         return ReturnCode.ALREADY_DELETED;
+      }
+
+      // Remove the participant from the domain
+      domain.remove(participant);
+
+      // If the domain is empty now, then remove it from the map
+      if (domain.isEmpty()) {
+         domainMap.remove(participant.getDomainId());
+      }
+
+      return ReturnCode.OK;
+   }
+
+   /**
+    * Finds a <code>DomainParticipant</code> that belongs to the domain passed. If multiple
+    * <code>DomainPariticpant</code>'s are in the domain, any one of them may be returned.
+    * 
+    * @param domainId The domain to find a <code>DomainParticipant</code> in.
+    * @return A <code>DomainParticipant</code> whose domainId matches the id provided, or NULL if the factory does not
+    * contain a participant in the provided domain.
+    */
+   public DomainParticipant lookupParticipant(DomainId domainId) {
+
+      // Attempt to find a matching participant
+      Collection<DomainParticipant> domain = domainMap.get(domainId);
+
+      // If the domain exists, then get the first participant from the domain
+      if (domain != null) {
+         return domain.iterator().next();
+         // Otherwise, no such participant exists
+      } else {
+         return null;
+      }
+   }
+
+   @Override
+   public boolean isEnabled() {
+      // This is always true because DomainParticipantFactory is never disabled nor disableable.
+      return true;
+   }
+
+   public static void dispose() {
+      for (Collection<DomainParticipant> collection : factory.domainMap.values()) {
+         for (DomainParticipant p : collection) {
+            p.dispose();
+         }
+      }
+      factory.domainMap.clear();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java
new file mode 100644
index 0000000..c414fc2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.condition.StatusCondition;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+
+/**
+ * Base class for all <code>Entity</code> objects. Provides common functionality needed for all Entities such as
+ * listeners, enabled, etc.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class Entity {
+
+   private EntityFactory parentFactory;
+   private Listener listener;
+
+   @SuppressWarnings("unused")
+   private StatusKind statusMask; // DONT_NEED This has not been implemented, but is called out in the spec
+   private final StatusCondition statusCondition; //DONT_NEED This has not been implemented, but is called out in the spec
+   private final StatusKind[] statusChanges; //DONT_NEED This has not been implemented, but is called out in the spec
+   private boolean enabled;
+
+   /**
+    * Creates a default <code>Entity</code> with enabled set as passed, the listener attached, and a reference to the
+    * parent creating this.
+    * 
+    * @param enabled The value to set for enabled. If true, <code>enabled()</code> is run.
+    * @param listener The listener to be attached to this.
+    * @param parentFactory The parent which is creating this.
+    */
+   public Entity(boolean enabled, Listener listener, EntityFactory parentFactory) {
+      super();
+
+      this.parentFactory = parentFactory;
+      this.listener = listener;
+
+      // DONT_NEED This has not been implemented, but is called out in the spec
+      this.statusMask = null;
+      this.statusCondition = null;
+      this.statusChanges = null;
+
+      // Default enabled to false, if it is passed as true then call enable() to set this as enabled.
+      this.enabled = false; // This is correct
+      if (enabled) {
+         this.enable();
+      }
+   }
+
+   /**
+    * Sets the <code>Listener</code> attached to this <code>Entity</code>. If a listener is already set, this will
+    * replace it.
+    * <p>
+    * PARTIAL - The statusMask is not currently being used.
+    * 
+    * @param listener The listener to attach to this.
+    * @param statusMask The mask for this listener
+    * @return {@link ReturnCode#OK}
+    */
+   protected ReturnCode setBaseListener(Listener listener, StatusKind statusMask) {
+      this.listener = listener;
+      this.statusMask = statusMask;
+
+      return ReturnCode.OK;
+   }
+
+   /**
+    * Gets the attached listener
+    * 
+    * @return The <code>Listener</code> attached to this <code>Entity</code>.
+    */
+   protected Listener getBaseListener() {
+      return listener;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public StatusCondition getStatusCondition() {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return statusCondition;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public StatusKind[] getStatusChanges() {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return statusChanges;
+   }
+
+   /**
+    * Gets the enabled status.
+    * 
+    * @return Returns <b>true </b> if this <code>Entity</code> has been enabled, otherwise <b>false </b>.
+    */
+   public boolean isEnabled() {
+      return enabled;
+   }
+
+   /**
+    * Enables this entity. This method is idempotent. Note that the creating factory for this entity must be enabled.
+    * 
+    * @return {@link ReturnCode#OK}if successful, or if this was previously enabled.
+    * {@link ReturnCode#PRECONDITION_NOT_MET}if the creating factory is not enabled.
+    */
+   public ReturnCode enable() {
+
+      // Check pre-conditions
+      if (parentFactory != null && !parentFactory.isEnabled()) {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+
+      // If the entity is already enabled, then do nothing and return
+      if (enabled) {
+         return ReturnCode.OK;
+      }
+
+      enabled = true;
+      return ReturnCode.OK;
+   }
+
+   protected void dispose() {
+      parentFactory = null;
+      listener = null;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/EntityFactory.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/EntityFactory.java
new file mode 100644
index 0000000..41ae149
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/EntityFactory.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface EntityFactory {
+
+   /**
+    * Gets the enabled status.
+    * 
+    * @return Returns <b>true </b> if this has been enabled, otherwise <b>false </b>.
+    */
+   public boolean isEnabled();
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.java
new file mode 100644
index 0000000..f425292
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.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.ote.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+
+//UNSURE This class has not been implemented, but is called out in the spec
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class PublicationBuiltinTopicData extends Topic {
+
+   PublicationBuiltinTopicData(DomainParticipant participant, TypeSignature typeName, String name, String namespace, boolean enabled, TopicListener listener, EntityFactory parentFactory) {
+      super(participant, typeName, name, namespace, enabled, listener, parentFactory);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java
new file mode 100644
index 0000000..16fee90
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java
@@ -0,0 +1,388 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+import org.eclipse.osee.ote.messaging.dds.listener.PublisherListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+
+/**
+ * Provides functionality for applications to create <code>DataWriter</code> 's, and control when data written from the
+ * writers is published.
+ * <p>
+ * This class also provides the middleware the ability to publish data directly (i.e. without a <code>DataWriter</code>
+ * ).
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Publisher extends DomainEntity implements EntityFactory {
+
+   private final DomainParticipant participant;
+   private boolean publicationsAllowed;
+   private final CopyOnWriteArrayList<DataWriter> dataWriters;
+   private final Collection<DataStoreItem> publicationQueue; // Stores pending publications to be processed, possibly be a seperate thread
+   private final Collection<DataStoreItem> pendingQueue; // Stores publications while publications are suspended
+
+   /**
+    * Constructor for <code>Publisher</code> with the provided listener attached, and enabled status set as passed. This
+    * constructor is only visible to the DDS system, applications should use
+    * {@link DomainParticipant#createPublisher(PublisherListener)}to create a <code>Publisher</code>..
+    * 
+    * @param participant The participant creating this <code>Publisher</code>. This is also used as the parentEntity for
+    * enabling purposes.
+    * @param enabled If <b>true </b>, the created <code>Publisher</code> will be enabled iff the parentEntity is
+    * enabled.
+    * @param listener The listener to attach to the created publisher.
+    */
+   Publisher(DomainParticipant participant, boolean enabled, PublisherListener listener) {
+      super(enabled, listener, participant);
+
+      this.participant = participant;
+      publicationsAllowed = true;
+      dataWriters = new CopyOnWriteArrayList<>();
+      publicationQueue = new ArrayList<>();
+      pendingQueue = new ArrayList<>();
+   }
+
+   /**
+    * Gets the attached listener.
+    * 
+    * @return The <code>PublisherListener</code> attached to this.
+    * @see Entity#getBaseListener()
+    */
+   public PublisherListener getListener() {
+      return (PublisherListener) super.getBaseListener();
+   }
+
+   /**
+    * Sets the <code>PublisherListener</code> attached to this. If a listener is already set, this will replace it.
+    * 
+    * @see Entity#setBaseListener(Listener, StatusKind)
+    */
+   public ReturnCode setListener(PublisherListener listener, StatusKind mask) {
+      return super.setBaseListener(listener, mask);
+   }
+
+   /**
+    * Creates a <code>DataWriter</code> for the given <code>Topic</code> and adds it to this <code>Publisher</code>.
+    * 
+    * @param topic The <code>Topic</code> associated with the <code>DataWriter</code> to be created.
+    * @param listener The <code>DataWriterListener</code> to be attached to created <code>DataWriter</code>.
+    * @return The <code>DataWriter</code> created, or null if it could not be created.
+    */
+   public DataWriter createDataWriter(Topic topic, DataWriterListener listener) {
+      DataWriter dataWriter = null;
+
+      //TUNE - get the classloader & constructor during Topic creation instead of here
+      try {
+         //         Class writerClass = topic.getTypeSignature().getClassLoader().loadClass(topic.getTypeSignature().getWriterName());
+         //
+         //         Constructor constructor = writerClass.getConstructor(new Class[] {Topic.class, Publisher.class, Boolean.class, DataWriterListener.class,
+         //               EntityFactory.class});
+
+         //         dataWriter = (DataWriter) constructor.newInstance(new Object[] {topic, this, new Boolean(this.isEnabled()), listener, this});
+         dataWriter = new DataWriter(topic, this, new Boolean(this.isEnabled()), listener, this);
+      }
+      //      catch (InstantiationException ex) {
+      //         ex.printStackTrace();
+      //      }
+      //      catch (IllegalAccessException ex) {
+      //         ex.printStackTrace();
+      //      }
+      //      catch (ClassNotFoundException ex) {
+      //         ex.printStackTrace();
+      //      }
+      catch (IllegalArgumentException ex) {
+         ex.printStackTrace();
+      } catch (SecurityException ex) {
+         ex.printStackTrace();
+      }
+      //      catch (InvocationTargetException ex) {
+      //         ex.printStackTrace();
+      //      }
+      //      catch (NoSuchMethodException ex) {
+      //         ex.printStackTrace();
+      //      }
+      catch (OutOfMemoryError er) {
+         er.printStackTrace();
+      }
+
+      // Only keep this writer if it was successfully created.
+      if (dataWriter != null) {
+         dataWriters.add(dataWriter);
+      }
+      return dataWriter;
+   }
+
+   /**
+    * Removes the <code>DataWriter</code> from this <code>Publisher</code>. If the writer was already deleted, or was
+    * not created by this <code>Publisher</code>, an error is returned.
+    * 
+    * @param dataWriter The writer to delete.
+    * @return {@link ReturnCode#OK}if the writer was successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+    * this <code>Publisher</code> is not enabled, or {@link ReturnCode#ALREADY_DELETED}if the writer has already been
+    * deleted, or {@link ReturnCode#PRECONDITION_NOT_MET}if dataWriter was not created by this <code>Publisher</code>.
+    */
+   public ReturnCode deleteDataWriter(DataWriter dataWriter) {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      // Check that the writer is not already marked as deleted (in case others kept a reference to it
+      if (dataWriter.isDeleted()) {
+         return ReturnCode.ALREADY_DELETED;
+      }
+
+      dataWriter.markAsDeleted();
+      if (dataWriters.remove(dataWriter)) {
+         return ReturnCode.OK;
+      } else {
+         // If the data writer wasn't found, then return PRECONDITION_NOT_MET
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public DataWriter lookupDataWriter(String topicName) {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return null;
+   }
+
+   /**
+    * Suspends published data from being processed (sent to the subscribers) until <code>resumePublications()</code> is
+    * called.
+    * 
+    * @return {@link ReturnCode#OK}if publications are successfully suspended, or {@link ReturnCode#NOT_ENABLED}if this
+    * <code>Publisher</code> has not been enabled.
+    */
+   public ReturnCode suspendPublications() {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      publicationsAllowed = false;
+      return ReturnCode.OK;
+   }
+
+   /**
+    * Resumes publications that were suspended by calling <code>suspendPublications()</code>.
+    * 
+    * @return {@link ReturnCode#OK}if publications are successfully suspended, or {@link ReturnCode#NOT_ENABLED}if this
+    * <code>Publisher</code> has not been enabled, or {@link ReturnCode#PRECONDITION_NOT_MET}if publications were not
+    * suspended.
+    */
+   public ReturnCode resumePublications() {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      if (publicationsAllowed) {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+
+      // Move the pending items in to the publishQueue
+      synchronized (pendingQueue) {
+         publicationQueue.addAll(pendingQueue);
+         pendingQueue.clear();
+
+         // Now that the queues have been updated, mark publications as allowed
+         publicationsAllowed = true;
+      }
+
+      publishQueuedData();
+
+      return ReturnCode.OK;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode beginCoherentChanges() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode endCoherentChanges() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * @return the <code>DomainParticipant</code> to which this belongs.
+    */
+   public DomainParticipant getParticipant() {
+      // NOTE this method is part of the DDS spec.
+      return participant;
+   }
+
+   /**
+    * Deletes all of the <code>DataWriter</code> objects currently in this <code>Publisher</code>.
+    * 
+    * @return {@link ReturnCode#OK}if the writers were successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+    * this <code>Publisher</code> is not enabled.
+    */
+   public ReturnCode deleteContainedEntities() {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      for (DataWriter writer : dataWriters) {
+         writer.markAsDeleted();
+      }
+      dataWriters.clear();
+      return ReturnCode.OK;
+   }
+
+   /**
+    * @return <b>true </b> iff this <code>Publisher</code> currently has any data writers.
+    */
+   public boolean hasDataWriters() {
+      return !dataWriters.isEmpty();
+   }
+
+   /**
+    * Allows the MiddlewarePublisher to publish data without providing the <code>Topic</code> object, but instead
+    * specifying the Topic as a string. This method will only publish data when called by the
+    * <code>MiddlewarePublisher</code> of the <code>DomainParticipant</code>. This is intended for an outside System to
+    * be able to publish any data it wants, regardless of if the <code>Topic</code> has been created in the DDS system.
+    * If a <code>Topic</code> with the provided name does not exist in this publisher's <code>DomainParticipant</code>,
+    * the data will not be published.
+    * 
+    * @param theData The Data to be published
+    * @param namespace The name of the Topic associated with theData
+    * @throws IllegalStateException When this method is called by any publisher other than the MiddlewarePublisher
+    */
+   public void publishData(Data theData, String namespace, String topic) {
+      if (theData == null) {
+         throw new NullPointerException("data cannot be null");
+      }
+      if (namespace == null) {
+         throw new NullPointerException("namespace cannot be null");
+      }
+      if (topic == null) {
+         throw new NullPointerException("topic cannot be null");
+      }
+      if (this.participant.getMiddlewarePublisher() == this) {
+         TopicDescription theTopicDescription = this.participant.lookupTopicDescription(namespace, topic);
+         if (theTopicDescription != null) {
+            DataSample dataSample = new DataSample(theData, new SampleInfo());
+            publishData(null, null, new DataStoreItem(dataSample, theTopicDescription, null));
+         }
+      } else {
+         // This should never be called by anything other than the middleware publisher, so throw an exception
+         throw new IllegalStateException("Must be the MiddlewarePublisher to call this method!");
+      }
+   }
+
+   /**
+    * If threading is enabled and publications are not suspended, places the data on the queue to be processed by the
+    * publication thread. If threading is not enabled and publications are not suspended, sends the data to the
+    * <code>DomainParticipant</code> to be sent to be immediately made available to the subscribers. If publications are
+    * suspended the data is queued so it can be processed once publications are resumed.
+    * 
+    * @param destination TODO
+    * @param source TODO
+    * @param dataStoreItem The published data to be processed
+    */
+   void publishData(IDestination destination, ISource source, DataStoreItem dataStoreItem) { // package scope
+
+      // If publications are not allowed, then add the item to the queue, and return
+      synchronized (pendingQueue) {
+         if (!publicationsAllowed) {
+            pendingQueue.add(dataStoreItem);
+            return;
+         }
+      }
+
+      // Otherwise, publications are allowed, so process appropriately
+
+      participant.processPublishedData(destination, source, dataStoreItem);
+   }
+
+   /**
+    * Processes data queued either because we are using a publication thread or because publications were suspended and
+    * have now been resumed. In either case, the data queued is immediately ready to be published and will be completely
+    * processed even if publications are again suspended before processing has completed.
+    */
+   void publishQueuedData() { // package scope so that the publisher thread can make use of this
+      // Only process if there are items in the queue - don't do synchronize if not necessary
+      if (!publicationQueue.isEmpty()) {
+
+         synchronized (publicationQueue) {
+            Iterator<DataStoreItem> iter = publicationQueue.iterator();
+            while (iter.hasNext()) {
+               participant.processPublishedData(null, null, iter.next());
+            }
+            publicationQueue.clear();
+         }
+      }
+   }
+
+   public void dispose() {
+      if (deleteContainedEntities() == ReturnCode.NOT_ENABLED) {
+         System.err.println("failed to delete publisher");
+      }
+      publicationQueue.clear();
+      pendingQueue.clear();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java
new file mode 100644
index 0000000..5bf03c7
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Provides threading capability for the publication of data. The DDS system makes use of this class internally and
+ * controls it as needed to control the publication of data.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+class PublisherThread extends Thread {
+   private final DomainParticipant domainParticipant;
+
+   /**
+    * Get a <code>PublisherThread</code> for a particular <code>DomainParticipant</code>
+    * 
+    * @param domainParticipant - The participant for the thread to call upon
+    */
+   public PublisherThread(DomainParticipant domainParticipant) {
+      super("Publisher Thread");
+      this.domainParticipant = domainParticipant;
+      setDaemon(true);
+   }
+
+   @Override
+   public synchronized void run() {
+
+      try {
+         while (true) {
+            wait(); // Wait for a notify
+
+            // Once notified, call all the queue publishing
+            Collection<Publisher> publishers = domainParticipant.getPublishers();
+            synchronized (publishers) {
+               Iterator<Publisher> iter = publishers.iterator();
+               while (iter.hasNext()) {
+                  iter.next().publishQueuedData();
+               }
+            }
+         }
+      } catch (InterruptedException ex) {
+         // We do not expect to be interrupted, so print the error
+         ex.printStackTrace();
+      }
+   }
+
+   /**
+    * Method to cause the thread to publish the queue'd information in each <code>Subscriber</code> then go back to
+    * sleep.
+    */
+   public synchronized void wakeUp() {
+      notifyAll();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java
new file mode 100644
index 0000000..1c18977
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java
@@ -0,0 +1,296 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+import org.eclipse.osee.ote.messaging.dds.InstanceStateKind;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.SampleStateKind;
+import org.eclipse.osee.ote.messaging.dds.Time;
+import org.eclipse.osee.ote.messaging.dds.ViewStateKind;
+
+/*
+ * NOTE: This class is in the same package as DataReader so that the setter methods
+ *       on this class can have 'default'/'package' visibility, allowing only the
+ *       DDS system classes modify the SampleInfo fields, and thusly causing the
+ *       application using the DDS system to only be able to read the fields.
+ */
+
+/**
+ * Provides information about a sample of data. This class is not fully implemented, but is passed through the system
+ * with default values in the current implementation.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleInfo {
+
+   public static final SampleInfo DEFAULT_SAMPLE_INFO = new SampleInfo(null, null, null, 0, 0, 0, 0, 0, null, null);
+
+   private SampleStateKind sampleStateKind;
+   private ViewStateKind viewStateKind;
+   private InstanceStateKind instanceStateKind;
+   private long disposeGenerationCount;
+   private long noWritersGenerationCount;
+   private long sampleRank;
+   private long generationRank;
+   private long absoluteGenerationRank;
+   private Time sourceTimestamp;
+   private InstanceHandle instanceHandle;
+
+   /**
+    * Create a <code>SampleInfo</code> with particular values for all of the state date.
+    */
+   public SampleInfo(SampleStateKind sampleStateKind, ViewStateKind viewStateKind, InstanceStateKind instanceStateKind, long disposeGenerationCount, long noWritersGenerationCount, long sampleRank, long generationRank, long absoluteGenerationRank, Time sourceTimestamp, InstanceHandle instanceHandle) {
+      super();
+      this.sampleStateKind = sampleStateKind;
+      this.viewStateKind = viewStateKind;
+      this.instanceStateKind = instanceStateKind;
+      this.disposeGenerationCount = disposeGenerationCount;
+      this.noWritersGenerationCount = noWritersGenerationCount;
+      this.sampleRank = sampleRank;
+      this.generationRank = generationRank;
+      this.absoluteGenerationRank = absoluteGenerationRank;
+      this.sourceTimestamp = sourceTimestamp;
+      this.instanceHandle = instanceHandle;
+   }
+
+   /**
+    * Create a <code>SampleInfo</code> with default values for all of the state data.
+    */
+   public SampleInfo() {
+      this(SampleStateKind.NOT_READ, ViewStateKind.NEW, InstanceStateKind.ALIVE, 0, 0, 0, 0, 0, new Time(),
+         new InstanceHandle());
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the absoluteGenerationRank.
+    */
+   public long getAbsoluteGenerationRank() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return absoluteGenerationRank;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the disposeGenerationCount.
+    */
+   public long getDisposeGenerationCount() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return disposeGenerationCount;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the generationRank.
+    */
+   public long getGenerationRank() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return generationRank;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the instanceHandle.
+    */
+   public InstanceHandle getInstanceHandle() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return instanceHandle;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the instanceStateKind.
+    */
+   public InstanceStateKind getInstanceStateKind() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return instanceStateKind;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the noWritersGenerationCount.
+    */
+   public long getNoWritersGenerationCount() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return noWritersGenerationCount;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the sampleRank.
+    */
+   public long getSampleRank() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return sampleRank;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the sampleStateKind.
+    */
+   public SampleStateKind getSampleStateKind() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return sampleStateKind;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the sourceTimestamp.
+    */
+   public Time getSourceTimestamp() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return sourceTimestamp;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    * 
+    * @return Returns the viewStateKind.
+    */
+   public ViewStateKind getViewStateKind() {
+      //DONT_NEED
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return viewStateKind;
+   }
+
+   public void copyFrom(SampleInfo sampleInfo) {
+      this.sampleStateKind = sampleInfo.sampleStateKind;
+      this.viewStateKind = sampleInfo.viewStateKind;
+      this.instanceStateKind = sampleInfo.instanceStateKind;
+      this.disposeGenerationCount = sampleInfo.disposeGenerationCount;
+      this.noWritersGenerationCount = sampleInfo.noWritersGenerationCount;
+      this.sampleRank = sampleInfo.sampleRank;
+      this.generationRank = sampleInfo.generationRank;
+      this.absoluteGenerationRank = sampleInfo.absoluteGenerationRank;
+      this.sourceTimestamp.copyFrom(sampleInfo.sourceTimestamp);
+      this.instanceHandle.copyFrom(sampleInfo.instanceHandle);
+   }
+
+   /**
+    * @param absoluteGenerationRank The absoluteGenerationRank to set.
+    */
+   void setAbsoluteGenerationRank(long absoluteGenerationRank) {
+      this.absoluteGenerationRank = absoluteGenerationRank;
+   }
+
+   /**
+    * @param disposeGenerationCount The disposeGenerationCount to set.
+    */
+   void setDisposeGenerationCount(long disposeGenerationCount) {
+      this.disposeGenerationCount = disposeGenerationCount;
+   }
+
+   /**
+    * @param generationRank The generationRank to set.
+    */
+   void setGenerationRank(long generationRank) {
+      this.generationRank = generationRank;
+   }
+
+   /**
+    * @param instanceHandle The instanceHandle to set.
+    */
+   void setInstanceHandle(InstanceHandle instanceHandle) {
+      this.instanceHandle = instanceHandle;
+   }
+
+   /**
+    * @param instanceStateKind The instanceStateKind to set.
+    */
+   void setInstanceStateKind(InstanceStateKind instanceStateKind) {
+      this.instanceStateKind = instanceStateKind;
+   }
+
+   /**
+    * @param noWritersGenerationCount The noWritersGenerationCount to set.
+    */
+   void setNoWritersGenerationCount(long noWritersGenerationCount) {
+      this.noWritersGenerationCount = noWritersGenerationCount;
+   }
+
+   /**
+    * @param sampleRank The sampleRank to set.
+    */
+   void setSampleRank(long sampleRank) {
+      this.sampleRank = sampleRank;
+   }
+
+   /**
+    * @param sampleStateKind The sampleStateKind to set.
+    */
+   void setSampleStateKind(SampleStateKind sampleStateKind) {
+      this.sampleStateKind = sampleStateKind;
+   }
+
+   /**
+    * @param sourceTimestamp The sourceTimestamp to set.
+    */
+   void setSourceTimestamp(Time sourceTimestamp) {
+      this.sourceTimestamp = sourceTimestamp;
+   }
+
+   /**
+    * @param viewStateKind The viewStateKind to set.
+    */
+   void setViewStateKind(ViewStateKind viewStateKind) {
+      this.viewStateKind = viewStateKind;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java
new file mode 100644
index 0000000..6cd6490
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java
@@ -0,0 +1,337 @@
+/*******************************************************************************
+ * 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.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+import org.eclipse.osee.ote.messaging.dds.listener.SubscriberListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+
+/**
+ * Provides functionality for applications to create <code>DataReader</code>'s to receive the appropriate published
+ * data. Maintains the data which is made available to those <code>DataReader</code> 's.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Subscriber extends DomainEntity implements EntityFactory {
+
+   private final ConcurrentHashMap<TopicDescription, CopyOnWriteArrayList<DataReader>> topicMap =
+      new ConcurrentHashMap<TopicDescription, CopyOnWriteArrayList<DataReader>>(512);
+   private final DomainParticipant participant;
+   private final ExecutorService threadService;
+
+   /**
+    * Constructor for <code>Subscriber</code> with the provided listener attached, and enabled status set as passed.
+    * This constructor is only visible to the DDS system, applications should use
+    * {@link DomainParticipant#createSubscriber(SubscriberListener)}to create a <code>Subscriber</code>.
+    * 
+    * @param participant The participant creating this <code>Subscriber</code>. This is also used as the parentEntity
+    * for enabling purposes.
+    * @param enabled If <b>true </b>, the created <code>Subscriber</code> will be enabled iff the parentEntity is
+    * enabled.
+    * @param listener The listener to attach to the created subscriber.
+    */
+   Subscriber(DomainParticipant participant, boolean enabled, Listener listener) {
+      super(enabled, listener, participant);
+      this.participant = participant;
+      threadService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
+   }
+
+   /**
+    * Gets the attached listener.
+    * 
+    * @return The <code>SubscriberListener</code> attached to this.
+    * @see Entity#getBaseListener()
+    */
+   public SubscriberListener getListener() {
+      return (SubscriberListener) super.getBaseListener();
+   }
+
+   /**
+    * Sets the <code>SubscriberListener</code> attached to this. If a listener is already set, this will replace it.
+    * 
+    * @see Entity#setBaseListener(Listener, StatusKind)
+    */
+   public ReturnCode setListener(SubscriberListener listener, StatusKind mask) {
+      return super.setBaseListener(listener, mask);
+   }
+
+   /**
+    * Creates a <code>DataReader</code> for the given <code>Topic</code> and adds it to this <code>Subscriber</code>.
+    * 
+    * @param topicDescription The <code>Topic</code> associated with the <code>DataReader</code> to be created.
+    * @param listener The <code>DataReaderListener</code> to be attached to the created <code>DataReader</code>.
+    * @return The <code>DataReader</code> created, or null if it could not be created.
+    */
+   public DataReader createDataReader(TopicDescription topicDescription, DataReaderListener listener) {
+      DataReader dataReader = null;
+
+      if (true != topicDescription instanceof Topic) {
+         return null;
+      }
+
+      //TUNE - get the classloader & constructor during Topic creation instead of here
+      try {
+         //         Class readerClass = topic.getTypeSignature().getClassLoader().loadClass(topic.getTypeSignature().getReaderName());
+         //
+         //         Constructor constructor = readerClass.getConstructor(new Class[] {TopicDescription.class, Subscriber.class, Boolean.class, DataReaderListener.class,
+         //               EntityFactory.class});
+         //
+         //         dataReader = (DataReader) constructor.newInstance(new Object[] {topicDescription, this, new Boolean(this.isEnabled()), listener, this});
+
+         dataReader = new DataReader(topicDescription, this, new Boolean(this.isEnabled()), listener, this);
+      }
+      //      catch (InstantiationException ex) {
+      //         ex.printStackTrace();
+      //      }
+      //      catch (IllegalAccessException ex) {
+      //         ex.printStackTrace();
+      //      }
+      //      catch (ClassNotFoundException ex) {
+      //         ex.printStackTrace();
+      //      }
+      catch (IllegalArgumentException ex) {
+         ex.printStackTrace();
+      } catch (SecurityException ex) {
+         ex.printStackTrace();
+      }
+      //      catch (InvocationTargetException ex) {
+      //         ex.printStackTrace();
+      //      }
+      //      catch (NoSuchMethodException ex) {
+      //         ex.printStackTrace();
+      //      }
+      catch (OutOfMemoryError er) {
+         er.printStackTrace();
+      }
+
+      // Only keep this writer if it was successfully created.
+      if (dataReader != null) {
+         CopyOnWriteArrayList<DataReader> readers = topicMap.get(topicDescription);
+         if (readers == null) {
+            readers = new CopyOnWriteArrayList<>();
+            topicMap.put(topicDescription, readers);
+         }
+         readers.add(dataReader);
+      }
+      return dataReader;
+   }
+
+   /**
+    * Removes the <code>DataReader</code> from this <code>Subscriber</code>. If the reader was already deleted, or was
+    * not created by this <code>Subscriber</code>, an error is returned.
+    * 
+    * @param dataReader The reader to delete.
+    * @return {@link ReturnCode#OK}if the reader was successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+    * this <code>Subscriber</code> is not enabled, or {@link ReturnCode#ALREADY_DELETED}if the reader has already been
+    * deleted, or {@link ReturnCode#PRECONDITION_NOT_MET}if dataReader was not created by this <code>Subscriber</code>.
+    */
+   public ReturnCode deleteDataReader(DataReader dataReader) {
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      // Check that the writer is not already marked as deleted (in case others kept a reference to it
+      if (dataReader.isDeleted()) {
+         return ReturnCode.ALREADY_DELETED;
+      }
+
+      //      boolean found = dataReaders.remove(dataReader);
+
+      if (topicMap.remove(dataReader.getTopicDescription()) != null) {
+         dataReader.markAsDeleted();
+         return ReturnCode.OK;
+      } else {
+         return ReturnCode.PRECONDITION_NOT_MET;
+      }
+
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public DataReader lookupDataReader(String topicName) {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return null;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode beginAccess() {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode endAccess() {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public ReturnCode getDataReaders(Collection<DataReader> dataReaders, Collection<?> sampleStateKind, Collection<?> viewStateKind, Collection<?> instanceStateKind) {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      return ReturnCode.ERROR;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void notifyDataReaders() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public SampleLostStatus getSampleLostStatus() {
+      // UNSURE This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      return null;
+   }
+
+   /**
+    * @return the <code>DomainParticipant</code> to which this belongs.
+    */
+   public DomainParticipant getParticipant() {
+      // NOTE this method is part of the DDS spec.
+      return participant;
+   }
+
+   /**
+    * Deletes all of the <code>DataReader</code> objects currently in this <code>Subscriber</code>.
+    * 
+    * @return {@link ReturnCode#OK}if the readers were successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+    * this <code>Subscriber</code> is not enabled.
+    */
+   public ReturnCode deleteContainedEntities() {
+      /*
+       * PARTIAL per the DDS spec, this should also delete the ReadCondition and QueryCondition objects stored in the
+       * <code> DataReader </code> 's, however because we haven't implemented the conditions they are not deleted here.
+       */
+
+      // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+      if (!isEnabled()) {
+         return ReturnCode.NOT_ENABLED;
+      }
+
+      for (CopyOnWriteArrayList<DataReader> readers : topicMap.values()) {
+         for (DataReader reader : readers) {
+            reader.markAsDeleted();
+         }
+         readers.clear();
+      }
+      topicMap.clear();
+      return ReturnCode.OK;
+   }
+
+   /**
+    * @return <b>true </b> iff this <code>Subscriber</code> currently has any data readers.
+    */
+   public boolean hasDataReaders() {
+      return !topicMap.isEmpty();
+   }
+
+   /**
+    * Processes new data received. If this Subscriber has at least one DataReader who is interested in this data, and
+    * the <code>Subscriber</code> has an attached listener, notify it via
+    * {@link SubscriberListener#onDataOnReaders(CopyOfSubscriber)}. Otherwise, if there is no
+    * <code>SubscriberListener</code> then notify all of the interested <code>DataReader</code>'s via
+    * {@link DataReaderListener#onDataAvailable(DataReader)}. The data is stored so that it is available for a reader to
+    * read or take.
+    * 
+    * @param dataStoreItem The newly published data.
+    */
+   void processNewData(final DataStoreItem dataStoreItem) { // This has package scope since it is a system-level type call
+      final Collection<DataReader> readers = topicMap.get(dataStoreItem.getTheTopicDescription());
+      if (readers != null && !readers.isEmpty()) {
+
+         // SPEC NOTE: The following listener logic is based on paragraph "Listener access to Read Communication Status"
+         //            in the DDS specification.
+
+         // Invoke the SubscriberListener if available
+         SubscriberListener listener = getListener();
+         if (listener != null) {
+            listener.onDataOnReaders(this);
+
+            // Otherwise, invoke the DataReaderListeners
+         } else {
+            // Check all DataReader objects for listeners
+            for (final DataReader reader : readers) {
+               reader.processNewData(dataStoreItem);
+               /*
+                * threadService.submit(new Runnable() { public void run() { reader.processNewData(dataStoreItem); } });
+                */
+
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.java
new file mode 100644
index 0000000..f456d71
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.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.ote.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+
+//UNSURE This class has not been implemented, but is called out in the spec
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SubscriptionBuiltinTopicData extends Topic {
+
+   SubscriptionBuiltinTopicData(DomainParticipant participant, TypeSignature typeName, String name, String namespace, boolean enabled, TopicListener listener, EntityFactory parentFactory) {
+      super(participant, typeName, name, namespace, enabled, listener, parentFactory);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java
new file mode 100644
index 0000000..37beb79
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 20079 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.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.Vector;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+import org.eclipse.osee.ote.messaging.dds.status.InconsistentTopicStatus;
+
+/**
+ * Created on May 16, 2005 Provides a basic implementation of the <code>TopicDescription</code> interface for basic
+ * topic support in the DDS system.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.service.TopicDescription
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Topic extends DomainEntity implements TopicDescription {
+
+   private int count; // Keeps track of the number of times this Topic was "created"
+   private InconsistentTopicStatus inconsistentTopicStatus;
+   private final Collection<DataReader> dataReaders;
+   private final Collection<DataWriter> dataWriters;
+
+   // Local variables to implement the TopicDescription interface
+   private final DomainParticipant participant;
+   private final TypeSignature typeSignature;
+   private final String name;
+   private final String namespace;
+
+   /**
+    * Creates a topic with all of the necessary information. This constructor is only visible to the DDS system,
+    * applications should use {@link DomainParticipant#createTopic(String, String, TopicListener)} to create a Topic.
+    */
+   Topic(DomainParticipant participant, TypeSignature typeName, String name, String namespace, boolean enabled, TopicListener listener, EntityFactory parentFactory) {
+      super(enabled, listener, parentFactory);
+
+      this.participant = participant;
+      this.typeSignature = typeName;
+      this.name = name;
+      this.namespace = namespace;
+
+      dataReaders = new Vector<>();
+      dataWriters = new Vector<>();
+      count = 1;
+   }
+
+   /**
+    * @return Returns the name.
+    */
+   @Override
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @return Returns the participant.
+    */
+   @Override
+   public DomainParticipant getParticipant() {
+      return participant;
+   }
+
+   /**
+    * @return Returns the typeName.
+    */
+   @Override
+   public String getTypeName() {
+      return typeSignature.getTypeName();
+   }
+
+   /**
+    * @return Returns the typeSignature.
+    */
+   public TypeSignature getTypeSignature() {
+      return typeSignature;
+   }
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public InconsistentTopicStatus getInconsistentTopicStatus() {
+      return inconsistentTopicStatus;
+   }
+
+   /**
+    * Returns the count for how many times this topic has been "created". This is done to meet the requirement of the
+    * DDS specification that a <code>Topic</code> must be deleted as many times as it was created or found via (@link
+    * DomainParticipant#findTopic(String, Duration)}.
+    * 
+    * @return integer count of the creations of this topic.
+    */
+   int getCount() {
+      return count;
+   }
+
+   /**
+    * Increment the creation count for this topic. The DDS system calls this internally each time this is necessary per
+    * the DDS specification.
+    */
+   void incrementCount() {
+      count++;
+   }
+
+   /**
+    * Decrement the creation count for this topic. The DDS system calls this internally each time this
+    * <code>Topic</code> is passed to {@link DomainParticipant#deleteTopic(Topic)}. When the count reaches zero, then
+    * the DDS system knows it can be deleted.
+    */
+   void decrementCount() {
+      count--;
+   }
+
+   /**
+    * Retrieve access to the listener assigned to this <code>Topic</code>. The topic is not guaranteed to have a
+    * listener, so this method may return <b>null</b>, and the user of this method should handle that appropriately.
+    */
+   public TopicListener getListener() {
+      return (TopicListener) super.getBaseListener();
+   }
+
+   /**
+    * Set the listener for this <code>Topic</code>. If another listener was already assigned then it will be overridden
+    * with out any error. Additionally, <b>null</b> may be passed as the listener to remove the current listener from
+    * this topic.
+    * 
+    * @param listener - The listener to invoke when events occur.
+    * @param mask - Not implemented, <b>null</b> is acceptable.
+    * @return {@link ReturnCode#OK}
+    */
+   public ReturnCode setListener(TopicListener listener, StatusKind mask) {
+      return super.setBaseListener(listener, mask);
+   }
+
+   /**
+    * @return true if this Topic is being used by a DataReader
+    */
+   boolean hasDataReaders() {
+      return !dataReaders.isEmpty();
+   }
+
+   /**
+    * @return true if this Topic is being used by a DataWriter
+    */
+   boolean hasDataWriters() {
+      return !dataWriters.isEmpty();
+   }
+
+   /**
+    * Used so the topic can keep track of the DataReaders that are created using this Topic. When the DataReader is
+    * deleted, it should call removeDataReader.
+    * 
+    * @param reader The DataReader that added this topic
+    */
+   void addDataReader(DataReader reader) {
+      dataReaders.add(reader);
+   }
+
+   /**
+    * Used so the topic can keep track of the DataWriters that are created using this Topic. When the DataReader is
+    * deleted, it should call removeDataWriter.
+    * 
+    * @param writer The DataWriter that added this topic
+    */
+   void addDataWriter(DataWriter writer) {
+      dataWriters.add(writer);
+   }
+
+   /**
+    * Used so the topic can keep track of the DataReaders that are created using this Topic.
+    * 
+    * @param reader The DataReader that was deleted and used this Topic
+    */
+   void removeDataReader(DataReader reader) {
+      dataReaders.remove(reader);
+   }
+
+   /**
+    * Used so the topic can keep track of the DataWriters that are created using this Topic.
+    * 
+    * @param writer The DataWriter that was deleted and used this Topic
+    */
+   void removeDataWriter(DataWriter writer) {
+      dataWriters.remove(writer);
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (obj instanceof Topic) {
+         Topic topic = (Topic) obj;
+         return name.equals(topic.getName()) && namespace.equals(topic.getNamespace());
+      }
+      return false;
+   }
+
+   @Override
+   public int hashCode() {
+      return name.hashCode() ^ namespace.hashCode();
+   }
+
+   @Override
+   public String getNamespace() {
+      return this.namespace;
+   }
+
+   public void clearDataWriters() {
+      dataWriters.clear();
+   }
+
+   public void clearDataReaders() {
+      dataReaders.clear();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/package.html
new file mode 100644
index 0000000..47bbc8b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides all of descendants of {@link osee.messaging.dds.entity.Entity} class, classes immediately controlled by these classes, and their factories.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.java
new file mode 100644
index 0000000..60b971d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * 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.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+
+/**
+ * The interface for receiving events from a particular <code>DataReader</code>.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.entity.DataReader
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface DataReaderListener extends Listener {
+
+   /**
+    * The method called when data is available for a <code>DataReader</code>. This method is only called if there is no
+    * <code>SubscriberListener</code> assigned to the <code>Subscriber</code> that created the <code>DataReader</code>.
+    * 
+    * @param theReader - The reader for which data is available.
+    */
+   public void onDataAvailable(DataReader theReader);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onSampleRejected(DataReader theReader, SampleRejectedStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onSampleLost(DataReader theReader, SampleLostStatus status);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java
new file mode 100644
index 0000000..0ca9f1c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+
+/**
+ * The interface for receiving events from <code>DataWriter</code>'s.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface DataWriterListener extends Listener {
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status);
+
+   /**
+    * This method is here for future functionality that is described in the DDS specification but has not been
+    * implemented or used.
+    */
+   public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status);
+
+   /**
+    * This method is called when information for a <code>DataWriter</code> has been sent to the middleware.
+    * 
+    * @param theWriter - The <code>DataWriter</code> who's information was sent.
+    */
+   public void onDataSentToMiddleware(DataWriter theWriter);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java
new file mode 100644
index 0000000..557e43d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+
+/**
+ * The interface for receiving events from the <code>DomainParticipant</code>. This class also extends the
+ * <code>TopicListener</code>, <code>SubscriberListener</code>, and <code>PublisherListener</code>.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface DomainParticipantListener extends TopicListener, SubscriberListener, PublisherListener {
+
+   /**
+    * The method called whenever data is published within the DDS system. This can be used by the listening object to
+    * propogate information out to local entities running DDS.
+    * 
+    * @param destination TODO
+    * @param source TODO
+    * @param dataStoreItem - The published information.
+    */
+   public void onPublishNotifyMiddleware(IDestination destination, ISource source, DataStoreItem dataStoreItem);
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java
new file mode 100644
index 0000000..7c1688b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.messaging.dds.listener;
+
+/**
+ * This is the base interface for all of the DDS listener interfaces. The sole purpose of this interface is to provide a
+ * common root for all of the DDS listener interfaces.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface Listener {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.java
new file mode 100644
index 0000000..1f71cd8
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.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.messaging.dds.listener;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface PublisherListener extends DataWriterListener {
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java
new file mode 100644
index 0000000..177c41a
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.Subscriber;
+
+/**
+ * The listener interface for receiving notification that data is available to <code>DataReader</code> objects in a
+ * <code>Subscriber</code>.
+ * 
+ * @see org.eclipse.osee.ote.messaging.dds.entity.Subscriber
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface SubscriberListener extends DataReaderListener {
+
+   /**
+    * This is the first listener invoked when data becomes available. A reference to the <code>Subscriber</code> with
+    * available information is passed to the method.
+    */
+   public void onDataOnReaders(Subscriber theSubscriber);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/TopicListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/TopicListener.java
new file mode 100644
index 0000000..a698c3c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/TopicListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.Topic;
+import org.eclipse.osee.ote.messaging.dds.status.InconsistentTopicStatus;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface TopicListener extends Listener {
+   public void onInconsistentTopic(Topic theTopic, InconsistentTopicStatus status);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/package.html
new file mode 100644
index 0000000..66cee25
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides all of the listener interfaces supported by the DDS system.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/package.html
new file mode 100644
index 0000000..d4782bc
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides the basic classes for the system, such as utility and miscellaneous classes.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.java
new file mode 100644
index 0000000..06f2ad6
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.messaging.dds.qos;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class QosPolicy {
+   public final static QosPolicy USERDATA_QOS_POLICY = new QosPolicy("UserData", 1);
+
+   private final String policyName;
+   private final long policyId;
+
+   private QosPolicy(String policyName, long policyId) {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+      this.policyName = policyName;
+      this.policyId = policyId;
+   }
+
+   public String getPolicyName() {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return policyName;
+   }
+
+   public long getPolicyId() {
+      // DONT_NEED This method has not been implemented, but is called out in the spec
+      if (true) {
+         throw new NotImplementedException();
+      }
+
+      return policyId;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/package.html
new file mode 100644
index 0000000..1bb4ec6
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides the Quality of Service support classes.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.java
new file mode 100644
index 0000000..c248f7c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.messaging.dds.service;
+
+/**
+ * Stores the data necessary to discern virtual DDS networks within a physical network.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DomainId {
+   private final long id;
+
+   /**
+    * @param id - The id value for this <code>DomainId</code>.
+    */
+   public DomainId(long id) {
+      super();
+      this.id = id;
+   }
+
+   /**
+    * @return Returns the id.
+    */
+   public long getId() {
+      return id;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+
+      if (obj instanceof DomainId) {
+         DomainId domainId = (DomainId) obj;
+         return domainId.id == this.id;
+      }
+
+      return false;
+   }
+
+   @Override
+   public int hashCode() {
+      int result = 17;
+      result = 1313723 * result + (int) (id ^ id >>> 32);
+
+      return result;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java
new file mode 100644
index 0000000..f63531e
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.messaging.dds.service;
+
+/**
+ * Provides the DDS system with a means of recognizing multiple instances of one type. Users of the DDS system should
+ * provide an object that implements this interface for topics which may have multiple instances.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface Key {
+
+   /**
+    * This method returns true iff the information in both sets of data represent the same instance. This method should
+    * be commutative, that is, isSameInstance(A,B) should always return the same value as isSameInstance(B,A).
+    * 
+    * @return <b>true</b> if the data values are the same instance, <b>false</b> otherwise.
+    */
+   public boolean isSameInstance(byte[] data1, byte[] data2);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java
new file mode 100644
index 0000000..defaf42
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.messaging.dds.service;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant;
+
+/**
+ * Provides a description of all topic classes. Any class that is a topic of some sort should implement this interface.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface TopicDescription {
+
+   /**
+    * The method which will supply the name used to create the topic.
+    * 
+    * @return A string representation of the topic name.
+    */
+   public String getName();
+
+   /**
+    * The method which will return a reference to the <code>DomainParticipant</code> which created the topic.
+    * 
+    * @return The <code>DomainParticipant</code> that created this topic.
+    */
+   public DomainParticipant getParticipant();
+
+   /**
+    * The method which will supply the type name used to create the topic.
+    * 
+    * @return A string representation of the type name.
+    */
+   public String getTypeName();
+
+   public String getNamespace();
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java
new file mode 100644
index 0000000..9d85078
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * 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.messaging.dds.service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+
+/**
+ * Provides registration functionality of types that are used in the DDS system. The registry relies on a hash map for
+ * optimum performance tuning which can be done via the parameters to the constructor. The registry acts as the
+ * authority for types by keeping track of <code>TypeSignature</code>'s.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class TypeRegistry {
+   private final Map<String, TypeSignature> typeHash;
+
+   /**
+    * Create a new <code>TypeRegistry</code> with particular characteristics. This is used by portions of the DDS system
+    * for resolving necessary information about types during run time.
+    * 
+    * @param initialCapacity The initial capacity to create the hash map with
+    * @param loadFactor The load factor for the hash map. This specifies how full the map can get before more memory is
+    * allocated for the map.
+    */
+   public TypeRegistry(int initialCapacity, float loadFactor) {
+      super();
+      typeHash = Collections.synchronizedMap(new HashMap<String, TypeSignature>(initialCapacity, loadFactor));
+   }
+
+   /**
+    * Register a <code>TypeSignature</code> with the registry.
+    * 
+    * @see TypeSignature
+    * @param signature The signature of the type to register.
+    * @return OK if the type was registered. OUT_OF_RESOURCES if a memory error happened, or PRECONDITION_NOT_MET if the
+    * signature conflicts with one already registered.
+    */
+   public ReturnCode register(TypeSignature signature) {
+      ReturnCode retCode = ReturnCode.OK;
+
+      TypeSignature checkSignature = typeHash.get(signature.getTypeName());
+      // If the signature was not already registered, then add it.
+      if (checkSignature == null) {
+         try {
+            typeHash.put(signature.getTypeName(), signature);
+         } catch (OutOfMemoryError er) {
+            er.printStackTrace();
+            retCode = ReturnCode.OUT_OF_RESOURCES;
+         }
+
+         // If the signature was already registered, then make sure the signature is the same
+      } else {
+         if (!checkSignature.equals(signature)) {
+            retCode = ReturnCode.PRECONDITION_NOT_MET;
+         }
+      }
+
+      return retCode;
+   }
+
+   /**
+    * Provides the signature for a type with a particular name.
+    * 
+    * @param typeName The name of the type to lookup
+    * @return The appropriate signature for the name as registered with the registry, null if no such signature exists.
+    */
+   public TypeSignature lookupSignature(String typeName) {
+      return typeHash.get(typeName);
+   }
+
+   public void clear() {
+      typeHash.clear();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java
new file mode 100644
index 0000000..e796210
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * 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.messaging.dds.service;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Provides the necessary information to communicate type information for messaging within the DDS system. This allows
+ * the DDS system to be introduced to new types at run time, and be able to handle them properly.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class TypeSignature {
+   private final String typeName;
+   private final int typeDataSize;
+   private final WeakReference<Key> key;
+   private final String readerName;
+   private final String writerName;
+   private final WeakReference<ClassLoader> classLoader;
+
+   /**
+    * Create a <code>TypeSignature</code> with all of the necessary information.
+    * 
+    * @param typeName The name used to reference this type.
+    * @param typeDataSize The full size in bytes of this type when transmitted.
+    * @param key The <code>Key</code> used to distinguish instances of data for this type.
+    * @param readerName The name used to load the reader class for this type from the supplied class loader
+    * @param writerName The name used to load the reader class for this type from the supplied class loader
+    * @param classLoader The class loader which can load the reader and writer for this type
+    */
+   public TypeSignature(String typeName, int typeDataSize, Key key, String readerName, String writerName, ClassLoader classLoader) {
+      super();
+      this.typeName = typeName;
+      this.typeDataSize = typeDataSize;
+      this.key = new WeakReference<>(key);
+      this.readerName = readerName;
+      this.writerName = writerName;
+      this.classLoader = new WeakReference<>(classLoader);
+   }
+
+   /**
+    * @return Returns the classLoader.
+    */
+   public ClassLoader getClassLoader() {
+      return classLoader.get();
+   }
+
+   /**
+    * @return Returns the key.
+    */
+   public Key getKey() {
+      return key.get();
+   }
+
+   /**
+    * @return Returns the readerName.
+    */
+   public String getReaderName() {
+      return readerName;
+   }
+
+   /**
+    * @return Returns the typeDataSize.
+    */
+   public int getTypeDataSize() {
+      return typeDataSize;
+   }
+
+   /**
+    * @return Returns the typeName.
+    */
+   public String getTypeName() {
+      return typeName;
+   }
+
+   /**
+    * @return Returns the writerName.
+    */
+   public String getWriterName() {
+      return writerName;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+
+      if (obj instanceof TypeSignature) {
+         TypeSignature signature = (TypeSignature) obj;
+
+         return typeName.equals(signature.typeName) && typeDataSize == signature.typeDataSize && readerName.equals(signature.readerName) && writerName.equals(signature.writerName) && classLoader.get().equals(
+            signature.classLoader.get());
+      }
+
+      return false;
+   }
+
+   @Override
+   public int hashCode() {
+      return typeName.hashCode();
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.java
new file mode 100644
index 0000000..7a2036c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.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.messaging.dds.service;
+
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant;
+
+/**
+ * The base class that needs to be extended by application specific type support classes. This is used to allow the DDS
+ * system to recognize and make use of application specific types for creating topics at run time.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class TypeSupport {
+
+   /**
+    * The method which tells the system how large the data type is in bytes.
+    * 
+    * @return The integer count of bytes for the type.
+    */
+   protected abstract int getTypeDataSize();
+
+   /**
+    * The method which supplies the <code>Key</code> for distinguishing instances of this data type.
+    * 
+    * @see Key
+    */
+   protected abstract Key getKey();
+
+   /**
+    * The method that supplies the class name for the application class that extends <code>DataReader</code> for this
+    * type. The string returned must be formatted such that the <code>ClassLoader</code> designated during registration
+    * will be able to supply the reader.
+    * 
+    * @return The class name for the reader of this type.
+    */
+   protected abstract String getReaderName();
+
+   /**
+    * The method that supplies the class name for the application class that extends <code>DataWriter</code> for this
+    * type. The string returned must be formatted such that the <code>ClassLoader</code> designated during registration
+    * will be able to supply the writer.
+    * 
+    * @return The class name for the writer of this type.
+    */
+   protected abstract String getWriterName();
+
+   // TUNE should/could this method be made static ?
+   /**
+    * The method used to register this type. This method allows a the application to supply any <code>ClassLoader</code>
+    * for the system to use to load the application specific data readers and writers.
+    * 
+    * @param participant - The <code>DomainParticipant</code> to register the type with.
+    * @param typeName - The typeName to register this type as.
+    * @param classLoader - The <code>ClassLoader</code> to register for this type.
+    */
+   public ReturnCode registerType(DomainParticipant participant, String typeName, ClassLoader classLoader) {
+      return participant.getTypeRegistry().register(
+         new TypeSignature(typeName, getTypeDataSize(), getKey(), getReaderName(), getWriterName(), classLoader));
+   }
+
+   /**
+    * The method used to register this type. This method registers the type with the system <code>ClassLoader</code> as
+    * the loader for the reader and writer.
+    * 
+    * @param participant - The <code>DomainParticipant</code> to register the type with.
+    * @param typeName - The typeName to register this type as.
+    */
+   public ReturnCode registerType(DomainParticipant participant, String typeName) {
+      ClassLoader defaultClassLoader = ClassLoader.getSystemClassLoader();
+
+      return registerType(participant, typeName, defaultClassLoader);
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/package.html
new file mode 100644
index 0000000..2818d58
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides service level support classes.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.java
new file mode 100644
index 0000000..9a50927
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+/**
+ * A <code>Status</code> that also maintains a counts for the total and incremental number of samples associated with
+ * the status.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class CountedStatus extends Status {
+   private final long totalCount;
+   private final long totalCountChange;
+
+   /**
+    * @param totalCount The cumulative count of samples or topics associated with this status.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    */
+   public CountedStatus(long totalCount, long totalCountChange) {
+      super();
+      this.totalCount = totalCount;
+      this.totalCountChange = totalCountChange;
+   }
+
+   /**
+    * Gets the Total Count of all samples or topics associated with this status.
+    * 
+    * @return Returns the totalCount.
+    */
+   public long getTotalCount() {
+      return totalCount;
+   }
+
+   /**
+    * Gets the number of samples or topics associated with this status since the last time the listener was called or
+    * the status was read.
+    * 
+    * @return Returns the totalCountChange.
+    */
+   public long getTotalCountChange() {
+      return totalCountChange;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java
new file mode 100644
index 0000000..2d103e2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+/**
+ * Maintains counts of Topics whose name match the topic this <code>Status</code> is attached to, but type differs.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class InconsistentTopicStatus extends CountedStatus {
+
+   /**
+    * @param totalCount The cumulative countt of inconsistent statuses.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    */
+   public InconsistentTopicStatus(long totalCount, long totalCountChange) {
+      super(totalCount, totalCountChange);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java
new file mode 100644
index 0000000..49f2339
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+/**
+ * Maintains counts of {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter}'s actively or inactively write the
+ * same Topic as the {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}this is attached to.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class LivelinessChangedStatus extends Status {
+   private final long activeCount;
+   private final long activeCountChange;
+   private final long inactiveCount;
+   private final long inactiveCountChange;
+
+   /**
+    * @param activeCount The current number of active <code>DataWriter</code>'s with the same Topic.
+    * @param inactiveCount The current number of inactive <code>DataWriter</code>'s with the same Topic.
+    * @param activeCountChange The change in activeCount since the last time the listener was called or the status was
+    * read.
+    * @param inactiveCountChange The change in inactiveCount since the last time the listener was called or the status
+    * was read.
+    */
+   public LivelinessChangedStatus(long activeCount, long inactiveCount, long activeCountChange, long inactiveCountChange) {
+      super();
+      this.activeCount = activeCount;
+      this.inactiveCount = inactiveCount;
+      this.activeCountChange = activeCountChange;
+      this.inactiveCountChange = inactiveCountChange;
+   }
+
+   /**
+    * Gets the current number of active <code>DataWriter</code>'s with the same Topic.
+    * 
+    * @return Returns the activeCount.
+    */
+   public long getActiveCount() {
+      return activeCount;
+   }
+
+   /**
+    * Gets the change in activeCount since the last time the listener was called or the status was read.
+    * 
+    * @return Returns the activeCountChange.
+    */
+   public long getActiveCountChange() {
+      return activeCountChange;
+   }
+
+   /**
+    * Gets the current number of inactive <code>DataWriter</code>'s with the same Topic.
+    * 
+    * @return Returns the inactiveCount.
+    */
+   public long getInactiveCount() {
+      return inactiveCount;
+   }
+
+   /**
+    * Gets the change in inactiveCount since the last time the listener was called or the status was read.
+    * 
+    * @return Returns the inactiveCountChange.
+    */
+   public long getInactiveCountChange() {
+      return inactiveCountChange;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java
new file mode 100644
index 0000000..b03faa5
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+/**
+ * Maintains counts of the number of times the {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter} failed to
+ * signal its liveliness within the liveliness period.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class LivelinessLostStatus extends CountedStatus {
+
+   /**
+    * @param totalCount The cumulative count of liveliness lost.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    */
+   public LivelinessLostStatus(long totalCount, long totalCountChange) {
+      super(totalCount, totalCountChange);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java
new file mode 100644
index 0000000..10cb9de
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of times the {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter} failed to
+ * write within the offered deadline.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class OfferedDeadlineMissedStatus extends CountedStatus {
+   private final InstanceHandle lastInstanceHandle;
+
+   /**
+    * @param totalCount The cumulative count of offered deadlines missed.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    * @param lastInstanceHandle The last instance in the <code>DataWriter</code> for which the deadline was missed.
+    */
+   public OfferedDeadlineMissedStatus(long totalCount, long totalCountChange, InstanceHandle lastInstanceHandle) {
+      super(totalCount, totalCountChange);
+      this.lastInstanceHandle = lastInstanceHandle;
+   }
+
+   /**
+    * Gets a handle to the instance in the <code>DataWriter</code> for which the last offered deadline that was missed.
+    * 
+    * @return Returns the lastInstanceHandle.
+    */
+   public InstanceHandle getLastInstanceHandle() {
+      return lastInstanceHandle;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java
new file mode 100644
index 0000000..00e62f2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.qos.QosPolicy;
+
+/**
+ * Maintains counts of the number of {@link DataReader}'s that the {@link DataWriter} <code>Topic</code> matched but has
+ * an incompatible Qos Policy.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class OfferedIncompatibleQosStatus extends CountedStatus {
+
+   private final long lastPolicyId;
+   private final Collection<QosPolicy> policies;
+
+   /**
+    * @param totalCount The cumulative count of <code>DataReader</code>'s whose <code>Topic</code>'s match but have an
+    * incompatible Qos Policy.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    * @param lastPolicyId The ID of one of the incompatible policies found from the last detected incompatibility.
+    * @param policies The total counts of incompatibilities for each policy which has been found to be incompatible at
+    * some point.
+    */
+   public OfferedIncompatibleQosStatus(long totalCount, long totalCountChange, long lastPolicyId, Collection<QosPolicy> policies) {
+      super(totalCount, totalCountChange);
+      this.lastPolicyId = lastPolicyId;
+      this.policies = new ArrayList<>(policies);
+   }
+
+   /**
+    * Gets the ID of one of the incompatible policies found from the last detected incompatibility.
+    * 
+    * @return Returns the lastPolicyId.
+    */
+   public long getLastPolicyId() {
+      return lastPolicyId;
+   }
+
+   /**
+    * Gets the total counts of incompatibilities for each policy which has been found to be incompatible at some point.
+    * 
+    * @return Returns the counts by individual policy.
+    */
+   public Collection<QosPolicy> getPolicies() {
+      return policies;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.java
new file mode 100644
index 0000000..d936874
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.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.ote.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}'s that the
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter} matched based upon <code>Topic</code> & Qos Policies.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class PublicationMatchStatus extends CountedStatus {
+   private final InstanceHandle lastSubscriptionHandle;
+
+   /**
+    * @param totalCount The cumulative count of <code>DataReader</code>'s whose Qos Policies match.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    * @param lastSubscriptionHandle The last <code>DataReader</code> matching the <code>DataWriter</code> causing the
+    * status to change.
+    */
+   public PublicationMatchStatus(long totalCount, long totalCountChange, InstanceHandle lastSubscriptionHandle) {
+      super(totalCount, totalCountChange);
+      this.lastSubscriptionHandle = lastSubscriptionHandle;
+   }
+
+   /**
+    * Gets a handle to the last <code>DataReader</code> matching the DataWriter causing the status to change.
+    * 
+    * @return Returns the lastInstanceHandle.
+    */
+   public InstanceHandle getLastSubscriptionHandle() {
+      return lastSubscriptionHandle;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java
new file mode 100644
index 0000000..f1d1341
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of times the {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader} detected a
+ * missed deadline.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class RequestedDeadlineMissedStatus extends CountedStatus {
+   private final InstanceHandle lastInstanceHandle;
+
+   /**
+    * @param totalCount The cumulative count of deadlines missed.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    * @param lastInstanceHandle The last instance in the <code>DataReader</code> for which the deadline was missed.
+    */
+   public RequestedDeadlineMissedStatus(long totalCount, long totalCountChange, InstanceHandle lastInstanceHandle) {
+      super(totalCount, totalCountChange);
+      this.lastInstanceHandle = lastInstanceHandle;
+   }
+
+   /**
+    * Gets a handle to the instance in the <code>DataReader</code> for which the last deadline that was missed.
+    * 
+    * @return Returns the lastInstanceHandle.
+    */
+   public InstanceHandle getLastInstanceHandle() {
+      return lastInstanceHandle;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java
new file mode 100644
index 0000000..8cc5d07
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.qos.QosPolicy;
+
+/**
+ * Maintains counts of the number of {@link DataWriter}'s that the {@link DataReader} <code>Topic</code> matched but has
+ * an incompatible Qos Policy.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class RequestedIncompatibleQosStatus extends CountedStatus {
+   private final long lastPolicyId;
+   private final Collection<QosPolicy> policies;
+
+   /**
+    * @param totalCount The cumulative count of <code>DataWriter</code>'s whose <code>Topic</code>'s match but have an
+    * incompatible Qos Policy.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    * @param lastPolicyId The ID of one of the incompatible policies found from the last detected incompatibility.
+    * @param policies The total counts of incompatibilities for each policy which has been found to be incompatible at
+    * some point.
+    */
+   public RequestedIncompatibleQosStatus(long totalCount, long totalCountChange, long lastPolicyId, Collection<QosPolicy> policies) {
+      super(totalCount, totalCountChange);
+      this.lastPolicyId = lastPolicyId;
+      this.policies = new ArrayList<>(policies);
+   }
+
+   /**
+    * Gets the ID of one of the incompatible policies found from the last detected incompatibility.
+    * 
+    * @return Returns the lastPolicyId.
+    */
+   public long getLastPolicyId() {
+      return lastPolicyId;
+   }
+
+   /**
+    * Gets the total counts of incompatibilities for each policy which has been found to be incompatible at some point.
+    * 
+    * @return Returns the counts by individual policy.
+    */
+   public Collection<QosPolicy> getPolicies() {
+      return policies;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleLostStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleLostStatus.java
new file mode 100644
index 0000000..315d7d9
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleLostStatus.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+/**
+ * Maintains counts of the samples lost across all instances of data published for the
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.Topic}.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleLostStatus extends CountedStatus {
+
+   /**
+    * @param totalCount The cumulative count of all samples lost for the <code>Topic</code>.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    */
+   public SampleLostStatus(long totalCount, long totalCountChange) {
+      super(totalCount, totalCountChange);
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatus.java
new file mode 100644
index 0000000..64d9f06
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatus.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of samples rejected by a {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleRejectedStatus extends CountedStatus {
+   private final SampleRejectedStatusKind lastReason;
+   private final InstanceHandle lastInstanceHandle;
+
+   /**
+    * @param totalCount The cumulative count of all samples rejected by the <code>DataReader</code>.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    * @param lastReason The reason the last sample was rejected.
+    * @param lastInstanceHandle The instance of the last rejected sample.
+    */
+   public SampleRejectedStatus(long totalCount, long totalCountChange, SampleRejectedStatusKind lastReason, InstanceHandle lastInstanceHandle) {
+      super(totalCount, totalCountChange);
+      this.lastReason = lastReason;
+      this.lastInstanceHandle = lastInstanceHandle;
+   }
+
+   /**
+    * Gets the instance of the last sample that was rejected.
+    * 
+    * @return Returns the lastInstanceHandle.
+    */
+   public InstanceHandle getLastInstanceHandle() {
+      return lastInstanceHandle;
+   }
+
+   /**
+    * Gets the reason the last sample was rejected.
+    * 
+    * @return Returns the lastReason.
+    */
+   public SampleRejectedStatusKind getLastReason() {
+      return lastReason;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.java
new file mode 100644
index 0000000..3212b48
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.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.messaging.dds.status;
+
+/**
+ * Enumeration class for the reasons a sample was rejected by a
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleRejectedStatusKind {
+   public static final SampleRejectedStatusKind REJECTED_BY_INSTANCE_LIMIT = new SampleRejectedStatusKind(1,
+      "Rejected by instance limit");
+   public static final SampleRejectedStatusKind REJECTED_BY_TOPIC_LIMIT = new SampleRejectedStatusKind(2,
+      "Rejected by topic limit");
+
+   private final int value;
+   private final String description;
+
+   private SampleRejectedStatusKind(int value, String description) {
+      super();
+      this.value = value;
+      this.description = description;
+   }
+
+   /**
+    * Gets the description of the rejected status.
+    * 
+    * @return Returns the description.
+    */
+   public String getDescription() {
+      return description;
+   }
+
+   /**
+    * Gets the value used to identify the rejected status.
+    * 
+    * @return Returns the value.
+    */
+   public int getValue() {
+      return value;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/Status.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/Status.java
new file mode 100644
index 0000000..5dc3d73
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/Status.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.messaging.dds.status;
+
+/**
+ * Base class for the various *Status classes specified in the DDS specification.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class Status {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.java
new file mode 100644
index 0000000..d5c14e4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.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.ote.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter}'s that the
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader} matched based upon <code>Topic</code> & Qos Policies.
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SubscriptionMatchStatus extends CountedStatus {
+   private final InstanceHandle lastPublicationHandle;
+
+   /**
+    * @param totalCount The cumulative count of <code>DataWriter</code>'s whose Qos Policies match.
+    * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+    * @param lastPublicationHandle The last <code>DataWriter</code> matching the <code>DataReader</code> causing the
+    * status to change.
+    */
+   public SubscriptionMatchStatus(long totalCount, long totalCountChange, InstanceHandle lastPublicationHandle) {
+      super(totalCount, totalCountChange);
+      this.lastPublicationHandle = lastPublicationHandle;
+   }
+
+   /**
+    * Gets a handle to the last <code>DataWriter</code> matching the DataWriter causing the status to change.
+    * 
+    * @return Returns the lastInstanceHandle.
+    */
+   public InstanceHandle getLastPublicationHandle() {
+      return lastPublicationHandle;
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/package.html
new file mode 100644
index 0000000..b4590a3
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides classes necessary for tracking and reporting status.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.java
new file mode 100644
index 0000000..ee95bd8
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.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.messaging.dds.test;
+
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant;
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipantFactory;
+import org.eclipse.osee.ote.messaging.dds.entity.Publisher;
+import org.eclipse.osee.ote.messaging.dds.entity.Subscriber;
+import org.eclipse.osee.ote.messaging.dds.entity.Topic;
+import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
+import org.eclipse.osee.ote.messaging.dds.service.DomainId;
+import org.eclipse.osee.ote.messaging.dds.status.InconsistentTopicStatus;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntMessageReader;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntMessageTypeSupport;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntMessageWriter;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntegerData;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Driver implements DomainParticipantListener {
+   private final DomainParticipant domainParticipant;
+   private final Publisher publisher;
+   private final Subscriber subscriber;
+   private final Publisher myMiddlewarePublisher;
+
+   public Driver() {
+      // Get a domain participant so that we can participate in DDS
+      DomainParticipantFactory domainParticipantFactory = DomainParticipantFactory.getInstance();
+      domainParticipant = domainParticipantFactory.createParticipant(new DomainId(12), this, false);
+
+      // Get some publishers and subscribers
+      subscriber = domainParticipant.createSubscriber(null);
+      publisher = domainParticipant.createPublisher(this);
+      myMiddlewarePublisher = domainParticipant.getMiddlewarePublisherInstance(this);
+
+      // Register a type, and get some topics built from that type
+      new IntMessageTypeSupport().registerType(domainParticipant, "IntMessage");
+      Topic anIntTopic = domainParticipant.createTopic("Daves topic", "default", "IntMessage", this);
+      Topic anotherIntTopic = domainParticipant.createTopic("Robs topic", "default", "IntMessage", this);
+
+      // Get some readers and writers for communication via the generated topics
+      IntMessageWriter davesWriter = (IntMessageWriter) publisher.createDataWriter(anIntTopic, this);
+      IntMessageReader davesReader = (IntMessageReader) subscriber.createDataReader(anIntTopic, this);
+      IntMessageWriter robsWriter = (IntMessageWriter) publisher.createDataWriter(anotherIntTopic, this);
+      IntMessageReader robsReader = (IntMessageReader) subscriber.createDataReader(anotherIntTopic, this);
+
+      // A reference for read data
+      IntegerData readData;
+
+      System.out.println("Write 8 to daves message from middleware");
+      myMiddlewarePublisher.publishData(new IntegerData(8), anIntTopic.getName(), anIntTopic.getNamespace());
+      readData = davesReader.takeNextSample();
+      System.out.println("Daves reader sees: " + readData.getTheInt());
+      System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+
+      System.out.println("\n");
+      System.out.println("Write 54875 to daves message");
+      davesWriter.write(5);
+      readData = davesReader.takeNextSample();
+      System.out.println("Daves reader sees: " + readData.getTheInt());
+      System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+      System.out.println("Write 10 to daves message, but check the previous data is still 5");
+      davesWriter.write(10);
+      System.out.println("Daves previous data is: " + readData.getTheInt());
+
+      System.out.println("\n");
+      System.out.println("Write 12 to robs message");
+      robsWriter.write(12);
+      System.out.println("Daves reader sees: " + davesReader.takeNextSample().getTheInt());
+      System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+
+      System.out.println("\n");
+      System.out.println("Write 15 to robs message");
+      robsWriter.write(15);
+      System.out.println("Daves reader sees: " + davesReader.takeNextSample().getTheInt());
+      System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+   }
+
+   public static void main(String[] args) {
+      System.out.println("Starting the driver ...");
+      System.out.println("---------------------------------------------------");
+      new Driver();
+      System.out.println("---------------------------------------------------");
+      System.out.println("Driver finished");
+   }
+
+   @Override
+   public void onInconsistentTopic(Topic theTopic, InconsistentTopicStatus status) {
+   }
+
+   @Override
+   public void onDataOnReaders(Subscriber theSubscriber) {
+      System.out.println("++onDataOnReaders was called");
+      //theSubscriber.getDataReaders();
+   }
+
+   @Override
+   public void onDataAvailable(DataReader theReader) {
+      System.out.println("**Data available from system: " + theReader.getTopicDescription().getName());
+
+   }
+
+   @Override
+   public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+   }
+
+   @Override
+   public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+   }
+
+   @Override
+   public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+   }
+
+   @Override
+   public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+   }
+
+   @Override
+   public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+   }
+
+   @Override
+   public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+   }
+
+   @Override
+   public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status) {
+   }
+
+   @Override
+   public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status) {
+   }
+
+   @Override
+   public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status) {
+   }
+
+   @Override
+   public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status) {
+   }
+
+   @Override
+   public void onDataSentToMiddleware(DataWriter theWriter) {
+      System.out.println("@@onDataTaken called");
+
+   }
+
+   @Override
+   public void onPublishNotifyMiddleware(IDestination destination, ISource source, DataStoreItem dataStoreItem) {
+      System.out.println("--Middleware notified on publish of: " + dataStoreItem.getTheTopicDescription().getName() + "-" + dataStoreItem.getTheTopicDescription().getTypeName());
+
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessage.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessage.java
new file mode 100644
index 0000000..be78e9d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessage.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.messaging.dds.test.data;
+
+/**
+ * Created on May 19, 2005
+ * 
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessage extends IntegerData {
+
+   public IntMessage() {
+      super(-2);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.java
new file mode 100644
index 0000000..80a04b5
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * 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.messaging.dds.test.data;
+
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.EntityFactory;
+import org.eclipse.osee.ote.messaging.dds.entity.Subscriber;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessageReader extends DataReader {
+
+   DataSample dataSample;
+   private final IntMessage intMessage;
+
+   public IntMessageReader(TopicDescription topicDescription, Subscriber subscriber, Boolean enabled, DataReaderListener listener, EntityFactory parentFactory) {
+      super(topicDescription, subscriber, enabled, listener, parentFactory);
+
+      intMessage = new IntMessage();
+      dataSample = new DataSample(intMessage);
+      this.setListener(new IntMessageListener(), null);
+   }
+
+   public class IntMessageListener implements DataReaderListener {
+
+      @Override
+      public synchronized void onDataAvailable(DataReader theReader) {
+         System.out.println("onDataAvailable Called for " + theReader.getTopicDescription().getName());
+      }
+
+      @Override
+      public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+      }
+
+      @Override
+      public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+      }
+
+      @Override
+      public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+      }
+
+      @Override
+      public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+      }
+
+      @Override
+      public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+      }
+
+      @Override
+      public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+      }
+   }
+
+   public IntegerData takeNextSample() {
+      ReturnCode code = super.takeNextSample(dataSample);
+
+      System.out.println("Result of take is: " + code.getDescription());
+      if (dataSample.getData() != null) {
+         IntegerData data = (IntegerData) dataSample.getData();
+         return data;
+      } else {
+         return new IntegerData(-1);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java
new file mode 100644
index 0000000..bf700a2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.messaging.dds.test.data;
+
+import org.eclipse.osee.ote.messaging.dds.service.Key;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessageTypeSupport extends TypeSupport {
+
+   @Override
+   protected int getTypeDataSize() {
+      return Integer.SIZE / 8;
+   }
+
+   @Override
+   protected Key getKey() {
+      return null;
+   }
+
+   @Override
+   protected String getReaderName() {
+      return IntMessageReader.class.getCanonicalName();
+   }
+
+   @Override
+   protected String getWriterName() {
+      return IntMessageWriter.class.getCanonicalName();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java
new file mode 100644
index 0000000..d4c2a24
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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.messaging.dds.test.data;
+
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.entity.EntityFactory;
+import org.eclipse.osee.ote.messaging.dds.entity.Publisher;
+import org.eclipse.osee.ote.messaging.dds.entity.Topic;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessageWriter extends DataWriter {
+   private final IntegerData buffer;
+
+   public IntMessageWriter(Topic topic, Publisher publisher, Boolean enabled, DataWriterListener listener, EntityFactory parentFactory) {
+      super(topic, publisher, enabled, listener, parentFactory);
+      buffer = new IntegerData(0);
+   }
+
+   public ReturnCode write(int value) {
+      buffer.setTheInt(value);
+      return super.write(null, null, buffer, null);
+   }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java
new file mode 100644
index 0000000..02c6af6
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * 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.messaging.dds.test.data;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.messaging.dds.Data;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntegerData implements Data {
+   private int theInt;
+
+   public IntegerData(int theInt) {
+      super();
+      this.theInt = theInt;
+   }
+
+   /**
+    * @return Returns the theInt.
+    */
+   public int getTheInt() {
+      return theInt;
+   }
+
+   /**
+    * @param theInt The theInt to set.
+    */
+   public void setTheInt(int theInt) {
+      this.theInt = theInt;
+   }
+
+   @Override
+   public byte[] toByteArray() {
+      int x = theInt;
+
+      return new byte[] {byteOf(x, 3), byteOf(x, 2), byteOf(x, 1), byteOf(x, 0)};
+   }
+
+   private byte byteOf(int x, int index) {
+      return (byte) (x >> index * 4 & 0xff);
+   }
+
+   @Override
+   public void setFromByteArray(byte[] input) {
+
+      int value = 0;
+
+      if (input.length > 4) {
+         value = Integer.MAX_VALUE;
+      } else {
+         for (int x = input.length - 1; x > -1; x--) {
+            value += input[x] << (input.length - (x + 1)) * 4;
+         }
+      }
+      theInt = value;
+   }
+
+   @Override
+   public Object getKeyValue() {
+      return new Integer(theInt);
+   }
+
+   @Override
+   public void copyFrom(Data buffer) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public void setFromByteBuffer(ByteBuffer buffer) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public ByteBuffer toByteBuffer() {
+      // TODO Auto-generated method stub
+      return null;
+   }
+
+   @Override
+   public int getOffset() {
+      // TODO Auto-generated method stub
+      return 0;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/package.html
new file mode 100644
index 0000000..09212d2
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides the application specific classes necessary for the test driver.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/package.html
new file mode 100644
index 0000000..5d75383
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides a basic test of the DDS System.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.p2/.project b/org.eclipse.osee.ote.p2/.project
new file mode 100644
index 0000000..44fdaae
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.p2</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.UpdateSiteBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.UpdateSiteNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.p2/category.xml b/org.eclipse.osee.ote.p2/category.xml
new file mode 100644
index 0000000..95ea8cb
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/category.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+   <feature url="features/org.eclipse.osee.client.ote.feature_0.25.3.qualifier.jar" id="org.eclipse.osee.client.ote.feature" version="0.25.3.qualifier">
+      <category name="org.eclipse.osee.ote"/>
+   </feature>
+   <feature url="features/org.eclipse.osee.client.ote.feature.source_0.25.3.qualifier.jar" id="org.eclipse.osee.client.ote.feature.source" version="0.25.3.qualifier">
+      <category name="org.eclipse.osee.ote"/>
+   </feature>
+   <feature url="features/org.eclipse.osee.ote.feature_0.25.3.qualifier.jar" id="org.eclipse.osee.ote.feature" version="0.25.3.qualifier">
+      <category name="org.eclipse.osee.ote"/>
+   </feature>
+   <feature url="features/org.eclipse.osee.ote.feature.source_0.25.3.qualifier.jar" id="org.eclipse.osee.ote.feature.source" version="0.25.3.qualifier">
+      <category name="org.eclipse.osee.ote"/>
+   </feature>
+   <category-def name="org.eclipse.osee.ote" label="Eclipse OSEE OTE - (Incubation)">
+      <description>
+         Eclipse OSEE OTE - (Incubation)
+      </description>
+   </category-def>
+</site>
diff --git a/org.eclipse.osee.ote.p2/pom.xml b/org.eclipse.osee.ote.p2/pom.xml
new file mode 100644
index 0000000..32ec9b6
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/pom.xml
@@ -0,0 +1,93 @@
+<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.p2</artifactId>
+	<packaging>eclipse-repository</packaging>
+	<name>OSEE OTE - p2 Site (Incubation)</name>
+	<version>0.25.3-SNAPSHOT</version>
+
+<build>
+<plugins>
+<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-p2-repository-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+				 	<includeAllDependencies>true</includeAllDependencies>  
+				</configuration>
+				<executions>
+					<execution>
+						<id>assemble-repository</id>
+						<goals>
+							<goal>assemble-repository</goal>
+						</goals>
+					</execution>
+					<execution>
+						<id>archive-repository</id>
+						<phase>pre-integration-test</phase>
+						<goals>
+							<goal>archive-repository</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<configuration>
+							<tasks name="generate">
+								<taskdef resource="net/sf/antcontrib/antlib.xml" />
+								<if>
+									<available file="version.xml" />
+									<then>
+										<ant antfile="version.xml" />
+									</then>
+								</if>
+							</tasks>
+						</configuration>
+					</execution>
+				</executions>
+				<dependencies>
+					<dependency>
+						<groupId>ant-contrib</groupId>
+						<artifactId>ant-contrib</artifactId>
+						<version>1.0b3</version>
+						<exclusions>
+							<exclusion>
+								<groupId>ant</groupId>
+								<artifactId>ant</artifactId>
+							</exclusion>
+						</exclusions>
+					</dependency>
+				</dependencies>
+			</plugin>
+			</plugins>
+			</build>
+	<!-- <build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-p2-repository-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<includeAllDependencies>true</includeAllDependencies>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build> -->
+	
+</project>
diff --git a/org.eclipse.osee.ote.p2/version.xml b/org.eclipse.osee.ote.p2/version.xml
new file mode 100644
index 0000000..4a0aa95
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/version.xml
@@ -0,0 +1,71 @@
+<project name="Contribute Extra Build Steps" default="version">
+
+
+	<target name="version">
+	
+		
+	
+		<property name="root.folder" value="${basedir}/../../.." />
+		<property name="versions.file" value="${basedir}/target/repository/versions.txt" />
+		<!-- <property name="versions.file" value="${basedir}/versions.txt" /> -->
+		
+		<!-- Grab version from dependency p2 
+		<get src="${something.p2}/versions.txt" dest="${versions.file}"
+							username="${ldap.uname}" password="${ldap.pw}" />
+		 -->
+		<!-- Add OSEE Version -->
+		<pathconvert property="version.bundle.path" setonempty="false">
+			<path>
+				<fileset dir="${basedir}/target/repository/plugins">
+					<include name="org.eclipse.osee.framework.core_*" />
+				</fileset>
+			</path>
+		</pathconvert>
+		<basename property="version.bundle.base.path" file="${version.bundle.path}" />
+		<propertyregex property="core.version" override="true"
+			input="${version.bundle.base.path}" regexp="core_(.*).jar" select="\1"
+			casesensitive="false" />
+
+		<echo file="${versions.file}" append="true"
+			message="OSEE build (org.eclipse.osee.ote): ${core.version}${line.separator}" />
+
+		<if>
+			<available file="${root.folder}/org.eclipse.osee/.git" type="dir"
+				property="org.eclipse.osee.present" />
+			<then>
+				<antcall target="git.revision">
+					<param name="param1" value="${root.folder}" />
+					<param name="param2" value="org.eclipse.osee" />
+				</antcall>
+			</then>
+		</if>
+
+	</target>
+
+	<target name="git.revision" description="Store git revision in ${repository.version}">
+		<exec executable="git" outputproperty="git.branch"
+			failifexecutionfails="false" errorproperty="git.error" dir="${param1}/${param2}">
+			<arg value="rev-parse" />
+			<arg value="--abbrev-ref" />
+			<arg value="HEAD" />
+		</exec>
+		<exec executable="git" outputproperty="git.revision"
+			failifexecutionfails="false" errorproperty="git.error" dir="${param1}/${param2}">
+			<arg value="log" />
+			<arg value="-1" />
+			<arg value="--pretty=format:%H,%cd" />
+		</exec>
+		<condition property="repository.version" value="${git.revision}"
+			else="unknown">
+			<and>
+				<isset property="git.revision" />
+				<length string="${git.revision}" trim="yes" length="0" when="greater" />
+			</and>
+		</condition>
+
+		<echo message="${param2},${git.branch},${repository.version}${line.separator}"
+			file="${versions.file}" append="true" />
+
+	</target>
+
+</project>
diff --git a/org.eclipse.osee.ote.parent/.project b/org.eclipse.osee.ote.parent/.project
new file mode 100644
index 0000000..338ba14
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.parent</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.parent/build.sh b/org.eclipse.osee.ote.parent/build.sh
new file mode 100644
index 0000000..6689a5b
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/build.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+mvn clean verify -Dosee.base.p2=$1
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.parent/buildLocal.sh b/org.eclipse.osee.ote.parent/buildLocal.sh
new file mode 100644
index 0000000..31a8dea
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/buildLocal.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+export BASE_AREA=`pwd | sed 's/\/c\//\/c\:\//'`
+mvn clean verify -Dosee.x.core.p2=file://$BASE_AREA/../org.eclipse.osee.x.core.p2/target/repository -Dosee.base.p2=file://$BASE_AREA/../org.eclipse.osee.client.all.p2/target/repository 
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.parent/pom.xml b/org.eclipse.osee.ote.parent/pom.xml
new file mode 100644
index 0000000..e57754d
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/pom.xml
@@ -0,0 +1,445 @@
+<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>
+
+	<groupId>org.eclipse.osee</groupId>
+	<artifactId>org.eclipse.osee.ote.parent</artifactId>
+	<packaging>pom</packaging>
+	<name>OSEE OTE - Parent (Incubation)</name>
+	<version>0.25.3-SNAPSHOT</version>
+
+	<modules>
+		<module>../org.eclipse.osee.framework.ui.workspacebundleloader</module>
+		<module>../org.eclipse.osee.ote.master</module>
+		<module>../org.eclipse.osee.ote.master.test</module>
+		<module>../org.eclipse.osee.ote.master.rest</module>
+		<module>../org.eclipse.osee.ote.master.rest.client</module>
+		<module>../org.eclipse.osee.ote.master.rest.model</module>
+		<module>../org.eclipse.osee.ote.server.external.feature</module>
+		<module>../org.eclipse.osee.ote.master.feature</module>
+		<module>../org.eclipse.osee.ote.master.product</module>
+		<module>../org.eclipse.osee.ote.rest</module>
+		<module>../org.eclipse.osee.ote.rest.client</module>
+		<module>../org.eclipse.osee.ote.rest.model</module>
+		<module>../org.eclipse.osee.ote.properties</module>
+		<module>../org.eclipse.osee.ote.io</module>
+		<module>../org.eclipse.osee.ote.client</module>
+		<module>../org.eclipse.osee.ote.client.msg</module>
+		<module>../org.eclipse.osee.ote.connection.jini</module>
+		<module>../org.eclipse.osee.ote.connection.service</module>
+		<module>../org.eclipse.osee.ote.container</module>
+		<module>../org.eclipse.osee.ote.core</module>
+		<module>../org.eclipse.osee.ote.jms</module>
+		<module>../org.eclipse.osee.ote.messaging.dds</module>
+		<module>../org.eclipse.osee.ote.runtimeManager</module>
+		<module>../org.eclipse.osee.ote.server</module>
+		<module>../org.eclipse.osee.ote.ui</module>
+		<module>../org.eclipse.osee.ote.ui.builder</module>
+		<module>../org.eclipse.osee.ote.ui.markers</module>
+		<module>../org.eclipse.osee.ote.version</module>
+		<module>../org.eclipse.osee.ote.version.git</module>
+		<module>../org.eclipse.osee.ote.version.svn</module>
+		<module>../org.eclipse.osee.ote.ui.test.manager</module>
+		<module>../org.eclipse.osee.ote.feature</module>
+		<module>../org.eclipse.osee.client.ote.feature</module>
+		<module>../org.eclipse.osee.ote.p2</module>
+	</modules>
+
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+		<git-repo-root>file:../..</git-repo-root>
+		<build-alias>-DEV</build-alias>
+
+		<tycho-version>1.0.0</tycho-version>
+		<tycho-extras-version>1.0.0</tycho-extras-version>
+
+		<maven-antrun-version>1.6</maven-antrun-version>
+		<ant-contrib-version>1.0b3</ant-contrib-version>
+		<jsch-version>0.1.42</jsch-version>
+		<ant-jsch-version>1.8.2</ant-jsch-version>
+		<ant-commons-net-version>1.7.0</ant-commons-net-version>
+		<commons-net-version>1.4.1</commons-net-version>
+		<jacoco-version>0.5.3.201107060350</jacoco-version>
+		<findbugs-version>2.3.2</findbugs-version>
+		<pmd-version>2.5</pmd-version>
+		<checkstyle-version>2.6</checkstyle-version>
+		<javadoc-version>2.9.1</javadoc-version>
+		<build-helper-maven-plugin-version>1.7</build-helper-maven-plugin-version>
+		<maven-resources-version>2.5</maven-resources-version>
+
+		<jaxdoclet-version>0.9.0</jaxdoclet-version>
+		<jersey-version>1.17.1</jersey-version>
+		<jersey-wadlgen-version>1.17.1</jersey-wadlgen-version>
+		<jaxrs-version>1.1.1</jaxrs-version>
+		<maven-clean-version>2.5</maven-clean-version>
+		<xerces-version>2.6.1</xerces-version>
+
+		<jaxb2-maven-version>1.5</jaxb2-maven-version>
+
+		<jasmine-version>1.3.1.0</jasmine-version>
+
+		<platform-version-name>mars</platform-version-name>
+		<!-- <orbit-version>R20150124073747</orbit-version> -->
+		<orbit-version>R20130517111416</orbit-version>
+		<xtext-version>2.0.0</xtext-version>
+		<subversive-version>1.0</subversive-version>
+		<polarion-version>3.0</polarion-version>
+
+		<orbit-site>http://download.eclipse.org/tools/orbit/downloads/drops/${orbit-version}/repository</orbit-site>
+		<eclipse-site>http://download.eclipse.org/releases/${platform-version-name}</eclipse-site>
+		<itemis-site>http://download.itemis.com/updates/releases/${xtext-version}</itemis-site>
+
+		<osee-create-help-docs>false</osee-create-help-docs>
+
+		
+
+	</properties>
+
+	<licenses>
+		<license>
+			<name>Eclipse Public License v1.0</name>
+			<comments>
+       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.htm
+      </comments>
+		</license>
+	</licenses>
+
+	<organization>
+		<name>Eclipse Open System Engineering Environment</name>
+		<url>http://www.eclipse.org/osee</url>
+	</organization>
+
+	<build>
+		<sourceDirectory>src</sourceDirectory>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-maven-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<extensions>true</extensions>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-packaging-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<format>'v'yyyyMMddHHmm'${build-alias}'</format>
+					<archiveSite>true</archiveSite>
+					<environments>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86_64</arch>
+						</environment>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86_64</arch>
+						</environment>
+					</environments>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>target-platform-configuration</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<filters>
+						<!-- Work around Equinox bug 348045 -->
+						<filter>
+							<type>p2-installable-unit</type>
+							<id>org.eclipse.equinox.servletbridge.extensionbundle</id>
+							<removeAll />
+						</filter>
+					</filters>
+					<resolver>p2</resolver>
+					<environments>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86_64</arch>
+						</environment>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86_64</arch>
+						</environment>
+					</environments>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-source-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<executions>
+					<execution>
+						<id>plugin-source</id>
+						<goals>
+							<goal>plugin-source</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho.extras</groupId>
+				<artifactId>tycho-source-feature-plugin</artifactId>
+				<version>${tycho-extras-version}</version>
+				<executions>
+					<execution>
+						<id>source-feature</id>
+						<phase>package</phase>
+						<goals>
+							<goal>source-feature</goal>
+						</goals>
+					</execution>
+				</executions>
+				<!-- optional excludes -->
+				<configuration>
+					<excludes>
+						<plugin id="sourcefeature.bundle.nosource" />
+						<feature id="sourcefeature.feature.nosource" />
+					</excludes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-p2-plugin</artifactId>
+				<version>${tycho-extras-version}</version>
+				<executions>
+					<execution>
+						<id>default-p2-metadata-default</id>
+						<configuration>
+							<attachP2Metadata>false</attachP2Metadata>
+						</configuration>
+					</execution>
+					<execution>
+						<id>attach-p2-metadata</id>
+						<goals>
+							<goal>p2-metadata</goal>
+						</goals>
+						<phase>package</phase>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.eclipse.tycho</groupId>
+					<artifactId>tycho-compiler-plugin</artifactId>
+					<version>${tycho-version}</version>
+					<configuration>
+						<source>1.8</source>
+						<target>1.8</target>
+						<encoding>UTF-8</encoding>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.eclipse.tycho</groupId>
+					<artifactId>tycho-source-plugin</artifactId>
+					<version>${tycho-version}</version>
+					<configuration>
+						<strictSrcIncludes>false</strictSrcIncludes>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.eclipse.tycho.extras</groupId>
+					<artifactId>tycho-source-feature-plugin</artifactId>
+					<version>${tycho-extras-version}</version>
+				</plugin>
+				<plugin>
+					<groupId>org.eclipse.tycho</groupId>
+					<artifactId>tycho-p2-plugin</artifactId>
+					<version>${tycho-version}</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-resources-plugin</artifactId>
+					<version>${maven-resources-version}</version>
+					<configuration>
+						<encoding>ISO-8859-1</encoding>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-antrun-plugin</artifactId>
+					<version>${maven-antrun-version}</version>
+					<dependencies>
+						<dependency>
+							<groupId>ant-contrib</groupId>
+							<artifactId>ant-contrib</artifactId>
+							<version>${ant-contrib-version}</version>
+							<exclusions>
+								<exclusion>
+									<groupId>ant</groupId>
+									<artifactId>ant</artifactId>
+								</exclusion>
+							</exclusions>
+						</dependency>
+						<dependency>
+							<groupId>com.jcraft</groupId>
+							<artifactId>jsch</artifactId>
+							<version>${jsch-version}</version>
+						</dependency>
+						<dependency>
+							<groupId>org.apache.ant</groupId>
+							<artifactId>ant-jsch</artifactId>
+							<version>${ant-jsch-version}</version>
+						</dependency>
+						<dependency>
+							<groupId>commons-net</groupId>
+							<artifactId>commons-net</artifactId>
+							<version>${commons-net-version}</version>
+						</dependency>
+						<dependency>
+							<groupId>org.apache.ant</groupId>
+							<artifactId>ant-commons-net</artifactId>
+							<version>${ant-commons-net-version}</version>
+						</dependency>
+					</dependencies>
+				</plugin>
+				<plugin>
+					<groupId>org.codehaus.mojo</groupId>
+					<artifactId>build-helper-maven-plugin</artifactId>
+					<version>${build-helper-maven-plugin-version}</version>
+				</plugin>
+				<plugin>
+					<groupId>com.github.searls</groupId>
+					<artifactId>jasmine-maven-plugin</artifactId>
+					<version>${jasmine-version}</version>
+					<executions>
+						<execution>
+							<goals>
+								<goal>test</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+	<profiles>
+		<profile>
+			<id>external-repos</id>
+			<activation>
+				<property>
+					<name>!no-extern-repos</name>
+				</property>
+			</activation>
+			<properties>
+				<eclipse-ip-site>${git-repo-root}/org.eclipse.ip/org.eclipse.ip.p2/target/repository</eclipse-ip-site>
+			</properties>
+			<repositories>
+				<repository>
+					<id>orbit</id>
+					<layout>p2</layout>
+					<url>${orbit-site}</url>
+				</repository>
+				<repository>
+					<id>eclipse</id>
+					<layout>p2</layout>
+					<url>${eclipse-site}</url>
+				</repository>
+				<repository>
+					<id>itemis</id>
+					<layout>p2</layout>
+					<url>${itemis-site}</url>
+				</repository>
+
+				<repository>
+					<id>eclipse-ip</id>
+					<layout>p2</layout>
+					<url>${eclipse-ip-site}</url>
+				</repository>
+			</repositories>
+		</profile>
+		<profile>
+			<id>client-external-p2</id>
+			<activation>
+				<property>
+					<name>osee-build-stage</name>
+					<value>!osee-all-server</value>
+				</property>
+			</activation>
+			<properties>
+				<!--<nebula-site>http://download.eclipse.org/technology/nebula/snapshot</nebula-site> -->
+				<!--<wikitext-site>http://download.eclipse.org/tools/mylyn/update/weekly</wikitext-site> -->
+				<!--<subversive-site>http://download.eclipse.org/technology/subversive/${subversive-version}/update-site</subversive-site> -->
+				<!-- <polarion-site>http://community.polarion.com/projects/subversive/download/eclipse/${polarion-version}/update-site</polarion-site> -->
+				<!-- <egit-site>http://download.eclipse.org/egit/updates</egit-site> -->
+			</properties>
+			<repositories>
+				<!-- <repository> <id>nebula</id> <layout>p2</layout> <url>${nebula-site}</url> 
+					</repository> -->
+				<!-- <repository> <id>wikitext</id> <layout>p2</layout> <url>${wikitext-site}</url> 
+					</repository> -->
+				<!-- <repository> <id>polarion</id> <layout>p2</layout> <url>${polarion-site}</url> 
+					</repository> <repository> <id>subversive</id> <layout>p2</layout> <url>${subversive-site}</url> 
+					</repository> -->
+				<!-- <repository> <id>egit</id> <layout>p2</layout> <url>${egit-site}</url> 
+					</repository> -->
+			</repositories>
+		</profile>
+		<profile>
+			<id>osee.base.p2</id>
+			<activation>
+				<property>
+					<name>osee.base.p2</name>
+				</property>
+			</activation>
+			<repositories>
+				<repository>
+					<id>osee.base.p2</id>
+					<layout>p2</layout>
+					<url>${osee.base.p2}</url>
+				</repository>
+			</repositories>
+		</profile>
+		<profile>
+			<id>osee.x.core.p2</id>
+			<activation>
+				<property>
+					<name>osee.x.core.p2</name>
+				</property>
+			</activation>
+			<repositories>
+				<repository>
+					<id>osee.x.core.p2</id>
+					<layout>p2</layout>
+					<url>${osee.x.core.p2}</url>
+				</repository>
+			</repositories>
+		</profile>
+	</profiles>
+
+</project>
diff --git a/org.eclipse.osee.ote.properties/.classpath b/org.eclipse.osee.ote.properties/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/.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.properties/.project b/org.eclipse.osee.ote.properties/.project
new file mode 100644
index 0000000..0b97c2c
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.properties</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.properties/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.properties/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..da313d9
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Properties
+Bundle-SymbolicName: org.eclipse.osee.ote.properties
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.properties
diff --git a/org.eclipse.osee.ote.properties/build.properties b/org.eclipse.osee.ote.properties/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.properties/pom.xml b/org.eclipse.osee.ote.properties/pom.xml
new file mode 100644
index 0000000..3bff00b
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/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.properties</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Properties</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.properties/src/org/eclipse/osee/ote/properties/OteProperties.java b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OteProperties.java
new file mode 100644
index 0000000..869ef86
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OteProperties.java
@@ -0,0 +1,8 @@
+package org.eclipse.osee.ote.properties;
+
+public interface OteProperties {
+   String getKey();
+   void setValue(String value);  
+   String getValue();
+   String getValue(String defaultValue);
+}
diff --git a/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java
new file mode 100644
index 0000000..45c2cfd
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java
@@ -0,0 +1,130 @@
+package org.eclipse.osee.ote.properties;
+
+public enum OtePropertiesCore implements OteProperties {
+
+   batchFolderDays("ote.batchfolder.days"),
+   brokerUriPort("ote.server.broker.uri.port"),
+   endpointPort("ote.endpoint.port"),
+   httpPort("org.osgi.service.http.port"),
+   ioRedirectFile("ote.io.redirect.file"),
+   ioRedirect("ote.io.redirect"),
+   ioRedirectPath("ote.io.redirect.path"),
+   javaIoTmpdir("java.io.tmpdir"),
+   lineSeparator("line.separator"),
+   masterURI("ote.master.uri"),
+   noStacktraceFilter("org.eclipse.osee.ote.core.noStacktraceFilter"),
+   outfilesLocation("osee.ote.outfiles"),
+   pingTimeout("ote.client.pingTimeout"),
+   serverConnectionTimeout("ote.server.connection.timeout"),
+   serverFactoryClass("osee.ote.server.factory.class"),
+   serverKeepalive("osee.ote.server.keepAlive"),
+   serverTitle("osee.ote.server.title"),
+   timeDebug("ote.time.debug", false),
+   abortMultipleInterrupt("ote.abort.interrupt.multiple", false),
+   timeDebugTimeout("ote.time.debug.timeout", 250000),
+   userHome("user.home"),
+   userName("user.name"),
+   oteServerFolder("osee.ote.server.folder"),
+   oteStationName("osee.ote.station.name"),
+   useLookup("osee.ote.use.lookup");
+      
+   private String key;
+   private long defaultLong;
+   private boolean defaultBoolean;
+   private String defaultString;
+   
+   private final boolean defaultValueSet;
+   
+   OtePropertiesCore(String key){
+      this.key = key;
+      this.defaultValueSet = false;
+   }
+   
+   OtePropertiesCore(String key, long defaultLong){
+      this.key = key;
+      this.defaultLong = defaultLong;
+      this.defaultValueSet = true;
+   }
+   
+   OtePropertiesCore(String key, boolean defaultBoolean){
+      this.key = key;
+      this.defaultBoolean = defaultBoolean;
+      this.defaultValueSet = true;
+   }
+   
+   OtePropertiesCore(String key, String defaultString){
+      this.key = key;
+      this.defaultString = defaultString;
+      this.defaultValueSet = true;
+   }
+   
+   @Override
+   public String getKey() {
+      return key;
+   }
+
+   @Override
+   public void setValue(String value) {
+      System.setProperty(key, value);
+   }
+
+   @Override
+   public String getValue() {
+      return System.getProperty(key);
+   }
+   
+   @Override
+   public String getValue(String defaultValue) {
+      return System.getProperty(key, defaultValue);
+   }
+
+   public long getLongValue(long defaultValue) {
+      long value = defaultValue;
+      String valueStr = System.getProperty(key);
+      try{
+         value = Long.parseLong(valueStr);
+      } catch (Throwable th){
+      }
+      return value;
+   }
+
+   public long getLongValue() {
+      if(!defaultValueSet){
+         throw new IllegalStateException("No default value set.");
+      }
+      long value = defaultLong;
+      String valueStr = System.getProperty(key);
+      try{
+         value = Long.parseLong(valueStr);
+      } catch (Throwable th){
+      }
+      return value;
+   }
+   
+   public boolean getBooleanValue(boolean defaultValue) {
+      boolean value = defaultValue;
+      String valueStr = System.getProperty(key);
+      if(valueStr != null){
+         try{
+            value = Boolean.parseBoolean(valueStr);
+         } catch (Throwable th){
+         }
+      }
+      return value;
+   }
+   
+   public boolean getBooleanValue() {
+      if(!defaultValueSet){
+         throw new IllegalStateException("No default value set.");
+      }
+      boolean value = defaultBoolean;
+      String valueStr = System.getProperty(key);
+      if(valueStr != null){
+         try{
+            value = Boolean.parseBoolean(valueStr);
+         } catch (Throwable th){
+         }
+      }
+      return value;
+   }
+}
diff --git a/org.eclipse.osee.ote.rest.client/.classpath b/org.eclipse.osee.ote.rest.client/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.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.rest.client/.project b/org.eclipse.osee.ote.rest.client/.project
new file mode 100644
index 0000000..8ed6bb7
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.rest.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>
+		<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.rest.client/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.rest.client/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..efed415
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/META-INF/MANIFEST.MF
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Rest Client (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.rest.client
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Service-Component: OSGI-INF/*.xml
+Import-Package: javax.ws.rs;version="2.0.0",
+ javax.ws.rs.client;version="2.0.0",
+ javax.ws.rs.core;version="2.0.0",
+ org.apache.commons.lang.time,
+ org.eclipse.core.net.proxy,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.enums,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.network,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.jaxrs.client,
+ org.eclipse.osee.ote.classserver,
+ org.eclipse.osee.ote.core
+Export-Package: org.eclipse.osee.ote.rest.client
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.ote.rest.model,
+ javax.servlet
diff --git a/org.eclipse.osee.ote.rest.client/OSGI-INF/ote.client.xml b/org.eclipse.osee.ote.rest.client/OSGI-INF/ote.client.xml
new file mode 100644
index 0000000..239d148
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/OSGI-INF/ote.client.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" modified="update">
+   <implementation class="org.eclipse.osee.ote.rest.client.internal.OteClientImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.rest.client.OteClient"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest.client/build.properties b/org.eclipse.osee.ote.rest.client/build.properties
new file mode 100644
index 0000000..c58ea21
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
diff --git a/org.eclipse.osee.ote.rest.client/pom.xml b/org.eclipse.osee.ote.rest.client/pom.xml
new file mode 100644
index 0000000..81abd92
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.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.rest.client</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE REST 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.rest.client/src/org/eclipse/osee/ote/rest/client/BasicProgress.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/BasicProgress.java
new file mode 100644
index 0000000..295a0b6
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/BasicProgress.java
@@ -0,0 +1,55 @@
+package org.eclipse.osee.ote.rest.client;
+
+public class BasicProgress implements Progress {
+
+   private String fail;
+   private Throwable throwable;
+   private boolean success = false;
+   private int totalUnitsOfWork;
+   private int unitsWorked;
+   
+   @Override
+   public void fail(String fail) {
+      this.fail = fail;
+   }
+
+   @Override
+   public void fail(Throwable th) {
+      this.throwable = th;
+   }
+
+   @Override
+   public void setUnitsOfWork(int totalUnitsOfWork) {
+      this.totalUnitsOfWork = totalUnitsOfWork;
+   }
+
+   @Override
+   public void setUnitsWorked(int unitsWorked) {
+      this.unitsWorked = unitsWorked;
+   }
+
+   @Override
+   public void success() {
+      success  = true;
+   }
+   
+   public String getFail() {
+      return fail;
+   }
+
+   public Throwable getThrowable() {
+      return throwable;
+   }
+
+   public boolean isSuccess() {
+      return success;
+   }
+
+   public int getTotalUnitsOfWork() {
+      return totalUnitsOfWork;
+   }
+
+   public int getUnitsWorked() {
+      return unitsWorked;
+   }
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ConfigurationStatusCallback.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ConfigurationStatusCallback.java
new file mode 100644
index 0000000..e2db3ad
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ConfigurationStatusCallback.java
@@ -0,0 +1,12 @@
+package org.eclipse.osee.ote.rest.client;
+
+public interface ConfigurationStatusCallback {
+
+   void fail(String string);
+   void fail(Throwable th);
+
+   void setUnitsOfWork(int totalUnitsOfWork);
+   void setUnitsWorked(int unitsWorked);
+   void success();
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/GetFileProgress.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/GetFileProgress.java
new file mode 100644
index 0000000..525f1e6
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/GetFileProgress.java
@@ -0,0 +1,6 @@
+package org.eclipse.osee.ote.rest.client;
+
+
+public interface GetFileProgress extends Progress {
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OTECacheItem.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OTECacheItem.java
new file mode 100644
index 0000000..b9b3251
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OTECacheItem.java
@@ -0,0 +1,31 @@
+package org.eclipse.osee.ote.rest.client;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+
+public class OTECacheItem {
+   private File file;
+   private String md5;
+   
+   public OTECacheItem(File file, String md5){
+      this.file = file;
+      this.md5 = md5;
+   }
+   
+   public OTECacheItem(File file) throws FileNotFoundException, Exception{
+      this.file = file;
+      md5 = ChecksumUtil.createChecksumAsString(new FileInputStream(file), "MD5");
+   }
+   
+   public File getFile() {
+      return file;
+   }
+   
+   public String getMd5() {
+      return md5;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OteClient.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OteClient.java
new file mode 100644
index 0000000..059bc44
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OteClient.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2012 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.rest.client;
+
+import java.io.File;
+import java.net.URI;
+import java.util.List;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+
+
+/**
+ * @author Andrew Finkbeiner
+ */
+public interface OteClient {
+   Future<Progress> getFile(URI uri, File destination, String filePath, final Progress progress);
+   Future<Progress> configureServerEnvironment(URI uri, List<File> jars, final Progress progress);
+   Future<Progress> configureServerEnvironment(URI uri, OTEConfiguration configuration, final Progress progress);
+   Future<Progress> updateServerJarCache(URI uri, String baseJarURL, List<OTECacheItem> jars, final Progress progress);
+   Future<ProgressWithCancel> runTest(URI uri, OTETestRun tests, Progress progress);
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/Progress.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/Progress.java
new file mode 100644
index 0000000..095e40e
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/Progress.java
@@ -0,0 +1,11 @@
+package org.eclipse.osee.ote.rest.client;
+
+public interface Progress {
+
+   void fail(String string);
+   void fail(Throwable th);
+
+   void setUnitsOfWork(int totalUnitsOfWork);
+   void setUnitsWorked(int unitsWorked);
+   void success();
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ProgressWithCancel.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ProgressWithCancel.java
new file mode 100644
index 0000000..72d8722
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ProgressWithCancel.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote.rest.client;
+
+public interface ProgressWithCancel extends Progress {
+
+   boolean cancelAll();
+
+   boolean cancelSingle();
+   
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/BaseClientCallable.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/BaseClientCallable.java
new file mode 100644
index 0000000..7ed3ffa
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/BaseClientCallable.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.util.concurrent.Callable;
+import org.eclipse.osee.ote.rest.client.Progress;
+
+public abstract class BaseClientCallable<T extends Progress> implements Callable<T>{
+
+   private T progress;
+   
+   public BaseClientCallable(T progress) {
+      this.progress = progress;
+   }
+
+   @Override
+   final public T call() throws Exception {
+      try{
+         doWork();
+         progress.success();
+      } catch (Throwable th){
+         progress.fail(th);
+      }
+      return progress;
+   }
+
+   public abstract void doWork() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/ConfigureOteServer.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/ConfigureOteServer.java
new file mode 100644
index 0000000..397fb3e
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/ConfigureOteServer.java
@@ -0,0 +1,114 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.io.File;
+import java.net.InetAddress;
+import java.net.URI;
+import java.util.List;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.jaxrs.client.JaxRsWebTarget;
+import org.eclipse.osee.ote.classserver.HeadlessClassServer;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationIdentity;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class ConfigureOteServer extends BaseClientCallable<Progress> {
+
+   private static final long POLLING_RATE = 1000;
+   private final URI uri;
+   private List<File> jars;
+   private final Progress progress;
+   private final JaxRsClient factory;
+   private OTEJobStatus status;
+   private HeadlessClassServer classServer;
+   private OTEConfiguration configuration;
+
+   public ConfigureOteServer(URI uri, List<File> jars, Progress progress, JaxRsClient factory) {
+      super(progress);
+      this.uri = uri;
+      this.jars = jars;
+      this.progress = progress;
+      this.factory = factory;
+   }
+
+   public ConfigureOteServer(URI uri, OTEConfiguration configuration, Progress progress, JaxRsClient factory) {
+      super(progress);
+      this.uri = uri;
+      this.configuration = configuration;
+      this.progress = progress;
+      this.factory = factory;
+   }
+
+   @Override
+   public void doWork() throws Exception {
+      try {
+         status = sendBundleConfiguration();
+         if (!status.isJobComplete()) {
+            waitForJobComplete();
+         }
+
+         if (!status.isSuccess()) {
+            throw new Exception("Failed to configure the environment: " + status.getErrorLog());
+         }
+      } finally {
+         if (classServer != null) {
+            classServer.stop();
+         }
+      }
+   }
+
+   private void waitForJobComplete() throws Exception {
+
+      URI jobUri = status.getUpdatedJobStatus().toURI();
+      final JaxRsWebTarget service = factory.target(jobUri);
+
+      while (!status.isJobComplete()) {
+         Thread.sleep(POLLING_RATE);
+         status = service.request(MediaType.APPLICATION_JSON).get(OTEJobStatus.class);
+         progress.setUnitsOfWork(status.getTotalUnitsOfWork());
+         progress.setUnitsWorked(status.getUnitsWorked());
+      }
+   }
+
+   private OTEJobStatus sendBundleConfiguration() throws Exception {
+      URI targetUri = UriBuilder.fromUri(uri).path("ote").path("config").build();
+
+      if (configuration == null) {
+         OTEConfiguration localConfiguration = new OTEConfiguration();
+         OTEConfigurationIdentity identity = new OTEConfigurationIdentity();
+         identity.setName("test");
+         localConfiguration.setIdentity(identity);
+         classServer = new HeadlessClassServer(PortUtil.getInstance().getValidPort(), InetAddress.getLocalHost(), jars);
+         for (BundleInfo bundleInfo : classServer.getBundles()) {
+            OTEConfigurationItem item = new OTEConfigurationItem();
+            item.setBundleName(bundleInfo.getSymbolicName());
+            item.setBundleVersion(bundleInfo.getVersion());
+            item.setLocationUrl(bundleInfo.getServerBundleLocation().toString());
+            item.setMd5Digest(bundleInfo.getMd5Digest());
+            localConfiguration.addItem(item);
+         }
+         OTEConfiguration currentConfig =
+            factory.target(targetUri).request(MediaType.APPLICATION_JSON).get(OTEConfiguration.class);
+         if (currentConfig.equals(localConfiguration)) {
+            OTEJobStatus status = new OTEJobStatus();
+            status.setSuccess(true);
+            status.setJobComplete(true);
+            return status;
+         } else {
+            return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.xml(localConfiguration),
+               OTEJobStatus.class);
+         }
+      } else {
+         return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.xml(configuration),
+            OTEJobStatus.class);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/GetOteServerFile.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/GetOteServerFile.java
new file mode 100644
index 0000000..afd6b20
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/GetOteServerFile.java
@@ -0,0 +1,51 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.URI;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.rest.client.Progress;
+
+public class GetOteServerFile extends BaseClientCallable<Progress> {
+
+   private final URI uri;
+   private final String filePath;
+   @SuppressWarnings("unused")
+   private final Progress progress;
+   private final JaxRsClient factory;
+   private final File destination;
+
+   public GetOteServerFile(URI uri, File destination, String filePath, Progress progress, JaxRsClient factory) {
+      super(progress);
+      this.uri = uri;
+      this.filePath = filePath;
+      this.progress = progress;
+      this.factory = factory;
+      this.destination = destination;
+   }
+
+   @Override
+   public void doWork() throws Exception {
+      URI targetUri = UriBuilder.fromUri(uri).path("ote").path("file").queryParam("path", filePath).build();
+
+      Response response = factory.target(targetUri).request(MediaType.APPLICATION_XML).get();
+      if (response.getStatus() == Status.OK.getStatusCode()) {
+         InputStream is = (InputStream) response.getEntity();
+         FileOutputStream fos = new FileOutputStream(destination);
+         try {
+            Lib.inputStreamToOutputStream(is, fos);
+         } finally {
+            Lib.close(fos);
+         }
+      } else {
+         throw new Exception(response.toString());
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/OteClientImpl.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/OteClientImpl.java
new file mode 100644
index 0000000..27c78ec
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/OteClientImpl.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2012 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.rest.client.internal;
+
+import java.io.File;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.rest.client.OTECacheItem;
+import org.eclipse.osee.ote.rest.client.OteClient;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.client.ProgressWithCancel;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteClientImpl implements OteClient {
+
+   private ExecutorService executor;
+   private volatile JaxRsClient client;
+
+   public void start(Map<String, Object> props) {
+      executor = Executors.newCachedThreadPool(new ThreadFactory() {
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setName("OTE Client " + th.getId());
+            th.setDaemon(true);
+            return th;
+         }
+      });
+      update(props);
+   }
+
+   public void stop() {
+      if (executor != null) {
+         executor.shutdown();
+      }
+      client = null;
+   }
+
+   public void update(Map<String, Object> props) {
+      client = JaxRsClient.newBuilder().properties(props).build();
+   }
+
+   @Override
+   public Future<Progress> getFile(URI uri, File destination, String filePath, final Progress progress) {
+      return executor.submit(new GetOteServerFile(uri, destination, filePath, progress, client));
+   }
+
+   @Override
+   public Future<Progress> configureServerEnvironment(URI uri, List<File> jars, final Progress progress) {
+      return executor.submit(new ConfigureOteServer(uri, jars, progress, client));
+   }
+
+   @Override
+   public Future<Progress> updateServerJarCache(URI uri, String baseJarURL, List<OTECacheItem> jars, Progress progress) {
+      return executor.submit(new PrepareOteServerFile(uri, baseJarURL, jars, progress, client));
+   }
+
+   @Override
+   public Future<ProgressWithCancel> runTest(URI uri, OTETestRun tests, Progress progress) {
+      return executor.submit(new RunTests(uri, tests, progress, client));
+   }
+
+   @Override
+   public Future<Progress> configureServerEnvironment(URI uri, OTEConfiguration configuration, Progress progress) {
+      return executor.submit(new ConfigureOteServer(uri, configuration, progress, client));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/PrepareOteServerFile.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/PrepareOteServerFile.java
new file mode 100644
index 0000000..59a4a1d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/PrepareOteServerFile.java
@@ -0,0 +1,79 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.net.URI;
+import java.util.List;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.jaxrs.client.JaxRsWebTarget;
+import org.eclipse.osee.ote.rest.client.OTECacheItem;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationIdentity;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class PrepareOteServerFile extends BaseClientCallable<Progress> {
+
+   private static final long POLLING_RATE = 1000;
+   private final URI uri;
+   private final List<OTECacheItem> jars;
+   private final Progress progress;
+   private final JaxRsClient factory;
+   private OTEJobStatus status;
+   private final String baseJarURL;
+
+   public PrepareOteServerFile(URI uri, String baseJarURL, List<OTECacheItem> jars, Progress progress, JaxRsClient factory) {
+      super(progress);
+      this.uri = uri;
+      this.jars = jars;
+      this.progress = progress;
+      this.factory = factory;
+      this.baseJarURL = baseJarURL;
+   }
+
+   @Override
+   public void doWork() throws Exception {
+      status = sendBundleConfiguration();
+      if (!status.isJobComplete()) {
+         waitForJobComplete();
+      }
+
+      if (!status.isSuccess()) {
+         throw new Exception("Failed to update the environment cache: " + status.getErrorLog());
+      }
+   }
+
+   private void waitForJobComplete() throws Exception {
+
+      URI jobUri = status.getUpdatedJobStatus().toURI();
+      JaxRsWebTarget service = factory.target(jobUri);
+
+      while (!status.isJobComplete()) {
+         Thread.sleep(POLLING_RATE);
+         status = service.request(MediaType.APPLICATION_JSON).get(OTEJobStatus.class);
+         progress.setUnitsOfWork(status.getTotalUnitsOfWork());
+         progress.setUnitsWorked(status.getUnitsWorked());
+      }
+   }
+
+   private OTEJobStatus sendBundleConfiguration() throws Exception {
+      OTEConfiguration configuration = new OTEConfiguration();
+      OTEConfigurationIdentity identity = new OTEConfigurationIdentity();
+      identity.setName("test");
+      configuration.setIdentity(identity);
+      for (OTECacheItem bundleInfo : jars) {
+         OTEConfigurationItem item = new OTEConfigurationItem();
+         item.setBundleName(bundleInfo.getFile().getName());
+         item.setBundleVersion("N/A");
+         item.setLocationUrl(baseJarURL + bundleInfo.getMd5());
+         item.setMd5Digest(bundleInfo.getMd5());
+         configuration.addItem(item);
+      }
+      URI targetUri = UriBuilder.fromUri(uri).path("ote").path("cache").build();
+      return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.json(configuration),
+         OTEJobStatus.class);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/RunTests.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/RunTests.java
new file mode 100644
index 0000000..f28be59
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/RunTests.java
@@ -0,0 +1,108 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.net.URI;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.client.ProgressWithCancel;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+
+public class RunTests implements ProgressWithCancel, Callable<ProgressWithCancel> {
+
+   private final URI uri;
+   private final OTETestRun tests;
+   private final Progress progress;
+   private final JaxRsClient factory;
+   private OTEJobStatus status;
+   private String id;
+
+   public RunTests(URI uri, OTETestRun tests, Progress progress, JaxRsClient factory) {
+      this.uri = uri;
+      this.tests = tests;
+      this.progress = progress;
+      this.factory = factory;
+   }
+
+   public void doWork() throws Exception {
+      status = sendCommand();
+      id = status.getJobId();
+      if (!status.isSuccess()) {
+         throw new Exception("Failed to submit the run command: " + status.getErrorLog());
+      }
+   }
+
+   @Override
+   public boolean cancelSingle() {
+      URI targetUri = UriBuilder.fromUri(uri).path("ote").path("run").path("{run-id}").build(id);
+      try {
+         OTEJobStatus cancelStatus =
+            factory.target(targetUri).request(MediaType.APPLICATION_JSON).put(Entity.json(""), OTEJobStatus.class);
+         return cancelStatus.isSuccess();
+      } catch (Exception e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+         return false;
+      }
+   }
+
+   private OTEJobStatus sendCommand() throws Exception {
+      URI targetUri = UriBuilder.fromUri(uri).path("ote").path("run").build();
+      return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.json(tests), OTEJobStatus.class);
+   }
+
+   @Override
+   public boolean cancelAll() {
+      URI targetUri = UriBuilder.fromUri(uri).path("ote").path("run").path("{run-id}").build(id);
+
+      try {
+         OTEJobStatus cancelStatus =
+            factory.target(targetUri).request(MediaType.APPLICATION_JSON).delete(OTEJobStatus.class);
+         return cancelStatus.isSuccess();
+      } catch (Exception e) {
+         OseeLog.log(getClass(), Level.SEVERE, e);
+         return false;
+      }
+   }
+
+   @Override
+   final public ProgressWithCancel call() throws Exception {
+      try {
+         doWork();
+         progress.success();
+      } catch (Throwable th) {
+         progress.fail(th);
+      }
+      return this;
+   }
+
+   @Override
+   public void fail(String string) {
+      progress.fail(string);
+   }
+
+   @Override
+   public void fail(Throwable th) {
+      progress.fail(th);
+   }
+
+   @Override
+   public void setUnitsOfWork(int totalUnitsOfWork) {
+      progress.setUnitsOfWork(totalUnitsOfWork);
+   }
+
+   @Override
+   public void setUnitsWorked(int unitsWorked) {
+      progress.setUnitsWorked(unitsWorked);
+   }
+
+   @Override
+   public void success() {
+      progress.success();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/.classpath b/org.eclipse.osee.ote.rest.model/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/.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.rest.model/.project b/org.eclipse.osee.ote.rest.model/.project
new file mode 100644
index 0000000..a8ae5b4
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.rest.model</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.rest.model/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.rest.model/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e4e8715
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Rest Model (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.rest.model
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.rest.model
+Import-Package: javax.xml.bind.annotation,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.jdk.core.util
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.core
diff --git a/org.eclipse.osee.ote.rest.model/build.properties b/org.eclipse.osee.ote.rest.model/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.rest.model/pom.xml b/org.eclipse.osee.ote.rest.model/pom.xml
new file mode 100644
index 0000000..163c7dd
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/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.rest.model</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE RESTModel(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.rest.model/src/org/eclipse/osee/ote/rest/model/KeyValue.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/KeyValue.java
new file mode 100644
index 0000000..9726e7d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/KeyValue.java
@@ -0,0 +1,62 @@
+package org.eclipse.osee.ote.rest.model;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class KeyValue {
+
+   private String key;
+   private String value;
+   
+   private List<String> values;
+   
+   public KeyValue(){
+      
+   }
+   
+   public KeyValue(String key, String value){
+      this.key = key;
+      this.value = value;
+   }
+
+   public KeyValue(String key, List<String> values) {
+      this.key = key;
+      this.values = values;
+   }
+
+   public String getKey() {
+      return key;
+   }
+
+   public void setKey(String key) {
+      this.key = key;
+   }
+
+   public String getValue() {
+      return value;
+   }
+
+   public void setValue(String value) {
+      this.value = value;
+   }
+   
+   @XmlElementWrapper
+   @XmlElement(name="Values")
+   public List<String> getValues() {
+      return values;
+   }
+   
+   public List<String> setValues(List<String> values) {
+      return this.values = values;
+   }
+
+   public void setValueArray(List<String> values) {
+      this.values = values;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfiguration.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfiguration.java
new file mode 100644
index 0000000..483f5d4
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfiguration.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2012 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.rest.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@XmlRootElement
+public class OTEConfiguration {
+
+   private OTEConfigurationIdentity identity;
+   
+   private List<OTEConfigurationItem> items;
+   
+   private boolean install;
+ 
+   public OTEConfiguration(){
+	   items = new ArrayList<>();
+	   this.install = true;
+   }
+   
+   public OTEConfigurationIdentity getIdentity(){
+	   return identity;
+   }
+   
+   @XmlElementWrapper
+   @XmlElement(name="OTEConfigurationItem")
+   public List<OTEConfigurationItem> getItems(){
+	   return items;
+   }
+
+   @Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((identity == null) ? 0 : identity.hashCode());
+      result = prime * result + ((items == null) ? 0 : items.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      OTEConfiguration other = (OTEConfiguration) obj;
+//      if (identity == null) {
+//         if (other.identity != null)
+//            return false;
+//      } else if (!identity.equals(other.identity))
+//         return false;
+      if (items == null) {
+         if (other.items != null)
+            return false;
+      } else if (!items.equals(other.items))
+         return false;
+      return true;
+   }
+
+   public void setIdentity(OTEConfigurationIdentity identity) {
+	   this.identity = identity;
+   }
+
+   public void addItem(OTEConfigurationItem item){
+	   items.add(item);
+   }
+   
+   public void setInstall(boolean install) {
+      this.install = install;
+   }
+   
+   public boolean getInstall(){
+      return this.install;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationIdentity.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationIdentity.java
new file mode 100644
index 0000000..7c104d4
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationIdentity.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2012 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.rest.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Roberto E. Escobar
+ */
+@XmlRootElement
+public class OTEConfigurationIdentity {
+	private String uuid;
+	private String name;
+
+   public String getUuid() {
+		return uuid;
+	}
+
+	public void setUuid(String uuid) {
+		this.uuid = uuid;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+   public String getName() {
+      return name;
+   }
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationItem.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationItem.java
new file mode 100644
index 0000000..4dba4b9
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationItem.java
@@ -0,0 +1,99 @@
+package org.eclipse.osee.ote.rest.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class OTEConfigurationItem {
+
+	private String locationUrl;
+	private String md5Digest;
+	private String bundleVersion;
+	private String bundleName;
+	private boolean isOsgiBundle;
+	
+	public String getLocationUrl() {
+		return locationUrl;
+	}
+	public void setLocationUrl(String locationUrl) {
+		this.locationUrl = locationUrl;
+	}
+	public String getMd5Digest() {
+		return md5Digest;
+	}
+	
+	@Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((bundleName == null) ? 0 : bundleName.hashCode());
+      result = prime * result + ((bundleVersion == null) ? 0 : bundleVersion.hashCode());
+      result = prime * result + (isOsgiBundle ? 1231 : 1237);
+      result = prime * result + ((locationUrl == null) ? 0 : locationUrl.hashCode());
+      result = prime * result + ((md5Digest == null) ? 0 : md5Digest.hashCode());
+      return result;
+   }
+	
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      OTEConfigurationItem other = (OTEConfigurationItem) obj;
+      if (bundleName == null) {
+         if (other.bundleName != null)
+            return false;
+      } else if (!bundleName.equals(other.bundleName))
+         return false;
+      if (bundleVersion == null) {
+         if (other.bundleVersion != null)
+            return false;
+      } else if (!bundleVersion.equals(other.bundleVersion))
+         return false;
+      if (isOsgiBundle != other.isOsgiBundle)
+         return false;
+      if (locationUrl == null) {
+         if (other.locationUrl != null)
+            return false;
+      } else if (!locationUrl.equals(other.locationUrl))
+         return false;
+      if (md5Digest == null) {
+         if (other.md5Digest != null)
+            return false;
+      } else if (!md5Digest.equals(other.md5Digest))
+         return false;
+      return true;
+   }
+   public void setMd5Digest(String md5Digest) {
+		this.md5Digest = md5Digest;
+	}
+	public String getBundleVersion() {
+		return bundleVersion;
+	}
+	public void setBundleVersion(String bundleVersion) {
+		this.bundleVersion = bundleVersion;
+	}
+	public String getBundleName() {
+		return bundleName;
+	}
+	public void setBundleName(String bundleName) {
+		this.bundleName = bundleName;
+	}
+	public String getSymbolicName() {
+		return bundleName;
+	}
+	public String getVersion() {
+		return bundleVersion;
+	}
+
+	public boolean isOsgiBundle() {
+	   return isOsgiBundle;
+	}
+	public void setOsgiBundle(boolean isOsgiBundle) {
+	   this.isOsgiBundle = isOsgiBundle;
+	}
+	   
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEJobStatus.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEJobStatus.java
new file mode 100644
index 0000000..833ce5d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEJobStatus.java
@@ -0,0 +1,91 @@
+package org.eclipse.osee.ote.rest.model;
+
+import java.net.URL;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class OTEJobStatus {
+
+   private URL updatedJobStatus;
+   private String jobId;
+   
+   private int totalUnitsOfWork;
+   private int unitsWorked;
+   private String errorLog;
+   private boolean jobComplete;
+   private boolean success;
+   
+   public OTEJobStatus(){
+      errorLog = "";
+      jobComplete = false;
+      success = true;
+      totalUnitsOfWork = 0;
+      unitsWorked = 0;
+   }
+   
+   public int getTotalUnitsOfWork() {
+      return totalUnitsOfWork;
+   }
+   
+   public int getUnitsWorked() {
+      return unitsWorked;
+   }
+
+   public String getErrorLog() {
+      return errorLog;
+   }
+
+   public boolean isJobComplete() {
+      return jobComplete;
+   }
+
+   public void setTotalUnitsOfWork(int i) {
+      totalUnitsOfWork = i;
+   }
+
+   public void jobComplete() {
+      jobComplete = true;
+   }
+
+   public void incrememtUnitsWorked() {
+      unitsWorked++;
+   }
+   
+   public void setUnitsWorked(int unitsWorked) {
+      this.unitsWorked = unitsWorked;
+   }
+
+   public void setErrorLog(String log) {
+      this.errorLog = log;
+   }
+
+   public void setJobComplete(boolean jobComplete) {
+      this.jobComplete = jobComplete;
+   }
+   
+   public boolean isSuccess() {
+      return success;
+   }
+
+   public void setSuccess(boolean success) {
+      this.success = success;
+   }
+
+   public URL getUpdatedJobStatus() {
+      return updatedJobStatus;
+   }
+
+   public void setUpdatedJobStatus(URL updatedJobStatus) {
+      this.updatedJobStatus = updatedJobStatus;
+   }
+
+   public String getJobId() {
+      return jobId;
+   }
+
+   public void setJobId(String jobId) {
+      this.jobId = jobId;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTETestRun.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTETestRun.java
new file mode 100644
index 0000000..412a053
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTETestRun.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2012 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.rest.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@XmlRootElement
+public class OTETestRun {
+
+   private OTEConfiguration jarConfiguration;
+   private Properties globalProperties;
+   private List<Properties> tests;
+ 
+   public OTETestRun(){
+      tests = new ArrayList<>();
+      globalProperties = new Properties();
+   }
+   
+   public Properties getGlobalProperties(){
+	   return globalProperties;
+   }
+   
+   @XmlElementWrapper
+   @XmlElement(name="Properties")
+   public List<Properties> getTests(){
+	   return tests;
+   }
+
+   public void setGlobalProperties(Properties globalProperties) {
+	   this.globalProperties = globalProperties;
+   }
+
+   public void addTest(Properties test){
+	   tests.add(test);
+   }
+
+   public OTEConfiguration getJarConfiguration() {
+      return jarConfiguration;
+   }
+
+   public void setJarConfiguration(OTEConfiguration jarConfiguration) {
+      this.jarConfiguration = jarConfiguration;
+   }
+
+   
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/Properties.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/Properties.java
new file mode 100644
index 0000000..8a205ab
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/Properties.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2012 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.rest.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@XmlRootElement
+public class Properties {
+
+   private List<KeyValue> pairs;
+ 
+   public Properties(){
+      pairs = new ArrayList<>();
+   }
+   
+   public Properties(String simpleName) {
+      this();
+   }
+
+   @XmlElementWrapper
+   @XmlElement(name="Pair")
+   public List<KeyValue> getPairs(){
+	   return pairs;
+   }
+   
+   public List<KeyValue> setPairs(List<KeyValue> pairs){
+      return this.pairs = pairs;
+   }
+
+   public void addPair(KeyValue pair){
+      pairs.add(pair);
+   }
+
+   public void put(String key, boolean value) {
+      put(key, Boolean.toString(value));
+   }
+
+   public void put(String key, String value) {
+      KeyValue pair = findPair(key);
+      if(pair == null){
+         pairs.add(new KeyValue(key, value));
+      } else {
+         pair.setValueArray(null);
+         pair.setValue(value);
+      }
+   }
+
+   public void put(String key, List<String> values) {
+      KeyValue pair = findPair(key);
+      if(pair == null){
+         pairs.add(new KeyValue(key, values));
+      } else {
+         pair.setValueArray(values);
+         pair.setValue(null);
+      }
+   }
+   
+   public void put(String key, String[] values) {
+      put(key, Arrays.asList(values));
+   }
+
+   private KeyValue findPair(String key) {
+      for(KeyValue pair:pairs){
+         if(pair.getKey().equals(key)){
+            return pair;
+         }
+      }
+      return null;
+   }
+
+   public String get(String key) {
+      KeyValue pair = findPair(key);
+      if(pair != null){
+         return pair.getValue();
+      }
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/.classpath b/org.eclipse.osee.ote.rest/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/.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.rest/.project b/org.eclipse.osee.ote.rest/.project
new file mode 100644
index 0000000..e388ba0
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.rest</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.rest/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.rest/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..398e173
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Rest (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.rest
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Service-Component: OSGI-INF/*.xml
+Import-Package: javax.ws.rs,
+ javax.ws.rs.core,
+ javax.ws.rs.ext,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.framework.command,
+ org.eclipse.osee.ote.io,
+ org.eclipse.osee.ote.rest.model
+Require-Bundle: org.eclipse.osee.framework.jdk.core,
+ org.eclipse.core.runtime
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.configuration.store.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.configuration.store.xml
new file mode 100644
index 0000000..b3dcec3
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.configuration.store.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" name="org.eclipse.osee.ote.rest.configuration">
+   <implementation class="org.eclipse.osee.ote.rest.internal.OteConfigurationStoreImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.rest.internal.OteConfigurationStore"/>
+   </service>
+   <reference bind="bindOTEApi" cardinality="1..1" interface="org.eclipse.osee.ote.OTEApi" name="OTEApi" policy="static" unbind="unbindOTEApi"/>
+   <reference bind="bindOteJobStore" cardinality="1..1" interface="org.eclipse.osee.ote.rest.internal.OteJobStore" name="OteJobStore" policy="static" unbind="unbindOteJobStore"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.job.store.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.job.store.xml
new file mode 100644
index 0000000..eee5900
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.job.store.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.rest">
+   <implementation class="org.eclipse.osee.ote.rest.internal.OteJobStoreImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.rest.internal.OteJobStore"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.rest.application.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.rest.application.xml
new file mode 100644
index 0000000..d049d27
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.rest.application.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.rest.internal.OteRestApplication">
+   <implementation class="org.eclipse.osee.ote.rest.internal.OteRestApplication"/>
+   <service>
+      <provide interface="javax.ws.rs.core.Application"/>
+   </service>
+   <reference bind="setOteConfigurationStore" cardinality="1..1" interface="org.eclipse.osee.ote.rest.internal.OteConfigurationStore" name="OteConfigurationStore" policy="static"/>   
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.run.tests.component.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.run.tests.component.xml
new file mode 100644
index 0000000..b5474dc
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.run.tests.component.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.rest.OteRunTests">
+   <implementation class="org.eclipse.osee.ote.rest.internal.OteRunTestCommandsImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.rest.internal.OteRunTestCommands"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/build.properties b/org.eclipse.osee.ote.rest/build.properties
new file mode 100644
index 0000000..8910159
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/build.properties
@@ -0,0 +1,8 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               OSGI-INF/ote.configuration.store.xml,\
+               OSGI-INF/ote.job.store.xml,\
+               OSGI-INF/ote.run.tests.component.xml
+source.. = src/
diff --git a/org.eclipse.osee.ote.rest/pom.xml b/org.eclipse.osee.ote.rest/pom.xml
new file mode 100644
index 0000000..b3f88cb
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/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.rest</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE REST(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.rest/src/org/eclipse/osee/ote/rest/internal/ConfigurationJobStatus.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ConfigurationJobStatus.java
new file mode 100644
index 0000000..1066ad6
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ConfigurationJobStatus.java
@@ -0,0 +1,101 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.net.URL;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class ConfigurationJobStatus implements OTEStatusCallback<ConfigurationStatus>, OteJob {
+
+   private int totalUnitsOfWork;
+   private int count;
+   private StringBuilder errorLog;
+   private StringBuilder statusLog;
+   private Future<ConfigurationStatus> future;
+   private String uuid;
+   private URL url;
+   
+   public ConfigurationJobStatus(){
+      totalUnitsOfWork = 0;
+      errorLog = new StringBuilder();
+      statusLog = new StringBuilder();
+   }
+   
+   @Override
+   public void complete(ConfigurationStatus done) {
+   }
+
+   @Override
+   public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+      this.totalUnitsOfWork = totalUnitsOfWork;
+   }
+
+   @Override
+   public void incrememtUnitsWorked(int count) {
+      this.count+=count;
+   }
+
+   @Override
+   public void log(String string) {
+      statusLog.append(string);
+      statusLog.append("\n");
+   }
+
+   @Override
+   public void error(String message, Throwable th) {
+      errorLog.append(message);
+      errorLog.append("\n");
+      errorLog.append(Lib.exceptionToString(th));
+      errorLog.append("\n");
+   }
+   
+   @Override
+   public void error(String message) {
+      errorLog.append(message);
+      errorLog.append("\n");
+   }
+
+   public void setFuture(Future<ConfigurationStatus> future) {
+      this.future = future;
+   }
+
+   @Override
+   public OTEJobStatus getStatus() throws InterruptedException, ExecutionException {
+      OTEJobStatus jobStatus = new OTEJobStatus();
+      if(future.isDone()){
+         jobStatus.setJobComplete(true);
+         jobStatus.setSuccess(future.get().isSuccess());
+         if(!future.get().isSuccess()){
+            error(future.get().getMessage());
+         }
+      } else {
+         jobStatus.setJobComplete(false);
+         jobStatus.setSuccess(false);
+      }
+      jobStatus.setJobId(uuid);
+      jobStatus.setErrorLog(errorLog.toString());
+      jobStatus.setTotalUnitsOfWork(totalUnitsOfWork);
+      jobStatus.setUnitsWorked(count);
+      jobStatus.setUpdatedJobStatus(url);
+      return jobStatus;
+   }
+
+   @Override
+   public String getId() {
+      return uuid;
+   }
+
+   @Override
+   public void setId(String uuid) {
+      this.uuid = uuid;
+   }
+
+   public void setUrl(URL url) {
+      this.url = url;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/HTMLBuilder.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/HTMLBuilder.java
new file mode 100644
index 0000000..4bfc2cb
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/HTMLBuilder.java
@@ -0,0 +1,127 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class HTMLBuilder {
+   
+   private static String hostname = "";
+   private static final String serverTitle = "OTE Server"; 
+   
+   private StringBuilder sb;
+   
+   static {
+      try {
+         InetAddress localHost = InetAddress.getLocalHost();
+         hostname = localHost.getHostName();
+      } catch (UnknownHostException e) {
+         e.printStackTrace();
+      }
+   }
+   
+   public HTMLBuilder() {
+      sb = new StringBuilder();
+   }
+   
+   public void open(String title){
+      sb.append("<!DOCTYPE HTML>\n");
+      sb.append("<html>\n");
+      sb.append("<head>\n");
+      sb.append("<title>"+title+"</title>\n");
+      sb.append("</head>\n");
+      sb.append("<body>\n");
+   }
+   
+   public void commonHeader(File directory){
+      h2(serverTitle + " on " + hostname);
+      h3("Local Folder:");
+      p(directory.getAbsolutePath());
+   }
+   
+   private void h3(String string) {
+      sb.append("<h3>");
+      sb.append(string);
+      sb.append("</h3>");
+   }
+
+   public void addLink(String baseUrl, String path, String title){
+      sb.append("<a href=\"");
+      sb.append(baseUrl);
+      if(!baseUrl.endsWith("/")){
+         sb.append("/");
+      }
+      sb.append(path);
+      sb.append("\">");
+      sb.append(title);
+      sb.append("</a>");
+   }
+   
+   public void close(){
+      sb.append("</body>\n");
+      sb.append("</html>\n");
+   }
+   
+   public String get(){
+      return sb.toString();
+   }
+
+   public void br() {
+      sb.append("<br>");
+   }
+
+   public void pre(String statusFileContents) {
+      sb.append("<pre>");
+      sb.append(statusFileContents);
+      sb.append("</pre>");
+   }
+
+   public void p(String content) {
+      sb.append("<p>");
+      sb.append(content);
+      sb.append("</p>");
+   }
+
+   public void h2(String title) {
+      sb.append("<h2>");
+      sb.append(title);
+      sb.append("</h2>");
+   }
+
+   public void ulStart() {
+      sb.append("<ul>");
+   }
+
+   public void ulStop() {
+      sb.append("</ul>");
+   }
+
+   public void li(String name) {
+      sb.append("<li>");
+      sb.append(name);
+      sb.append("</li>");
+   }
+
+   public void tableStart() {
+      sb.append("<table border=\"1\">");
+   }
+
+   public void trStart() {
+      sb.append("<tr>");
+   }
+
+   public void td(String string) {
+      sb.append("<td>");
+      sb.append(string);
+      sb.append("</td>");
+   }
+
+   public void trEnd() {
+      sb.append("</tr>");
+   }
+
+   public void tableEnd() {
+      sb.append("</table>");
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEConfigItemSort.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEConfigItemSort.java
new file mode 100644
index 0000000..2d8c411
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEConfigItemSort.java
@@ -0,0 +1,14 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.Comparator;
+
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+
+public class OTEConfigItemSort implements Comparator<OTEConfigurationItem> {
+
+   @Override
+   public int compare(OTEConfigurationItem arg0, OTEConfigurationItem arg1) {
+      return arg0.getBundleName().compareTo(arg1.getBundleName());
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEStatusCallbackForRun.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEStatusCallbackForRun.java
new file mode 100644
index 0000000..ed47e1d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEStatusCallbackForRun.java
@@ -0,0 +1,44 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+
+public class OTEStatusCallbackForRun<T> implements OTEStatusCallback<ConfigurationStatus> {
+
+   @Override
+   public void complete(ConfigurationStatus done) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public void incrememtUnitsWorked(int count) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public void log(String message) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public void error(String message, Throwable th) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public void error(String message) {
+      // TODO Auto-generated method stub
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchResource.java
new file mode 100644
index 0000000..eadbb7e
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchResource.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * 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.rest.internal;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("batches")
+public class OteBatchResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+   private final String path;
+
+   public OteBatchResource(UriInfo uriInfo, Request request, String path) {
+      this.uriInfo = uriInfo;
+      this.request = request;
+      this.path = path;
+   }
+
+   public OteBatchResource() {
+      this.path = "";
+   }
+
+   @GET
+   @Produces(MediaType.TEXT_HTML)
+   public String getBatches() throws OseeCoreException {
+      OTEApi ote = ServiceUtility.getService(OTEApi.class);
+      File rootBatches = ote.getServerFolder().getBatchesFolder();
+      File myBatchFolder = new File(rootBatches, path);
+      File logFile = ote.getServerFolder().getBatchLogFile(myBatchFolder);
+      
+      HTMLBuilder builder = new HTMLBuilder();
+      
+      builder.open("OTE Batch Status");
+      /**
+       * Disaled till we figure out security 
+      if(uriInfo != null){
+         String url = uriInfo.getAbsolutePath().toASCIIString();
+         builder.addLink(url, "content.zip", "Get Folder Contents");
+      }
+      */
+      builder.commonHeader(myBatchFolder);
+
+      
+      generateStatusSection(builder, ote, myBatchFolder);
+      
+      generateResultsSection(builder, ote, myBatchFolder);
+      
+      builder.h2("Output");
+      builder.pre(getFileContents(logFile));
+      builder.close();
+	   return builder.get(); 
+   }
+   
+   private void generateResultsSection(HTMLBuilder builder, OTEApi ote, File myBatchFolder) {
+      File runList = ote.getServerFolder().getBatchRunList(myBatchFolder);
+      String runListContents = "";
+      if(runList.exists()){
+         runListContents = getFileContents(runList);
+      }
+      if(runListContents.length() > 0){
+         File[] resultFiles = myBatchFolder.listFiles(new FileFilter() {
+            @Override
+            public boolean accept(File arg0) {
+               return arg0.getName().endsWith(".result");
+            }
+         });
+         String[] runListArray = runListContents.split("\n");
+         List<TestResultSummary> results = getTestResults(resultFiles, runListArray);
+         builder.h2("Tests");
+         builder.tableStart();
+         builder.trStart();
+         builder.td("Test");
+         builder.td("Result");
+         builder.td("Time");
+         builder.trEnd();
+         
+         for(TestResultSummary result:results){
+            builder.trStart();
+            builder.td(result.getName());
+            builder.td(result.getResult());
+            builder.td(result.getTime());
+            builder.trEnd();
+         }
+         
+         builder.tableEnd();
+         
+      } else {
+         builder.h2("Files");
+         builder.ulStart();
+         File[] batches = myBatchFolder.listFiles();
+         Arrays.sort(batches, new TimeSort());
+         for(File file:batches){
+            builder.li(file.getName());
+         }
+         builder.ulStop();
+      }
+   }
+   
+   
+
+   private List<TestResultSummary> getTestResults(File[] resultFiles, String[] runListArray) {
+      List<TestResultSummary> results = new ArrayList<>();
+      Map<String, TestResultSummary> resultsTemp = new HashMap<>();
+      for(File file:resultFiles){
+         String content = getFileContents(file);
+         if(content.length() > 0){
+            String[] data = content.split(",");
+            if(data.length == 3){
+               resultsTemp.put(data[0], new TestResultSummary(data[0], data[1], data[2]));
+            }
+         }
+      }
+      for(String name:runListArray){
+         TestResultSummary result = resultsTemp.get(name);
+         if(result == null){
+            result = new TestResultSummary(name);
+         }
+         results.add(result);
+      }
+      return results;
+   }
+
+   private void generateStatusSection(HTMLBuilder builder, OTEApi ote, File myBatchFolder){
+      builder.h2("Status");
+      String status = getFileContents(ote.getServerFolder().getBatchStatusFile(myBatchFolder));
+      if(status.length() == 0){
+         status = "unknown";
+      }
+      builder.p(status);
+   }
+   
+   private String getFileContents(File statusFile) {
+      String status = "";
+      try {
+         if(statusFile.exists()){
+            status = Lib.fileToString(statusFile);
+         }
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+      return status;
+   }
+   
+   @Path("content.zip")
+   @GET
+   @Produces({"application/zip"})
+   public StreamingOutput getZip() throws Exception {
+      return new StreamingOutput() {
+         @Override
+         public void write(OutputStream output) throws IOException, WebApplicationException {
+            try {
+               OTEApi ote = ServiceUtility.getService(OTEApi.class);
+               File rootBatches = ote.getServerFolder().getBatchesFolder();
+               File myBatchFolder = new File(rootBatches, path);
+               ZIPGenerator generator = new ZIPGenerator(myBatchFolder);
+               generator.generateZip(output);
+            } catch (Exception e) {
+               throw new WebApplicationException(e);
+            }
+         }
+      };
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchesResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchesResource.java
new file mode 100644
index 0000000..b490478
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchesResource.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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.rest.internal;
+
+import java.io.File;
+import java.util.Arrays;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("batches")
+public class OteBatchesResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+
+   @GET
+   @Produces(MediaType.TEXT_HTML)
+   public String getBatches() throws OseeCoreException {
+      OTEApi ote = ServiceUtility.getService(OTEApi.class);
+      File[] batches = ote.getServerFolder().getBatchesFolder().listFiles();
+      String url = uriInfo.getAbsolutePath().toASCIIString();
+      HTMLBuilder builder = new HTMLBuilder();
+      builder.open("OTE Server Batches");
+      builder.commonHeader(ote.getServerFolder().getBatchesFolder());
+      
+      builder.h2("Archived Batches:");
+      Arrays.sort(batches, new ReverseAlphabeticalSort());
+      for(File file:batches){
+         if(file.isDirectory()){
+            builder.addLink(url, file.getName(), file.getName());
+            builder.br();
+         }
+      }
+      builder.close();
+	   return builder.get(); 
+   }
+   
+   @Path("{path}")
+   public OteBatchResource getConfiguration(@PathParam("path") String path) {
+      return new OteBatchResource(uriInfo, request, path);
+   }
+
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationResource.java
new file mode 100644
index 0000000..684b850
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationResource.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.rest.internal;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("config")
+public class OteConfigurationResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+
+   @GET
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public OTEConfiguration getConfiguration() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+      return getDataStore().getConfiguration(uriInfo);
+   }
+   
+   @POST
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public OTEJobStatus createConfig(OTEConfiguration config) throws IOException, InterruptedException, ExecutionException {
+      return getDataStore().setup(config, uriInfo);
+   }
+   
+   @GET
+   @Produces({MediaType.TEXT_HTML})
+   public String getHtmlConfiguration() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+      OTEConfiguration config = getDataStore().getConfiguration(uriInfo);
+      HTMLBuilder b = new HTMLBuilder();
+      b.open("OTE Server Configuration");
+      b.h2("Server Configuration");      
+      b.ulStart();
+      List<OTEConfigurationItem> items = config.getItems();
+      Collections.sort(items, new OTEConfigItemSort());
+      for(OTEConfigurationItem item:config.getItems()){
+         b.li(String.format("%s %s", item.getBundleName(), item.getBundleVersion()));
+      }
+      b.ulStop();
+      return b.get();
+   }
+   
+   private OteConfigurationStore getDataStore(){
+      return OteRestApplication.get();
+   }
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStore.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStore.java
new file mode 100644
index 0000000..2c58266
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStore.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.net.MalformedURLException;
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public interface OteConfigurationStore {
+   OTEJobStatus setup(OTEConfiguration config, UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException;
+   OTEJobStatus reset(UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException;
+	OTEConfiguration getConfiguration(UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException;
+   OTEJobStatus getJob(String uuid) throws InterruptedException, ExecutionException;
+   Collection<String> getAllJobIds();
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStoreImpl.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStoreImpl.java
new file mode 100644
index 0000000..6bbac8b
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStoreImpl.java
@@ -0,0 +1,107 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class OteConfigurationStoreImpl implements OteConfigurationStore {
+
+   private OTEApi ote;
+   private OteJobStore oteJobs;
+	
+	public OteConfigurationStoreImpl(){
+	}
+	
+	public void bindOTEApi(OTEApi ote){
+	   this.ote = ote;
+	}
+	
+	public void unbindOTEApi(OTEApi ote){
+	   this.ote = null;
+	}
+	
+	public void bindOteJobStore(OteJobStore oteJobs){
+	   this.oteJobs = oteJobs;
+	}
+
+	public void unbindOteJobStore(OteJobStore oteJobs){
+	   this.oteJobs = null;
+	}
+
+   @Override
+   public OTEJobStatus setup(OTEConfiguration config, UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException {
+      Configuration realConfig = TranslateUtil.translateToOtherConfig(config);
+      ConfigurationJobStatus status = createConfigurationJobStatus(realConfig, uriInfo);
+      Future<ConfigurationStatus> future = null;
+      if(config.getInstall()){
+         future = ote.loadConfiguration(realConfig, status);
+      } else {
+         future = ote.downloadConfigurationJars(realConfig, status);
+      }
+      status.setFuture(future);
+      return status.getStatus();
+   }
+
+   private ConfigurationJobStatus createConfigurationJobStatus(Configuration config, UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException {
+      ConfigurationJobStatus status = new ConfigurationJobStatus();
+      status.setId(UUID.randomUUID().toString());
+      status.setUrl(generateJobUrl(status, uriInfo));
+      oteJobs.add(status);
+      return status;
+   }
+
+   private URL generateJobUrl(OteJob job, UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException{
+      return uriInfo.getBaseUriBuilder().path("job").path(job.getId()).build().toURL();
+   }
+   
+   @Override
+   public OTEJobStatus reset(UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException {
+      ConfigurationJobStatus status = createConfigurationJobStatus(uriInfo);
+      Future<ConfigurationStatus> future = ote.resetConfiguration(status);
+      status.setFuture(future);
+      return status.getStatus();
+   }
+
+   @Override
+   public OTEConfiguration getConfiguration(UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+      ConfigurationJobStatus status = createConfigurationJobStatus(uriInfo);
+      Future<ConfigurationStatus> future = ote.getConfiguration();
+      status.setFuture(future);
+      if(future.isDone()){
+         return TranslateUtil.translateConfig(future.get().getConfiguration());
+      } else {
+         return new OTEConfiguration();
+      }
+   }
+
+   private ConfigurationJobStatus createConfigurationJobStatus(UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException {
+      ConfigurationJobStatus status = new ConfigurationJobStatus();
+      status.setId(UUID.randomUUID().toString());
+      status.setUrl(generateJobUrl(status, uriInfo));
+      oteJobs.add(status);
+      return status;
+   }
+
+   @Override
+   public OTEJobStatus getJob(String uuid) throws InterruptedException, ExecutionException {
+      return oteJobs.get(uuid);
+   }
+
+   @Override
+   public Collection<String> getAllJobIds() {
+      return oteJobs.getAll();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteFilesResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteFilesResource.java
new file mode 100644
index 0000000..a618a46
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteFilesResource.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.rest.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("file")
+public class OteFilesResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+
+   @GET
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public StreamingOutput getFile(@QueryParam("path") String path ) throws OseeCoreException {
+      final String myPath = path;
+      return new StreamingOutput() {
+         public void write(OutputStream output) throws IOException, WebApplicationException {
+             try {
+                File file = new File(myPath);
+                InputStream is = new FileInputStream(file);
+                byte[] bytes = new byte[2048];
+                int numRead = 0;
+                while((numRead = is.read(bytes)) != -1){
+                   output.write(bytes, 0, numRead);
+                }
+                is.close();
+             } catch (Exception e) {
+                 throw new WebApplicationException(e);
+             }
+         }
+     };
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJob.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJob.java
new file mode 100644
index 0000000..0d2c646
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJob.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public interface OteJob {
+   
+   String getId();
+   void setId(String uuid);
+   OTEJobStatus getStatus() throws InterruptedException, ExecutionException;
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobResource.java
new file mode 100644
index 0000000..23a1f89
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobResource.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+9 * 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.rest.internal;
+
+import java.util.concurrent.ExecutionException;
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteJobResource {
+
+   @Context
+   private final UriInfo uriInfo;
+   @Context
+   private final Request request;
+
+   private final String uuid;
+   
+   private final OteConfigurationStore store;
+   
+
+   public OteJobResource(UriInfo uriInfo, Request request, OteConfigurationStore store, String id) {
+      this.uriInfo = uriInfo;
+      this.request = request;
+      this.uuid = id;
+      this.store = store;
+   }
+   
+   @GET
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public OTEJobStatus getConfig() throws OseeCoreException, InterruptedException, ExecutionException {
+	  return store.getJob(uuid);
+   }
+ 
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStore.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStore.java
new file mode 100644
index 0000000..90a74d0
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStore.java
@@ -0,0 +1,16 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public interface OteJobStore {
+
+   OTEJobStatus get(String uuid) throws InterruptedException, ExecutionException;
+
+   Collection<String> getAll();
+
+   void add(OteJob job);
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStoreImpl.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStoreImpl.java
new file mode 100644
index 0000000..b6cbd83
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStoreImpl.java
@@ -0,0 +1,36 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.Collection;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class OteJobStoreImpl implements OteJobStore {
+
+   ConcurrentHashMap<String, OteJob> jobs;
+   
+   public OteJobStoreImpl(){
+      jobs = new ConcurrentHashMap<>();
+   }
+   
+   @Override
+   public OTEJobStatus get(String uuid) throws InterruptedException, ExecutionException {
+      OteJob job = jobs.get(uuid);
+      if(job != null){
+         return job.getStatus(); 
+      }
+      return null;
+   }
+
+   @Override
+   public Collection<String> getAll() {
+      return jobs.keySet();
+   }
+
+   @Override
+   public void add(OteJob job) {
+      jobs.put(job.getId(), job);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobsResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobsResource.java
new file mode 100644
index 0000000..2d20aa7
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobsResource.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.rest.internal;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("job")
+public class OteJobsResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+
+   @Path("{uuid}")
+   public OteJobResource getConfiguration(@PathParam("uuid") String id) {
+      return new OteJobResource(uriInfo, request, getDataStore(), id);
+   }
+
+   @GET
+   @Produces(MediaType.TEXT_PLAIN)
+   public String getConfiguration() throws OseeCoreException {
+      StringBuilder sb = new StringBuilder();
+      for(String id:getDataStore().getAllJobIds()){
+         sb.append(id);
+         sb.append("\n");
+      } 
+	   return sb.toString(); 
+   }
+   
+   private OteConfigurationStore getDataStore(){
+      return OteRestApplication.get();
+   }
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRestApplication.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRestApplication.java
new file mode 100644
index 0000000..ed12256
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRestApplication.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.rest.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+/**
+ * Get application.wadl at this context to get rest documentation
+ * 
+ * @author Roberto E. Escobar
+ */
+@ApplicationPath("ote")
+public class OteRestApplication extends Application {
+
+   private static OteConfigurationStore store;
+
+   public void setOteConfigurationStore(OteConfigurationStore store) {
+      OteRestApplication.store = store;
+   }
+
+   public static OteConfigurationStore get() {
+      return store;
+   }
+
+   @Override
+   public Set<Class<?>> getClasses() {
+      Set<Class<?>> classes = new HashSet<>();
+      classes.add(OteRootResource.class);
+      classes.add(OteConfigurationResource.class);
+      classes.add(OteJobsResource.class);
+      classes.add(OteFilesResource.class);
+      classes.add(OteRunTestResource.class);
+      classes.add(OteBatchesResource.class);
+      return classes;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRootResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRootResource.java
new file mode 100644
index 0000000..e91c585
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRootResource.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.rest.internal;
+
+import java.io.File;
+import java.util.Arrays;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("/")
+public class OteRootResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+
+   @GET
+   @Produces(MediaType.TEXT_HTML)
+   public String getConfiguration() throws OseeCoreException {
+      String url = uriInfo.getAbsolutePath().toASCIIString();
+      OTEApi ote = ServiceUtility.getService(OTEApi.class);
+      File serverFolder = ote.getServerFolder().getRootFolder();
+      HTMLBuilder builder = new HTMLBuilder();
+      builder.open("OTE Server");
+      builder.commonHeader(serverFolder);
+      builder.h2("Batch Data:");
+      builder.addLink(url, "latestbatch", "Latest Batch");
+      builder.br();
+      builder.addLink(url, "batches", "Archived Batches");
+      builder.br();
+      builder.br();
+      builder.h2("Server Info:");
+      builder.addLink(url, "config", "Current Server Configuration");
+      builder.br();
+      builder.close();
+	   return builder.get(); 
+   }
+   
+   @Path("latestbatch")
+   @GET
+   @Produces(MediaType.TEXT_HTML)
+   public String getLatestBatch() throws Exception {
+      OTEApi ote = ServiceUtility.getService(OTEApi.class);
+      File[] batches = ote.getServerFolder().getBatchesFolder().listFiles();
+      
+      Arrays.sort(batches, new ReverseAlphabeticalSort());
+      if(batches.length > 0){
+         return new OteBatchResource(uriInfo, request, batches[0].getName()).getBatches();
+      } else {
+         return new OteBatchResource().getBatches();
+      }
+   }
+   
+   @Path("latestbatch/content.zip")
+   @GET
+   @Produces({"application/zip"})
+   public StreamingOutput getLatestBatchContent() throws Exception {
+      OTEApi ote = ServiceUtility.getService(OTEApi.class);
+      File[] batches = ote.getServerFolder().getBatchesFolder().listFiles();
+      
+      Arrays.sort(batches, new ReverseAlphabeticalSort());
+      if(batches.length > 0){
+         return new OteBatchResource(uriInfo, request, batches[0].getName()).getZip();
+      } else {
+         return new OteBatchResource().getZip();
+      }
+   }
+
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommands.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommands.java
new file mode 100644
index 0000000..0a2984d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommands.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+
+public interface OteRunTestCommands {
+   RunTests getCommand(String id);
+
+   void putCommand(String string, RunTests envTestRun);
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommandsImpl.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommandsImpl.java
new file mode 100644
index 0000000..f6a4fce
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommandsImpl.java
@@ -0,0 +1,28 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+
+public class OteRunTestCommandsImpl implements OteRunTestCommands {
+
+   private Map<String,  WeakReference<RunTests>> tests;
+   
+   public OteRunTestCommandsImpl(){
+      tests = new HashMap<>();
+   }
+   
+   @Override
+   public RunTests getCommand(String id) {
+      WeakReference<RunTests> ref = tests.get(id);
+      return ref.get();
+   }
+
+   @Override
+   public void putCommand(String id, RunTests envTestRun) {
+      tests.put(id, new WeakReference<RunTests>(envTestRun));
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResource.java
new file mode 100644
index 0000000..cb3583e
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResource.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * 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.rest.internal;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.logging.Level;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.rest.model.KeyValue;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+import org.eclipse.osee.ote.rest.model.Properties;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("run")
+public class OteRunTestResource {
+
+   // Allows to insert contextual objects into the class, 
+   // e.g. ServletContext, Request, Response, UriInfo
+   @Context
+   UriInfo uriInfo;
+   @Context
+   Request request;
+
+   @GET
+   @Produces({MediaType.TEXT_HTML})
+   public String getCurrentRunStatus() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+      return "hello";//getDataStore().getConfiguration(uriInfo);
+   }
+   
+   @POST
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public OTEJobStatus run(OTETestRun tests) throws IOException, InterruptedException, ExecutionException {
+      TestEnvironmentInterface env = ServiceUtility.getService(TestEnvironmentInterface.class);
+      OTEJobStatus status = new OTEJobStatus();
+      if(env == null){
+         status.setSuccess(false);
+         status.setJobComplete(true);
+         status.setErrorLog("Failed to aquire TestEnvironmentInterface.");
+      } else {
+         UUID id = UUID.randomUUID();
+         Configuration configuration = TranslateUtil.translateToOtherConfig(tests.getJarConfiguration());
+         RunTests envTestRun = new RunTests(id.toString(), id, configuration, propertyStoreConversion(tests.getGlobalProperties()), propertyStoreConversion(tests.getTests()));
+         OteRunTestCommands commands = ServiceUtility.getService(OteRunTestCommands.class);
+         if(commands != null){
+            commands.putCommand(id.toString(), envTestRun);
+         }
+         env.addCommand(envTestRun);
+         status.setJobId(id.toString());
+      }
+      return status;
+   }
+   
+   @Path("{uuid}")
+   public OteRunTestResourceItem getConfiguration(@PathParam("uuid") String id) {
+      return new OteRunTestResourceItem(uriInfo, request, id);
+   }
+
+   public IPropertyStore propertyStoreConversion(Properties properties){
+      IPropertyStore store = new PropertyStore();
+      for(KeyValue pair:properties.getPairs()){
+         if(pair.getValue() != null){
+            store.put(pair.getKey(), pair.getValue());
+         } else if(pair.getValues() != null){
+            store.put(pair.getKey(), pair.getValues().toArray(new String[0]));
+         } else {
+            OseeLog.log(OteRunTestResource.class, Level.SEVERE, "For PROPERTY:" + pair.getKey() + ", the corresponding VALUE is NULL!!");
+         }
+      }
+      return store;
+   }
+   
+   public List<IPropertyStore> propertyStoreConversion(List<Properties> properties){
+      List<IPropertyStore> stores = new ArrayList<>();
+      for(Properties prop:properties){
+         stores.add(propertyStoreConversion(prop));
+      }
+      return stores;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResourceItem.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResourceItem.java
new file mode 100644
index 0000000..62cc91f
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResourceItem.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class OteRunTestResourceItem {
+
+   @SuppressWarnings("unused")
+   private UriInfo uriInfo;
+   @SuppressWarnings("unused")
+   private Request request;
+   private String id;
+   
+   public OteRunTestResourceItem(UriInfo uriInfo, Request request, String id) {
+      this.uriInfo = uriInfo;
+      this.request = request;
+      this.id = id;
+   }
+   
+   @DELETE
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public OTEJobStatus abortAll() throws IOException, InterruptedException, ExecutionException {
+      OteRunTestCommands commands = ServiceUtility.getService(OteRunTestCommands.class);
+      OTEJobStatus status = new OTEJobStatus();
+      status.setSuccess(false);
+      if(commands != null){
+         RunTests cmd = commands.getCommand(id);
+         if(cmd != null){
+            cmd.cancel();
+            status.setSuccess(true);
+         }
+      }
+      return status;
+   }
+   
+   @PUT
+   @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+   public OTEJobStatus abortSingle() {
+      OteRunTestCommands commands = ServiceUtility.getService(OteRunTestCommands.class);
+      OTEJobStatus status = new OTEJobStatus();
+      status.setSuccess(false);
+      if(commands != null){
+         RunTests cmd = commands.getCommand(id);
+         if(cmd != null){
+            cmd.cancelSingle();
+            status.setSuccess(true);
+         }
+      }
+      return status;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ReverseAlphabeticalSort.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ReverseAlphabeticalSort.java
new file mode 100644
index 0000000..9ca21ee
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ReverseAlphabeticalSort.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.util.Comparator;
+
+public class ReverseAlphabeticalSort implements Comparator<File> {
+
+   @Override
+   public int compare(File arg0, File arg1) {
+      return arg1.getName().compareToIgnoreCase(arg0.getName());
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TestResultSummary.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TestResultSummary.java
new file mode 100644
index 0000000..611950c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TestResultSummary.java
@@ -0,0 +1,59 @@
+package org.eclipse.osee.ote.rest.internal;
+
+class TestResultSummary {
+
+   private static final String NA = "N/A";
+   private String name;
+   private String results;
+   private String time;
+   
+   public TestResultSummary(String name, String results, String time) {
+      this.name = name;
+      this.results = results;
+      this.time = time;
+   }
+
+   public TestResultSummary(String name) {
+      this.name = name;
+      this.results = NA;
+      this.time = NA;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getResult() {
+      return results;
+   }
+
+   public String getTime() {
+      return time;
+   }
+
+   @Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((name == null) ? 0 : name.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      TestResultSummary other = (TestResultSummary) obj;
+      if (name == null) {
+         if (other.name != null)
+            return false;
+      } else if (!name.equals(other.name))
+         return false;
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TimeSort.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TimeSort.java
new file mode 100644
index 0000000..96d7450
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TimeSort.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.util.Comparator;
+
+public class TimeSort implements Comparator<File> {
+
+   @Override
+   public int compare(File o1, File o2) {
+      long time1 = o1.lastModified();
+      long time2 = o2.lastModified();
+      if(time1 == time2){
+         return 0;
+      } else if ( time1 > time2) {
+         return 1;
+      } else {
+         return -1;
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TranslateUtil.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TranslateUtil.java
new file mode 100644
index 0000000..7362eef
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TranslateUtil.java
@@ -0,0 +1,41 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+
+public class TranslateUtil {
+
+   public static Configuration translateToOtherConfig(OTEConfiguration restConfig) {
+      if(restConfig == null){
+         return null;
+      }
+      Configuration config = new Configuration();
+      for(OTEConfigurationItem item:restConfig.getItems()){
+         config.addItem(TranslateUtil.translateToOtherConfig(item));
+      }
+      return config;
+   }
+   
+   public static ConfigurationItem translateToOtherConfig(OTEConfigurationItem restConfigItem) {
+      return new ConfigurationItem(restConfigItem.getLocationUrl(), restConfigItem.getBundleVersion(), restConfigItem.getBundleName(), restConfigItem.getMd5Digest(), restConfigItem.isOsgiBundle());
+   }
+   
+   public static OTEConfiguration translateConfig(Configuration config){
+      if(config == null){
+         return null;
+      }
+      OTEConfiguration restConfig = new OTEConfiguration();
+      for(ConfigurationItem item:config.getItems()){
+         OTEConfigurationItem newitem = new OTEConfigurationItem();
+         newitem.setBundleName(item.getSymbolicName());
+         newitem.setBundleVersion(item.getVersion());
+         newitem.setLocationUrl(item.getLocationUrl());
+         newitem.setMd5Digest(item.getMd5Digest());
+         restConfig.addItem(newitem);
+      }
+      return restConfig;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ZIPGenerator.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ZIPGenerator.java
new file mode 100644
index 0000000..21af4ea
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ZIPGenerator.java
@@ -0,0 +1,57 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.zip.Deflater;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ZIPGenerator {
+
+   private File folderToZip;
+
+   public ZIPGenerator(File folderToZip) {
+      this.folderToZip = folderToZip;
+   }
+
+   public void generateZip(OutputStream output) {
+      ZipOutputStream zipOut = new ZipOutputStream(output);
+      zipOut.setLevel(Deflater.DEFAULT_COMPRESSION);
+
+      for (File file : folderToZip.listFiles()) {
+         if (!file.isDirectory()){
+            try {
+               zipFile(zipOut, file);
+            } catch (IOException e) {
+               e.printStackTrace();
+            }
+         }
+      }
+      try {
+         zipOut.flush();
+         zipOut.close();
+      } catch (IOException e) {
+         e.printStackTrace();
+      }
+   }
+   
+   private void zipFile(ZipOutputStream zos, File file) throws IOException {
+      if (!file.canRead()) {
+         return;
+      }
+
+      zos.putNextEntry(new ZipEntry(file.getName()));
+      FileInputStream fis = new FileInputStream(file);
+      byte[] buffer = new byte[4092];
+      int byteCount = 0;
+      while ((byteCount = fis.read(buffer)) != -1)
+      {
+         zos.write(buffer, 0, byteCount);
+      }
+      fis.close();
+      zos.closeEntry();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/.classpath b/org.eclipse.osee.ote.runtimeManager/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.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.runtimeManager/.pmd b/org.eclipse.osee.ote.runtimeManager/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.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.runtimeManager/.project b/org.eclipse.osee.ote.runtimeManager/.project
new file mode 100644
index 0000000..471d166
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.runtimeManager</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.runtimeManager/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e39345c
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Runtime Manager Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.runtimeManager;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.runtimemanager.RuntimeManager
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.ui.wizards,
+ org.eclipse.jface.wizard,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.framework.ui.workspacebundleloader,
+ org.eclipse.osee.ote.classserver,
+ org.eclipse.osee.ote.core,
+ org.eclipse.swt,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.ote.runtimemanager
+Require-Bundle: org.eclipse.osgi,
+ org.eclipse.ui
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.runtimeManager/build.properties b/org.eclipse.osee.ote.runtimeManager/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.osee.ote.runtimeManager/plugin.xml b/org.eclipse.osee.ote.runtimeManager/plugin.xml
new file mode 100644
index 0000000..022818d
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/plugin.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         id="OteSystemLibsNature"
+         name="OTE System Libraries Nature"
+         point="org.eclipse.core.resources.natures">
+      <runtime>
+         <run
+               class="org.eclipse.osee.ote.runtimemanager.OteSystemLibsNature">
+         </run>
+      </runtime>
+   </extension>
+   <extension
+         id="OteUserLibsNature"
+         name="OTE User Libraries Nature"
+         point="org.eclipse.core.resources.natures">
+      <runtime>
+         <run
+               class="org.eclipse.osee.ote.runtimemanager.OteUserLibsNature">
+         </run>
+      </runtime>
+   </extension>
+   
+  <extension
+         point="org.eclipse.ui.startup">
+      <startup
+            class="org.eclipse.osee.ote.runtimemanager.EarlyStartup">
+      </startup>
+   </extension>
+  <extension
+        point="org.eclipse.jdt.core.classpathContainerInitializer">
+     <classpathContainerInitializer
+           class="org.eclipse.osee.ote.runtimemanager.container.OteClasspathContainerInitializer"
+           id="OTE Library">
+     </classpathContainerInitializer>
+  </extension>
+  <extension
+        point="org.eclipse.jdt.ui.classpathContainerPage">
+     <classpathContainerPage
+           class="org.eclipse.osee.ote.runtimemanager.container.OteContainerPage"
+           id="org.eclipse.osee.ote.runtimeManager.container.OTE_CONTAINER"
+           name="OTE Library">
+     </classpathContainerPage>
+  </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.runtimeManager/pom.xml b/org.eclipse.osee.ote.runtimeManager/pom.xml
new file mode 100644
index 0000000..6e76530
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/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.runtimeManager</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Runtime Manager (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.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java
new file mode 100644
index 0000000..ca2bf46
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.runtimemanager;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.ui.IStartup;
+
+/**
+ * @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 {
+               workspaceTracker = new SafeWorkspaceTracker(ServiceUtility.getContext());
+               workspaceTracker.open(true);
+            } catch (Throwable ex) {
+               OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+            }
+         }
+      });
+   }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java
new file mode 100644
index 0000000..6a5cd00
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * 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.runtimemanager;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import org.eclipse.osee.framework.ui.workspacebundleloader.IJarChangeListener;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+import org.eclipse.osee.ote.core.BundleInfo;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class JarListenerStub<T extends JarCollectionNature> implements IJarChangeListener<T> {
+
+   private final Object bundleSynchronizer;
+   private final Set<String> newBundles;
+   private final Set<String> changedBundles;
+   private final Set<String> removedBundles;
+
+   public JarListenerStub() {
+      this.bundleSynchronizer = new Object();
+      this.newBundles = new HashSet<>();
+      this.changedBundles = new HashSet<>();
+      this.removedBundles = new HashSet<>();
+   }
+
+   @Override
+   public void handleBundleAdded(URL url) {
+      try {
+         String bundleName = getBundleNameFromJar(url);
+         synchronized (bundleSynchronizer) {
+            newBundles.add(bundleName);
+            changedBundles.remove(bundleName);
+            removedBundles.remove(bundleName);
+         }
+         System.out.println("Bundle added:" + bundleName);
+      } catch (IOException ex) {
+      }
+   }
+
+   @Override
+   public void handleBundleChanged(URL url) {
+      try {
+         String bundleName = getBundleNameFromJar(url);
+         synchronized (bundleSynchronizer) {
+            changedBundles.add(bundleName);
+            newBundles.remove(bundleName);
+            removedBundles.remove(bundleName);
+         }
+         System.out.println("Bundle changed:" + bundleName);
+      } catch (IOException ex) {
+      }
+   }
+
+   @Override
+   public void handleBundleRemoved(URL url) {
+      try {
+         String bundleName = getBundleNameFromJar(url);
+         synchronized (bundleSynchronizer) {
+            removedBundles.add(bundleName);
+            newBundles.remove(bundleName);
+            changedBundles.remove(bundleName);
+         }
+         System.out.println("Bundle removed:" + bundleName);
+      } catch (IOException ex) {
+      }
+   }
+
+   @Override
+   public void handleNatureClosed(T nature) {
+      System.out.println("Project closed: " + nature.getProject().getName());
+      for (URL url : nature.getBundles()) {
+         handleBundleRemoved(url);
+      }
+   }
+
+   @Override
+   public void handlePostChange() {
+      System.out.println("Bunch of changes just finished");
+   }
+
+   private <S extends Object> Set<S> duplicateAndClear(Set<S> set) {
+      synchronized (bundleSynchronizer) {
+         Set<S> returnBundles = new HashSet<>(set);
+         set.clear();
+         return returnBundles;
+      }
+   }
+
+   /**
+    * @return the newBundles
+    */
+   public Set<String> consumeNewBundles() {
+      return duplicateAndClear(newBundles);
+   }
+
+   /**
+    * @return the changedBundles
+    */
+   public Set<String> consumeChangedBundles() {
+      return duplicateAndClear(changedBundles);
+   }
+
+   /**
+    * @return the removedBundles
+    */
+   public Set<String> consumeRemovedBundles() {
+      return duplicateAndClear(removedBundles);
+   }
+
+   private String getBundleNameFromJar(URL url) throws IOException {
+      File file;
+      try {
+         file = new File(url.toURI());
+      } catch (URISyntaxException ex) {
+         file = new File(url.getPath());
+      }
+
+      JarFile jarFile = new JarFile(file);
+      Manifest jarManifest = jarFile.getManifest();
+      return BundleInfo.generateBundleName(jarManifest);
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java
new file mode 100644
index 0000000..a743a38
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * 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.runtimemanager;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.osee.framework.ui.workspacebundleloader.FileChangeDetector;
+import org.eclipse.osee.framework.ui.workspacebundleloader.IJarChangeListener;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.runtimemanager.container.OteClasspathContainer;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class LibJarListener<T extends JarCollectionNature> implements IJarChangeListener<T> {
+
+   private static final boolean VERBOSE_DEBUG = true;
+
+   private final FileChangeDetector detector = new FileChangeDetector();
+
+   private final Object bundleSynchronizer;
+   private final Set<URL> newBundles;
+   private final Set<URL> changedBundles;
+   private final Set<URL> removedBundles;
+
+   public LibJarListener() {
+      this.bundleSynchronizer = new Object();
+      this.newBundles = new HashSet<>();
+      this.changedBundles = new HashSet<>();
+      this.removedBundles = new HashSet<>();
+   }
+
+   @Override
+   public void handleBundleAdded(URL url) {
+      synchronized (bundleSynchronizer) {
+         if (detector.isChanged(url)) {
+            newBundles.add(url);
+            changedBundles.remove(url);
+            removedBundles.remove(url);
+            debugEcho(url);
+         }
+      }
+   }
+
+   @Override
+   public void handleBundleChanged(URL url) {
+      synchronized (bundleSynchronizer) {
+         if (detector.isChanged(url)) {
+            changedBundles.add(url);
+            newBundles.remove(url);
+            removedBundles.remove(url);
+            debugEcho(url);
+         }
+      }
+   }
+
+   @Override
+   public void handleBundleRemoved(URL url) {
+      synchronized (bundleSynchronizer) {
+         detector.remove(url);
+         removedBundles.add(url);
+         newBundles.remove(url);
+         changedBundles.remove(url);
+      }
+      debugEcho(url);
+   }
+
+   private void debugEcho(URL url) {
+      if (VERBOSE_DEBUG) {
+         try {
+            String bundleName = getBundleNameFromJar(url);
+            System.out.println("Bundle changed:" + bundleName);
+         } catch (IOException ex) {
+         }
+      }
+   }
+
+   @Override
+   public void handleNatureClosed(T nature) {
+      IProject project = nature.getProject();
+      System.out.println("Project closed: " + project.getName());
+      for (URL url : nature.getBundles()) {
+         handleBundleRemoved(url);
+      }
+
+      nature.setClosing(true);
+      updateContainers();
+      nature.setClosing(false);
+   }
+
+   private void updateContainers() {
+      OteClasspathContainer.refreshAll();
+   }
+
+   @Override
+   public void handlePostChange() {
+      updateContainers();
+      System.out.println("Bunch of changes just finished");
+   }
+
+   private <S extends Object> Set<S> duplicateAndClear(Set<S> set) {
+      synchronized (bundleSynchronizer) {
+         Set<S> returnBundles = new HashSet<>(set);
+         set.clear();
+         return returnBundles;
+      }
+   }
+
+   /**
+    * @return the newBundles
+    */
+   public Set<URL> consumeNewBundles() {
+      return duplicateAndClear(newBundles);
+   }
+
+   /**
+    * @return the changedBundles
+    */
+   public Set<URL> consumeChangedBundles() {
+      return duplicateAndClear(changedBundles);
+   }
+
+   /**
+    * @return the removedBundles
+    */
+   public Set<URL> consumeRemovedBundles() {
+      return duplicateAndClear(removedBundles);
+   }
+
+   private String getBundleNameFromJar(URL url) throws IOException {
+      File file;
+      try {
+         file = new File(url.toURI());
+      } catch (URISyntaxException ex) {
+         file = new File(url.getPath());
+      }
+
+      JarFile jarFile = new JarFile(file);
+      Manifest jarManifest = jarFile.getManifest();
+      return BundleInfo.generateBundleName(jarManifest);
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteSystemLibsNature.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteSystemLibsNature.java
new file mode 100644
index 0000000..9d945b0
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteSystemLibsNature.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.runtimemanager;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+public class OteSystemLibsNature extends JarCollectionNature {
+   public static final String NATURE_ID = "org.eclipse.osee.ote.runtimeManager.OteSystemLibsNature";
+   private static final String BUNDLE_PATH_ATTRIBUTE = "OteBundlePath";
+
+   public OteSystemLibsNature() {
+      super(BUNDLE_PATH_ATTRIBUTE);
+   }
+
+   public static Collection<OteSystemLibsNature> getWorkspaceProjects() throws CoreException {
+      return getWorkspaceProjects(NATURE_ID, OteSystemLibsNature.class);
+   }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteUserLibsNature.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteUserLibsNature.java
new file mode 100644
index 0000000..f4334c4
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteUserLibsNature.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.runtimemanager;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+public class OteUserLibsNature extends JarCollectionNature {
+   public static final String NATURE_ID = "org.eclipse.osee.ote.runtimeManager.OteUserLibsNature";
+   private static final String BUNDLE_PATH_ATTRIBUTE = "OteBundlePath";
+
+   public OteUserLibsNature() {
+      super(BUNDLE_PATH_ATTRIBUTE);
+   }
+
+   public static Collection<OteUserLibsNature> getWorkspaceProjects() throws CoreException {
+      return getWorkspaceProjects(NATURE_ID, OteUserLibsNature.class);
+   }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/PrecompiledListener.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/PrecompiledListener.java
new file mode 100644
index 0000000..cb27a59
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/PrecompiledListener.java
@@ -0,0 +1,151 @@
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Scanner;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.workspacebundleloader.IJarChangeListener;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.Version;
+
+public class PrecompiledListener implements IJarChangeListener<OteSystemLibsNature> {
+	
+	private static final Matcher VERSION_MATTCHER = Pattern.compile("(\\d+.\\d+.\\d+)").matcher("");
+	private boolean firstTime = true;
+	private boolean isPrecompiledInstalled = false;
+	
+	@Override
+	public void handleBundleAdded(URL url) {
+		// do nothing -- gets called for each jar in the precompiled project
+	}
+
+	@Override
+	public void handleBundleChanged(URL url) {
+		// do nothing -- gets called for each jar in the precompiled project
+	}
+
+	@Override
+	public void handleBundleRemoved(URL url) {
+		// do nothing?
+	}
+
+	@Override
+	public void handlePostChange() {
+		runCheckInThread();
+	}
+
+	@Override
+	public void handleNatureClosed(OteSystemLibsNature nature) {
+		// do nothing?
+	}
+	
+	public void runCheckInThread() {
+		Jobs.runInJob(new AbstractOperation("Precompiled Version Check", RuntimeManager.BUNDLE_ID) {
+
+			@Override
+			protected void doWork(IProgressMonitor monitor) throws Exception {
+				runCheck();
+			}}, false);
+	}
+
+	private synchronized void runCheck() {
+		if(firstTime) {
+			firstTime = false;
+			URL installLocation = Platform.getInstallLocation().getURL();
+			File pluginsDir = new File(installLocation.getFile() + File.separator + "plugins");
+			for(File plugin : Lib.recursivelyListFiles(pluginsDir)) {
+				if(plugin.getName().startsWith("ote.cdb.messages")) {
+					isPrecompiledInstalled = true;
+					break;
+				}
+			}
+		}
+		
+		String precompileVersion = null;
+		try {
+			for (OteSystemLibsNature nature : OteSystemLibsNature.getWorkspaceProjects()) {
+				IProject project = nature.getProject();
+				if (precompileVersion == null && project.getName().contains("precompiled")) {
+					IFile buildLabel = project.getFile("build_label.txt");
+					Scanner s = new Scanner(buildLabel.getContents());
+					try {
+						while (s.hasNextLine()) {
+							String line = s.nextLine().toLowerCase();
+							if (line.contains("osee build")) {
+								String[] tokens = line.split(":");
+								if (tokens.length == 2) {
+									precompileVersion = tokens[1].trim();
+									break;
+								}
+							}
+						}
+					} catch (Exception ex) {
+						OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+					} finally {
+						Lib.close(s);
+					}
+				}
+				
+				if(precompileVersion != null) {
+					break;
+				}
+
+			}
+		} catch (CoreException ex) {
+			OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+		}
+
+		if (precompileVersion != null) {
+			final String message;
+			if(isPrecompiledInstalled) {
+				message = "Conflict: Precompiled detected in workspace of non precompiled required client!\nPlease remove it from the workspace and restart.";
+			} else {
+				Version client = RuntimeManager.getDefault().getContext().getBundle().getVersion();
+				String clientStr = "", precompileStr = "";
+				Matcher matcher = VERSION_MATTCHER.reset(client.toString());
+				if(matcher.find()) {
+					clientStr = matcher.group(1);
+				}
+				matcher = VERSION_MATTCHER.reset(precompileVersion.toString());
+				if(matcher.find()) {
+					precompileStr = matcher.group(1);
+				}
+				
+				if(!clientStr.equals(precompileStr)) {
+					message = String.format(
+						"OTE IDE / Precompiled Libraries version mismatch!\nOTE[%s] != Precompiled[%s]\nPlease get the version that matches [%s].",
+						clientStr, precompileStr, clientStr);
+				} else {
+					message = null;
+				}
+				
+			}
+			
+			if (message != null) {
+				Displays.ensureInDisplayThread(new Runnable() {
+
+					@Override
+					public void run() {
+						MessageDialog.openError(PlatformUI.getWorkbench().getModalDialogShellProvider().getShell(), "Precompiled Version",
+								message);
+					}
+				}, true);
+			}
+		}
+	}
+	
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.java
new file mode 100644
index 0000000..4a37a72
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.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.ote.runtimemanager;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RuntimeManager implements BundleActivator {
+   public static final String BUNDLE_ID = "org.eclipse.osee.ote.runtimeManager";
+   private static RuntimeManager instance;
+   private BundleContext context;
+
+   public static RuntimeManager getDefault() {
+      return instance;
+   }
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      instance = this;
+      this.context = context;
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      instance = null;
+      this.context = null;
+   }
+
+   public BundleContext getContext() {
+      return context;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java
new file mode 100644
index 0000000..b527ed3
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java
@@ -0,0 +1,267 @@
+/*******************************************************************************
+ * 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.runtimemanager;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+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.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarChangeResourceListener;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.OteBundleLocator;
+import org.eclipse.osee.ote.runtimemanager.container.OteClasspathContainer;
+import org.eclipse.osee.ote.runtimemanager.internal.ProjectChangeResourceListener;
+import org.eclipse.osee.ote.runtimemanager.internal.RuntimeBundleServer;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ */
+public class SafeWorkspaceTracker extends ServiceTracker implements OteBundleLocator {
+
+   private JarChangeResourceListener<OteSystemLibsNature> systemLibResourceListener;
+   private JarChangeResourceListener<OteSystemLibsNature> precompiledResourceListener;
+   private JarChangeResourceListener<OteUserLibsNature> userLibResourceListener;
+   private LibJarListener<OteSystemLibsNature> systemLibListener;
+   private PrecompiledListener precompiledListener;
+   private LibJarListener<OteUserLibsNature> userLibListener;
+   private ProjectChangeResourceListener projectChangeResourceListener;
+   private RuntimeBundleServer bundleServer;
+   private SafeWorkspaceAccess service;
+   private final BundleContext context;
+
+   public SafeWorkspaceTracker(BundleContext context) {
+      super(context, SafeWorkspaceAccess.class.getName(), null);
+      this.context = context;
+   }
+
+   @Override
+   public Object addingService(ServiceReference reference) {
+      this.systemLibListener = new LibJarListener<>();
+      this.userLibListener = new LibJarListener<>();
+      this.precompiledListener = new PrecompiledListener();
+      this.systemLibResourceListener =
+         new JarChangeResourceListener<OteSystemLibsNature>(OteSystemLibsNature.NATURE_ID, systemLibListener);
+      this.userLibResourceListener =
+         new JarChangeResourceListener<OteUserLibsNature>(OteUserLibsNature.NATURE_ID, userLibListener);
+      this.precompiledResourceListener = new JarChangeResourceListener<>(OteSystemLibsNature.NATURE_ID, precompiledListener);
+      this.projectChangeResourceListener = new ProjectChangeResourceListener();
+      service = (SafeWorkspaceAccess) context.getService(reference);
+      slowLoadingJars();
+      precompiledListener.runCheckInThread();
+
+      return super.addingService(reference);
+   }
+
+   private void slowLoadingJars() {
+      Jobs.runInJob(new LocateWorkspaceBundles("Locating Workspace Bundles", RuntimeManager.BUNDLE_ID), false);
+
+   }
+
+   private class LocateWorkspaceBundles extends AbstractOperation {
+      public LocateWorkspaceBundles(String operationName, String pluginId) {
+         super(operationName, pluginId);
+      }
+
+      @SuppressWarnings("rawtypes")
+      @Override
+      protected void doWork(IProgressMonitor monitor) throws Exception {
+         IWorkspace workspace = service.getWorkspace();
+         try {
+            scrapeAllLibs();
+         } catch (CoreException ex) {
+            OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+         }
+         workspace.addResourceChangeListener(systemLibResourceListener);
+         workspace.addResourceChangeListener(userLibResourceListener);
+         workspace.addResourceChangeListener(precompiledResourceListener);
+
+         SafeWorkspaceTracker.this.bundleServer = new RuntimeBundleServer(SafeWorkspaceTracker.this);
+
+         context.registerService(OteBundleLocator.class.getName(), SafeWorkspaceTracker.this, new Hashtable());
+         OteClasspathContainer.refreshAll();
+      }
+   }
+
+   private void scrapeAllLibs() throws CoreException {
+      for (OteSystemLibsNature nature : OteSystemLibsNature.getWorkspaceProjects()) {
+         for (URL url : nature.getBundles()) {
+            systemLibListener.handleBundleAdded(url);
+         }
+
+         projectChangeResourceListener.addProject(nature.getProject());
+      }
+      for (OteUserLibsNature nature : OteUserLibsNature.getWorkspaceProjects()) {
+         for (URL url : nature.getBundles()) {
+            userLibListener.handleBundleAdded(url);
+         }
+
+         projectChangeResourceListener.addProject(nature.getProject());
+      }
+   }
+
+   @Override
+   public synchronized void close() {
+      IWorkspace workspace = service.getWorkspace();
+      if (workspace != null) {
+         workspace.removeResourceChangeListener(systemLibResourceListener);
+         workspace.removeResourceChangeListener(userLibResourceListener);
+         workspace.removeResourceChangeListener(precompiledResourceListener);
+      }
+      super.close();
+   }
+
+   /**
+    * Returns a list of URL's to workspace jars to be used for the test server. The collection returned is a combination
+    * of all the user libraries and any system libraries that weren't already supplied in the user libraries. The
+    * workspace is considered to have runtime libraries only if there are system libraries present. Subsequently, if no
+    * system libraries are in the workspace then this method will return an empty collection.
+    * 
+    * @return runtime library bundle infos
+    */
+   @Override
+   public Collection<BundleInfo> getRuntimeLibs() throws IOException, CoreException {
+      Collection<URL> userLibUrls = getUserLibUrls();
+      Collection<URL> systemLibUrls = getSystemLibUrls();
+      // If there are no system libs, then claim no runtime libs
+      if (!systemLibUrls.isEmpty()) {
+         return getRuntimeLibs(systemLibUrls, userLibUrls);
+      } else {
+         return Collections.emptyList();
+      }
+   }
+
+   private Collection<BundleInfo> getRuntimeLibs(Collection<URL> systemLibUrls, Collection<URL> userLibUrls) throws IOException {
+      Map<String, BundleInfo> runtimeMap = new HashMap<>();
+      Collection<BundleInfo> runtimeInfos = new LinkedList<>();
+
+      // First add all of the system libraries to the map
+      for (URL url : systemLibUrls) {
+         String symbolicName = getBundleNameFromJar(url);
+
+         runtimeMap.put(symbolicName, new BundleInfo(url, bundleServer.getClassServerPath(), true));
+      }
+
+      // Now add the user libraries so any system library with the same name
+      // gets replaced
+      for (URL url : userLibUrls) {
+         String symbolicName = getBundleNameFromJar(url);
+
+         runtimeMap.put(symbolicName, new BundleInfo(url, bundleServer.getClassServerPath(), false));
+      }
+
+      runtimeInfos.addAll(runtimeMap.values());
+
+      return runtimeInfos;
+   }
+
+   /**
+    * Returns a list of URL's to all system libraries in the workspace regardless of ones that are supplied in user
+    * libraries.
+    * 
+    * @return system library URL's
+    */
+   public Collection<URL> getSystemLibUrls() throws CoreException {
+      Collection<URL> libs = new LinkedList<>();
+      for (OteSystemLibsNature systemNature : OteSystemLibsNature.getWorkspaceProjects()) {
+         libs.addAll(systemNature.getBundles());
+      }
+
+      return libs;
+   }
+
+   /**
+    * Returns a list of URL's to all user libraries in the workspace.
+    * 
+    * @return user library URL's
+    */
+   public Collection<URL> getUserLibUrls() throws CoreException {
+      Collection<URL> libs = new LinkedList<>();
+      for (OteUserLibsNature userNature : OteUserLibsNature.getWorkspaceProjects()) {
+         libs.addAll(userNature.getBundles());
+      }
+
+      return libs;
+   }
+
+   private String getBundleNameFromJar(URL url) throws IOException {
+      File file;
+      try {
+         file = new File(url.toURI());
+      } catch (URISyntaxException ex) {
+         file = new File(url.getPath());
+      }
+
+      JarFile jarFile = new JarFile(file);
+      Manifest jarManifest = jarFile.getManifest();
+      return BundleInfo.generateBundleName(jarManifest);
+   }
+
+   /**
+    * Returns a list of all bundles that have been modified since the last time this was called.
+    */
+   @Override
+   public Collection<BundleInfo> consumeModifiedLibs() throws IOException {
+      //		Collection<BundleInfo> modifiedLibs = new LinkedList<>();
+
+      Set<URL> sysNewBundles = systemLibListener.consumeNewBundles();
+      Set<URL> sysChangedBundles = systemLibListener.consumeChangedBundles();
+      //		Set<URL> sysRemovedBundles =
+      systemLibListener.consumeRemovedBundles();
+
+      Set<URL> userNewBundles = userLibListener.consumeNewBundles();
+      Set<URL> userChangedBundles = userLibListener.consumeChangedBundles();
+      //		Set<URL> userRemovedBundles =
+      userLibListener.consumeRemovedBundles();
+
+      Collection<URL> sysNewModLibs = new ArrayList<>(sysNewBundles.size() + sysChangedBundles.size());
+      sysNewModLibs.addAll(sysNewBundles);
+      sysNewModLibs.addAll(sysChangedBundles);
+
+      Collection<URL> userNewModLibs = new ArrayList<>(userNewBundles.size() + userChangedBundles.size());
+      userNewModLibs.addAll(userNewBundles);
+      userNewModLibs.addAll(userChangedBundles);
+
+      // TODO what about removed libs?
+      return getRuntimeLibs(sysNewModLibs, userNewModLibs);
+
+      // // For now, return all user libs
+      // for (BundleInfo info : getRuntimeLibs()) {
+      // if (!info.isSystemLibrary()) {
+      // modifiedLibs.add(info);
+      // }
+      // }
+      //
+      // return modifiedLibs;
+   }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.java
new file mode 100644
index 0000000..c176b4c
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.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.runtimemanager;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+
+/**
+ * Finds resources that
+ * 
+ * @author Robert A. Fisher
+ */
+public class UserLibResourceFinder extends ResourceFinder {
+
+   public UserLibResourceFinder() {
+   }
+
+   @Override
+   public byte[] find(String path) throws IOException {
+      try {
+         for (OteUserLibsNature userLibsNature : OteUserLibsNature.getWorkspaceProjects()) {
+            IProject project = userLibsNature.getProject();
+
+            IProjectDescription description;
+            try {
+               description = project.getDescription();
+               if (description.hasNature("org.eclipse.jdt.core.javanature")) {
+
+                  IJavaProject javaProject = JavaCore.create(project);
+
+                  // Projects don't have to be stored in the workspace, so make sure to use the project.getLocation as the starting point
+                  IPath candidate =
+                     project.getLocation().removeLastSegments(1).append(javaProject.getOutputLocation().makeAbsolute()).append(
+                        path);
+                  if (candidate.toFile().exists()) {
+                     File file = candidate.toFile();
+
+                     try {
+                        return getBytes(new FileInputStream(file), file.length());
+                     } catch (FileNotFoundException e) {
+                     }
+                  }
+               }
+            } catch (CoreException ex) {
+               ex.printStackTrace();
+            }
+         }
+      } catch (CoreException ex) {
+      }
+      return null;
+   }
+
+   @Override
+   public void dispose() {
+   }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainer.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainer.java
new file mode 100644
index 0000000..08f4a56
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainer.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * 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.runtimemanager.container;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.OteBundleLocator;
+import org.eclipse.osee.ote.runtimemanager.RuntimeManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteClasspathContainer implements IClasspathContainer {
+   public final static Path ID = new Path("OTE Library");
+   private ServiceTracker tracker;
+   private OteBundleLocator locator;
+   private final IJavaProject javaProject;
+   private final IPath containerPath;
+
+   private static final List<OteClasspathContainer> activeContainers = new ArrayList<>();
+
+   private static boolean classpathEnabled;
+   static {
+      classpathEnabled = System.getProperty("ote.container.activate") != null;
+   }
+
+   public OteClasspathContainer(IPath path, IJavaProject javaProject) {
+      this.javaProject = javaProject;
+      this.containerPath = path;
+
+      try {
+         BundleContext context = RuntimeManager.getDefault().getContext();
+         tracker = new ServiceTracker(context, OteBundleLocator.class.getName(), null);
+         tracker.open(true);
+         initializeBundleLocator();
+
+      } catch (Exception ex) {
+         ex.printStackTrace();
+      }
+
+      activeContainers.add(this);
+   }
+
+   private void initializeBundleLocator() throws InterruptedException {
+      Object obj = tracker.waitForService(1);
+      locator = (OteBundleLocator) obj;
+   }
+
+   public OteClasspathContainer(OteClasspathContainer oteClasspathContainer) {
+      this(oteClasspathContainer.containerPath, oteClasspathContainer.javaProject);
+   }
+
+   private File recursivelyFindProjectFile(File file) {
+
+      if (file == null) {
+         return file;
+      }
+
+      if (fileIsDirectoryWithBin(file)) {
+         return file;
+      } else {
+         return recursivelyFindProjectFile(file.getParentFile());
+      }
+   }
+
+   private boolean fileIsDirectoryWithBin(File file) {
+      if (file.isDirectory()) {
+         File binChildFile = new File(file.getAbsoluteFile() + "/bin");
+         if (binChildFile.exists()) {
+            return true;
+         }
+      }
+      return false;
+   }
+
+   @Override
+   public IClasspathEntry[] getClasspathEntries() {
+      List<IClasspathEntry> entries = new ArrayList<>();
+      Collection<BundleInfo> runtimeLibUrls;
+      if (classpathEnabled) {
+         try {
+            lazyLoadLocator();
+            if (locator == null) {
+               return entries.toArray(new IClasspathEntry[0]);
+            }
+
+            runtimeLibUrls = locator.getRuntimeLibs();
+            for (BundleInfo info : runtimeLibUrls) {
+               String binaryFilePath = info.getFile().getCanonicalPath();
+
+               if (info.isSystemLibrary()) {
+                  entries.add(JavaCore.newLibraryEntry(new Path(binaryFilePath), new Path(binaryFilePath),
+                     new Path("/")));
+               } else {
+                  File projectFilePath = recursivelyFindProjectFile(new File(binaryFilePath));
+                  if (!projectMatchesClasspathFile(projectFilePath)) {
+                     binaryFilePath = "/" + projectFilePath.getName();
+
+                     entries.add(JavaCore.newProjectEntry(new Path(binaryFilePath)));
+                  }
+               }
+            }
+
+         } catch (Exception ex) {
+            ex.printStackTrace();
+         }
+      }
+      IClasspathEntry[] retVal = new IClasspathEntry[entries.size()];
+      return entries.toArray(retVal);
+   }
+
+   private void lazyLoadLocator() throws InterruptedException {
+      if (locator == null) {
+         initializeBundleLocator();
+      }
+   }
+
+   private boolean projectMatchesClasspathFile(File projectFilePath) {
+      String projectBeingResolvedName = javaProject.getPath().toString();
+      String classpathFilePath = projectFilePath.getName();
+      if (projectBeingResolvedName.contains(classpathFilePath)) {
+         return true;
+      }
+
+      return false;
+   }
+
+   @Override
+   public String getDescription() {
+      return ID.segment(0);
+   }
+
+   @Override
+   public int getKind() {
+      return IClasspathContainer.K_APPLICATION;
+   }
+
+   @Override
+   public IPath getPath() {
+      return ID;
+   }
+
+   public static void refreshAll() {
+      if (classpathEnabled) {
+         for (OteClasspathContainer container : activeContainers.toArray(new OteClasspathContainer[0])) {
+            container.refresh();
+         }
+      }
+   }
+
+   public void refresh() {
+      if (classpathEnabled) {
+         try {
+            activeContainers.remove(this);
+            if (javaProject.isOpen()) {
+               JavaCore.setClasspathContainer(containerPath, new IJavaProject[] {javaProject},
+                  new IClasspathContainer[] {new OteClasspathContainer(this)}, null);
+            }
+            // new Thread(new Runnable() {
+            //
+            // @Override
+            // public void run() {
+            // try {
+            // Thread.sleep(10000);
+            // }
+            // catch (InterruptedException ex) {
+            // ex.printStackTrace();
+            // }
+            // catch (Exception ex) {
+            // ex.printStackTrace();
+            // }
+            // }
+            //
+            // }).start();
+         } catch (Exception ex) {
+         }
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainerInitializer.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainerInitializer.java
new file mode 100644
index 0000000..88c4fc5
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainerInitializer.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * 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.runtimemanager.container;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+public class OteClasspathContainerInitializer extends ClasspathContainerInitializer {
+
+   public OteClasspathContainerInitializer() {
+   }
+
+   @Override
+   public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
+
+      OteClasspathContainer oteClasspathContainer = new OteClasspathContainer(containerPath, project);
+      JavaCore.setClasspathContainer(containerPath, new IJavaProject[] {project},
+         new IClasspathContainer[] {oteClasspathContainer}, null);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteContainerPage.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteContainerPage.java
new file mode 100644
index 0000000..b8313c4
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteContainerPage.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * 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.runtimemanager.container;
+
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+public class OteContainerPage extends WizardPage implements IClasspathContainerPage {
+
+   public OteContainerPage() {
+      super("OTE Library");
+   }
+
+   @Override
+   public boolean finish() {
+      return true;
+   }
+
+   @Override
+   public IClasspathEntry getSelection() {
+      return JavaCore.newContainerEntry(OteClasspathContainer.ID);
+   }
+
+   @Override
+   public void setSelection(IClasspathEntry containerEntry) {
+   }
+
+   @Override
+   public void createControl(Composite parent) {
+      Composite comp = new Composite(parent, SWT.None);
+      GridLayout layout = new GridLayout(1, true);
+      comp.setLayout(layout);
+
+      GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+      comp.setLayoutData(data);
+
+      Label label = new Label(comp, SWT.NONE);
+      label.setText("Please click finish.");
+
+      data = new GridData(SWT.FILL, SWT.FILL, true, true);
+      label.setLayoutData(data);
+      setControl(comp);
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java
new file mode 100644
index 0000000..0a811dd
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.runtimemanager.internal;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ProjectChangeResourceListener implements IResourceChangeListener {
+
+   @Override
+   public void resourceChanged(IResourceChangeEvent event) {
+   }
+
+   public void addProject(IProject project) {
+   }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java
new file mode 100644
index 0000000..2cdd500
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.runtimemanager.internal;
+
+import java.net.BindException;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.CorePreferences;
+import org.eclipse.osee.ote.classserver.ClassServer;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.runtimemanager.RuntimeManager;
+import org.eclipse.osee.ote.runtimemanager.SafeWorkspaceTracker;
+
+public class RuntimeBundleServer {
+   private ClassServer classServer;
+   private String classServerPath;
+   private ResourceFinder resourceFinder;
+
+   /**
+    * Creates a new ClassServer which will serve all projects currently in the workspace
+    */
+   public RuntimeBundleServer(SafeWorkspaceTracker safeWorkspaceTracker) {
+      try {
+         InetAddress useHostAddress = CorePreferences.getDefaultInetAddress();
+         classServer = new ClassServer(0, useHostAddress) {
+            @Override
+            protected void fileDownloaded(String fp, InetAddress addr) {
+               System.out.println("RuntimeBundleServer: File " + fp + " downloaded to " + addr);
+            }
+         };
+         resourceFinder = new RuntimeLibResourceFinder(safeWorkspaceTracker);
+         classServer.addResourceFinder(resourceFinder);
+         classServer.start();
+         if(useHostAddress instanceof Inet6Address){
+        	 classServerPath = "http://[" + useHostAddress.getHostAddress() + "]:" + classServer.getPort() + "/";
+         } else {
+        	 classServerPath = "http://" + useHostAddress.getHostAddress() + ":" + classServer.getPort() + "/";
+         }
+
+      } catch (BindException ex) {
+         OseeLog.log(
+            RuntimeManager.class,
+            Level.SEVERE,
+            "Class Server not started.  Likely the IP address used is not local.  Set your IP address in the advanced page.",
+            ex);
+      } catch (Exception ex) {
+         OseeLog.log(RuntimeManager.class, Level.SEVERE, "Class Server not started.", ex);
+      }
+   }
+
+   /**
+    * @return the path to the class server, to be passed to the environment upon connection
+    */
+   public String getClassServerPath() {
+      return classServerPath;
+   }
+
+   /**
+    * Stops the class server. This should be called upon stop of the RuntimeManager
+    */
+   public void stopServer() {
+      classServer.terminate();
+   }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java
new file mode 100644
index 0000000..79c858f
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * 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.runtimemanager.internal;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.runtimemanager.SafeWorkspaceTracker;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RuntimeLibResourceFinder extends ResourceFinder {
+   private final SafeWorkspaceTracker safeWorkspaceTracker;
+
+   public RuntimeLibResourceFinder(SafeWorkspaceTracker safeWorkspaceTracker) {
+      super();
+      this.safeWorkspaceTracker = safeWorkspaceTracker;
+   }
+
+   @Override
+   public byte[] find(String path) throws IOException {
+      try {
+         Collection<BundleInfo> runtimeLibs = safeWorkspaceTracker.getRuntimeLibs();
+         for (BundleInfo info : runtimeLibs) {
+            if (info.getSymbolicName().equals(path)) {
+               return Lib.inputStreamToBytes(new FileInputStream(info.getFile()));
+            }
+         }
+      } catch (CoreException ex) {
+         // TODO
+         ex.printStackTrace();
+      }
+      return null;
+   }
+
+   @Override
+   public void dispose() {
+   }
+}
diff --git a/org.eclipse.osee.ote.server.external.feature/.project b/org.eclipse.osee.ote.server.external.feature/.project
new file mode 100644
index 0000000..412839a
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.server.external.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.ote.server.external.feature/build.properties b/org.eclipse.osee.ote.server.external.feature/build.properties
new file mode 100644
index 0000000..64f93a9
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.osee.ote.server.external.feature/feature.xml b/org.eclipse.osee.ote.server.external.feature/feature.xml
new file mode 100644
index 0000000..ca979db
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/feature.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.osee.ote.server.external.feature"
+      label="OTE Server External Feature"
+      version="0.25.3.qualifier"
+      provider-name="Eclipse Open System Engineering Environment">
+
+   <description url="http://www.example.com/description">
+      [Enter Feature Description here.]
+   </description>
+
+   <copyright url="http://www.example.com/copyright">
+      [Enter Copyright Description here.]
+   </copyright>
+
+   <license url="http://www.example.com/license">
+      [Enter License Description here.]
+   </license>
+
+   <plugin
+         id="org.eclipse.core.runtime"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.contenttype"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.jobs"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.apache.commons.dbcp"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.apache.commons.pool"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.google.guava"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.google.inject"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="javax.inject"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.ote.server.external.feature/pom.xml b/org.eclipse.osee.ote.server.external.feature/pom.xml
new file mode 100644
index 0000000..7a0b45c
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/pom.xml
@@ -0,0 +1,36 @@
+<project
+	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.server.external.feature</artifactId>
+	<packaging>eclipse-feature</packaging>
+	<name>OSEE OTE Server External Feature - (Incubation)</name>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho.extras</groupId>
+				<artifactId>tycho-source-feature-plugin</artifactId>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<id>source-feature</id>
+						<goals>
+							<goal>source-feature</goal>
+						</goals>
+						<configuration>
+							<excludes>
+								<plugin id="com.google.guava" />
+							</excludes>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.server.external.feature/sourceTemplateFeature/.gitkeep b/org.eclipse.osee.ote.server.external.feature/sourceTemplateFeature/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/sourceTemplateFeature/.gitkeep
diff --git a/org.eclipse.osee.ote.server/.classpath b/org.eclipse.osee.ote.server/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.server/.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.server/.pmd b/org.eclipse.osee.ote.server/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.server/.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.server/.project b/org.eclipse.osee.ote.server/.project
new file mode 100644
index 0000000..e2da42a
--- /dev/null
+++ b/org.eclipse.osee.ote.server/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.server</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.server/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.server/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c979b6f
--- /dev/null
+++ b/org.eclipse.osee.ote.server/META-INF/MANIFEST.MF
@@ -0,0 +1,46 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Server Launching Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.server;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Description: OTE Server
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Import-Package: org.apache.felix.service.command;status=provisional;version="0.8.0",
+ org.eclipse.core.runtime,
+ org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.jdk.core.reportdata,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.streams,
+ org.eclipse.osee.framework.jdk.core.util.network,
+ org.eclipse.osee.framework.logging,
+ 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.cmd,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.console,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.core.environment.status,
+ org.eclipse.osee.ote.core.framework.command,
+ org.eclipse.osee.ote.core.model,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.io,
+ org.eclipse.osee.ote.master.rest.client,
+ org.eclipse.osee.ote.master.rest.model,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.instrumentation,
+ org.eclipse.osee.ote.message.interfaces,
+ org.eclipse.osee.ote.properties,
+ org.osgi.framework,
+ org.osgi.service.packageadmin,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.ote.server
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Service-Component: OSGI-INF/*.xml
+Require-Bundle: net.jini,
+ jms.libraries
diff --git a/org.eclipse.osee.ote.server/OSGI-INF/ConsoleCmd.xml b/org.eclipse.osee.ote.server/OSGI-INF/ConsoleCmd.xml
new file mode 100644
index 0000000..73925cf
--- /dev/null
+++ b/org.eclipse.osee.ote.server/OSGI-INF/ConsoleCmd.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" immediate="true" name="org.eclipse.osee.ote.server">
+   <implementation class="org.eclipse.osee.ote.server.OteClose"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.server.OteClose"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.server/OSGI-INF/ote.server.start.xml b/org.eclipse.osee.ote.server/OSGI-INF/ote.server.start.xml
new file mode 100644
index 0000000..512ff61
--- /dev/null
+++ b/org.eclipse.osee.ote.server/OSGI-INF/ote.server.start.xml
@@ -0,0 +1,5 @@
+<?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.server.startServer">
+   <implementation class="org.eclipse.osee.ote.server.internal.OTEServerCreationComponent"/>
+   <reference bind="bindOteServiceStarter" cardinality="1..1" interface="org.eclipse.osee.ote.server.OteServiceStarter" name="OteServiceStarter" policy="static" unbind="unbindOteServiceStarter"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.server/OSGI-INF/ote.service.starter.xml b/org.eclipse.osee.ote.server/OSGI-INF/ote.service.starter.xml
new file mode 100644
index 0000000..3f3f55a
--- /dev/null
+++ b/org.eclipse.osee.ote.server/OSGI-INF/ote.service.starter.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" name="org.eclipse.osee.ote.server.starter">
+   <implementation class="org.eclipse.osee.ote.server.internal.OteServiceStarterImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.server.OteServiceStarter"/>
+   </service>
+   <reference unbind="unbindIRuntimeLibraryManager" bind="bindIRuntimeLibraryManager" cardinality="1..1" interface="org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager" name="IRuntimeLibraryManager" policy="static"/>
+   <reference unbind="unbindIConnectionService" bind="bindIConnectionService" cardinality="1..1" interface="org.eclipse.osee.connection.service.IConnectionService" name="IConnectionService" policy="static"/>
+   <reference bind="bindOTESessionManager" cardinality="1..1" interface="org.eclipse.osee.ote.core.OTESessionManager" name="OTESessionManager" policy="static" unbind="unbindOTESessionManager"/>
+   <reference bind="bindOTEMasterServer" cardinality="1..1" interface="org.eclipse.osee.ote.master.rest.client.OTEMasterServer" name="OTEMasterServer" policy="static" unbind="unbindOTEMasterServer"/>
+   <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.server/build.properties b/org.eclipse.osee.ote.server/build.properties
new file mode 100644
index 0000000..6210e84
--- /dev/null
+++ b/org.eclipse.osee.ote.server/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.server/pom.xml b/org.eclipse.osee.ote.server/pom.xml
new file mode 100644
index 0000000..3c0fa81
--- /dev/null
+++ b/org.eclipse.osee.ote.server/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.server</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Server (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.server/src/org/eclipse/osee/ote/server/OteClose.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteClose.java
new file mode 100644
index 0000000..346365f
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteClose.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.server;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.Descriptor;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+
+public class OteClose {
+
+	public void start(){
+		BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+		Dictionary<String, Object> dict = new Hashtable<>();
+		dict.put(CommandProcessor.COMMAND_SCOPE, "ote");
+		dict.put(CommandProcessor.COMMAND_FUNCTION, new String[]{"x"});
+		context.registerService(OteClose.class, this, dict);
+	}
+	
+	
+	@Descriptor ("Shutdown the OTE Server")
+	public void x() throws Exception {
+	   OteServiceStarter service = ServiceUtility.getService(OteServiceStarter.class);
+	   if(service != null){
+	      service.stop();
+	   }
+		BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+		Bundle systemBundle = context.getBundle(0);
+		systemBundle.stop();
+		boolean canExit = false;
+		while(!canExit){
+			try{
+				Thread.sleep(20);
+			} catch (Throwable th){
+			}
+			canExit = true;
+			try{
+				for(Bundle b:context.getBundles()){
+					if(b.getState() != Bundle.ACTIVE){
+						canExit = false;
+					}
+				}
+			} catch (Throwable th){
+				canExit = true;
+			}
+		}
+		System.exit(0);
+	}
+	
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteServiceStarter.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteServiceStarter.java
new file mode 100644
index 0000000..a398f9c
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteServiceStarter.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.server;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+
+public interface OteServiceStarter {
+
+   public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, String environmentFactoryClass) throws Exception;
+
+   public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, TestEnvironmentFactory factory) throws Exception;
+
+   public void stop() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/PropertyParamter.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/PropertyParamter.java
new file mode 100644
index 0000000..54ec8c2
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/PropertyParamter.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.server;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PropertyParamter {
+   private final String type;
+   private final String version;
+   private final String comment;
+   private final String station;
+   private final boolean useJiniLookup;
+   private final boolean isLocalConnector;
+
+   public PropertyParamter(String version, String comment, String station, String type, boolean useJiniLookup, boolean isLocalConnector) {
+      this.version = version;
+      this.comment = comment;
+      this.station = station;
+      this.type = type;
+      this.useJiniLookup = useJiniLookup;
+      this.isLocalConnector = isLocalConnector;
+   }
+
+   public String getType() {
+      return type;
+   }
+
+   public String getVersion() {
+      return version;
+   }
+
+   public String getComment() {
+      return comment;
+   }
+
+   public String getStation() {
+      return station;
+   }
+
+   public boolean isLocalConnector() {
+      return isLocalConnector;
+   }
+
+   public boolean useJiniLookup() {
+      return useJiniLookup;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/RemoteShell.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/RemoteShell.java
new file mode 100644
index 0000000..4868832
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/RemoteShell.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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.server;
+
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RemoteShell extends ConsoleShell implements IRemoteCommandConsole {
+
+//   private static final long serialVersionUID = -4931966494670170915L;
+   private final StringBuffer buffer = new StringBuffer(32000);
+
+   @Override
+   public synchronized String doCommand(String line) throws RemoteException {
+      buffer.setLength(0);
+      buffer.append('>').append(line).append('\n');
+      try {
+         parseAndExecuteCmd(line);
+      } catch (Throwable t) {
+         printStackTrace(t);
+      }
+      return buffer.toString();
+   }
+
+   public RemoteShell(ICommandManager manager) {
+      super(manager);
+   }
+
+   @Override
+   public void println(String string) {
+      buffer.append(string).append('\n');
+   }
+
+   @Override
+   public void print(String string) {
+      buffer.append(string);
+   }
+
+   @Override
+   public void println() {
+      buffer.append('\n');
+   }
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentFactory.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentFactory.java
new file mode 100644
index 0000000..3dd4c29
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentFactory.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * 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.server;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+public interface TestEnvironmentFactory {
+   MessageSystemTestEnvironment createEnvironment(IRuntimeLibraryManager runtimeLibraryManager) throws Throwable;
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentServiceConfigImpl.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentServiceConfigImpl.java
new file mode 100644
index 0000000..8c13017
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentServiceConfigImpl.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.ote.server;
+
+import java.lang.reflect.Constructor;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestEnvironmentServiceConfigImpl implements ITestEnvironmentServiceConfig {
+
+   private final boolean keepAliveWithNoUsers;
+   private final String title;
+   private final String name;
+   private final String outfileLocation;
+   private final Constructor<? extends TestEnvironment> constructor;
+
+   public TestEnvironmentServiceConfigImpl(boolean keepAliveWithNoUsers, String title, String name, String outfileLocation, Constructor<? extends TestEnvironment> constructor) {
+      this.keepAliveWithNoUsers = keepAliveWithNoUsers;
+      this.title = title;
+      this.name = name;
+      this.outfileLocation = outfileLocation;
+      this.constructor = constructor;
+   }
+
+   @Override
+   public Object[] getConstructorParameters() {
+      return new Object[0];
+   }
+
+   @Override
+   public Constructor<? extends TestEnvironment> getEnvironmentConstructor() {
+      return constructor;
+   }
+
+   @Override
+   public int getMaxEnvironments() {
+      return 1;
+   }
+
+   @Override
+   public int getMaxUsersPerEnvironment() {
+      return Integer.MAX_VALUE;
+   }
+
+   @Override
+   public String getName() {
+      return name;
+   }
+
+   @Override
+   public String getOutfileLocation() {
+      return outfileLocation;
+   }
+
+   @Override
+   public String getServerTitle() {
+      return title;
+   }
+
+   @Override
+   public boolean keepEnvAliveWithNoUsers() {
+      return keepAliveWithNoUsers;
+   }
+
+   @Override
+   public boolean startEnvionrmnetOnServiceInit() {
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/EnvironmentCreationParameter.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/EnvironmentCreationParameter.java
new file mode 100644
index 0000000..6a911ca
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/EnvironmentCreationParameter.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.server.internal;
+
+import java.io.Serializable;
+import java.rmi.server.ExportException;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.server.TestEnvironmentFactory;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+class EnvironmentCreationParameter {
+//   private final NodeInfo oteEmbeddedBroker;
+   private final IServiceConnector serviceConnector;
+   private final ITestEnvironmentServiceConfig config;
+   private final IRuntimeLibraryManager runtimeLibraryManager;
+   private ITestEnvironment remoteTestEnvironment;
+   private ITestEnvironment exportedRemoteTestEnvironment;
+   private TestEnvironmentFactory factory;
+   private final String environmentFactoryClass;
+
+   public EnvironmentCreationParameter(IRuntimeLibraryManager runtimeLibraryManager,/* NodeInfo oteEmbeddedBroker,*/ IServiceConnector serviceConnector, ITestEnvironmentServiceConfig config, TestEnvironmentFactory factory, String environmentFactoryClass) {
+//      this.oteEmbeddedBroker = oteEmbeddedBroker;
+      this.serviceConnector = serviceConnector;
+      this.config = config;
+      this.runtimeLibraryManager = runtimeLibraryManager;
+      this.factory = factory;
+      this.environmentFactoryClass = environmentFactoryClass;
+
+   }
+   
+//   public NodeInfo getBroker(){
+//      return oteEmbeddedBroker;
+//   }
+
+   public Serializable getServerTitle() {
+      return config.getServerTitle();
+   }
+
+   public int getMaxUsersPerEnvironment() {
+      return config.getMaxUsersPerEnvironment();
+   }
+
+   public String getOutfileLocation() {
+      return config.getOutfileLocation();
+   }
+   
+   public boolean isSimulated() {
+      String toCheck = factory == null ? environmentFactoryClass : factory.getClass().getName();
+      return toCheck.contains("Sun");
+   }
+
+   public MessageSystemTestEnvironment createEnvironment() throws Throwable {
+      if (factory == null) {
+         ExportClassLoader exportClassLoader = ExportClassLoader.getInstance();
+         Class<? extends TestEnvironmentFactory> clazz =
+            exportClassLoader.loadClass(environmentFactoryClass).asSubclass(TestEnvironmentFactory.class);
+         factory = clazz.newInstance();
+      }
+      MessageSystemTestEnvironment testEnvironment = factory.createEnvironment(runtimeLibraryManager);
+    //  testEnvironment.setOteNodeInfo(oteEmbeddedBroker);
+      testEnvironment.init(serviceConnector);
+      return testEnvironment;
+   }
+
+   public ITestEnvironment createRemoteTestEnvironment(MessageSystemTestEnvironment currentEnvironment) throws ExportException {
+      remoteTestEnvironment =
+         new RemoteTestEnvironment(currentEnvironment, serviceConnector, config.keepEnvAliveWithNoUsers());
+      exportedRemoteTestEnvironment = (ITestEnvironment) serviceConnector.export(remoteTestEnvironment);
+      return exportedRemoteTestEnvironment;
+   }
+
+   public IServiceConnector getServiceConnector() {
+      return serviceConnector;
+   }
+
+   public boolean isKeepAliveWithNoUsers() {
+      return config.keepEnvAliveWithNoUsers();
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java
new file mode 100644
index 0000000..1a797f7
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * 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.server.internal;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.connection.jini.JiniServiceSideConnector;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.server.OteServiceStarter;
+import org.eclipse.osee.ote.server.PropertyParamter;
+import org.eclipse.osee.ote.server.TestEnvironmentServiceConfigImpl;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+
+public class OTEServerCreationComponent {
+
+   private OteServiceStarter oteServiceStart;
+   
+   public void bindOteServiceStarter(OteServiceStarter oteServiceStart){
+      this.oteServiceStart = oteServiceStart;
+   }
+   
+   public void unbindOteServiceStarter(OteServiceStarter oteServiceStart){
+      this.oteServiceStart = null;
+   }
+   
+   public void start() {
+      
+      final String oteServerFactoryClass = OtePropertiesCore.serverFactoryClass.getValue();
+      if (oteServerFactoryClass != null) {
+         try{
+            String outfileLocation = OtePropertiesCore.outfilesLocation.getValue();
+            if (outfileLocation == null) {
+               outfileLocation = OtePropertiesCore.javaIoTmpdir.getValue();
+            }
+            String title = OtePropertiesCore.serverTitle.getValue();
+            String name = OtePropertiesCore.userName.getValue();
+            String keepEnvAliveWithNoUsersStr = OtePropertiesCore.serverKeepalive.getValue();
+            boolean keepEnvAliveWithNoUsers = true;
+            if (keepEnvAliveWithNoUsersStr != null) {
+               keepEnvAliveWithNoUsers = Boolean.parseBoolean(keepEnvAliveWithNoUsersStr);
+            }
+            final TestEnvironmentServiceConfigImpl config =
+                  new TestEnvironmentServiceConfigImpl(keepEnvAliveWithNoUsers, title, name, outfileLocation, null);
+
+            String version = "unknown";
+            String comment = "";
+            Bundle bundle = FrameworkUtil.getBundle(OTEServerCreationComponent.class);
+            if(bundle != null){
+               BundleContext context = bundle.getBundleContext();
+               if(context != null){
+                  version = context.getBundle().getHeaders().get("Bundle-Version").toString();
+                  comment = context.getBundle().getHeaders().get("Bundle-Description").toString();
+               }
+            }
+            String station = "unknown";
+            try {
+               station = InetAddress.getLocalHost().getHostName();
+            } catch (UnknownHostException ex) {
+               OseeLog.log(OTEServerCreationComponent.class, Level.SEVERE, ex);
+            }
+            boolean useJiniLookup = OtePropertiesCore.useLookup.getValue() != null;
+            boolean isLocalConnector = false;
+
+            int index = oteServerFactoryClass.indexOf('.');
+            String type = oteServerFactoryClass.substring(index > 0 ? index + 1 : 0);
+            final PropertyParamter propertyParameter =
+                  new PropertyParamter(version, comment, station, type, useJiniLookup, isLocalConnector);
+
+            Thread th = new Thread(new Runnable(){
+               @Override
+               public void run(){
+                  try {
+                     oteServiceStart.start(new JiniServiceSideConnector(), config, propertyParameter, oteServerFactoryClass);
+                  } catch (Exception e) {
+                     e.printStackTrace();
+                  }
+               }
+            });
+            th.start();
+         } catch (Exception ex){
+            OseeLog.log(getClass(), Level.SEVERE, ex);
+         }
+      }
+   }
+
+   public void stop() {
+      try {
+         oteServiceStart.stop();
+      } catch (Exception ex) {
+         OseeLog.log(getClass(), Level.SEVERE, ex);
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java
new file mode 100644
index 0000000..a5c3ce3
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * 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.server.internal;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.rmi.RemoteException;
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.UUID;
+import java.util.logging.Level;
+
+import net.jini.core.lookup.ServiceID;
+import net.jini.id.Uuid;
+import net.jini.id.UuidFactory;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.HostServerProperties;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.ReturnStatus;
+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.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.server.PropertyParamter;
+
+public class OteService implements IHostTestEnvironment {
+
+   private final ServiceID serviceID;
+   private final EnhancedProperties enhancedProperties;
+   private MessageSystemTestEnvironment currentEnvironment;
+   private ITestEnvironment remoteEnvironment;
+   private final EnvironmentCreationParameter environmentCreation;
+//   private final IRuntimeLibraryManager runtimeLibraryManager;
+//   private RegisteredServiceReference registeredServiceReference;
+   private OTESessionManager oteSessions;
+   
+   
+   public OteService(EnvironmentCreationParameter environmentCreation, OTESessionManager oteSessions, PropertyParamter parameterObject, EnhancedProperties properties, OteUdpEndpoint receiver) {
+//      this.runtimeLibraryManager = runtimeLibraryManager;
+      this.environmentCreation = environmentCreation;
+      this.oteSessions = oteSessions;
+      
+      Uuid uuid = UuidFactory.generate();
+      Long lsb = Long.valueOf(uuid.getLeastSignificantBits());
+      Long msb = Long.valueOf(uuid.getMostSignificantBits());
+      serviceID = new ServiceID(msb.longValue(), lsb.longValue());
+
+      enhancedProperties = properties;
+      enhancedProperties.setProperty(HostServerProperties.name.name(), environmentCreation.getServerTitle());
+      enhancedProperties.setProperty(HostServerProperties.station.name(), parameterObject.getStation());
+      enhancedProperties.setProperty(HostServerProperties.version.name(), parameterObject.getVersion());
+      enhancedProperties.setProperty(HostServerProperties.type.name(), parameterObject.getType());
+      enhancedProperties.setProperty(HostServerProperties.maxUsers.name(), Integer.toString(environmentCreation.getMaxUsersPerEnvironment()));
+      enhancedProperties.setProperty(HostServerProperties.comment.name(), parameterObject.getComment());
+      enhancedProperties.setProperty(HostServerProperties.date.name(), new Date().toString());
+      enhancedProperties.setProperty(HostServerProperties.group.name(), "OSEE Test Environment");
+      enhancedProperties.setProperty(HostServerProperties.owner.name(), OtePropertiesCore.userName.getValue());
+      enhancedProperties.setProperty(HostServerProperties.id.name(), serviceID.toString());
+      enhancedProperties.setProperty(HostServerProperties.isSim.name(), Boolean.toString(environmentCreation.isSimulated()));
+//      enhancedProperties.setProperty(HostServerProperties.activeMq.name(), environmentCreation.getBroker().getUri().toString());
+      try {
+         String format = String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort());
+         if(OtePropertiesCore.httpPort.getValue() == null){
+            enhancedProperties.setProperty(HostServerProperties.appServerURI.name(), format);
+         } else {
+            enhancedProperties.setProperty(HostServerProperties.appServerURI.name(), format);
+         }
+         enhancedProperties.setProperty(HostServerProperties.oteUdpEndpoint.name(), format);
+      } catch (Exception e) {
+         OseeLog.log(OteService.class, Level.SEVERE, "Failed to set the appServerURI", e);
+      }
+      
+      OTEServerFolder service = ServiceUtility.getService(OTEServerFolder.class);
+      if(service != null){
+         File dir = service.getCurrentServerFolder();
+         dir.mkdirs();
+         if(dir.exists() && dir.isDirectory()){
+            try{
+               Properties serverProperties = new Properties();
+               serverProperties.putAll(enhancedProperties.asMap());
+               serverProperties.store(new FileOutputStream(new File(dir, "server.properties")), "");
+               File running = new File(dir, ".running");
+               running.createNewFile();
+               running.deleteOnExit();
+            } catch (Throwable th){
+               th.printStackTrace();
+            }
+         }
+      }
+   }
+   
+//   @Override
+//   public NodeInfo getBroker(){
+//      return environmentCreation.getBroker();
+//   }
+
+   @Override
+   public EnhancedProperties getProperties() throws RemoteException {
+      return enhancedProperties;
+   }
+
+   @Override
+   public ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID sessionId, TestEnvironmentConfig config) throws RemoteException {
+      try {
+         OseeLog.log(OteService.class, Level.INFO,
+            "received request for test environment from user " + session.getUser().getName());
+         if (!isEnvironmentAvailable()) {
+            createEnvironment();
+         }
+         
+         oteSessions.add(sessionId, session);
+         updateDynamicInfo();
+         return new ConnectionRequestResult(remoteEnvironment, sessionId, new ReturnStatus("Success", true));
+      } catch (Throwable ex) {
+         OseeLog.log(OteService.class, Level.SEVERE,
+            "Exception while requesting environment for user " + session.getUser().getName(), ex);
+         throw new RemoteException("Exception while requesting environment for user ", ex);
+      }
+   }
+
+   private void createEnvironment() throws Throwable {
+      currentEnvironment = environmentCreation.createEnvironment();
+      remoteEnvironment = environmentCreation.createRemoteTestEnvironment(currentEnvironment);
+      currentEnvironment.startup(environmentCreation.getOutfileLocation());
+   }
+
+   private boolean isEnvironmentAvailable() {
+      return remoteEnvironment != null;
+   }
+
+   public void updateDynamicInfo() throws RemoteException {
+      Collection<OSEEPerson1_4> userList = new LinkedList<>();
+      StringBuilder sb = new StringBuilder();
+      if (isEnvironmentAvailable()) {
+         for(UUID sessionId:oteSessions.get()){
+            IUserSession session = oteSessions.get(sessionId);
+            try {
+               userList.add(session.getUser());
+            } catch (Exception e) {
+               OseeLog.log(OteService.class, Level.WARNING, e);
+            }
+         }
+      }
+      for (OSEEPerson1_4 person : userList) {
+         sb.append(person.getName());
+         sb.append(", ");
+      }
+      if (sb.length() > 2) {
+         String list = sb.toString().substring(0, sb.length() - 2);
+         environmentCreation.getServiceConnector().setProperty("user_list", list);
+      } else {
+         environmentCreation.getServiceConnector().setProperty("user_list", "N/A");
+      }
+//      if (registeredServiceReference != null) {
+//         registeredServiceReference.update();
+//      }
+   }
+
+   public ServiceID getServiceID() throws RemoteException {
+      return serviceID;
+   }
+
+   public void kill() throws RemoteException {
+      if(currentEnvironment != null){
+         currentEnvironment.shutdown();
+      }
+   }
+
+//   public void set(RegisteredServiceReference ref) {
+//      this.registeredServiceReference = ref;
+//   }
+
+   @Override
+   public void disconnect(UUID sessionId) throws RemoteException {
+      if (currentEnvironment != null) {
+         oteSessions.remove(sessionId);
+         updateDynamicInfo();
+      }
+   }
+
+   @Override
+   public String getHttpURL() throws RemoteException {
+      return (String)enhancedProperties.getProperty("appServerURI");
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteServiceStarterImpl.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteServiceStarterImpl.java
new file mode 100644
index 0000000..015ee65
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteServiceStarterImpl.java
@@ -0,0 +1,424 @@
+/*******************************************************************************
+ * 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.server.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.util.Date;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.logging.Level;
+
+import org.apache.activemq.broker.BrokerService;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.type.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServer;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.server.OteServiceStarter;
+import org.eclipse.osee.ote.server.PropertyParamter;
+import org.eclipse.osee.ote.server.TestEnvironmentFactory;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteServiceStarterImpl implements OteServiceStarter {
+   
+//	private PackageAdmin packageAdmin;
+	private IRuntimeLibraryManager runtimeLibraryManager;
+	private IConnectionService connectionService;
+//	private MessageService messageService;
+
+	private BrokerService brokerService;
+	private OteService service;
+//	private final ListenForHostRequest listenForHostRequest;
+
+	private IServiceConnector serviceSideConnector;
+   private OTESessionManager oteSessions;
+   private OTEMasterServer masterServer;
+
+   private ScheduledExecutorService executor;
+   private OTEServer oteServerEntry;
+   private ScheduledFuture<?> taskToCancel;
+   private LookupRegistration lookupRegistration;
+   private URI masterURI;
+//   private NodeInfo nodeInfo;
+//   private int brokerPort = 0;
+   private OteUdpEndpoint receiver;
+//   private boolean ENABLE_BROKER;
+   
+   public OteServiceStarterImpl() {
+//      listenForHostRequest = new ListenForHostRequest();
+      executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory(){
+         
+         @Override
+         public Thread newThread(Runnable arg0) {
+            Thread th = new Thread(arg0);
+            th.setName("OTE Lookup Registration");
+            th.setDaemon(true);
+            return th;
+         }
+         
+      });
+   }
+
+   public void bindOTESessionManager(OTESessionManager oteSessions){
+      this.oteSessions = oteSessions;
+   }
+   
+   public void unbindOTESessionManager(OTESessionManager oteSessions){
+      this.oteSessions = null;
+   } 
+   
+	public void bindIRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+	   this.runtimeLibraryManager = runtimeLibraryManager;
+	}
+	
+	public void unbindIRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+      this.runtimeLibraryManager = null;
+   } 
+	
+//	public void bindMessageService(MessageService messageService){
+//	   this.messageService = messageService;
+//	}
+//
+//	public void unbindMessageService(MessageService messageService){
+//	   this.messageService = null;
+//	}
+	
+	public void bindIConnectionService(IConnectionService connectionService){
+	   this.connectionService = connectionService;
+	}
+	
+	public void unbindIConnectionService(IConnectionService connectionService){
+	   this.connectionService = null;
+	}
+	
+	public void bindOTEMasterServer(OTEMasterServer masterServer){
+	   this.masterServer = masterServer;
+	}
+	
+	public void unbindOTEMasterServer(OTEMasterServer masterServer){
+      this.masterServer = null;
+   }
+	
+//	public void bindPackageAdmin(PackageAdmin packageAdmin){
+//	   this.packageAdmin = packageAdmin;
+//	}
+//	
+//	public void unbindPackageAdmin(PackageAdmin packageAdmin){
+//      this.packageAdmin = null;
+//   }
+	
+	public void bindOteUdpEndpoint(OteUdpEndpoint receiver){
+	   this.receiver = receiver;
+	}
+	
+	public void unbindOteUdpEndpoint(OteUdpEndpoint receiver){
+	   this.receiver = receiver;
+	}
+	
+	@Override
+	public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, String environmentFactoryClass) throws Exception {
+		return start(serviceSideConnector, config, propertyParameter, null, environmentFactoryClass);
+	}
+
+	@Override
+	public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, TestEnvironmentFactory factory) throws Exception {
+		return start(serviceSideConnector, config, propertyParameter, factory, null);
+	}
+
+	private IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, TestEnvironmentFactory factory, String environmentFactoryClass) throws Exception {
+		if (service != null) {
+			throw new OseeStateException("An ote Server has already been started.");
+		}
+		this.serviceSideConnector = serviceSideConnector;
+//		ENABLE_BROKER = Boolean.parseBoolean(System.getProperty("ote.enable.broker", "true"));
+//		if(ENABLE_BROKER){
+////		   brokerService = new BrokerService();
+//
+//		   String strUri;
+//		   try {
+//		      String addressAsString = getAddress();
+//		      if(brokerPort <= 0){
+//		         brokerPort = getServerPort();
+//		      }
+//		      strUri = String.format("tcp://%s:%d", addressAsString, brokerPort);
+//		      try {
+//		         brokerService.addConnector(strUri);
+//		         OseeLog.log(getClass(), Level.INFO, "Added TCP connector: " + strUri);			
+//		      } catch (Exception e) {
+//		         OseeLog.log(getClass(), Level.SEVERE, "could not add connector for " + strUri, e);
+//		         strUri = "vm://localhost?broker.persistent=false";
+//		      }
+//		   } catch (Exception e) {
+//		      OseeLog.log(getClass(), Level.SEVERE, "could acquire a TCP address", e);
+//		      strUri = "vm://localhost?broker.persistent=false";
+//		   }
+//		   //necessary for rmi/jini classloading
+//		   Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+//
+//		   brokerService.setEnableStatistics(false);
+//		   brokerService.setBrokerName("OTEServer");
+//		   brokerService.setPersistent(false);
+//		   brokerService.setUseJmx(false);
+//		   brokerService.start();
+//		   URI uri = new URI(strUri);
+//
+////		   nodeInfo = new NodeInfo("OTEEmbeddedBroker", uri);
+//		} else {
+////		   URI uri = new URI(String.format("tcp://%s:%d", "nohost", 0));
+////		   nodeInfo = new NodeInfo("OTEEmbeddedBroker", uri);
+//		}
+		OteUdpEndpoint oteEndpoint = ServiceUtility.getService(OteUdpEndpoint.class);
+		System.out.printf("SERVER CONNECTION URI[\n\ttcp://%s:%d\n]\n", oteEndpoint.getLocalEndpoint().getAddress().getHostAddress(), oteEndpoint.getLocalEndpoint().getPort());
+
+		EnvironmentCreationParameter environmentCreationParameter =
+				new EnvironmentCreationParameter(runtimeLibraryManager, serviceSideConnector, config, factory,
+						environmentFactoryClass);
+
+		service =
+				new OteService(environmentCreationParameter, oteSessions, propertyParameter,
+						serviceSideConnector.getProperties(), receiver);
+
+		serviceSideConnector.init(service);
+
+		
+		
+		if (propertyParameter.isLocalConnector()) {
+			connectionService.addConnector(serviceSideConnector);
+		}
+		if (!propertyParameter.isLocalConnector()) {
+			String masterURIStr = OtePropertiesCore.masterURI.getValue();
+			if(masterURIStr != null){
+			   try{
+			      masterURI = new URI(masterURIStr);
+			      oteServerEntry = createOTEServer(environmentCreationParameter, propertyParameter, service.getServiceID().toString());
+			      lookupRegistration = new LookupRegistration(masterURI, masterServer, oteServerEntry, service);
+			      taskToCancel = executor.scheduleWithFixedDelay(lookupRegistration, 0, 30, TimeUnit.SECONDS);
+			   } catch(Throwable th){
+			      OseeLog.log(getClass(), Level.SEVERE, th);
+			   }
+			} else {
+				OseeLog.log(getClass(), Level.WARNING, "'ote.master.uri' was not set.  You must use direct connect from the client.");
+			}
+			
+		} else {
+//			serviceSideConnector.setProperty("OTEEmbeddedBroker", nodeInfo);
+		}
+		
+		FrameworkUtil.getBundle(getClass()).getBundleContext().registerService(IHostTestEnvironment.class, service, null);
+		System.out.printf("TEST SERVER INITIALIZATION COMPLETE\n");
+
+		return service;
+	}
+	
+	private OTEServer createOTEServer(EnvironmentCreationParameter environmentCreationParameter, PropertyParamter propertyParameter, String uuid) throws NumberFormatException, UnknownHostException{
+	   OTEServer server = new OTEServer();
+	   server.setName(environmentCreationParameter.getServerTitle().toString());
+	   server.setStation(propertyParameter.getStation());
+	   server.setVersion(propertyParameter.getVersion());
+	   server.setType(propertyParameter.getType());
+	   server.setComment(propertyParameter.getComment());
+	   server.setStartTime(new Date().toString());
+	   server.setOwner(OtePropertiesCore.userName.getValue());
+	   server.setUUID(uuid);
+	   server.setOteRestServer(String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort()));
+	   server.setOteActivemqServer(String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort()));
+	   return server;
+	}
+
+//	private int getServerPort() throws IOException {
+//		String portFromLaunch = OtePropertiesCore.brokerUriPort.getValue();
+//		int port = 0;
+//		if (portFromLaunch != null) {
+//			try {
+//				port = Integer.parseInt(portFromLaunch);
+//			} catch (NumberFormatException ex) {
+//			}
+//		}
+//		if (port == 0) {
+//			port = PortUtil.getInstance().getValidPort();
+//		}
+//		return port;
+//	}
+
+	@Override
+	public void stop() {
+//	   if(messageService != null && nodeInfo != null && service != null){
+//	      try {
+//            messageService.get(nodeInfo).send(OteBaseMessages.OteHostShutdown, service.getServiceID().toString());
+//         } catch (OseeCoreException e) {
+//            OseeLog.log(getClass(), Level.SEVERE, e);
+//         } catch (RemoteException e) {
+//            OseeLog.log(getClass(), Level.SEVERE, e);
+//         }
+//	   }
+		if (service != null) {
+			try {
+				service.updateDynamicInfo();
+				service.kill();
+				service = null;
+			} catch (Exception ex) {
+				OseeLog.log(getClass(), Level.SEVERE, ex);
+			}
+		}
+		if (brokerService != null) {
+			try {
+				brokerService.stopGracefully(".*", ".*", 10000, 500);
+				brokerService.stop();
+			} catch (Exception ex) {
+				OseeLog.log(getClass(), Level.SEVERE, ex);
+			}
+		}
+		if (serviceSideConnector != null) {
+			try {
+				connectionService.removeConnector(serviceSideConnector);
+			} catch (Exception ex) {
+				OseeLog.log(getClass(), Level.SEVERE, ex);
+			}
+		}
+		if(oteServerEntry != null) {
+		   try{
+		      lookupRegistration.stop();
+		      taskToCancel.cancel(true);
+		   } finally {
+		      Future<OTEMasterServerResult> removeServer = masterServer.removeServer(masterURI, oteServerEntry);
+		      try {
+               removeServer.get(1000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+               OseeLog.log(getClass(), Level.INFO, e);
+            } catch (ExecutionException e) {
+               OseeLog.log(getClass(), Level.INFO, e);
+            } catch (TimeoutException e) {
+               OseeLog.log(getClass(), Level.INFO, e);
+            }
+		   }
+		}
+		brokerService = null;
+	}
+
+//	private String getAddress() throws UnknownHostException {
+//		InetAddress[] all = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
+//		String defaultAddress = all[0].getHostAddress();
+//		for (InetAddress address : all ) {
+//		   if(!address.isSiteLocalAddress())
+//		   {
+//		      String firstRealLocalAddress = address.getHostAddress();
+//		      if (address instanceof Inet6Address) {
+//		         firstRealLocalAddress = "[" + firstRealLocalAddress + "]";
+//		      }
+//		      return firstRealLocalAddress;
+//		   }
+//		}
+//		return defaultAddress;
+//	}
+
+//	private class ListenForHostRequest extends OseeMessagingListener {
+//
+//		@Override
+//		public void process(Object message, Map<String, Object> headers, ReplyConnection replyConnection) {
+//			if (replyConnection.isReplyRequested()) {
+//				try {
+//					ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//					ObjectOutputStream oos = new ObjectOutputStream(baos);
+//					oos.writeObject(message);
+//					oos.writeObject(serviceSideConnector.getService());
+//					replyConnection.send(baos.toByteArray(), null, OteServiceStarterImpl.this);
+//				} catch (OseeCoreException ex) {
+//					OseeLog.log(getClass(), Level.SEVERE, ex);
+//				} catch (IOException ex) {
+//					OseeLog.log(getClass(), Level.SEVERE, ex);
+//				}
+//			}
+//		}
+//	}
+//
+//	@Override
+//	public void updateServiceInfo(List<ServiceDescriptionPair> serviceDescription) {
+//		for (Entry<String, Serializable> entry : serviceSideConnector.getProperties().entrySet()) {
+//			ServiceDescriptionPair pair = new ServiceDescriptionPair();
+//			if (entry.getKey() != null && entry.getValue() != null) {
+//				pair.setName(entry.getKey());
+//				pair.setValue(entry.getValue().toString());
+//				serviceDescription.add(pair);
+//			}
+//		}
+//	}
+//
+//	@Override
+//	public void fail(Throwable th) {
+//		OseeLog.log(getClass(), Level.SEVERE, th);
+//	}
+//
+//	@Override
+//	public void success() {
+//	}
+//	
+	private static class LookupRegistration implements Runnable {
+
+      private final OTEMasterServer masterServer;
+      private final OTEServer server;
+      private final URI uri;
+      private volatile boolean run = true;
+      private final OteService service;
+
+      public LookupRegistration(URI uri, OTEMasterServer masterServer, OTEServer server, OteService service) {
+         this.masterServer = masterServer;
+         this.server = server;
+         this.uri = uri;
+         this.service = service;
+      }
+
+      @Override
+      public void run() {
+         try{
+            if(run){
+               server.setConnectedUsers(service.getProperties().getProperty("user_list", "N.A.").toString());
+               Future<OTEMasterServerResult> result = masterServer.addServer(uri, server);
+               OTEMasterServerResult addServerResult = result.get(30, TimeUnit.SECONDS);
+               if(!(addServerResult != null && addServerResult.isSuccess())){
+                  try{
+                     Thread.sleep(1000*60*3);//wait 3 minutes before trying again
+                  } catch(Throwable th){
+                     //don't care if we're woken up
+                  }
+               }
+            }
+         } catch (Throwable th){
+            th.printStackTrace();
+         }
+      }
+      
+      public void stop(){
+         run = false;
+      }
+      
+	}
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/RemoteTestEnvironment.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/RemoteTestEnvironment.java
new file mode 100644
index 0000000..dc30a36
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/RemoteTestEnvironment.java
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * 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.server.internal;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+import org.eclipse.osee.ote.core.model.IModel;
+import org.eclipse.osee.ote.core.model.IModelListener;
+import org.eclipse.osee.ote.core.model.IModelManagerRemote;
+import org.eclipse.osee.ote.core.model.ModelKey;
+import org.eclipse.osee.ote.core.model.ModelState;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystem;
+import org.eclipse.osee.ote.server.RemoteShell;
+
+public class RemoteTestEnvironment implements ITestEnvironmentMessageSystem {
+
+   private final MessageSystemTestEnvironment env;
+   private final IServiceConnector serviceConnector;
+   private RemoteModelManager modelManager;
+   private final HashMap<IRemoteCommandConsole, RemoteShell> exportedConsoles =
+      new HashMap<IRemoteCommandConsole, RemoteShell>(32);
+
+   private final ReentrantLock lock = new ReentrantLock();
+
+   //   private IRemoteMessageService exportedRemoteMessageService;
+
+   public RemoteTestEnvironment(MessageSystemTestEnvironment currentEnvironment, IServiceConnector serviceConnector, boolean keepEnvAliveWithNoUsers) {
+      if (serviceConnector == null) {
+         throw new NullPointerException("Servce connector cannot be null");
+      }
+      this.env = currentEnvironment;
+      this.serviceConnector = serviceConnector;
+   }
+
+   @Override
+   public Remote getControlInterface(String controlInterfaceID) throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      Remote controlInterface = env.getControlInterface(controlInterfaceID);
+      if (controlInterface != null) {
+         try {
+            controlInterface = (Remote) serviceConnector.export(controlInterface);
+         } catch (Exception ex) {
+            OseeLog.log(RemoteTestEnvironment.class, Level.SEVERE,
+               "exception exporting control interface " + controlInterfaceID, ex);
+            throw new RemoteException("exception exporting control interface " + controlInterfaceID, ex);
+         }
+      }
+      return controlInterface;
+   }
+
+   @Override
+   public void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      env.addInstrumentationRegistrationListener(listener);
+   }
+
+   @Override
+   public void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      env.removeInstrumentationRegistrationListener(listener);
+   }
+
+   //   @Override
+   //   public IRemoteMessageService getMessageToolServiceProxy() throws RemoteException {
+   //      if(exportedRemoteMessageService == null){
+   //         IRemoteMessageService service = ServiceUtility.getService(IRemoteMessageService.class, 30000);
+   //         exportedRemoteMessageService = (IRemoteMessageService)this.serviceConnector.export(service);
+   //      }
+   //      return exportedRemoteMessageService;
+   //   }
+
+   @Override
+   public IRemoteCommandConsole getCommandConsole() throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      OseeLog.log(RemoteTestEnvironment.class, Level.FINE, "Remote command onsole requested");
+      ICommandManager commandManager = ServiceUtility.getService(ICommandManager.class);
+      RemoteShell shell = new RemoteShell(commandManager);
+
+      IRemoteCommandConsole exportedConsole;
+      try {
+         exportedConsole = (IRemoteCommandConsole) serviceConnector.export(shell);
+      } catch (Exception ex) {
+         throw new RemoteException("failed to export remote console", ex);
+      }
+      lock.lock();
+      try {
+         exportedConsoles.put(exportedConsole, shell);
+      } finally {
+         lock.unlock();
+      }
+      return exportedConsole;
+   }
+
+   @Override
+   public void closeCommandConsole(IRemoteCommandConsole console) throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      RemoteShell shell;
+      lock.lock();
+      try {
+         shell = exportedConsoles.remove(console);
+      } finally {
+         lock.unlock();
+      }
+      if (shell != null) {
+         try {
+            serviceConnector.unexport(shell);
+         } catch (Exception ex) {
+            throw new RemoteException("failed to unexport remote shell", ex);
+         }
+
+         OseeLog.log(RemoteTestEnvironment.class, Level.FINE, "closed command console");
+      } else {
+         OseeLog.log(RemoteTestEnvironment.class, Level.FINE, "trying to remove non existing console");
+      }
+   }
+
+   @Override
+   public IModelManagerRemote getModelManager() throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      if (modelManager == null) {
+         modelManager = new RemoteModelManager();
+      }
+      try {
+         return (IModelManagerRemote) serviceConnector.export(modelManager);
+      } catch (Throwable t) {
+         throw new RemoteException("Could not load get model manager" + t.getMessage());
+      }
+   }
+
+   @Override
+   public byte[] getScriptOutfile(String outfilePath) throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      return env.getScriptOutfile(outfilePath);
+   }
+
+   @Override
+   public int getUniqueId() throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      return env.getUniqueId();
+   }
+
+   private class RemoteModelManager implements IModelManagerRemote {
+
+      @Override
+      public void addModelActivityListener(IModelListener listener) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         env.getModelManager().addModelActivityListener(listener);
+      }
+
+      @Override
+      public void removeModelActivityListener(IModelListener listener) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         env.getModelManager().removeModelActivityListener(listener);
+      }
+
+      @Override
+      public void addModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         env.getModelManager().addModelActivityListener(listener, key);
+      }
+
+      @Override
+      public void removeModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         env.getModelManager().removeModelActivityListener(listener, key);
+      }
+
+      @SuppressWarnings("rawtypes")
+      @Override
+      public List<ModelKey> getRegisteredModels() throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         return env.getModelManager().getRegisteredModels();
+      }
+
+      @Override
+      @SuppressWarnings({"unchecked", "rawtypes"})
+      public Remote getRemoteModel(ModelKey<?> key) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         try {
+            Class modelClass;
+            try {
+               modelClass = env.loadClassFromMessageLoader(key.getClassName());
+            } catch (ClassNotFoundException ex) {
+               throw new RemoteException("Could not load model class: " + key.getClassName(), ex);
+            }
+            key.setModelClass(modelClass);
+            IModel model = env.getModelManager().getModel(key);
+            return (Remote) serviceConnector.export(model);
+         } catch (Throwable t) {
+            throw new RemoteException("Could not load model " + key.getClassName(), t);
+         }
+      }
+
+      @Override
+      public void releaseReference(ModelKey<?> key) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         env.getModelManager().releaseReference(key);
+      }
+
+      @Override
+      @SuppressWarnings({"unchecked", "rawtypes"})
+      public void changeModelState(ModelKey<?> key, ModelState state) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         Class modelClass;
+         try {
+            modelClass = env.loadClassFromMessageLoader(key.getClassName());
+         } catch (ClassNotFoundException ex) {
+            throw new RemoteException("Could not load model class: " + key.getClassName());
+         }
+         key.setModelClass(modelClass);
+         env.getModelManager().changeModelState(key, state);
+      }
+
+      @Override
+      public ModelState getModelState(ModelKey<?> key) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         return env.getModelManager().getModelState(key);
+      }
+
+      @SuppressWarnings("rawtypes")
+      @Override
+      public void releaseAllReferences(ModelKey key) throws RemoteException {
+         Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+         env.getModelManager().releaseAllReferences(key);
+      }
+
+   }
+
+   @Override
+   public void setBatchMode(boolean isInBatchMode) throws RemoteException {
+      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+      env.setBatchMode(isInBatchMode);
+   }
+//
+//   @Override
+//   public void sendMessage(Message message) throws RemoteException {
+//      Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+//      env.sendMessageToServer(message);
+//   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/.classpath b/org.eclipse.osee.ote.ui.builder/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/.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.ui.builder/.project b/org.eclipse.osee.ote.ui.builder/.project
new file mode 100644
index 0000000..931030f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.ui.builder</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.ui.builder/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.builder/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1ac6912
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Builder Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.builder;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.builder.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.jdt.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.util
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote.ui.builder
diff --git a/org.eclipse.osee.ote.ui.builder/build.properties b/org.eclipse.osee.ote.ui.builder/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.osee.ote.ui.builder/plugin.xml b/org.eclipse.osee.ote.ui.builder/plugin.xml
new file mode 100644
index 0000000..8cb6eba
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/plugin.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         id="OTEPackagingBuilder"
+         name="OTE Packaging Builder"
+         point="org.eclipse.core.resources.builders">
+      <builder
+            hasNature="true">
+         <run
+               class="org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder">
+         </run>
+      </builder>
+   </extension>
+   <extension
+         id="OTEPackagingNature"
+         point="org.eclipse.core.resources.natures">
+      <runtime>
+         <run
+               class="org.eclipse.osee.ote.ui.builder.OTEPackagingNature">
+         </run>
+      </runtime>
+      <builder
+            id="org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder">
+      </builder>
+   </extension>
+   <extension
+         point="org.eclipse.ui.menus">
+      <menuContribution
+            locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions">
+         <command
+               commandId="org.eclipse.osee.ote.ui.builder.addRemoveNatureCommand"
+               label="Add/Remove OTE Packaging Nature">
+         </command>
+      </menuContribution>
+   </extension>
+   
+   <extension
+         point="org.eclipse.ui.commands">
+      <command
+            defaultHandler="org.eclipse.osee.ote.ui.builder.ToggleNatureHandler"
+            id="org.eclipse.osee.ote.ui.builder.addRemoveNatureCommand"
+            name="addRemoveNatureCommand">
+      </command>
+   </extension>
+   
+     <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+            class="org.eclipse.osee.ote.ui.builder.OTEBuilderPreferencePage"
+            id="org.eclipse.osee.ote.ui.builder.OTEBuilderPreferencePage"
+            name="OTE Builder">
+      </page>
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.builder/pom.xml b/org.eclipse.osee.ote.ui.builder/pom.xml
new file mode 100644
index 0000000..6ada9ac
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/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.ui.builder</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Ui (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.ui.builder/src/org/eclipse/osee/ote/ui/builder/Activator.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/Activator.java
new file mode 100644
index 0000000..a042a8a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/Activator.java
@@ -0,0 +1,50 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.builder"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ArchiveBuilder.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ArchiveBuilder.java
new file mode 100644
index 0000000..6c7d118
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ArchiveBuilder.java
@@ -0,0 +1,93 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * This class writes class files to a jar file.  This is used as part of the OTE Builder that will package up 
+ * java test classes and then ship them to a server to be executed. 
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+class ArchiveBuilder {
+
+   private List<IPath> outputLocations;
+   private Set<IContainer> packages;
+   private File workspaceArchiveHome;
+
+   public ArchiveBuilder(File workspaceArchiveHome, List<IPath> outputLocations) {
+      this.workspaceArchiveHome = workspaceArchiveHome;
+      this.outputLocations = outputLocations;
+      this.packages = new HashSet<>();
+   }
+
+   /**
+    * Add a resources parent to be archived as a java package.
+    * 
+    * @param resource
+    */
+   public void addFile(IResource resource) {
+      packages.add(resource.getParent());
+   }
+   
+   /**
+    * Builds a jar file with the currently added packages.
+    */
+   public void archive() {
+      for(IContainer path:packages){
+         try {
+            IResource[] resources = path.members();
+            if(resources.length > 0){
+               String fileName = getFileName(path);
+               File archive = new File(workspaceArchiveHome, fileName + ".jar");
+               if(archive.exists()){
+                  archive.delete();
+               }
+               JarPackager jarPackager = new JarPackager(getPath(path));
+               jarPackager.open(archive);
+               try{
+                  for(IResource resource:resources){
+                     if(resource.getFullPath().toString().endsWith(".class")){
+                        jarPackager.add(resource);
+                     }
+                  }
+               } finally {
+                  jarPackager.close();
+               }
+            }
+         } catch (CoreException e) {
+            e.printStackTrace();
+         } catch (FileNotFoundException e) {
+            e.printStackTrace();
+         } catch (Exception e) {
+            e.printStackTrace();
+         }
+      }
+   }
+
+   private String getFileName(IContainer path) {
+      String name = path.getFullPath().toString().replace(".", "").replace('/', '.');
+      return name.substring(1);
+   }
+
+   private String getPath(IContainer path){
+      String strPath = path.getFullPath().toString();
+      for(IPath sourcePath:outputLocations){
+         String source = sourcePath.toString();
+         if(strPath.startsWith(sourcePath.toString())){
+            return strPath.substring(source.length());
+         }
+      }
+      return "";
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/JarPackager.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/JarPackager.java
new file mode 100644
index 0000000..fbf23f9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/JarPackager.java
@@ -0,0 +1,108 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+
+/**
+ * Creates a jar file from a single package folder.
+ * 
+ * @author Andrew M. Finkbeiner
+ *
+ */
+class JarPackager {
+   
+   private JarOutputStream jos;
+   private String path;
+   private File archive;
+   
+   
+   JarPackager(String path){
+      this.path = path;
+      if(!this.path.endsWith("/")){
+         this.path += "/";
+      }
+      if(this.path.startsWith("/")){
+         this.path = this.path.substring(1);
+      }
+   }
+   
+   /**
+    * Open the archive so that we can add resources to it.
+    * 
+    * @param archive
+    * @throws FileNotFoundException
+    * @throws IOException
+    */
+   public void open(File archive) throws FileNotFoundException, IOException {
+      this.archive = archive;
+      Manifest manifest = new Manifest();
+      manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+      jos = new JarOutputStream(new FileOutputStream(archive), manifest);
+      JarEntry entry = new JarEntry(path);
+      jos.putNextEntry(entry);
+      jos.closeEntry();
+   }
+
+   public void close() throws Exception {
+      jos.close();
+      InputStream in = null;
+      PrintStream ps = null;
+      try{
+         in = new FileInputStream(archive);
+         String diskMd5Digest = ChecksumUtil.createChecksumAsString(in, "MD5");
+         ps = new PrintStream(new FileOutputStream(new File(archive.getParentFile(), archive.getName() + ".md5")));
+         ps.print(diskMd5Digest);
+      } finally {
+         if(in != null){
+            in.close();
+         }
+         if(ps != null){
+            ps.close();
+         }
+      }
+   }
+
+   public void add(IResource resource) throws IOException {
+      File theFile = resource.getLocation().toFile();
+      if(theFile.exists()){
+         BufferedInputStream in = null;
+         try
+         {
+            String name = path + theFile.getName();
+
+            JarEntry entry = new JarEntry(name);
+            jos.putNextEntry(entry);
+            in = new BufferedInputStream(new FileInputStream(theFile));
+
+            byte[] buffer = new byte[1024];
+            while (true)
+            {
+               int count = in.read(buffer);
+               if (count == -1)
+                  break;
+               jos.write(buffer, 0, count);
+            }
+            jos.closeEntry();
+         }
+         finally
+         {
+            if (in != null)
+               in.close();
+         }
+      }
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEBuilderPreferencePage.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEBuilderPreferencePage.java
new file mode 100644
index 0000000..c13470a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEBuilderPreferencePage.java
@@ -0,0 +1,65 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+public class OTEBuilderPreferencePage extends PreferencePage implements
+		IWorkbenchPreferencePage {
+
+	public static final String DO_JAR_PACKAGING = "DO_JAR_PACKAGING";
+	
+	private Button oteBuilder;
+	
+	public OTEBuilderPreferencePage() {
+	}
+
+	public OTEBuilderPreferencePage(String title) {
+		super(title);
+	}
+
+	public OTEBuilderPreferencePage(String title, ImageDescriptor image) {
+		super(title, image);
+	}
+
+	@Override
+	public void init(IWorkbench workbench) {
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		noDefaultAndApplyButton();
+		oteBuilder = new Button(parent, SWT.CHECK);
+		oteBuilder.setText("Enable the OTE Jar Builder.  This will enable client disconnect and not disrupt a batch.");
+		Preferences prefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+		oteBuilder.setSelection(prefs.getBoolean(OTEBuilderPreferencePage.DO_JAR_PACKAGING, false));
+		oteBuilder.addSelectionListener(new SelectionListener() {
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+			   Preferences prefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+			   prefs.putBoolean(OTEBuilderPreferencePage.DO_JAR_PACKAGING, oteBuilder.getSelection());
+			   try {
+               prefs.flush();
+            } catch (BackingStoreException e1) {
+               e1.printStackTrace();
+            }
+			}
+		});
+		return parent;
+	}
+	
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingBuilder.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingBuilder.java
new file mode 100644
index 0000000..bc6b5ff
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingBuilder.java
@@ -0,0 +1,174 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.osgi.service.prefs.Preferences;
+
+public class OTEPackagingBuilder extends IncrementalProjectBuilder {
+
+   public static final String BUILDER_ID = "org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder";
+
+   private static final String ROOT_FOLDER_NAME = "OTE";
+   private static final String JAR_FOLDER = "workspacejars";
+   
+   public static boolean isOTEBuilderActive(){
+      if(Activator.getDefault() != null && Activator.getDefault().getPreferenceStore() != null){
+         Preferences prefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+         return prefs.getBoolean(OTEBuilderPreferencePage.DO_JAR_PACKAGING, false);
+      } else {
+         return false;
+      }
+   }
+   
+   public static File getWorkspaceArchiveFolder(){
+      File oteFolder = OseeData.getFile(ROOT_FOLDER_NAME);
+      File workspaceArchives = new File(oteFolder, JAR_FOLDER);
+      workspaceArchives.mkdirs();
+      return workspaceArchives;
+   }
+   
+   public OTEPackagingBuilder(){
+   }
+   
+	class SampleDeltaVisitor implements IResourceDeltaVisitor {
+		
+	   
+	   private ArchiveBuilder builder;
+
+      public SampleDeltaVisitor(ArchiveBuilder builder) {
+         this.builder = builder;
+      }
+
+      /*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
+		 */
+		@Override
+      public boolean visit(IResourceDelta delta) throws CoreException {
+			IResource resource = delta.getResource();
+			switch (delta.getKind()) {
+			case IResourceDelta.ADDED:
+				// handle added resource
+				checkResource(resource, builder);
+				break;
+			case IResourceDelta.REMOVED:
+				// handle removed resource
+				break;
+			case IResourceDelta.CHANGED:
+				// handle changed resource
+				checkResource(resource, builder);
+				break;
+			}
+			//return true to continue visiting children.
+			return true;
+		}
+	}
+
+	class SampleResourceVisitor implements IResourceVisitor {
+	   
+	   private ArchiveBuilder builder;
+	   
+		public SampleResourceVisitor(ArchiveBuilder builder) {
+         this.builder = builder;
+      }
+
+      @Override
+      public boolean visit(IResource resource) {
+			checkResource(resource, builder);
+			//return true to continue visiting children.
+			return true;
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.internal.events.InternalBuilder#build(int,
+	 *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	@Override
+   @SuppressWarnings("rawtypes")
+   protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+	   try{
+	      if(!isOTEBuilderActive()){
+	         return null;
+	      }
+	      long time = System.currentTimeMillis();
+	      IJavaProject javaProject = JavaCore.create(getProject());
+	      if(javaProject != null){
+	         File workspaceArchiveHome = getWorkspaceArchiveFolder();
+	         List<IPath> outputLocations = getOutputLocations(javaProject.getOutputLocation(), javaProject.getRawClasspath());
+
+	         ArchiveBuilder builder = new ArchiveBuilder(workspaceArchiveHome, outputLocations);
+	        
+	         if (kind == FULL_BUILD) {
+	            fullBuild(monitor, builder);
+	         } else {
+	            IResourceDelta delta = getDelta(getProject());
+	            if (delta == null) {
+	               fullBuild(monitor, builder);
+	            } else {
+	               incrementalBuild(delta, monitor, builder);
+	            }
+	         } 
+	         builder.archive();
+	      }
+	      long elapsed = System.currentTimeMillis() - time;
+	      System.out.printf("%s,%d\n", getProject().getName(), elapsed);
+	   } catch (Throwable th){
+	      OseeLog.log(getClass(), Level.SEVERE, "Failed to run the OTE Packager", th);
+	      th.printStackTrace();
+	   }
+	   return null;
+	}
+
+   private List<IPath> getOutputLocations(IPath outputLocation, IClasspathEntry[] rawClasspath) {
+      List<IPath> outputLocations = new ArrayList<>();
+      outputLocations.add(outputLocation);
+      for(IClasspathEntry classpathEntry:rawClasspath){
+         if(classpathEntry.getOutputLocation() != null){
+            outputLocations.add(classpathEntry.getOutputLocation());
+         }
+      }
+      return outputLocations;
+   }
+
+   void checkResource(IResource resource, ArchiveBuilder builder) {
+		if (resource instanceof IFile && resource.getName().endsWith(".class")) {
+			builder.addFile(resource);
+		}
+	}
+
+	protected void fullBuild(final IProgressMonitor monitor, ArchiveBuilder builder) throws CoreException {
+		try {
+			getProject().accept(new SampleResourceVisitor(builder));
+		} catch (CoreException e) {
+		}
+	}
+
+	protected void incrementalBuild(IResourceDelta delta,	IProgressMonitor monitor, ArchiveBuilder builder) throws CoreException {
+		// the visitor does the work.
+		delta.accept(new SampleDeltaVisitor(builder));
+	}
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingNature.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingNature.java
new file mode 100644
index 0000000..210a9cf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingNature.java
@@ -0,0 +1,81 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+
+public class OTEPackagingNature implements IProjectNature {
+
+	/**
+	 * ID of this project nature
+	 */
+	public static final String NATURE_ID = "org.eclipse.osee.ote.ui.builder.OTEPackagingNature";
+
+	private IProject project;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.resources.IProjectNature#configure()
+	 */
+	public void configure() throws CoreException {
+		IProjectDescription desc = project.getDescription();
+		ICommand[] commands = desc.getBuildSpec();
+
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(OTEPackagingBuilder.BUILDER_ID)) {
+				return;
+			}
+		}
+
+		ICommand[] newCommands = new ICommand[commands.length + 1];
+		System.arraycopy(commands, 0, newCommands, 0, commands.length);
+		ICommand command = desc.newCommand();
+		command.setBuilderName(OTEPackagingBuilder.BUILDER_ID);
+		newCommands[newCommands.length - 1] = command;
+		desc.setBuildSpec(newCommands);
+		project.setDescription(desc, null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.resources.IProjectNature#deconfigure()
+	 */
+	public void deconfigure() throws CoreException {
+		IProjectDescription description = getProject().getDescription();
+		ICommand[] commands = description.getBuildSpec();
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(OTEPackagingBuilder.BUILDER_ID)) {
+				ICommand[] newCommands = new ICommand[commands.length - 1];
+				System.arraycopy(commands, 0, newCommands, 0, i);
+				System.arraycopy(commands, i + 1, newCommands, i,
+						commands.length - i - 1);
+				description.setBuildSpec(newCommands);
+				project.setDescription(description, null);			
+				return;
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.resources.IProjectNature#getProject()
+	 */
+	public IProject getProject() {
+		return project;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
+	 */
+	public void setProject(IProject project) {
+		this.project = project;
+	}
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ToggleNatureHandler.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ToggleNatureHandler.java
new file mode 100644
index 0000000..b1730e1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ToggleNatureHandler.java
@@ -0,0 +1,130 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandlerListener;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+public class ToggleNatureHandler extends AbstractHandler {
+
+   @Override
+   public void addHandlerListener(IHandlerListener handlerListener) {
+      // TODO Auto-generated method stub
+
+   }
+
+   @Override
+   public void dispose() {
+      // TODO Auto-generated method stub
+
+   }
+
+   @SuppressWarnings("rawtypes")
+   @Override
+   public Object execute(ExecutionEvent event) throws ExecutionException {
+      IStructuredSelection selection = getCurrentSelection();
+      if (selection != null && selection instanceof IStructuredSelection) {
+         for (Iterator it = ((IStructuredSelection) selection).iterator(); it.hasNext();) {
+            Object element = it.next();
+            IProject project = null;
+            if (element instanceof IProject) {
+               project = (IProject) element;
+            } else if (element instanceof IAdaptable) {
+               project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
+            }
+            if (project != null) {
+               toggleNature(project);
+            }
+         }
+      }
+      return null;
+   }
+   
+   private void toggleNature(IProject project) {
+      try {
+         IProjectDescription description = project.getDescription();
+         String[] natures = description.getNatureIds();
+
+         for (int i = 0; i < natures.length; ++i) {
+            if (OTEPackagingNature.NATURE_ID.equals(natures[i])) {
+               // Remove the nature
+               String[] newNatures = new String[natures.length - 1];
+               System.arraycopy(natures, 0, newNatures, 0, i);
+               System.arraycopy(natures, i + 1, newNatures, i,
+                     natures.length - i - 1);
+               description.setNatureIds(newNatures);
+               project.setDescription(description, null);
+               return;
+            }
+         }
+
+         // Add the nature
+         String[] newNatures = new String[natures.length + 1];
+         System.arraycopy(natures, 0, newNatures, 0, natures.length);
+         newNatures[natures.length] = OTEPackagingNature.NATURE_ID;
+         description.setNatureIds(newNatures);
+         project.setDescription(description, null);
+      } catch (CoreException e) {
+      }
+   }
+   
+   private IStructuredSelection getCurrentSelection() {
+      IWorkbench workbench = PlatformUI.getWorkbench();
+      if (!workbench.isStarting() && !workbench.isClosing()) {
+         IWorkbenchPage page = getActivePage();
+         if (page != null) {
+            IWorkbenchPart part = page.getActivePart();
+            if (part != null) {
+               IWorkbenchSite site = part.getSite();
+               if (site != null) {
+                  ISelectionProvider selectionProvider = site.getSelectionProvider();
+                  if(selectionProvider != null){
+                     ISelection selection = selectionProvider.getSelection();
+                     if (selection instanceof IStructuredSelection) {
+                        return (IStructuredSelection) selection;
+                     }
+                  }
+               }
+            }
+         }
+      }
+      return null;
+   }
+
+   @Override
+   public boolean isEnabled() {
+      return true;
+   }
+
+   @Override
+   public boolean isHandled() {
+      return true;
+   }
+
+   @Override
+   public void removeHandlerListener(IHandlerListener handlerListener) {
+      // TODO Auto-generated method stub
+
+   }
+   
+   private IWorkbenchPage getActivePage() {
+      IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+      return workbenchWindow != null ? workbenchWindow.getActivePage() : null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/.classpath b/org.eclipse.osee.ote.ui.markers/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/.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.ui.markers/.pmd b/org.eclipse.osee.ote.ui.markers/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/.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.ui.markers/.project b/org.eclipse.osee.ote.ui.markers/.project
new file mode 100644
index 0000000..91b3aab
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.ui.markers</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.ui.markers/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..38192fd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Markers Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.markers;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.markers.MarkerPlugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.ui,
+ org.eclipse.osee.framework.ui.plugin
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.ui.markers
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.ui.ws,
+ org.eclipse.osee.ote.core.framework.saxparse,
+ org.eclipse.osee.ote.core.framework.saxparse.elements
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.ui.markers/build.properties b/org.eclipse.osee.ote.ui.markers/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/org.eclipse.osee.ote.ui.markers/plugin.xml b/org.eclipse.osee.ote.ui.markers/plugin.xml
new file mode 100644
index 0000000..23aef51
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            adaptable="true"
+            id="org.eclipse.osee.ote.ui.markers.contribution1"
+            nameFilter="*"
+            objectClass="org.eclipse.jdt.core.ICompilationUnit">
+         <action
+               enablesFor="+"
+               label="Clear OTE Markers"
+               class="org.eclipse.osee.ote.ui.markers.ClearOteMarkerActionView"
+               menubarPath="org.eclipse.osee.ote.ui/placeholder"
+               id="org.eclipse.osee.ote.ui.markers.clearMarkers">
+         </action>
+      </objectContribution> 
+      <viewerContribution
+             targetID="#CompilationUnitEditorContext"
+             id="markerConf">
+          <action
+                label="Clear OTE Markers"
+                menubarPath="org.eclipse.osee.ote.ui.viewer/placeholder"
+                id="org.eclipse.osee.ote.ui.markers.editorClearMarkers"
+                class="org.eclipse.osee.ote.ui.markers.ClearOteMarkerAction"/>
+      </viewerContribution>
+       
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.markers/pom.xml b/org.eclipse.osee.ote.ui.markers/pom.xml
new file mode 100644
index 0000000..cbed94c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/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.ui.markers</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Ui Markers (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.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java
new file mode 100644
index 0000000..f4a6c2e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckPointData {
+
+   private boolean isFailed = false;
+   private String name;
+   private String expected;
+   private String actual;
+
+   public boolean isFailed() {
+      return isFailed;
+   }
+
+   public void setFailed(boolean failed) {
+      this.isFailed = failed;
+   }
+
+   public void setName(String name) {
+      this.name = name;
+   }
+
+   public void setExpected(String expected) {
+      this.expected = expected;
+   }
+
+   public void setActual(String actual) {
+      this.actual = actual;
+   }
+
+   public String getName() {
+      return name;
+   }
+
+   public String getExpected() {
+      return expected;
+   }
+
+   public String getActual() {
+      return actual;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java
new file mode 100644
index 0000000..bd00bb3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Element;
+
+public class CheckPointHelper implements Comparable<CheckPointHelper> {
+
+   @Override
+   public String toString() {
+      return String.format("%s[%s, %s]", testPointName, expected, actual);
+   }
+
+   public void increment() {
+      count++;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (obj instanceof CheckPointHelper) {
+         return key.equals(((CheckPointHelper) obj).key);
+      }
+      return false;
+   }
+
+   @Override
+   public int hashCode() {
+      return key.hashCode();
+   }
+
+   private final String testPointName;
+   private final String expected;
+   private final String actual;
+   private final String key;
+   private int count = 1;
+
+   public CheckPointHelper(Element el) {
+      testPointName = Jaxp.getChildText(el, "TestPointName");
+      expected = Jaxp.getChildText(el, "Expected");
+      actual = Jaxp.getChildText(el, "Actual");
+      key = testPointName + expected + actual;
+   }
+
+   public CheckPointHelper(CheckPointData data) {
+      testPointName = data.getName();
+      expected = data.getExpected();
+      actual = data.getActual();
+      key = testPointName + expected + actual;
+   }
+
+   @Override
+   public int compareTo(CheckPointHelper o) {
+      return o.count - this.count;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerAction.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerAction.java
new file mode 100644
index 0000000..44f290e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerAction.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+
+public class ClearOteMarkerAction implements IEditorActionDelegate{
+
+	ArrayList<IResource> selections;
+	private IEditorPart editor;
+	
+	public ClearOteMarkerAction()  {
+		selections = new ArrayList<>();
+	}
+
+	@Override
+	public void run(IAction action) {
+		for(IResource resource:selections){
+			MarkerPlugin.findAndRemoveOteMarkers(resource);
+		}
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		selections.clear();
+		if(selection instanceof StructuredSelection){
+			Iterator<?> i = ((StructuredSelection)selection).iterator();
+			while (i.hasNext()) {
+				Object obj = i.next();
+				if (obj instanceof IResource) {
+					IResource resource = (IResource) obj;
+					if (resource != null) {
+						selections.add(resource);
+					}
+				} 
+			}
+		} else {
+			Object obj = editor.getEditorInput().getAdapter(IResource.class);
+			if(obj != null){
+				selections.add((IResource)obj);
+			}
+		}
+	}
+
+	@Override
+	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+		this.editor = targetEditor;
+	}
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerActionView.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerActionView.java
new file mode 100644
index 0000000..09b61d0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerActionView.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+public class ClearOteMarkerActionView implements IViewActionDelegate {
+
+	ArrayList<IResource> selections;
+	
+	public ClearOteMarkerActionView()  {
+		selections = new ArrayList<>();
+	}
+
+	@Override
+	public void run(IAction action) {
+		for(IResource resource:selections){
+			MarkerPlugin.findAndRemoveOteMarkers(resource);
+		}
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		selections.clear();
+		if(selection instanceof StructuredSelection){
+			Iterator<?> i = ((StructuredSelection)selection).iterator();
+			while (i.hasNext()) {
+				Object obj = i.next();
+				if (obj instanceof IResource) {
+					IResource resource = (IResource) obj;
+					if (resource != null) {
+						selections.add(resource);
+					}
+				} 
+			}
+		} 
+	}
+
+	@Override
+	public void init(IViewPart view) {
+
+	}
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java
new file mode 100644
index 0000000..cfe4299
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class FileWatchList {
+
+   private class FileWatchItem {
+      IFile file;
+      List<IMarker> markers;
+      long timeUpdated;
+
+      FileWatchItem(IFile file, List<IMarker> markers) {
+         this.file = file;
+         this.markers = markers;
+         timeUpdated = System.currentTimeMillis();
+      }
+   }
+
+   private final List<FileWatchItem> fileWatchItems;
+
+   public FileWatchList() {
+      fileWatchItems = new CopyOnWriteArrayList<>();
+   }
+
+   public void put(IFile file, List<IMarker> markers) {
+      FileWatchItem item = findWatchItem(file);
+      if (item == null) {
+         if (isListTooBig()) {
+            removeOldestWatchItem();
+         }
+         fileWatchItems.add(new FileWatchItem(file, markers));
+      } else {
+         item.markers = markers;
+         item.timeUpdated = System.currentTimeMillis();
+      }
+   }
+
+   private void removeOldestWatchItem() {
+      FileWatchItem oldest = null;
+      for (FileWatchItem item : fileWatchItems) {
+         if (oldest == null) {
+            oldest = item;
+         } else {
+            if (oldest.timeUpdated > item.timeUpdated) {
+               oldest = item;
+            }
+         }
+      }
+      if (oldest != null) {
+         OseeLog.logf(FileWatchList.class, Level.INFO, 
+            "Removing markers from [%s] because maximium marker watch list size has been reached.",
+            oldest.file.getName());
+         fileWatchItems.remove(oldest);
+         if (oldest.markers != null) {
+            for (IMarker marker : oldest.markers) {
+               try {
+                  marker.delete();
+               } catch (CoreException ex) {
+                  OseeLog.log(FileWatchList.class, Level.SEVERE, ex);
+               }
+            }
+         }
+      }
+   }
+
+   private boolean isListTooBig() {
+      return fileWatchItems.size() > 20;
+   }
+
+   public List<IMarker> get(IFile file) {
+      FileWatchItem item = findWatchItem(file);
+      if (item != null) {
+         return item.markers;
+      } else {
+         return null;
+      }
+   }
+
+   private FileWatchItem findWatchItem(IFile file) {
+      for (FileWatchItem item : fileWatchItems) {
+         if (item.file.equals(file)) {
+            return item;
+         }
+      }
+      return null;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerInfo.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerInfo.java
new file mode 100644
index 0000000..de2d857
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerInfo.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.ote.ui.markers;
+
+public class MarkerInfo {
+   private final String file;
+   private final int line;
+   private final String message;
+
+   public MarkerInfo(String file, int line, String message) {
+      this.file = file;
+      this.line = line;
+      this.message = message;
+   }
+
+   /**
+    * @return the file
+    */
+   public String getFile() {
+      return file;
+   }
+
+   /**
+    * @return the line
+    */
+   public int getLine() {
+      return line;
+   }
+
+   /**
+    * @return the message
+    */
+   public String getMessage() {
+      return message;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.java
new file mode 100644
index 0000000..214c3f5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+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.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class MarkerPlugin implements BundleActivator {
+
+   private static FileWatchList filesToWatch;
+   public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.markers";
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      filesToWatch = new FileWatchList();
+      ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {
+
+         @Override
+         public void resourceChanged(final IResourceChangeEvent event) {
+            IResourceDelta delta = event.getDelta();
+            try {
+               delta.accept(new IResourceDeltaVisitor() {
+                  @Override
+                  public boolean visit(IResourceDelta delta) throws CoreException {
+                     IPath path = delta.getFullPath();
+                     String extension = path.getFileExtension();
+                     if (extension != null) {
+                        if ("tmo".equals(extension)) {
+                           IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+                           // file.refreshLocal(depth, monitor);
+                           if (file != null) {
+                              switch (delta.getKind()) {
+                                 case IResourceDelta.REMOVED:
+                                    removeMarkers(file);
+                                    break;
+                                 default:
+                                    // do nothing
+                              }
+                           }
+                        }
+                     }
+                     if (delta.getAffectedChildren().length > 0) {
+                        return true;
+                     }
+                     return false;
+                  }
+               });
+            } catch (CoreException ex) {
+               OseeLog.log(MarkerPlugin.class, Level.SEVERE, ex);
+            }
+         }
+
+      }, IResourceChangeEvent.POST_CHANGE);
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+   }
+
+   public static void addMarkers(IFile file) {
+      removeMarkers(file);
+      Jobs.runInJob("OTE Marker Processing", new ProcessOutfileSax(file), MarkerPlugin.class, MarkerPlugin.PLUGIN_ID,
+         false);
+   }
+
+   public static void removeMarkers(IFile file) {
+      List<IMarker> markers = filesToWatch.get(file);
+      if (markers != null) {
+         for (IMarker marker : markers) {
+            try {
+               marker.delete();
+            } catch (CoreException ex) {
+            }
+         }
+      }
+      findAndRemoveOteMarkers(file);
+   }
+
+   static synchronized void updateMarkerInfo(IFile file, List<IMarker> markers) {
+      filesToWatch.put(file, markers);
+   }
+
+   public static void findAndRemoveOteMarkers(IResource resource) {
+      try {
+         if (resource == null || !resource.exists()) {
+            return;
+         }
+         IMarker[] markersToRemove =
+            resource.findMarkers("org.eclipse.osee.ote.ui.output.errorMarker", false, IResource.DEPTH_INFINITE);
+         for (IMarker localMarker : markersToRemove) {
+            localMarker.delete();
+         }
+      } catch (CoreException e) {
+         OseeLog.log(MarkerPlugin.class, Level.SEVERE, e);
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java
new file mode 100644
index 0000000..adbc757
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+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.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.StacktraceData;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteMarkerHelper {
+
+   private final List<MarkerInfo> markerInfo;
+   private final List<IMarker> markersToDelete;
+   private final Map<CheckPointHelper, CheckPointHelper> count = new HashMap<>();
+   private final StringBuilder builder = new StringBuilder();
+   private final List<TestPointData> testPonitDatas;
+
+   public OteMarkerHelper(List<TestPointData> testPointDatas) {
+      this.testPonitDatas = testPointDatas;
+      markerInfo = new ArrayList<>();
+      markersToDelete = new ArrayList<>();
+
+      doWork();
+   }
+
+   private void doWork() {
+      for (TestPointData data : testPonitDatas) {
+         String description = getDescription(data.getCheckPointData());
+         String number = data.getNumber();
+         int num = Integer.parseInt(number);
+         String details = String.format("#%03d %s", num, description);
+
+         if (data.getStacktraceCollection() != null) {
+            for (StacktraceData stackLocation : data.getStacktraceCollection().getStackTrace()) {
+               String file = stackLocation.getSource();
+               String line = stackLocation.getLine();
+               //pull out the java file name
+               file = file.substring(file.lastIndexOf(".") + 1);
+               int innerMarker = file.indexOf("$");
+               if (innerMarker > 0) {
+                  file = file.substring(0, file.indexOf("$"));
+               }
+               file += ".java";
+               int linenumber = Integer.parseInt(line);
+
+               markerInfo.add(new MarkerInfo(file, linenumber, details));
+            }
+         }
+      }
+      finish();
+   }
+
+   private String getDescription(List<CheckPointData> datas) {
+      count.clear();
+      for (CheckPointData data : datas) {
+         CheckPointHelper check = new CheckPointHelper(data);
+         if (count.containsKey(check)) {
+            count.get(check).increment();
+         } else {
+            count.put(check, check);
+         }
+      }
+
+      CheckPointHelper[] helper = count.values().toArray(new CheckPointHelper[count.values().size()]);
+      Arrays.sort(helper);
+      int maxNumber = 2;
+      builder.setLength(0);
+      for (int i = 0; i < helper.length && i < maxNumber; i++) {
+         builder.append(helper[i].toString());
+         if (i + 1 < Math.min(helper.length, maxNumber)) {
+            builder.append(", ");
+         }
+         if (i + 1 < helper.length && i + 1 >= maxNumber) {
+            builder.append("...");
+         }
+      }
+      return builder.toString();
+   }
+
+   private void finish() {
+
+      Set<String> fileAlreadyLookedFor = new HashSet<>();
+      Map<String, IResource> resources = new HashMap<>();
+
+      for (MarkerInfo marker : markerInfo) {
+    	  if (!fileAlreadyLookedFor.contains(marker.getFile())) {
+    		  fileAlreadyLookedFor.add(marker.getFile());
+    		  IResource resource = AWorkspace.findWorkspaceFile(marker.getFile());
+    		  if (resource != null) {
+    			  resources.put(marker.getFile(), resource);
+    		  }
+    	  }
+      }
+      
+      for (MarkerInfo marker : markerInfo) {
+    	  IResource resourceToMark = resources.get(marker.getFile());
+    	  MarkerPlugin.findAndRemoveOteMarkers(resourceToMark);
+       }
+      
+      for (MarkerInfo marker : markerInfo) {
+         try {
+            IResource resourceToMark = resources.get(marker.getFile());
+            if (resourceToMark != null) {
+               Map<String, Object> scriptMarkerMap = new HashMap<>();
+               scriptMarkerMap.put(IMarker.MESSAGE, marker.getMessage());
+               scriptMarkerMap.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
+               scriptMarkerMap.put(IMarker.LINE_NUMBER, marker.getLine());
+               IMarker markerToDelete = resourceToMark.createMarker("org.eclipse.osee.ote.ui.output.errorMarker");
+               markerToDelete.setAttributes(scriptMarkerMap);
+               markersToDelete.add(markerToDelete);
+            }
+         } catch (Exception ex) {
+            OseeLog.log(MarkerPlugin.class, Level.SEVERE, "Error adding markers from outfile", ex);
+         }
+      }
+   }
+
+   public List<IMarker> getMarkers() {
+      return markersToDelete;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java
new file mode 100644
index 0000000..bc1af28
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java
@@ -0,0 +1,277 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.core.framework.saxparse.IBaseSaxElementListener;
+import org.eclipse.osee.ote.core.framework.saxparse.OteSaxHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.StacktraceData;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ProcessOutfileSax implements IExceptionableRunnable {
+
+   private final IFile file;
+
+   private static final int _1_MB = 1048576;
+   private static final int _20_MB = _1_MB * 20;
+
+   private final List<TestPointData> testPointDatas = new ArrayList<>();
+   private TestPointData currentData = null;
+   private CheckPointData currentCheckPoint = null;
+   protected StackTraceCollection currentStackTrace;
+
+   public ProcessOutfileSax(IFile file) {
+      this.file = file;
+   }
+
+   @Override
+   public IStatus run(IProgressMonitor monitor) throws Exception {
+      File outfile = AWorkspace.iFileToFile(file);
+      if (outfile.length() > _20_MB) {
+         OseeLog.logf(MarkerPlugin.class, Level.WARNING, 
+            "%s has a length of [%d], the max size processed is [%d].", file.getName(), outfile.length(), _20_MB);
+         return Status.OK_STATUS;
+      }
+      if (!file.isSynchronized(0)) {
+         OseeLog.logf(MarkerPlugin.class, Level.WARNING, "%s is not synchronized.", file.getName());
+         file.refreshLocal(0, monitor);
+      }
+
+      monitor.setTaskName(String.format("Computing overview information for [%s].", file.getName()));
+
+//      InputStream contents = file.getContents();
+      
+      boolean hadParseException = false;
+      int numberOfTries = 0;
+      do{
+         // Using this because IFile was acting very flaky for this.
+         FileInputStream contents = new FileInputStream(outfile);
+
+         try {
+            hadParseException = false;
+            parseContents(contents);
+         } catch (Exception ex) {
+            hadParseException = true;
+            System.out.println("Had EXCEPTION HERE FROM parseContents()!!! numberOfTries = " + numberOfTries);
+         }
+         finally {
+            numberOfTries++;
+            Thread.sleep(1000);
+         }
+      } while(hadParseException && (numberOfTries < 5));
+      if (numberOfTries > 1){
+         FileInputStream contents = new FileInputStream(outfile);
+         parseContents(contents);
+      }
+      
+      
+      OteMarkerHelper helper = new OteMarkerHelper(this.testPointDatas);
+      MarkerPlugin.updateMarkerInfo(file, helper.getMarkers());
+
+      return Status.OK_STATUS;
+   }
+
+   private void parseContents(InputStream contents) throws SAXException, Exception, SAXNotRecognizedException, SAXNotSupportedException, IOException {
+      XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+      OteSaxHandler handler = new OteSaxHandler();
+      xmlReader.setContentHandler(handler);
+      xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler); // This is the important part
+
+      final Stack<String> elementStack = new Stack<>();
+      handler.getHandler("*").addListener(new IBaseSaxElementListener() {
+
+         @Override
+         public void onStartElement(Object obj) {
+            elementStack.push((String) obj);
+         }
+
+         @Override
+         public void onEndElement(Object obj) {
+            elementStack.pop();
+         }
+      });
+
+      handler.getHandler("TestPoint").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+        	if (currentData != null && currentData.isFailed()) {
+               testPointDatas.add(currentData);
+            }
+            currentData = null;
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+            currentData = new TestPointData();
+         }
+      });
+      handler.getHandler("CheckPoint").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+            if (currentCheckPoint.isFailed()) {
+               currentData.add(currentCheckPoint);
+            }
+            currentCheckPoint = null;
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+            if (currentData != null) {
+               currentCheckPoint = new CheckPointData();
+            }
+         }
+      });
+
+      handler.getHandler("Result").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+            boolean failed = false;
+            if ("FAILED".equals(obj)) {
+               failed = true;
+            }
+
+            if (currentCheckPoint != null) {
+               currentCheckPoint.setFailed(failed);
+            } else if (currentData != null && elementStack.peek().equals("TestPoint")) {
+               currentData.setFailed(failed);
+            }
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+         }
+      });
+
+      handler.getHandler("TestPointName").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+            if (currentCheckPoint != null) {
+               currentCheckPoint.setName(obj.toString());
+            }
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+         }
+      });
+      handler.getHandler("Expected").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+            if (currentCheckPoint != null) {
+               currentCheckPoint.setExpected(spaceProcessing(obj.toString()));
+            }
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+         }
+      });
+      handler.getHandler("Actual").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+            if (currentCheckPoint != null) {
+               currentCheckPoint.setActual(spaceProcessing(obj.toString()));
+            }
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+         }
+      });
+      handler.getHandler("Number").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+            if (currentData != null) {
+               currentData.setNumber(obj.toString());
+            }
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+         }
+      });
+      handler.getHandler("Location").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+            if (currentStackTrace != null) {
+               currentData.setStackTrace(currentStackTrace);
+               currentStackTrace = null;
+            }
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+            if (currentData != null) {
+               currentStackTrace = new StackTraceCollection();
+            }
+         }
+      });
+      handler.getHandler("Stacktrace").addListener(new IBaseSaxElementListener() {
+         @Override
+         public void onEndElement(Object obj) {
+         }
+
+         @Override
+         public void onStartElement(Object obj) {
+            if (currentStackTrace != null) {
+               currentStackTrace.addTrace((StacktraceData) obj);
+            }
+         }
+      });
+
+      xmlReader.parse(new InputSource(contents));
+   }
+
+   private String spaceProcessing(String expected) {
+      int index = 0, preCount = 0, postCount = 0;
+      while (index < expected.length() && expected.charAt(index) == ' ') {
+         index++;
+         preCount++;
+      }
+      index = expected.length() - 1;
+      while (index >= 0 && expected.charAt(index) == ' ') {
+         index--;
+         postCount++;
+      }
+
+      expected = expected.trim();
+      if (preCount > 0) {
+         expected = String.format("#sp%d#%s", preCount, expected);
+      }
+      if (postCount > 0) {
+         expected = String.format("%s#sp%d#", expected, postCount);
+      }
+
+      return expected;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java
new file mode 100644
index 0000000..addc272
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.StacktraceData;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StackTraceCollection {
+
+   public List<StacktraceData> data = new ArrayList<>();
+
+   public void addTrace(StacktraceData obj) {
+      data.add(obj);
+   }
+
+   public List<StacktraceData> getStackTrace() {
+      return data;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java
new file mode 100644
index 0000000..1fa2783
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.ui.markers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointData {
+
+   private boolean isFailed;
+   private final List<CheckPointData> data = new ArrayList<>();
+   private String number;
+   private StackTraceCollection stacktrace;
+
+   public boolean isFailed() {
+      return isFailed;
+   }
+
+   public void add(CheckPointData checkPoint) {
+      data.add(checkPoint);
+   }
+
+   public void setFailed(boolean failed) {
+      isFailed = failed;
+   }
+
+   public void setNumber(String number) {
+      this.number = number;
+   }
+
+   public String getNumber() {
+      return number;
+   }
+
+   public void setStackTrace(StackTraceCollection currentStackTrace) {
+      this.stacktrace = currentStackTrace;
+   }
+
+   public List<CheckPointData> getCheckPointData() {
+      return data;
+   }
+
+   public StackTraceCollection getStacktraceCollection() {
+      return stacktrace;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/.classpath b/org.eclipse.osee.ote.ui.test.manager/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.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.ui.test.manager/.pmd b/org.eclipse.osee.ote.ui.test.manager/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.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.ui.test.manager/.project b/org.eclipse.osee.ote.ui.test.manager/.project
new file mode 100644
index 0000000..a069d1a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.ui.test.manager</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.ui.test.manager/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6f0d22a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF
@@ -0,0 +1,55 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Test Manager Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.test.manager;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote.ui.test.manager,
+ org.eclipse.osee.ote.ui.test.manager.actions,
+ org.eclipse.osee.ote.ui.test.manager.configuration,
+ org.eclipse.osee.ote.ui.test.manager.configuration.pages,
+ org.eclipse.osee.ote.ui.test.manager.connection,
+ org.eclipse.osee.ote.ui.test.manager.core,
+ org.eclipse.osee.ote.ui.test.manager.jobs,
+ org.eclipse.osee.ote.ui.test.manager.models,
+ org.eclipse.osee.ote.ui.test.manager.operations,
+ org.eclipse.osee.ote.ui.test.manager.pages,
+ org.eclipse.osee.ote.ui.test.manager.pages.contributions,
+ org.eclipse.osee.ote.ui.test.manager.pages.scriptTable,
+ org.eclipse.osee.ote.ui.test.manager.panels,
+ org.eclipse.osee.ote.ui.test.manager.preferences,
+ org.eclipse.osee.ote.ui.test.manager.preferences.environment,
+ org.eclipse.osee.ote.ui.test.manager.util,
+ org.eclipse.osee.ote.ui.test.manager.wizards
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.ote.client,
+ org.eclipse.osee.ote.core,
+ org.eclipse.core.resources,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.ote.ui.markers,
+ org.eclipse.jface.text,
+ org.eclipse.osee.ote.ui,
+ org.eclipse.osee.ote.connection.service,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.nebula.widgets.xviewer,
+ org.eclipse.osee.framework.ui.ws,
+ org.eclipse.osee.ote.runtimeManager,
+ net.jini;bundle-version="2.1.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.apache.xml.serialize,
+ org.eclipse.core.filesystem,
+ org.eclipse.jdt.core,
+ org.eclipse.nebula.widgets.xviewer.core.model,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.ote.ui.builder,
+ org.eclipse.osee.ote.version,
+ org.osgi.service.event;version="1.3.0"
diff --git a/org.eclipse.osee.ote.ui.test.manager/build.properties b/org.eclipse.osee.ote.ui.test.manager/build.properties
new file mode 100644
index 0000000..274a831
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/build.properties
@@ -0,0 +1,7 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+               images/,\
+               META-INF/,\
+               support/,\
+               .
+source.. = src/
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/add.gif b/org.eclipse.osee.ote.ui.test.manager/images/add.gif
new file mode 100644
index 0000000..6cf3b5f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/add.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/alert_obj.gif b/org.eclipse.osee.ote.ui.test.manager/images/alert_obj.gif
new file mode 100644
index 0000000..7a49f6d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/alert_obj.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/binoculars.gif b/org.eclipse.osee.ote.ui.test.manager/images/binoculars.gif
new file mode 100644
index 0000000..b04deb3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/binoculars.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/check.gif b/org.eclipse.osee.ote.ui.test.manager/images/check.gif
new file mode 100644
index 0000000..6b3078b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/check.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/chkbox_disabled.gif b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_disabled.gif
new file mode 100644
index 0000000..7aa131a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_disabled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/chkbox_enabled.gif b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_enabled.gif
new file mode 100644
index 0000000..9cacb96
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_enabled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/connected.gif b/org.eclipse.osee.ote.ui.test.manager/images/connected.gif
new file mode 100644
index 0000000..8290462
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/connected.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/connected_plug.gif b/org.eclipse.osee.ote.ui.test.manager/images/connected_plug.gif
new file mode 100644
index 0000000..8493df4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/connected_plug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/connected_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/connected_sm.gif
new file mode 100644
index 0000000..b397d8b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/connected_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/debugOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput.gif
new file mode 100644
index 0000000..d18ebcb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/debugOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput_sm.gif
new file mode 100644
index 0000000..2e74d0a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/delete.gif b/org.eclipse.osee.ote.ui.test.manager/images/delete.gif
new file mode 100644
index 0000000..2cd9c54
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/delete.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/disconnected_plug.gif b/org.eclipse.osee.ote.ui.test.manager/images/disconnected_plug.gif
new file mode 100644
index 0000000..61648a3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/disconnected_plug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/environment.gif b/org.eclipse.osee.ote.ui.test.manager/images/environment.gif
new file mode 100644
index 0000000..f3377f3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/environment.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/error.gif b/org.eclipse.osee.ote.ui.test.manager/images/error.gif
new file mode 100644
index 0000000..8612eaf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/error.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/error_stack.gif b/org.eclipse.osee.ote.ui.test.manager/images/error_stack.gif
new file mode 100644
index 0000000..e61fc24
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/error_stack.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/file.gif b/org.eclipse.osee.ote.ui.test.manager/images/file.gif
new file mode 100644
index 0000000..7ccc6a7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/file.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/file_delete.gif b/org.eclipse.osee.ote.ui.test.manager/images/file_delete.gif
new file mode 100644
index 0000000..45699b5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/file_delete.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/flatOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput.gif
new file mode 100644
index 0000000..bbfa55f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/flatOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput_sm.gif
new file mode 100644
index 0000000..64b499c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/fldr_obj.gif b/org.eclipse.osee.ote.ui.test.manager/images/fldr_obj.gif
new file mode 100644
index 0000000..b685869
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/fldr_obj.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/glasses.gif b/org.eclipse.osee.ote.ui.test.manager/images/glasses.gif
new file mode 100644
index 0000000..9bdbc12
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/glasses.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/green_bug.gif b/org.eclipse.osee.ote.ui.test.manager/images/green_bug.gif
new file mode 100644
index 0000000..1c36fc1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/green_bug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/import_wiz.gif b/org.eclipse.osee.ote.ui.test.manager/images/import_wiz.gif
new file mode 100644
index 0000000..d38085a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/import_wiz.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/light_bolt.gif b/org.eclipse.osee.ote.ui.test.manager/images/light_bolt.gif
new file mode 100644
index 0000000..4bc7dd4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/light_bolt.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/loadConfig.gif b/org.eclipse.osee.ote.ui.test.manager/images/loadConfig.gif
new file mode 100644
index 0000000..f92b0e8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/loadConfig.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/normalOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput.gif
new file mode 100644
index 0000000..eea2973
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/normalOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput_sm.gif
new file mode 100644
index 0000000..12c7902
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/ofp.gif b/org.eclipse.osee.ote.ui.test.manager/images/ofp.gif
new file mode 100644
index 0000000..d19d763
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/ofp.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/red_bug.gif b/org.eclipse.osee.ote.ui.test.manager/images/red_bug.gif
new file mode 100644
index 0000000..df3ed44
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/red_bug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/save_edit.gif b/org.eclipse.osee.ote.ui.test.manager/images/save_edit.gif
new file mode 100644
index 0000000..9302c4e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/save_edit.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/saveas_edit.gif b/org.eclipse.osee.ote.ui.test.manager/images/saveas_edit.gif
new file mode 100644
index 0000000..d7f9c61
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/saveas_edit.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled.gif
new file mode 100644
index 0000000..6cb4431
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled_sm.gif
new file mode 100644
index 0000000..a1feb00
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling.gif
new file mode 100644
index 0000000..41991b2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling_sm.gif
new file mode 100644
index 0000000..e1dde91
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete.gif
new file mode 100644
index 0000000..da16dea
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete_sm.gif
new file mode 100644
index 0000000..e7903b5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue.gif
new file mode 100644
index 0000000..dcdb06c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue_sm.gif
new file mode 100644
index 0000000..f964662
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput.gif
new file mode 100644
index 0000000..7793f3b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput_sm.gif
new file mode 100644
index 0000000..ad403d9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptReady.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady.gif
new file mode 100644
index 0000000..b8e969f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptReady_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady_sm.gif
new file mode 100644
index 0000000..07c5346
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptRunning.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptRunning.gif
new file mode 100644
index 0000000..0849e03
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptRunning.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/sel_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/sel_abort_stop.gif
new file mode 100644
index 0000000..8fa8ea1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/sel_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/sel_batch_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/sel_batch_abort_stop.gif
new file mode 100644
index 0000000..f0b5574
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/sel_batch_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/sel_run_exec.gif b/org.eclipse.osee.ote.ui.test.manager/images/sel_run_exec.gif
new file mode 100644
index 0000000..4a70a05
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/sel_run_exec.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/showerr_tsk.gif b/org.eclipse.osee.ote.ui.test.manager/images/showerr_tsk.gif
new file mode 100644
index 0000000..170b0e1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/showerr_tsk.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/test.gif b/org.eclipse.osee.ote.ui.test.manager/images/test.gif
new file mode 100644
index 0000000..d4848c0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/test.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/tm.gif b/org.eclipse.osee.ote.ui.test.manager/images/tm.gif
new file mode 100644
index 0000000..c0b47e1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/tm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/tmError.gif b/org.eclipse.osee.ote.ui.test.manager/images/tmError.gif
new file mode 100644
index 0000000..96f464d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/tmError.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/tracability.gif b/org.eclipse.osee.ote.ui.test.manager/images/tracability.gif
new file mode 100644
index 0000000..28f1fd5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/tracability.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/unsel_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/unsel_abort_stop.gif
new file mode 100644
index 0000000..9ba15cf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/unsel_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/unsel_batch_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/unsel_batch_abort_stop.gif
new file mode 100644
index 0000000..deee2f4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/unsel_batch_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/unsel_run_exec.gif b/org.eclipse.osee.ote.ui.test.manager/images/unsel_run_exec.gif
new file mode 100644
index 0000000..d7726f7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/unsel_run_exec.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/plugin.xml b/org.eclipse.osee.ote.ui.test.manager/plugin.xml
new file mode 100644
index 0000000..cbfdc76
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/plugin.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+     <extension point="org.eclipse.ui.actionSets">
+      <actionSet
+         label="OSEE TM"
+         visible="true"
+         id="org.eclipse.osee.ote.ui.test.manager.actionSet">
+
+           
+      </actionSet>
+   </extension>
+
+
+<!-- this changes the marker image in the editor marker bar  -->
+
+       
+    
+   <extension
+         point="org.eclipse.ui.newWizards">
+      <category
+            name="Test Manager"
+            id="org.eclipse.osee.ote.ui.test.manager">
+      </category>
+      <wizard
+            name="Test Manager File"
+            icon="images/tm.gif"
+            category="org.eclipse.osee.ote.ui.test.manager"
+            class="org.eclipse.osee.ote.ui.test.manager.wizards.TestManagerNewWizard"
+            id="org.eclipse.osee.ote.ui.test.manager.wizards.TestManagerNewWizard">
+      </wizard>
+   </extension>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+         <objectContribution  adaptable="true"
+            objectClass="org.eclipse.core.resources.IFile"
+            nameFilter="*.java" id="org.eclipse.osee.ote.ui.menucontribution">
+         <menu
+               label="OTE"
+               path="additions"
+               id="org.eclipse.osee.ote.ui">               
+            <separator
+                  name="placeholder">
+            </separator>
+         </menu>
+      </objectContribution>
+      <objectContribution adaptable="true"
+            objectClass="org.eclipse.core.resources.IFile"
+            nameFilter="*.java"
+            id="org.eclipse.osee.ote.ui.test.manager.contribution1">
+         <action
+               enablesFor="+"
+               label="Add to Test Manager"
+               icon="images/tm.gif"
+               class="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerPopupAction"
+               menubarPath="org.eclipse.osee.ote.ui/placeholder"
+               id="org.eclipse.osee.ote.ui.test.manager.addtotestmanager">
+         </action>
+      </objectContribution>
+      <viewerContribution
+             targetID="#CompilationUnitEditorContext"
+             id="viewConf">
+          <action
+                label="Add To Test Manager"
+                icon="images/tm.gif"
+                menubarPath="org.eclipse.osee.ote.ui.viewer/placeholder"
+                id="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerEditorAction"
+                class="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerEditorAction"/>
+                
+      </viewerContribution>
+         
+   </extension>
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+            class="org.eclipse.osee.ote.ui.test.manager.preferences.TestManagerPreferencePage"
+            id="org.eclipse.osee.ote.ui.test.manager.PreferencePage"
+            name="Test Manager"/>
+   </extension>
+   <extension
+         point="org.eclipse.osee.framework.ui.plugin.PropertyStoreControl">
+      <PropertyStoreControl
+            classname="org.eclipse.osee.ote.ui.test.manager.pages.contributions.ScriptExecutionContribution"
+            viewId="org.eclipse.osee.ote.ui.test.manager">
+      </PropertyStoreControl>
+   </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.test.manager/pom.xml b/org.eclipse.osee.ote.ui.test.manager/pom.xml
new file mode 100644
index 0000000..d2ee207
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/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.ui.test.manager</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Ui Test Manager (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.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/ITestManagerFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/ITestManagerFactory.java
new file mode 100644
index 0000000..56d0e28
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/ITestManagerFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * 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.ui.test.manager;
+
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.pages.AdvancedPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * TODO Add a summary of extension points and other classes that will need to be added to create a new test manager.
+ * 
+ * @author Roberto E. Escobar
+ */
+public interface ITestManagerFactory {
+
+   public AdvancedPage getAdvancedPageNewInstance(Composite parent, int style, TestManagerEditor parentTestManager);
+
+   public String getEditorId();
+
+   public String getEditorLastOpenedKey();
+
+   public ScriptPage getScriptPageNewInstance(Composite parent, int style, TestManagerEditor parentTestManager);
+
+   public String getTestManagerExtension();
+
+   public String getTestManagerFileName();
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java
new file mode 100644
index 0000000..27c2669
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * 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.ui.test.manager;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.framework.ui.swt.KeyedImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Ryan Schmitt
+ */
+public enum OteTestManagerImage implements KeyedImage {
+   ADD("add.gif"),
+   ALERT_OBJ("alert_obj.gif"),
+   CHECK("check.gif"),
+   CHECKBOX_ENABLED("chkbox_enabled.gif"),
+   CHECKBOX_DISABLED("chkbox_disabled.gif"),
+   DELETE("delete.gif"),
+   ENVIRONMENT("environment.gif"),
+   ERROR("error.gif"),
+   ERROR_STACK("error_stack.gif"),
+   FILE("file.gif"),
+   FILE_DELETE("file_delete.gif"),
+   FLDR_OBJ("fldr_obj.gif"),
+   LOAD_CONFIG("loadConfig.gif"),
+   OFP("ofp.gif"),
+   PROJECT_SET_IMAGE("import_wiz.gif"),
+   SAVE_EDIT("save_edit.gif"),
+   SAVEAS_EDIT("saveas_edit.gif"),
+   SEL_ABORT_STOP("sel_abort_stop.gif"),
+   SEL_BATCH_ABORT_STOP("sel_batch_abort_stop.gif"),
+   SEL_RUN_EXEC("sel_run_exec.gif"),
+   SCRIPT_CANCELLED("scriptCancelled.gif"),
+   SCRIPT_CANCELLED_SM("scriptCancelled_sm.gif"),
+   SCRIPT_CANCELLING("scriptCancelling.gif"),
+   SCRIPT_CANCELLING_SM("scriptCancelling_sm.gif"),
+   SCRIPT_COMPLETE("scriptComplete.gif"),
+   SCRIPT_COMPLETE_SM("scriptComplete_sm.gif"),
+   SCRIPT_IN_QUEUE("scriptInQueue.gif"),
+   SCRIPT_IN_QUEUE_SM("scriptInQueue_sm.gif"),
+   SCRIPT_OUTPUT("scriptOutput.gif"),
+   SCRIPT_OUTPUT_SM("scriptOutput_sm.gif"),
+   SCRIPT_READY("scriptReady.gif"),
+   SCRIPT_READY_SM("scriptReady_sm.gif"),
+   SCRIPT_RUNNING("scriptRunning.gif"),
+   TEST("test.gif"),
+   TEST_BATCH_IMAGE("file.gif"),
+   TEST_MANAGER("tm.gif"),
+   UNSEL_ABORT_STOP("unsel_abort_stop.gif"),
+   UNSEL_BATCH_ABORT_STOP("unsel_batch_abort_stop.gif"),
+   UNSEL_RUN_EXEC("unsel_run_exec.gif");
+
+   private final String fileName;
+
+   private OteTestManagerImage(String fileName) {
+      this.fileName = fileName;
+   }
+
+   @Override
+   public ImageDescriptor createImageDescriptor() {
+      return ImageManager.createImageDescriptor(TestManagerPlugin.PLUGIN_ID, "images", fileName);
+   }
+
+   @Override
+   public String getImageKey() {
+      return TestManagerPlugin.PLUGIN_ID + ".images." + fileName;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.java
new file mode 100644
index 0000000..64b5e3e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.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.ui.test.manager.actions;
+
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.operations.AddIFileToTestManager;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PlatformUI;
+
+public class AddToTestManagerEditorAction implements IEditorActionDelegate {
+
+   @Override
+   public void run(IAction action) {
+      // Get IFile of current editor
+      IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+      IEditorInput editorInput = editorPart.getEditorInput();
+      IFile iFile = null;
+      if (editorInput instanceof IFileEditorInput) {
+         iFile = ((IFileEditorInput) editorInput).getFile();
+         if (iFile != null) {
+            OseeLog.log(TestManagerPlugin.class, Level.INFO, "iFile *" + iFile + "*");
+         }
+      }
+      if (iFile == null) {
+         AWorkbench.popup("ERROR", "Can't retrieve IFile");
+         return;
+      }
+      AddIFileToTestManager.getOperation().addIFileToScriptsPage(new String[]{iFile.getLocation().toOSString()});
+   }
+
+   @Override
+   public void selectionChanged(IAction action, ISelection selection) {
+   }
+
+   @Override
+   public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java
new file mode 100644
index 0000000..000f0b8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * 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.ui.test.manager.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.operations.AddIFileToTestManager;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+public class AddToTestManagerPopupAction implements IWorkbenchWindowActionDelegate {
+
+   public static String[] getSelection() {
+      List<String> selection = new ArrayList<>();
+      ISelection sel1 = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
+      if(sel1 instanceof StructuredSelection){
+         Iterator<?> i = ((StructuredSelection)sel1).iterator();
+
+         while (i.hasNext()) {
+            Object obj = i.next();
+            if (obj instanceof IResource) {
+               IResource resource = (IResource) obj;
+               if (resource != null) {
+                  selection.add(resource.getLocation().toOSString());
+               }
+            } else if (obj instanceof ICompilationUnit) {
+               ICompilationUnit resource = (ICompilationUnit) obj;
+               if (resource != null) {
+                  selection.add(resource.getResource().getLocation().toOSString());
+               }
+            } else if (obj instanceof IMember){
+               ICompilationUnit resource = ((IMember) obj).getCompilationUnit();
+               if (resource != null) {
+                  selection.add(resource.getResource().getLocation().toOSString());
+               }
+            }
+         }
+      } else if (sel1 instanceof TextSelection){
+         IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+         IEditorInput editorInput = editorPart.getEditorInput();
+         IFile iFile = null;
+         if (editorInput instanceof IFileEditorInput) {
+            iFile = ((IFileEditorInput) editorInput).getFile();
+            if (iFile != null) {
+               selection.add(iFile.getLocation().toOSString());
+            }
+         }
+      }
+      return selection.toArray(new String[0]);
+   }
+
+   IWorkbenchWindow activeWindow = null;
+
+   // IWorkbenchWindowActionDelegate method
+   @Override
+   public void dispose() {
+      // nothing to do
+   }
+
+   // IWorkbenchWindowActionDelegate method
+   @Override
+   public void init(IWorkbenchWindow window) {
+      activeWindow = window;
+   }
+
+   @Override
+   public void run(IAction proxyAction) {
+      String[] files = getSelection();
+      if (files.length == 0) {
+         AWorkbench.popup("ERROR", "Can't retrieve file");
+         return;
+      }
+      AddIFileToTestManager.getOperation().addIFileToScriptsPage(files);
+   }
+
+   // IActionDelegate method
+   @Override
+   public void selectionChanged(IAction proxyAction, ISelection selection) {
+
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java
new file mode 100644
index 0000000..07d1d28
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * 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.ui.test.manager.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+
+public class TMBugAction implements IEditorActionDelegate {
+
+   @Override
+   public void run(IAction action) {
+
+   }
+
+   @Override
+   public void selectionChanged(IAction action, ISelection selection) {
+   }
+
+   @Override
+   public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFactory.java
new file mode 100644
index 0000000..39b3591
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFactory.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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.ui.test.manager.configuration;
+
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.configuration.pages.LoadScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.configuration.pages.SaveScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.AdvancedPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+
+public class ConfigFactory {
+   private static ConfigFactory instance = null;
+
+   private ConfigFactory() {
+   }
+
+   public static ConfigFactory getInstance() {
+      if (instance == null) {
+         instance = new ConfigFactory();
+      }
+      return instance;
+   }
+
+   public ILoadConfig getLoadConfigHandler(TestManagerPage tmPage) {
+      ILoadConfig toReturn = null;
+
+      if (tmPage instanceof ScriptPage) {
+         toReturn = new LoadScriptPage((ScriptPage) tmPage);
+      } else if (tmPage instanceof AdvancedPage) {
+         // toReturn = new AdvancedPageLoad(tmPage);
+      }
+      return toReturn;
+   }
+
+   public ISaveConfig getSaveConfigHandler(TestManagerPage tmPage) {
+      ISaveConfig toReturn = null;
+
+      if (tmPage instanceof ScriptPage) {
+         try {
+            toReturn = new SaveScriptPage((ScriptPage) tmPage);
+         } catch (ParserConfigurationException ex) {
+            OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+         }
+      } else if (tmPage instanceof AdvancedPage) {
+         // toReturn = new AdvancedPageSave(tmPage);
+      }
+      return toReturn;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.java
new file mode 100644
index 0000000..75f4f48
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ConfigFileHandler {
+
+   /**
+    * Writes the XML in sourceDoc to the test manager config file specified. If the destination file already exists, and
+    * contains the XML specified for the sourceDoc's root node, it will be replaced, otherwise it will be appended to
+    * the file. If the file does not exist, a new file will be created only containing the sourceDoc underneath a root
+    * TestManagerConfig node.
+    */
+   public static void writeFile(Document sourceDoc, String fileString) throws Exception {
+      Document doc;
+      File file = new File(fileString);
+      if (file.exists()) {
+         doc = writeSectionToFile(sourceDoc, file);
+      } else {
+         doc = Jaxp.newDocumentNamespaceAware();
+         Element root = doc.createElement("TestManagerConfig");
+         root.appendChild(doc.importNode(sourceDoc.getDocumentElement(), true));
+         doc.appendChild(root);
+      }
+      Jaxp.writeXmlDocument(doc, file, Jaxp.getPrettyFormat());
+   }
+
+   private static Document writeSectionToFile(Document docToAdd, File file) throws Exception {
+      Element nodeToAdd = docToAdd.getDocumentElement();
+      String configType = nodeToAdd.getNodeName();
+      Document doc = Jaxp.readXmlDocument(file);
+      Element root = doc.getDocumentElement();
+      Element configNode = Jaxp.getChild(root, configType);
+      if (configNode != null) {
+         root.removeChild(configNode);
+         root.appendChild(doc.importNode(nodeToAdd, true));
+      } else {
+         root.appendChild(doc.importNode(nodeToAdd, true));
+      }
+      return doc;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ILoadConfig.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ILoadConfig.java
new file mode 100644
index 0000000..4ec313e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ILoadConfig.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.ui.test.manager.configuration;
+
+import java.io.File;
+
+public abstract interface ILoadConfig {
+
+   public abstract void loadConfiguration(File toProcess) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.java
new file mode 100644
index 0000000..08fb29c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.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.ui.test.manager.configuration;
+
+import java.io.File;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public abstract interface ISaveConfig {
+
+   public abstract Element toXml(Document doc);
+
+   public abstract void saveConfig(File fileName) throws Exception;
+
+   public abstract void printXmlTree();
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadConfigurationOperation.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadConfigurationOperation.java
new file mode 100644
index 0000000..16c19cf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadConfigurationOperation.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.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.StatusWindowWidget;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LoadConfigurationOperation {
+
+   private LoadConfigurationOperation() {
+   }
+
+   public static boolean load(TestManagerEditor testManager, File selectedFile) {
+      boolean isOk = updateFileStatus(testManager, selectedFile);
+      if (isOk != false) {
+         isOk &= reLoad(testManager);
+      }
+      return isOk;
+   }
+
+   private static boolean updateFileStatus(TestManagerEditor testManager, File selectedFile) {
+      boolean result = false;
+      StatusWindowWidget statusWindow = testManager.getPageManager().getScriptPage().getStatusWindow();
+      if (statusWindow != null) {
+         String filePath = selectedFile.getAbsolutePath();
+         statusWindow.setValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name(), filePath);
+         testManager.storeValue(testManager.configFileName, filePath);
+         statusWindow.refresh();
+         result = true;
+      }
+      return result;
+   }
+
+   public static boolean reLoad(TestManagerEditor testManager) {
+      boolean result = false;
+      String configFile = testManager.loadValue(testManager.configFileName);
+
+      ILoadConfig loadConfig =
+         ConfigFactory.getInstance().getLoadConfigHandler(testManager.getPageManager().getScriptPage());
+      try {
+         loadConfig.loadConfiguration(new File(configFile));
+         result = true;
+      } catch (Exception ex) {
+         Dialogs.popupError("Error Loading File",
+            String.format("Error loading file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+      }
+      return result;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java
new file mode 100644
index 0000000..af53a7c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * 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.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.StatusWindowWidget;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public class LoadWidget {
+   public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+   private StatusWindowWidget statusWindow;
+   private final TestManagerPage tmPage;
+
+   public LoadWidget(TestManagerPage tmPage) {
+      this.tmPage = tmPage;
+      this.statusWindow = null;
+   }
+
+   public void createToolItem(final ToolBar toolBar) {
+      final Shell shell = toolBar.getShell();
+
+      final Menu menu = new Menu(shell, SWT.POP_UP);
+
+      MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
+      menuItem.setText("Load File...");
+      menuItem.setImage(ImageManager.getImage(OteTestManagerImage.FLDR_OBJ));
+      menuItem.addSelectionListener(new SelectionAdapter() {
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            String[] filterExtensions = {"*.xml"};
+            FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
+            fileDialog.setText("Load " + tmPage.getPageName() + "Page Settings From...");
+            fileDialog.setFilterExtensions(filterExtensions);
+
+            String defaultConfigDir = statusWindow.getValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name());
+            File dir = new File(defaultConfigDir);
+            if (dir.isFile() || dir.isDirectory()) {
+               fileDialog.setFilterPath(defaultConfigDir);
+            } else {
+               fileDialog.setFilterPath("Y:\\");
+            }
+            String result = fileDialog.open();
+
+            if (Strings.isValid(result)) {
+               File newFile = new File(result);
+               if (newFile.exists() && newFile.isFile()) {
+                  LoadConfigurationOperation.load(tmPage.getTestManager(), newFile);
+               } else {
+                  handleFileSelectError();
+               }
+            }
+         }
+      });
+
+      final ToolItem item = new ToolItem(toolBar, SWT.DROP_DOWN);
+      item.setImage(ImageManager.getImage(OteTestManagerImage.LOAD_CONFIG));
+      item.setToolTipText("Load current page configuration from file");
+      item.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent event) {
+            // If they clicked the arrow, we show the list
+            if (event.detail == SWT.ARROW) {
+               // Determine where to put the dropdown list
+               ToolItem item = (ToolItem) event.widget;
+               Rectangle rect = item.getBounds();
+               Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
+               menu.setLocation(pt.x, pt.y + rect.height);
+               menu.setVisible(true);
+            } else {
+               LoadConfigurationOperation.reLoad(tmPage.getTestManager());
+            }
+         }
+      });
+      toolBar.pack();
+   }
+
+   public void setStatusLabel(StatusWindowWidget statusWindow) {
+      this.statusWindow = statusWindow;
+   }
+
+   private void handleFileSelectError() {
+      Dialogs.popupError("Load Configuration File", "Invalid Configuration File Selected.");
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.java
new file mode 100644
index 0000000..10f2854
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.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.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.StatusWindowWidget;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public class SaveWidget {
+   public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+   private StatusWindowWidget statusWindow;
+   private String selectedFile;
+   private final TestManagerPage tmPage;
+
+   public SaveWidget(TestManagerPage tmPage) {
+      this.tmPage = tmPage;
+      selectedFile = null;
+      statusWindow = null;
+   }
+
+   public void createToolItem(final ToolBar toolBar) {
+      final Shell shell = toolBar.getShell();
+
+      final Menu menu = new Menu(shell, SWT.POP_UP);
+
+      MenuItem saveAsMenuItem = new MenuItem(menu, SWT.PUSH);
+      saveAsMenuItem.setText("SaveAs...");
+      saveAsMenuItem.setImage(ImageManager.getImage(OteTestManagerImage.SAVEAS_EDIT));
+      saveAsMenuItem.addSelectionListener(new SelectionListener() {
+         @Override
+         public void widgetDefaultSelected(SelectionEvent e) {
+            widgetSelected(e);
+         }
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            String[] filterExtensions = {"*.xml"};
+            FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
+            fileDialog.setText("Save " + tmPage.getPageName() + "Page Settings To...");
+            fileDialog.setFilterExtensions(filterExtensions);
+
+            String defaultConfigDir = statusWindow.getValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name());
+
+            File dir = new File(defaultConfigDir);
+            if (dir.isFile() || dir.isDirectory()) {
+               fileDialog.setFilterPath(defaultConfigDir);
+            } else {
+               fileDialog.setFilterPath("Y:\\");
+            }
+
+            String result = fileDialog.open();
+
+            if (Strings.isValid(result)) {
+               selectedFile = result;
+               if (statusWindow != null) {
+                  statusWindow.setValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name(), selectedFile);
+                  TestManagerEditor tm = tmPage.getTestManager();
+                  tm.storeValue(tm.configFileName, selectedFile);
+                  statusWindow.refresh();
+                  handleSaveEvent();
+               } else {
+                  handleFileSelectError();
+               }
+            }
+         }
+      });
+
+      final ToolItem item = new ToolItem(toolBar, SWT.DROP_DOWN);
+      item.setImage(ImageManager.getImage(OteTestManagerImage.SAVE_EDIT));
+      item.setToolTipText("Saves current page configuration to file");
+      item.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent event) {
+            // If they clicked the arrow, we show the list
+            if (event.detail == SWT.ARROW) {
+               // Determine where to put the dropdown list
+               ToolItem item = (ToolItem) event.widget;
+               Rectangle rect = item.getBounds();
+               Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
+               menu.setLocation(pt.x, pt.y + rect.height);
+               menu.setVisible(true);
+            } else {
+               handleSaveEvent();
+            }
+         }
+      });
+      toolBar.pack();
+   }
+
+   public void setStatusLabel(StatusWindowWidget statusWindow) {
+      this.statusWindow = statusWindow;
+      selectedFile = statusWindow.getValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name());
+   }
+
+   private void handleFileSelectError() {
+      Dialogs.popupError("Save Configuration File", "Invalid Configuration File Selected");
+   }
+
+   private void handleSaveEvent() {
+      TestManagerEditor tm = tmPage.getTestManager();
+      String configFile = tm.loadValue(tm.configFileName);
+
+      ISaveConfig saveConfig = ConfigFactory.getInstance().getSaveConfigHandler(tmPage);
+      try {
+
+         saveConfig.saveConfig(new File(configFile));
+      } catch (Exception ex) {
+         Dialogs.popupError("Error Saving File",
+            String.format("Error saving file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java
new file mode 100644
index 0000000..3546306
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * 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.ui.test.manager.configuration.pages;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Vector;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ILoadConfig;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTableViewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class LoadScriptPage implements ILoadConfig, ScriptPageConstants {
+
+   private final ScriptPage scriptPage;
+   private final ScriptTableViewer scriptTableViewer;
+   private final Vector<ScriptTask> scriptTasks;
+
+   public LoadScriptPage(ScriptPage tmPage) {
+      this.scriptPage = tmPage;
+      this.scriptTableViewer = scriptPage.getScriptTableViewer();
+      scriptTasks = new Vector<>();
+   }
+
+   @Override
+   public void loadConfiguration(final File toProcess) throws Exception {
+
+      Job job = new Job(String.format("Loading Script Run List [%s]", toProcess.getName())) {
+
+         @Override
+         protected IStatus run(IProgressMonitor monitor) {
+            Document doc;
+            try {
+               doc = Jaxp.readXmlDocument(toProcess);
+               parseConfig(doc);
+
+               Displays.pendInDisplayThread(new Runnable() {
+                  @Override
+                  public void run() {
+                     scriptTableViewer.loadTasksFromList(scriptTasks);
+                     scriptTableViewer.refresh();
+                     debug(toProcess.getAbsolutePath());
+                  }
+               });
+            } catch (ParserConfigurationException ex) {
+               OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+            } catch (SAXException ex) {
+               OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+            } catch (IOException ex) {
+               OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+            }
+
+            return Status.OK_STATUS;
+         }
+
+      };
+      job.schedule();
+   }
+
+   private void debug(String val) {
+      OseeLog.log(TestManagerPlugin.class, Level.INFO, "Loaded From: " + val);
+   }
+
+   private void parseConfig(Document doc) {
+      NodeList nl = doc.getElementsByTagName(ScriptPageConstants.SCRIPTPAGE_CONFIG);
+
+      for (int i = 0; i < nl.getLength(); i++) {
+         Element element = (Element) nl.item(i);
+         parseMiscellaneousInfo(element);
+         parseScriptEntries(element);
+      }
+   }
+
+   private void parseMiscellaneousInfo(Element element) {
+      // Iterator iterator = node.getDescendants(new RegExElementFilter(
+      // Pattern.compile(ScriptPageConstants.SERVICES_ENTRY)));
+      // while (iterator.hasNext()) {
+      // Element child = (Element) iterator.next();
+      // TODO load miscellaneous information to page
+      // }
+   }
+
+   private class LoadScriptHelper implements Runnable {
+      private boolean stopLoading = false;
+      private final String path;
+
+      public LoadScriptHelper(String path) {
+         this.path = path;
+      }
+
+      @Override
+      public void run() {
+         if (!MessageDialog.openQuestion(
+            Displays.getActiveShell(),
+            "Script not found",
+            "The script " + path + " was not found in this workspace. Do you want to continue loading from the script list file. ")) {
+            stopLoading = true;
+         }
+      }
+
+      public boolean stop() {
+         return stopLoading;
+      }
+   }
+
+   private void parseScriptEntries(Element element) {
+      NodeList nl = element.getElementsByTagName(ScriptPageConstants.SCRIPT_ENTRY);
+      String alternatePath = scriptPage.getTestManager().getAlternateOutputDir();
+      for (int i = 0; i < nl.getLength(); i++) {
+    	  try{
+    		  Element child = (Element) nl.item(i);
+    		  final String path = Jaxp.getChildText(child, ScriptPageConstants.RAW_FILENAME_FIELD);
+    		  String runnable = Jaxp.getChildText(child, ScriptPageConstants.RUNNABLE_FIELD);
+    		  IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path));
+    		  if (file.exists()) {
+    			  try {
+    				  ScriptTask task = new ScriptTask(file.getLocation().toString(), alternatePath);
+    				  task.setRun(Boolean.parseBoolean(runnable));
+    				  scriptTasks.add(task);
+    			  } catch (NullPointerException e) {
+    				  e.printStackTrace();
+    			  }
+    		  } else {
+    			  LoadScriptHelper helper = new LoadScriptHelper(path);
+    			  Displays.pendInDisplayThread(helper);
+    			  if (helper.stop()) {
+    				  break;
+    			  }
+    		  }
+    	  } catch (Throwable th){
+    		  OseeLog.log(TestManagerPlugin.class, Level.SEVERE, th);
+    	  }
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java
new file mode 100644
index 0000000..b649352
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.ui.test.manager.configuration.pages;
+
+import java.io.File;
+import java.util.Vector;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ConfigFileHandler;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ISaveConfig;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTableViewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class SaveScriptPage implements ISaveConfig, ScriptPageConstants, Xmlizable {
+
+   private final Document doc;
+   private final Element root;
+   private final ScriptPage scriptPage;
+
+   public SaveScriptPage(ScriptPage tmPage) throws ParserConfigurationException {
+      this.scriptPage = tmPage;
+      doc = Jaxp.newDocumentNamespaceAware();
+      root = doc.createElement(ScriptPageConstants.SCRIPTPAGE_CONFIG);
+      doc.appendChild(root);
+   }
+
+   @Override
+   public void printXmlTree() {
+      OseeLog.log(TestManagerPlugin.class, Level.INFO, "Script Page Tree: ");
+      try {
+         OseeLog.log(TestManagerPlugin.class, Level.INFO, Jaxp.xmlToString(doc, true));
+      } catch (TransformerException ex) {
+         OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+      }
+   }
+
+   @Override
+   public void saveConfig(File fileName) throws Exception {
+      ScriptTableViewer scriptTable = scriptPage.getScriptTableViewer();
+      Vector<ScriptTask> tasks = scriptTable.getTasks();
+
+      root.appendChild(miscellaneousInfoToXml(doc));
+
+      for (ScriptTask task : tasks) {
+         root.appendChild(scriptTaskToXml(doc, task));
+      }
+
+      ConfigFileHandler.writeFile(doc, fileName.getAbsolutePath());
+      debug(fileName.getAbsolutePath());
+   }
+
+   @Override
+   public Element toXml(Document doc) {
+      return root;
+   }
+
+   private void debug(String val) {
+      OseeLog.log(TestManagerPlugin.class, Level.INFO, "Saved to: " + val);
+   }
+
+   private Element miscellaneousInfoToXml(Document doc) {
+      Element node = doc.createElement(ScriptPageConstants.SERVICES_ENTRY);
+      // TODO add preferred host
+      // TODO add ofp
+      // TODO add view if unit test config
+
+      return node;
+   }
+
+   private Element scriptTaskToXml(Document doc, ScriptTask task) {
+      Element taskRoot = doc.createElement(ScriptPageConstants.SCRIPT_ENTRY);
+      taskRoot.appendChild(Jaxp.createElement(doc, ScriptPageConstants.SCRIPT_NAME_FIELD, task.getName()));
+      taskRoot.appendChild(Jaxp.createElement(doc, ScriptPageConstants.RAW_FILENAME_FIELD,
+         task.getScriptModel().getWorkspaceRelativePath()));
+      taskRoot.appendChild(Jaxp.createElement(doc, ScriptPageConstants.RUNNABLE_FIELD,
+         Boolean.toString(task.isRunnable())));
+      return taskRoot;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/ScriptPageConstants.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/ScriptPageConstants.java
new file mode 100644
index 0000000..b988a2e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/ScriptPageConstants.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * 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.ui.test.manager.configuration.pages;
+
+public interface ScriptPageConstants {
+
+   public static final String RAW_FILENAME_FIELD = "Path";
+   public static final String RESULT_FIELD = "Result";
+   public static final String RUNNABLE_FIELD = "IsRunnable";
+   public static final String SCRIPT_ENTRY = "ScriptEntry";
+   public static final String SCRIPT_NAME_FIELD = "Name";
+   public static final String SCRIPTPAGE_CONFIG = "ScriptPageConfig";
+   public static final String SERVICES_ENTRY = "ServicesSettings";
+   public static final String STATUS_FIELD = "Status";
+   public static final String CLASS_NAME = "ClassName";
+   public static final String CLASS_PATH = "ClassPath";
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java
new file mode 100644
index 0000000..a06aa1c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * 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.ui.test.manager.connection;
+
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.TestComplete;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.jobs.StoreOutfileJob;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModelJob;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask.ScriptStatusEnum;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTaskList;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class ScriptManager implements Runnable {
+   private final Map<String, ScriptTask> guidToScriptTask = new HashMap<>();
+   private TestManagerStatusListener statusListenerImpl;
+   private final TestManagerEditor testManager;
+
+   private volatile boolean updateScriptTable;
+   private StructuredViewer stv;
+   private ScheduledExecutorService updater;
+   private Set<ScriptTask> tasksToUpdate;
+   private ITestEnvironment connectedEnv;
+   private UUID sessionKey;
+
+   public ScriptManager(TestManagerEditor testManager, StructuredViewer stv) {
+      this.testManager = testManager;
+      this.stv = stv;
+
+      tasksToUpdate = new HashSet<>();
+      updater = Executors.newScheduledThreadPool(1, new ThreadFactory() {
+
+         @Override
+         public Thread newThread(Runnable r) {
+            Thread th = new Thread(r, "TM Table updater");
+            th.setDaemon(true);
+            return th;
+         }
+
+      });
+      updater.scheduleAtFixedRate(this, 0, 2000, TimeUnit.MILLISECONDS);
+      OutputModelJob.createSingleton(this);
+   }
+
+   public abstract void abortScript(boolean isBatchAbort) throws RemoteException;
+
+   public void notifyScriptDequeued(String className) {
+      ScriptTask task = guidToScriptTask.get(className);
+      if (task != null) {
+         
+         ScriptTask value = guidToScriptTask.remove(task);
+         if(value == null){
+            System.out.println("did not dq");
+         }
+      }
+   }
+
+   /**
+    * This should be called after the environment is received in order to configure necessary items.
+    * 
+    * @return null if successful, otherwise a string describing the error
+    */
+   public boolean connect(ConnectionEvent event) {
+
+      connectedEnv = event.getEnvironment();
+      sessionKey = event.getSessionKey();
+      try {
+         /*
+          * Setup the status listener for commands
+          */
+         statusListenerImpl = new TestManagerStatusListener(testManager, this);
+         return false;
+      } catch (Exception e) {
+         TestManagerPlugin.log(Level.SEVERE, "failed to connect script manager", e);
+         return true;
+      }
+   }
+
+   /**
+    * This should NOT be called directly, users should call the HostDataStore's disconnect.
+    */
+   public boolean disconnect(ConnectionEvent event) {
+      connectedEnv = null;
+      sessionKey = null;
+      guidToScriptTask.clear();
+      statusListenerImpl.unregisterEventListener();
+      return false;
+   }
+
+   public boolean onConnectionLost() {
+      connectedEnv = null;
+      sessionKey = null;
+      guidToScriptTask.clear();
+      statusListenerImpl.unregisterEventListener();
+      return false;
+   }
+
+   public ScriptTask getScriptTask(String name) {
+      ScriptTask t = guidToScriptTask.get(name);
+      if(t == null){
+         Object obj = stv.getInput();
+         if(obj instanceof ScriptTaskList){
+            ScriptTaskList stl = (ScriptTaskList)obj;
+            for(ScriptTask task:stl.getTasks()){
+               String clazz = task.getScriptModel().getTestClass();
+               if(clazz.equals(name)){
+                  t = task;
+                  break;
+               }
+            }
+         }
+      }
+      return t;
+   }
+
+   public void notifyScriptQueued(GUID theGUID, final ScriptTask script) {
+      guidToScriptTask.put(script.getScriptModel().getTestClass(), script);
+      script.setStatus(ScriptStatusEnum.IN_QUEUE);
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            if (stv.getControl().isDisposed()) {
+               return;
+            }
+            stv.refresh(script);
+         }
+      });
+   }
+
+   public void updateScriptTableViewer(final ScriptTask task) {
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            if (stv.getControl().isDisposed()) {
+               return;
+            }
+            stv.refresh(task);
+         }
+      });
+   }
+
+   public void updateScriptTableViewerTimed(ScriptTask task) {
+      updateScriptTable = true;
+      synchronized (tasksToUpdate) {
+         tasksToUpdate.add(task);
+      }
+   }
+
+   @Override
+   public void run() {
+      if (updateScriptTable) {
+         updateScriptTable = false;
+         Displays.ensureInDisplayThread(new Runnable() {
+            @Override
+            public void run() {
+               synchronized (tasksToUpdate) {
+                  if (stv.getControl().isDisposed()) {
+                     return;
+                  }
+                  for (ScriptTask task : tasksToUpdate) {
+                     stv.refresh(task);
+                  }
+                  tasksToUpdate.clear();
+               }
+            }
+         });
+      }
+   }
+
+   protected TestManagerEditor getTestManagerEditor() {
+      return testManager;
+   }
+
+   public abstract void addTestsToQueue(List<ScriptTask> scripts);
+
+   public void notifyScriptStart(final ScriptTask task) {
+      task.setStatus(ScriptStatusEnum.RUNNING);
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            stv.refresh(task);
+         }
+      });
+   }
+
+   public void storeOutFile(ScriptTask task, TestComplete testComplete, boolean isValidRun) {
+      if (task.getScriptModel() != null) {
+         Job job =
+            new StoreOutfileJob(connectedEnv, testManager, this, task, testComplete.getClientOutfilePath(),
+               testComplete.getServerOutfilePath(), isValidRun);
+         StoreOutfileJob.scheduleJob(job);
+      }
+   }
+
+   protected UUID getSessionKey() {
+      return sessionKey;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java
new file mode 100644
index 0000000..659dbf3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * 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.ui.test.manager.connection;
+
+import java.util.List;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+public abstract class ScriptQueue implements Runnable {
+
+   private final List<ScriptTask> scripts;
+   private final TestManagerEditor testManager;
+
+   public ScriptQueue(List<ScriptTask> scripts, TestManagerEditor testManager) {
+      super();
+      this.scripts = scripts;
+      this.testManager = testManager;
+   }
+
+   @Override
+   public abstract void run();
+
+   protected List<ScriptTask> getScriptsToExecute() {
+      return scripts;
+   }
+
+   protected TestManagerEditor getTestManagerEditor() {
+      return testManager;
+   }
+
+   protected ScriptManager getScriptManager() {
+      return testManager.getPageManager().getScriptPage().getScriptManager();
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.done b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.done
new file mode 100644
index 0000000..9a76b02
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.done
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.ui.test.manager.connection;
+
+import java.util.concurrent.Callable;
+
+/**
+ * @author b1528444
+ *
+ */
+public abstract class StatusBoardRecieveEvent<V> implements Callable<V> {
+
+   private V data;
+   
+   /**
+    * 
+    */
+   public StatusBoardRecieveEvent(V data) {
+      this.data = data;
+   }
+   
+   /* (non-Javadoc)
+    * @see java.util.concurrent.Callable#call()
+    */
+   @Override
+   public V call() throws Exception {
+      run();
+      return data;
+   }
+   
+   public abstract void run();
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.java
new file mode 100644
index 0000000..abb197d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.ui.test.manager.connection;
+
+import java.util.concurrent.Callable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class StatusBoardRecieveEvent<V> implements Callable<V> {
+
+   private final V data;
+
+   public StatusBoardRecieveEvent(V data) {
+      this.data = data;
+   }
+
+   @Override
+   public V call() throws Exception {
+      run();
+      return data;
+   }
+
+   public abstract void run();
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java
new file mode 100644
index 0000000..85ab6ad
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java
@@ -0,0 +1,353 @@
+/*******************************************************************************
+ * 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.ui.test.manager.connection;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.core.environment.status.CommandAdded;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.environment.status.CommandRemoved;
+import org.eclipse.osee.ote.core.environment.status.EnvironmentError;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusData;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusDataCommand;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor;
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandBegan;
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandEnded;
+import org.eclipse.osee.ote.core.environment.status.TestComplete;
+import org.eclipse.osee.ote.core.environment.status.TestPointUpdate;
+import org.eclipse.osee.ote.core.environment.status.TestServerCommandComplete;
+import org.eclipse.osee.ote.core.environment.status.TestStart;
+import org.eclipse.osee.ote.core.framework.command.TestCommandStatus;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask.ScriptStatusEnum;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class TestManagerServiceStatusDataVisitor implements IServiceStatusDataVisitor {
+
+   private final ScriptManager scriptManager;
+   private final TestManagerEditor testManagerEditor;
+   private final ExecutorService executor;
+
+   protected TestManagerServiceStatusDataVisitor(ScriptManager scriptManager, TestManagerEditor testManagerEditor) {
+      this.scriptManager = scriptManager;
+      this.testManagerEditor = testManagerEditor;
+      executor = Executors.newSingleThreadExecutor();
+
+   }
+
+   @Override
+   public void asCommandAdded(final CommandAdded commandAdded) {
+      executor.submit(new StatusBoardRecieveEvent<CommandAdded>(commandAdded) {
+         @Override
+         public void run() {
+            checkServiceStatusDataValid(commandAdded);
+            logServiceStatusData(commandAdded);
+            final ScriptTask task = getScriptTask(commandAdded);
+            if (task != null) {
+               task.setStatus(ScriptStatusEnum.IN_QUEUE);
+               scriptManager.updateScriptTableViewer(task);
+            }
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asCommandRemoved(final CommandRemoved commandRemoved) {
+      executor.submit(new StatusBoardRecieveEvent<CommandRemoved>(commandRemoved) {
+         @Override
+         public void run() {
+            checkServiceStatusDataValid(commandRemoved);
+            logServiceStatusData(commandRemoved);
+
+            final ScriptTask task = getScriptTask(commandRemoved);
+            if (task != null) {
+               CommandEndedStatusEnum cmdStat = commandRemoved.getReason();
+               if (cmdStat.equals(CommandEndedStatusEnum.ABORTED)) {
+                  logOnConsole(Level.SEVERE, String.format("Test Aborted: [%s]", task.getName()));
+                  task.setStatus(ScriptStatusEnum.CANCELLED);
+               }
+               notifyExecutionComplete(task);
+               scriptManager.updateScriptTableViewer(task);
+            }
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asEnvironmentError(final EnvironmentError environmentError) {
+      executor.submit(new StatusBoardRecieveEvent<EnvironmentError>(environmentError) {
+         @Override
+         public void run() {
+            checkServiceStatusDataValid(environmentError);
+
+            OseeLog.log(TestManagerPlugin.class, Level.SEVERE,
+               "errorOccured: " + environmentError.getErr().getMessage());
+            environmentError.getErr().printStackTrace();
+            final String msg = Lib.exceptionToString(environmentError.getErr());
+            logOnConsole(Level.SEVERE, String.format("Test Environment Error: [%s]", msg));
+            disconnectOnError(msg);
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asSequentialCommandBegan(final SequentialCommandBegan sequentialCommandBegan) {
+      executor.submit(new StatusBoardRecieveEvent<SequentialCommandBegan>(sequentialCommandBegan) {
+         @Override
+         public void run() {
+            checkServiceStatusDataValid(sequentialCommandBegan);
+            logServiceStatusData(sequentialCommandBegan);
+
+            final ScriptTask task = getScriptTask(sequentialCommandBegan);
+            if (task != null && task.getScriptModel() != null) {
+               OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Script Task: [%s]", task);
+               logOnConsole(Level.INFO, String.format("Test Starting: [%s]", task.getName()));
+               task.setStatus(ScriptStatusEnum.RUNNING);
+               scriptManager.updateScriptTableViewer(task);
+            }
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asSequentialCommandEnded(final SequentialCommandEnded sequentialCommandEnded) {
+
+      executor.submit(new StatusBoardRecieveEvent<SequentialCommandEnded>(sequentialCommandEnded) {
+         @Override
+         public void run() {
+            checkServiceStatusDataValid(sequentialCommandEnded);
+            logServiceStatusData(sequentialCommandEnded);
+            final ScriptTask task = getScriptTask(sequentialCommandEnded);
+            if (task != null) {
+               OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Script Task: [%s]", task);
+               CommandEndedStatusEnum cmdStat = sequentialCommandEnded.getStatus();
+               switch (cmdStat) {
+                  case ABORTED:
+                     logOnConsole(Level.SEVERE, String.format("Test Aborted: [%s]", task.getName()));
+                     task.setStatus(ScriptStatusEnum.CANCELLED);
+                     break;
+                  case EXCEPTION:
+                     task.setStatus(ScriptStatusEnum.CANCELLED);
+                     logOnConsole(Level.SEVERE,
+                        String.format("Test Aborted: [%s] - Exception Occurred", task.getName()));
+                     break;
+                  case HUNG:
+                     task.setStatus(ScriptStatusEnum.CANCELLED);
+                     logOnConsole(Level.SEVERE, String.format("Test Hung: [%s]", task.getName()));
+                     break;
+                  case RAN_TO_COMPLETION:
+                     task.setStatus(ScriptStatusEnum.COMPLETE);
+                     break;
+                  default:
+                     task.setStatus(ScriptStatusEnum.COMPLETE);
+                     logOnConsole(Level.SEVERE, String.format("Test Ended Unexpectedly: [%s]", task.getName()));
+                     break;
+               }
+               logOnConsole(Level.INFO, String.format("Test Completed: [%s]", task.getName()));
+               notifyExecutionComplete(task);
+               scriptManager.updateScriptTableViewer(task);
+            }
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asTestPointUpdate(final TestPointUpdate testPointUpdate) {
+      executor.submit(new StatusBoardRecieveEvent<TestPointUpdate>(testPointUpdate) {
+         @Override
+         public void run() {
+            checkServiceStatusDataValid(testPointUpdate);
+            final ScriptTask task = scriptManager.getScriptTask(testPointUpdate.getClassName());
+            if (task != null) {
+               task.getScriptModel().getOutputModel().setAborted(false);
+               task.getScriptModel().getOutputModel().setPassedTestPoints(testPointUpdate.getPass());
+               task.getScriptModel().getOutputModel().setFailedTestPoints(testPointUpdate.getFail());
+               scriptManager.updateScriptTableViewerTimed(task);
+            } 
+//            else {
+//               OseeLog.log(TestManagerPlugin.class, Level.WARNING, "testPointsUpdated: task is null");
+//            }
+         }
+      });
+      logExecutorSize();
+   }
+
+   private synchronized void logOnConsole(final Level level, final String msg) {
+      if (level.equals(Level.SEVERE)) {
+         TestManagerPlugin.getInstance().getOteConsoleService().writeError(msg);
+      } else {
+         TestManagerPlugin.getInstance().getOteConsoleService().write(msg);
+      }
+   }
+
+   private void checkServiceStatusDataValid(IServiceStatusData statusData) {
+      if (statusData == null) {
+         throw new IllegalArgumentException(String.format("Error [%s] was null.", IServiceStatusData.class.getName()));
+      }
+   }
+
+   private void disconnectOnError(final String cause) {
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            TestManagerPlugin.getInstance().getOteConsoleService().writeError(cause);
+         }
+      });
+   }
+
+   private void logServiceStatusData(IServiceStatusDataCommand statusData) {
+      OseeLog.logf(TestManagerPlugin.class, Level.FINE,
+         "%s: %s ", statusData.getClass().getName(), statusData.getDescription());
+   }
+
+   private ScriptTask getScriptTask(IServiceStatusDataCommand statusData) {
+      return scriptManager.getScriptTask(statusData.getDescription().getDescription());
+   }
+
+   private void notifyExecutionComplete(ScriptTask scriptTask) {
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            testManagerEditor.executionCompleted();
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asTestServerCommandComplete(final TestServerCommandComplete end) {
+
+      executor.submit(new StatusBoardRecieveEvent<TestServerCommandComplete>(end) {
+         @Override
+         public void run() {
+            try {
+               TestCommandStatus result = end.getCmdStatus();
+               Throwable th = end.getThrowable();
+               if (th != null && result != null) {
+                  OseeLog.log(TestManagerPlugin.class, Level.INFO, String.format("TestServer Command Completed [%s]", result.name()), th);
+               } else if ( result != null){
+                  OseeLog.log(TestManagerPlugin.class, Level.INFO, String.format("TestServer Command Completed [%s]", result.name()));
+               }
+            } catch (Exception ex) {
+               OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+            } finally {
+               notifyExecutionComplete(null);
+            }
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asTestComplete(final TestComplete testComplete) {
+      executor.submit(new StatusBoardRecieveEvent<TestComplete>(testComplete) {
+         @Override
+         public void run() {
+            ScriptTask task = scriptManager.getScriptTask(testComplete.getClassName());
+            if (task != null) {
+               OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Script Task: [%s]", task);
+               boolean isValidRun = true;
+               CommandEndedStatusEnum cmdStat = testComplete.getStatus();
+               switch (cmdStat) {
+                  case ABORTED:
+                     logOnConsole(Level.SEVERE, String.format("Test Aborted: [%s]", task.getName()));
+                     for (IHealthStatus status : testComplete.getHealthStatus()) {
+                        String msg;
+                        if (status.getException() != null) {
+                           msg = Lib.exceptionToString(status.getException());
+                        } else {
+                           msg = status.getMessage();
+                        }
+                        logOnConsole(status.getLevel(), msg);
+                     }
+                     task.setStatus(ScriptStatusEnum.CANCELLED);
+                     break;
+                  case EXCEPTION:
+                     task.setStatus(ScriptStatusEnum.CANCELLED);
+                     logOnConsole(Level.SEVERE,
+                        String.format("Test Exception: [%s] - Exception Occurred", task.getName()));
+                     StringBuilder sb = new StringBuilder();
+                     try {
+                        for (IHealthStatus status : testComplete.getHealthStatus()) {
+                           if (status.getException() != null) {
+                              sb.append(Lib.exceptionToString(status.getException()));
+                           } else if (status.getLevel().intValue() >= Level.SEVERE.intValue()) {
+                              sb.append(status.getMessage());
+                           }
+                        }
+                        logOnConsole(Level.SEVERE, sb.toString());
+                     } catch (Throwable th) {
+                        th.printStackTrace();
+                     }
+                     break;
+                  case HUNG:
+                     task.setStatus(ScriptStatusEnum.CANCELLED);
+                     logOnConsole(Level.SEVERE, String.format("Test Hung: [%s]", task.getName()));
+                     break;
+                  case RAN_TO_COMPLETION:
+                     task.setStatus(ScriptStatusEnum.COMPLETE);
+                     break;
+                  default:
+                     task.setStatus(ScriptStatusEnum.COMPLETE);
+                     logOnConsole(Level.SEVERE, String.format("Test Ended Unexpectedly: [%s]", task.getName()));
+                     isValidRun = false;
+                     break;
+               }
+               scriptManager.storeOutFile(task, testComplete, isValidRun);
+               logOnConsole(Level.INFO, String.format("Test Completed: [%s]", task.getName()));
+
+               scriptManager.notifyScriptDequeued(testComplete.getClassName());
+               scriptManager.updateScriptTableViewer(task);
+
+            }
+         }
+      });
+      logExecutorSize();
+   }
+
+   @Override
+   public void asTestStart(final TestStart testStart) {
+      executor.submit(new StatusBoardRecieveEvent<TestStart>(testStart) {
+         @Override
+         public void run() {
+            ScriptTask task = scriptManager.getScriptTask(testStart.getTestClassName());
+            if (task != null) {
+               scriptManager.notifyScriptStart(task);
+               logOnConsole(Level.INFO, String.format("Test Started: [%s]", task.getName()));
+            }
+            
+         }
+      });
+      logExecutorSize();
+   }
+
+   private void logExecutorSize() {
+      if (executor instanceof ThreadPoolExecutor) {
+         OseeLog.logf(TestManagerServiceStatusDataVisitor.class, Level.FINE,
+            "Current StatusBoard Executor Size [%d]", ((ThreadPoolExecutor) executor).getQueue().size());
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.java
new file mode 100644
index 0000000..d3a7978
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.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.ui.test.manager.connection;
+
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusData;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandAddedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandRemovedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.EnvErrorMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandBeganMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandEndedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestPointUpdateMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestServerCommandCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestStartMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public final class TestManagerStatusListener implements EventHandler {
+
+   private final TestManagerServiceStatusDataVisitor testManagerServiceDataVisitor;
+   private ServiceRegistration<?> eventReference;
+   
+
+   public TestManagerStatusListener(TestManagerEditor testManagerEditor, ScriptManager userEnvironment) {
+      this.testManagerServiceDataVisitor = new TestManagerServiceStatusDataVisitor(userEnvironment, testManagerEditor);
+      Hashtable<String, Object> properties = new Hashtable<>();
+      properties.put("event.topics", "ote/status/*");
+      eventReference = FrameworkUtil.getBundle(getClass()).getBundleContext().registerService(EventHandler.class.getName(), this, properties);
+   }
+
+   @Override
+   public void handleEvent(Event event) {
+	   try {
+		   IServiceStatusData statusData = null;
+		   if(event.getTopic().equals(CommandAddedMessage.EVENT)){
+			   CommandAddedMessage message = new CommandAddedMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(CommandRemovedMessage.EVENT)){
+			   CommandRemovedMessage message = new CommandRemovedMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(EnvErrorMessage.EVENT)){
+			   EnvErrorMessage message	= new EnvErrorMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(SequentialCommandBeganMessage.EVENT)){
+			   SequentialCommandBeganMessage message = new SequentialCommandBeganMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(SequentialCommandEndedMessage.EVENT)){
+			   SequentialCommandEndedMessage message = new SequentialCommandEndedMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(TestCompleteMessage.EVENT)){
+			   TestCompleteMessage message = new TestCompleteMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(TestPointUpdateMessage.EVENT)){
+			   TestPointUpdateMessage message = new TestPointUpdateMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(TestServerCommandCompleteMessage.EVENT)){
+			   TestServerCommandCompleteMessage message	= new TestServerCommandCompleteMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   } else if(event.getTopic().equals(TestStartMessage.EVENT)){
+			   TestStartMessage message	= new TestStartMessage(OteEventMessageUtil.getBytes(event));	
+			   statusData = message.getObject();
+		   }
+		   if(statusData != null){
+			   statusData.accept(testManagerServiceDataVisitor);
+		   }
+	   } catch (IOException e) {
+		   OseeLog.log(getClass(), Level.SEVERE, event.getTopic(), e);
+	   } catch (ClassNotFoundException e) {
+		   OseeLog.log(getClass(), Level.SEVERE, event.getTopic(), e);
+	   }
+
+   }
+
+   public void unregisterEventListener() {
+	   eventReference.unregister();
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/ITestManagerModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/ITestManagerModel.java
new file mode 100644
index 0000000..f788969
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/ITestManagerModel.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * 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.ui.test.manager.core;
+
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+
+public interface ITestManagerModel {
+
+   public abstract boolean hasParseExceptions();
+
+   public abstract Pair<Integer, Integer> getParseErrorRange();
+
+   public abstract String getParseError();
+
+   public abstract boolean setFromXml(String xmlText);
+
+   public abstract String getRawXml();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java
new file mode 100644
index 0000000..9248758
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.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.ote.ui.test.manager.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.ITestManagerFactory;
+import org.eclipse.osee.ote.ui.test.manager.pages.AdvancedPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.HostPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PageManager {
+
+   protected AdvancedPage advancedPage;
+   protected HostPage hostPage;
+   protected ScriptPage scriptPage;
+   private final List<TestManagerPage> pages;
+
+   private final TestManagerEditor testManager;
+   private final ITestManagerFactory factory;
+
+   public PageManager(ITestManagerFactory factory, TestManagerEditor testManager) {
+      this.factory = factory;
+      this.testManager = testManager;
+      this.pages = new ArrayList<>();
+   }
+
+   protected void createPages(Composite parent) {
+      hostPage = new HostPage(parent, SWT.NONE, testManager);
+      registerPage(hostPage, false);
+
+      scriptPage = this.factory.getScriptPageNewInstance(parent, SWT.NONE, testManager);
+      scriptPage.createPage();
+      registerPage(scriptPage, true);
+
+      advancedPage = this.factory.getAdvancedPageNewInstance(parent, SWT.NONE, testManager);
+      advancedPage.createPage();
+      registerPage(advancedPage, false);
+
+   }
+
+   private void registerPage(TestManagerPage page, boolean isScriptPage) {
+      pages.add(page);
+      testManager.registerPage(testManager.addPage(page), page.getPageName(), isScriptPage);
+   }
+
+   /**
+    * Dispose pages
+    */
+   public void dispose() {
+      for (TestManagerPage page : pages) {
+         page.dispose();
+      }
+      pages.clear();
+   }
+
+   /**
+    * Save page settings to storage
+    */
+   public void save() {
+      for (TestManagerPage page : pages) {
+         page.saveData();
+      }
+   }
+
+   /**
+    * Restore page from stored settings
+    */
+   public void restore() {
+      for (TestManagerPage page : pages) {
+         page.restoreData();
+      }
+   }
+
+   /**
+    * @return the advancedPage
+    */
+   public AdvancedPage getAdvancedPage() {
+      return advancedPage;
+   }
+
+   /**
+    * @return the hostPage
+    */
+   public HostPage getHostPage() {
+      return hostPage;
+   }
+
+   /**
+    * @return the scriptPage
+    */
+   public ScriptPage getScriptPage() {
+      return scriptPage;
+   }
+
+   /**
+    * Checks that all page setting are set correctly for a script run
+    * 
+    * @return <b>True</b> if page setting are valid for script run
+    */
+   public boolean areSettingsValidForRun() {
+      boolean result = true;
+      for (TestManagerPage page : pages) {
+         result &= page.areSettingsValidForRun();
+      }
+      return result;
+   }
+
+   /**
+    * Gets page error message
+    * 
+    * @return The Page error message
+    */
+   public String getErrorMessage() {
+      StringBuilder builder = new StringBuilder();
+      for (TestManagerPage page : pages) {
+         String pageMessage = page.getErrorMessage();
+         if (Strings.isValid(pageMessage)) {
+            if (builder.length() > 0) {
+               builder.append("\n");
+            }
+            builder.append(page.getPageName());
+            builder.append(" Page:\n");
+            builder.append(pageMessage);
+            builder.append("\n");
+         }
+      }
+      return builder.toString();
+   }
+
+   public boolean onPostConnect(ConnectionEvent event) {
+      boolean problemEncountered = false;
+      for (TestManagerPage page : pages) {
+         problemEncountered |= page.onConnection(event);
+      }
+      return problemEncountered;
+   }
+
+   public boolean onPreDisconnect(ConnectionEvent event) {
+      boolean problemEncountered = false;
+      for (TestManagerPage page : pages) {
+         problemEncountered |= page.onDisconnect(event);
+      }
+      return problemEncountered;
+   }
+
+   public boolean onConnectionLost() {
+      boolean problemEncountered = false;
+      for (TestManagerPage page : pages) {
+         problemEncountered |= page.onConnectionLost();
+      }
+      return problemEncountered;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java
new file mode 100644
index 0000000..6619d21
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java
@@ -0,0 +1,593 @@
+/*******************************************************************************
+ * 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.ui.test.manager.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+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.swt.Displays;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.ui.test.manager.ITestManagerFactory;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.TestManagerStorageKeys;
+import org.eclipse.osee.ote.ui.test.manager.util.ClassServerInst;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+/**
+ * Resource Test Manager Editor Pages:
+ * <ul>
+ * <li>Overview Page
+ * <li>Target Page
+ * <li>Scripts Page
+ * <li>Advanced Page
+ * <li>Source Page
+ * </ul>
+ */
+public abstract class TestManagerEditor extends MultiPageEditorPart implements ITestConnectionListener {
+   private static final Image errorImage = ImageManager.getImage(OteTestManagerImage.ERROR);
+   public static final String namespace = "org.eclipse.osee.ote.ui.test.manager.editors.TestManagerEditor";
+
+   public final QualifiedName clearCaseViewName = new QualifiedName(namespace, "CLEARCASEVIEW");
+   public final QualifiedName configFileName = new QualifiedName(namespace, "CONFIGFILENAME");
+   public final QualifiedName ofpQualName = new QualifiedName(namespace, "OFP");
+   public final QualifiedName scriptsQualName = new QualifiedName(namespace, "SCRIPTS");
+
+   private boolean fileIsDirty = false;
+
+   private boolean fileWasSaved = false;
+
+   private int lastPageIndex = 0;
+
+   private final ITestManagerModel model;
+
+   private boolean reloadSourcePage = false;
+
+   private int scriptPageIndex = 1;
+
+   private TextEditor sourceEditor;
+
+   private int sourcePage;
+
+   private final ITestManagerFactory testManagerFactory;
+
+   private IFile thisIFile = null;
+
+   private final IPropertyStore propertyStore;
+
+   private final PageManager pageManager;
+
+   private ITestEnvironment connectedEnv = null;
+   private IServiceConnector connector = null;
+   private IHostTestEnvironment connectedHost;
+
+   public TestManagerEditor(final ITestManagerFactory testManagerFactory, ITestManagerModel model) {
+      super();
+
+      this.testManagerFactory = testManagerFactory;
+      this.pageManager = new PageManager(testManagerFactory, this);
+      this.model = model;
+      this.propertyStore = new PropertyStore(testManagerFactory.getClass().getSimpleName());
+   }
+
+   public void activateScriptsPage() {
+      setActivePage(scriptPageIndex);
+   }
+   
+
+   public void addFile(String fullPath) {
+      pageManager.getScriptPage().addFile(fullPath);
+   }
+
+   @Override
+   public void dispose() {
+      super.dispose();
+      TestManagerPlugin.getInstance().getOteClientService().removeConnectionListener(this);
+      try {
+         pageManager.dispose();
+      } catch (Throwable t) {
+         TestManagerPlugin.log(Level.SEVERE, "exception while disposing test manager", t);
+      }
+   }
+
+   /**
+    * Saves the multi-page editor's document.
+    */
+   @Override
+   public void doSave(IProgressMonitor monitor) {
+      if (getActivePage() != sourcePage) {
+         pageSourceLoad();
+      }
+      if(isDirty()){
+         getEditor(sourcePage).doSave(monitor);
+      }
+      fileIsDirty = false;
+      fileWasSaved = true;
+      doSave();
+      firePropertyChange(PROP_DIRTY);
+   }
+
+   /**
+    * Saves the multi-page editor's document as another file. Also updates the text for page 0's tab, and updates this
+    * multi-page editor's input to correspond to the nested editor's.
+    */
+   @Override
+   public void doSaveAs() {
+      if (getActivePage() != sourcePage) {
+         pageSourceLoad();
+      }
+      IEditorPart editor = getEditor(sourcePage);
+      editor.doSaveAs();
+      setPageText(sourcePage, "Source");
+      setInput(editor.getEditorInput());
+      doSave();
+   }
+
+   protected void registerPage(int pageNumber, String pageName, boolean isScriptPage) {
+      setPageText(pageNumber, pageName);
+      if(isScriptPage){
+         scriptPageIndex = pageNumber;
+      }
+   }
+
+   public void executionCompleted() {
+      pageManager.getScriptPage().onScriptRunning(false);
+   }
+
+   public void fireSaveNeeded() {
+      fileIsDirty = true;
+      firePropertyChange(PROP_DIRTY);
+   }
+
+   public String getAlternateOutputDir() {
+      String scriptOutput = "";
+
+      IPropertyStore propertyStore = getPropertyStore();
+      scriptOutput = propertyStore.get(TestManagerStorageKeys.SCRIPT_OUTPUT_DIRECTORY_KEY);
+      if (scriptOutput == null) {
+         scriptOutput = "";
+         // TODO: Escobar
+         // try {
+         // IEditorInput coreinput = getEditorInput();
+         // if (coreinput instanceof IFileEditorInput) {
+         // scriptOutput =
+         // thisIFile.getPersistentProperty(scriptOutputQualName);
+         // } else if (coreinput instanceof TestManagerInput) {
+         // TestManagerInput input = (TestManagerInput) getEditorInput();
+         // scriptOutput =
+         // input.getValue(scriptOutputQualName.getLocalName());
+         // }
+         //
+         // scriptOutput =
+         // thisIFile.getPersistentProperty(scriptOutputQualName);
+         // } catch (CoreException e) {
+         // e.printStackTrace();
+         // }
+      }
+      return scriptOutput;
+   }
+
+   public String getDefaultConfigPath() {
+      Location user = Platform.getUserLocation();
+      String path = user.getURL().getPath();
+      File file = new File(path + File.separator + "org.eclipse.osee.ote.ui.test.manager");
+      file.mkdirs();
+      file =
+         new File(
+            path + File.separator + "org.eclipse.osee.ote.ui.test.manager" + File.separator + this.getClass().getName() + ".scriptConfig.xml");
+      file.getParentFile().mkdirs();
+      return file.getAbsolutePath();
+   }
+
+   /**
+    * @return Returns the model.
+    */
+   public ITestManagerModel getModel() {
+      return model;
+   }
+
+   public String getName() {
+      return this.getTitle();
+   }
+
+   public ClassServerInst getScriptClassServer() {
+      return ClassServerInst.getInstance();
+   }
+
+   public ITestManagerFactory getTestManagerFactory() {
+      return testManagerFactory;
+   }
+
+   @Override
+   public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
+      if (!(editorInput instanceof IFileEditorInput || editorInput instanceof TestManagerInput || editorInput instanceof IEditorInput)) {
+         throw new PartInitException("Invalid Input: Must be IFileEditorInput");
+      }
+      super.init(site, editorInput);
+   }
+
+   @Override
+   public boolean isDirty() {
+      if (super.isDirty()) {
+         return true;
+      }
+      return fileIsDirty;
+   }
+
+   @Override
+   public boolean isSaveAsAllowed() {
+      return true;
+   }
+
+   /**
+    * Retrieves the value for the key. See <code>storeValue</code>. If the key could not be found, an empty string is
+    * returned.
+    * 
+    * @param key The <code>QualifiedName</code> whose value is to be retrieved.
+    * @return The value of key, or an empty string if the key does not exist.
+    */
+   public String loadValue(QualifiedName key) {
+      TestManagerPlugin.log(Level.INFO, "loadValue: " + key.getQualifier());
+      try {
+         IEditorInput coreinput = getEditorInput();
+         if (coreinput instanceof IFileEditorInput) {
+            return thisIFile.getPersistentProperty(key);
+         } else if (coreinput instanceof TestManagerInput) {
+            TestManagerInput input = (TestManagerInput) getEditorInput();
+            return input.getValue(key.getLocalName());
+         }
+      } catch (CoreException ex) {
+         TestManagerPlugin.log(Level.SEVERE, "Can't get value: " + ex);
+      }
+      return "";
+   }
+
+   public void setPageError(int page, boolean set) {
+      if (set) {
+         setPageImage(page, errorImage);
+      } else {
+         setPageImage(page, null);
+      }
+   }
+
+   /**
+    * Stores the value for the key. The key should be one of the publicly available <code>QualifiedName</code>'s in
+    * <code>this</code>.
+    * 
+    * @param key The <code>QualifiedName</code> associated with the value to be stored
+    * @param value What will be stored under the key.
+    */
+   public void storeValue(QualifiedName key, String value) {
+      TestManagerPlugin.log(Level.INFO, "storeValue: " + key.getQualifier());
+      try {
+         IEditorInput coreinput = getEditorInput();
+         if (coreinput instanceof IFileEditorInput) {
+            thisIFile.setPersistentProperty(key, value);
+         } else if (coreinput instanceof TestManagerInput) {
+            TestManagerInput input = (TestManagerInput) getEditorInput();
+            input.storeValue(key.getLocalName(), value);
+         }
+      } catch (Exception ex) {
+         TestManagerPlugin.log(Level.SEVERE, "Can't set value: " + ex);
+      }
+   }
+
+   private void pageSourceCheck() {
+      setPageError(sourcePage, model.hasParseExceptions());
+   }
+
+   private void readXmlData() {
+      TestManagerPlugin.log(Level.INFO, "readXmlData");
+      IEditorInput coreinput = getEditorInput();
+      String xmlText = "";
+      if (coreinput instanceof IFileEditorInput) {
+         IFileEditorInput input = (IFileEditorInput) getEditorInput();
+         thisIFile = input.getFile();
+         try {
+            thisIFile.refreshLocal(IResource.DEPTH_ZERO, null);
+         } catch (CoreException e) {
+            e.printStackTrace();
+         }
+         String name = thisIFile.getName();
+         this.setPartName(name);
+         if (thisIFile != null) {
+            try {
+               xmlText = Lib.inputStreamToString(thisIFile.getContents());
+            } catch (Exception ex) {
+               ex.printStackTrace();
+            }
+         } else {
+            TestManagerPlugin.log(Level.SEVERE, "Can't open xml file!");
+         }
+      } else if (coreinput instanceof TestManagerInput) {
+         TestManagerInput input = (TestManagerInput) getEditorInput();
+         String name = "TestManager";
+         this.setPartName(name);
+         xmlText = input.getDefaultXML();
+      }
+      model.setFromXml(xmlText);
+   }
+
+   /**
+    * Creates the pages of the multi-page editor.
+    */
+   @Override
+   protected void createPages() {
+      readXmlData();
+
+      pageManager.createPages(getContainer());
+      pageSourceCreate();
+
+      fileIsDirty = false;
+      reloadSourcePage = false;
+      pageSourceCheck();
+      restoreSettings();
+      
+      // If parse errors, send to sourcePage and set error on page
+      if (model.hasParseExceptions()) {
+         if (sourceEditor == null) {
+            pageSourceCreate();
+         }
+         handleSourceEditorError();
+      }
+      fileIsDirty = false;
+      firePropertyChange(PROP_DIRTY);
+      TestManagerPlugin.getInstance().getOteClientService().addConnectionListener(this);
+   }
+
+   protected void handleSelection() {
+      fireSaveNeeded();
+      reloadSourcePage = true;
+   }
+
+   /**
+    * reloads pages as necessary
+    */
+   @Override
+   protected void pageChange(int newPageIndex) {
+      // NOTE: Hosts page will be updated continuously, even it if it is not
+      // the current page.
+      // so it is unnecessary to update it on pageChange.
+
+      super.pageChange(newPageIndex);
+      if (newPageIndex == sourcePage) {
+         pageSourceLoad();
+      } else {
+         if (sourceEditor == null) {
+            return;
+         }
+         String newXml = sourceEditor.getDocumentProvider().getDocument(sourceEditor.getEditorInput()).get();
+         if (sourceEditor.isDirty() || fileWasSaved) {
+            fileWasSaved = false;
+            // If we just came from sourcePage, re-parse
+            if (lastPageIndex == sourcePage) {
+               // if parse error, goto source and error
+               if (!model.setFromXml(newXml)) {
+                  handleSourceEditorError();
+                  return;
+               }
+               setPageError(sourcePage, false);
+            }
+         }
+      }
+      doSave(null);
+      lastPageIndex = newPageIndex;
+   }
+
+   private void handleSourceEditorError() {
+      if (model.hasParseExceptions()) {
+         try {
+            setActivePage(sourcePage);
+            pageSourceCheck();
+            MessageDialog.openError(getSite().getShell(), "Source Page Error",
+               "Error parsing Source page\n  "+model.getParseError());
+            Pair<Integer, Integer> parseErrorRange = model.getParseErrorRange();
+            sourceEditor.setHighlightRange(parseErrorRange.getFirst(), parseErrorRange.getSecond(), false);
+            sourceEditor.getSelectionProvider().setSelection(new TextSelection(parseErrorRange.getFirst(), parseErrorRange.getSecond()));
+         } catch (Throwable th) {}
+      }
+   }
+
+   public void updateFromTestManagerModel() {
+      IDocument doc = sourceEditor.getDocumentProvider().getDocument(sourceEditor.getEditorInput());
+      if (!doc.get().equals(model.getRawXml())) {
+         doc.set(model.getRawXml());
+         try {
+            sourceEditor.getDocumentProvider().saveDocument(new NullProgressMonitor(), null, doc, true);
+         } catch (CoreException e) {
+            OseeLog.log(getClass(), Level.SEVERE, e);
+         }
+      }
+   }
+   
+   void pageSourceCreate() {
+      try {
+         if (getEditorInput() instanceof IFileEditorInput) {
+            sourceEditor = new TextEditor();
+            int index = addPage(sourceEditor, getEditorInput());
+            sourcePage = index;
+            setPageText(sourcePage, "Source");
+         }
+      } catch (PartInitException e) {
+         TestManagerPlugin.log(Level.SEVERE, "Error creating nested text editor", e);
+         ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus());
+      }
+   }
+
+   void pageSourceLoad() {
+      if (reloadSourcePage) {
+         sourceEditor.getDocumentProvider().getDocument(sourceEditor.getEditorInput()).set(model.getRawXml());
+         reloadSourcePage = false;
+      }
+      pageSourceCheck();
+   }
+
+   public void doSave() {
+      pageManager.save();
+      OutputStream outputStream = null;
+      try {
+         File file = OseeData.getFile("testManagerSettings.xml");
+         outputStream = new FileOutputStream(file);
+         getPropertyStore().save(outputStream);
+      } catch (Exception ex) {
+         TestManagerPlugin.log(Level.SEVERE, "Error storing settings.", ex);
+      } finally {
+         if (outputStream != null) {
+            try {
+               outputStream.close();
+            } catch (IOException ex) {
+               TestManagerPlugin.log(Level.WARNING, "Error closing stream during settings storage.", ex);
+            }
+         }
+      }
+   }
+
+   public void restoreSettings() {
+      InputStream inputStream = null;
+      try {
+         File file = OseeData.getFile("testManagerSettings.xml");
+         if(file.exists()){
+        	 inputStream = new FileInputStream(file);
+        	 getPropertyStore().load(inputStream);
+        	 pageManager.restore();
+         }
+      } catch (Exception ex) {
+         TestManagerPlugin.log(Level.WARNING, "Stored settings not available. Using defaults.", ex);
+      } finally {
+         if (inputStream != null) {
+            try {
+               inputStream.close();
+            } catch (IOException ex) {
+               TestManagerPlugin.log(Level.WARNING, "Error closing stream while loading settings.", ex);
+            }
+         }
+      }
+   }
+
+   public IPropertyStore getPropertyStore() {
+      return propertyStore;
+   }
+
+   public PageManager getPageManager() {
+      return pageManager;
+   }
+
+   @Override
+   public void onConnectionLost(IServiceConnector connector) {
+      connectedEnv = null;
+      connector = null;
+      boolean problemEncountered = pageManager.onConnectionLost();
+      if (problemEncountered) {
+         Displays.ensureInDisplayThread(new Runnable() {
+            @Override
+            public void run() {
+               MessageDialog.openError(Displays.getActiveShell(), "Disconnect Error",
+                  "Test manager has encountered a problem while processing the disconnect event. See Error Log for details");
+            }
+         });
+      }
+      connectedHost = null;
+   }
+
+   @Override
+   public void onPostConnect(ConnectionEvent event) {
+      connectedEnv = event.getEnvironment();
+      connectedHost = event.getHostEnvironment();
+      connector = event.getConnector();
+      boolean problemEncountered = pageManager.onPostConnect(event);
+      if (problemEncountered) {
+         Displays.ensureInDisplayThread(new Runnable() {
+            @Override
+            public void run() {
+               MessageDialog.openError(Displays.getActiveShell(), "Connection Error",
+                  "Test manager has encountered a problem while processing the connection event. See Error Log for details");
+            }
+         });
+      }
+   }
+
+   @Override
+   public void onPreDisconnect(ConnectionEvent event) {
+      event.getEnvironment();
+      connectedEnv = null;
+
+      connector = null;
+      boolean problemEncountered = pageManager.onPreDisconnect(event);
+      if (problemEncountered) {
+         Displays.ensureInDisplayThread(new Runnable() {
+            @Override
+            public void run() {
+               MessageDialog.openError(Displays.getActiveShell(), "Disconnect Error",
+                  "Test manager has encountered a problem while processing the disconnect event. See Error Log for details");
+            }
+         });
+      }
+      connectedHost = null;
+   }
+
+   public boolean isConnected() {
+      return connectedEnv != null;
+   }
+
+   public ITestEnvironment getConnectedEnvironment() {
+      return connectedEnv;
+   }
+
+   public IHostTestEnvironment getConnectedHostEnvironment() {
+      return connectedHost;
+   }
+
+   public IServiceConnector getConnector() {
+      return connector;
+   }
+
+   public abstract void createHostWidget(Composite parent);
+
+   public void addFiles(String[] files) {
+      pageManager.getScriptPage().addFiles(files);
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java
new file mode 100644
index 0000000..c4e4456
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * 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.ui.test.manager.core;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.ide.IDEActionFactory;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+
+/**
+ * Manages the installation/deinstallation of global actions for multi-page editors. Responsible for the redirection of
+ * global actions to the active editor. Multi-page contributor replaces the contributors for the individual editors in
+ * the multi-page editor.
+ */
+public class TestManagerEditorContributor extends MultiPageEditorActionBarContributor {
+   private IEditorPart activeEditorPart;
+
+   /**
+    * Creates a multi-page contributor.
+    */
+   public TestManagerEditorContributor() {
+      super();
+      createActions();
+   }
+
+   @Override
+   public void setActivePage(IEditorPart part) {
+      if (activeEditorPart == part) {
+         return;
+      }
+
+      activeEditorPart = part;
+
+      IActionBars actionBars = getActionBars();
+      if (actionBars != null) {
+
+         ITextEditor editor = part instanceof ITextEditor ? (ITextEditor) part : null;
+
+         actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
+            getAction(editor, ITextEditorActionConstants.DELETE));
+         actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
+            getAction(editor, ITextEditorActionConstants.UNDO));
+         actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
+            getAction(editor, ITextEditorActionConstants.REDO));
+         actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), getAction(editor, ITextEditorActionConstants.CUT));
+         actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
+            getAction(editor, ITextEditorActionConstants.COPY));
+         actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
+            getAction(editor, ITextEditorActionConstants.PASTE));
+         actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
+            getAction(editor, ITextEditorActionConstants.SELECT_ALL));
+         actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(),
+            getAction(editor, ITextEditorActionConstants.FIND));
+         actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(),
+            getAction(editor, IDEActionFactory.BOOKMARK.getId()));
+         actionBars.updateActionBars();
+      }
+   }
+
+   /**
+    * Returns the action registered with the given text editor.
+    * 
+    * @return IAction or null if editor is null.
+    */
+   protected IAction getAction(ITextEditor editor, String actionID) {
+      return editor == null ? null : editor.getAction(actionID);
+   }
+
+   private void createActions() {
+      //Left here for future actions that might want to be contributed to the status
+      //line for Test Manager.
+   }
+
+   @Override
+   public void setActiveEditor(IEditorPart part) {
+      super.setActiveEditor(part);
+
+      if (part instanceof TestManagerEditor) {
+
+         //Left here for future actions that might want to be contributed to the status
+         //line for Test Manager.
+      }
+
+   }
+
+   @Override
+   public void contributeToStatusLine(final IStatusLineManager statusLineManager) {
+      super.contributeToStatusLine(statusLineManager);
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java
new file mode 100644
index 0000000..3936ab2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * 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.ui.test.manager.core;
+
+import java.io.File;
+import java.io.InputStream;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.resources.IWorkspace;
+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.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IPersistableElement;
+
+public class TestManagerEditorInput implements IFileEditorInput, IPersistableElement {
+
+   private static final String FACTORY_ID = TestManagerEditorInputFactory.class.getCanonicalName();
+   private final IFile iFile;
+
+   public TestManagerEditorInput(File file) {
+      this(getIFile(file));
+   }
+
+   public TestManagerEditorInput(IFile iFile) {
+      super();
+      this.iFile = iFile;
+   }
+   
+   private static IFile getIFile(File file){
+      IFile ifile = AWorkspace.fileToIFile(file);
+      if(ifile == null){
+         IWorkspace workspace= ResourcesPlugin.getWorkspace();    
+         IPath location= Path.fromOSString(file.getAbsolutePath()); 
+         ifile= workspace.getRoot().getFileForLocation(location);
+      }
+      return ifile;
+   }
+
+   /*
+    * @see java.lang.Object#equals(java.lang.Object)
+    */
+   @Override
+   public boolean equals(Object o) {
+      if (o == this) {
+         return true;
+      }
+
+      if (iFile != null && o instanceof TestManagerEditorInput) {
+         TestManagerEditorInput input = (TestManagerEditorInput) o;
+         return iFile.equals(input.getFile());
+      }
+      return false;
+   }
+
+   /*
+    * @see org.eclipse.ui.IEditorInput#exists()
+    */
+   @Override
+   public boolean exists() {
+      return true;
+   }
+
+   /*
+    * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+    */
+   @Override
+   public Object getAdapter(Class adapter) {
+      return iFile.getAdapter(adapter);
+   }
+
+   @Override
+   public String getFactoryId() {
+      return FACTORY_ID;
+   }
+
+   @Override
+   public IFile getFile() {
+      return iFile;
+   }
+
+   /*
+    * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+    */
+   @Override
+   public ImageDescriptor getImageDescriptor() {
+      return null;
+   }
+
+   // /*
+   // * @see org.eclipse.ui.editors.text.ILocationProvider#getPath(java.lang.Object)
+   // */
+   // public IPath getPath(Object element) {
+   // if (element instanceof NonExistingFileEditorInput) {
+   // NonExistingFileEditorInput input= (NonExistingFileEditorInput) element;
+   // return Path.fromOSString(input.fFile.getAbsolutePath());
+   // }
+   // return null;
+   // }
+
+   /*
+    * @see org.eclipse.ui.IEditorInput#getName()
+    */
+   @Override
+   public String getName() {
+      if(iFile == null){
+         return "TestManager";
+      }
+      return iFile.getName();
+   }
+
+   /*
+    * @see org.eclipse.ui.IEditorInput#getPersistable()
+    */
+   @Override
+   public IPersistableElement getPersistable() {
+      return this;
+   }
+
+   @Override
+   public IStorage getStorage() throws CoreException {
+      return new IStorage() {
+
+         @Override
+         public Object getAdapter(Class adapter) {
+            return iFile.getAdapter(adapter);
+         }
+
+         @Override
+         public InputStream getContents() throws CoreException {
+            return iFile.getContents();
+         }
+
+         @Override
+         public IPath getFullPath() {
+            return iFile.getFullPath();
+         }
+
+         @Override
+         public String getName() {
+            return iFile.getName();
+         }
+
+         @Override
+         public boolean isReadOnly() {
+            return false;
+         }
+
+      };
+   }
+
+   /*
+    * @see org.eclipse.ui.IEditorInput#getToolTipText()
+    */
+   @Override
+   public String getToolTipText() {
+      return iFile.getName();
+   }
+
+   /*
+    * @see java.lang.Object#hashCode()
+    */
+   @Override
+   public int hashCode() {
+      return iFile.hashCode();
+   }
+
+   @Override
+   public void saveState(IMemento memento) {
+      if (iFile != null && iFile.getLocation().toFile().exists()) {
+         memento.putString("path", iFile.getLocation().toFile().getAbsolutePath());
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java
new file mode 100644
index 0000000..6eefd9b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.ui.test.manager.core;
+
+import java.io.File;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IMemento;
+
+public class TestManagerEditorInputFactory implements IElementFactory {
+
+   public TestManagerEditorInputFactory() {
+   }
+
+   @Override
+   public IAdaptable createElement(IMemento memento) {
+      String path = memento.getString("path");
+      if(path != null){
+         File file = new File(path);
+         TestManagerEditorInput input = new TestManagerEditorInput(file);
+         return input;
+      } else {
+         return null;
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java
new file mode 100644
index 0000000..eb96246
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * 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.ui.test.manager.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class TestManagerInput implements IEditorInput {
+   private final HashMap<String, String> keyValue;
+
+   public TestManagerInput() {
+      keyValue = new HashMap<>();
+      loadFromFile();
+   }
+
+   @Override
+   public boolean equals(Object object) {
+      if (object instanceof TestManagerInput) {
+         return true;
+      }
+      return false;
+   }
+
+   @Override
+   public boolean exists() {
+      return false;
+   }
+
+   @Override
+   public Object getAdapter(Class adapter) {
+      return null;
+   }
+
+   public String getDefaultXML() {
+      return "<testManager>" + "<contact></contact>" + "<description>Test Manager</description>" + 
+   "<distributionStatement></distributionStatement>" + "</testManager>";
+
+   }
+
+   @Override
+   public ImageDescriptor getImageDescriptor() {
+      return null;
+   }
+
+   @Override
+   public String getName() {
+      return "TestManager";
+   }
+
+   @Override
+   public IPersistableElement getPersistable() {
+      return null;
+   }
+
+   @Override
+   public String getToolTipText() {
+      return "OSEE TestManager";
+   }
+
+   public String getValue(String key) {
+      return keyValue.get(key);
+   }
+
+   public void storeValue(String key, String value) throws ParserConfigurationException, TransformerException, IOException {
+      keyValue.put(key, value);
+      saveToFile();
+   }
+
+   private File getFile() {
+      Location user = Platform.getUserLocation();
+      String path = user.getURL().getPath();
+      File file =
+         new File(
+            path + File.separator + "org.eclipse.osee.ote.ui.test.manager" + File.separator + this.getClass().getName() + ".xml");
+      file.getParentFile().mkdirs();
+      return file;
+   }
+
+   private void loadFromFile() {
+      keyValue.clear();
+      Document document;
+      try {
+         document = Jaxp.readXmlDocument(getFile());
+         NodeList viewList = document.getElementsByTagName("Pair");
+         for (int index = 0; index < viewList.getLength(); index++) {
+            Node node = viewList.item(index);
+            if (node != null && node instanceof Element) {
+               Element element = (Element) node;
+               String key = Jaxp.getChildText(element, "Key");
+               String value = Jaxp.getChildText(element, "Value");
+               if (key != null && value != null && !key.equals("") && !value.equals("")) {
+                  keyValue.put(key, value);
+               }
+            }
+         }
+      } catch (Exception ex) {
+         OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+      }
+   }
+
+   private void saveToFile() throws ParserConfigurationException, TransformerException, IOException {
+      Document document = Jaxp.newDocumentNamespaceAware();
+      Element root = document.createElement("ValuePairs");
+      document.appendChild(root);
+
+      Iterator<String> it = keyValue.keySet().iterator();
+      while (it.hasNext()) {
+         String key = it.next();
+         String value = keyValue.get(key);
+         if (key != null && value != null && !key.equals("") && !value.equals("")) {
+            Element pair = document.createElement("Pair");
+
+            Element keyElement = document.createElement("Key");
+            keyElement.setTextContent(key);
+            pair.appendChild(keyElement);
+
+            Element valueElement = document.createElement("Value");
+            valueElement.setTextContent(value);
+            pair.appendChild(valueElement);
+            root.appendChild(pair);
+         }
+      }
+
+      Jaxp.writeXmlDocument(document, getFile(), Jaxp.getPrettyFormat());
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/ServiceUtility.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/ServiceUtility.java
new file mode 100644
index 0000000..c990a10
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/ServiceUtility.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * 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.ui.test.manager.internal;
+
+import org.eclipse.osee.ote.version.FileVersionInformation;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class ServiceUtility {
+
+	public static FileVersionInformation getFileVersionInformation(){
+		return getService(FileVersionInformation.class);
+	}
+	
+	public static Class<ServiceUtility> getClazz(){
+		return ServiceUtility.class;
+	}
+
+	public static <T> T getService(Class<T> clazz){
+		BundleContext context = getContext();
+		if(context == null){
+			return null;
+		}
+		ServiceReference serviceReference = context.getServiceReference(clazz.getName());
+		if(serviceReference == null){
+			return null;
+		}
+		return (T)getContext().getService(serviceReference);
+	}
+
+	public static <T> T[] getServices(Class<T> clazz) throws InvalidSyntaxException{
+		ServiceReference[] serviceReferences = getContext().getServiceReferences(clazz.getName(), null);
+		T[] data = (T[])new Object[serviceReferences.length];
+		for(int i = 0; i < serviceReferences.length; i ++){
+			data[i] = (T)getContext().getService(serviceReferences[i]);
+		}
+		return data;
+	}
+
+	public static BundleContext getContext(){
+		return FrameworkUtil.getBundle(getClazz()).getBundleContext();
+	}
+}
+
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/TestManagerPlugin.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/TestManagerPlugin.java
new file mode 100644
index 0000000..4c5413f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/TestManagerPlugin.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.ui.test.manager.internal;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.ui.IOteConsoleService;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class TestManagerPlugin extends OseeUiActivator {
+   private static TestManagerPlugin pluginInstance; // The shared instance.
+   public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.test.manager";
+
+   private static String username = null;
+
+   private ServiceTracker oteClientServiceTracker;
+   private ServiceTracker oteConsoleServiceTracker;
+
+   /**
+    * Returns the shared instance.
+    */
+   public static TestManagerPlugin getInstance() {
+      return pluginInstance;
+   }
+
+   public static String getUsername() {
+      if (username == null) {
+         username = java.lang.System.getProperty("user.name");
+         username = username.replaceAll("b", "");
+         if (username.length() == 6) {
+            username = "0" + username;
+         }
+      }
+      return username;
+   }
+
+   /**
+    * The constructor.
+    */
+   public TestManagerPlugin() {
+      super(PLUGIN_ID);
+      pluginInstance = this;
+   }
+
+   @Override
+   public void start(BundleContext context) throws Exception {
+      super.start(context);
+      oteClientServiceTracker = new ServiceTracker(context, IOteClientService.class.getName(), null);
+      oteClientServiceTracker.open();
+
+      oteConsoleServiceTracker = new ServiceTracker(context, IOteConsoleService.class.getName(), null);
+      oteConsoleServiceTracker.open();
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      if (oteConsoleServiceTracker != null) {
+         oteConsoleServiceTracker.close();
+      }
+      if (oteClientServiceTracker != null) {
+         oteClientServiceTracker.close();
+      }
+      super.stop(context);
+   }
+
+   public IOteClientService getOteClientService() {
+      return (IOteClientService) oteClientServiceTracker.getService();
+   }
+
+   public IOteConsoleService getOteConsoleService() {
+      return (IOteConsoleService) oteConsoleServiceTracker.getService();
+   }
+
+   public static void log(Level level, String message, Throwable t) {
+      OseeLog.log(TestManagerPlugin.class, level, message, t);
+   }
+
+   public static void log(Level level, String message) {
+      log(level, message, null);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java
new file mode 100644
index 0000000..8cd6db9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * 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.ui.test.manager.jobs;
+
+import java.io.File;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ScriptRunJob extends Job {
+   private static final String JOB_NAME = "Script Run Job";
+
+   private final TestManagerEditor testManagerEditor;
+   private final List<ScriptTask> runTasks;
+
+   public ScriptRunJob(TestManagerEditor testManagerEditor) {
+      super(JOB_NAME);
+      this.testManagerEditor = testManagerEditor;
+      this.testManagerEditor.doSave();
+      ScriptPage scriptPage = getScriptPage();
+      scriptPage.getScriptTableViewer().refresh();
+      this.runTasks = scriptPage.getScriptTableViewer().getRunTasks();
+   }
+
+   public IStatus verifyOutfileLocations() {
+      final LinkedList<IStatus> failedLocations = new LinkedList<>();
+      for (ScriptTask task : runTasks) {
+         final String fileName = task.getScriptModel().getOutputModel().getRawFilename();
+         final File file = new File(fileName);
+         if (file.exists() && (!file.canWrite() || !file.canRead())) {
+            failedLocations.add(new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "could not access " + fileName));
+         } else if (!file.getParentFile().canWrite()) {
+            failedLocations.add(new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "could not access " + fileName));
+         }
+      }
+      if (failedLocations.isEmpty()) {
+         return Status.OK_STATUS;
+      } else {
+         return new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "unable to access out files") {
+
+            @Override
+            public boolean isMultiStatus() {
+               return true;
+            }
+
+            @Override
+            public IStatus[] getChildren() {
+               return failedLocations.toArray(new IStatus[failedLocations.size()]);
+            }
+
+         };
+      }
+   }
+
+   @Override
+   public IStatus run(IProgressMonitor monitor) {
+      IStatus toReturn = Status.CANCEL_STATUS;
+      final IStatus status = verifyOutfileLocations();
+
+      if (status != Status.OK_STATUS) {
+         Displays.pendInDisplayThread(new Runnable() {
+            @Override
+            public void run() {
+               ErrorDialog.openError(
+                  Displays.getActiveShell(),
+                  "Script Run Error",
+                  "Could not access some out file locations. Check access permissions. Click Details to see a list of failed locations",
+                  status, -1);
+            }
+
+         });
+
+         return Status.OK_STATUS;
+      }
+
+      long time = System.currentTimeMillis();
+
+      clearMarkers();
+      getScriptPage().onScriptRunning(true);
+
+      long elapsed = System.currentTimeMillis() - time;
+      OseeLog.logf(TestManagerPlugin.class, Level.FINE,
+         "%d milliseconds to initialize the running of scripts.", elapsed);
+      OseeLog.logf(TestManagerPlugin.class, Level.INFO, "%d scripts have been batched.", runTasks.size());
+
+      Displays.pendInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            getScriptPage().getScriptManager().addTestsToQueue(runTasks);
+         }
+
+      });
+      toReturn = Status.OK_STATUS;
+      return toReturn;
+   }
+
+   private ScriptPage getScriptPage() {
+      return this.testManagerEditor.getPageManager().getScriptPage();
+   }
+
+   public boolean isRunAllowed() {
+
+      return this.testManagerEditor.getPageManager().areSettingsValidForRun();
+
+   }
+   
+   public String getErrorMessage() {
+	   return this.testManagerEditor.getPageManager().getErrorMessage();
+   }
+
+   private void clearMarkers() {
+      // TODO can we somehow wait until the script is actually run to remove
+      // the markers? Otherwise if the run is aborted before the script
+      // runs...
+
+      // Remove markers from scripts to be run
+      // for (ScriptTask task : runTasks) {
+      // try {
+      // MarkerSupport.deleteMarkersFromInputFile(task.getScriptModel().getIFile());
+      // }
+      // catch (Exception ex) {
+      // OseeLog.log(Activator.class, Level.SEVERE, "Unable to clear the tests markers before
+      // running the test.", ex);
+      // }
+      // }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java
new file mode 100644
index 0000000..488c64d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * 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.ui.test.manager.jobs;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.AIFile;
+import org.eclipse.osee.framework.ui.plugin.util.OseeConsole;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.ui.markers.MarkerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModel;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.TestManagerStorageKeys;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StoreOutfileJob extends Job {
+
+   private final ScriptManager userEnvironment;
+   private final ScriptTask scriptTask;
+   private final boolean isValidRun;
+   private final TestManagerEditor testManagerEditor;
+   private final ITestEnvironment env;
+
+   private final String clientOutfilePath;
+
+   private final String serverOutfilePath;
+
+   public StoreOutfileJob(ITestEnvironment env, TestManagerEditor testManagerEditor, ScriptManager userEnvironment, ScriptTask scriptTask, String clientOutfilePath, String serverOutfilePath, boolean isValidRun) {
+      super("Store: " + scriptTask.getName());
+      this.env = env;
+      this.scriptTask = scriptTask;
+      this.testManagerEditor = testManagerEditor;
+      this.userEnvironment = userEnvironment;
+      this.isValidRun = isValidRun;
+      this.clientOutfilePath = clientOutfilePath;
+      this.serverOutfilePath = serverOutfilePath;
+   }
+
+   public static void scheduleJob(Job job) {
+      job.setUser(false);
+      job.setPriority(Job.SHORT);
+      job.schedule();
+   }
+
+   @Override
+   protected IStatus run(IProgressMonitor monitor) {
+      try {
+         if (isValidRun == true) {
+            try {
+               storeOutfile(scriptTask);
+            } catch (Exception e) {
+               return new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "Failed to write out file to workspace",
+                  e);
+            }
+         }
+         //         scriptTask.computeExists();
+         userEnvironment.updateScriptTableViewer(scriptTask);
+         try {
+            Thread.sleep(2000);
+         } catch (InterruptedException e) {
+            e.printStackTrace();
+         }
+         processOutFile(scriptTask);
+      } catch (Exception ex) {
+         OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+      }
+      return Status.OK_STATUS;
+   }
+
+   public void processOutFile(ScriptTask task) {
+      OseeLog.log(TestManagerPlugin.class, Level.INFO, "Processing Outfile: " + task.getName());
+      //      task.computeExists();
+      File xmlSourceFile = task.getScriptModel().getOutputModel().getFile();
+      IFile javaSourceIFile = task.getScriptModel().getIFile();
+
+      if (!xmlSourceFile.exists()) {
+         TestManagerPlugin.getInstance().getOteConsoleService().writeError("Output File Not Created");
+      } else {
+         // Refresh the parent so the workspace knows the new tmo file exists
+         AWorkspace.refreshResource(javaSourceIFile);
+         task.getScriptModel().getOutputModel().updateTestPointsFromOutfile();
+         int failedPoints = task.getScriptModel().getOutputModel().getFailedTestPoints();
+         userEnvironment.updateScriptTableViewer(scriptTask);
+         if (failedPoints > 0) {
+            // Print fails in red, but don't force the console to popup
+            TestManagerPlugin.getInstance().getOteConsoleService().write(
+               String.format("Test Point Failures => %s[%d]", task.getName(), failedPoints), OseeConsole.CONSOLE_ERROR,
+               false);
+         }
+      }
+   }
+
+   private boolean isKeepSavedOutfileEnabled() {
+      return testManagerEditor.getPropertyStore().getBoolean(
+         TestManagerStorageKeys.KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY);
+   }
+
+   private void storeOutfile(ScriptTask scriptTask) throws Exception {
+      if (clientOutfilePath.equals(serverOutfilePath) != true) {
+         // the paths are different so we need to copy the file
+         byte[] outBytes = env.getScriptOutfile(serverOutfilePath);
+         if (outBytes != null && outBytes.length > 0) {
+
+            if (isKeepSavedOutfileEnabled()) {
+               moveOutputToNextAvailableSpot(scriptTask);
+            }
+            IFile file = null;
+            IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(
+               org.eclipse.core.filesystem.URIUtil.toURI(clientOutfilePath));
+            if (files.length > 0) {
+               file = files[0];
+            }
+            if (file != null) {
+               AIFile.writeToFile(file, new ByteArrayInputStream(outBytes));
+               MarkerPlugin.addMarkers(file);
+            } else {
+               Lib.writeBytesToFile(outBytes, new File(clientOutfilePath));
+            }
+         }
+      }
+   }
+
+   private void moveOutputToNextAvailableSpot(ScriptTask task) {
+      OutputModel outputModel = task.getScriptModel().getOutputModel();
+      File oldFile = outputModel.getFile();
+      if (oldFile != null && oldFile.exists() && oldFile.isFile() && oldFile.canRead()) {
+         String outputExtension = "." + outputModel.getFileExtension();
+         String extensionRegex = "\\" + outputExtension + "\\b";//escape the . and should be the end of the string (word b
+         int fileNum = 1;
+         File destFile = new File(
+            oldFile.getAbsoluteFile().toString().replaceFirst(extensionRegex, "." + fileNum + outputExtension));
+         if (destFile.exists()) {
+            while (destFile.exists()) {
+               fileNum++;
+               destFile = new File(
+                  oldFile.getAbsoluteFile().toString().replaceFirst(extensionRegex, "." + fileNum + outputExtension));
+            }
+         }
+         try {
+            Lib.copyFile(oldFile, destFile);
+         } catch (IOException e2) {
+            OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "Failed to move output file to next available spot", e2);
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java
new file mode 100644
index 0000000..17ad692
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * 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.ui.test.manager.models;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+public class FileModel {
+
+   private File file = null;
+   private IFile iFile = null;
+   private long lastModified = 0;
+   private String path = "";
+   private String rawFilename = "";
+   private String text = null;
+
+   public FileModel(String rawFilename) {
+      this.rawFilename = rawFilename;
+      if (getIFile() != null) {
+         lastModified = getIFile().getModificationStamp();
+      }
+   }
+
+   public boolean exists() {
+      return getFile().exists();
+   }
+
+   /**
+    * @return Returns the file.
+    */
+   public File getFile() {
+      if (file == null) {
+         file = new File(rawFilename);
+      }
+      return file;
+   }
+
+   /**
+    * @return Returns the iFile for the given local data {@link #rawFilename}.  You may still have to check if the file actually exists.
+    */
+   public IFile getIFile() {
+      if (iFile == null) {
+         if (path.equals("")) {
+            if (!rawFilename.equals("")) {
+               iFile = AWorkspace.getIFile(rawFilename);
+               if(iFile == null){
+                  IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(org.eclipse.core.filesystem.URIUtil.toURI(rawFilename));
+                  if(files.length > 0){
+                     iFile = files[0];                     
+                  }
+               }
+            }
+         }
+      }
+      return iFile;
+   }
+
+   /**
+    * @return Returns the name.
+    */
+   public String getName() {
+      return new File(rawFilename).getName();
+   }
+
+   /**
+    * @return Returns the path.
+    */
+   public String getPath() {
+      if (iFile == null) {
+         iFile = getIFile();
+      }
+      if (iFile != null) {
+         path = iFile.getFullPath().toString();
+      }
+      return path;
+   }
+
+   /**
+    * @return Returns the rawFilename.
+    */
+   public String getRawFilename() {
+      return rawFilename;
+   }
+
+   public String getWorkspaceRelativePath() {
+      IWorkspace ws = ResourcesPlugin.getWorkspace();
+      IFile ifile = ws.getRoot().getFileForLocation(new Path(rawFilename));
+      if(ifile == null){
+         IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(org.eclipse.core.filesystem.URIUtil.toURI(rawFilename));
+         if(files.length > 0){
+            ifile = files[0];
+         }
+      }
+      if (!ifile.exists()) {
+         return null;
+      } else {
+         return ifile.getFullPath().toString();
+      }
+   }
+
+   public String getText() throws IOException {
+      if (iFile == null) {
+         getIFile();
+      }
+      if (iFile == null) {
+         return "";
+      }
+      if (text == null || iFile.getModificationStamp() != lastModified) {
+         text = Lib.fileToString(new File(rawFilename));
+         OseeLog.log(TestManagerPlugin.class, Level.INFO, "getText: Reading file " + getName());
+      } else {
+         OseeLog.log(TestManagerPlugin.class, Level.INFO, "getText: Using buffered file " + getName());
+      }
+      lastModified = iFile.getModificationStamp();
+      return text;
+   }
+
+   public boolean isModified() {
+      if (iFile == null) {
+         getIFile();
+      }
+      if (iFile == null) {
+         OseeLog.log(TestManagerPlugin.class, Level.WARNING, "Can't Read iFile");
+         return true;
+      }
+      return iFile.getModificationStamp() != lastModified;
+   }
+
+   public void openEditor() {
+      if (getIFile() != null) {
+         AWorkspace.openEditor(getIFile());
+      } else {
+         IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(file.getAbsolutePath()));
+         IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+         try {
+            IDE.openEditorOnFileStore(page, fileStore);
+         } catch (PartInitException e) {
+            e.printStackTrace();
+         }         
+      }
+   }
+
+   public void openPackageExplorer() {
+      OseeLog.log(TestManagerPlugin.class, Level.INFO, "Show in explorer " + getName());
+      // Open in Package Explorer and error if can't
+      boolean success = AWorkspace.showInPackageExplorer(getIFile());
+      //      if(!success){
+      //         success = AWorkspace.showInResourceNavigator(getIFile());
+      //      }
+      if (!success) {
+         MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Open Error",
+            "Can't Show in Explorer\n\n" + getName());
+      }
+      // As a convenience, open in Navigator, but don't error
+      success = AWorkspace.showInResourceNavigator(getIFile());
+   }
+
+   /**
+    * @param path The path to set.
+    */
+   public void setPath(String path) {
+      this.path = path;
+   }
+
+   /**
+    * @param rawFilename The rawFilename to set.
+    */
+   public void setRawFilename(String rawFilename) {
+      this.rawFilename = rawFilename;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.java
new file mode 100644
index 0000000..646594b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.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.ui.test.manager.models;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * Base Class for all TestManagers
+ */
+public class OutputModel extends FileModel {
+
+   private static final String OUTPUT_EXTENSION = "tmo";
+
+   private int failedTestPoints = 0;
+   private int passedTestPoints = 0;
+   private boolean aborted = false;
+   private boolean exists = false;
+
+   public OutputModel(String rawFilename) {
+      super(rawFilename);
+   }
+
+   public boolean doesOutfileExist() {
+      return exists;
+   }
+
+   public void updateTestPointsFromOutfile() {
+      try {
+         File outfile = getFile();
+         exists = outfile.exists();
+         if (outfile.exists() && outfile.length() > 0) {
+            XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+            xmlReader.setContentHandler(new ParseTestPoints());
+            xmlReader.parse(new InputSource(new FileInputStream(outfile)));
+         }
+      } catch (Exception ex) {
+         OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+      }
+   }
+
+   public int getFailedTestPoints() {
+      return failedTestPoints;
+   }
+
+   public int getPassedTestPoints() {
+      return passedTestPoints;
+   }
+
+   public void setFailedTestPoints(int failedTestPoints) {
+      this.failedTestPoints = failedTestPoints;
+   }
+
+   public void setPassedTestPoints(int passedTestPoints) {
+      this.passedTestPoints = passedTestPoints;
+   }
+
+   private class ParseTestPoints extends AbstractSaxHandler {
+
+      @Override
+      public void endElementFound(String uri, String localName, String name) throws SAXException {
+      }
+
+      @Override
+      public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+         if ("TestPointResults".equals(name)) {
+            String fail = attributes.getValue("fail");
+            String pass = attributes.getValue("pass");
+            String aborted = attributes.getValue("aborted");
+            try {
+               failedTestPoints = Integer.parseInt(fail);
+               passedTestPoints = Integer.parseInt(pass);
+               if (aborted != null && aborted.length() > 0) {
+                  OutputModel.this.aborted = Boolean.parseBoolean(aborted);
+               }
+            } catch (NumberFormatException ex) {
+
+            }
+         }
+      }
+   }
+
+   public String getFileExtension() {
+      return OUTPUT_EXTENSION;
+   }
+
+   public boolean isAborted() {
+      return aborted;
+   }
+
+   public void setAborted(boolean b) {
+      aborted = b;
+
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.done b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.done
new file mode 100644
index 0000000..bc716d4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.done
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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.ui.test.manager.models;
+
+import java.util.concurrent.ConcurrentLinkedQueue;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author b1528444
+ *
+ */
+public class OutputModelJob extends Job {
+
+   private static OutputModelJob singleton = null;
+   private ScriptManager scriptManager;
+   private ConcurrentLinkedQueue<ScriptTask> outputModels = new ConcurrentLinkedQueue<ScriptTask>(); 
+   
+   
+   public static void createSingleton(ScriptManager scriptManager){
+      if(singleton == null){
+         singleton = new OutputModelJob(scriptManager);
+      }
+   }
+   
+   public static OutputModelJob getSingleton(){
+      return singleton;
+   }
+   
+   /**
+    * @param name
+    */
+   private OutputModelJob(ScriptManager scriptManager) {
+      super("Parsing OTE Output File");
+      setUser(false);
+      this.scriptManager = scriptManager;
+   }
+
+   /* (non-Javadoc)
+    * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+    */
+   @Override
+   protected IStatus run(IProgressMonitor monitor) {
+      while(!outputModels.isEmpty()){
+         ScriptTask task = outputModels.remove();
+         task.getScriptModel().getOutputModel().updateTestPointsFromOutfile();
+         task.getPassFail();
+         scriptManager.updateScriptTableViewerTimed(task);
+      }
+      return Status.OK_STATUS;
+   }
+   
+   public void addTask(ScriptTask task){
+      outputModels.add(task);
+      schedule();
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.java
new file mode 100644
index 0000000..b7bce05
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * 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.ui.test.manager.models;
+
+import java.util.concurrent.ConcurrentLinkedQueue;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OutputModelJob extends Job {
+
+   private static OutputModelJob singleton = null;
+   private final ScriptManager scriptManager;
+   private final ConcurrentLinkedQueue<ScriptTask> outputModels = new ConcurrentLinkedQueue<>();
+
+   public static void createSingleton(ScriptManager scriptManager) {
+      if (singleton == null) {
+         singleton = new OutputModelJob(scriptManager);
+      }
+   }
+
+   public static OutputModelJob getSingleton() {
+      return singleton;
+   }
+
+   private OutputModelJob(ScriptManager scriptManager) {
+      super("Parsing OTE Output File");
+      setUser(false);
+      this.scriptManager = scriptManager;
+   }
+
+   @Override
+   protected IStatus run(IProgressMonitor monitor) {
+      while (!outputModels.isEmpty()) {
+         ScriptTask task = outputModels.remove();
+         task.getScriptModel().getOutputModel().updateTestPointsFromOutfile();
+         task.getPassFail();
+         scriptManager.updateScriptTableViewerTimed(task);
+      }
+      return Status.OK_STATUS;
+   }
+
+   public void addTask(ScriptTask task) {
+      outputModels.add(task);
+      schedule();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java
new file mode 100644
index 0000000..fd8206d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * 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.ui.test.manager.models;
+
+import java.io.File;
+import org.eclipse.core.filebuffers.manipulation.ContainerCreator;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.ws.AJavaProject;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.config.ScriptVersionConfig;
+import org.eclipse.osee.ote.version.FileVersion;
+
+public class ScriptModel extends FileModel {
+
+   public enum ScriptInteractionEnum {
+      BATCH,
+      MANUAL,
+      UNKNOWN
+   }
+
+   public class TestFileData {
+      public String absoluteFilePath = null;
+      public String classPath = null;
+      public String error = "";
+      public String name = null;
+      public String outFile = null;
+      public String projectPath = null;
+      public String rawFileName;
+
+      public ScriptVersionConfig getVersionInfo(FileVersion version) {
+    	  ScriptVersionConfig scriptVersion = new ScriptVersionConfig();
+    	  if (version != null) {
+    		  scriptVersion.setLastChangedRevision(version.getLastChangedRevision());
+    		  scriptVersion.setLocation(version.getURL());
+    		  scriptVersion.setRepositoryType(version.getVersionControlSystem());
+    		  scriptVersion.setLastAuthor(version.getLastAuthor());
+    		  scriptVersion.setLastModificationDate(version.getLastModificationDate());
+    		  scriptVersion.setModifiedFlag(version.getModifiedFlag());
+    	  }
+    	  return scriptVersion;
+      }
+   }
+
+   private TestFileData javaFileData;
+   private OutputModel outputModel;
+   private TestScript testScript;
+
+   /**
+    * @param outputDir alternate output directory for tmo output files null will default to script directory
+    */
+   public ScriptModel(String rawFilename, String outputDir) {
+      super(rawFilename);
+      javaFileData = new TestFileData();
+      javaFileData = getSunData(outputDir);
+      javaFileData.rawFileName = rawFilename;
+      outputModel = new OutputModel(javaFileData.outFile);
+   }
+
+   public ScriptInteractionEnum getInteraction() {
+      if (testScript == null) {
+         return ScriptInteractionEnum.UNKNOWN;
+      }
+      if (testScript.isBatchable()) {
+         return ScriptInteractionEnum.BATCH;
+      } else {
+         return ScriptInteractionEnum.MANUAL;
+      }
+   }
+
+   /**
+    * @return Returns the outputModel.
+    */
+   public OutputModel getOutputModel() {
+      outputModel.setRawFilename(javaFileData.outFile);
+      return outputModel;
+
+   }
+
+   /**
+    * @param alternateOutputDir place output files here instead of at location of the script
+    * @return Returns sun data.
+    */
+   private TestFileData getSunData(String alternateOutputDir) {
+      javaFileData.absoluteFilePath = getRawFilename();
+      String temp = null;
+      if (javaFileData.absoluteFilePath.endsWith(".java")) {
+         temp = AJavaProject.getClassName(this.getRawFilename());
+      }
+      javaFileData.name = temp == null ? new File(getRawFilename()).getName() : temp;
+      javaFileData.classPath = "";
+      alternateOutputDir = alternateOutputDir.trim();
+      if (!Strings.isValid(alternateOutputDir)) {
+         javaFileData.outFile = javaFileData.absoluteFilePath.replaceFirst(".java$", ".tmo");
+         if (!javaFileData.outFile.endsWith(".tmo")) {
+            javaFileData.outFile += ".tmo";
+         }
+      } else {
+         try {
+            File dir = new File(alternateOutputDir);
+            if (dir.exists() && dir.isDirectory()) {
+               javaFileData.outFile = alternateOutputDir;
+            } else {
+               if (getIFile() != null) {
+                  IProject project = getIFile().getProject();
+                  IFolder folder = project.getFolder(alternateOutputDir);
+                  if (!folder.exists()) {
+                     ContainerCreator containerCreator =
+                        new ContainerCreator(folder.getWorkspace(), folder.getFullPath());
+                     containerCreator.createContainer(new NullProgressMonitor());
+                  }
+                  javaFileData.outFile = folder.getLocation().toFile().getAbsolutePath();
+               }
+            }
+
+            javaFileData.outFile += File.separator;
+            javaFileData.outFile += getName();
+            javaFileData.outFile = javaFileData.outFile.replaceFirst(".java$", ".tmo");
+            if (!javaFileData.outFile.endsWith(".tmo")) {
+               javaFileData.outFile += ".tmo";
+            }
+         } catch (CoreException ex) {
+            ex.printStackTrace();
+            javaFileData.outFile = javaFileData.absoluteFilePath.replaceFirst(".java$", ".tmo");
+            if (!javaFileData.outFile.endsWith(".tmo")) {
+               javaFileData.outFile += ".tmo";
+            }
+         }
+      }
+      //		outputModel = new OutputModel(javaFileData.outFile);
+
+      //		OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.absoluteJavaPath *"+ javaFileData.absoluteFilePath + "*");
+      //	   OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.className *" + javaFileData.name + "*");
+      //	   OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.classPath *" + javaFileData.classPath + "*");
+      //		OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.outFile *" + javaFileData.outFile+ "*");
+
+      return javaFileData;
+   }
+
+   public TestFileData updateScriptModelInfo(String alternateOutputDir) {
+      TestFileData javaFileData = getSunData(alternateOutputDir);
+      outputModel = new OutputModel(javaFileData.outFile);
+      return javaFileData;
+   }
+
+   public String getTestClass() {
+      return javaFileData.name;
+   }
+
+   /**
+    * @param outputModel The outputModel to set.
+    */
+   public void setOutputModel(OutputModel outputModel) {
+      this.outputModel = outputModel;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java
new file mode 100644
index 0000000..359579e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * 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.ui.test.manager.operations;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.util.PluginUtil;
+import org.eclipse.osee.ote.ui.test.manager.util.TestManagerSelectDialog;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AddIFileToTestManager {
+   private static AddIFileToTestManager instance = null;
+
+   private AddIFileToTestManager() {
+   }
+
+   public static AddIFileToTestManager getOperation() {
+      if (instance == null) {
+         instance = new AddIFileToTestManager();
+      }
+      return instance;
+   }
+
+   public void removeAllScriptsFromPage() {
+      if (PluginUtil.areTestManagersAvailable() != true) {
+         AWorkbench.popup("ERROR", "Test Manager Not Opened");
+         return;
+      }
+      for (TestManagerEditor editor : PluginUtil.getTestManagers()) {
+         editor.getPageManager().getScriptPage().getScriptTableViewer().getTaskList().removeAllTasks();
+      }
+   }
+
+   public void addFilesToScriptPage(List<String> files, boolean removeOtherScripts) {
+      if (PluginUtil.areTestManagersAvailable() != true) {
+         AWorkbench.popup("ERROR", "Test Manager Not Opened");
+         return;
+      }
+      TestManagerEditor[] itemsToOpen = PluginUtil.getTestManagers();
+      for (TestManagerEditor tme : itemsToOpen) {
+         if (removeOtherScripts) {
+            tme.getPageManager().getScriptPage().getScriptTableViewer().getTaskList().removeAllTasks();
+         }
+         tme.addFiles(files.toArray(new String[files.size()]));
+      }
+   }
+
+   public void addIFileToScriptsPage(String[] fullPath) {
+      if (PluginUtil.areTestManagersAvailable() != true) {
+         AWorkbench.popup("ERROR", "Test Manager Not Opened");
+         return;
+      }
+      TestManagerEditor[] itemsToOpen = PluginUtil.getTestManagers();
+      if (itemsToOpen.length > 1) {
+         TestManagerEditor[] selected = TestManagerSelectDialog.getTestManagerFromUser();
+         if (selected.length > 0) {
+        	for(int i = 0; i < fullPath.length; i++){
+        		handleItemsSelected(itemsToOpen, fullPath[i]);
+        	}
+         }
+      } else {
+    	  for(int i = 0; i < fullPath.length; i++){
+    		  handleItemsSelected(itemsToOpen, fullPath[i]);
+    	  }
+      }
+   }
+
+   private void handleItemsSelected(TestManagerEditor[] items, String fullPath) {
+      for (TestManagerEditor tme : items) {
+         tme.addFile(fullPath);
+      }
+      openFirstItemSelected(items);
+   }
+
+   private void openFirstItemSelected(TestManagerEditor[] items) {
+      // Show first Test Manager Editor
+      TestManagerEditor tme = items[0];
+      IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+      page.activate(tme.getSite().getPart());
+      tme.activateScriptsPage();
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java
new file mode 100644
index 0000000..0e3880c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.framework.ui.plugin.widgets.IPropertyStoreBasedControl;
+import org.eclipse.osee.framework.ui.plugin.widgets.PropertyStoreControlContributions;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public class AdvancedPage extends TestManagerPage {
+
+   public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+   private static final String pageName = "Advanced";
+   private final List<IPropertyStoreBasedControl> contributions;
+   private volatile boolean contributionsInitialized;
+
+   public AdvancedPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+      super(parent, style, parentTestManager);
+      this.contributions = new ArrayList<>();
+      contributionsInitialized = false;
+   }
+
+   private synchronized List<IPropertyStoreBasedControl> getContributions() {
+      if (!contributionsInitialized) {
+         contributionsInitialized = true;
+         contributions.addAll(PropertyStoreControlContributions.getContributions(TestManagerPlugin.PLUGIN_ID));
+      }
+      return contributions;
+   }
+
+   @Override
+   public void createPage() {
+      super.createPage();
+      Composite parent = (Composite) getContent();
+      Composite extensionPanel = new Composite(parent, SWT.NONE);
+      GridLayout gL = new GridLayout();
+      gL.marginWidth = 0;
+      gL.marginHeight = 0;
+      extensionPanel.setLayout(gL);
+      extensionPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+      Collections.sort(getContributions(), new Comparator<IPropertyStoreBasedControl>() {
+
+         @Override
+         public int compare(IPropertyStoreBasedControl o1, IPropertyStoreBasedControl o2) {
+            return Integer.valueOf(o1.getPriority()).compareTo(Integer.valueOf(o2.getPriority()));
+         }
+      });
+      for (IPropertyStoreBasedControl widget : getContributions()) {
+
+         try {
+            widget.createControl(extensionPanel);
+         } catch (Throwable e) {
+            TestManagerPlugin.log(Level.SEVERE, "problem creating advance page contribution", e);
+         }
+      }
+
+      createBlankArea(parent, 0, true);
+      computeScrollSize();
+
+      // TODO: Change to use OteHelpContext
+      HelpUtil.setHelp(this, "test_manager_advanced_page", "org.eclipse.osee.ote.help.ui");
+   }
+
+   @Override
+   public String getPageName() {
+      return pageName;
+   }
+
+   private Control createBlankArea(Composite parent, int height, boolean allVertical) {
+      Composite blank = new Composite(parent, SWT.NONE);
+      GridLayout gridLayout = new GridLayout();
+      GridData gd = new GridData();
+      gd.minimumHeight = height;
+      gd.grabExcessHorizontalSpace = true;
+      gd.grabExcessVerticalSpace = allVertical;
+      blank.setLayout(gridLayout);
+      blank.setLayoutData(gd);
+      return parent;
+   }
+
+   protected void createAreaDefaultLayout(Composite parent, boolean allHorizontal, boolean allVertical) {
+      GridLayout layout = new GridLayout();
+      GridData data = new GridData(GridData.FILL_BOTH);
+      data.grabExcessHorizontalSpace = allHorizontal;
+      data.grabExcessVerticalSpace = allVertical;
+      parent.setLayout(layout);
+      parent.setLayoutData(data);
+   }
+
+   @Override
+   public void saveData() {
+      IPropertyStore propertyStore = getTestManager().getPropertyStore();
+      for (IPropertyStoreBasedControl contribution : getContributions()) {
+         contribution.save(propertyStore);
+      }
+   }
+
+   @Override
+   public void restoreData() {
+      IPropertyStore propertyStore = getTestManager().getPropertyStore();
+      for (IPropertyStoreBasedControl contribution : getContributions()) {
+         contribution.load(propertyStore);
+      }
+   }
+
+   @Override
+   public boolean areSettingsValidForRun() {
+      boolean result = true;
+      for (IPropertyStoreBasedControl contribution : getContributions()) {
+         result &= contribution.areSettingsValid();
+      }
+      return result;
+   }
+
+   @Override
+   public String getErrorMessage() {
+      StringBuilder builder = new StringBuilder();
+      for (IPropertyStoreBasedControl contribution : getContributions()) {
+         String message = contribution.getErrorMessage();
+         if (Strings.isValid(message)) {
+            if (builder.length() > 0) {
+               builder.append("\n");
+            }
+            builder.append(message);
+         }
+      }
+      return builder.toString();
+   }
+
+   @Override
+   public boolean onConnection(ConnectionEvent event) {
+      return false;
+   }
+
+   @Override
+   public boolean onDisconnect(ConnectionEvent event) {
+      return false;
+   }
+
+   @Override
+   public boolean onConnectionLost() {
+      return false;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java
new file mode 100644
index 0000000..4ad76fa
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages;
+
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+public class HostPage extends TestManagerPage {
+
+   private static final String pageName = "Hosts";
+
+   public HostPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+      super(parent, style, parentTestManager);
+      createPage();
+
+      // TODO: Change to use OteHelpContext
+      HelpUtil.setHelp(this, "test_manager_hosts_page", "org.eclipse.osee.ote.help.ui");
+   }
+
+   @Override
+   public String getPageName() {
+      return pageName;
+   }
+
+   @Override
+   protected void createPage() {
+      super.createPage();
+      Composite parent = (Composite) getContent();
+
+      Group hostGroup = new Group(parent, SWT.NONE);
+      hostGroup.setLayout(new GridLayout());
+      hostGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+      hostGroup.setText("Double click a Host to Connect/Disconnect");
+
+      getTestManager().createHostWidget(hostGroup);
+      setMinSize(0, 0);
+   }
+
+   @Override
+   public boolean areSettingsValidForRun() {
+      return getTestManager().isConnected();
+   }
+
+   @Override
+   public void restoreData() {
+      // Do Nothing
+   }
+
+   @Override
+   public void saveData() {
+      // Do Nothing
+   }
+
+   @Override
+   public String getErrorMessage() {
+      StringBuilder builder = new StringBuilder();
+      if (areSettingsValidForRun() != true) {
+         builder.append("Connect to a Test Server");
+      }
+      return builder.toString();
+   }
+
+   @Override
+   public boolean onConnection(ConnectionEvent event) {
+      return false;
+
+   }
+
+   @Override
+   public boolean onDisconnect(ConnectionEvent event) {
+      return false;
+
+   }
+
+   @Override
+   public boolean onConnectionLost() {
+      return false;
+   }
+
+   @Override
+   public void dispose() {
+      super.dispose();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java
new file mode 100644
index 0000000..c796723
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java
@@ -0,0 +1,476 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages;
+
+import java.rmi.RemoteException;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.configuration.LoadWidget;
+import org.eclipse.osee.ote.ui.test.manager.configuration.SaveWidget;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.jobs.ScriptRunJob;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.CoolBar;
+import org.eclipse.swt.widgets.CoolItem;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public abstract class ScriptPage extends TestManagerPage {
+
+   private static final String NOT_CONNECTED = "<< NOT_CONNECTED >>";
+   private static final int ABORT_BTN_TIMER = 5000;
+   
+   public enum UpdateableLabel {
+      HOSTLABEL,
+      CONFIGPATHLABEL;
+   }
+
+   public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+   private static final String pageName = "Scripts";
+   private ToolItem abortButton;
+   private ToolItem abortBatchButton;
+   private CoolBar coolBar;
+   private ToolItem deleteButton;
+   private Label hostConnectLabel;
+   private LoadWidget loadWidget;
+   protected ToolItem runButton;
+   private SaveWidget saveWidget;
+   private ScriptTableViewer scriptTable;
+   private StatusWindowWidget statusWindow;
+   private final TestManagerEditor testManagerEditor;
+
+   public ScriptPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+      super(parent, style, parentTestManager);
+      this.testManagerEditor = parentTestManager;
+   }
+
+   public void addFile(String fullPath) {
+      scriptTable.addFile(fullPath);
+   }
+
+   @Override
+   public void createPage() {
+      super.createPage();
+      Composite parent = (Composite) getContent();
+      coolBar = new CoolBar(parent, SWT.FLAT);
+
+      createControlsToolBar(coolBar);
+      createConfigurationToolBar(coolBar);
+      packCoolBar();
+
+      SashForm sashForm = new SashForm(parent, SWT.NONE);
+      sashForm.setLayout(new GridLayout());
+      sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+      sashForm.setOrientation(SWT.VERTICAL);
+      sashForm.SASH_WIDTH = 3;
+
+      createScriptTableSection(sashForm);
+      createStatusWindow(sashForm);
+
+      sashForm.setWeights(new int[] {8, 2});
+      setMinSize(0, 0);
+      
+      // TODO: Change to use OteHelpContext
+      HelpUtil.setHelp(this, "test_manager_scripts_page", "org.eclipse.osee.framework.help.ui");
+   }
+
+   public void loadStorageString() {
+      scriptTable.loadStorageString(testManagerEditor.loadValue(testManagerEditor.scriptsQualName));
+   }
+
+   @Override
+   public void dispose() {
+      scriptTable.dispose();
+      testManagerEditor.storeValue(testManagerEditor.scriptsQualName, scriptTable.getStorageString());
+      OseeLog.log(TestManagerPlugin.class, Level.INFO, "ScriptPage Dispose Called");
+      super.dispose();
+   }
+
+   public CoolBar getCoolBar() {
+      return coolBar;
+   }
+
+   public String getOFP() {
+      if (hostConnectLabel == null) {
+         return "";
+      }
+      return hostConnectLabel.getText();
+   }
+
+   @Override
+   public String getPageName() {
+      return pageName;
+   }
+
+   public String getScripts() {
+      if (scriptTable == null) {
+         return "";
+      } else if (scriptTable.getTaskList() == null) {
+         return "";
+      }
+      return scriptTable.getTaskList().toString();
+   }
+
+   public ScriptTableViewer getScriptTableViewer() {
+      return scriptTable;
+   }
+
+   public StatusWindowWidget getStatusWindow() {
+      return statusWindow;
+   }
+
+   public void onScriptRunning(final boolean running) {
+      AWorkbench.getDisplay().asyncExec(new Runnable() {
+         @Override
+         public void run() {
+            if(runButton.isDisposed()){
+               return;
+            }
+            if (running) {
+               runButton.setEnabled(false);
+               abortButton.setEnabled(true);
+               abortBatchButton.setEnabled(true);
+            } else {
+               runButton.setEnabled(true);
+               abortButton.setEnabled(false);
+               abortBatchButton.setEnabled(false);
+            }
+         }
+      });
+   }
+
+   public void packCoolBar() {
+      Point size = this.getSize();
+      coolBar.setSize(coolBar.computeSize(size.x, size.y));
+   }
+
+   private void createConfigurationToolBar(CoolBar coolBar) {
+      CoolItem configCoolItem = new CoolItem(coolBar, SWT.NONE);
+      ToolBar configToolBar = new ToolBar(coolBar, SWT.FLAT | SWT.HORIZONTAL);
+
+      saveWidget = new SaveWidget(this);
+      saveWidget.createToolItem(configToolBar);
+
+      loadWidget = new LoadWidget(this);
+      loadWidget.createToolItem(configToolBar);
+
+      deleteButton = new ToolItem(configToolBar, SWT.PUSH | SWT.CENTER);
+      deleteButton.setImage(ImageManager.getImage(OteTestManagerImage.FILE_DELETE));
+      deleteButton.setToolTipText("Deletes Selected (highlighted) Scripts");
+      deleteButton.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            handleDeleteButton();
+         }
+      });
+      deleteButton.addListener(SWT.MouseUp, new Listener() {
+         @Override
+         public void handleEvent(Event e) {
+            if (e.button == 3) {
+               handleDeleteButton();
+            }
+         }
+      });
+
+      configToolBar.pack();
+
+      Point size = configToolBar.getSize();
+      configCoolItem.setControl(configToolBar);
+      configCoolItem.setSize(configCoolItem.computeSize(size.x, size.y));
+      configCoolItem.setMinimumSize(size);
+   }
+
+   private void createControlsToolBar(CoolBar coolBar) {
+      CoolItem controlsCoolItem = new CoolItem(coolBar, SWT.NONE);
+      ToolBar controlsToolBar = new ToolBar(coolBar, SWT.FLAT | SWT.HORIZONTAL);
+
+      runButton = new ToolItem(controlsToolBar, SWT.PUSH | SWT.CENTER);
+      runButton.setImage(ImageManager.getImage(OteTestManagerImage.SEL_RUN_EXEC));
+      runButton.setDisabledImage(ImageManager.getImage(OteTestManagerImage.UNSEL_RUN_EXEC));
+      runButton.setToolTipText("Runs the Checked Scripts");
+      runButton.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            handleRunButton();
+         }
+      });
+      runButton.addListener(SWT.MouseUp, new Listener() {
+         @Override
+         public void handleEvent(Event e) {
+            if (e.button == 3) {
+               handleRunButton();
+            }
+         }
+      });
+      runButton.setEnabled(false);
+
+      // Create and configure the "Abort" button
+      abortButton = new ToolItem(controlsToolBar, SWT.PUSH | SWT.CENTER);
+      abortButton.setImage(ImageManager.getImage(OteTestManagerImage.SEL_ABORT_STOP));
+      abortButton.setDisabledImage(ImageManager.getImage(OteTestManagerImage.UNSEL_ABORT_STOP));
+      abortButton.setToolTipText("Abort Currently Running Script");
+      abortButton.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            handleAbortButton();
+            abortBatchButton.setEnabled(false);
+            abortButton.setEnabled(false);
+            Timer timer = new Timer();
+            timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+         }
+      });
+      abortButton.addListener(SWT.MouseUp, new Listener() {
+         @Override
+         public void handleEvent(Event e) {
+            if (e.button == 3) {
+               handleAbortButton();
+               abortBatchButton.setEnabled(false);
+               abortButton.setEnabled(false);
+               Timer timer = new Timer();
+               timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+            }
+         }
+      });
+      abortButton.setEnabled(false);
+
+      abortBatchButton = new ToolItem(controlsToolBar, SWT.PUSH | SWT.CENTER);
+      abortBatchButton.setImage(ImageManager.getImage(OteTestManagerImage.SEL_BATCH_ABORT_STOP));
+      abortBatchButton.setDisabledImage(ImageManager.getImage(OteTestManagerImage.UNSEL_BATCH_ABORT_STOP));
+      abortBatchButton.setToolTipText("Abort Script Batch");
+      abortBatchButton.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            handleBatchAbortButton();
+            abortBatchButton.setEnabled(false);
+            abortButton.setEnabled(false);
+            Timer timer = new Timer();
+            timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+         }
+      });
+      abortBatchButton.addListener(SWT.MouseUp, new Listener() {
+         @Override
+         public void handleEvent(Event e) {
+            if (e.button == 3) {
+               handleBatchAbortButton();
+               abortBatchButton.setEnabled(false);
+               abortButton.setEnabled(false);
+               Timer timer = new Timer();
+               timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+            }
+         }
+      });
+      abortBatchButton.setEnabled(false);
+
+      controlsToolBar.pack();
+
+      Point size = controlsToolBar.getSize();
+      controlsCoolItem.setControl(controlsToolBar);
+      controlsCoolItem.setSize(controlsCoolItem.computeSize(size.x, size.y));
+      controlsCoolItem.setMinimumSize(size);
+   }
+
+   private void createScriptTableSection(Composite parent) {
+      Composite composite = new Composite(parent, SWT.NONE);
+      composite.setLayout(new GridLayout());
+      composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+      scriptTable = new ScriptTableViewer(composite, this.getTestManager());
+      //      scriptTable.addDisposeListener(new DisposeListener() {
+      //         public void widgetDisposed(DisposeEvent e) {
+      //            testManagerEditor.storeValue(testManagerEditor.scriptsQualName, scriptTable.getStorageString());
+      //         }
+      //      });
+
+   }
+
+   private void createStatusWindow(Composite parent) {
+      statusWindow = new StatusWindowWidget(parent);
+
+      statusWindow.setLabelAndValue(UpdateableLabel.HOSTLABEL.name(), "Selected Host", NOT_CONNECTED, SWT.BOLD,
+         SWT.COLOR_DARK_RED);
+
+      String selectedFile = testManagerEditor.loadValue(testManagerEditor.configFileName);
+      if (!Strings.isValid(selectedFile)) {
+         selectedFile = testManagerEditor.getDefaultConfigPath();
+         testManagerEditor.storeValue(testManagerEditor.configFileName, selectedFile);
+      }
+      OseeLog.log(TestManagerPlugin.class, Level.INFO, "The default config is: " + selectedFile);
+
+      statusWindow.setLabelAndValue(UpdateableLabel.CONFIGPATHLABEL.name(), "Config File Path", selectedFile);
+
+      saveWidget.setStatusLabel(statusWindow);
+      loadWidget.setStatusLabel(statusWindow);
+
+      // // Status ICON Labels
+      // connectStatusIconLabel = new
+      // Label(statusWindow.getStatusIconComposite(), SWT.NONE);
+      // hostWidget.setConnectStatusLabel(connectStatusIconLabel);
+      // connectStatusIconLabel.setVisible(false);
+
+      statusWindow.refresh();
+   }
+
+   // TODO this stuff needs some updating too...
+   protected void handleAbortButton() {
+      TestManagerPlugin.getInstance().getOteConsoleService().write("Aborting Test Script...");
+      try {
+         getScriptManager().abortScript(false);
+      } catch (RemoteException e) {
+         TestManagerPlugin.getInstance().getOteConsoleService().writeError(Lib.exceptionToString(e));
+      }
+   }
+
+   // TODO this stuff needs some updating too...
+   protected void handleBatchAbortButton() {
+      TestManagerPlugin.getInstance().getOteConsoleService().write("Aborting Test Script Batch...");
+      try {
+         getScriptManager().abortScript(true);
+      } catch (RemoteException e) {
+         TestManagerPlugin.getInstance().getOteConsoleService().writeError(Lib.exceptionToString(e));
+      }
+   }
+
+   private void handleDeleteButton() {
+      scriptTable.removeSelectedTasks();
+   }
+
+   private void handleRunButton() {
+      ScriptRunJob runJob = new ScriptRunJob(getTestManager());
+      if (runJob.isRunAllowed()) {
+         runJob.setPriority(Job.LONG);
+         runJob.setUser(true);
+         runJob.schedule();
+      } else {
+         MessageDialog.openError(Displays.getActiveShell(), "Error", runJob.getErrorMessage());
+      }
+   }
+
+   private class EnabledAbortsTimer extends TimerTask {
+
+      @Override
+      public void run() {
+         Displays.ensureInDisplayThread(new Runnable() {
+            @Override
+            public void run() {
+               try {
+                  if (!runButton.isEnabled()) {
+                     abortBatchButton.setEnabled(true);
+                     abortButton.setEnabled(true);
+                  }
+               } catch (Throwable th) {
+
+               }
+            }
+         });
+
+      }
+
+   }
+
+   @Override
+   public boolean areSettingsValidForRun() {
+      return getScriptTableViewer().getRunTasks().size() > 0;
+   }
+
+   @Override
+   public String getErrorMessage() {
+      StringBuilder builder = new StringBuilder();
+      if (getScriptTableViewer().getRunTasks().size() <= 0) {
+         builder.append("Scripts not selected.");
+      }
+      return builder.toString();
+   }
+
+   @Override
+   public boolean onConnection(final ConnectionEvent event) {
+      boolean result = getScriptManager().connect(event);
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            runButton.setEnabled(true);
+            abortButton.setEnabled(false);
+            abortBatchButton.setEnabled(false);
+            scriptTable.onConnectionChanged(true);
+            statusWindow.setValue(UpdateableLabel.HOSTLABEL.name(), event.getProperties().getStation(), SWT.BOLD,
+               SWT.COLOR_DARK_GREEN);
+            statusWindow.refresh();
+         }
+
+      });
+      return result;
+   }
+
+   @Override
+   public boolean onDisconnect(ConnectionEvent event) {
+      boolean result = getScriptManager().disconnect(event);
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            runButton.setEnabled(false);
+            abortButton.setEnabled(false);
+            abortBatchButton.setEnabled(false);
+            scriptTable.onConnectionChanged(false);
+            statusWindow.setValue(UpdateableLabel.HOSTLABEL.name(), NOT_CONNECTED, SWT.BOLD, SWT.COLOR_DARK_RED);
+            statusWindow.refresh();
+         }
+      });
+      return result;
+   }
+
+   @Override
+   public boolean onConnectionLost() {
+      boolean result = getScriptManager().onConnectionLost();
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            runButton.setEnabled(false);
+            abortButton.setEnabled(false);
+            abortBatchButton.setEnabled(false);
+            scriptTable.onConnectionChanged(false);
+            statusWindow.setValue(UpdateableLabel.HOSTLABEL.name(), NOT_CONNECTED, SWT.BOLD, SWT.COLOR_DARK_RED);
+            statusWindow.refresh();
+         }
+      });
+      return result;
+   }
+
+   public abstract ScriptManager getScriptManager();
+
+   public void addFiles(String[] files) {
+      scriptTable.addFiles(files);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java
new file mode 100644
index 0000000..61d1684
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StatusWindowWidget {
+   private final Map<String, Map<EntryAttribute, Object>> labelValueMap;
+   private final List<String> keys;
+   private final FormattedText statusTextArea;
+
+   private enum EntryAttribute {
+      LABEL,
+      VALUE,
+      STYLE,
+      COLOR;
+   }
+
+   public StatusWindowWidget(Composite parent) {
+      keys = new ArrayList<>();
+      labelValueMap = new HashMap<>();
+      statusTextArea = new FormattedText(parent, SWT.BORDER, SWT.DEFAULT, SWT.DEFAULT, false);
+      statusTextArea.setTextAreaBackground(SWT.COLOR_WHITE);
+   }
+
+   public void setLabelAndValue(String key, String label, String value, int style, int color) {
+      if (!keys.contains(key)) {
+         keys.add(key);
+      }
+      Map<EntryAttribute, Object> entry = new HashMap<>();
+      entry.put(EntryAttribute.LABEL, label);
+      entry.put(EntryAttribute.VALUE, value);
+      entry.put(EntryAttribute.STYLE, new Integer(style));
+      entry.put(EntryAttribute.COLOR, new Integer(color));
+
+      labelValueMap.put(key, entry);
+   }
+
+   public void setLabelAndValue(String key, String label, String value) {
+      setLabelAndValue(key, label, value, SWT.NORMAL, SWT.COLOR_BLACK);
+   }
+
+   public String getValue(String key) {
+      Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+      EntryAttribute attribute = EntryAttribute.VALUE;
+      return entry != null && entry.get(attribute) != null ? (String) entry.get(attribute) : "";
+   }
+
+   public String getLabel(String key) {
+      Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+      EntryAttribute attribute = EntryAttribute.LABEL;
+      return entry != null && entry.get(attribute) != null ? (String) entry.get(attribute) : "";
+   }
+
+   public void setLabel(String key, String label) {
+      Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+      if (entry != null) {
+         entry.put(EntryAttribute.LABEL, label);
+      } else {
+         setLabelAndValue(key, label, "");
+      }
+   }
+
+   public void setValueStyle(String key, int style) {
+      Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+      if (entry != null) {
+         entry.put(EntryAttribute.STYLE, new Integer(style));
+      }
+   }
+
+   public void setValueColor(String key, int color) {
+      Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+      if (entry != null) {
+         entry.put(EntryAttribute.STYLE, new Integer(color));
+      }
+   }
+
+   public void setValue(String key, String value, int style, int color) {
+      Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+      if (entry != null) {
+         entry.put(EntryAttribute.VALUE, value);
+         entry.put(EntryAttribute.STYLE, new Integer(style));
+         entry.put(EntryAttribute.COLOR, new Integer(color));
+      } else {
+         setLabelAndValue(key, "", value, style, color);
+      }
+   }
+
+   public void setValue(String key, String value) {
+      Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+      if (entry != null) {
+         entry.put(EntryAttribute.VALUE, value);
+      } else {
+         setLabelAndValue(key, "", value);
+      }
+   }
+
+   public void refresh() {
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+        	if(!statusTextArea.isDisposed()){
+        		statusTextArea.clearTextArea();
+        		for (String key : keys) {
+        			Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+        			if (entry != null) {
+        				String label = (String) entry.get(EntryAttribute.LABEL);
+        				String value = (String) entry.get(EntryAttribute.VALUE);
+        				Integer style = (Integer) entry.get(EntryAttribute.STYLE);
+        				Integer color = (Integer) entry.get(EntryAttribute.COLOR);
+        				statusTextArea.addText("\t" + label + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+        				statusTextArea.addText(value + "\n", style, color);
+        			}
+        		}
+        	}
+         }
+      });
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java
new file mode 100644
index 0000000..d35c44a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages;
+
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author David Diepenbrock
+ */
+public abstract class TestManagerPage extends ScrolledComposite {
+
+   private final TestManagerEditor testManager;
+   private Composite mainComposite;
+
+   public TestManagerPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+      super(parent, style | SWT.H_SCROLL | SWT.V_SCROLL);
+      this.testManager = parentTestManager;
+   }
+
+   protected void createPage() {
+      GridLayout gridLayout = new GridLayout(1, true);
+      this.setLayout(gridLayout);
+
+      this.mainComposite = new Composite(this, SWT.NONE);
+      this.mainComposite.setLayout(new GridLayout());
+      this.mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+      this.setContent(mainComposite);
+      this.setExpandHorizontal(true);
+      this.setExpandVertical(true);
+      getVerticalBar().setIncrement(25);
+      getVerticalBar().setPageIncrement(200);
+      getHorizontalBar().setIncrement(25);
+      getHorizontalBar().setPageIncrement(200);
+   }
+
+   public void computeScrollSize() {
+      this.computeScrollSize(mainComposite);
+   }
+
+   private void computeScrollSize(Composite viewableArea) {
+      this.setMinSize(viewableArea.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+   }
+
+   public TestManagerEditor getTestManager() {
+      return testManager;
+   }
+
+   public abstract String getPageName();
+
+   public abstract void saveData();
+
+   public abstract void restoreData();
+
+   public abstract boolean areSettingsValidForRun();
+
+   public abstract String getErrorMessage();
+
+   /**
+    * called when test manager is connected to a test host. A return value of true will cause test manager to prompt the
+    * user to check the log. Thus any problems that occur during connection processing should be handled and logged.
+    * 
+    * @return true if there were problems during processing and false otherwise.
+    */
+   public abstract boolean onConnection(ConnectionEvent event);
+
+   public abstract boolean onDisconnect(ConnectionEvent event);
+
+   public abstract boolean onConnectionLost();
+
+   @Override
+   public void dispose() {
+      super.dispose();
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.java
new file mode 100644
index 0000000..b2b352f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.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.ui.test.manager.pages.contributions;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.ui.plugin.widgets.IPropertyStoreBasedControl;
+import org.eclipse.osee.ote.ui.test.manager.panels.FileOrDirectorySelectionPanel;
+import org.eclipse.osee.ote.ui.test.manager.panels.LoggingPanel;
+import org.eclipse.osee.ote.ui.test.manager.panels.ScriptExecutionOptionsPanel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ScriptExecutionContribution implements IPropertyStoreBasedControl {
+   private static final String GROUP_TITLE = "Script Execution Options";
+   private static final String LOGGING_GROUP = "Select a logging level";
+   private static final String EXECUTION_OPTIONS_GROUP = "Execution Options";
+   private static final String SCRIPT_OUTPUT_TOOLTIP =
+      "If the path in the text box is an existing directory all files will be written there.\n" + "If the path is empty the files will be written to the same location as the script.\n" + "In all other cases the path will be relative to the parent project of the file.\n";
+   private static final String SCRIPT_OUTPUT_LABEL = "Script Output Directory: ";
+
+   private FileOrDirectorySelectionPanel scriptDirectoryPanel;
+   private LoggingPanel loggingPanel;
+   private ScriptExecutionOptionsPanel optionsPanel;
+
+   @Override
+   public Control createControl(Composite parent) {
+      Group group = new Group(parent, SWT.NONE);
+      group.setLayout(new GridLayout());
+      group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+      group.setText(GROUP_TITLE);
+
+      this.scriptDirectoryPanel =
+         new FileOrDirectorySelectionPanel(group, SWT.NONE, SCRIPT_OUTPUT_LABEL, SCRIPT_OUTPUT_TOOLTIP, true);
+
+      Composite composite = new Composite(group, SWT.NONE);
+      GridLayout gl = new GridLayout(2, false);
+      gl.marginHeight = 0;
+      gl.marginWidth = 0;
+      composite.setLayout(gl);
+      composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+      Group scriptOptionsGroup = new Group(composite, SWT.NONE);
+      scriptOptionsGroup.setLayout(new GridLayout());
+      scriptOptionsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+      scriptOptionsGroup.setText(EXECUTION_OPTIONS_GROUP);
+
+      this.optionsPanel = new ScriptExecutionOptionsPanel(scriptOptionsGroup, SWT.NONE);
+
+      Group loggingGroup = new Group(composite, SWT.NONE);
+      loggingGroup.setLayout(new GridLayout());
+      loggingGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+      loggingGroup.setText(LOGGING_GROUP);
+
+      this.loggingPanel = new LoggingPanel(loggingGroup, SWT.NONE);
+      return group;
+   }
+
+   @Override
+   public void load(IPropertyStore propertyStore) {
+      this.scriptDirectoryPanel.setSelected(propertyStore.get(TestManagerStorageKeys.SCRIPT_OUTPUT_DIRECTORY_KEY));
+
+      this.optionsPanel.setKeepOldCopiesEnabled(propertyStore.getBoolean(TestManagerStorageKeys.KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY));
+      this.optionsPanel.setBatchModeEnabled(propertyStore.getBoolean(TestManagerStorageKeys.BATCH_MODE_ENABLED_KEY));
+      this.optionsPanel.setAbortOnFail(propertyStore.getBoolean(TestManagerStorageKeys.ABORT_ON_FAIL_KEY));
+      this.optionsPanel.setPauseOnFail(propertyStore.getBoolean(TestManagerStorageKeys.PAUSE_ON_FAIL_KEY));
+      this.optionsPanel.setPrintFailToConsole(propertyStore.getBoolean(TestManagerStorageKeys.PRINT_FAIL_TO_CONSOLE));
+
+      this.loggingPanel.setSelected(propertyStore.get(TestManagerStorageKeys.LOGGING_LEVEL_KEY));
+   }
+
+   @Override
+   public void save(IPropertyStore propertyStore) {
+      propertyStore.put(TestManagerStorageKeys.SCRIPT_OUTPUT_DIRECTORY_KEY, this.scriptDirectoryPanel.getSelected());
+
+      propertyStore.put(TestManagerStorageKeys.LOGGING_LEVEL_KEY, this.loggingPanel.getSelected());
+
+      propertyStore.put(TestManagerStorageKeys.KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY,
+         this.optionsPanel.isKeepOldCopiesEnabled());
+      propertyStore.put(TestManagerStorageKeys.BATCH_MODE_ENABLED_KEY, this.optionsPanel.isBatchModeEnabled());
+      propertyStore.put(TestManagerStorageKeys.ABORT_ON_FAIL_KEY, this.optionsPanel.isAbortOnFail());
+      propertyStore.put(TestManagerStorageKeys.PAUSE_ON_FAIL_KEY, this.optionsPanel.isPauseOnFail());
+      propertyStore.put(TestManagerStorageKeys.PRINT_FAIL_TO_CONSOLE, this.optionsPanel.isPrintFailToConsole());
+   }
+
+   @Override
+   public boolean areSettingsValid() {
+      return scriptDirectoryPanel.isValid();
+   }
+
+   @Override
+   public String getErrorMessage() {
+      StringBuilder builder = new StringBuilder();
+      if (scriptDirectoryPanel.isValid() != true) {
+         builder.append("Script Output Directory: ");
+         builder.append(scriptDirectoryPanel.getErrorMessage());
+      }
+      return builder.toString();
+   }
+
+   @Override
+   public int getPriority() {
+      return 0;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java
new file mode 100644
index 0000000..628b913
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.contributions;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestManagerStorageKeys {
+
+   public static final String BATCH_MODE_ENABLED_KEY = "is.batch.mode.enabled";
+   public static final String KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY = "is.keep.old.outfile.copies.enabled";
+   public static final String ABORT_ON_FAIL_KEY = "is.abort.mode.enabled";
+   public static final String PAUSE_ON_FAIL_KEY = "is.pause.mode.enabled";
+   public static final String PRINT_FAIL_TO_CONSOLE = "is.print.fail.enabled";
+   public static final String LOGGING_LEVEL_KEY = "logging.level";
+   public static final String SCRIPT_OUTPUT_DIRECTORY_KEY = "script.output.directory";
+
+   private TestManagerStorageKeys() {
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java
new file mode 100644
index 0000000..1a23021
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable;
+
+public interface ITaskListViewer {
+
+   /**
+    * Update the view to reflect the fact that a task was added to the task list
+    */
+   public void addTask(ScriptTask task);
+
+   /**
+    * Update the view to reflect the fact that multiple tasks were added to the task list
+    */
+   public void addTasks(ScriptTask[] tasks);
+
+   /**
+    * Update the view to reflect the fact that a task was removed from the task list
+    */
+   public void removeTask(ScriptTask task);
+
+   /**
+    * Update the view to reflect the fact that one of the tasks was modified
+    */
+   public void updateTask(ScriptTask task);
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java
new file mode 100644
index 0000000..59ab450
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java
@@ -0,0 +1,528 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.PluginUiImage;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.markers.MarkerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ConfigFactory;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ILoadConfig;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ISaveConfig;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModel;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModelJob;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript.XScriptTable;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript.XScriptTableContentProvider;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript.XScriptTableLabelProvider;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ResourceTransfer;
+
+public class ScriptTableViewer {
+
+   private final ScriptTaskList taskList = new ScriptTaskList();
+   private TestManagerEditor testManagerEditor = null;
+   final int POPUP_NAVIGATOR = 2;
+   final int POPUP_OUTPUT = 0;
+   final int POPUP_SCRIPT = 1;
+   final int POPUP_RESULTS = 3;
+   private XScriptTable scriptTable;
+
+   public ScriptTableViewer(Composite parent, TestManagerEditor editor) {
+      this.testManagerEditor = editor;
+      createWidget(parent);
+   }
+
+   public ScriptTableViewer(Composite parent, TestManagerEditor editor, List<ScriptTask> scriptList) {
+      this(parent, editor);
+      taskList.addTasks(scriptList);
+   }
+
+   public void addFile(String fullPath) {
+      processDroppedFiles(new String[] {fullPath});
+   }
+
+   /*
+    * Close the window and dispose of resources
+    */
+   public void close() {
+      //      Shell shell = table.getShell();
+      //      if (shell != null && !shell.isDisposed()) shell.dispose();
+   }
+
+   /**
+    * Release resources
+    */
+   public void dispose() {
+      scriptTable.dispose();
+      // Tell the label provider to release its resources
+      //      tableViewer.getLabelProvider().dispose();
+   }
+
+   /**
+    * Return the column names in a collection
+    * 
+    * @return List containing column names
+    */
+   //   public List<String> getColumnNames() {
+   //      return Arrays.asList(columnNames);
+   //   }
+   /**
+    * Return the parent composite
+    */
+   //   public Control getControl() {
+   //      return table.getParent();
+   //   }
+   /**
+    * Get all tasks marked for run.
+    * 
+    * @return Vector of ScriptTask to run
+    */
+   public List<ScriptTask> getRunTasks() {
+      return scriptTable.getVisibleSortedScriptTasksToRun();
+   }
+
+   /**
+    * @return currently selected item
+    */
+   public ISelection getSelection() {
+      return scriptTable.getSelection();
+   }
+
+   /**
+    * Get string of scripts and run selections for storage
+    * 
+    * @return <script>-ISRUN-, <script>, <script>-ISRUN
+    */
+   public String getStorageString() {
+      File file = OseeData.getFile("tm.xml");
+      String configFile = testManagerEditor.loadValue(testManagerEditor.configFileName);
+      ISaveConfig saveConfig =
+         ConfigFactory.getInstance().getSaveConfigHandler(testManagerEditor.getPageManager().getScriptPage());
+      try {
+         saveConfig.saveConfig(file);
+      } catch (Exception ex) {
+         Dialogs.popupError("Error Loading File",
+            String.format("Error loading file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+      }
+
+      return "file:";
+   }
+
+   /**
+    * Return the ExampleTaskList
+    */
+   public ScriptTaskList getTaskList() {
+      return taskList;
+   }
+
+   public Vector<ScriptTask> getTasks() {
+      return taskList.getTasks();
+   }
+
+   /**
+    * @return Returns the testManagerEditor.
+    */
+   public TestManagerEditor getTestManagerEditor() {
+      return testManagerEditor;
+   }
+
+   /**
+    * Set taskList from input list of scripts and run selections
+    * 
+    * @param str <script>-ISRUN-, <script>, <script>-ISRUN
+    */
+   public void loadStorageString(String str) {
+      OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Storage String [%s]", str);
+      if (str != null) {
+         if (str.equals("file:")) {
+            File configFile = OseeData.getFile("tm.xml");
+            ILoadConfig loadConfig =
+               ConfigFactory.getInstance().getLoadConfigHandler(this.testManagerEditor.getPageManager().getScriptPage());
+            try {
+               loadConfig.loadConfiguration(configFile);
+            } catch (Exception ex) {
+               Dialogs.popupError("Error Saving File",
+                  String.format("Error saving file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+            }
+         } else {
+            String scripts[] = str.split(",");
+            for (int i = 0; i < scripts.length; i++) {
+               String script = scripts[i];
+               if (!script.equals("")) {
+                  boolean run = false;
+                  if (script.endsWith("-ISRUN-")) {
+                     run = true;
+                     script = script.replaceFirst("-ISRUN-", "");
+                  }
+                  try {
+                     ScriptTask task = new ScriptTask(script, testManagerEditor.getAlternateOutputDir());
+                     task.setRun(run);
+                     taskList.addTask(task);
+                  } catch (Exception ex) {
+                     OseeLog.logf(TestManagerPlugin.class, Level.SEVERE,
+                        ex, "Unable to add file [%s] to script view.", script);
+                  }
+               }
+            }
+         }
+      }
+      refresh();
+   }
+
+   public void loadTasksFromList(Vector<ScriptTask> tasks) {
+      taskList.removeAllTasks();
+      taskList.addTasks(tasks);
+      refresh();
+   }
+
+   public void onConnectionChanged(boolean connected) {
+      taskList.onConnected(connected);
+      refresh();
+   }
+
+   public void refresh() {
+      scriptTable.refresh();
+   }
+
+   public void refresh(ScriptTask task) {
+      scriptTable.refresh(task);
+   }
+
+   public void removeSelectedTasks() {
+      IStructuredSelection sel = (IStructuredSelection) scriptTable.getSelection();
+      Iterator<?> iter = sel.iterator();
+      while (iter.hasNext()) {
+         ScriptTask task = (ScriptTask) iter.next();
+         if (task != null) {
+            taskList.removeTask(task);
+         }
+      }
+      refresh();
+   }
+
+   /**
+    * Calls setRun() on all of the tasks in the table with runState.
+    * 
+    * @param runState - the state to set all of the tasks's run value to
+    */
+   public void setAllTasksRun(boolean runState) {
+      Iterator<ScriptTask> iter = taskList.getTasks().iterator();
+      while (iter.hasNext()) {
+         ScriptTask task = iter.next();
+         task.setRun(runState);
+         taskList.taskChanged(task);
+      }
+      refresh();
+   }
+
+   /**
+    * Create a new shell, add the widgets, open the shell
+    */
+   private void createWidget(Composite parent) {
+      scriptTable = new XScriptTable(parent, SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
+      scriptTable.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+      scriptTable.setContentProvider(new XScriptTableContentProvider());
+      scriptTable.setLabelProvider(new XScriptTableLabelProvider(scriptTable));
+      scriptTable.setInput(taskList);
+      attachDragDropListener();
+      attachKeyListeners();
+      scriptTable.getMenuManager().addMenuListener(new IMenuListener() {
+         @Override
+         public void menuAboutToShow(IMenuManager manager) {
+            getPopupMenu();
+         }
+      });
+   }
+
+   private void attachDragDropListener() {
+      final FileTransfer fileTransfer = FileTransfer.getInstance();
+      final TextTransfer textTransfer = TextTransfer.getInstance();
+      final ResourceTransfer resourceTransfer = ResourceTransfer.getInstance();
+      
+      final Transfer types[] = new Transfer[] {fileTransfer, textTransfer, resourceTransfer};
+      // Add Drag/Drop to Table
+      DropTargetListener scriptDropTargetListener = new DropTargetAdapter() {
+         @Override
+         public void drop(DropTargetEvent event) {
+            if (fileTransfer.isSupportedType(event.currentDataType)) {
+               processDroppedFiles((String[]) event.data);
+            } else if(textTransfer.isSupportedType(event.currentDataType)) {
+               processDroppedFiles((String[]) event.data);
+            } else if(resourceTransfer.isSupportedType(event.currentDataType)){
+               IResource[] resources = (IResource[])event.data;
+               String[] asStrings = new String[resources.length];
+               for(int i = 0; i < resources.length; i++) {
+                  asStrings[i] = resources[i].getLocation().toOSString();
+               }
+               processDroppedFiles(asStrings);
+            }
+         }
+         @Override
+         public void dropAccept( DropTargetEvent event )
+         {
+             event.detail = DND.DROP_COPY;
+         }
+         
+         @Override
+         public void dragEnter( DropTargetEvent event )
+         {
+             event.detail = DND.DROP_COPY;
+         }
+      };
+      // Setup drag/drop of files
+      int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
+      DropTarget scriptsTarget = new DropTarget(scriptTable.getTree(), operations);
+      scriptsTarget.setTransfer(types);
+      scriptsTarget.addDropListener(scriptDropTargetListener);
+   }
+
+   private void getPopupMenu() {
+
+      MenuManager menuManager = scriptTable.getMenuManager();
+
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Open Script") {
+         @Override
+         public void run() {
+            handlePopupMenu(POPUP_SCRIPT);
+         }
+      });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Open Output File") {
+         @Override
+         public void run() {
+            handlePopupMenu(POPUP_OUTPUT);
+         }
+      });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Refresh Output Results") {
+         @Override
+         public void run() {
+            handlePopupMenu(POPUP_RESULTS);
+         }
+      });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Open in Package Explorer") {
+         @Override
+         public void run() {
+            handlePopupMenu(POPUP_NAVIGATOR);
+         }
+      });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+         new Action("Set Selected to Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_ENABLED)) {
+            @Override
+            public void run() {
+               IStructuredSelection sel = (IStructuredSelection) getSelection();
+               Iterator<?> iter = sel.iterator();
+               while (iter.hasNext()) {
+                  ScriptTask task = (ScriptTask) iter.next();
+                  task.setRun(true);
+                  taskList.taskChanged(task);
+               }
+               refresh();
+            }
+         });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+         new Action("Set Selected to Not Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_DISABLED)) {
+            @Override
+            public void run() {
+               IStructuredSelection sel = (IStructuredSelection) getSelection();
+               Iterator<?> iter = sel.iterator();
+               while (iter.hasNext()) {
+                  ScriptTask task = (ScriptTask) iter.next();
+                  task.setRun(false);
+                  taskList.taskChanged(task);
+               }
+               refresh();
+            }
+         });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+         new Action("Select All to Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_ENABLED)) {
+            @Override
+            public void run() {
+               setAllTasksRun(true);
+            }
+         });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+         new Action("Deselect All to Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_DISABLED)) {
+            @Override
+            public void run() {
+               setAllTasksRun(false);
+            }
+         });
+      menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
+
+      // item = new MenuItem(previewMenu, SWT.CASCADE);
+      // item.setText("Load Test Output Markers");
+      // item.addSelectionListener(new SelectionAdapter() {
+      //
+      // public void widgetSelected(SelectionEvent e) {
+      // TableItem items[] = table.getSelection();
+      // ScriptTask task = null;
+      // if (items.length > 0) {
+      // task = (ScriptTask) items[0].getData();
+      // testManagerEditor.processOutFile(task);
+      // }
+      // AWorkbench.popupView(IPageLayout.ID_PROBLEM_VIEW);
+      // }
+      // });
+      // item = new MenuItem(previewMenu, SWT.CASCADE);
+      // item.setText("Remove Test Output Markers");
+      // item.addSelectionListener(new SelectionAdapter() {
+      //
+      // public void widgetSelected(SelectionEvent e) {
+      // TableItem items[] = table.getSelection();
+      // ScriptTask task = null;
+      // if (items.length > 0) {
+      // task = (ScriptTask) items[0].getData();
+      // MarkerSupport.deleteMarkersFromInputFile(task.getScriptModel().getIFile());
+      // }
+      // }
+      // });
+      //
+      // item = new MenuItem(previewMenu, SWT.CASCADE);
+      // item.setText("Remove All Test Output Markers");
+      // item.addSelectionListener(new SelectionAdapter() {
+      //
+      // public void widgetSelected(SelectionEvent e) {
+      // MarkerSupport.deleteAllMarkers();
+      // }
+      // });
+
+      // item = new MenuItem(previewMenu, SWT.SEPARATOR);
+
+      //      return previewMenu;
+   }
+
+   private void handlePopupMenu(int type) {
+      TreeSelection selection = (TreeSelection) scriptTable.getSelection();
+      Object objs = selection.getFirstElement();
+      if (objs instanceof ScriptTask) {
+         ScriptTask task = (ScriptTask) objs;
+         if (type == POPUP_SCRIPT) {
+            task.getScriptModel().openEditor();
+         } else if (type == POPUP_OUTPUT) {
+            task.getScriptModel().getOutputModel().openEditor();
+            refresh();
+         } else if (type == POPUP_NAVIGATOR) {
+            task.getScriptModel().openPackageExplorer();
+         } else if (type == POPUP_RESULTS) {
+            Iterator<?> it = selection.iterator();
+            while (it.hasNext()) {
+               ScriptTask currentTask = (ScriptTask) it.next();
+               OutputModelJob.getSingleton().addTask(currentTask);
+            }
+         }
+      }
+   }
+
+   private void processDroppedFiles(String files[]) {
+      for (int i = 0; i < files.length; i++) {
+         String toProcess = files[i];
+
+         if (toProcess.endsWith(".xml")) {
+            batchDropHandler(new File(toProcess));
+         } else {
+            if (toProcess.endsWith(".java") || toProcess.endsWith(".vxe") || !new File(toProcess).getName().matches(
+               ".*\\..*")) {
+               ScriptTask newTask = new ScriptTask(files[i], testManagerEditor.getAlternateOutputDir());
+               if (!taskList.contains(newTask)) {
+                  //                  newTask.computeExists();
+                  OutputModel outputModel = newTask.getScriptModel().getOutputModel();
+                  if (outputModel != null) {
+                     IFile outputIFile = outputModel.getIFile();
+                     if (outputIFile != null && outputIFile.exists()) {
+                        MarkerPlugin.addMarkers(newTask.getScriptModel().getOutputModel().getIFile());
+                     }
+                  }
+                  taskList.addTask(newTask);
+               }
+            } else {
+               Dialogs.popupError("Invalid Drop", "Only Java scripts and cppUnit executables can be dropped here.");
+               OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "not .java or cppExe file");
+               return;
+            }
+         }
+      }
+      refresh();
+      this.testManagerEditor.storeValue(testManagerEditor.scriptsQualName, getStorageString());
+   }
+
+   private void batchDropHandler(File batchFile) {
+      try {
+         ILoadConfig loadConfig =
+            ConfigFactory.getInstance().getLoadConfigHandler(testManagerEditor.getPageManager().getScriptPage());
+         loadConfig.loadConfiguration(batchFile);
+      } catch (Exception ex) {
+         Dialogs.popupError("Invalid Drop", String.format("Unable to read batch file\nFile [%s]\n%s",
+            (batchFile != null ? batchFile.getAbsolutePath() : "NULL"), OseeUiActivator.getStackMessages(ex)));
+      }
+   }
+
+   public StructuredViewer getXViewer() {
+      return scriptTable;
+   }
+
+   private void attachKeyListeners() {
+      scriptTable.getTree().addKeyListener(new KeyListener() {
+         @Override
+         public void keyPressed(KeyEvent e) {
+         }
+
+         @Override
+         public void keyReleased(KeyEvent e) {
+            if (e.character == SWT.DEL && (e.stateMask & SWT.CTRL) == 0) {
+               removeSelectedTasks();
+               refresh();
+            }
+            if (e.character == 'r') {
+               refresh();
+            }
+         }
+      });
+   }
+
+   public void addFiles(String[] files) {
+      processDroppedFiles(files);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java
new file mode 100644
index 0000000..af00dc8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable;
+
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModelJob;
+import org.eclipse.osee.ote.ui.test.manager.models.ScriptModel;
+import org.eclipse.osee.ote.ui.test.manager.models.ScriptModel.ScriptInteractionEnum;
+
+public class ScriptTask {
+
+   public enum ScriptStatusEnum {
+      CANCELLED,
+      CANCELLING,
+      COMPLETE,
+      IN_QUEUE,
+      INCOMPATIBLE,
+      INVALID,
+      NOT_CONNECTED,
+      READY,
+      RUNNING
+   }
+
+   private GUID guid = null;
+   private boolean run = true;
+   private ScriptModel scriptModel = null;
+
+   private ScriptStatusEnum status = ScriptStatusEnum.INCOMPATIBLE;
+
+   /**
+    * @param outputDir alternate output directory for tmo output files null will default to script directory
+    */
+   public ScriptTask(String rawFilename, String outputDir) {
+      scriptModel = new ScriptModel(rawFilename, outputDir);
+      updateStatusOnConnected(false);
+      OutputModelJob.getSingleton().addTask(this);
+   }
+
+   /**
+    * @return Returns the guid.
+    */
+   public GUID getGuid() {
+      return guid;
+   }
+
+   /**
+    * @return Returns the interaction.
+    */
+   public ScriptInteractionEnum getInteraction() {
+      return scriptModel.getInteraction();
+   }
+
+   /**
+    * @return Returns the name.
+    */
+   public String getName() {
+      if (scriptModel == null) {
+         return "";
+      } else {
+         return scriptModel.getName();
+      }
+   }
+
+   /**
+    * @return Returns the passFail.
+    */
+   public String getPassFail() {
+
+      int passTP = scriptModel.getOutputModel().getPassedTestPoints();
+      int failTP = scriptModel.getOutputModel().getFailedTestPoints();
+      if (status == ScriptStatusEnum.RUNNING && scriptModel.getOutputModel().isAborted()){
+         return "(0/0)";
+      }
+      if (scriptModel.getOutputModel().isAborted()) {
+         return "ABORTED";
+      } else if (passTP > 0 || failTP > 0) {
+         if (failTP == 0) {
+            return "PASS (" + passTP + ")";
+         } else {
+            return "FAIL (" + failTP + "/" + (passTP + failTP) + ")";
+         }
+      } else if (status == ScriptStatusEnum.RUNNING) {
+         return "(0/0)";
+      }
+      return "";
+   }
+
+   /**
+    * @return Returns the path.
+    */
+   public String getPath() {
+      return scriptModel.getPath();
+   }
+
+   /**
+    * @return Returns the scriptModel.
+    */
+   public ScriptModel getScriptModel() {
+      return scriptModel;
+   }
+
+   /**
+    * @return Returns the status.
+    */
+   public ScriptStatusEnum getStatus() {
+      return status;
+   }
+
+   public Boolean getRunStatus() {
+      return run;
+   }
+
+   /**
+    * @return Returns the outputExists.
+    */
+   public boolean isOutputExists() {
+      return scriptModel.getOutputModel().exists();
+
+   }
+
+   //   public void computeExists() {
+   //      exists = scriptModel.getOutputModel().exists();
+   //   }
+
+   //   public boolean isOutputReadonly() {
+   //      return !scriptModel.getOutputModel().getFile().canWrite();
+   //   }
+
+   /**
+    * @return Returns the run.
+    */
+   public boolean isRun() {
+      return run;
+   }
+
+   public boolean isRunnable() {
+      return isRun();// && status != ScriptStatusEnum.INCOMPATIBLE
+      // && status != ScriptStatusEnum.INVALID);
+   }
+
+   /**
+    * @param guid The guid to set.
+    */
+   public void setGuid(GUID guid) {
+      this.guid = guid;
+   }
+
+   /**
+    * @param run The run to set.
+    */
+   public void setRun(boolean run) {
+      this.run = run;
+   }
+
+   /**
+    * @param status The status to set.
+    */
+   public void setStatus(ScriptStatusEnum status) {
+      this.status = status;
+   }
+
+   public void updateStatusOnConnected(boolean connected) {
+      /* Always leave the status of INVALID alone */
+      if (status != ScriptStatusEnum.INVALID) {
+         /* If we're not connected, we'll leave the display blank */
+         if (!connected) {
+            status = ScriptStatusEnum.NOT_CONNECTED;
+         } else {
+            status = ScriptStatusEnum.READY;
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java
new file mode 100644
index 0000000..50796e2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+public class ScriptTaskList {
+
+   private final Set<ITaskListViewer> changeListeners = new HashSet<>();
+   private final Vector<ScriptTask> tasks = new Vector<>();
+   private boolean isConnected = false;
+
+   /**
+    * Constructor
+    */
+   public ScriptTaskList() {
+      super();
+   }
+
+   public void addChangeListener(ITaskListViewer viewer) {
+      changeListeners.add(viewer);
+   }
+
+   /**
+    * Add a new task to the collection of tasks
+    */
+   public void addTask(ScriptTask inTask) {
+      inTask.updateStatusOnConnected(this.isConnected);
+      tasks.add(tasks.size(), inTask);
+      Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+      while (iterator.hasNext()) {
+         iterator.next().addTask(inTask);
+      }
+   }
+
+   public void addTasks(List<ScriptTask> inTasks) {
+      for (ScriptTask task : inTasks) {
+         task.updateStatusOnConnected(isConnected);
+      }
+      ScriptTask[] array = new ScriptTask[inTasks.size()];
+      this.tasks.addAll(inTasks);
+      Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+      while (iterator.hasNext()) {
+         iterator.next().addTasks(this.tasks.toArray(array));
+      }
+   }
+
+   /**
+    * Return the collection of ScriptTask
+    */
+   public Vector<ScriptTask> getTasks() {
+      return tasks;
+   }
+
+   public void onConnected(boolean connected) {
+      synchronized (tasks) {
+         this.isConnected = connected;
+         Iterator<ScriptTask> iter = tasks.iterator();
+         while (iter.hasNext()) {
+            ScriptTask task = iter.next();
+            //        	 task.computeExists();
+            task.updateStatusOnConnected(connected);
+         }
+      }
+   }
+
+   public void removeAllTasks() {
+      this.tasks.removeAllElements();
+   }
+
+   public void removeChangeListener(ITaskListViewer viewer) {
+      changeListeners.remove(viewer);
+   }
+
+   public void removeTask(ScriptTask task) {
+      tasks.remove(task);
+      Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+      while (iterator.hasNext()) {
+         iterator.next().removeTask(task);
+      }
+   }
+
+   public void taskChanged(ScriptTask task) {
+      Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+      while (iterator.hasNext()) {
+         iterator.next().updateTask(task);
+      }
+   }
+
+   @Override
+   public String toString() {
+      String str = "";
+      for (int i = 0; i < tasks.size(); i++) {
+         ScriptTask task = tasks.get(i);
+         str += "\nTask " + task.getName() + " Status: " + task.getStatus();
+      }
+      return str + "\n\n";
+   }
+
+   public boolean contains(ScriptTask newTask) {
+      for (ScriptTask task : tasks) {
+         if (task.getPath().equals(newTask.getPath())) {
+            return true;
+         }
+      }
+      return false;
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java
new file mode 100644
index 0000000..afd7e05
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable.xscript;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XScriptTable extends XViewer {
+
+   public XScriptTable(Composite parent, int style) {
+      super(parent, style, new XScriptTableFactory(), false, false);
+   }
+
+   @Override
+   public void handleDoubleClick(TreeColumn col, TreeItem item) {
+      XViewerColumn xcol = (XViewerColumn) col.getData();
+      ScriptTask task = (ScriptTask) item.getData();
+      if (XScriptTableFactory.RESULT.equals(xcol) || XScriptTableFactory.OUPUT_FILE.equals(xcol)) {
+         task.getScriptModel().getOutputModel().openEditor();
+      } else if (XScriptTableFactory.TEST_LOCATION.equals(xcol)) {
+         task.getScriptModel().openPackageExplorer();
+      } else if (XScriptTableFactory.TEST.equals(xcol)) {// != k) {
+         task.getScriptModel().openEditor();
+      }
+   }
+
+   @Override
+   public boolean handleLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+      XViewerColumn aCol = (XViewerColumn) treeColumn.getData();
+      if (XScriptTableFactory.RUN.equals(aCol)) {
+         ScriptTask task = (ScriptTask) treeItem.getData();
+         task.setRun(!task.isRun());
+         refresh(task);
+      }
+      return super.handleLeftClick(treeColumn, treeItem);
+   }
+
+   @Override
+   public boolean handleLeftClickInIconArea(TreeColumn treeColumn, TreeItem treeItem) {
+      XViewerColumn aCol = (XViewerColumn) treeColumn.getData();
+      if (XScriptTableFactory.RUN.equals(aCol)) {
+         ScriptTask task = (ScriptTask) treeItem.getData();
+         task.setRun(!task.isRun());
+         refresh(task);
+      }
+      return super.handleLeftClickInIconArea(treeColumn, treeItem);
+   }
+
+   public List<ScriptTask> getVisibleSortedScriptTasksToRun() {
+      Object[] objs = getSortedChildren(getInput());
+      List<ScriptTask> runs = new ArrayList<>();
+      for (Object obj : objs) {
+         if (((ScriptTask) obj).isRun()) {
+            runs.add((ScriptTask) obj);
+         }
+      }
+      return runs;
+   }
+
+   public List<ScriptTask> getVisibibleSortedScriptTasks() {
+      Object[] objs = getSortedChildren(getInput());
+      List<ScriptTask> runs = new ArrayList<>();
+      for (Object obj : objs) {
+         runs.add((ScriptTask) obj);
+      }
+      return runs;
+   }
+   
+   public boolean isRemoveItemsMenuOptionEnabled() {
+      return false;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java
new file mode 100644
index 0000000..91c7bff
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable.xscript;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ITaskListViewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTaskList;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class XScriptTableContentProvider implements IStructuredContentProvider, ITaskListViewer, ITreeContentProvider {
+
+   @Override
+   public Object[] getElements(Object inputElement) {
+      return getChildren(inputElement);
+   }
+
+   @Override
+   public void dispose() {
+   }
+
+   @Override
+   public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+   }
+
+   @Override
+   public void addTask(ScriptTask task) {
+   }
+
+   @Override
+   public void addTasks(ScriptTask[] tasks) {
+   }
+
+   @Override
+   public void removeTask(ScriptTask task) {
+   }
+
+   @Override
+   public void updateTask(ScriptTask task) {
+   }
+
+   @Override
+   public Object[] getChildren(Object parentElement) {
+      if (parentElement instanceof ScriptTaskList) {
+         return ((ScriptTaskList) parentElement).getTasks().toArray();
+      }
+      return null;
+   }
+
+   @Override
+   public Object getParent(Object element) {
+      return null;
+   }
+
+   @Override
+   public boolean hasChildren(Object element) {
+      Object[] children = getChildren(element);
+      if (children != null && children.length > 0) {
+         return true;
+      }
+      return false;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java
new file mode 100644
index 0000000..6b1cb74
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable.xscript;
+
+import java.io.File;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.core.model.SortDataType;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerAlign;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.customize.FileStoreCustomizations;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XScriptTableFactory extends XViewerFactory {
+   private static String COLUMN_NAMESPACE = "xviewer.script.table";
+   public static XViewerColumn RUN = new XViewerColumn(COLUMN_NAMESPACE + ".run", "Run", 42, XViewerAlign.Left, true,
+      SortDataType.Boolean, false, null);
+   public static XViewerColumn TEST = new XViewerColumn(COLUMN_NAMESPACE + ".test", "Test", 275, XViewerAlign.Left, true,
+      SortDataType.String, false, null);
+   public static XViewerColumn STATUS = new XViewerColumn(COLUMN_NAMESPACE + ".status", "Status", 125, XViewerAlign.Left, true,
+      SortDataType.String, false, null);
+   public static XViewerColumn RESULT = new XViewerColumn(COLUMN_NAMESPACE + ".result", "Result", 125, XViewerAlign.Left, true,
+      SortDataType.String, false, null);
+   public static XViewerColumn OUPUT_FILE = new XViewerColumn(COLUMN_NAMESPACE + ".outfile", "Output File", 70,
+      XViewerAlign.Left, true, SortDataType.String, false, null);
+   public static XViewerColumn TEST_LOCATION = new XViewerColumn(COLUMN_NAMESPACE + ".testlocation", "Test Location",
+      160, XViewerAlign.Left, true, SortDataType.String, false, null);
+
+   private final FileStoreCustomizations propertyStoreCustomizations;
+
+   private static final String defaultCustomDataXml =
+      "<XTreeProperties name=\"default\" namespace=\"xviewer.script.table\" guid=\"710h7sah9dtt01464nvkkv\"><xSorter><id>xviewer.script.table.test</id></xSorter><xSorter><id>xviewer.script.table.test</id></xSorter><xFilter></xFilter><xCol><id>xviewer.script.table.run</id><name>Run</name><wdth>42</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.test</id><name>Test</name><wdth>351</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.result</id><name>Result</name><wdth>110</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.status</id><name>Status</name><wdth>125</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.outfile</id><name>Output File</name><wdth>75</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.testlocation</id><name>Test Location</name><wdth>160</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol></XTreeProperties>";
+
+   public XScriptTableFactory() {
+      super(COLUMN_NAMESPACE);
+      File folder;
+      try {
+         folder = OseeData.getFolder("OteScriptTable").getLocation().toFile();
+      } catch (OseeCoreException ex) {
+         OseeLog.log(XScriptTableFactory.class, Level.SEVERE, ex);
+         folder = new File(System.getProperty("java.io.tmpdir"));
+      }
+      propertyStoreCustomizations =
+         new FileStoreCustomizations(folder, "OteScript", ".xml", "DefaultOteScript.xml", defaultCustomDataXml);
+      registerColumns(RUN, TEST, RESULT, STATUS, OUPUT_FILE, TEST_LOCATION);
+   }
+
+   @Override
+   public IXViewerCustomizations getXViewerCustomizations() {
+      return propertyStoreCustomizations;
+   }
+
+   @Override
+   public boolean isAdmin() {
+      return true;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java
new file mode 100644
index 0000000..0fb36e4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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.ui.test.manager.pages.scriptTable.xscript;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask.ScriptStatusEnum;
+import org.eclipse.swt.graphics.Image;
+
+public class XScriptTableLabelProvider extends XViewerLabelProvider {
+   public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+   private static Image checkedImage = ImageManager.getImage(OteTestManagerImage.CHECKBOX_ENABLED);
+   private static Image outputImage = ImageManager.getImage(OteTestManagerImage.CHECK);
+   private static Map<ScriptStatusEnum, Image> statusImage = new HashMap<>();
+   private static Image uncheckedImage = ImageManager.getImage(OteTestManagerImage.CHECKBOX_DISABLED);
+
+   public XScriptTableLabelProvider(XScriptTable viewer) {
+      super(viewer);
+      if (statusImage.isEmpty()) {
+         statusImage.put(ScriptStatusEnum.NOT_CONNECTED, ImageManager.getImage(OteTestManagerImage.ALERT_OBJ));
+         statusImage.put(ScriptStatusEnum.READY, ImageManager.getImage(OteTestManagerImage.SCRIPT_READY_SM));
+         statusImage.put(ScriptStatusEnum.IN_QUEUE, ImageManager.getImage(OteTestManagerImage.SCRIPT_IN_QUEUE_SM));
+         statusImage.put(ScriptStatusEnum.RUNNING, ImageManager.getImage(OteTestManagerImage.SCRIPT_RUNNING));
+         statusImage.put(ScriptStatusEnum.COMPLETE, ImageManager.getImage(OteTestManagerImage.SCRIPT_COMPLETE_SM));
+         statusImage.put(ScriptStatusEnum.CANCELLED, ImageManager.getImage(OteTestManagerImage.SCRIPT_CANCELLED_SM));
+         statusImage.put(ScriptStatusEnum.CANCELLING, ImageManager.getImage(OteTestManagerImage.SCRIPT_CANCELLING_SM));
+         statusImage.put(ScriptStatusEnum.INVALID, ImageManager.getImage(OteTestManagerImage.ERROR_STACK));
+         statusImage.put(ScriptStatusEnum.INCOMPATIBLE, ImageManager.getImage(OteTestManagerImage.ERROR_STACK));
+      }
+   };
+
+   private Image getOutputImage(ScriptTask task) {
+      if (task.isOutputExists()) {
+         return outputImage;
+      }
+      return null;
+   }
+
+   private Image getPassFailImage(ScriptTask task) {
+      Matcher m = Pattern.compile("(FAIL|ABORTED)").matcher(task.getPassFail());
+      if (m.find()) {
+         return statusImage.get(ScriptStatusEnum.INVALID);
+      }
+      return null;
+   }
+
+   /**
+    * Returns the image with the given key, or <code>null</code> if not found.
+    */
+   private Image getRunImage(boolean isSelected) {
+      return isSelected ? checkedImage : uncheckedImage;
+   }
+
+   private Image getStatusImage(ScriptStatusEnum status) {
+      return statusImage.get(status);
+   }
+
+   @Override
+   public Image getColumnImage(Object element, XViewerColumn col, int columnIndex) throws Exception {
+      if (XScriptTableFactory.OUPUT_FILE.equals(col)) {
+         return getOutputImage(((ScriptTask) element));
+      } else if (XScriptTableFactory.RUN.equals(col)) {
+         return getRunImage(((ScriptTask) element).isRun());
+      } else if (XScriptTableFactory.STATUS.equals(col)) {
+         return getStatusImage(((ScriptTask) element).getStatus());
+      } else if (XScriptTableFactory.RESULT.equals(col)) {
+         return getPassFailImage(((ScriptTask) element));
+      }
+      return null;
+   }
+
+   @Override
+   public String getColumnText(Object element, XViewerColumn col, int columnIndex) throws Exception {
+      ScriptTask task = (ScriptTask) element;
+      if (XScriptTableFactory.STATUS.equals(col)) {
+         return task.getStatus().toString();
+      } else if (XScriptTableFactory.RESULT.equals(col)) {
+         return task.getPassFail();
+      } else if (XScriptTableFactory.TEST.equals(col)) {
+         return task.getName();
+      } else if (XScriptTableFactory.TEST_LOCATION.equals(col)) {
+         return task.getPath();
+      } else if (XScriptTableFactory.RUN.equals(col)) {
+         return task.getRunStatus().toString();
+      }
+
+      return "";
+   }
+
+   @Override
+   public void addListener(ILabelProviderListener listener) {
+   }
+
+   @Override
+   public void dispose() {
+   }
+
+   @Override
+   public boolean isLabelProperty(Object element, String property) {
+      return false;
+   }
+
+   @Override
+   public void removeListener(ILabelProviderListener listener) {
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java
new file mode 100644
index 0000000..3aa64e9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * 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.ui.test.manager.panels;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FileOrDirectorySelectionPanel extends Composite {
+
+   private static final Image FILE_SELECT_IMAGE = ImageManager.getImage(OteTestManagerImage.FILE);
+   private static final String DIRECTORY_ERROR_MESSAGE = "Directory should be blank or set an accessible directory.";
+   private static final String FILE_ERROR_MESSAGE = "Unable to access file.";
+   private static final String DEFAULT_FILE = "/dev/null";
+
+   private StyledText textField;
+   private Label labelField;
+   private final String labelText;
+   private final String toolTipText;
+   private final boolean isDirectory;
+
+   public FileOrDirectorySelectionPanel(Composite parent, int style, String labelText, String toolTipText, boolean isDirectory) {
+      super(parent, style);
+      this.labelText = labelText;
+      this.toolTipText = toolTipText;
+      this.isDirectory = isDirectory;
+      GridLayout gl = new GridLayout(3, false);
+      gl.marginHeight = 0;
+      gl.marginWidth = 0;
+      this.setLayout(gl);
+      this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+      createControl(this);
+   }
+
+   private void createControl(Composite parent) {
+      labelField = new Label(parent, SWT.NONE);
+      labelField.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, false, false));
+      labelField.setText(labelText);
+      labelField.setToolTipText(toolTipText);
+
+      textField = new StyledText(parent, SWT.BORDER);
+      textField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+      if (isDirectory != true) {
+         textField.setText(DEFAULT_FILE);
+      }
+      Button fileDialog = new Button(parent, SWT.NONE);
+      fileDialog.setLayoutData(new GridData(SWT.FILL, SWT.END, false, false));
+      fileDialog.setImage(FILE_SELECT_IMAGE);
+      fileDialog.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            createDialog();
+         }
+      });
+
+   }
+
+   private void createDialog() {
+      Shell shell = AWorkbench.getActiveShell();
+      String selection = "";
+      if (isDirectory == true) {
+         DirectoryDialog directoryDialog = new DirectoryDialog(shell, SWT.OPEN);
+
+         String defaultDir = textField.getText();
+         File dir = new File(defaultDir);
+         if (dir.isFile() || dir.isDirectory()) {
+            directoryDialog.setFilterPath(defaultDir);
+         } else {
+            directoryDialog.setFilterPath("Y:\\");
+         }
+         selection = directoryDialog.open();
+      } else {
+         FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
+         selection = fileDialog.open();
+      }
+      setSelected(selection);
+   }
+
+   private void verifySelection() {
+      String text = getSelected();
+      if (isValid() != true) {
+         if (isDirectory == true) {
+            text = "";
+         } else {
+            text = DEFAULT_FILE;
+         }
+         Dialogs.popupError("Error", getErrorMessage());
+      }
+      if (textField.getText().equals(text) != true) {
+         textField.setText(text);
+      }
+   }
+
+   private boolean isValidFile(String text) {
+      File file = new File(text);
+      return file != null && file.exists() != false && file.canWrite() != false;
+   }
+
+   public boolean isValid() {
+      boolean toReturn = false;
+      String text = getSelected();
+      if (isDirectory == true) {
+         toReturn = Strings.isValid(text) == true ? isValidFile(text) : true;
+      } else {
+         //         if (Strings.isValid(text) == true) {
+         //            if (text.equals(DEFAULT_FILE) == true) {
+         toReturn = true;
+         //            } else {
+         //               toReturn = isValidFile(text);
+         //            }
+         //         }
+      }
+      return toReturn;
+   }
+
+   public String getErrorMessage() {
+      return isDirectory == true ? DIRECTORY_ERROR_MESSAGE : FILE_ERROR_MESSAGE;
+   }
+
+   public String getSelected() {
+      return textField != null && textField.isDisposed() != true ? textField.getText() : "";
+   }
+
+   public void setSelected(String value) {
+      if (textField != null && textField.isDisposed() != true) {
+         if (Strings.isValid(value)) {
+            textField.setText(value);
+         }
+         verifySelection();
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java
new file mode 100644
index 0000000..7139e96
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * 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.ui.test.manager.panels;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LoggingPanel extends Composite {
+
+   private enum LoggingLevel {
+      Minimal(Level.WARNING),
+      Detailed(Level.INFO),
+      All(Level.ALL);
+
+      private Level level;
+
+      LoggingLevel(Level level) {
+         this.level = level;
+      }
+
+      public Level getLevel() {
+         return level;
+      }
+
+      public static LoggingLevel fromLevel(Level value) {
+         LoggingLevel toReturn = LoggingLevel.Detailed;
+         if (value != null) {
+            for (LoggingLevel formatType : LoggingLevel.values()) {
+               if (formatType.getLevel().equals(value)) {
+                  toReturn = formatType;
+                  break;
+               }
+            }
+         }
+         return toReturn;
+      }
+
+   }
+
+   private Map<LoggingLevel, Button> buttonMap;
+   private LoggingLevel lastSelected;
+
+   public LoggingPanel(Composite parent, int style) {
+      super(parent, style);
+      GridLayout gl = new GridLayout();
+      gl.marginHeight = 0;
+      gl.marginWidth = 0;
+      this.setLayout(gl);
+      this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+      createControl(this);
+   }
+
+   private void createControl(Composite parent) {
+      LoggingLevel[] levels = LoggingLevel.values();
+      this.buttonMap = new HashMap<>();
+      Composite composite = new Composite(parent, SWT.NONE);
+      GridLayout gl = new GridLayout();
+      gl.marginHeight = 0;
+      gl.marginWidth = 0;
+      composite.setLayout(gl);
+      composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+      for (int index = 0; index < levels.length; index++) {
+         LoggingLevel level = levels[index];
+
+         Button button = new Button(composite, SWT.RADIO);
+         button.setData(level);
+         button.setText(level.name());
+         button.addSelectionListener(new SelectionAdapter() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+               Object object = e.getSource();
+               if (object instanceof Button) {
+                  setSelected((Button) object);
+               }
+            }
+
+         });
+         boolean isDefault = index == 1;
+         button.setSelection(isDefault);
+         if (isDefault != false) {
+            lastSelected = level;
+         }
+         buttonMap.put(level, button);
+      }
+   }
+
+   private void setSelected(Button button) {
+      if (button.getSelection() != false) {
+         lastSelected = (LoggingLevel) button.getData();
+      }
+   }
+
+   public String getSelected() {
+      return lastSelected.getLevel().toString();
+   }
+
+   public void setSelected(String value) {
+      Level level = LoggingLevel.Detailed.getLevel();
+      try {
+         level = Level.parse(value);
+      } catch (Exception ex) {
+         OseeLog.logf(TestManagerPlugin.class, Level.WARNING,
+            "Error parsing log level [%s] using default [%s]", value, level);
+      }
+
+      LoggingLevel loggingLevel = LoggingLevel.fromLevel(level);
+      this.lastSelected = loggingLevel;
+      for (LoggingLevel keys : buttonMap.keySet()) {
+         Button button = buttonMap.get(keys);
+         button.setSelection(keys.equals(loggingLevel));
+      }
+   }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java
new file mode 100644
index 0000000..6b41c5e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * 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.ui.test.manager.panels;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ScriptExecutionOptionsPanel extends Composite {
+   private Button saveOutputCheck;
+   private Button batchModeCheck;
+   private Button abortScriptOnFirstFail;
+   private Button pauseScriptOnFail;
+   private Button printFailToConsole;
+
+   public ScriptExecutionOptionsPanel(Composite parent, int style) {
+      super(parent, style);
+      GridLayout gl = new GridLayout();
+      gl.marginHeight = 0;
+      gl.marginWidth = 0;
+      this.setLayout(gl);
+      this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+      createControl(this);
+   }
+
+   private void createControl(Composite parent) {
+      saveOutputCheck = new Button(parent, SWT.CHECK);
+      saveOutputCheck.setText("Keep copies of old Output Files");
+      saveOutputCheck.setToolTipText("Select to save existing output filename\n" + "to file \"<output>.[num].tmo\" for each succssive run.\n" + "De-select overwrites output file.\n\n" + "     eg. myScript.tmo = current output\n" + "         myScript.1.tmo = oldest output file\n" + "         myScript.2.tmo = output before current");
+
+      batchModeCheck = new Button(parent, SWT.CHECK);
+      batchModeCheck.setText("Run in batch mode");
+      batchModeCheck.setToolTipText("If any prompts exist, they are skipped if this option is selected.");
+      
+      abortScriptOnFirstFail = new Button(parent, SWT.CHECK);
+      abortScriptOnFirstFail.setText("Abort script on first fail");
+      abortScriptOnFirstFail.setToolTipText("Any script fail will cause the current script to be aborted.");
+      
+      pauseScriptOnFail = new Button(parent, SWT.CHECK);
+      pauseScriptOnFail.setText("Pause script on fail");
+      pauseScriptOnFail.setToolTipText("Each script failure will cause a promptPause to occur.");
+
+      printFailToConsole = new Button(parent, SWT.CHECK);
+      printFailToConsole.setText("Print failures to console");
+      printFailToConsole.setToolTipText("Prints each failure to the console as the script runs.");
+   }
+
+   public boolean isKeepOldCopiesEnabled() {
+      return saveOutputCheck.getSelection();
+   }
+
+   public void setKeepOldCopiesEnabled(boolean isEnabled) {
+      saveOutputCheck.setSelection(isEnabled);
+   }
+
+   public boolean isBatchModeEnabled() {
+      return batchModeCheck.getSelection();
+   }
+
+   public void setBatchModeEnabled(boolean isEnabled) {
+      batchModeCheck.setSelection(isEnabled);
+   }
+   
+   public boolean isAbortOnFail(){
+      return abortScriptOnFirstFail.getSelection();
+   }
+   
+   public void setAbortOnFail(boolean isEnabled){
+      abortScriptOnFirstFail.setSelection(isEnabled);
+   }
+   
+   public boolean isPauseOnFail(){
+      return pauseScriptOnFail.getSelection();
+   }
+   
+   public void setPauseOnFail(boolean isEnabled){
+      pauseScriptOnFail.setSelection(isEnabled);
+   }
+
+   public boolean isPrintFailToConsole(){
+      return printFailToConsole.getSelection();
+   }
+   
+   public void setPrintFailToConsole(boolean isEnabled){
+      printFailToConsole.setSelection(isEnabled);
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java
new file mode 100644
index 0000000..06e2e7b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * 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.ui.test.manager.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.preferences.environment.EnvironmentPreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestManagerPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+   public static final String TEST_MANAGER_KEY = "org.eclipse.osee.ote.ui.test.manager.PreferencePage";
+   private EnvironmentPreferencePage environmentPreferencePage;
+
+   @Override
+   public void init(IWorkbench workbench) {
+      // Initialize the preference store we wish to use
+      setPreferenceStore(TestManagerPlugin.getInstance().getPreferenceStore());
+   }
+
+   @Override
+   public boolean performOk() {
+      environmentPreferencePage.storeVariables();
+
+      return super.performOk();
+   }
+
+   private Control createBlankArea(Composite parent, int height, boolean allVertical) {
+      Composite blank = new Composite(parent, SWT.NONE);
+      GridLayout gridLayout = new GridLayout();
+      GridData gd = new GridData();
+      gd.minimumHeight = height;
+      gd.grabExcessHorizontalSpace = true;
+      gd.grabExcessVerticalSpace = allVertical;
+      blank.setLayout(gridLayout);
+      blank.setLayoutData(gd);
+      return parent;
+   }
+
+   private Control createDefaultEvironmentVariablesArea(Composite parent) {
+
+      SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
+      GridLayout gridLayout = new GridLayout();
+      gridLayout.numColumns = 1;
+
+      GridData d = new GridData(GridData.FILL_BOTH);
+      d.grabExcessHorizontalSpace = true;
+      d.grabExcessVerticalSpace = true;
+      sashForm.setLayout(gridLayout);
+      sashForm.setLayoutData(d);
+
+      environmentPreferencePage = new EnvironmentPreferencePage(sashForm);
+
+      return parent;
+   }
+
+   private void createPageDescription(Composite parent) {
+      new Label(parent, SWT.NONE).setText("Test Manager Settings:");
+   }
+
+   @Override
+   protected Control createContents(Composite parent) {
+
+      createPageDescription(parent);
+      createBlankArea(parent, 0, false);
+      createDefaultEvironmentVariablesArea(parent);
+      // createBlankArea(parent, 300, true);
+
+      return parent;
+   }
+
+   @Override
+   protected void performApply() {
+      performOk();
+   }
+
+   @Override
+   protected void performDefaults() {
+
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.java
new file mode 100644
index 0000000..eeebfb5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.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.ui.test.manager.preferences.environment;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPageDataViewer {
+
+   private Group environmentVariable;
+   private EnvironmentPreferenceNode nodeToDisplay;
+   private final ArrayList<StyleRange> styleArray;
+   private StyledText textArea;
+
+   public EnvironmentPageDataViewer(Composite parent) {
+      createArea(parent);
+      styleArray = new ArrayList<>();
+   }
+
+   public void clearTextArea() {
+      textArea.setText("");
+      styleArray.clear();
+      textArea.redraw();
+   }
+
+   public void setNodeToDisplay(EnvironmentPreferenceNode nodeToDisplay) {
+      this.nodeToDisplay = nodeToDisplay;
+      update();
+   }
+
+   public void setTitleName(String name) {
+      environmentVariable.setText("Preview Environment Variable: " + name);
+      environmentVariable.redraw();
+   }
+
+   public void update() {
+      clearTextArea();
+      if (nodeToDisplay != null) {
+         setTitleName(nodeToDisplay.getEnvName());
+         addEntry(nodeToDisplay.getEnvName(), nodeToDisplay.getValue());
+      } else {
+         setTitleName("NONE SELECTED");
+      }
+   }
+
+   private void addEntry(String name, String value) {
+      addEntryName(name);
+      addEntryValue(value);
+   }
+
+   private void addEntryName(String name) {
+      if (name != null) {
+         String temp = textArea.getText();
+         temp += "\n\t";
+         int startIndex = temp.length();
+         temp += name;
+         textArea.setText(temp);
+         StyleRange tempStyle = new StyleRange();
+         styleArray.add(tempStyle);
+         tempStyle.fontStyle = SWT.BOLD;
+         tempStyle.start = startIndex;
+         tempStyle.length = name.length();
+         tempStyle.underline = true;
+         tempStyle.foreground = Displays.getSystemColor(SWT.COLOR_DARK_BLUE);
+         textArea.setStyleRanges(styleArray.toArray(new StyleRange[styleArray.size()]));
+         textArea.redraw();
+      }
+   }
+
+   private void addEntryValue(String value) {
+      if (value != null) {
+         String temp = textArea.getText();
+         temp += " = ";
+         int startIndex = temp.length();
+         String toAdd = value.replaceAll(":", ":\n\t\t");
+         temp += toAdd;
+         textArea.setText(temp + "\n");
+         StyleRange tempStyle = new StyleRange();
+         styleArray.add(tempStyle);
+         tempStyle.fontStyle = SWT.ITALIC;
+         tempStyle.start = startIndex;
+         tempStyle.length = toAdd.length();
+         tempStyle.foreground = Displays.getSystemColor(SWT.COLOR_BLACK);
+         textArea.setStyleRanges(styleArray.toArray(new StyleRange[styleArray.size()]));
+         textArea.redraw();
+      }
+   }
+
+   private Control createArea(Composite parent) {
+      GridData d = new GridData(GridData.FILL_BOTH);
+
+      environmentVariable = new Group(parent, SWT.NONE);
+      environmentVariable.setText("Preview Environment Variable:");
+      GridLayout gridLayout = new GridLayout();
+      gridLayout.numColumns = 1;
+      environmentVariable.setLayout(gridLayout);
+      environmentVariable.setLayoutData(d);
+
+      Composite topLevelComposite = new Composite(environmentVariable, SWT.NONE);
+      gridLayout = new GridLayout();
+      gridLayout.numColumns = 1;
+      topLevelComposite.setLayout(gridLayout);
+      topLevelComposite.setLayoutData(d);
+      topLevelComposite.setToolTipText("Select a Value From the Tree to Display");
+
+      textArea = new StyledText(topLevelComposite, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+      textArea.setEditable(false);
+      GridLayout gL = new GridLayout();
+      gL.numColumns = 1;
+      textArea.setLayout(gL);
+      textArea.setLayoutData(d);
+      textArea.setBackground(Displays.getSystemColor(SWT.COLOR_WHITE));
+      textArea.setToolTipText("Select a Value From the Tree to Display");
+
+      return parent;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java
new file mode 100644
index 0000000..8544f9e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * 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.ui.test.manager.preferences.environment;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.util.EnvVariableDetailsDialogHelper;
+import org.eclipse.osee.ote.ui.test.manager.util.EnvVariableDialogHelper;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPageEventHandler {
+
+   private EnvironmentPreferenceNode currentSelection;
+   private final EnvironmentPageDataViewer environmentPageDataViewer;
+   private final ArrayList<EnvironmentPreferenceNode> treeInputList;
+   private final CheckboxTreeViewer treeViewer;
+
+   public EnvironmentPageEventHandler(Composite parent, CheckboxTreeViewer treeViewer, ArrayList<EnvironmentPreferenceNode> treeInputList) {
+      this.treeViewer = treeViewer;
+      this.treeInputList = treeInputList;
+      this.environmentPageDataViewer = new EnvironmentPageDataViewer(parent);
+   }
+
+   public void editEnvVariable(EnvironmentPreferenceNode node) {
+      EnvVariableDetailsDialogHelper selection = new EnvVariableDetailsDialogHelper(node.getEnvName(), node.getValue());
+      Displays.pendInDisplayThread(selection);
+      if (selection.getResult() != Window.CANCEL) {
+         node.setValue(selection.getSelection());
+         environmentPageDataViewer.update();
+      }
+   }
+
+   public void handleAddEnvironmentVariableEvent() {
+      EnvVariableDialogHelper selection = new EnvVariableDialogHelper();
+      Displays.pendInDisplayThread(selection);
+      if (selection.getResult() != Window.CANCEL) {
+         this.addEnvironmentVariable(selection.getSelection());
+         treeViewer.refresh();
+      }
+   }
+
+   public void handleCheckStateChangeEvent(CheckStateChangedEvent event) {
+      Object obj = event.getElement();
+      if (obj != null) {
+         EnvironmentPreferenceNode tempSelection = null;
+
+         if (obj instanceof EnvironmentPreferenceNode) {
+            tempSelection = (EnvironmentPreferenceNode) obj;
+            tempSelection.setChecked(event.getChecked());
+            currentSelection = tempSelection;
+            environmentPageDataViewer.setNodeToDisplay(currentSelection);
+         }
+      }
+   }
+
+   public void handleEditVariableEvent() {
+      ISelection sel = this.treeViewer.getSelection();
+      if (!sel.isEmpty()) {
+         TreeObject selectedItem = (TreeObject) ((StructuredSelection) sel).getFirstElement();
+         if (selectedItem instanceof EnvironmentPreferenceNode) {
+            editEnvVariable((EnvironmentPreferenceNode) selectedItem);
+         }
+      }
+   }
+
+   public void handleRemoveSelectedViewEvent() {
+      StructuredSelection sel = (StructuredSelection) treeViewer.getSelection();
+      if (!sel.isEmpty()) {
+         Iterator<?> it = sel.iterator();
+         while (it.hasNext()) {
+            TreeObject leaf = (TreeObject) it.next();
+            if (leaf instanceof TreeParent) {
+               treeInputList.remove(leaf);
+               environmentPageDataViewer.setNodeToDisplay(null);
+            } else {
+               leaf.getParent().removeChild(leaf);
+               environmentPageDataViewer.update();
+            }
+         }
+         treeViewer.refresh();
+      }
+   }
+
+   public void handleTreeSelectionEvent(SelectionChangedEvent event) {
+      ISelection sel = event.getSelection();
+      if (!sel.isEmpty()) {
+         TreeObject selectedItem = (TreeObject) ((StructuredSelection) sel).getFirstElement();
+
+         EnvironmentPreferenceNode tempSelection = null;
+
+         if (selectedItem instanceof EnvironmentPreferenceNode) {
+            tempSelection = (EnvironmentPreferenceNode) selectedItem;
+            currentSelection = tempSelection;
+            environmentPageDataViewer.setNodeToDisplay(currentSelection);
+         }
+         treeViewer.refresh();
+      }
+   }
+
+   private void addEnvironmentVariable(String name) {
+      EnvironmentPreferenceNode node = new EnvironmentPreferenceNode(name);
+      treeInputList.add(node);
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java
new file mode 100644
index 0000000..1d2cbe6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.ui.test.manager.preferences.environment;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPreferenceNode extends TreeParent {
+
+   public boolean checked;
+   public String value;
+
+   public EnvironmentPreferenceNode(String name) {
+      super(name);
+      checked = false;
+      value = "";
+   }
+
+   public String getEnvName() {
+      return getName();
+   }
+
+   public String getValue() {
+      return value;
+   }
+
+   @Override
+   public boolean isChecked() {
+      return checked;
+   }
+
+   @Override
+   public void setChecked(boolean selected) {
+      this.checked = selected;
+   }
+
+   public void setEnvName(String name) {
+      setName(name);
+   }
+
+   public void setValue(String value) {
+      this.value = value;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java
new file mode 100644
index 0000000..2fe8f86
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * 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.ui.test.manager.preferences.environment;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPreferencePage {
+   public static final String CHECKED = "selected";
+   public static final String NAME = "name";
+   public static final String NUMBER_OF_VALUES = "numberOfValues";
+   public static final String PAGE_KEY = "org.eclipse.osee.ote.ui.test.manager.EnvironmentPreferencePage";
+   public static final String VALUE = "value";
+
+   public static Map<String, String> getSelectedItems() {
+      Map<String, String> environmentVariables = new HashMap<>();
+
+      ArrayList<EnvironmentPreferenceNode> envList = loadVariables();
+
+      for (EnvironmentPreferenceNode node : envList) {
+         if (node.isChecked()) {
+            String name = node.getEnvName();
+            String value = node.getValue();
+            if (Strings.isValid(name)) {
+               environmentVariables.put(name, value != null ? value : "");
+            }
+         }
+      }
+      return environmentVariables;
+   }
+
+   private static ArrayList<EnvironmentPreferenceNode> loadVariables() {
+      ArrayList<EnvironmentPreferenceNode> list = new ArrayList<>();
+      IPreferenceStore prefStore = TestManagerPlugin.getInstance().getPreferenceStore();
+
+      int numberOfValues = prefStore.getInt(PAGE_KEY + "." + NUMBER_OF_VALUES);
+      for (int index = 0; index < numberOfValues; index++) {
+         String name = prefStore.getString(PAGE_KEY + "." + NAME + "_" + index);
+         String value = prefStore.getString(PAGE_KEY + "." + VALUE + "_" + index);
+         String selectedString = prefStore.getString(PAGE_KEY + "." + CHECKED + "_" + index);
+         boolean selected = Boolean.parseBoolean(selectedString);
+
+         if (name != null && name != "") {
+            EnvironmentPreferenceNode node = new EnvironmentPreferenceNode(name);
+            node.setValue((value != null ? value : ""));
+            node.setChecked(selected);
+            list.add(node);
+         }
+      }
+      return list;
+   }
+
+   private Button addButton;
+
+   private Composite buttonComposite;
+   private EnvironmentPageEventHandler environmentPageEventHandler;
+   private Button removeButton;
+
+   private final ArrayList<EnvironmentPreferenceNode> treeInputList;
+
+   private CheckboxTreeViewer treeViewer;
+
+   public EnvironmentPreferencePage(Composite parent) {
+      this.treeInputList = loadVariables();
+      this.createTreeArea(parent);
+   }
+
+   public ISelection getSelection() {
+      return treeViewer.getSelection();
+   }
+
+   public void refresh() {
+      treeViewer.refresh();
+   }
+
+   public void storeVariables() {
+      IPreferenceStore prefStore = TestManagerPlugin.getInstance().getPreferenceStore();
+      prefStore.setValue(PAGE_KEY + "." + NUMBER_OF_VALUES, treeInputList.size());
+      int index = 0;
+      for (EnvironmentPreferenceNode node : treeInputList) {
+         index = treeInputList.indexOf(node);
+         String name = node.getEnvName();
+         if (name != null && name != "") {
+            prefStore.putValue(PAGE_KEY + "." + NAME + "_" + index, name);
+            String value = node.getValue();
+            prefStore.putValue(PAGE_KEY + "." + VALUE + "_" + index, (value != null ? value : ""));
+            prefStore.putValue(PAGE_KEY + "." + CHECKED + "_" + index, Boolean.toString(node.isChecked()));
+         }
+      }
+   }
+
+   private void attachListeners() {
+      treeViewer.getTree().addKeyListener(new KeyListener() {
+         @Override
+         public void keyPressed(KeyEvent e) {
+         }
+
+         @Override
+         public void keyReleased(KeyEvent e) {
+            if (e.character == SWT.DEL && (e.stateMask & SWT.CTRL) == 0) {
+               environmentPageEventHandler.handleRemoveSelectedViewEvent();
+            }
+         }
+      });
+
+      treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+         @Override
+         public void selectionChanged(SelectionChangedEvent event) {
+            environmentPageEventHandler.handleTreeSelectionEvent(event);
+         }
+      });
+
+      treeViewer.getTree().addMouseListener(new MouseListener() {
+         @Override
+         public void mouseDoubleClick(MouseEvent e) {
+            environmentPageEventHandler.handleEditVariableEvent();
+         }
+
+         @Override
+         public void mouseDown(MouseEvent e) {
+         }
+
+         @Override
+         public void mouseUp(MouseEvent e) {
+         }
+      });
+
+      treeViewer.addCheckStateListener(new ICheckStateListener() {
+
+         @Override
+         public void checkStateChanged(CheckStateChangedEvent event) {
+            environmentPageEventHandler.handleCheckStateChangeEvent(event);
+         }
+
+      });
+   }
+
+   private Control createButtonArea(Composite parent) {
+
+      buttonComposite = new Composite(parent, SWT.NONE);
+      GridLayout gridLayout = new GridLayout();
+      gridLayout.numColumns = 1;
+      GridData gd = new GridData(SWT.FILL);
+      buttonComposite.setLayout(gridLayout);
+      buttonComposite.setLayoutData(gd);
+
+      addButton = new Button(buttonComposite, SWT.PUSH);
+      addButton.setText("Add");
+      addButton.addSelectionListener(new SelectionListener() {
+
+         @Override
+         public void widgetDefaultSelected(SelectionEvent e) {
+            widgetSelected(e);
+         }
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            environmentPageEventHandler.handleAddEnvironmentVariableEvent();
+         }
+      });
+
+      removeButton = new Button(buttonComposite, SWT.PUSH);
+      removeButton.setText("Remove");
+      removeButton.addSelectionListener(new SelectionListener() {
+
+         @Override
+         public void widgetDefaultSelected(SelectionEvent e) {
+            widgetSelected(e);
+         }
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            environmentPageEventHandler.handleRemoveSelectedViewEvent();
+         }
+
+      });
+      return parent;
+   }
+
+   private Control createTreeArea(Composite parent) {
+
+      Group defaultEnvironmentVariablesGroup = new Group(parent, SWT.NONE);
+      defaultEnvironmentVariablesGroup.setText("Select Default Environment Variables to Use");
+      GridLayout gL = new GridLayout();
+      gL.numColumns = 2;
+      GridData gd = new GridData(GridData.FILL_BOTH);
+      gd.grabExcessHorizontalSpace = true;
+      gd.grabExcessVerticalSpace = true;
+      defaultEnvironmentVariablesGroup.setLayout(gL);
+      defaultEnvironmentVariablesGroup.setLayoutData(gd);
+
+      Composite areaComposite = new Composite(defaultEnvironmentVariablesGroup, SWT.NONE);
+      GridLayout treeLayout = new GridLayout();
+      treeLayout.numColumns = 1;
+      GridData gd1 = new GridData();
+      gd1.horizontalAlignment = GridData.FILL;
+      gd1.verticalAlignment = GridData.FILL;
+      gd1.grabExcessHorizontalSpace = true;
+      gd1.grabExcessVerticalSpace = true;
+      areaComposite.setLayout(treeLayout);
+      areaComposite.setLayoutData(gd1);
+
+      GridData treeGridData = new GridData();
+      treeGridData.grabExcessHorizontalSpace = true;
+      treeGridData.grabExcessVerticalSpace = true;
+      treeGridData.horizontalAlignment = GridData.FILL;
+      treeGridData.verticalAlignment = GridData.FILL;
+
+      treeViewer =
+         new CheckboxTreeViewer(areaComposite, SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+      treeViewer.getTree().setLayoutData(treeGridData);
+      treeViewer.setContentProvider(new ITreeContentProvider() {
+
+         @Override
+         public void dispose() {
+
+         }
+
+         @Override
+         public Object[] getChildren(Object parentElement) {
+            if (parentElement != null && parentElement instanceof TreeParent) {
+               TreeParent parent = (TreeParent) parentElement;
+               if (parent.hasChildren()) {
+                  return parent.getChildren();
+               }
+            }
+            return new Object[0];
+         }
+
+         @Override
+         public Object[] getElements(Object inputElement) {
+            if (inputElement != null && inputElement instanceof ArrayList<?>) {
+               ArrayList<?> elementArray = (ArrayList<?>) inputElement;
+               return elementArray.toArray();
+            }
+            return new Object[0];
+         }
+
+         @Override
+         public Object getParent(Object element) {
+            if (element != null && element instanceof TreeObject) {
+               TreeObject child = (TreeObject) element;
+               return child.getParent();
+            }
+            return new Object();
+         }
+
+         @Override
+         public boolean hasChildren(Object element) {
+            if (element instanceof TreeParent) {
+               TreeParent parent = (TreeParent) element;
+               return parent.hasChildren();
+            }
+            return false;
+         }
+
+         @Override
+         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+         }
+      });
+      treeViewer.setLabelProvider(new LabelProvider() {
+
+         @Override
+         public Image getImage(Object obj) {
+            return ImageManager.getImage(OteTestManagerImage.ENVIRONMENT);
+         }
+
+         @Override
+         public String getText(Object obj) {
+            return obj.toString();
+         }
+      });
+      treeViewer.setInput(treeInputList);
+      treeViewer.getTree().setToolTipText("Double click on an item to edit.\nClick once to preview content.");
+
+      environmentPageEventHandler = new EnvironmentPageEventHandler(parent, treeViewer, treeInputList);
+
+      createButtonArea(defaultEnvironmentVariablesGroup);
+
+      attachListeners();
+
+      for (EnvironmentPreferenceNode parentNode : treeInputList) {
+         treeViewer.setChecked(parentNode, parentNode.isChecked());
+      }
+
+      return parent;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/ClassServerInst.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/ClassServerInst.java
new file mode 100644
index 0000000..7a8549a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/ClassServerInst.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * 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.ui.test.manager.util;
+
+import java.io.File;
+import java.net.BindException;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.CorePreferences;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.classserver.ClassServer;
+import org.eclipse.osee.ote.classserver.PathResourceFinder;
+import org.eclipse.osee.ote.runtimemanager.UserLibResourceFinder;
+
+public class ClassServerInst {
+   private ClassServer classServer;
+   private String classServerPath;
+   private PathResourceFinder pathResourceFinder;
+
+   private static ClassServerInst instance = null;
+
+   public static ClassServerInst getInstance() {
+      if (instance == null) {
+         instance = new ClassServerInst();
+      }
+      return instance;
+   }
+
+   /**
+    * Creates a new ClassServer which will serve all projects currently in the workspace
+    */
+   private ClassServerInst() {
+      try {
+         InetAddress useHostAddress = CorePreferences.getDefaultInetAddress();
+         classServer = new ClassServer(0, useHostAddress)//;
+            {
+               @Override
+               protected void fileDownloaded(String fp, InetAddress addr) {
+                  System.out.println("ClassServerInst: File " + fp + " downloaded to " + addr);
+               }
+            };
+         pathResourceFinder = new PathResourceFinder(new String[] {}, false);
+         classServer.addResourceFinder(new UserLibResourceFinder());
+         classServer.addResourceFinder(new OTEBuilderResourceFinder());
+         classServer.addResourceFinder(pathResourceFinder);
+         classServer.start();
+
+         classServerPath = classServer.getHostName().toString();// "http://" + useHostAddress.getHostAddress() + ":" + classServer.getPort() + "/";
+
+         Job job = new Job("Populating TM classserver with projects.") {
+
+            @Override
+            protected IStatus run(IProgressMonitor monitor) {
+               try {
+                  addAnyNewProjects();
+               } catch (Throwable th) {
+                  OseeLog.log(ClassServerInst.class, Level.SEVERE, th.getMessage(), th);
+               }
+               return Status.OK_STATUS;
+            }
+
+         };
+         job.schedule();
+      } catch (BindException ex) {
+         OseeLog.log(
+            ClassServerInst.class,
+            Level.SEVERE,
+            "Class Server not started.  Likely the IP address used is not local.  Set your IP address in the advanced page.",
+            ex);
+      } catch (Exception ex) {
+         OseeLog.log(ClassServerInst.class, Level.SEVERE, "Class Server not started.", ex);
+      }
+   }
+
+   /**
+    * Adds any newly created or checked out projects in the workspace to the ClassServer.
+    */
+   public void addAnyNewProjects() {
+      // the ClassServer maintains a list and checks that any passed in projects are not already in
+      // its list before adding new ones, so it is safe to simply pass the entire list of projects
+      pathResourceFinder.addPaths(getAllProjects());
+   }
+
+   /**
+    * @return the path to the class server, to be passed to the environment upon connection
+    */
+   public String getClassServerPath() {
+      return classServerPath;
+   }
+
+   /**
+    * Stops the class server. This should be called upon termination of the testManager
+    */
+   public void stopServer() {
+      classServer.terminate();
+   }
+
+   private String[] getAllProjects() {
+      ArrayList<String> list = new ArrayList<>();
+
+      IProject[] projects = AWorkspace.getProjects();
+      for (IProject project : projects) {
+         // If the project start with a '.', (i.e. a hidden project) do not include it in the class
+         // server
+         // This will keep .osee.data and others from being served
+         if (!project.isOpen()) {
+            continue;
+         }
+
+         IProjectDescription description;
+         try {
+            description = project.getDescription();
+            if (!project.getName().startsWith(".") && description.hasNature("org.eclipse.jdt.core.javanature")) {
+               List<File> fileList = getJavaProjectProjectDependancies(JavaCore.create(project));
+               for (File file : fileList) {
+                  list.add(file.getAbsolutePath());
+               }
+            }
+         } catch (CoreException ex) {
+            ex.printStackTrace();
+         }
+      }
+
+      return list.toArray(new String[list.size()]);
+   }
+   
+   /* 
+    * START Code Duplicated from AJavaProject because of release dependencies
+    */   
+   private final Map<IJavaProject, IClasspathEntry[]> cachedPath =
+         new HashMap<IJavaProject, IClasspathEntry[]>();
+   
+   private IClasspathEntry[] localGetResolvedClasspath(IJavaProject javaProject) throws JavaModelException {
+      IClasspathEntry[] paths = cachedPath.get(javaProject);
+      if (paths == null) {
+         paths = javaProject.getResolvedClasspath(true);
+         cachedPath.put(javaProject, paths);
+      }
+      return paths;
+   }
+   
+   private ArrayList<File> getJavaProjectProjectDependancies(IJavaProject javaProject) {
+      ArrayList<File> urls = new ArrayList<File>();
+      try {
+         IClasspathEntry[] paths = localGetResolvedClasspath(javaProject);
+         for (int i = 0; i < paths.length; i++) {
+            if (paths[i].getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
+               if (paths[i].getPath().toFile().exists()) {
+                  //          urls.add(paths[i].getPath().toFile());
+               } else {
+                  File file = null;
+                  file = new File(AWorkspace.getWorkspacePath().concat(paths[i].getPath().toOSString()));
+                  if (file.exists()) {
+                     urls.add(file);
+                  }
+               }
+            } else if (paths[i].getEntryKind() == IClasspathEntry.CPE_PROJECT) {
+               urls.add(new File(AWorkspace.getWorkspacePath().concat(
+                  paths[i].getPath().toFile().getPath().concat(File.separator + "bin" + File.separator))));
+            } else if (paths[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+               File projectlocation = javaProject.getProject().getLocation().toFile();
+               File projecttricky = javaProject.getProject().getFullPath().toFile();
+               IPath output = paths[i].getOutputLocation();
+               File fileLocation;
+               if (output == null) {
+                  fileLocation = javaProject.getOutputLocation().toFile();
+               } else {
+                  fileLocation = paths[i].getOutputLocation().toFile();
+               }
+               String realLocation =
+                  fileLocation.toString().replace(projecttricky.toString(), projectlocation.toString());
+               urls.add(new File(realLocation));
+            }
+         }
+
+      } catch (JavaModelException ex) {
+         ex.printStackTrace();
+      }
+      return urls;
+   }
+   /* 
+    * STOP Code Duplicated from AJavaProject because of release dependencies
+    */
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/Dialogs.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/Dialogs.java
new file mode 100644
index 0000000..6b11da2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/Dialogs.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.PlatformUI;
+
+public class Dialogs {
+
+   public static void popupError(String title, String message) {
+      MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title, message);
+   }
+
+   public static void popupInformational(String title, String message) {
+      MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title, message);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java
new file mode 100644
index 0000000..083c4ca
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * 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.ui.test.manager.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDetailsDialog extends MessageDialog {
+
+   private Button cancelButton;
+   private final String dialogMessage;
+
+   private Button okButton;
+
+   private Button importButton;
+
+   private String selection;
+   private boolean selectionOk;
+   private StyledText textArea;
+
+   public EnvVariableDetailsDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String oldValue) {
+      super(parentShell, dialogTitle, dialogTitleImage, null, dialogImageType, dialogButtonLabels, defaultIndex);
+
+      this.selectionOk = false;
+      this.selection = oldValue;
+      this.dialogMessage = dialogMessage;
+   }
+
+   public String getSelection() {
+      return selection;
+   }
+
+   public boolean isValid() {
+      return selectionOk;
+   }
+
+   @Override
+   protected Control createButtonBar(Composite parent) {
+      Control c = super.createButtonBar(parent);
+      okButton = getButton(0);
+      cancelButton = getButton(1);
+
+      okButton.addSelectionListener(new SelectionListener() {
+
+         @Override
+         public void widgetDefaultSelected(SelectionEvent e) {
+            widgetSelected(e);
+         }
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            selectionOk = true;
+
+         }
+      });
+
+      cancelButton.addSelectionListener(new SelectionListener() {
+
+         @Override
+         public void widgetDefaultSelected(SelectionEvent e) {
+            widgetSelected(e);
+         }
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            selectionOk = false;
+         }
+      });
+      return c;
+   }
+
+   @Override
+   protected Control createCustomArea(Composite parent) {
+      // super.createCustomArea(parent);
+
+      GridData d = new GridData(GridData.FILL);
+
+      Group setValueGroup = new Group(parent, SWT.NONE);
+      GridLayout gridLayout = new GridLayout();
+      gridLayout.numColumns = 1;
+      setValueGroup.setLayout(gridLayout);
+      setValueGroup.setText(dialogMessage);
+
+      Composite topLevelComposite = new Composite(setValueGroup, SWT.NONE);
+      gridLayout = new GridLayout();
+      gridLayout.numColumns = 1;
+      topLevelComposite.setLayout(gridLayout);
+      topLevelComposite.setLayoutData(d);
+
+      importButton = new Button(setValueGroup, SWT.NONE);
+      importButton.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+      importButton.setText("Import");
+      importButton.addSelectionListener(new SelectionAdapter() {
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            FileDialog dialog = new FileDialog(EnvVariableDetailsDialog.this.getShell(), SWT.OPEN);
+
+            String result = dialog.open();
+            if (Strings.isValid(result)) {
+               String importedData;
+               try {
+                  importedData = Lib.fileToString(new File(result));
+                  textArea.setText(textArea.getText() + importedData);
+                  selection = textArea.getText();
+               } catch (IOException ex) {
+                  OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+               }
+            }
+         }
+      });
+
+      textArea = new StyledText(setValueGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.WRAP);
+      GridData gd = new GridData();
+      gd.grabExcessHorizontalSpace = true;
+      gd.horizontalAlignment = GridData.FILL;
+      gd.horizontalSpan = 1;
+      gd.heightHint = 200;
+      gd.widthHint = 400;
+      textArea.setLayoutData(gd);
+
+      textArea.setText((selection != null ? selection : ""));
+
+      textArea.addModifyListener(new ModifyListener() {
+         @Override
+         public void modifyText(ModifyEvent e) {
+            selection = textArea.getText();
+         }
+      });
+
+      return parent;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java
new file mode 100644
index 0000000..25b96be
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * 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.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDetailsDialogHelper implements Runnable {
+
+   private final String nameOfVariableToSet;
+   private int result;
+   private String selection;
+
+   public EnvVariableDetailsDialogHelper(String nameOfVariableToSet, String oldValue) {
+      this.nameOfVariableToSet = nameOfVariableToSet;
+      this.selection = oldValue;
+   }
+
+   public int getResult() {
+      return result;
+   }
+
+   public String getSelection() {
+      return selection;
+   }
+
+   @Override
+   public void run() {
+      EnvVariableDetailsDialog dlg =
+         new EnvVariableDetailsDialog(null, "Edit " + nameOfVariableToSet, null, nameOfVariableToSet + " Value:",
+            MessageDialog.NONE, new String[] {"OK", "Cancel"}, 0, selection);
+
+      result = dlg.open();
+
+      if (result == Window.OK) {
+         if (dlg.isValid()) {
+            String info = dlg.getSelection();
+            if (info != null) {
+               selection = info;
+            } else {
+               selection = "";
+            }
+         }
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java
new file mode 100644
index 0000000..a2e3acd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDialog extends MessageDialog {
+
+   private Button cancelButton;
+   private final String dialogMessage;
+
+   private Button okButton;
+
+   private String selection;
+   private boolean selectionOk;
+   private StyledText textArea;
+
+   public EnvVariableDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+      super(parentShell, dialogTitle, dialogTitleImage, null, dialogImageType, dialogButtonLabels, defaultIndex);
+      this.dialogMessage = dialogMessage;
+      this.selectionOk = false;
+   }
+
+   public String getSelection() {
+      return selection;
+   }
+
+   public boolean isValid() {
+      return selectionOk;
+   }
+
+   @Override
+   protected Control createButtonBar(Composite parent) {
+      Control c = super.createButtonBar(parent);
+      okButton = getButton(0);
+      cancelButton = getButton(1);
+
+      okButton.addSelectionListener(new SelectionListener() {
+
+         @Override
+         public void widgetDefaultSelected(SelectionEvent e) {
+            widgetSelected(e);
+         }
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            selectionOk = true;
+
+         }
+      });
+
+      cancelButton.addSelectionListener(new SelectionListener() {
+
+         @Override
+         public void widgetDefaultSelected(SelectionEvent e) {
+            widgetSelected(e);
+         }
+
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            selectionOk = false;
+         }
+      });
+      return c;
+   }
+
+   @Override
+   protected Control createCustomArea(Composite parent) {
+      super.createCustomArea(parent);
+
+      GridData gd = new GridData(SWT.FILL);
+      // gd.minimumWidth = 200;
+      gd.grabExcessHorizontalSpace = true;
+
+      Composite addView = new Composite(parent, SWT.NONE);
+      GridLayout gridLayout = new GridLayout();
+      gridLayout.numColumns = 2;
+      addView.setLayout(gridLayout);
+      addView.setLayoutData(gd);
+
+      new Label(addView, SWT.NONE).setText(dialogMessage);
+
+      GridData gd1 = new GridData(SWT.FILL);
+      gd1.minimumWidth = 200;
+      gd1.grabExcessHorizontalSpace = true;
+
+      textArea = new StyledText(addView, SWT.SINGLE | SWT.BORDER);
+      textArea.setLayoutData(gd1);
+      textArea.addModifyListener(new ModifyListener() {
+
+         @Override
+         public void modifyText(ModifyEvent e) {
+            selection = textArea.getText();
+         }
+      });
+
+      return parent;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.java
new file mode 100644
index 0000000..5664f06
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.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.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDialogHelper implements Runnable {
+
+   private int result;
+   private String selection;
+
+   public EnvVariableDialogHelper() {
+
+   }
+
+   public int getResult() {
+      return result;
+   }
+
+   public String getSelection() {
+      return selection;
+   }
+
+   @Override
+   public void run() {
+      EnvVariableDialog dlg =
+         new EnvVariableDialog(null, "Add Environment Variable", null, "Enter Name:", MessageDialog.NONE, new String[] {
+            "OK",
+            "Cancel"}, 0);
+
+      result = dlg.open();
+
+      if (result == Window.OK) {
+         if (dlg.isValid()) {
+            String info = dlg.getSelection();
+            if (info != null) {
+               selection = info;
+            } else {
+               selection = "";
+            }
+         }
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/OTEBuilderResourceFinder.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/OTEBuilderResourceFinder.java
new file mode 100644
index 0000000..f1e1a6f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/OTEBuilderResourceFinder.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder;
+
+/**
+ * Resource finder for the OTE builder jars.  This will enable the downloading of jars from the 
+ * same http server that provides the precompiled jars.
+ * 
+ * @author Andrew M. Finkbeiner
+ */
+public class OTEBuilderResourceFinder extends ResourceFinder {
+   private File rootFolder;
+
+   public OTEBuilderResourceFinder() {
+      super();
+      rootFolder = OTEPackagingBuilder.getWorkspaceArchiveFolder();
+   }
+
+   @Override
+   public byte[] find(String path) throws IOException {
+      try {
+         File bundleFile = new File(rootFolder, path);
+         if(bundleFile.exists()){
+            return Lib.inputStreamToBytes(new FileInputStream(bundleFile));
+         }
+      } catch (Exception ex) {
+         OseeLog.logf(getClass(), Level.SEVERE, "Error trying to read: [%s]", path);
+      }
+      return null;
+   }
+
+   @Override
+   public void dispose() {
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.java
new file mode 100644
index 0000000..b74dee9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.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.ui.test.manager.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+public class PluginUtil {
+
+   public static List<IViewReference> findAllViews(String viewID) {
+      ArrayList<IViewReference> list = new ArrayList<>();
+      IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows();
+      for (IWorkbenchWindow window : windows) {
+         IWorkbenchPage pages[] = window.getPages();
+         for (IWorkbenchPage page : pages) {
+            IViewReference viewRefs[] = page.getViewReferences();
+            for (IViewReference viewRef : viewRefs) {
+               if (viewRef.getId().equals(viewID)) {
+                  list.add(viewRef);
+               }
+            }
+
+         }
+      }
+      return list;
+   }
+
+   public static boolean areTestManagersAvailable() {
+      return getTestManagers().length > 0;
+   }
+
+   public static TestManagerEditor[] getTestManagers() {
+      List<TestManagerEditor> tmes = new ArrayList<>();
+      IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+      if (window != null) {
+         IWorkbenchPage page = window.getActivePage();
+         if (page != null) {
+            IEditorReference editors[] = page.getEditorReferences();
+            if (editors != null) {
+               for (int j = 0; j < editors.length; j++) {
+                  IEditorReference editor = editors[j];
+                  IWorkbenchPart part = editor.getPart(true);
+                  if (part instanceof TestManagerEditor) {
+                     tmes.add((TestManagerEditor) part);
+                  }
+               }
+            }
+         }
+      }
+      return tmes.toArray(new TestManagerEditor[tmes.size()]);
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java
new file mode 100644
index 0000000..51283ff
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * 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.ui.test.manager.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestManagerSelectDialog {
+   private final static String MESSAGE = "Select A Test Manager";
+   private ListSelectionDialog listSelectionDialog;
+   private LabelProvider labelProvider;
+
+   private TestManagerSelectDialog() {
+      this.labelProvider = new LabelProvider() {
+         @Override
+         public String getText(Object element) {
+            if (element instanceof TestManagerEditor) {
+               return ((TestManagerEditor) element).getPartName();
+            }
+            return "Unknown element type";
+         }
+      };
+      TestManagerEditor[] input = PluginUtil.getTestManagers();
+      this.listSelectionDialog =
+         new ListSelectionDialog(Displays.getActiveShell(), input, new ArrayContentProvider(), labelProvider, MESSAGE);
+      this.listSelectionDialog.setTitle(MESSAGE);
+      if (input.length > 0) {
+         this.listSelectionDialog.setInitialSelections(new Object[] {input[0]});
+      }
+   }
+
+   public int open() {
+      return listSelectionDialog.open();
+   }
+
+   public TestManagerEditor[] getResult() {
+      List<TestManagerEditor> tmes = new ArrayList<>();
+      for (Object object : listSelectionDialog.getResult()) {
+         tmes.add((TestManagerEditor) object);
+      }
+      return tmes.toArray(new TestManagerEditor[tmes.size()]);
+   }
+
+   public static TestManagerEditor[] getTestManagerFromUser() {
+      TestManagerEditor[] toReturn = null;
+      TestManagerSelectDialog dialog = new TestManagerSelectDialog();
+      int result = dialog.open();
+      if (result == Window.OK) {
+         toReturn = dialog.getResult();
+      }
+      return toReturn != null ? toReturn : new TestManagerEditor[0];
+   }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java
new file mode 100644
index 0000000..fe1a5e6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.ui.test.manager.util;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author David Diepenbrock
+ */
+public class WidgetFactory {
+
+   /**
+    * Creates a <code>Label</code> for use on a GridLayout.
+    * 
+    * @param comp The composite this label will be on.
+    * @param horizontalSpan The number of columns this Label should span in the grid
+    * @return The created label - with no text
+    */
+   public static Label createLabelForGrid(Composite comp, int horizontalSpan) {
+      Label label = new Label(comp, SWT.NONE);
+      GridData gd = new GridData();
+      gd.horizontalSpan = horizontalSpan;
+      label.setLayoutData(gd);
+      return label;
+   }
+
+   /**
+    * Creates a <code>Label</code> for use on a GridLayout. The <code>Label</code> will only span 1 column in the grid.
+    * 
+    * @param comp The composite this label will be on.
+    * @param str The text for the label
+    * @return The created label
+    */
+   public static Label createLabelForGrid(Composite comp, String str) {
+      return createLabelForGrid(comp, str, 1);
+   }
+
+   /**
+    * Creates a <code>Label</code> for use on a GridLayout.
+    * 
+    * @param comp The composite this label will be on.
+    * @param labelText The text for the label
+    * @param horizontalSpan The number of columns this Label should span in the grid
+    * @return The created label
+    */
+   public static Label createLabelForGrid(Composite comp, String labelText, int horizontalSpan) {
+      Label label = createLabelForGrid(comp, horizontalSpan);
+      label.setText(labelText);
+      return label;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java
new file mode 100644
index 0000000..16c9979
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * 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.ui.test.manager.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * This is a sample new wizard. Its role is to create a new file resource in the provided container. If the container
+ * resource (a folder or a project) is selected in the workspace when the wizard is opened, it will accept it as the
+ * target container. The wizard creates one file with the extension "mpe". If a sample multi-page editor (also available
+ * as a template) is registered for the same extension, it will be able to open it.
+ */
+
+public class TestManagerNewWizard extends Wizard implements INewWizard {
+   private TestManagerNewWizardPage page;
+
+   private ISelection selection;
+
+   /**
+    * Constructor for SampleNewWizard.
+    */
+   public TestManagerNewWizard() {
+      super();
+      setNeedsProgressMonitor(true);
+   }
+
+   /**
+    * Adding the page to the wizard.
+    */
+
+   @Override
+   public void addPages() {
+      page = new TestManagerNewWizardPage(selection);
+      addPage(page);
+   }
+
+   /**
+    * We will accept the selection in the workbench to see if we can initialize from it.
+    * 
+    * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
+    */
+   @Override
+   public void init(IWorkbench workbench, IStructuredSelection selection) {
+      this.selection = selection;
+   }
+
+   /**
+    * This method is called when 'Finish' button is pressed in the wizard. We will create an operation and run it using
+    * wizard as execution context.
+    */
+   @Override
+   public boolean performFinish() {
+      final String containerName = page.getContainerName();
+      final String fileName = page.getFileName();
+      IRunnableWithProgress op = new IRunnableWithProgress() {
+         @Override
+         public void run(IProgressMonitor monitor) throws InvocationTargetException {
+            try {
+               doFinish(containerName, fileName, monitor);
+            } catch (CoreException e) {
+               throw new InvocationTargetException(e);
+            } finally {
+               monitor.done();
+            }
+         }
+      };
+      try {
+         getContainer().run(true, false, op);
+      } catch (InterruptedException e) {
+         return false;
+      } catch (InvocationTargetException e) {
+         Throwable realException = e.getTargetException();
+         MessageDialog.openError(getShell(), "Error", realException.getMessage());
+         return false;
+      }
+      return true;
+   }
+
+   /**
+    * The worker method. It will find the container, create the file if missing or just replace its contents, and open
+    * the editor on the newly created file.
+    */
+
+   private void doFinish(String containerName, String fileName, IProgressMonitor monitor) throws CoreException {
+      // create a sample file
+      monitor.beginTask("Creating " + fileName, 2);
+      IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+      IResource resource = root.findMember(new Path(containerName));
+      if (!resource.exists() || !(resource instanceof IContainer)) {
+         throwCoreException("Container \"" + containerName + "\" does not exist.");
+      }
+      IContainer container = (IContainer) resource;
+      final IFile file = container.getFile(new Path(fileName + ".tmc"));
+      try {
+         InputStream stream = openContentStream();
+         if (file.exists()) {
+            file.setContents(stream, true, true, monitor);
+         } else {
+            file.create(stream, true, monitor);
+         }
+         stream.close();
+      } catch (IOException e) {
+      }
+      monitor.worked(1);
+      monitor.setTaskName("Opening file for editing...");
+      getShell().getDisplay().asyncExec(new Runnable() {
+         @Override
+         public void run() {
+            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+            try {
+               IDE.openEditor(page, file, true);
+            } catch (PartInitException e) {
+            }
+         }
+      });
+      monitor.worked(1);
+   }
+
+   /**
+    * We will initialize file contents with a sample text.
+    */
+
+   private InputStream openContentStream() {
+      String contents =
+         "<testManager>\n" + "<contact></contact>\n" + "<description>Find those bugs</description>\n" +
+      "<distributionStatement></distributionStatement>\n</testManager>\n";
+      return new ByteArrayInputStream(contents.getBytes());
+   }
+
+   private void throwCoreException(String message) throws CoreException {
+      IStatus status = new Status(IStatus.ERROR, "org.eclipse.osee.ote.ui.test.manager", IStatus.OK, message, null);
+      throw new CoreException(status);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java
new file mode 100644
index 0000000..2881468
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * 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.ui.test.manager.wizards;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.IDialogPage;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+/**
+ * The "New" wizard page allows setting the container for the new file as well as the file name. The page will only
+ * accept file name without the extension OR with the extension that matches the expected one (mpe).
+ */
+
+public class TestManagerNewWizardPage extends WizardPage {
+   private Text containerText;
+
+   private Text fileText;
+
+   private final ISelection selection;
+
+   /**
+    * Constructor for SampleNewWizardPage.
+    */
+   public TestManagerNewWizardPage(ISelection selection) {
+      super("wizardPage");
+      setTitle("Test Manager Editor File");
+      setDescription("This wizard creates a new Test Manager file.");
+      this.selection = selection;
+   }
+
+   /**
+    * @see IDialogPage#createControl(Composite)
+    */
+   @Override
+   public void createControl(Composite parent) {
+      Composite container = new Composite(parent, SWT.NULL);
+      GridLayout layout = new GridLayout();
+      container.setLayout(layout);
+      layout.numColumns = 3;
+      layout.verticalSpacing = 9;
+      Label label = new Label(container, SWT.NULL);
+      label.setText("&Container:");
+
+      containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
+      GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+      containerText.setLayoutData(gd);
+      containerText.addModifyListener(new ModifyListener() {
+         @Override
+         public void modifyText(ModifyEvent e) {
+            dialogChanged();
+         }
+      });
+
+      Button button = new Button(container, SWT.PUSH);
+      button.setText("Browse...");
+      button.addSelectionListener(new SelectionAdapter() {
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            handleBrowse();
+         }
+      });
+      label = new Label(container, SWT.NULL);
+      label.setText("&File name:");
+
+      fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
+      gd = new GridData(GridData.FILL_HORIZONTAL);
+      fileText.setLayoutData(gd);
+      fileText.addModifyListener(new ModifyListener() {
+         @Override
+         public void modifyText(ModifyEvent e) {
+            dialogChanged();
+         }
+      });
+      initialize();
+      dialogChanged();
+      setControl(container);
+   }
+
+   public String getContainerName() {
+      return containerText.getText();
+   }
+
+   public String getFileName() {
+      return fileText.getText();
+   }
+
+   /**
+    * Ensures that both text fields are set.
+    */
+
+   private void dialogChanged() {
+      String container = getContainerName();
+      String fileName = getFileName();
+      IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+      IResource resource = root.findMember(new Path(container));
+      IContainer rcontainer = (IContainer) resource;
+
+      if (container.length() == 0) {
+         updateStatus("File container must be specified");
+         return;
+      }
+      if (fileName.length() == 0) {
+         updateStatus("File name must be specified");
+         return;
+      }
+
+      // verify extension isn't there
+      if (fileName.endsWith("tmc") == true || fileName.endsWith(".") == true) {
+         updateStatus("Do not add .tmc extenstion.");
+         return;
+      }
+      // verify title is alpha-numeric with spaces and dashes
+      Matcher m = Pattern.compile("^[\\w]+([\\w_]*[\\w])?$").matcher(fileName);
+      boolean match = false;
+      while (m.find()) {
+         match = true;
+      }
+      if (!match) {
+         updateStatus("Filename must be alpha-numeric with \"_\" \n" + "And can not begin or end with a space.");
+         return;
+      }
+      // verify existing file doesn't exist
+      final IFile file = rcontainer.getFile(new Path(fileName + ".tmc"));
+      if (file.exists()) {
+         updateStatus("File with this name already exists.");
+         return;
+      }
+      int dotLoc = fileName.lastIndexOf('.');
+      if (dotLoc != -1) {
+         String ext = fileName.substring(dotLoc + 1);
+         if (ext.equalsIgnoreCase("tmc") == false) {
+            updateStatus("File extension must be \"tmc\"");
+            return;
+         }
+      }
+      updateStatus(null);
+   }
+
+   /**
+    * Uses the standard container selection dialog to choose the new value for the container field.
+    */
+
+   private void handleBrowse() {
+      ContainerSelectionDialog dialog =
+         new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
+            "Select new file container");
+      if (dialog.open() == Window.OK) {
+         Object[] result = dialog.getResult();
+         if (result.length == 1) {
+            containerText.setText(((Path) result[0]).toOSString());
+         }
+      }
+   }
+
+   /**
+    * Tests if the current workbench selection is a suitable container to use.
+    */
+
+   private void initialize() {
+      if (selection != null && selection.isEmpty() == false && selection instanceof IStructuredSelection) {
+         IStructuredSelection ssel = (IStructuredSelection) selection;
+         if (ssel.size() > 1) {
+            return;
+         }
+         Object obj = ssel.getFirstElement();
+         if (obj instanceof IResource) {
+            IContainer container;
+            if (obj instanceof IContainer) {
+               container = (IContainer) obj;
+            } else {
+               container = ((IResource) obj).getParent();
+            }
+            containerText.setText(container.getFullPath().toString());
+         }
+      }
+   }
+
+   private void updateStatus(String message) {
+      setErrorMessage(message);
+      setPageComplete(message == null);
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/support/output.xsd b/org.eclipse.osee.ote.ui.test.manager/support/output.xsd
new file mode 100644
index 0000000..e1731d7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/support/output.xsd
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+	<!-- ====================== -->
+	<!--  AUTHOR: Charles Shaw  -->
+	<!-- ====================== -->
+	
+	<!-- This is included only once as the first element in TestScript -->
+	<xs:element name="Config">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="ScriptName" type="xs:string"/>
+				<xs:element name="Environment" type="xs:string"/>
+				<xs:element name="TestEnvironmentVersion" type="xs:string"/>
+				<xs:element name="UserName" type="xs:string"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- This is included only once as the last element in TestScript -->
+	<xs:element name="ScriptResult">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="ElapsedTime" type="xs:integer"/>
+			</xs:sequence>
+		</xs:complexType>	
+	</xs:element>
+	
+	<!-- Location is used in multiple elements -->
+	<xs:element name="Location">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="Source" type="xs:string"/>
+				<xs:element name="Line" type="xs:integer"/>
+				<xs:element name="Time" type="xs:integer"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<xs:element name="Debug">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="Location"/>
+				<xs:element name="Message"  type="xs:string"/>			
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<xs:element name="Support">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="Location"/>
+				<xs:element name="Message"  type="xs:string"/>			
+			</xs:sequence>
+		</xs:complexType>	
+	</xs:element>	
+	
+	<xs:element name="Severe">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="Location"/>
+				<xs:element name="Message"  type="xs:string"/>			
+			</xs:sequence>
+		</xs:complexType>	
+	</xs:element>
+	
+	<xs:element name="Warning">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="Location"/>
+				<xs:element name="Message"  type="xs:string"/>			
+			</xs:sequence>
+		</xs:complexType>	
+	</xs:element>
+	
+	<xs:element name="Attention">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="Location"/>
+				<xs:element name="Message"  type="xs:string"/>			
+			</xs:sequence>
+		</xs:complexType>	
+	</xs:element>
+	
+	<!-- CheckPoint and CheckGroup are both used by TestPoint -->
+	<xs:element name="CheckPoint">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="TestPointName" type="xs:string"/>
+				<xs:element name="Expected"  type="xs:string"/>
+				<xs:element name="Actual"  type="xs:string"/>		
+				<xs:element name="Result" type="xs:string"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- Used to build permutations or the elements in the group -->
+	<xs:group name="Checks">
+		<xs:choice>
+			<xs:element ref="CheckPoint" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="CheckGroup" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:choice>
+	</xs:group>
+	
+	<xs:element name="CheckGroup">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="GroupName"/>
+				<xs:element name="Result"/>
+				<xs:group ref="Checks" maxOccurs="unbounded"/>
+			</xs:sequence>
+			<xs:attribute name="Mode" type="xs:string" use="required"/>
+		</xs:complexType>
+	</xs:element>
+	
+	<xs:element name="TestPoint">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="Number" type="xs:integer"/>
+				<xs:element name="Result"  type="xs:string"/>
+				<xs:element ref="Location"/>	
+				<xs:group ref="Checks" minOccurs="0" maxOccurs="1"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- Used to build permutations or the elements in the group -->
+	<xs:group name="Messages">
+		<xs:choice>
+			<xs:element ref="Trace" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="Debug" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="TestPoint" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="Support" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="Severe" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="Warning" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="Attention" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:choice>	
+	</xs:group>
+	
+	<!-- Both Trace and TestCase can hold any element, any number of times -->
+	<!-- With the exception that only TestScript can hold a TestCase -->
+	<xs:element name="Trace">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="ObjectName" type="xs:string"/>
+				<xs:element name="MethodName" type="xs:string"/>
+				<xs:element name="MethodArgument" type="xs:string"/>
+				<xs:element ref="Location"/>
+				<xs:group ref="Messages" minOccurs="0" maxOccurs="unbounded"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	
+	<xs:element name="Tracability">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="RequirementId" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>			
+			</xs:sequence>
+		</xs:complexType>	
+	</xs:element>
+	
+	<xs:element name="TestCase">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="Number" type="xs:integer"/>
+				<xs:element ref="Tracability"/>
+				<xs:group ref="Messages" minOccurs="0" maxOccurs="unbounded"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<xs:element name="ScriptInit">
+		<xs:complexType>
+			<xs:group ref="Messages" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- Base Element in the XML -->
+	<xs:element name="TestScript">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element ref="Config"/>
+				<xs:element ref="ScriptInit"/>
+				<xs:element ref="TestCase" maxOccurs="unbounded"/>
+				<xs:element ref="ScriptResult"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+</xs:schema>
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/.classpath b/org.eclipse.osee.ote.ui/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/.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.ui/.pmd b/org.eclipse.osee.ote.ui/.pmd
new file mode 100644
index 0000000..c7b0a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/.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.ui/.project b/org.eclipse.osee.ote.ui/.project
new file mode 100644
index 0000000..34fe749
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.ui</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.ui/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a2f785b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,46 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Core Gui Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.ui,
+ org.eclipse.osee.ote.ui.navigate
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.core.runtime.preferences,
+ org.eclipse.jface.action,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.viewers,
+ org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.plugin.util,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.osee.framework.ui.plugin.xnavigate,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.event,
+ org.eclipse.osee.ote.remote.messages,
+ org.eclipse.osee.ote.service,
+ org.eclipse.swt,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui.console,
+ org.eclipse.ui.internal.console,
+ org.osgi.framework,
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.util.tracker
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.ui.workbench
diff --git a/org.eclipse.osee.ote.ui/build.properties b/org.eclipse.osee.ote.ui/build.properties
new file mode 100644
index 0000000..e684dd6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               images/,\
+               build.properties,\
+               schema/
diff --git a/org.eclipse.osee.ote.ui/images/checkout.gif b/org.eclipse.osee.ote.ui/images/checkout.gif
new file mode 100644
index 0000000..e7b7fb4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/checkout.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/connected_sm.gif b/org.eclipse.osee.ote.ui/images/connected_sm.gif
new file mode 100644
index 0000000..b397d8b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/connected_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/welcome_item3.gif b/org.eclipse.osee.ote.ui/images/welcome_item3.gif
new file mode 100644
index 0000000..311f57f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/welcome_item3.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/plugin.xml b/org.eclipse.osee.ote.ui/plugin.xml
new file mode 100644
index 0000000..5fa1f5a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/plugin.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension-point id="WorkspaceSetup" name="WorkspaceSetup" schema="schema/WorkspaceSetup.exsd"/>
+     <extension
+         point="org.eclipse.ui.views">
+      <category
+            name="OSEE Test"
+            id="osee.test.category">
+      </category>
+      <view
+            allowMultiple="false"
+            category="osee.test.category"
+            class="org.eclipse.osee.ote.ui.navigate.OteNavigateView"
+            icon="images/welcome_item3.gif"
+            id="org.eclipse.osee.ote.ui.navigate.OteNavigateView"
+            name="OTE Navigator"/>
+   </extension>
+     <extension
+           id="testnature"
+           name="Test Nature"
+           point="org.eclipse.core.resources.natures">
+        <runtime>
+           <run
+                 class="org.eclipse.osee.ote.ui.ProjectNatureTest">
+           </run>
+        </runtime>
+     </extension>
+     <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.osee.ote.ui.TestPerspective"
+            fixed="false"
+            icon="images/welcome_item3.gif"
+            id="org.eclipse.osee.ote.ui.TestPerspective"
+            name="OSEE Test"/>
+   </extension>
+   <extension point="org.eclipse.ui.popupMenus">
+      <objectContribution  adaptable="true"
+            objectClass="org.eclipse.core.resources.IFile"
+            nameFilter="*.java" id="org.eclipse.osee.ote.ui.menucontribution">
+         <menu
+               label="OTE"
+               path="additions"
+               id="org.eclipse.osee.ote.ui">               
+            <separator
+                  name="placeholder">
+            </separator>
+         </menu>
+      </objectContribution>
+      <viewerContribution
+             targetID="#CompilationUnitEditorContext"
+             id="viewConf">
+              <menu
+               label="OTE"
+               path="additions"
+               id="org.eclipse.osee.ote.ui.viewer">
+            <separator
+                  name="placeholder">
+            </separator>
+         </menu>
+       </viewerContribution>
+         
+   </extension>
+   <extension
+         point="org.eclipse.ui.console.consolePageParticipants">
+      <consolePageParticipant
+            class="org.eclipse.osee.ote.ui.internal.OteConsolePageParticipant"
+            id="org.eclipse.osee.ote.ui.oteConsolePreferences">
+         <enablement>
+             <instanceof value="org.eclipse.osee.ote.ui.OteConsole"/>
+             </enablement>
+      </consolePageParticipant>
+   </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.ui/pom.xml b/org.eclipse.osee.ote.ui/pom.xml
new file mode 100644
index 0000000..c14a844
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/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.ui</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Ui (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.ui/schema/WorkspaceSetup.exsd b/org.eclipse.osee.ote.ui/schema/WorkspaceSetup.exsd
new file mode 100644
index 0000000..7b85061
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/schema/WorkspaceSetup.exsd
@@ -0,0 +1,107 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.osee.ote.ui" id="WorkspaceSetup" name="WorkspaceSetup"/>
+      </appInfo>
+      <documentation>
+         Contributions to this extension point provide a .psf file defining the project set to configure on the workspace and an optional icon image to be associated with this configuration file. The Extension ID defines the name of the icon created on the test navigation view.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="WorkspaceConfig"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="WorkspaceConfig">
+      <annotation>
+         <appInfo>
+            <meta.element icon="icon"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <attribute name="configFile" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="resource"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/IOteConsoleService.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/IOteConsoleService.java
new file mode 100644
index 0000000..457e137
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/IOteConsoleService.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.ui;
+
+import java.io.IOException;
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IOteConsoleService {
+
+   void addInputListener(IConsoleInputListener listener);
+
+   void removeInputListener(IConsoleInputListener listener);
+
+   void write(String value);
+
+   void write(String value, int type, boolean popup);
+
+   void writeError(String string);
+
+   void prompt(String str) throws IOException;
+
+   void popup();
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsole.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsole.java
new file mode 100644
index 0000000..29d1113
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsole.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.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePreferences;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePrefsUtil;
+import org.eclipse.ui.console.IOConsole;
+
+/**
+ * This class provides a way to set the high and low water marks of the console to limit the output buffer. 
+ * @author Michael P. Masterson
+ */
+public class OteConsole extends IOConsole {
+   /**
+    * Arbitrary number is arbitrary. 
+    */
+   private static final int HIGH_TO_LOW_DIFF = 100;
+   
+   private int limit;
+   private boolean noLimit;
+
+   /**
+    * @param name
+    * @param consoleType
+    * @param imageDescriptor
+    */
+   public OteConsole(String name, ImageDescriptor imageDescriptor) {
+      super(name, imageDescriptor);
+      limit = OteConsolePrefsUtil.getInt(OteConsolePreferences.BUFFER_LIMIT);
+      noLimit = OteConsolePrefsUtil.getBoolean(OteConsolePreferences.NO_BUFFER_LIMIT);
+      setWaterMarks();
+   }
+   
+   /**
+    * When the limit is too small (less than {@value #HIGH_TO_LOW_DIFF}), the low and high mark will be right next to eachother
+    * meaning that characters will be deleted from the beginning at the same speed as they are being written
+    * to the end.  Otherwise, every time the limit is hit, the buffer will shrink by {@value #HIGH_TO_LOW_DIFF}.  
+    */
+   private void setWaterMarks() {
+      int lowMark, highMark;
+      
+      if(noLimit) {
+         lowMark = -1;
+         highMark = -1;
+      } else if( limit > HIGH_TO_LOW_DIFF ){
+         lowMark = limit - HIGH_TO_LOW_DIFF;
+         highMark = limit;
+      } else {
+         lowMark = limit -1;
+         highMark = limit;
+      }
+      
+      setWaterMarks(lowMark, highMark);
+   }
+   
+   /**
+    * @param limit the buffer size limit in bytes
+    */
+   public void setLimit(int limit) {
+      this.limit = limit;
+      setWaterMarks();
+   }
+   
+   public void setNoLimit(boolean noLimit) {
+      this.noLimit = noLimit;
+      setWaterMarks();
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsoleWrapper.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsoleWrapper.java
new file mode 100644
index 0000000..067b1a3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsoleWrapper.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * 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.ui;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IOConsole;
+import org.eclipse.ui.console.IOConsoleOutputStream;
+
+/**
+ * This class is needed to get the OTE specific OTE Console class which will provide the ability to set the buffer limit of the console
+ * @author Michael P. Masterson
+ */
+public class OteConsoleWrapper {
+   private IOConsoleOutputStream streamOut = null;
+
+   private IOConsoleOutputStream streamErr = null;
+
+   private IOConsoleOutputStream streamPrompt = null;
+
+   private final IOConsole console;
+
+   private final HandleInput inputHandler;
+
+   private final boolean time;
+
+   private final Thread thread;
+
+   private boolean newline;
+
+   public OteConsoleWrapper(String title) {
+      this(title, true, true);
+   }
+
+   public OteConsoleWrapper(String title, boolean time, boolean newline) {
+      console = createConsole(title);
+      this.time = time;
+      this.newline = newline;
+      this.inputHandler = new HandleInput();
+
+      thread = new Thread(inputHandler);
+      thread.setName("Osee console input handler");
+      ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console});
+      Displays.ensureInDisplayThread(new Runnable() {
+         @Override
+         public void run() {
+            streamOut = console.newOutputStream();// newMessageStream();
+            streamOut.setColor(Displays.getSystemColor(SWT.COLOR_BLACK));
+            streamOut.setActivateOnWrite(false);
+            streamErr = console.newOutputStream();
+            streamErr.setColor(Displays.getSystemColor(SWT.COLOR_RED));
+            streamErr.setActivateOnWrite(false);
+            streamPrompt = console.newOutputStream();
+            streamPrompt.setColor(Displays.getSystemColor(SWT.COLOR_BLUE));
+            streamPrompt.setActivateOnWrite(false);
+         }
+      });
+      thread.start();
+   }
+   
+   /**
+    * @param low 
+    * @param high 
+    * @see  org.eclipse.ui.console.IOConsole#setWaterMarks(int, int)
+    */
+   public void setWaterMarks(int low, int high) {
+      this.console.setWaterMarks(low, high);
+   }
+
+   /**
+    * This should only be called once in the constructor.  This method may be overridden by subclasses if a different 
+    * instance of an IOConsole is required.  
+    * @param title
+    * @return a new IOConsole with the title provided
+    */
+   protected IOConsole createConsole(String title) {
+      return new OteConsole(title, null);
+   }
+
+   public PrintStream getPrintStream() {
+      return new PrintStream(streamOut);
+   }
+
+   public void shutdown() {
+      thread.interrupt();
+      try {
+         thread.join(5000);
+      } catch (InterruptedException e) {
+         e.printStackTrace();
+      } finally {
+         ConsolePlugin.getDefault().getConsoleManager().removeConsoles(new IConsole[] {console});
+      }
+   }
+
+   public static final int CONSOLE_ERROR = 0;
+
+   public static final int CONSOLE_OUT = 1;
+
+   public static final int CONSOLE_PROMPT = 2;
+
+   /**
+    * Writes string to console without popping console forward
+    * @param str 
+    */
+   public void write(String str) {
+      write(str, false);
+   }
+
+   /**
+    * Writes string to console without popping console forward
+    * @param str 
+    */
+   public void writeError(String str) {
+      write(str, CONSOLE_ERROR, true);
+   }
+
+   /**
+    * Writes string to console
+    * @param str 
+    * 
+    * @param popup bring console window forward
+    */
+   public void write(String str, boolean popup) {
+      write(str, CONSOLE_OUT, popup);
+   }
+
+   /**
+    * Write string to console
+    * @param str 
+    * 
+    * @param type CONSOLE_ERROR, CONSOLE_OUT, CONSOLE_PROMPT
+    */
+   public void write(String str, int type) {
+      write(str, type, false);
+   }
+
+   /**
+    * Write string to console
+    * @param str 
+    * 
+    * @param type CONSOLE_ERROR, CONSOLE_OUT, CONSOLE_PROMPT
+    * @param popup bring console window forward
+    */
+   public void write(String str, int type, boolean popup) {
+      String time = "";
+      if (this.time) {
+         Calendar cal = Calendar.getInstance();
+         cal.setTime(new Date());
+
+         if (cal.get(Calendar.HOUR) == 0) {
+            time = "12";
+         } else {
+            time = "" + cal.get(Calendar.HOUR);
+         }
+         time = Lib.padLeading(time, '0', 2);
+         String minute = "" + cal.get(Calendar.MINUTE);
+         minute = Lib.padLeading(minute, '0', 2);
+         time += ":" + minute + " => ";
+      }
+      try {
+         sendToStreams(type, time);
+         if (str.length() > 100000) {
+            int i = 0;
+
+            while (i < str.length()) {
+               int endIndex = i + 100000;
+               endIndex = endIndex > str.length() ? str.length() : endIndex;
+               String chunk = str.substring(i, endIndex);
+               sendToStreams(type, chunk);
+               i = endIndex;
+            }
+         } else {
+            sendToStreams(type, str);
+         }
+         if(newline ){
+            sendToStreams(type, "\n");
+         }
+         if (popup) {
+            popup();
+         }
+      } catch (IOException ex) {
+         ex.printStackTrace();
+      }
+   }
+
+   public void prompt(String str) throws IOException {
+      sendToStreams(CONSOLE_PROMPT, str);
+   }
+
+   private void sendToStreams(int type, String str) throws IOException {
+      if (type == CONSOLE_ERROR && streamErr != null) {
+         streamErr.write(str);
+      }
+      if (type == CONSOLE_PROMPT && streamPrompt != null) {
+         streamPrompt.write(str);
+      }
+      if (type == CONSOLE_OUT && streamOut != null) {
+         streamOut.write(str);
+      }
+   }
+
+   public void popup() {
+      ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
+   }
+
+   public void addInputListener(IConsoleInputListener listener) {
+      inputHandler.addListener(listener);
+   }
+
+   public void removeInputListener(IConsoleInputListener listener) {
+      inputHandler.removeListener(listener);
+   }
+
+   private class HandleInput implements Runnable {
+
+      private final CopyOnWriteArrayList<IConsoleInputListener> listeners;
+
+      public HandleInput() {
+         listeners = new CopyOnWriteArrayList<>();
+      }
+
+      public void addListener(IConsoleInputListener listener) {
+         listeners.add(listener);
+      }
+
+      public void removeListener(IConsoleInputListener listener) {
+         listeners.remove(listener);
+      }
+
+      @Override
+      public void run() {
+         BufferedReader input = new BufferedReader(new InputStreamReader(console.getInputStream()));
+         try {
+            String line = null;
+            while ((line = input.readLine()) != null) {
+               for (IConsoleInputListener listener : listeners) {
+                  listener.lineRead(line);
+               }
+            }
+         } catch (IOException e) {
+            e.printStackTrace();
+         }
+         OseeLog.log(TestCoreGuiPlugin.class, Level.INFO, "done with the handling of input");
+      }
+
+   }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java
new file mode 100644
index 0000000..0839ac7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * 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.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.framework.ui.swt.KeyedImage;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum OteImage implements KeyedImage {
+   CHECKOUT("checkout.gif"),
+   CONNECTED("connected_sm.gif"),
+   OTE("welcome_item3.gif");
+
+   private final String fileName;
+
+   private OteImage(String fileName) {
+      this.fileName = fileName;
+   }
+
+   @Override
+   public ImageDescriptor createImageDescriptor() {
+      return ImageManager.createImageDescriptor(TestCoreGuiPlugin.PLUGIN_ID, "images", fileName);
+   }
+
+   @Override
+   public String getImageKey() {
+      return TestCoreGuiPlugin.PLUGIN_ID + ".images." + fileName;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.java
new file mode 100644
index 0000000..4dfeafe
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.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.ui;
+
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+public class OteRemoteConsole implements IConsoleInputListener, ITestConnectionListener {
+
+   private IRemoteCommandConsole remoteConsole;
+   private ITestEnvironment env;
+   private final IOteConsoleService oteConsoleService;
+   
+   public OteRemoteConsole(IOteConsoleService oteConsoleService) {
+	   this.oteConsoleService = oteConsoleService;
+   }
+
+   @Override
+   public void lineRead(String line) {
+      try {
+         String result = remoteConsole.doCommand(line);
+         oteConsoleService.write(result);
+      } catch (RemoteException e) {
+         OseeLog.log(TestCoreGuiPlugin.class, Level.SEVERE, "exception executing command " + line, e);
+         oteConsoleService.writeError("Exception during executing of command. See Error Log");
+      }
+   }
+
+   public void close() {
+      if (env != null) {
+         try {
+            env.closeCommandConsole(remoteConsole);
+         } catch (Exception e) {
+            OseeLog.log(TestCoreGuiPlugin.class, Level.INFO, "failed to close remote terminal", e);
+         }
+      }
+
+      oteConsoleService.removeInputListener(this);
+
+      env = null;
+   }
+
+   @Override
+   public void onConnectionLost(IServiceConnector connector) {
+	   oteConsoleService.removeInputListener(this);
+
+      env = null;
+   }
+
+   @Override
+   public void onPostConnect(ConnectionEvent event) {
+      try {
+         env = event.getEnvironment();
+         remoteConsole = env.getCommandConsole();
+         oteConsoleService.addInputListener(this);
+      } catch (RemoteException e) {
+         OseeLog.log(TestCoreGuiPlugin.class, Level.SEVERE, "exception acquiring remote console", e);
+      }
+   }
+
+   @Override
+   public void onPreDisconnect(ConnectionEvent event) {
+      close();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java
new file mode 100644
index 0000000..1b59976
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * 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.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+
+public class ProjectNatureTest implements IProjectNature {
+
+   public static final String TEST_NATURE = "org.eclipse.osee.ote.ui.testnature";
+
+   private static List<IProject> testProjects = new ArrayList<>();
+
+   private IProject project;
+
+   @Override
+   public void configure() throws CoreException {
+      testProjects.add(project);
+   }
+
+   @Override
+   public void deconfigure() throws CoreException {
+      testProjects.remove(project);
+   }
+
+   @Override
+   public IProject getProject() {
+      return project;
+   }
+
+   @Override
+   public void setProject(IProject project) {
+      this.project = project;
+   }
+
+   public static List<IProject> getTestProjects() {
+      return testProjects;
+   }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/RemoteConsoleLauncher.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/RemoteConsoleLauncher.java
new file mode 100644
index 0000000..bb69e50
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/RemoteConsoleLauncher.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * 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.ui;
+
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class RemoteConsoleLauncher extends ServiceTracker {
+
+   private OteRemoteConsole remoteConsole;
+
+   private final IOteConsoleService oteConsoleService;
+
+   public RemoteConsoleLauncher(IOteConsoleService oteConsoleService) {
+      super(TestCoreGuiPlugin.getContext(), IOteClientService.class.getName(), null);
+      this.oteConsoleService = oteConsoleService;
+   }
+
+   @Override
+   public Object addingService(ServiceReference reference) {
+      IOteClientService clientService = (IOteClientService) super.addingService(reference);
+      remoteConsole = new OteRemoteConsole(oteConsoleService);
+      clientService.addConnectionListener(remoteConsole);
+      return clientService;
+   }
+
+   @Override
+   public void close() {
+      if (remoteConsole != null) {
+         IOteClientService service = (IOteClientService) getService();
+         service.removeConnectionListener(remoteConsole);
+         remoteConsole.close();
+      }
+      super.close();
+   }
+
+   @Override
+   public void removedService(ServiceReference reference, Object service) {
+      if (remoteConsole != null) {
+         remoteConsole.close();
+         remoteConsole = null;
+      }
+      super.removedService(reference, service);
+   }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java
new file mode 100644
index 0000000..6226382
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * 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.ui;
+
+import org.eclipse.osee.ote.ui.navigate.OteNavigateView;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+public class TestPerspective implements IPerspectiveFactory {
+
+   public TestPerspective() {
+      super();
+   }
+
+   @Override
+   public void createInitialLayout(IPageLayout layout) {
+      defineActions(layout);
+      defineLayout(layout);
+   }
+
+   public void defineActions(IPageLayout layout) {
+
+      // Add "show views".
+      //      layout.addShowViewShortcut("org.eclipse.osee.framework.ui.service.control.view.ServiceManagerView");
+      layout.addShowViewShortcut(OteNavigateView.VIEW_ID);
+      //      layout.addShowViewShortcut(EgiView.VIEW_ID);
+      //      layout.addShowViewShortcut(EufdView.VIEW_ID);
+      //      layout.addShowViewShortcut(GunView.VIEW_ID);
+      //      layout.addShowViewShortcut(IhdssView.VIEW_ID);
+      //      layout.addShowViewShortcut(KeyboardView.VIEW_ID);
+      //      layout.addShowViewShortcut(LmpView.VIEW_ID);
+      //      layout.addShowViewShortcut(MpdView.VIEW_ID);
+      //      layout.addShowViewShortcut(MtadsView.VIEW_ID);
+      //      layout.addShowViewShortcut(RocketView.VIEW_ID);
+      //      layout.addShowViewShortcut(UtaView.VIEW_ID);
+      //      layout.addShowViewShortcut(EmulatorsView.VIEW_ID);
+      layout.addShowViewShortcut("org.eclipse.pde.runtime.LogView");
+      layout.addShowViewShortcut("org.eclipse.ui.console.ConsoleView");
+      layout.addShowViewShortcut("org.eclipse.jdt.ui.PackageExplorer");
+      layout.addShowViewShortcut(IPageLayout.ID_PROBLEM_VIEW);
+
+   }
+
+   public void defineLayout(IPageLayout layout) {
+      // Editors are placed for free.
+      String editorArea = layout.getEditorArea();
+
+      // Place navigator and outline to left of
+      // editor area.
+      IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, (float) 0.20, editorArea);
+      left.addView(OteNavigateView.VIEW_ID);
+      left.addView("org.eclipse.jdt.ui.PackageExplorer");
+
+      IFolderLayout lower = layout.createFolder("bottom", IPageLayout.BOTTOM, (float) 0.65, editorArea);
+      lower.addView("org.eclipse.pde.runtime.LogView");
+      lower.addView("org.eclipse.ui.console.ConsoleView");
+      lower.addView(IPageLayout.ID_PROBLEM_VIEW);
+
+      // string found in JavaUI.ID_ACTION_SET
+      layout.addActionSet("org.eclipse.jdt.ui.JavaActionSet");
+      
+      // string found in JavaUI.ID_ELEMENT_CRATION_ACTION_SET
+      layout.addActionSet("org.eclipse.jdt.ui.JavaElementCreationActionSet");
+      layout.addActionSet(IPageLayout.ID_NAVIGATE_ACTION_SET);
+
+   }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsolePageParticipant.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsolePageParticipant.java
new file mode 100644
index 0000000..4b2615f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsolePageParticipant.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * 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.ui.internal;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ote.ui.OteConsole;
+import org.eclipse.osee.ote.ui.internal.wizard.OteConsolePrefsWizard;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsolePageParticipant;
+import org.eclipse.ui.part.IPageBookViewPage;
+import org.eclipse.ui.part.IPageSite;
+
+public class OteConsolePageParticipant implements IConsolePageParticipant {
+
+   private IPageBookViewPage page;
+   private IActionBars bars;
+   private Action optionsButton;
+   private OteConsole console;
+
+   @Override
+   public <T> T getAdapter(Class<T> adapter) {
+      return null;
+   }
+
+   @Override
+   public void init(IPageBookViewPage page, IConsole console) {
+      this.console = (OteConsole) console;
+      this.page = page;
+      IPageSite site = page.getSite();
+      this.bars = site.getActionBars();
+      
+      createOptionsButton();
+      
+      bars.getMenuManager().add(optionsButton);
+      
+      bars.updateActionBars();
+   }
+
+   private void createOptionsButton() {
+      this.optionsButton = new Action("Preferences") {
+         /* (non-Javadoc)
+          * @see org.eclipse.jface.action.Action#run()
+          */
+         @Override
+         public void run() {
+            WizardDialog wd = new WizardDialog(Display.getCurrent().getActiveShell(), new OteConsolePrefsWizard(console));
+            wd.open();
+         }
+      };
+   }
+
+   @Override
+   public void dispose() {
+      this.page = null;
+      this.bars = null;
+      this.optionsButton = null;
+   }
+
+   @Override
+   public void activated() {
+      update();
+   }
+
+   private void update() {
+      if(page == null) {
+         return;
+      }
+      
+      optionsButton.setEnabled(true);
+      
+      bars.updateActionBars();
+   }
+
+   @Override
+   public void deactivated() {
+      update();
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsoleServiceImpl.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsoleServiceImpl.java
new file mode 100644
index 0000000..ef4d4bf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsoleServiceImpl.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.ui.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.ote.ui.IOteConsoleService;
+import org.eclipse.osee.ote.ui.OteConsoleWrapper;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteConsoleServiceImpl implements IOteConsoleService {
+
+   private final OteConsoleWrapper console = new OteConsoleWrapper("OTE Console");
+
+   private OteConsoleWrapper getConsole() {
+      return console;
+   }
+
+   @Override
+   public void addInputListener(IConsoleInputListener listener) {
+      if (listener != null) {
+         getConsole().addInputListener(listener);
+      }
+   }
+
+   @Override
+   public void removeInputListener(IConsoleInputListener listener) {
+      if (listener != null) {
+         getConsole().removeInputListener(listener);
+      }
+   }
+
+   @Override
+   public void write(String value) {
+      getConsole().write(value);
+   }
+
+   @Override
+   public void writeError(String value) {
+      getConsole().writeError(value);
+   }
+
+   @Override
+   public void prompt(String value) throws IOException {
+      getConsole().prompt(value);
+   }
+
+   @Override
+   public void popup() {
+      getConsole().popup();
+   }
+
+   @Override
+   public void write(String value, int type, boolean popup) {
+      getConsole().write(value, type, popup);
+   }
+
+   public void close() {
+      getConsole().shutdown();
+   }
+ }
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteServerConsole.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteServerConsole.java
new file mode 100644
index 0000000..9290154
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteServerConsole.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * 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.ui.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.framework.ui.plugin.util.OseeConsole;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.ConsoleInputMessage;
+import org.eclipse.osee.ote.remote.messages.ConsoleOutputMessage;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+public class OteServerConsole {
+
+   private final OseeConsole console = new OseeConsole("OTE Server", false, false);
+   private ServiceRegistration<EventHandler> registration;
+
+   public OteServerConsole() {
+      console.addInputListener(new OTEServerConsoleInputListener());
+      registration = OteEventMessageUtil.subscribe(ConsoleOutputMessage.TOPIC, new ConsoleOutputHandler(console));
+   }
+
+   private OseeConsole getConsole() {
+      return console;
+   }
+
+   public void close() {
+      getConsole().shutdown();
+      if(registration != null){
+         registration.unregister();
+         registration = null;
+      }
+   }
+   
+   private static class ConsoleOutputHandler implements EventHandler {
+
+      private OseeConsole console;
+      private ConsoleOutputMessage output;
+
+      public ConsoleOutputHandler(OseeConsole console) {
+         this.console = console;
+         this.output = new ConsoleOutputMessage();
+      }
+
+      @Override
+      public void handleEvent(Event arg0) {
+         output.setBackingBuffer(OteEventMessageUtil.getBytes(arg0));
+         try {
+            console.write(output.getString());
+         } catch (IOException e) {
+            e.printStackTrace();
+         } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+         }
+         
+      }
+      
+   }
+   
+   private static class OTEServerConsoleInputListener implements IConsoleInputListener {
+
+      private ConsoleInputMessage input = new ConsoleInputMessage();
+      
+      @Override
+      public void lineRead(String line) {
+         try {
+            input.setString(line);
+            OteEventMessageUtil.sendEvent(input);
+         } catch (IOException e) {
+            e.printStackTrace();
+         }
+      }
+      
+   }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/TestCoreGuiPlugin.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/TestCoreGuiPlugin.java
new file mode 100644
index 0000000..23431b2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/TestCoreGuiPlugin.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.ote.ui.internal;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.IWorkbenchUserService;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.ote.ui.IOteConsoleService;
+import org.eclipse.osee.ote.ui.RemoteConsoleLauncher;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePreferences;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+@SuppressWarnings("rawtypes")
+public class TestCoreGuiPlugin extends AbstractUIPlugin {
+
+   public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui";
+
+   private static TestCoreGuiPlugin instance;
+
+   private ServiceRegistration oteConsoleServiceRegistration;
+   private ServiceTracker workbenchUserServiceTracker;
+
+   private ServiceTracker workspaceStartTracker;
+   private OteConsoleServiceImpl oteConsoleService;
+   private BundleContext context;
+
+   @Override
+   public void start(final BundleContext context) throws Exception {
+      this.context = context;
+      instance = this;
+      createWorkspaceTracker(context);
+      if (System.getProperty("NO_OTE_ARTIFACT_BULK_LOAD") == null) {
+         startOTEArtifactBulkLoad();
+      }
+      super.start(context);
+   }
+
+   /**
+    * @param context
+    */
+   @SuppressWarnings("unchecked")
+   private void createWorkspaceTracker(final BundleContext context) {
+      workspaceStartTracker = new ServiceTracker(context, SafeWorkspaceAccess.class.getName(), null) {
+         private RemoteConsoleLauncher tracker;
+
+         @Override
+         public void removedService(ServiceReference reference, Object service) {
+            if (oteConsoleService != null) {
+               oteConsoleServiceRegistration.unregister();
+               oteConsoleService.close();
+               oteConsoleService = null;
+            }
+            if (tracker != null) {
+               tracker.close();
+            }
+            super.removedService(reference, service);
+         }
+
+         @Override
+         public void close() {
+            if (tracker != null) {
+               tracker.close();
+            }
+            super.close();
+         }
+
+         @Override
+         public void modifiedService(ServiceReference reference, Object service) {
+            // do nothing
+         }
+
+         @Override
+         public Object addingService(ServiceReference reference) {
+            oteConsoleService = new OteConsoleServiceImpl();
+            oteConsoleServiceRegistration =
+               context.registerService(IOteConsoleService.class.getName(), oteConsoleService, null);
+            if (System.getProperty("NO_OTE_REMOTE_CONSOLE") == null) {
+               tracker = new RemoteConsoleLauncher(oteConsoleService);
+               tracker.open(true);
+            }
+            return super.addingService(reference);
+         }
+      };
+      workspaceStartTracker.open(true);
+
+      workbenchUserServiceTracker = new ServiceTracker(context, IWorkbenchUserService.class.getName(), null);
+      workbenchUserServiceTracker.open();
+   }
+   
+   public static void setDefaultPreferences() {
+      IPreferenceStore store = getDefault().getPreferenceStore();
+      for( OteConsolePreferences pref : OteConsolePreferences.values()) {
+         store.setDefault(pref.getPropKey(), pref.getDefaultValue().toString());
+      }
+   }
+
+   @Override
+   public void stop(BundleContext context) throws Exception {
+      if (workbenchUserServiceTracker != null) {
+         workbenchUserServiceTracker.close();
+      }
+      if (oteConsoleServiceRegistration != null) {
+         oteConsoleServiceRegistration.unregister();
+         oteConsoleService.close();
+         oteConsoleService = null;
+      }
+      workspaceStartTracker.close();
+      instance = null;
+      
+      super.stop(context);
+   }
+
+   private void startOTEArtifactBulkLoad() {
+      Operations.executeAsJob(new AbstractOperation("OTE Persistance Bulk Load", PLUGIN_ID) {
+
+         @Override
+         protected void doWork(IProgressMonitor monitor) throws Exception {
+        	 try{
+        		 if (getWorkbenchUserService() != null) {
+        			 getWorkbenchUserService().getUser();
+        		 }
+        	 } catch (Throwable th){
+        		 OseeLog.log(getClass(), Level.WARNING, "Unable to connect to OSEE Data Store, user information will default to system properties.", th); 
+        	 }
+         }
+      }, false);
+   }
+
+   private IWorkbenchUserService getWorkbenchUserService() throws OseeCoreException {
+      IWorkbenchUserService service = null;
+      try {
+         service = (IWorkbenchUserService) workbenchUserServiceTracker.waitForService(3000);
+      } catch (InterruptedException ex) {
+         OseeCoreException.wrapAndThrow(ex);
+      }
+      return service;
+   }
+
+   public static TestCoreGuiPlugin getDefault() {
+      return instance;
+   }
+
+   public IOteConsoleService getOteConsoleService() {
+      return oteConsoleService;
+   }
+
+   public static BundleContext getContext() {
+      return instance.context;
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePreferences.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePreferences.java
new file mode 100644
index 0000000..8c8bdf7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePreferences.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * 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.ui.internal.prefs;
+
+/**
+ * @author Michael P. Masterson
+ */
+public enum OteConsolePreferences {
+   BUFFER_LIMIT("org.eclipse.osee.ote.ui.bufferLimit", 1000000), 
+   NO_BUFFER_LIMIT("org.eclipse.osee.ote.ui.noLimit", false);
+
+   
+   private String propKey;
+   private Object defaultValue;
+
+   private OteConsolePreferences(String propKey, Object defaultValue) {
+      this.propKey = propKey;
+      this.defaultValue = defaultValue;
+   }
+   
+   /**
+    * @return the defaultValue
+    */
+   public Object getDefaultValue() {
+      return defaultValue;
+   }
+   
+   /**
+    * @return the propKey
+    */
+   public String getPropKey() {
+      return propKey;
+   }
+   
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePrefsUtil.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePrefsUtil.java
new file mode 100644
index 0000000..d4a6a2d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePrefsUtil.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * 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.ui.internal.prefs;
+
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class OteConsolePrefsUtil {
+
+   public static int getInt(OteConsolePreferences bufferLimit) {
+      String propKey = bufferLimit.getPropKey();
+      lateLoadDefaults(propKey);
+      return TestCoreGuiPlugin.getDefault().getPreferenceStore().getInt(propKey);
+   }
+
+   public static String getString(OteConsolePreferences bufferLimit) {
+      String propKey = bufferLimit.getPropKey();
+      lateLoadDefaults(propKey);
+      return TestCoreGuiPlugin.getDefault().getPreferenceStore().getString(propKey);
+   }
+   
+   public static boolean getBoolean(OteConsolePreferences bufferLimit) {
+      String propKey = bufferLimit.getPropKey();
+      lateLoadDefaults(propKey);
+      return TestCoreGuiPlugin.getDefault().getPreferenceStore().getBoolean(propKey);
+   }
+   
+   public static void setInt(OteConsolePreferences preference, int value) {
+      TestCoreGuiPlugin.getDefault().getPreferenceStore().setValue(preference.getPropKey(), value);
+   }
+   
+   public static void setString(OteConsolePreferences preference, String value) {
+      TestCoreGuiPlugin.getDefault().getPreferenceStore().setValue(preference.getPropKey(), value);
+   }
+   
+   public static void setBoolean(OteConsolePreferences preference, boolean value) {
+      TestCoreGuiPlugin.getDefault().getPreferenceStore().setValue(preference.getPropKey(), value);
+   }
+   
+   private static void lateLoadDefaults(String keyStr) {
+      TestCoreGuiPlugin plugin = TestCoreGuiPlugin.getDefault();
+      String defaultString = plugin.getPreferenceStore().getDefaultString(keyStr);
+      if(defaultString == null || defaultString.length() <= 0) {
+         TestCoreGuiPlugin.setDefaultPreferences();
+      }
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizPage.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizPage.java
new file mode 100644
index 0000000..73c3985
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizPage.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * 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.ui.internal.wizard;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePreferences;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePrefsUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class OteConsolePrefsWizPage extends WizardPage {
+
+   private Text bufferText;
+   private Label errorLabel;
+   private Button noLimitCheckbox;
+
+   private int bufferLimit;
+   private boolean noLimitSelection;
+   
+   /**
+    * @param pageName
+    */
+   public OteConsolePrefsWizPage() {
+      super("OTE Console Preferences Wizard");
+      setTitle("OTE Console Options");
+   }
+
+   /* (non-Javadoc)
+    * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+    */
+   @Override
+   public void createControl(Composite parent) {
+      Composite main = new Composite(parent, SWT.NONE);
+      GridLayoutFactory.fillDefaults().numColumns(1).applyTo(main);
+      
+      addBufferLimit(main);
+      addErrorLabel(main);
+      determinePageComplete();
+      
+      setControl(main);
+   }
+
+   private void addErrorLabel(Composite parent) {
+      this.errorLabel = new Label(parent, SWT.NONE);
+      GridDataFactory.fillDefaults().grab(true, true).applyTo(errorLabel);
+      errorLabel.setVisible(false);
+   }
+
+   /**
+    * 
+    */
+   private void determinePageComplete() {
+      boolean allIsWell = false;
+      String bufferLimitStr = bufferText.getText();
+      if(bufferLimitStr != null && bufferLimitStr.length() > 0 ) {
+         try {
+            Integer.parseInt(bufferLimitStr);
+            allIsWell = true;
+         } catch (NumberFormatException ex) {
+            errorLabel.setText("Buffer limit must be a number between 0 and " + Integer.MAX_VALUE);
+            allIsWell = false;
+         }
+      }
+
+      errorLabel.setVisible(!allIsWell);
+      setPageComplete(allIsWell);
+   }
+
+   /**
+    * @param parent
+    */
+   private void addBufferLimit(Composite parent) {
+      Group comp = new Group(parent, SWT.NONE);
+      GridDataFactory.fillDefaults().grab(false, false).applyTo(comp);
+      GridLayoutFactory.fillDefaults().numColumns(2).applyTo(comp);
+      comp.setText("Select Console Buffer Limit (Bytes)");
+
+      bufferText = new Text(comp, SWT.BORDER);
+      GridDataFactory.fillDefaults().grab(true, true).applyTo(bufferText);
+      
+      String defaultText = OteConsolePrefsUtil.getString(OteConsolePreferences.BUFFER_LIMIT);
+      bufferText.setText(defaultText);
+      
+      noLimitCheckbox = new Button(comp, SWT.CHECK);
+      noLimitCheckbox.setText("No Limit");
+      boolean defaultNoLimit = OteConsolePrefsUtil.getBoolean(OteConsolePreferences.NO_BUFFER_LIMIT);
+      noLimitCheckbox.setSelection(defaultNoLimit);
+
+
+      bufferText.setEnabled(!defaultNoLimit);
+      
+      noLimitCheckbox.addSelectionListener(new SelectionAdapter() {
+         /* (non-Javadoc)
+          * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+          */
+         @Override
+         public void widgetSelected(SelectionEvent e) {
+            boolean isNoLimit = noLimitCheckbox.getSelection();
+            bufferText.setEnabled(!isNoLimit);
+            determinePageComplete();
+            savePreferences();
+         }
+      });
+      
+      bufferText.addKeyListener(new KeyAdapter() {
+         @Override
+         public void keyReleased(KeyEvent e) {
+            determinePageComplete(); 
+         }
+      });
+      
+      bufferText.addFocusListener(new FocusListener() {
+         
+         @Override
+         public void focusLost(FocusEvent e) {
+            determinePageComplete(); 
+            savePreferences();
+         }
+         
+         @Override
+         public void focusGained(FocusEvent e) {
+         }
+      });
+   }
+
+   /**
+    * 
+    */
+   protected void savePreferences() {
+      if(isPageComplete() && !bufferText.isDisposed()) {
+         saveNoLimitSelection();
+         saveBufferLimit();
+         OteConsolePrefsUtil.setInt(OteConsolePreferences.BUFFER_LIMIT, getBufferLimit());
+         OteConsolePrefsUtil.setBoolean(OteConsolePreferences.NO_BUFFER_LIMIT, getNoLimitSelection());
+      }
+   }
+   
+   private void saveNoLimitSelection() {
+      this.noLimitSelection = noLimitCheckbox.getSelection();
+   }
+
+   public boolean getNoLimitSelection() {
+      return noLimitSelection;
+   }
+
+   private void saveBufferLimit() {
+      this.bufferLimit = Integer.parseInt(bufferText.getText());
+   }
+   
+   public int getBufferLimit() {
+      return bufferLimit;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizard.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizard.java
new file mode 100644
index 0000000..ad3245e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizard.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * 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.ui.internal.wizard;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ote.ui.OteConsole;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class OteConsolePrefsWizard extends Wizard {
+   
+   OteConsolePrefsWizPage mainPage;
+   private OteConsole console;
+
+   /**
+    * @param console
+    */
+   public OteConsolePrefsWizard(OteConsole console) {
+      this.console = console;
+      mainPage = new OteConsolePrefsWizPage();
+   }
+
+   @Override
+   public boolean performFinish() {
+      int bufferLimit = mainPage.getBufferLimit();
+      boolean noLimitSelected = mainPage.getNoLimitSelection();
+      
+      console.setLimit(bufferLimit);
+      console.setNoLimit(noLimitSelected);
+      
+      return true;
+   }
+   
+   @Override
+   public void addPages() {
+      addPage(mainPage);
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java
new file mode 100644
index 0000000..17b8ffe
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * 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.ui.navigate;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IRegistryEventListener;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.PluginUiImage;
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateComposite;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Insert the type's description here.
+ * 
+ * @see ViewPart
+ */
+public class OteNavigateView extends ViewPart {
+
+   public static final String VIEW_ID = "org.eclipse.osee.ote.ui.navigate.OteNavigateView";
+   private XNavigateComposite xNavComp;
+
+   @Override
+   public void setFocus() {
+      if (xNavComp != null) {
+         xNavComp.setFocus();
+      }
+   }
+
+   /*
+    * @see IWorkbenchPart#createPartControl(Composite)
+    */
+   @Override
+   public void createPartControl(Composite parent) {
+      xNavComp = new XNavigateComposite(new OteNavigateViewItems(), parent, SWT.NONE);
+
+      xNavComp.getFilteredTree().getViewer().setSorter(new OteNavigateViewerSorter());
+
+      createActions();
+      xNavComp.refresh();
+
+      addExtensionPointListenerBecauseOfWorkspaceLoading();
+
+      // TODO: Change to use OteHelpContext
+      HelpUtil.setHelp(parent, "ote_navigator", "org.eclipse.osee.ote.help.ui");
+      HelpUtil.setHelp(xNavComp, "ote_navigator", "org.eclipse.osee.ote.help.ui");
+   }
+
+   private void addExtensionPointListenerBecauseOfWorkspaceLoading() {
+      IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+      extensionRegistry.addListener(new IRegistryEventListener() {
+         @Override
+         public void added(IExtension[] extensions) {
+            try {
+               refresh();
+            } catch (Exception ex) {
+               OseeLog.log(getClass(), Level.SEVERE, ex);
+            }
+         }
+
+         @Override
+         public void added(IExtensionPoint[] extensionPoints) {
+            try {
+               refresh();
+            } catch (Exception ex) {
+               OseeLog.log(getClass(), Level.SEVERE, ex);
+            }
+         }
+
+         @Override
+         public void removed(IExtension[] extensions) {
+            try {
+               refresh();
+            } catch (Exception ex) {
+               OseeLog.log(getClass(), Level.SEVERE, ex);
+            }
+         }
+
+         @Override
+         public void removed(IExtensionPoint[] extensionPoints) {
+            try {
+               refresh();
+            } catch (Exception ex) {
+               OseeLog.log(getClass(), Level.SEVERE, ex);
+            }
+         }
+      }, "org.eclipse.osee.framework.ui.plugin.XNavigateItem");
+   }
+
+   protected void createActions() {
+      Action refreshAction = new Action("Refresh") {
+
+         @Override
+         public void run() {
+            if (!xNavComp.isDisposed()) {
+               xNavComp.refresh();
+            }
+         }
+      };
+      refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(PluginUiImage.REFRESH));
+      refreshAction.setToolTipText("Refresh");
+
+   }
+
+   public void refresh() {
+      if (!xNavComp.isDisposed()) {
+         xNavComp.refresh();
+      }
+   }
+}
\ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java
new file mode 100644
index 0000000..3015940
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * 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.ui.navigate;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.PluginUiImage;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateContributionManager;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateExtensionPointData;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateViewItems;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OteNavigateViewItems implements XNavigateViewItems {
+
+   public OteNavigateViewItems() {
+      super();
+   }
+
+   @Override
+   public List<XNavigateItem> getSearchNavigateItems() {
+      List<XNavigateItem> items = new ArrayList<>();
+      try {
+         addExtensionPointItems(items);
+      } catch (OseeCoreException ex) {
+         OseeLog.log(TestCoreGuiPlugin.class, Level.SEVERE, ex);
+      }
+      return items;
+   }
+
+   private void addExtensionPointItems(List<XNavigateItem> items) throws OseeCoreException {
+      Collection<XNavigateExtensionPointData> oteNavigateItemExtensions =
+         XNavigateContributionManager.getNavigateItems(OteNavigateView.VIEW_ID);
+      Map<String, XNavigateItem> categoryToNavigateItem =
+         createCategoriesAndAddToItems(items, oteNavigateItemExtensions);
+      for (XNavigateExtensionPointData data : oteNavigateItemExtensions) {
+         XNavigateItem item = categoryToNavigateItem.get(data.getCategory());
+         try {
+            if (item == null) {
+               items.addAll(data.getNavigateItems());
+            } else {
+
+               for (XNavigateItem navItem : data.getNavigateItems()) {
+                  item.addChild(navItem);
+               }
+            }
+         } catch (Throwable th) {
+            OseeLog.log(OteNavigateViewItems.class, Level.SEVERE, th);
+         }
+      }
+   }
+
+   private Map<String, XNavigateItem> createCategoriesAndAddToItems(List<XNavigateItem> items, Collection<XNavigateExtensionPointData> oteNavigateItemExtensions) {
+      Map<String, XNavigateItem> categoryToNavigateItem = new HashMap<>();
+      for (XNavigateExtensionPointData data : oteNavigateItemExtensions) {
+         if (!categoryToNavigateItem.containsKey(data.getCategory())) {
+            String[] path = data.getItemPath();
+            StringBuilder keyBuilder = new StringBuilder(256);
+            XNavigateItem lastItem = null;
+            for (int i = 0; i < path.length; i++) {
+
+               keyBuilder.append(path[i]);
+               String key = keyBuilder.toString();
+               XNavigateItem foundItem = categoryToNavigateItem.get(key);
+               if (foundItem == null) {
+                  foundItem = new XNavigateItem(lastItem, path[i], PluginUiImage.FOLDER);
+                  categoryToNavigateItem.put(key, foundItem);
+                  // if(lastItem != null){
+                  // lastItem.addChild(foundItem);
+                  // }
+                  if (i == 0) {
+                     items.add(foundItem);
+                  }
+               }
+               lastItem = foundItem;
+               keyBuilder.append('.');
+            }
+         }
+      }
+      return categoryToNavigateItem;
+   }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java
new file mode 100644
index 0000000..f24c62d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * 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.ui.navigate;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OteNavigateViewerSorter extends ViewerSorter {
+
+   public OteNavigateViewerSorter() {
+      super();
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public int compare(Viewer viewer, Object e1, Object e2) {
+      XNavigateItem item1 = (XNavigateItem) e1;
+      XNavigateItem item2 = (XNavigateItem) e2;
+      return getComparator().compare(item1.getName(), item2.getName());
+   }
+
+}
diff --git a/org.eclipse.osee.ote.version.git.test/.classpath b/org.eclipse.osee.ote.version.git.test/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/.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.version.git.test/.project b/org.eclipse.osee.ote.version.git.test/.project
new file mode 100644
index 0000000..b07ebb0
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.version.git.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.ote.version.git.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version.git.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..99fff90
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version Git Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version.git.test
+Bundle-Version: 0.25.3.qualifier
+Fragment-Host: org.eclipse.osee.ote.version.git;bundle-version="0.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit;bundle-version="4.11.0"
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version.git.test/build.properties b/org.eclipse.osee.ote.version.git.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.osee.ote.version.git.test/pom.xml b/org.eclipse.osee.ote.version.git.test/pom.xml
new file mode 100644
index 0000000..4661264
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/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.version.git.test</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Ui Test Manager (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.version.git.test/src/org/eclipse/osee/ote/version/git/GitVersionTest.java b/org.eclipse.osee.ote.version.git.test/src/org/eclipse/osee/ote/version/git/GitVersionTest.java
new file mode 100644
index 0000000..3e651f2
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/src/org/eclipse/osee/ote/version/git/GitVersionTest.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * 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.version.git;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class GitVersionTest {
+
+	private static final String GIT_REPO_FILTER = "";
+	private static final String GIT_REPO_FOLDER = "";
+	
+	private static final String validGitFile = "";
+	private static final String validModifiedGitFile = "";
+	private static final String invalidGitFile = "";
+	private static final String invalidNoGitFile = "";
+	
+	private long start;
+	private long end;
+
+	@Ignore
+	@Test
+	public void testGetLastCommit() throws NoHeadException, IOException, GitAPIException {
+		GitVersion gitVersion = new GitVersion(new File(validGitFile));
+
+		RevCommit commit = gitVersion.getLastCommit();
+		Assert.assertNotNull(commit);
+		System.out.println(commit.getCommitterIdent().getName());
+		System.out.println(commit.getCommitterIdent().getWhen());
+		System.out.println(commit.getId().getName());
+	}
+
+	@Ignore
+	@Test
+	public void testGetLastCommitFailFile() throws NoHeadException, IOException, GitAPIException {
+		GitVersion gitVersion = new GitVersion(new File(invalidGitFile));
+		RevCommit commit = gitVersion.getLastCommit();
+		Assert.assertNull(commit);
+	}
+
+	@Ignore
+	@Test
+	public void testGetLastCommitFailRepo() throws NoHeadException, IOException, GitAPIException {
+		GitVersion gitVersion = new GitVersion(new File(invalidNoGitFile));
+		RevCommit commit = gitVersion.getLastCommit();
+		Assert.assertNull(commit);
+	}
+
+	@Ignore
+	@Test
+	public void testModified() throws NoHeadException, IOException, GitAPIException{
+		GitVersion gitVersion = new GitVersion(new File(validGitFile));
+		Assert.assertFalse(gitVersion.getModified());
+
+		gitVersion = new GitVersion(new File(invalidNoGitFile));
+		Assert.assertFalse(gitVersion.getModified());
+
+		gitVersion = new GitVersion(new File(invalidGitFile));
+		Assert.assertFalse(gitVersion.getModified());
+
+		gitVersion = new GitVersion(new File(validModifiedGitFile));
+		Assert.assertTrue(gitVersion.getModified());
+
+	}
+	
+	private List<File> getFiles(){
+		File repo = new File(GIT_REPO_FOLDER);
+		File[] wpsfolders = repo.listFiles(new FileFilter(){
+			@Override
+			public boolean accept(File arg0) {
+				return arg0.isDirectory() && arg0.getName().contains(GIT_REPO_FILTER);
+			}
+			
+		});
+		List<File> files = new ArrayList<>(200);
+		for(File folder:wpsfolders){
+			getJavaFiles(folder, files);
+		}
+		return files;
+	}
+	
+	private void getJavaFiles(File folder, List<File> files){
+		if(folder.isDirectory()){
+			for(File file:folder.listFiles()){
+				if(file.isDirectory()){
+					getJavaFiles(file, files);
+				} else if(file.getAbsolutePath().endsWith(".java")){
+					files.add(file);
+				}
+			}
+		}
+	}
+
+	@Test
+	public void testTime() throws NoHeadException, IOException, GitAPIException{
+		List<File> files = getFiles();
+		System.out.println(files.size());
+		startTimer();
+		for(File timedGitFile: files){
+			GitVersion gitVersion = new GitVersion(timedGitFile);
+			RevCommit commit = gitVersion.getLastCommit();
+//			System.out.println(commit.getId());
+		}
+		endTimer();
+		System.out.println(getElapsedTimeInSec());
+
+		GitVersions gitVersions = new GitVersions(files);
+		startTimer();
+		Map<File, RevCommit> commits = gitVersions.getLastCommits();
+//		for(File timedGitFile: files){
+//			System.out.println(commits.get(timedGitFile).getId());
+//		}
+		endTimer();
+		System.out.println(getElapsedTimeInSec());
+
+	}
+
+	private void startTimer(){
+		start = System.nanoTime();
+	}
+
+	private void endTimer(){
+		end = System.nanoTime();
+	}
+
+	private long getElapsedTime(){
+		return end - start;
+	}
+
+	private String getElapsedTimeInSec(){
+		return String.format("%f03", (((float)getElapsedTime())/1000000000f));
+	}
+
+}
diff --git a/org.eclipse.osee.ote.version.git/.classpath b/org.eclipse.osee.ote.version.git/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/.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.version.git/.project b/org.eclipse.osee.ote.version.git/.project
new file mode 100644
index 0000000..0afb2b9
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.version.git</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.version.git/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version.git/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..96a09d5
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version Git (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version.git
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.jgit.api,
+ org.eclipse.jgit.api.errors,
+ org.eclipse.jgit.errors,
+ org.eclipse.jgit.lib,
+ org.eclipse.jgit.revwalk,
+ org.eclipse.jgit.storage.file,
+ org.eclipse.jgit.treewalk,
+ org.eclipse.jgit.treewalk.filter,
+ org.eclipse.osee.ote.version
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version.git/OSGI-INF/GITFileVersionInformationComponent.xml b/org.eclipse.osee.ote.version.git/OSGI-INF/GITFileVersionInformationComponent.xml
new file mode 100644
index 0000000..e03193d
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/OSGI-INF/GITFileVersionInformationComponent.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="false" name="org.eclipse.osee.ote.version.git.fileProvider">
+   <implementation class="org.eclipse.osee.ote.version.git.GitVersionProvider"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.version.FileVersionInformationProvider"/>
+   </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.version.git/build.properties b/org.eclipse.osee.ote.version.git/build.properties
new file mode 100644
index 0000000..6210e84
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.version.git/pom.xml b/org.eclipse.osee.ote.version.git/pom.xml
new file mode 100644
index 0000000..afe48cf
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/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.version.git</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Ui Test Manager (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.version.git/src/org/eclipse/osee/ote/version/git/GitFileVersion.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitFileVersion.java
new file mode 100644
index 0000000..5434bc0
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitFileVersion.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.version.git;
+
+import java.io.IOException;
+
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.osee.ote.version.FileVersion;
+
+public class GitFileVersion implements FileVersion {
+
+	private RevCommit commit;
+	private boolean modified;
+
+	GitFileVersion(GitVersion gitVersion) throws NoHeadException, IOException, GitAPIException{
+		this.commit = gitVersion.getLastCommit();
+		if(commit == null){
+			throw new IOException("Not a git repo");
+		}
+	}
+	
+	GitFileVersion(RevCommit commit) {
+		this.commit = commit;
+	}
+	
+	@Override
+	public String getLastChangedRevision() {
+		return commit.getId().getName();
+	}
+
+	@Override
+	public String getURL() {
+		return null;
+	}
+
+	@Override
+	public String getVersionControlSystem() {
+		return "GIT";
+	}
+
+	@Override
+	public String getModifiedFlag() {
+		return "N/A";
+	}
+
+	@Override
+	public String getLastModificationDate() {
+		return commit.getAuthorIdent().getWhen().toString();
+	}
+
+	@Override
+	public String getLastAuthor() {
+		return commit.getAuthorIdent().getName();
+	}
+
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersion.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersion.java
new file mode 100644
index 0000000..7832fc7
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersion.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * 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.version.git;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.LogCommand;
+import org.eclipse.jgit.api.Status;
+import org.eclipse.jgit.api.StatusCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.errors.NoWorkTreeException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class GitVersion extends GitVersionBase {
+
+	private final File file;
+	
+	public GitVersion(File file){
+		this.file = file;
+	}
+	
+	public String getURL() throws MalformedURLException{
+		return this.file.toURI().toURL().toString();
+	}
+	
+	public boolean getModified() throws IOException, NoWorkTreeException, GitAPIException{
+		if(!file.exists()){
+			return false;
+		}
+		File gitFolder = findGitDirUp(file);
+		if(gitFolder == null){
+			return false;
+		}
+		Repository repository = buildRepository(gitFolder);
+		Git git = new Git(repository);
+		StatusCommand status = git.status();
+		String pathFilter = getPathFilterFromFullPathAndGitFolder(file, gitFolder);
+		Status result = status.call();
+		Set<String> modified = result.getModified();
+		if(modified.contains(pathFilter)){
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	public  RevCommit getLastCommit() throws IOException, NoHeadException, GitAPIException{
+		if(!file.exists()){
+			return null;
+		}
+		File gitFolder = findGitDirUp(file);
+		if(gitFolder == null){
+			return null;
+		}
+		Repository repository = buildRepository(gitFolder);
+		Git git = new Git(repository);
+		LogCommand log = git.log();
+		String pathFilter = getPathFilterFromFullPathAndGitFolder(file, gitFolder);
+		log.addPath(pathFilter);
+		Iterable<RevCommit> iterable = log.call();
+		Iterator<RevCommit> it = iterable.iterator();
+		if(it.hasNext()){
+			return it.next(); 
+		} else {
+			return null;
+		}
+	}
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionBase.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionBase.java
new file mode 100644
index 0000000..8f19899
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionBase.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * 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.version.git;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+
+public class GitVersionBase {
+	
+	protected String getPathFilterFromFullPathAndGitFolder(File file, File gitFolder) {
+		String path = file.getAbsolutePath().replace(gitFolder.getParentFile().getAbsolutePath(), "");
+		if(path.startsWith("\\") || path.startsWith("/")){
+			path = path.substring(1);
+		}
+		path = path.replaceAll("\\\\", "/");
+		return path;
+	}
+
+	protected Repository buildRepository(File gitFolder) throws IOException {
+		FileRepositoryBuilder builder = new FileRepositoryBuilder();
+		Repository repository = builder.setGitDir(gitFolder).readEnvironment().findGitDir().build();
+		repository.resolve("HEAD");
+		return repository;
+	}
+
+	protected File findGitDirUp(File file){
+		if(file == null){
+			return null;
+		}
+		File parent = file.getParentFile();
+		if(parent == null){
+			return null;
+		}
+		File[] dirs = parent.listFiles(new FileFilter(){
+			public boolean accept(File file){
+				if(file.isDirectory()){
+					return true;
+				} else {
+					return false;
+				}
+			}
+		});
+		for(File dir:dirs){
+			if(dir.getName().equals(".git")){
+				return dir;
+			}
+		}
+		return findGitDirUp(parent);
+	}
+
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionProvider.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionProvider.java
new file mode 100644
index 0000000..1f84b76
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionProvider.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * 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.version.git;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.osee.ote.version.FileVersionInformationProvider;
+
+public class GitVersionProvider implements FileVersionInformationProvider {
+
+	@Override
+	public void getFileVersions(List<File> files, Map<File, FileVersion> versions) {
+		GitVersions gitVersions = new GitVersions(files);
+		Map<File, RevCommit> commits = gitVersions.getLastCommits();
+		for(Entry<File, RevCommit> entry:commits.entrySet()){
+			versions.put(entry.getKey(), new GitFileVersion(entry.getValue()));
+		}
+	}
+
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersions.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersions.java
new file mode 100644
index 0000000..7ad53c3
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersions.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * 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.version.git;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.LogCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class GitVersions extends GitVersionBase {
+
+	private List<File> files;
+
+	public GitVersions(List<File> files) {
+		this.files = files;
+	}
+	
+	
+	public  Map<File, RevCommit> getLastCommits() {
+		Map<File, RevCommit> commits = new HashMap<>();
+		Map<File, List<File>> gitToFiles = new HashMap<>();
+		for(File file:files){
+			if(!file.exists()){
+				continue;
+			}
+			File gitFolder = findGitDirUp(file);
+			if(gitFolder == null){
+				continue;
+			}	
+			List<File> gitfiles = gitToFiles.get(gitFolder);
+			if(gitfiles == null){
+				gitfiles = new ArrayList<>();
+				gitToFiles.put(gitFolder, gitfiles);
+			}
+			gitfiles.add(file);
+		}
+		for(Entry<File, List<File>> entry:gitToFiles.entrySet()){
+			try{
+				Repository repository = buildRepository(entry.getKey());
+				Git git = new Git(repository);
+
+				for(File gitfile:entry.getValue()){
+				    LogCommand log = git.log();
+				    log.setMaxCount(1);
+					String pathFilter = getPathFilterFromFullPathAndGitFolder(gitfile, entry.getKey());
+					log.addPath(pathFilter);
+					Iterable<RevCommit> iterable = log.call();
+					Iterator<RevCommit> it = iterable.iterator();
+					if(it.hasNext()){
+						RevCommit commit = it.next();
+						commits.put(gitfile, commit);
+					}
+				}
+			}catch(IOException e){
+				e.printStackTrace();
+			} catch (NoHeadException e) {
+				e.printStackTrace();
+			} catch (GitAPIException e) {
+				e.printStackTrace();
+			}
+		}
+		return commits;
+	}
+}
diff --git a/org.eclipse.osee.ote.version.svn/.classpath b/org.eclipse.osee.ote.version.svn/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/.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.version.svn/.project b/org.eclipse.osee.ote.version.svn/.project
new file mode 100644
index 0000000..bf63408
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.version.svn</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.version.svn/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version.svn/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..fc6a770
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version SVN (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version.svn
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.filesystem,
+ org.eclipse.core.resources,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.version,
+ org.eclipse.team.svn.core.connector,
+ org.eclipse.team.svn.core.extension,
+ org.eclipse.team.svn.core.extension.factory,
+ org.eclipse.team.svn.core.operation,
+ org.eclipse.team.svn.core.utility
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version.svn/OSGI-INF/svnFileVersionInformationComponent.xml b/org.eclipse.osee.ote.version.svn/OSGI-INF/svnFileVersionInformationComponent.xml
new file mode 100644
index 0000000..440f600
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/OSGI-INF/svnFileVersionInformationComponent.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="false" name="org.eclipse.osee.ote.version.svn">
+   <implementation class="org.eclipse.osee.ote.version.svn.SvnVersionProvider"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.version.FileVersionInformationProvider"/>
+   </service>
+   <reference cardinality="1..1" interface="org.eclipse.core.resources.IWorkspace" name="IWorkspace" policy="static"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.version.svn/build.properties b/org.eclipse.osee.ote.version.svn/build.properties
new file mode 100644
index 0000000..f8831f9
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/build.properties
@@ -0,0 +1,6 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/svnFileVersionInformationComponent.xml,\
+               OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.version.svn/pom.xml b/org.eclipse.osee.ote.version.svn/pom.xml
new file mode 100644
index 0000000..8c48683
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/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.version.svn</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE SVN (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.version.svn/src/org/eclipse/osee/ote/version/svn/ScriptToProject.java b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/ScriptToProject.java
new file mode 100644
index 0000000..44834f0
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/ScriptToProject.java
@@ -0,0 +1,82 @@
+/*
+ * Created on Feb 27, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.version.svn;
+
+import java.io.File;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.team.svn.core.utility.SVNUtility;
+
+public class ScriptToProject {
+
+   private final Map<String, Set<String>> projectsScriptsMap = new HashMap<>();
+   private final Map<String, File> scriptNameToScriptFileMap = new HashMap<>();
+   private final IProject[] workspaceProjects;
+
+   public ScriptToProject(IProject[] workspaceProjects) {
+      this.workspaceProjects = workspaceProjects;
+   }
+
+   public void add(File scriptFile) {
+      String scriptName = scriptFile.getName();
+      IProject scriptProject = null;
+      IFile iFile = null;
+      IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(org.eclipse.core.filesystem.URIUtil.toURI(scriptFile.getAbsolutePath()));
+      if(files.length > 0){
+         iFile = files[0];                     
+      }
+      for(IProject project:workspaceProjects){
+         String projectName = project.getName();
+         if(iFile.toString().contains(projectName)){
+            scriptProject = project;
+         }
+      }
+      if(scriptProject != null){
+         URI scriptProjectLocationUri = scriptProject.getLocationURI();
+         File scriptProjectFile = new File(scriptProjectLocationUri);
+
+         if (isSvn(scriptProjectFile)) {
+            String scriptProjectLocation = scriptProjectFile.getAbsolutePath();
+            addScriptListValue(scriptProjectLocation, scriptName);
+            scriptNameToScriptFileMap.put(scriptName, scriptFile);
+         } 
+      }
+   }
+
+   public Set<String> getProjectsSet() {
+      return projectsScriptsMap.keySet();
+   }
+
+   public void addScriptListValue(String key, String value) {
+      Set<String> values = projectsScriptsMap.get(key);
+      if (values == null) {
+         values = new HashSet<>();
+         projectsScriptsMap.put(key, values);
+      }
+      values.add(value);
+   }
+
+   public File getScriptFileMatch(String project, String itemToMatch) {
+      Set<String> scriptsForProject = projectsScriptsMap.get(project);
+      if(scriptsForProject.contains(itemToMatch)){
+         return scriptNameToScriptFileMap.get(itemToMatch);
+      } else {
+         return null;
+      }
+   }
+
+   protected boolean isSvn(File file) {
+      File svn = new File(file, SVNUtility.getSVNFolderName());
+      return svn.exists();
+   }
+}
diff --git a/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnFileVersion.java b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnFileVersion.java
new file mode 100644
index 0000000..81f3e75
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnFileVersion.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.version.svn;
+
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.Locale;
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.team.svn.core.connector.SVNEntryInfo;
+
+
+public class SvnFileVersion implements FileVersion {
+
+	private SVNEntryInfo entry;
+	private DateFormat dateFormat;
+
+	public SvnFileVersion(SVNEntryInfo svnEntryInfo) {
+       this.entry = svnEntryInfo;
+       dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.getDefault());
+	}
+	  
+	@Override
+	public String getLastChangedRevision() {
+		return Long.toString(entry.lastChangedRevision);
+	}
+
+	@Override
+	public String getURL() {
+		return entry.url;
+	}
+
+	@Override
+	public String getVersionControlSystem() {
+		return "svn";
+	}
+
+	@Override
+	public String getModifiedFlag() {
+		/*
+		 *  IFile iFile = AIFile.constructIFile(file.getAbsolutePath());
+	      ILocalResource local = SVNRemoteStorage.instance().asLocalResource(iFile);
+	      entry.setModifiedFlag(SVNUtility.getStatusText(local.getStatus()));
+		 */
+		return "N/A";
+	}
+
+	@Override
+	public String getLastModificationDate() {
+		return dateFormat.format(new Date(entry.lastChangedDate));
+	}
+
+	@Override
+	public String getLastAuthor() {
+		return entry.lastChangedAuthor;
+	}
+
+}
diff --git a/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnVersionProvider.java b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnVersionProvider.java
new file mode 100644
index 0000000..6cd50ee
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnVersionProvider.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * 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.version.svn;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.osee.ote.version.FileVersionInformationProvider;
+import org.eclipse.team.svn.core.connector.ISVNConnector;
+import org.eclipse.team.svn.core.connector.SVNDepth;
+import org.eclipse.team.svn.core.connector.SVNEntryInfo;
+import org.eclipse.team.svn.core.connector.SVNEntryRevisionReference;
+import org.eclipse.team.svn.core.extension.CoreExtensionsManager;
+import org.eclipse.team.svn.core.operation.SVNNullProgressMonitor;
+import org.eclipse.team.svn.core.utility.SVNUtility;
+
+public class SvnVersionProvider implements FileVersionInformationProvider {
+
+   protected boolean isSvn(File file) {
+      File svn = new File(file, SVNUtility.getSVNFolderName());
+      return svn.exists();
+   }
+
+   @Override
+   public void getFileVersions(List<File> scriptFiles, Map<File, FileVersion> versions) {
+
+      IProject[] workspaceProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+      ScriptToProject collection = new ScriptToProject(workspaceProjects);
+
+      for (File scriptFile : scriptFiles) {
+         collection.add(scriptFile);
+      }
+
+      ISVNConnector proxy = CoreExtensionsManager.instance().getSVNConnectorFactory().createConnector();
+      for (String projectName : collection.getProjectsSet()) {
+         try {
+            SVNEntryInfo[] st =
+               SVNUtility.info(proxy, new SVNEntryRevisionReference(projectName), SVNDepth.INFINITY,
+                  new SVNNullProgressMonitor());
+            for (SVNEntryInfo entry : st) {
+               String svnEntryPath = entry.path;
+               String itemToMatch = svnEntryPath.substring(svnEntryPath.lastIndexOf("/") + 1);
+               File scriptFile = collection.getScriptFileMatch(projectName, itemToMatch);
+               if (scriptFile != null) {
+                  versions.put(scriptFile, new SvnFileVersion(entry));
+               }
+            }
+         } catch (Exception ex) {
+            OseeLog.logf(getClass(), Level.SEVERE, "SVNConnectorException while retrieving script SVN info ", ex);
+         }
+      }
+   }
+}
diff --git a/org.eclipse.osee.ote.version/.classpath b/org.eclipse.osee.ote.version/.classpath
new file mode 100644
index 0000000..1fa3e68
--- /dev/null
+++ b/org.eclipse.osee.ote.version/.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.version/.project b/org.eclipse.osee.ote.version/.project
new file mode 100644
index 0000000..3660d46
--- /dev/null
+++ b/org.eclipse.osee.ote.version/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osee.ote.version</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.version/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..709d385
--- /dev/null
+++ b/org.eclipse.osee.ote.version/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.version
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version/OSGI-INF/FileVersionInformationComponent.xml b/org.eclipse.osee.ote.version/OSGI-INF/FileVersionInformationComponent.xml
new file mode 100644
index 0000000..0cff46a
--- /dev/null
+++ b/org.eclipse.osee.ote.version/OSGI-INF/FileVersionInformationComponent.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.version.FileVersionInformation">
+   <implementation class="org.eclipse.osee.ote.version.internal.FileVersionInformationImpl"/>
+   <service>
+      <provide interface="org.eclipse.osee.ote.version.FileVersionInformation"/>
+   </service>
+   <reference bind="addFileVersionInformationProvider" cardinality="0..n" interface="org.eclipse.osee.ote.version.FileVersionInformationProvider" name="FileVersionInformationProvider" policy="dynamic" unbind="removeFileVersionInformationProvider"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.version/build.properties b/org.eclipse.osee.ote.version/build.properties
new file mode 100644
index 0000000..c58ea21
--- /dev/null
+++ b/org.eclipse.osee.ote.version/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
diff --git a/org.eclipse.osee.ote.version/pom.xml b/org.eclipse.osee.ote.version/pom.xml
new file mode 100644
index 0000000..673d771
--- /dev/null
+++ b/org.eclipse.osee.ote.version/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.version</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>OTE Ui Test Manager (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.version/src/org/eclipse/osee/ote/version/FileVersion.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersion.java
new file mode 100644
index 0000000..64fcb22
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersion.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * 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.version;
+
+public interface FileVersion {
+	String getLastChangedRevision();
+	String getURL();
+	String getVersionControlSystem();
+	String getModifiedFlag();
+	String getLastModificationDate();
+	String getLastAuthor();
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformation.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformation.java
new file mode 100644
index 0000000..3611fe1
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformation.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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.version;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+public interface FileVersionInformation {
+	
+	Map<File, FileVersion> getFileVersions(List<File> files);
+	
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformationProvider.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformationProvider.java
new file mode 100644
index 0000000..1ec6ad8
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformationProvider.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.version;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+public interface FileVersionInformationProvider {
+	void getFileVersions(List<File> files, Map<File, FileVersion> versions);
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/DefaultFileVersion.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/DefaultFileVersion.java
new file mode 100644
index 0000000..67821ba
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/DefaultFileVersion.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * 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.version.internal;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.Date;
+
+import org.eclipse.osee.ote.version.FileVersion;
+
+public class DefaultFileVersion implements FileVersion {
+
+	private String url;
+	private String lastModified;
+
+	public DefaultFileVersion(File file){
+		if(file.exists()){
+			try {
+				this.url = file.toURI().toURL().toString();
+			} catch (MalformedURLException e) {
+				this.url = e.getMessage();
+			}
+			this.lastModified = new Date(file.lastModified()).toString();
+		} else {
+			this.url = "N/A";
+		}
+	}
+	
+	@Override
+	public String getLastChangedRevision() {
+		return "N/A";
+	}
+
+	@Override
+	public String getURL() {
+		return url;
+	}
+
+	@Override
+	public String getVersionControlSystem() {
+		return "NONE";
+	}
+
+	@Override
+	public String getModifiedFlag() {
+		return "N/A";
+	}
+
+	@Override
+	public String getLastModificationDate() {
+		return lastModified;
+	}
+
+	@Override
+	public String getLastAuthor() {
+		return System.getProperty("user.name");
+	}
+
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/FileVersionInformationImpl.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/FileVersionInformationImpl.java
new file mode 100644
index 0000000..59fc5a4
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/FileVersionInformationImpl.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * 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.version.internal;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.osee.ote.version.FileVersionInformation;
+import org.eclipse.osee.ote.version.FileVersionInformationProvider;
+
+public class FileVersionInformationImpl implements FileVersionInformation {
+
+	private CopyOnWriteArrayList<FileVersionInformationProvider> providers;
+
+	public FileVersionInformationImpl(){
+		providers = new CopyOnWriteArrayList<>();
+	}
+	
+	public void addFileVersionInformationProvider(FileVersionInformationProvider versionProvider){
+		providers.add(versionProvider);
+	}
+	
+	public void removeFileVersionInformationProvider(FileVersionInformationProvider versionProvider){
+		providers.remove(versionProvider);
+	}
+
+	@Override
+	public Map<File, FileVersion> getFileVersions(List<File> files) {
+		Map<File, FileVersion> versions = new HashMap<>(files.size());
+		for(File file:files){
+			versions.put(file, null);
+		}
+		for(FileVersionInformationProvider provider:providers){
+			provider.getFileVersions(files, versions);
+		}
+		for(Entry<File, FileVersion> entry:versions.entrySet()){
+			if(entry.getValue() == null){
+				entry.setValue(new DefaultFileVersion(entry.getKey()));
+			}
+		}
+		return versions;
+	}
+}
diff --git a/org.eclipse.ote.bytemessage.test/.classpath b/org.eclipse.ote.bytemessage.test/.classpath
index ad32c83..1fa3e68 100644
--- a/org.eclipse.ote.bytemessage.test/.classpath
+++ b/org.eclipse.ote.bytemessage.test/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<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"/>
diff --git a/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.bytemessage/.classpath b/org.eclipse.ote.bytemessage/.classpath
index ad32c83..1fa3e68 100644
--- a/org.eclipse.ote.bytemessage/.classpath
+++ b/org.eclipse.ote.bytemessage/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<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"/>
diff --git a/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.io/.classpath b/org.eclipse.ote.io/.classpath
index ad32c83..eca7bdb 100644
--- a/org.eclipse.ote.io/.classpath
+++ b/org.eclipse.ote.io/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="output" path="bin"/>
diff --git a/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.mavenbuild/pom.xml b/org.eclipse.ote.mavenbuild/pom.xml
index 34fc199..e618622 100644
--- a/org.eclipse.ote.mavenbuild/pom.xml
+++ b/org.eclipse.ote.mavenbuild/pom.xml
@@ -166,7 +166,7 @@
 						<configuration>
 							<sourceEncoding>utf-8</sourceEncoding>
 							<minimumTokens>100</minimumTokens>
-							<targetJdk>1.6</targetJdk>
+							<targetJdk>1.8</targetJdk>
 							<format>xml</format>
 							<failOnViolation>${pmd.failOnErrors}</failOnViolation>
 							<outputDirectory>${pmd.reportPath}</outputDirectory>
@@ -420,8 +420,8 @@
 					<artifactId>tycho-compiler-plugin</artifactId>
 					<version>${tycho-version}</version>
 					<configuration>
-						<source>1.6</source>
-						<target>1.6</target>
+						<source>1.8</source>
+						<target>1.8</target>
 						<encoding>UTF-8</encoding>
 					</configuration>
 				</plugin>
@@ -480,7 +480,7 @@
 					<configuration>
 						<sourceEncoding>utf-8</sourceEncoding>
 						<minimumTokens>100</minimumTokens>
-						<targetJdk>1.5</targetJdk>
+						<targetJdk>1.8</targetJdk>
 						<format>xml</format>
 						<failOnViolation>false</failOnViolation>
 					</configuration>
diff --git a/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs
index c537b63..0c68a61 100644
--- a/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
