diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/move/MoveInstanceMethodTests.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/move/MoveInstanceMethodTests.java
index 70b6842..a336af2 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/move/MoveInstanceMethodTests.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests.refactoring/src/org/eclipse/objectteams/otdt/ui/tests/refactoring/move/MoveInstanceMethodTests.java
@@ -95,6 +95,21 @@
                 endColumn, newReceiverType, newReceiverName, null,
                 inlineDelegator, removeDelegator, expectWarning);
     }
+
+    private void performAndCheckSelectedCU_passing_std_info(
+            String[] cuQNames, String selectionCuQName,
+            int startLine, int startColumn, int endLine, int endColumn,
+            int newReceiverType, String newReceiverName,
+            boolean inlineDelegator, boolean removeDelegator, boolean expectWarning)
+    	throws Exception
+    {
+        int selectionCuIndex = firstIndexOf(selectionCuQName, cuQNames);
+        Assert.isTrue(selectionCuIndex != -1,
+                       "parameter selectionCuQName must match some String in cuQNames.");
+        performRefactoring_passing_expecting_specific_warning(cuQNames, selectionCuIndex, startLine, startColumn, endLine,
+                endColumn, newReceiverType, newReceiverName, null,
+                inlineDelegator, removeDelegator, "The 'Move Instance Method' Refactoring is not yet fully OT-aware!");
+    }
 
     private int firstIndexOf(String one, String[] others)
     {
@@ -150,7 +165,12 @@
         }
         preconditionResult.merge(ref.checkFinalConditions(new NullProgressMonitor()));
         if (!expectWarning) {
-	        assertTrue("precondition was supposed to pass", preconditionResult
+        	if (!preconditionResult.isOK()) {
+        		System.out.println(getName()+":"+preconditionResult);
+        		System.out.println("Error:"+preconditionResult.getMessageMatchingSeverity(RefactoringStatus.ERROR));
+        		System.out.println("Warning:"+preconditionResult.getMessageMatchingSeverity(RefactoringStatus.WARNING));
+        	}
+	        assertTrue("precondition was supposed to pass", preconditionResult
 	                .isOK());
 	
 	        assertFalse("no warnings expected", preconditionResult.hasWarning());
@@ -166,6 +186,59 @@
                     getFileContents(outputTestFileName), cus[idx].getSource());
         }
     }
+
+    private void performRefactoring_passing_expecting_specific_warning(
+            String[] cuQNames, int selectionCuIndex,
+            int startLine, int startColumn, int endLine, int endColumn,
+            int newReceiverType, String newReceiverName, String newMethodName,
+            boolean inlineDelegator, boolean removeDelegator, String expectedWarning)
+    	throws Exception
+    {
+        Assert.isTrue(0 <= selectionCuIndex
+                && selectionCuIndex < cuQNames.length);
+
+        toSucceed = true;
+
+        ICompilationUnit[] cus = createCUs(cuQNames);
+        ICompilationUnit selectionCu = cus[selectionCuIndex];
+
+        ISourceRange selection = TextRangeUtil.getSelection(selectionCu,
+                startLine, startColumn, endLine, endColumn);
+        IMethod method = getMethod(selectionCu, selection);
+        assertNotNull(method);
+        MoveInstanceMethodProcessor refProc = new MoveInstanceMethodProcessor(
+		        								method,
+		        								JavaPreferencesSettings.getCodeGenerationSettings(selectionCu.getJavaProject()));
+   		Refactoring ref= new MoveRefactoring(refProc);
+
+		assertNotNull("refactoring should be created", ref);
+		RefactoringStatus preconditionResult= ref
+			.checkInitialConditions(new NullProgressMonitor());
+
+		assertTrue("activation was supposed to be successful",
+			preconditionResult.isOK());
+
+        chooseNewReceiver(refProc, newReceiverType, newReceiverName);
+
+        refProc.setInlineDelegator(inlineDelegator);
+		refProc.setRemoveDelegator(removeDelegator);
+		refProc.setDeprecateDelegates(false);
+        if (newMethodName != null)
+        {
+            refProc.setMethodName(newMethodName);
+        }
+        preconditionResult.merge(ref.checkFinalConditions(new NullProgressMonitor()));
+       	assertTrue("expected a warning", preconditionResult.hasInfo());
+       	assertEquals("expected specific warning", expectedWarning, preconditionResult.getMessageMatchingSeverity(RefactoringStatus.INFO));
+        
+        performChange(ref, false);
+        for (int idx = 0; idx < cus.length; idx++)
+        {
+            String outputTestFileName = getOutputTestFileName(getSimpleName(cuQNames[idx]));
+            assertEqualLines("Incorrect inline in " + outputTestFileName,
+                    getFileContents(outputTestFileName), cus[idx].getSource());
+        }
+    }
 
 	private void performAndCheckSelectedCU_failing(
 	        String[] cuQNames, String selectionCuQName,
@@ -205,40 +278,33 @@
 									                    method,
 									                    JavaPreferencesSettings.getCodeGenerationSettings(selectionCu.getJavaProject()));
    		Refactoring ref= new MoveRefactoring(refProc);
