diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..a83f947c5efa7d0e7c76719a77eb9bf2f3aa9e20
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry exported="true" kind="lib" path="bin" sourcepath="bin"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
+		<attributes>
+			<attribute name="module" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4e6a73b2668d5862fede9b021b27cbd57548e2f2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,75 @@
+##############################
+## Java
+##############################
+.mtj.tmp/
+*.class
+*.jar
+*.war
+*.ear
+*.nar
+hs_err_pid*
+.svn/
+
+##############################
+## Maven
+##############################
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+
+##############################
+## Gradle
+##############################
+bin/
+build/
+.gradle
+.gradletasknamecache
+gradle-app.setting
+!gradle-wrapper.jar
+
+##############################
+## IntelliJ
+##############################
+out/
+.idea/
+.idea_modules/
+*.iml
+*.ipr
+*.iws
+
+##############################
+## Eclipse
+##############################
+.settings/
+bin/
+tmp/
+.metadata
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.loadpath
+
+##############################
+## NetBeans
+##############################
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+
+##############################
+## OS X
+##############################
+.DS_Store
\ No newline at end of file
diff --git a/.pmd b/.pmd
new file mode 100644
index 0000000000000000000000000000000000000000..8e2b7180da6c57d32b16662769d92f06c3470528
--- /dev/null
+++ b/.pmd
@@ -0,0 +1,917 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>IfStmtsMustUseBraces</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>WhileLoopsMustUseBraces</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>IfElseStmtsMustUseBraces</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopsMustUseBraces</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseSingleton</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanReturns</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanExpressions</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchStmtsShouldHaveDefault</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDeeplyNestedIfStmts</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidReassigningParameters</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchDensity</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ConstructorCallsOverridableMethod</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AccessorClassGeneration</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>FinalFieldCouldBeStatic</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CloseResource</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NonStaticInitializer</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultLabelNotLastInSwitchStmt</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NonCaseLabelInSwitchStatement</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>OptimizableToArrayCall</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>BadComparison</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EqualsNull</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ConfusingTernary</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>InstantiationToGetClass</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>IdempotentOperations</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SimpleDateFormatNeedsLocale</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ImmutableField</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseLocaleWithCaseConversions</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidProtectedFieldInFinalClass</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentToNonFinalStatic</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MissingStaticMethodInNonInstantiatableClass</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidSynchronizedAtMethodLevel</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MissingBreakInSwitch</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseNotifyAllInsteadOfNotify</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstanceofChecksInCatchClause</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAbstractMethod</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyConditional</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CompareObjectsWithEquals</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>PositionLiteralsFirstInComparisons</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryLocalBeforeReturn</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NonThreadSafeSingleton</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyMethod</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyConstructor</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidConstantsInterface</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnsynchronizedStaticDateFormatter</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>PreserveStackTrace</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseCollectionIsEmpty</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SingularField</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingThrowable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ExceptionAsFlowControl</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingNPE</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingRawExceptionTypes</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNullPointerException</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidRethrowingException</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotExtendJavaLangError</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateField</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedLocalVariable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateMethod</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedFormalParameter</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MoreThanOneLogger</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>LoggerIsNotStaticFinal</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SystemPrintln</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidPrintStackTrace</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDuplicateLiterals</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>StringInstantiation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>StringToString</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientStringBuffering</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryCaseChange</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferLength</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AppendCharacterWithChar</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ConsecutiveLiteralAppends</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseIndexOfChar</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientEmptyStringCheck</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>InsufficientStringBufferDeclaration</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UselessStringValueOf</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>StringBufferInstantiationWithChar</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseEqualsToCompareStrings</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceVectorWithList</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceHashtableWithMap</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceEnumerationWithIterator</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidEnumAsIdentifier</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAssertAsIdentifier</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>IntegerInstantiation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ByteInstantiation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ShortInstantiation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>LongInstantiation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseBeforeAnnotation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseAfterAnnotation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseTestAnnotation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitUseExpected</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseProperClassLoader</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MDBAndSessionBeanNamingConvention</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteSessionInterfaceNamingConvention</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>LocalInterfaceSessionNamingConvention</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>LocalHomeNamingConvention</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteInterfaceNamingConvention</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallSystemExit</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>StaticEJBFieldShouldBeFinal</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotUseThreads</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>LocalVariableCouldBeFinal</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MethodArgumentCouldBeFinal</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstantiatingObjectsInLoops</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseArrayListInsteadOfVector</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyStartsWith</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferForStringAppends</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseArraysAsList</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidArrayLoops</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryWrapperObjectCreation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AddEmptyString</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyCatchBlock</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyIfStmt</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyWhileStmt</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyTryBlock</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinallyBlock</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySwitchStatements</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JumbledIncrementer</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopShouldBeWhileLoop</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConversionTemporary</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>OverrideBothEqualsAndHashcode</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DoubleCheckedLocking</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnFromFinallyBlock</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySynchronizedBlock</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryReturn</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStaticInitializer</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnconditionalIfStatement</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStatementNotInLoop</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInstantiation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryFinalModifier</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CollapsibleIfStatements</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOverridingMethod</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ClassCastExceptionWithToArray</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOperationOnImmutable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MisplacedNullCheck</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedNullCheckInEquals</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThreadGroup</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>BrokenNullCheck</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>BigIntegerInstantiation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingOctalValues</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingHardCodedIP</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CheckResultSet</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MethodReturnsInternalArray</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ArrayIsStoredDirectly</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CouplingBetweenObjects</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveImports</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DuplicateImports</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportJavaLang</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ImportFromSamePackage</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyStaticImports</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitStaticSuite</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitSpelling</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitAssertionsShouldIncludeMessage</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitTestsShouldIncludeAssert</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>TestClassWithoutTestCases</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryBooleanAssertion</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertEqualsInsteadOfAssertTrue</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertSameInsteadOfAssertTrue</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertNullInsteadOfAssertTrue</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanAssertion</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConstructor</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NullAssignment</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>OnlyOneReturn</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedModifier</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentInOperand</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AtLeastOneConstructor</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportSun</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousOctalEscape</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CallSuperInConstructor</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryParentheses</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultPackage</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInversion</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>DataflowAnomalyAnalysis</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFinalLocalVariable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingShortType</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingVolatile</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingNativeCode</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAccessibilityAlteration</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ShortVariable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>LongVariable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ShortMethodName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>VariableNamingConventions</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MethodNamingConventions</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ClassNamingConventions</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractNaming</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDollarSigns</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MethodWithSameNameAsEnclosingClass</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousHashcodeMethodName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousConstantFieldName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousEqualsMethodName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingTypeName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingMethodName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NoPackage</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>PackageCase</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MisleadingVariableName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanGetMethodName</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NPathComplexity</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveMethodLength</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveParameterList</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveClassLength</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CyclomaticComplexity</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessivePublicCount</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyFields</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NcssMethodCount</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NcssTypeCount</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>NcssConstructorCount</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinalizer</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOnlyCallsSuperFinalize</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOverloaded</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeDoesNotCallSuperFinalize</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeShouldBeProtected</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCallingFinalize</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>UseCorrectExceptionLogging</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ProperLogger</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>BeanMembersShouldSerialize</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>MissingSerialVersionUID</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>ProperCloneImplementation</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CloneThrowsCloneNotSupportedException</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>pmd-eclipse</ruleset>
+        </rule>
+    </rules>
+    <includeDerivedFiles>false</includeDerivedFiles>
+    <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/.project b/.project
new file mode 100644
index 0000000000000000000000000000000000000000..c44246535d2419faf615465f8d70cab6f8116ce4
--- /dev/null
+++ b/.project
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>comtestplugin</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>
+	<linkedResources>
+		<link>
+			<name>src/comtest</name>
+			<type>2</type>
+			<location>E:/kurssit/ohj2/comtest/comtest</location>
+		</link>
+	</linkedResources>
+</projectDescription>
diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..89adc5bb24f58003e60684f7ce9b2c81194d0f81
--- /dev/null
+++ b/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: comtestplug; singleton:=true
+Bundle-Version: 1.0.13
+Bundle-Activator: comtestplug.Activator
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.junit,
+ org.eclipse.debug.ui,
+ org.eclipse.jdt.ui,
+ org.eclipse.jface.text
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: bin/
diff --git a/build.properties b/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c6e7f705957fe4d17978b676e075518b3a2900a0
--- /dev/null
+++ b/build.properties
@@ -0,0 +1,14 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .classpath,\
+               build.properties,\
+               .settings/,\
+               bin/,\
+               plugin.xml,\
+               plugin.properties
+jars.compile.order = .
+bin.excludes = bin/comtest/Mock.class,\
+               bin/comtest/ComTestTest.class,\
+               bin/comtest/StringUtilitiesTest.class,\
+               bin/comtest/StringsTest.class
+src.includes = src/
diff --git a/build2.xml b/build2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e93be047adf23841217d12af05a03a9a9a2c2df0
--- /dev/null
+++ b/build2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project default="plugin_export" name="build">
+	<target name="plugin_export">
+		<pde.exportPlugins destination="e:\kurssit\ohj2\comtestplugin\plugins" exportSource="false" exportType="directory" filename="comtestplug_1.0.8.jar" plugins="comtestplug" useJARFormat="true"/>
+	</target>
+</project>
diff --git a/plugin.properties b/plugin.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c3b98733ad86ab4844676b2adcd34489985f6533
--- /dev/null
+++ b/plugin.properties
@@ -0,0 +1,2 @@
+#Properties file for comtestplug
+Bundle-Name = Comtestplug Plug-in
\ No newline at end of file
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e88a78273029e5093a9531eb464a54a81d8151dc
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+<!-- Plugin for ComTest. Category, actionSets and actions
+     The default keyshotcuts does not work???
+     Creates many instances of actions plugin, one
+     for PopUps and one for Windows.  See Java comments from
+     GenerateTest.java.
+
+     The shortcut is possible to change manually from:
+       Window/Preferences/General/Keys/Modify/
+       Category: ComTest.
+     If you choose shortcut that is allready in use, remove
+     the old one.  The shortcut works only for last item run
+     from PopUpMenu.  Can somebody fix that?
+
+     It could be nice to have also toolbar icon?
+
+     Vesa Lappalainen 2.12.2007
+
+     To develop this plugin,
+      1) first pick ComTest project from:
+          https://svn.cc.jyu.fi/srv/svn/comtest/proto/vesal/trunk (to directory comtest)
+      2) then pick comtestplugin project from
+          https://svn.cc.jyu.fi/srv/svn/comtest/proto/ji/trunk  (to directory comtestplugin)
+      3) then try to change the Eclipse project variabale
+          comtestfolder
+         needed.  I have that variable in WorkSpace configuration:
+          .metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.core.resources.prefs:
+             pathvariable.comtestfolder=E\:/kurssit/ohj2/comtest/comtest
+
+         Create Java project comtest from directory ComTest
+         Create Plugin project comtestplugin from directory comtestplugin
+      4) Now ComTest should be a linked directory under comtestplug/src path.
+         This is done by .project file like:
+         	<linkedResources>
+       		<link>
+		  	  <name>src/comtest</name>
+			  <type>2</type>
+			  <locationURI>comtestfolder</locationURI>
+		    </link>
+	        </linkedResources>
+	     Then variable comtestfolder is defined in:
+	       Window/Preferences/General/Workspace/Linked Resources
+           and then add comtestfolder f.ex to 
+           e:\kurssit\ohj2\comtest\comtest
+      5) Run test or debug by selecting the plugin project name by 
+         right mouse button and then run or debug as Eclipse Application
+      6) To create a new plugin .jar open the file plugin.xml in Eclipse
+         and go Overview-tab and hit link "Export Wizard".
+      7) Please choose directory so that it is your comtestplug
+         dircetory.
+      8) After creating the new plugin, copy the plugin to your Eclipse
+         plugins directory and restart Eclipse.
+      9) Please commit your changes.  And please comment to source code
+         what you have done.              
+ -->
+     
+
+   <extension point="org.eclipse.ui.commands">
+      <category
+            name="ComTest"
+            description="ComTest actions"
+            id="comtestplug.category.comtest" />
+        <command
+            name="ComTest run"
+            description="Run comtest plugin"
+            categoryId="comtestplug.category.comtest"
+            id="comtestplug.generateAndRun.run" />
+   </extension>
+
+   <extension point = "org.eclipse.ui.actionSets">
+	   <actionSet id="comtestplug.actionSet" label="ComTest Actions" visible="true">
+	   
+<!--	   <menu id="comtest.RunMenu"
+             label="ComTest Menu"
+             path="additions">
+         <separator name="group1" />
+         <separator name="option1" />
+       </menu>
+-->	   
+         <action
+               class="comtestplug.popup.actions.GenerateTestAndRunJUnit"
+               id="comtestplug.generateAndRun.action"
+               label="Generate, Run JUnit, Action"
+               tooltip="Generate test and then run test"
+               definitionId="comtestplug.generateAndRun.run" 
+               >
+         </action>
+	   </actionSet>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            adaptable="true"
+            id="comtestplug.contribution1"
+            nameFilter="*.java"
+            objectClass="org.eclipse.core.resources.IFile">
+         <menu
+               label="ComTest"
+               path="additions"
+               id="comtestplug.menu">
+            <separator
+                  name="group">
+            </separator>
+         </menu>
+         <action
+               label="Generate tests"
+               class="comtestplug.popup.actions.GenerateTest"
+               menubarPath="comtestplug.menu/group"
+               id="comtestplug.newAction"
+         >
+         </action>
+         <action
+               class="comtestplug.popup.actions.GenerateTestAndRunJUnit"
+               id="comtestplug.generateAndRun"
+               label="Generate, Run JUnit"
+               tooltip="Generate test and then run test"
+               menubarPath="comtestplug.menu/group"
+               definitionId="comtestplug.generateAndRun.run" 
+         >
+               <!-- enablesFor="1"  OK for many but run just the firts -->
+         </action>
+      </objectContribution>
+   </extension>
+   <extension point="org.eclipse.ui.bindings">
+<!--   
+  for some reason (object not created) can not reference to comtestplug.generateAndRun.run...
+     <key sequence="Ctrl+3" commandId="comtestplug.generateAndRun.action.run" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" contextId="org.eclipse.ui.contexts.window" />
+     <key sequence="Ctrl+4" commandId="comtestplug.generateAndRun.run" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
+-->     
+   </extension>
+   
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            name="ComTest Preferences"
+            class="comtestplug.preferences.ComTestPreferencePage"
+            id="comtestplug.preferences.ComTestPreferencePage">
+      </page>
+   </extension>
+   <extension
+         point="org.eclipse.core.runtime.preferences">
+      <initializer
+            class="comtestplug.preferences.PreferenceInitializer">
+      </initializer>
+   </extension>
+   <extension
+         point="org.eclipse.ui.propertyPages">
+      <page
+            objectClass="org.eclipse.core.resources.IFile"
+            name="ComTest Page"
+            nameFilter="*.*"
+            class="comtestplug.properties.ComTestPropertyPage"
+            id="comtestplug.properties.samplePropertyPage">
+      </page>
+   </extension>
+   <extension
+         id="id1"
+         point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
+   	<javaCompletionProposalComputer
+          activate="true"
+          categoryId="org.eclipse.ui.texteditor.textual_proposals"
+          class="comtestplug.ui.text.java.ComtestProposalComputer">
+			<partition type="__java_javadoc"/>   
+	</javaCompletionProposalComputer>
+   </extension>
+
+</plugin>
diff --git a/plugin13.xml b/plugin13.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1baa344dbef5ec3832edaaeabcac6960279244ee
--- /dev/null
+++ b/plugin13.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project default="plugin_export" name="build">
+	<target name="plugin_export">
+		<pde.exportPlugins destination="e:\temp" exportSource="false" exportType="zip" filename="comtest13.jar.zip" plugins="comtestplug" useJARFormat="true"/>
+	</target>
+</project>
diff --git a/plugin9.xml b/plugin9.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c231e36ff7b35c9ace04ec4f66c710fb7e8c8725
--- /dev/null
+++ b/plugin9.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project default="plugin_export" name="build">
+    <target name="plugin_export">
+		<pde.exportPlugins destination="E:\kurssit\ohj2\comtestplugin" exportSource="false" exportType="directory" plugins="comtestplug" useJARFormat="true"/>
+	</target>
+	<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="E:/c/Java_ME_platform_SDK_3.0/toolbar/mobility8/modules/ext/ant-contrib-1.0b3.jar"/>
+	<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="E:/c/Java_ME_platform_SDK_3.0/toolbar/mobility8/modules/ext/ant-contrib-1.0b3.jar"/>
+</project>
diff --git a/plugins/plugins/comtestplug_1.0.20/.classpath b/plugins/plugins/comtestplug_1.0.20/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..a83f947c5efa7d0e7c76719a77eb9bf2f3aa9e20
--- /dev/null
+++ b/plugins/plugins/comtestplug_1.0.20/.classpath
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry exported="true" kind="lib" path="bin" sourcepath="bin"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
+		<attributes>
+			<attribute name="module" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/plugins/comtestplug_1.0.20/META-INF/MANIFEST.MF b/plugins/plugins/comtestplug_1.0.20/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..7b87f27c894ebf9f222d347ec0bbf50edb25b2e7
--- /dev/null
+++ b/plugins/plugins/comtestplug_1.0.20/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: comtestplug; singleton:=true
+Bundle-Version: 1.0.20
+Bundle-Activator: comtestplug.Activator
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.junit,
+ org.eclipse.debug.ui,
+ org.eclipse.jdt.ui,
+ org.eclipse.jface.text
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: bin/
diff --git a/plugins/plugins/comtestplug_1.0.20/build.properties b/plugins/plugins/comtestplug_1.0.20/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c6e7f705957fe4d17978b676e075518b3a2900a0
--- /dev/null
+++ b/plugins/plugins/comtestplug_1.0.20/build.properties
@@ -0,0 +1,14 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .classpath,\
+               build.properties,\
+               .settings/,\
+               bin/,\
+               plugin.xml,\
+               plugin.properties
+jars.compile.order = .
+bin.excludes = bin/comtest/Mock.class,\
+               bin/comtest/ComTestTest.class,\
+               bin/comtest/StringUtilitiesTest.class,\
+               bin/comtest/StringsTest.class
+src.includes = src/
diff --git a/plugins/plugins/comtestplug_1.0.20/plugin.properties b/plugins/plugins/comtestplug_1.0.20/plugin.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c3b98733ad86ab4844676b2adcd34489985f6533
--- /dev/null
+++ b/plugins/plugins/comtestplug_1.0.20/plugin.properties
@@ -0,0 +1,2 @@
+#Properties file for comtestplug
+Bundle-Name = Comtestplug Plug-in
\ No newline at end of file
diff --git a/plugins/plugins/comtestplug_1.0.20/plugin.xml b/plugins/plugins/comtestplug_1.0.20/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e88a78273029e5093a9531eb464a54a81d8151dc
--- /dev/null
+++ b/plugins/plugins/comtestplug_1.0.20/plugin.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+<!-- Plugin for ComTest. Category, actionSets and actions
+     The default keyshotcuts does not work???
+     Creates many instances of actions plugin, one
+     for PopUps and one for Windows.  See Java comments from
+     GenerateTest.java.
+
+     The shortcut is possible to change manually from:
+       Window/Preferences/General/Keys/Modify/
+       Category: ComTest.
+     If you choose shortcut that is allready in use, remove
+     the old one.  The shortcut works only for last item run
+     from PopUpMenu.  Can somebody fix that?
+
+     It could be nice to have also toolbar icon?
+
+     Vesa Lappalainen 2.12.2007
+
+     To develop this plugin,
+      1) first pick ComTest project from:
+          https://svn.cc.jyu.fi/srv/svn/comtest/proto/vesal/trunk (to directory comtest)
+      2) then pick comtestplugin project from
+          https://svn.cc.jyu.fi/srv/svn/comtest/proto/ji/trunk  (to directory comtestplugin)
+      3) then try to change the Eclipse project variabale
+          comtestfolder
+         needed.  I have that variable in WorkSpace configuration:
+          .metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.core.resources.prefs:
+             pathvariable.comtestfolder=E\:/kurssit/ohj2/comtest/comtest
+
+         Create Java project comtest from directory ComTest
+         Create Plugin project comtestplugin from directory comtestplugin
+      4) Now ComTest should be a linked directory under comtestplug/src path.
+         This is done by .project file like:
+         	<linkedResources>
+       		<link>
+		  	  <name>src/comtest</name>
+			  <type>2</type>
+			  <locationURI>comtestfolder</locationURI>
+		    </link>
+	        </linkedResources>
+	     Then variable comtestfolder is defined in:
+	       Window/Preferences/General/Workspace/Linked Resources
+           and then add comtestfolder f.ex to 
+           e:\kurssit\ohj2\comtest\comtest
+      5) Run test or debug by selecting the plugin project name by 
+         right mouse button and then run or debug as Eclipse Application
+      6) To create a new plugin .jar open the file plugin.xml in Eclipse
+         and go Overview-tab and hit link "Export Wizard".
+      7) Please choose directory so that it is your comtestplug
+         dircetory.
+      8) After creating the new plugin, copy the plugin to your Eclipse
+         plugins directory and restart Eclipse.
+      9) Please commit your changes.  And please comment to source code
+         what you have done.              
+ -->
+     
+
+   <extension point="org.eclipse.ui.commands">
+      <category
+            name="ComTest"
+            description="ComTest actions"
+            id="comtestplug.category.comtest" />
+        <command
+            name="ComTest run"
+            description="Run comtest plugin"
+            categoryId="comtestplug.category.comtest"
+            id="comtestplug.generateAndRun.run" />
+   </extension>
+
+   <extension point = "org.eclipse.ui.actionSets">
+	   <actionSet id="comtestplug.actionSet" label="ComTest Actions" visible="true">
+	   
+<!--	   <menu id="comtest.RunMenu"
+             label="ComTest Menu"
+             path="additions">
+         <separator name="group1" />
+         <separator name="option1" />
+       </menu>
+-->	   
+         <action
+               class="comtestplug.popup.actions.GenerateTestAndRunJUnit"
+               id="comtestplug.generateAndRun.action"
+               label="Generate, Run JUnit, Action"
+               tooltip="Generate test and then run test"
+               definitionId="comtestplug.generateAndRun.run" 
+               >
+         </action>
+	   </actionSet>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            adaptable="true"
+            id="comtestplug.contribution1"
+            nameFilter="*.java"
+            objectClass="org.eclipse.core.resources.IFile">
+         <menu
+               label="ComTest"
+               path="additions"
+               id="comtestplug.menu">
+            <separator
+                  name="group">
+            </separator>
+         </menu>
+         <action
+               label="Generate tests"
+               class="comtestplug.popup.actions.GenerateTest"
+               menubarPath="comtestplug.menu/group"
+               id="comtestplug.newAction"
+         >
+         </action>
+         <action
+               class="comtestplug.popup.actions.GenerateTestAndRunJUnit"
+               id="comtestplug.generateAndRun"
+               label="Generate, Run JUnit"
+               tooltip="Generate test and then run test"
+               menubarPath="comtestplug.menu/group"
+               definitionId="comtestplug.generateAndRun.run" 
+         >
+               <!-- enablesFor="1"  OK for many but run just the firts -->
+         </action>
+      </objectContribution>
+   </extension>
+   <extension point="org.eclipse.ui.bindings">
+<!--   
+  for some reason (object not created) can not reference to comtestplug.generateAndRun.run...
+     <key sequence="Ctrl+3" commandId="comtestplug.generateAndRun.action.run" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" contextId="org.eclipse.ui.contexts.window" />
+     <key sequence="Ctrl+4" commandId="comtestplug.generateAndRun.run" schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
+-->     
+   </extension>
+   
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            name="ComTest Preferences"
+            class="comtestplug.preferences.ComTestPreferencePage"
+            id="comtestplug.preferences.ComTestPreferencePage">
+      </page>
+   </extension>
+   <extension
+         point="org.eclipse.core.runtime.preferences">
+      <initializer
+            class="comtestplug.preferences.PreferenceInitializer">
+      </initializer>
+   </extension>
+   <extension
+         point="org.eclipse.ui.propertyPages">
+      <page
+            objectClass="org.eclipse.core.resources.IFile"
+            name="ComTest Page"
+            nameFilter="*.*"
+            class="comtestplug.properties.ComTestPropertyPage"
+            id="comtestplug.properties.samplePropertyPage">
+      </page>
+   </extension>
+   <extension
+         id="id1"
+         point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
+   	<javaCompletionProposalComputer
+          activate="true"
+          categoryId="org.eclipse.ui.texteditor.textual_proposals"
+          class="comtestplug.ui.text.java.ComtestProposalComputer">
+			<partition type="__java_javadoc"/>   
+	</javaCompletionProposalComputer>
+   </extension>
+
+</plugin>
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252227/META-INF/MANIFEST.MF b/plugins/plugins/ctplugin_1.0.0.201912252227/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..fde98be663b9ef0886eba027e48db8e5d81e0e6f
--- /dev/null
+++ b/plugins/plugins/ctplugin_1.0.0.201912252227/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Ctplugin
+Bundle-SymbolicName: ctplugin;singleton:=true
+Bundle-Version: 1.0.0.201912252227
+Require-Bundle: org.eclipse.ui
+Automatic-Module-Name: ctplugin
+Bundle-RequiredExecutionEnvironment: JavaSE-13
+
+
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252227/icons/sample.png b/plugins/plugins/ctplugin_1.0.0.201912252227/icons/sample.png
new file mode 100644
index 0000000000000000000000000000000000000000..02c4b79e10986d56bda97051eb0da2e9119c97f5
Binary files /dev/null and b/plugins/plugins/ctplugin_1.0.0.201912252227/icons/sample.png differ
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252227/icons/sample@2x.png b/plugins/plugins/ctplugin_1.0.0.201912252227/icons/sample@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1224d1fce3debb7eb66e63ac948fcd6d33d2999
Binary files /dev/null and b/plugins/plugins/ctplugin_1.0.0.201912252227/icons/sample@2x.png differ
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252227/plugin.xml b/plugins/plugins/ctplugin_1.0.0.201912252227/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de5dac2282f3d11e3eb763db58776f430a16c055
--- /dev/null
+++ b/plugins/plugins/ctplugin_1.0.0.201912252227/plugin.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+   <extension
+         point="org.eclipse.ui.commands">
+      <category
+            id="ctplugin.commands.category"
+            name="Sample Category">
+      </category>
+      <command
+            categoryId="ctplugin.commands.category"
+            name="Sample Command"
+            id="ctplugin.commands.sampleCommand">
+      </command>
+   </extension>
+   <extension
+         point="org.eclipse.ui.handlers">
+      <handler
+            class="ctplugin.handlers.ComTestHandler"
+            commandId="ctplugin.commands.sampleCommand">
+      </handler>
+   </extension>
+   <extension
+         point="org.eclipse.ui.bindings">
+      <key
+            commandId="ctplugin.commands.sampleCommand"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            contextId="org.eclipse.ui.contexts.window"
+            sequence="M1+6">
+      </key>
+   </extension>
+   <extension
+         point="org.eclipse.ui.menus">
+      <menuContribution
+            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
+         <menu
+               id="ctplugin.menus.sampleMenu"
+               label="Sample Menu"
+               mnemonic="M">
+            <command
+                  commandId="ctplugin.commands.sampleCommand"
+                  id="ctplugin.menus.sampleCommand"
+                  mnemonic="S">
+            </command>
+         </menu>
+      </menuContribution>
+      <menuContribution
+            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
+         <toolbar
+               id="ctplugin.toolbars.sampleToolbar">
+            <command
+                  id="ctplugin.toolbars.sampleCommand"
+                  commandId="ctplugin.commands.sampleCommand"
+                  icon="icons/sample.png"
+                  tooltip="Say hello world">
+            </command>
+         </toolbar>
+      </menuContribution>
+   </extension>
+
+</plugin>
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252239/META-INF/MANIFEST.MF b/plugins/plugins/ctplugin_1.0.0.201912252239/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000000000000000000000000000000000..9b98f2179a3f1cdf262f39e42b76a4757b618055
--- /dev/null
+++ b/plugins/plugins/ctplugin_1.0.0.201912252239/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Ctplugin
+Bundle-SymbolicName: ctplugin;singleton:=true
+Bundle-Version: 1.0.0.201912252239
+Require-Bundle: org.eclipse.ui
+Automatic-Module-Name: ctplugin
+Bundle-RequiredExecutionEnvironment: JavaSE-13
+
+
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252239/icons/sample.png b/plugins/plugins/ctplugin_1.0.0.201912252239/icons/sample.png
new file mode 100644
index 0000000000000000000000000000000000000000..02c4b79e10986d56bda97051eb0da2e9119c97f5
Binary files /dev/null and b/plugins/plugins/ctplugin_1.0.0.201912252239/icons/sample.png differ
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252239/icons/sample@2x.png b/plugins/plugins/ctplugin_1.0.0.201912252239/icons/sample@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1224d1fce3debb7eb66e63ac948fcd6d33d2999
Binary files /dev/null and b/plugins/plugins/ctplugin_1.0.0.201912252239/icons/sample@2x.png differ
diff --git a/plugins/plugins/ctplugin_1.0.0.201912252239/plugin.xml b/plugins/plugins/ctplugin_1.0.0.201912252239/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de5dac2282f3d11e3eb763db58776f430a16c055
--- /dev/null
+++ b/plugins/plugins/ctplugin_1.0.0.201912252239/plugin.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+   <extension
+         point="org.eclipse.ui.commands">
+      <category
+            id="ctplugin.commands.category"
+            name="Sample Category">
+      </category>
+      <command
+            categoryId="ctplugin.commands.category"
+            name="Sample Command"
+            id="ctplugin.commands.sampleCommand">
+      </command>
+   </extension>
+   <extension
+         point="org.eclipse.ui.handlers">
+      <handler
+            class="ctplugin.handlers.ComTestHandler"
+            commandId="ctplugin.commands.sampleCommand">
+      </handler>
+   </extension>
+   <extension
+         point="org.eclipse.ui.bindings">
+      <key
+            commandId="ctplugin.commands.sampleCommand"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            contextId="org.eclipse.ui.contexts.window"
+            sequence="M1+6">
+      </key>
+   </extension>
+   <extension
+         point="org.eclipse.ui.menus">
+      <menuContribution
+            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
+         <menu
+               id="ctplugin.menus.sampleMenu"
+               label="Sample Menu"
+               mnemonic="M">
+            <command
+                  commandId="ctplugin.commands.sampleCommand"
+                  id="ctplugin.menus.sampleCommand"
+                  mnemonic="S">
+            </command>
+         </menu>
+      </menuContribution>
+      <menuContribution
+            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
+         <toolbar
+               id="ctplugin.toolbars.sampleToolbar">
+            <command
+                  id="ctplugin.toolbars.sampleCommand"
+                  commandId="ctplugin.commands.sampleCommand"
+                  icon="icons/sample.png"
+                  tooltip="Say hello world">
+            </command>
+         </toolbar>
+      </menuContribution>
+   </extension>
+
+</plugin>
diff --git a/src/comtestplug/Activator.java b/src/comtestplug/Activator.java
new file mode 100644
index 0000000000000000000000000000000000000000..318ef4e260dc960cbbf88ee43fb223237473f0b4
--- /dev/null
+++ b/src/comtestplug/Activator.java
@@ -0,0 +1,63 @@
+package comtestplug;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+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 {
+
+	/**
+     * Plugin name 
+	 */
+	public static final String PLUGIN_ID = "comtestplug";
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+		plugin = this;
+	}
+
+	/**
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+    public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+    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;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+}
diff --git a/src/comtestplug/popup/actions/GenerateTest.java b/src/comtestplug/popup/actions/GenerateTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..47cb6c98f9cfc03820e32f19b4b60a84ce151393
--- /dev/null
+++ b/src/comtestplug/popup/actions/GenerateTest.java
@@ -0,0 +1,351 @@
+package comtestplug.popup.actions;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.action.Action;
+//import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.jface.dialogs.MessageDialog;
+
+import comtest.ComTest;
+
+/**
+ * <p>Test generator action for ComTest to by used from Eclipse.</p>
+ * 
+ * <p>I needed to implement also IWorkbenchWindowActionDelegate
+ * and extend Action to get key shortcuts to work.
+ * Now the problem is thata there is two plugin instances.
+ * One for PopUp menus that changes the selection.
+ * And one for "windows" that does not carry out the file name.
+ * So the filename from PopUp is saved to
+ * <pre>
+ *   private static Collection<IFile> staticfiles = new ArrayList<IFile>();
+ * </pre>  
+ * static array so it can be found from the other instance.
+ * Actually this works quite nice.  There is allways the last from
+ * PopUp runned file name that can be runned anywhere in Eclipse by key shortcut.</p> 
+ * 
+ * @author vesal, panu, ji
+ *
+ */
+public class GenerateTest extends Action implements IObjectActionDelegate,IWorkbenchWindowActionDelegate {
+  private Collection<IFile> files;
+  private IWorkbenchWindow window = null;
+
+  /**
+   * Constructor for Action1.
+   */
+  public GenerateTest() {
+    super();
+    files = new ArrayList<IFile>();
+  }
+
+  /**
+   * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+   */
+  @Override
+  public void setActivePart(IAction action, IWorkbenchPart targetPart) {}
+
+  /**
+   * Method to start plugin
+   */
+  @Override
+  public void run() {
+      run((IAction)null);
+  }
+  
+  /**
+   * @see IActionDelegate#run(IAction)
+   */
+  @Override
+  public void run(IAction action) {
+      
+    if ( window != null ) {
+        selectionChanged(action, window.getSelectionService().getSelection());
+    }
+      
+    final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+
+    try{
+      
+      // Run ComTest in its own task.
+      final ComtestRun cr = new ComtestRun(files);
+      if ( !cr.checkFiles(window) ) return;
+      workspace.run(cr,workspace.getRoot(), 0, null);
+
+      // Build are affected projects.
+      // But because jdt.core could not be loaded
+      // we wait the completion before doing anything.
+      for (final IProject project : cr.getAffectedProjects()){
+          buildDone(cr.getOutFiles());
+          /*  // for some reason in Eclipse 19.12 the OnceDonner.done is not fired??? 
+        project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new OnceDonner(){
+
+          @Override
+          protected void doTheDone() throws CoreException {
+            // Stubid HACK. Building projects prompts
+            // file savings so run ComTest AGAIN to use saved files.
+            workspace.run(cr,workspace.getRoot(), 0, new OnceDonner(){
+              @Override
+              protected void doTheDone() throws CoreException {
+                // And because of new code generated we need to build once more.
+                project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new OnceDonner(){
+                  @Override
+                  protected void doTheDone() throws CoreException {
+                    // Call build done method for after build parties.
+                    buildDone(cr.getOutFiles());
+                  }              
+                });
+              }
+            });
+          }
+        });
+        */
+      }
+
+
+
+    } catch (CoreException e){
+      e.printStackTrace(); 
+    }
+  }
+
+  /**
+   * @see IActionDelegate#selectionChanged(IAction, ISelection)
+   */
+  @Override
+  public void selectionChanged(IAction action, ISelection selection) {
+    try {
+      if ( !( selection instanceof IStructuredSelection ) ) return;  
+      IStructuredSelection sel = (IStructuredSelection) selection;
+      doSelection(sel);
+    } catch (ClassCastException cce) {
+      doSelection(selection);
+    }
+  }
+
+  private void doSelection(IStructuredSelection selection) {
+    boolean first = true;  
+    try {
+      for (Iterator<IFile> items = selection.iterator(); items.hasNext();) {
+        IFile file = items.next();
+        if ( first) files.clear(); first = false;
+        files.add(file);
+      }
+    } catch (ClassCastException e) {
+      // System.err.println("Items:" + selection.toString());
+      // e.printStackTrace();
+    }
+  }
+
+  /**
+   * Method exists for overriding purposes.
+   * With this generated files can be further processed.
+   * For example run with JUnit.
+   * This implementation does nothing.
+   * @param testFiles
+   */
+  protected void buildDone(Collection<IFile> testFiles) {}
+
+  @SuppressWarnings("static-method")
+  private void doSelection(ISelection sel) {
+     System.err.println("something different" + sel.toString());
+  }
+
+
+
+  static class ComtestRun implements IWorkspaceRunnable{
+    private static Collection<IFile> staticfiles = new ArrayList<IFile>();
+    Collection<IFile> myInFiles = new Vector<IFile>();
+    Set<IProject> myAffectedProjects =new HashSet<IProject>();
+    Set<IFile> myOutFiles = new HashSet<IFile>();
+    
+    /**
+     * Run to plugin using files
+     * @param files to make tests
+     */
+    public ComtestRun(Collection<IFile> files){
+      if ( files.size() > 0 ) {
+        this.myInFiles.addAll(files);
+      }  
+      if ( myInFiles.size() == 0 ) this.myInFiles.addAll(staticfiles);
+ 
+    }
+    
+    /**
+     * Check if there is no saved files.  When run as action,
+     * we must use the saved files.
+     * @param window where to show warning
+     * @return how it succeeds
+     */
+    public boolean checkFiles(IWorkbenchWindow window) {
+        if ( myInFiles.size() > 0 ) return true;
+        if ( window == null ) return true;
+        MessageDialog.openInformation(
+                    window.getShell(),
+                    "ComTest warning",
+                    "Run first one time from PopUp menu");
+        return false;
+    }
+    
+    /**
+     * Run the plugin
+     * @param monitor 
+     * @throws CoreException
+     */
+    @Override
+    @SuppressWarnings("static-access")
+    public void run(IProgressMonitor monitor) throws CoreException {
+      boolean goodfiles = false;  
+      for(IFile file : myInFiles){
+        final IProject project = file.getProject();
+        final IPath  inPath = file.getLocation();
+        final String inname = inPath.toString();
+        String lowername = inname.toLowerCase(); 
+        if ( lowername.endsWith("test.java") && ! lowername.endsWith("comtest.java") ) {
+            if ( myInFiles.size() <= 1)
+              MessageDialog.openInformation(
+                    null,
+                    "ComTest warning",
+                    "Do not run for names ending with test.java: \n" + inname);
+           continue; // do not run for test-ending names   
+        }
+
+        /*IJavaElement je = (IJavaElement) file.getAdapter(IJavaElement.class);
+        if (je instanceof ICompilationUnit){
+          ICompilationUnit cu = (ICompilationUnit) je;
+
+
+          if (cu.isWorkingCopy()){
+            cu.commitWorkingCopy(false, null);
+          } else {
+            cu.save(null, false);
+          }*/
+          
+          String outname = ComTest.processFile(inname);
+          if (outname != null) {
+            IPath projectLocation = project.getLocation();
+            IPath outPath = new Path(outname);
+            int count = outPath.matchingFirstSegments(projectLocation);
+            if (count == projectLocation.segmentCount()){
+              // Result is under project.
+              IFile outFile = project.getFile(outPath.removeFirstSegments(count));
+              myAffectedProjects.add(outFile.getProject());
+              outFile.getParent().refreshLocal(IResource.DEPTH_INFINITE, null);
+              myOutFiles.add(outFile);
+              goodfiles = true;
+            }          
+          } else{
+            //TODO Error logging and stuff. 
+            System.err.println("ERROR> " + inname);
+          }
+        //}        
+      }
+      if ( goodfiles ) {
+        staticfiles.clear();
+        this.staticfiles.addAll(myInFiles); // save found files
+      }  
+
+    }  
+    
+    /**
+     * Return projects that was affected
+     * @return affected projects
+     */
+    public Collection<IProject> getAffectedProjects(){
+      return myAffectedProjects;
+    }
+
+    /**
+     * Get files that was output
+     * @return files that was output
+     */
+    public Collection<IFile> getOutFiles(){
+      return myOutFiles;
+    }
+  }
+
+  static abstract class OnceDonner extends NullProgressMonitor {
+    
+    /** 
+     * Method that must be implemented 
+     * @throws CoreException when error 
+     * 
+     */  
+    protected abstract  void doTheDone() throws CoreException;
+
+    boolean alreadyDone =false;
+    
+    /**
+     * Method to call when done
+     */
+    @Override
+    public final void done() {
+      if (alreadyDone){return;}
+      alreadyDone = true;
+      try{
+        doTheDone();
+      } catch(CoreException e){
+        e.printStackTrace();
+      }
+    }
+
+    /**
+     * Return if it is done
+     * @return if it is done
+     */
+    public boolean isDone(){
+      return alreadyDone;
+    }
+    
+    
+    @Override
+    public void worked(int work) {
+       // System.err.println("Work: " + work);
+    }
+    
+    
+  }
+
+    /**
+     *  Method to clean things 
+     */
+    @Override
+    public void dispose() {
+        window = null;
+    }
+
+    /**
+     * Method to init things
+     * @param window to use as source
+     */
+    @Override
+    public void init(IWorkbenchWindow window) {
+        this.window = window;
+        return;
+
+    }
+}
diff --git a/src/comtestplug/popup/actions/GenerateTestAndRunJUnit.java b/src/comtestplug/popup/actions/GenerateTestAndRunJUnit.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a9dab7689915c7ade2ec37969c24e5bde38a0ea
--- /dev/null
+++ b/src/comtestplug/popup/actions/GenerateTestAndRunJUnit.java
@@ -0,0 +1,60 @@
+package comtestplug.popup.actions;
+
+import java.util.Collection;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.debug.ui.ILaunchShortcut;
+
+// Tämä import toimii 3.3:ssa
+import org.eclipse.jdt.junit.launcher.JUnitLaunchShortcut;
+
+// Tämä import toimii 3.2:ssa, huomaa "varoitus"
+// import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchShortcut;
+
+import org.eclipse.jface.viewers.StructuredSelection;
+// import org.eclipse.ui.IObjectActionDelegate;
+
+/**
+ * Class for running ComTest
+ * @author vesal
+ *
+ */
+public class GenerateTestAndRunJUnit extends GenerateTest{ // implements IObjectActionDelegate{
+   
+    /**
+     * Eclipse version that plugin works
+     */
+    public static final String ECVERSION = " for Eclipse 3.4+";
+    
+  /**
+   * Initializer for run
+   *
+   */  
+  public GenerateTestAndRunJUnit() {
+     super();
+     setActionDefinitionId("comtestplug.generateAndRun.run"); 
+  }
+    
+    
+  /**
+   * Runs JUnit test if only one file was generated.
+   * 
+   */
+  @Override
+  protected void buildDone(Collection<IFile> testFiles) {
+    if (testFiles.size() > 0){
+      // JUnit can (Currently) be run only for one file at the same time.
+      
+      // Run JUnit just the first file
+      IFile[] outFileArray = new IFile[1];
+      for ( IFile f : testFiles) {
+        outFileArray[0] = f;
+        break;
+      }  
+      ILaunchShortcut sk = new JUnitLaunchShortcut();
+      //sk.launch(new StructuredSelection(outFileArray), "run");     
+      sk.launch(new StructuredSelection(outFileArray), "debug");     
+    }
+  }
+
+}
diff --git a/src/comtestplug/preferences/ComTestPreferencePage.java b/src/comtestplug/preferences/ComTestPreferencePage.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b130b59abbc1dc8494739c89fd72472da00eeb0
--- /dev/null
+++ b/src/comtestplug/preferences/ComTestPreferencePage.java
@@ -0,0 +1,75 @@
+package comtestplug.preferences;
+
+import org.eclipse.jface.preference.*;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.IWorkbench;
+import comtestplug.Activator;
+import static comtestplug.popup.actions.GenerateTestAndRunJUnit.*;
+
+/**
+ * This class represents a preference page that
+ * is contributed to the Preferences dialog. By 
+ * subclassing <samp>FieldEditorPreferencePage</samp>, we
+ * can use the field support built into JFace that allows
+ * us to create a page that is small and knows how to 
+ * save, restore and apply itself.
+ * <p>
+ * This page is used to modify preferences only. They
+ * are stored in the preference store that belongs to
+ * the main plug-in class. That way, preferences can
+ * be accessed directly via the preference store.
+ */
+
+public class ComTestPreferencePage
+	extends FieldEditorPreferencePage
+	implements IWorkbenchPreferencePage {
+
+    /**
+     * Version number for plugin
+     */
+    public static final String VERSION="14.03.2010" + ECVERSION;     
+
+    /**
+     * Initializer for preferences page
+     */
+	public ComTestPreferencePage() {
+		super(GRID);
+		setPreferenceStore(Activator.getDefault().getPreferenceStore());
+		setDescription("ComTest " + VERSION + " - just example preference page, does not do anything yet");
+	}
+	
+	/**
+	 * Creates the field editors. Field editors are abstractions of
+	 * the common GUI blocks needed to manipulate various types
+	 * of preferences. Each field editor knows how to save and
+	 * restore itself.
+	 */
+	@Override
+    public void createFieldEditors() {
+		addField(new DirectoryFieldEditor(PreferenceConstants.P_PATH, 
+				"&Directory preference:", getFieldEditorParent()));
+		addField(
+			new BooleanFieldEditor(
+				PreferenceConstants.P_BOOLEAN,
+				"&An example of a boolean preference",
+				getFieldEditorParent()));
+
+		addField(new RadioGroupFieldEditor(
+				PreferenceConstants.P_CHOICE,
+			"An example of a multiple-choice preference",
+			1,
+			new String[][] { { "&Choice 1", "choice1" }, {
+				"C&hoice 2", "choice2" }
+		}, getFieldEditorParent()));
+		addField(
+			new StringFieldEditor(PreferenceConstants.P_STRING, "A &text preference:", getFieldEditorParent()));
+	}
+
+	/**
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	@Override
+    public void init(IWorkbench workbench) {
+	}
+	
+}
\ No newline at end of file
diff --git a/src/comtestplug/preferences/PreferenceConstants.java b/src/comtestplug/preferences/PreferenceConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..a85c9a4feeea8bcc91f291bd257ba8aeebcace33
--- /dev/null
+++ b/src/comtestplug/preferences/PreferenceConstants.java
@@ -0,0 +1,20 @@
+package comtestplug.preferences;
+
+/**
+ * Constant definitions for plug-in preferences
+ */
+public class PreferenceConstants {
+
+    /** */
+	public static final String P_PATH = "pathPreference";
+
+    /** */
+	public static final String P_BOOLEAN = "booleanPreference";
+
+    /** */
+	public static final String P_CHOICE = "choicePreference";
+
+    /** */
+	public static final String P_STRING = "stringPreference";
+	
+}
diff --git a/src/comtestplug/preferences/PreferenceInitializer.java b/src/comtestplug/preferences/PreferenceInitializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..d666f2461bfdb90a900960aedb2b8dcaf61de89f
--- /dev/null
+++ b/src/comtestplug/preferences/PreferenceInitializer.java
@@ -0,0 +1,27 @@
+package comtestplug.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import comtestplug.Activator;
+
+/**
+ * Class used to initialize default preference values.
+ */
+public class PreferenceInitializer extends AbstractPreferenceInitializer {
+
+	/**
+	 * 
+	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
+	 */
+	@Override
+    public void initializeDefaultPreferences() {
+		IPreferenceStore store = Activator.getDefault()
+				.getPreferenceStore();
+		store.setDefault(PreferenceConstants.P_BOOLEAN, true);
+		store.setDefault(PreferenceConstants.P_CHOICE, "choice2");
+		store.setDefault(PreferenceConstants.P_STRING,
+				"Default value");
+	}
+
+}
diff --git a/src/comtestplug/properties/ComTestPropertyPage.java b/src/comtestplug/properties/ComTestPropertyPage.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f4809082f87c98f7c654f83af3881a5df76f43f
--- /dev/null
+++ b/src/comtestplug/properties/ComTestPropertyPage.java
@@ -0,0 +1,144 @@
+package comtestplug.properties;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.QualifiedName;
+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.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+/**
+ * Class for ComTest properties.  
+ * Nothing done yet
+ * @author vesal
+ *
+ */
+public class ComTestPropertyPage extends PropertyPage {
+
+	private static final String PATH_TITLE = "Path:";
+	private static final String OWNER_TITLE = "&Owner:";
+	private static final String OWNER_PROPERTY = "OWNER";
+	private static final String DEFAULT_OWNER = "John Doe";
+
+	private static final int TEXT_FIELD_WIDTH = 50;
+
+	private Text ownerText;
+
+	/**
+	 * Constructor for SamplePropertyPage.
+	 */
+	public ComTestPropertyPage() {
+		super();
+	}
+
+	private void addFirstSection(Composite parent) {
+		Composite composite = createDefaultComposite(parent);
+
+		//Label for path field
+		Label pathLabel = new Label(composite, SWT.NONE);
+		pathLabel.setText(PATH_TITLE);
+
+		// Path text field
+		Text pathValueText = new Text(composite, SWT.WRAP | SWT.READ_ONLY);
+		pathValueText.setText(((IResource) getElement()).getFullPath().toString());
+	}
+
+	@SuppressWarnings("static-method")
+    private void addSeparator(Composite parent) {
+		Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
+		GridData gridData = new GridData();
+		gridData.horizontalAlignment = GridData.FILL;
+		gridData.grabExcessHorizontalSpace = true;
+		separator.setLayoutData(gridData);
+	}
+
+	private void addSecondSection(Composite parent) {
+		Composite composite = createDefaultComposite(parent);
+
+		// Label for owner field
+		Label ownerLabel = new Label(composite, SWT.NONE);
+		ownerLabel.setText(OWNER_TITLE);
+
+		// Owner text field
+		ownerText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		GridData gd = new GridData();
+		gd.widthHint = convertWidthInCharsToPixels(TEXT_FIELD_WIDTH);
+		ownerText.setLayoutData(gd);
+
+		// Populate owner text field
+		try {
+			String owner =
+				((IResource) getElement()).getPersistentProperty(
+					new QualifiedName("", OWNER_PROPERTY));
+			ownerText.setText((owner != null) ? owner : DEFAULT_OWNER);
+		} catch (CoreException e) {
+			ownerText.setText(DEFAULT_OWNER);
+		}
+	}
+
+	/**
+	 * see PreferencePage#createContents(Composite)
+     * @param parent 
+     * @return new control
+	 */
+	@Override
+    protected Control createContents(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		composite.setLayout(layout);
+		GridData data = new GridData(GridData.FILL);
+		data.grabExcessHorizontalSpace = true;
+		composite.setLayoutData(data);
+
+		addFirstSection(composite);
+		addSeparator(composite);
+		addSecondSection(composite);
+		return composite;
+	}
+
+	@SuppressWarnings("static-method")
+    private Composite createDefaultComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		composite.setLayout(layout);
+
+		GridData data = new GridData();
+		data.verticalAlignment = GridData.FILL;
+		data.horizontalAlignment = GridData.FILL;
+		composite.setLayoutData(data);
+
+		return composite;
+	}
+
+    /**
+     * Set default properties
+     */
+	@Override
+    protected void performDefaults() {
+		// Populate the owner text field with the default value
+		ownerText.setText(DEFAULT_OWNER);
+	}
+	
+    /**
+     * @return if ok
+     */
+	@Override
+    public boolean performOk() {
+		// store the value in the owner text field
+		try {
+			((IResource) getElement()).setPersistentProperty(
+				new QualifiedName("", OWNER_PROPERTY),
+				ownerText.getText());
+		} catch (CoreException e) {
+			return false;
+		}
+		return true;
+	}
+
+}
\ No newline at end of file
diff --git a/src/comtestplug/ui/text/java/ComtestProposalComputer.java b/src/comtestplug/ui/text/java/ComtestProposalComputer.java
new file mode 100644
index 0000000000000000000000000000000000000000..0dcd48927cc23e9166ff4225f6836613e0412af2
--- /dev/null
+++ b/src/comtestplug/ui/text/java/ComtestProposalComputer.java
@@ -0,0 +1,104 @@
+package comtestplug.ui.text.java;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+
+import comtest.StringUtilities;
+
+/**
+ * Class for plugin text to fill
+ * @author panu
+ *
+ */
+public class ComtestProposalComputer implements IJavaCompletionProposalComputer {
+  final static String[] proposals = {"#STATICIMPORT","#NOIMPORT","#DIRECTORY=","#PACKAGE=",
+    "#DYNAMICIMPORT","#CLASSIMPORT","#PACKAGEIMPORT",  
+    "#COLUMNSEPARATOR","#COLUMNCHAR","#THROWS","#import"};
+  List<String> baseProposals = Arrays.asList(proposals);
+
+  /**
+   * @param context
+   * @param monitor
+   * @return list of proposals
+   */
+  @Override
+public List<ICompletionProposal> computeCompletionProposals(
+      ContentAssistInvocationContext context, IProgressMonitor monitor) {
+    List<ICompletionProposal> ret = new Vector<ICompletionProposal>();
+    try {      
+      int offs = context.getInvocationOffset();
+      String buffer = context.getDocument().get(0, offs);
+      for(String proposal : proposals){
+        int index = StringUtilities.countEndIndex(buffer, proposal);
+        if (index == 0) continue;
+        String replace = proposal.substring(index);
+        ICompletionProposal ci = new CompletionProposal(
+            replace, offs, 0, replace.length(),
+            null,proposal,null,null); 
+        ret.add(ci);
+      }
+      int index = StringUtilities.countEndIndex(buffer, "comtest");
+      if (index == 0) return ret;
+      String indent = StringUtilities.getLineIndent(buffer,offs);
+      String comtestBlock = "@example\n"+indent+"* <pre name=\"test\">\n"+indent+"* \n"+indent+"* </pre>";
+      int p = comtestBlock.indexOf("* \n");
+      
+      ICompletionProposal ci = new CompletionProposal(
+        comtestBlock,
+        offs-index, index, p+2,
+        null,"ComTest example",null,null); 
+       ret.add(ci);
+    } catch (BadLocationException e) {
+      e.printStackTrace();
+    }
+    
+    
+    return ret;
+  }
+
+  /**
+   * @param context
+   * @param monitor
+   * @return list of proposals
+   */
+  @Override
+  public List<IContextInformation> computeContextInformation(
+      ContentAssistInvocationContext context, IProgressMonitor monitor) {
+    // TODO Auto-generated method stub
+    return new ArrayList<IContextInformation>();
+  }
+
+  /**
+   * @return error message from class
+   */ 
+  @Override
+  public String getErrorMessage() {
+    return "Error from ComTest";
+  }
+
+  /**
+   * 
+   */
+  @Override
+  public void sessionEnded() {
+  }
+
+  /**
+   * 
+   */
+  @Override
+  public void sessionStarted() {
+  }
+
+}