-		if (ref == null)
-        {
-            assertTrue(errorCode != 0);
-        }
-        else
-        {
-			RefactoringStatus result= ref.checkInitialConditions(
-										   new NullProgressMonitor());
-	
-	        if (!result.isOK())
-	        {
-	            assertEquals(errorCode, result.getEntryMatchingSeverity(
-	                    RefactoringStatus.ERROR).getCode());
-	            return;
-	        }
-	        else
-	        {
-	            chooseNewReceiver(refProc, newReceiverType, newReceiverName);
-	
-	            refProc.setInlineDelegator(inlineDelegator);
-	            refProc.setRemoveDelegator(removeDelegator);
-	            refProc.setDeprecateDelegates(false);
-	            if (newMethodName != null)
-	                refProc.setMethodName(newMethodName);
-	
-	            result.merge(ref
-	            		.checkFinalConditions(new NullProgressMonitor()));
-	
-	            assertTrue("precondition checking is expected to fail.", !result.isOK());
-	            assertNotNull("precondition result is expected to contain an error.", result.getEntryMatchingSeverity(RefactoringStatus.ERROR));
-	            assertEquals(errorCode, result.getEntryMatchingSeverity(
-	                    RefactoringStatus.ERROR).getCode());
-	        }
-        }
+		RefactoringStatus result= ref.checkInitialConditions(
+									   new NullProgressMonitor());
+
+		if (!result.isOK())
+		{
+		    assertEquals(errorCode, result.getEntryMatchingSeverity(
+		            RefactoringStatus.ERROR).getCode());
+		    return;
+		}
+		else
+		{
+		    chooseNewReceiver(refProc, newReceiverType, newReceiverName);
+
+		    refProc.setInlineDelegator(inlineDelegator);
+		    refProc.setRemoveDelegator(removeDelegator);
+		    refProc.setDeprecateDelegates(false);
+		    if (newMethodName != null)
+		        refProc.setMethodName(newMethodName);
+
+		    result.merge(ref
+		    		.checkFinalConditions(new NullProgressMonitor()));
+
+		    assertTrue("precondition checking is expected to fail.", !result.isOK());
+		    assertNotNull("precondition result is expected to contain an error.", result.getEntryMatchingSeverity(RefactoringStatus.ERROR));
+		    assertEquals(errorCode, result.getEntryMatchingSeverity(
+		            RefactoringStatus.ERROR).getCode());
+		}
     }	
 
 	private void performConditionChecking_warnings(
@@ -267,38 +333,31 @@
 									                method,
 									                JavaPreferencesSettings.getCodeGenerationSettings(selectionCu.getJavaProject()));
         Refactoring ref = new MoveRefactoring(refProc);
-        if (ref == null)
-        {
-            assertTrue(errorCode != 0);
-        }
-        else
-        {
-            RefactoringStatus result = ref.checkInitialConditions(
-                    new NullProgressMonitor());
-	        if (!result.isOK())
-	        {
-	            assertEquals(errorCode, result.getEntryMatchingSeverity(
-	                    RefactoringStatus.ERROR).getCode());
-	            return;
-	        }
-	        else
-	        {
-	            chooseNewReceiver(refProc, newReceiverType, newReceiverName);
-	
-	            refProc.setInlineDelegator(inlineDelegator);
-	            refProc.setRemoveDelegator(removeDelegator);
-	            refProc.setDeprecateDelegates(false);
-	            if (newMethodName != null)
-	                refProc.setMethodName(newMethodName);
-	
-	            result.merge(ref
-	                    .checkFinalConditions(new NullProgressMonitor()));
-	
-	            assertTrue("warnings expected", result.hasWarning());
-	            assertEquals(errorCode, result.getEntryMatchingSeverity(
-	                    RefactoringStatus.WARNING).getCode());
-	        }
-        }
+        RefactoringStatus result = ref.checkInitialConditions(
+		        new NullProgressMonitor());
+		if (!result.isOK())
+		{
+		    assertEquals(errorCode, result.getEntryMatchingSeverity(
+		            RefactoringStatus.ERROR).getCode());
+		    return;
+		}
+		else
+		{
+		    chooseNewReceiver(refProc, newReceiverType, newReceiverName);
+
+		    refProc.setInlineDelegator(inlineDelegator);
+		    refProc.setRemoveDelegator(removeDelegator);
+		    refProc.setDeprecateDelegates(false);
+		    if (newMethodName != null)
+		        refProc.setMethodName(newMethodName);
+
+		    result.merge(ref
+		            .checkFinalConditions(new NullProgressMonitor()));
+
+		    assertTrue("warnings expected", result.hasWarning());
+		    assertEquals(errorCode, result.getEntryMatchingSeverity(
+		            RefactoringStatus.WARNING).getCode());
+		}
     }	
 
     private ICompilationUnit[] createCUs(String[] qualifiedNames)
@@ -379,175 +438,129 @@
     // TODO(SH): more tests for combinations of inline,removeDelegate!
     
     /* Testing receiver types */
-    // TODO: commented passing tests
-	// public void testFieldNewReceiver() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.A", "p.B"}, "p.A",
-	// 7, 17, 7, 19, FIELD, "b", true, true, true);// warn:
-	// change-field-to-default-vis
-	// }
-	//    
-	// public void testParameterNewReceiver() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.A", "p.B"}, "p.A",
-	// 5, 17, 5, 19, PARAMETER, "b", true, true, false);
-	// }
-	//
-	// /* Testing team classes */
-	// public void testTeamclass1() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.T", "p.O"}, "p.O",
-	// 7, 17, 7, 20, FIELD, "_t", true, true, true);// warn:
-	// change-field-to-default-vis
-	// }
-	//    
-	// public void testTeamclass2() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.T", "p.O"}, "p.O",
-	// 5, 17, 5, 20, PARAMETER, "t", false, false, false);
-	// }
-	//    
-	// /* Testing role classes */
-	// public void testRoleclass1() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.T", "p.O"}, "p.O",
-	// 8, 17, 8, 20, FIELD, "_r", true, false, false);
-	// }
-	//
-	// public void testRoleclass2() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.T", "p.O"}, "p.O",
-	// 7, 17, 7, 20, PARAMETER, "r", true, false, false);
-	// }
-	//
-	// /* Testing nested teams */
-	// public void testNestedTeam1() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.T", "p.O"}, "p.O",
-	// 8, 17, 8, 20, FIELD, "_nT", true, false, false);
-	// }
-	//    
-	// public void testNestedTeam2() throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.T", "p.O"}, "p.O",
-	// 7, 17, 7, 20, PARAMETER, "nT", true, false, false);
-	// }
-	//
-	// /* Testing role files */
-	// //TODO(gbr) implement tests for role files
-	// // public void testRoleFile1() throws Exception
-	// // {
-	// // }
-	// //
-	// // public void testRoleFile2() throws Exception
-	// // {
-	// // }
-	//    
-	// public void testRoleClassWithLongMethodSpecsInCallinBinding()
-	// throws Exception
-	// {
-	// performConditionChecking_warnings(
-	// new String[] {"p.O", "p.S", "p.B", "p.T"}, "p.O",
-	// 8, 17, 8, 18, FIELD, "_s", null, true, true,
-	// // FIXME(SH):
-	// //OTRefactoringStatusCodes.OVERLOADING
-	// -1
-	// );
-	// }
-	//
-	// public void testRoleClassWithLongMethodSpecsInCalloutBinding()
-	// throws Exception
-	// {
-	// performConditionChecking_warnings(
-	// new String[] {"p.O", "p.S", "p.B", "p.T"}, "p.O",
-	// 8, 17, 8, 18, FIELD, "_s", null, true, true,
-	// // FIXME(SH):
-	// //OTRefactoringStatusCodes.OVERLOADING
-	// -1
-	// );
-	// }
-	//
-	// public void testExplicitlyInheritedRoleClassWithLongMethodSpecs()
-	// throws Exception
-	// {
-	// performConditionChecking_warnings(
-	// new String[] {"p.O", "p.S", "p.B", "p.T"}, "p.O",
-	// 8, 17, 8, 18, FIELD, "_s", null, true, true,
-	// //FIXME(SH):
-	// //OTRefactoringStatusCodes.OVERLOADING
-	// -1
-	// );
-	// }
-	// public void testImplicitlyInheritedRoleClassWithLongMethodSpecs()
-	// throws Exception
-	// {
-	// performConditionChecking_warnings(
-	// new String[] {"p.O", "p.S", "p.B", "p.T1", "p.T2"}, "p.O",
-	// 8, 17, 8, 18, FIELD, "_s", null, true, true,
-	// // FIXME(SH):
-	// //OTRefactoringStatusCodes.OVERLOADING
-	// -1
-	// );
-	// }
-	// public void testTargetMethodAccessesPrivateFeatureOfEnclosingType1()
-	// throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.A", "p.B", "p.C"},
-	// "p.A", 8, 17, 8, 19, FIELD, "_c",
-	// true, true, true);//warn: move needs to open visibility of field
-	// }
-	// public void testTargetMethodAccessesPrivateFeatureOfEnclosingType2()
-	// throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p.A", "p.B", "p.C"},
-	// "p.A", 7, 17, 7, 19, PARAMETER, "c",
-	// true, true, true);//warn: move needs to open visibility of field
-	// }
-	// public void testTargetMethodAccessesProtectedFeatureOfEnclosingType1()
-	// throws Exception
-//    {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p1.A", "p1.B", "p2.C"},
-	// "p1.A", 10, 17, 10, 19, FIELD, "_c",
-	// true, true, true);//warn: move needs to open visibility of field
-//    }
-	// public void testTargetMethodAccessesProtectedFeatureOfEnclosingType2()
-	// throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p1.A", "p1.B", "p2.C"},
-	// "p1.A", 9, 17, 9, 19, PARAMETER, "c",
-	// true, true, true);//warn: move needs to open visibility of field
-	// }
-//    
-	// public void
-	// testTargetMethodAccessesPackageVisibleFeatureOfEnclosingType1()
-	// throws Exception
-//    {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p1.A", "p1.B", "p2.C"},
-	// "p1.A", 10, 17, 10, 19, FIELD, "_c",
-	// true, true, true);//warn: move needs to open visibility of field
-	// }
-	// public void
-	// testTargetMethodAccessesPackageVisibleFeatureOfEnclosingType2()
-	// throws Exception
-	// {
-	// performAndCheckSelectedCU_passing(
-	// new String[] {"p1.A", "p1.B", "p2.C"},
-	// "p1.A", 9, 17, 9, 19, PARAMETER, "c",
-	// true, true, true);//warn: move needs to open visibility of field
-	// }
+	public void testFieldNewReceiver() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p.A", "p.B" }, "p.A", 7, 17, 7, 19, FIELD, "b", true, true,
+				true);// warn: change-field-to-default-vis
+	}
+
+	public void testParameterNewReceiver() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p.A", "p.B" }, "p.A", 5, 17, 5, 19, PARAMETER, "b", true,
+				true, false);
+	}
+
+	/* Testing team classes */
+	public void testTeamclass1() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p.T", "p.O" }, "p.O", 7, 17, 7, 20, FIELD, "_t", true, true,
+		true);// warn: change-field-to-default-vis
+	}
+
+	public void testTeamclass2() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p.T", "p.O" }, "p.O", 5, 17, 5, 20, PARAMETER, "t", false,
+				false, false);
+	}
+
+	/* Testing role classes */
+	public void testRoleclass1() throws Exception {
+		// XXX(SH): expect info: The 'Move Instance Method' Refactoring is not yet fully OT-aware!
+		performAndCheckSelectedCU_passing_std_info(new String[] { "p.T", "p.O" }, "p.O", 8, 17, 8, 20, FIELD, "_r", true, false,
+				false);
+	}
+
+	public void testRoleclass2() throws Exception {
+		// XXX(SH): expect info: The 'Move Instance Method' Refactoring is not yet fully OT-aware!
+		performAndCheckSelectedCU_passing_std_info(new String[] { "p.T", "p.O" }, "p.O", 7, 17, 7, 20, PARAMETER, "r", true,
+				false, false);
+	}
+
+	/* Testing nested teams */
+	public void testNestedTeam1() throws Exception {
+		// XXX(SH): expect info: The 'Move Instance Method' Refactoring is not yet fully OT-aware!
+		performAndCheckSelectedCU_passing_std_info(new String[] { "p.T", "p.O" }, "p.O", 8, 17, 8, 20, FIELD, "_nT", true,
+				false, false);
+	}
+
+	public void testNestedTeam2() throws Exception {
+		// XXX(SH): expect info: The 'Move Instance Method' Refactoring is not yet fully OT-aware!
+		performAndCheckSelectedCU_passing_std_info(new String[] { "p.T", "p.O" }, "p.O", 7, 17, 7, 20, PARAMETER, "nT", true,
+				false, false);
+	}
+
+	/* Testing role files */
+	// TODO(gbr) implement tests for role files
+	// public void testRoleFile1() throws Exception
+	// {
+	// }
+	//
+	// public void testRoleFile2() throws Exception
+	// {
+	// }
+
+	public void testRoleClassWithLongMethodSpecsInCallinBinding() throws Exception {
+		performConditionChecking_warnings(new String[] { "p.O", "p.S", "p.B", "p.T" }, "p.O", 8, 17, 8, 18, FIELD,
+				"_s", null, true, true,
+				// FIXME(SH):
+				// OTRefactoringStatusCodes.OVERLOADING
+				-1);
+	}
+
+	public void testRoleClassWithLongMethodSpecsInCalloutBinding() throws Exception {
+		performConditionChecking_warnings(new String[] { "p.O", "p.S", "p.B", "p.T" }, "p.O", 8, 17, 8, 18, FIELD,
+				"_s", null, true, true,
+				// FIXME(SH):
+				// OTRefactoringStatusCodes.OVERLOADING
+				-1);
+	}
+
+	public void testExplicitlyInheritedRoleClassWithLongMethodSpecs() throws Exception {
+		performConditionChecking_warnings(new String[] { "p.O", "p.S", "p.B", "p.T" }, "p.O", 8, 17, 8, 18, FIELD,
+				"_s", null, true, true,
+				// FIXME(SH):
+				// OTRefactoringStatusCodes.OVERLOADING
+				-1);
+	}
+
+	public void testImplicitlyInheritedRoleClassWithLongMethodSpecs() throws Exception {
+		performConditionChecking_warnings(new String[] { "p.O", "p.S", "p.B", "p.T1", "p.T2" }, "p.O", 8, 17, 8, 18,
+				FIELD, "_s", null, true, true,
+				// FIXME(SH):
+				// OTRefactoringStatusCodes.OVERLOADING
+				-1);
+	}
+
+	public void testTargetMethodAccessesPrivateFeatureOfEnclosingType1() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p.A", "p.B", "p.C" }, "p.A", 8, 17, 8, 19, FIELD, "_c", true,
+				true, true);// warn: move needs to open visibility of field
+	}
+
+	public void testTargetMethodAccessesPrivateFeatureOfEnclosingType2() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p.A", "p.B", "p.C" }, "p.A", 7, 17, 7, 19, PARAMETER, "c",
+				true, true, true);// warn: move needs to open visibility of
+									// field
+	}
+
+	public void testTargetMethodAccessesProtectedFeatureOfEnclosingType1() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p1.A", "p1.B", "p2.C" }, "p1.A", 10, 17, 10, 19, FIELD, "_c",
+				true, true, true);// warn: move needs to open visibility of
+									// field
+	}
+
+	public void testTargetMethodAccessesProtectedFeatureOfEnclosingType2() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p1.A", "p1.B", "p2.C" }, "p1.A", 9, 17, 9, 19, PARAMETER,
+				"c", true, true, true);// warn: move needs to open visibility of
+										// field
+	}
+
+	public void testTargetMethodAccessesPackageVisibleFeatureOfEnclosingType1() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p1.A", "p1.B", "p2.C" }, "p1.A", 10, 17, 10, 19, FIELD, "_c",
+				true, true, true);// warn: move needs to open visibility of
+									// field
+	}
+
+	public void testTargetMethodAccessesPackageVisibleFeatureOfEnclosingType2() throws Exception {
+		performAndCheckSelectedCU_passing(new String[] { "p1.A", "p1.B", "p2.C" }, "p1.A", 9, 17, 9, 19, PARAMETER,
+				"c", true, true, true);// warn: move needs to open visibility of
+										// field
+	}
     //tests for ambiguity in method specs
 	public void testAmbiguousRoleMethodSpecifierInCallinBinding1()
     	throws Exception
