private void merge(boolean waitForConflict) throws Exception {
		originalProgram = mtf.getOriginalProgram();
		myProgram = mtf.getPrivateProgram();// my program
		resultProgram = mtf.getResultProgram();// destination program
		latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same);

		ProgramChangeSet resultChangeSet = mtf.getResultChangeSet();
		ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet();

		mergeMgr = new ProgramMultiUserMergeManager(resultProgram, myProgram, originalProgram,
			latestProgram, resultChangeSet, myChangeSet);
		Thread t = new Thread(() -> {
			try {
				mergeMgr.merge();
			}
			catch (CancelledException e) {
				// can't happen
			}
		});
		t.start();
		waitForSwing();

		if (!waitForConflict) {
			return;
		}

		PropertyListMergePanel mergePanel = waitForValue(() -> {

			PropertyListMergePanel panel = findComponent(PropertyListMergePanel.class);
			if (panel == null) {
				return null;
			}
			if (!panel.isShowing()) {
				return null;
			}
			return panel;

		}); //, MAX_MERGE_TIMEOUT); TODO a reminder to see if we need a larger timeout mechanism

		window = WindowUtilities.windowForComponent(mergePanel);
		assertNotNull("Could not find active window", window);
		assertTrue(window.isShowing());
	}
Tests for the conflict panel in the property list merge manager.
Ghidra/Features/Base/src/test.slow/java/ghidra/app/merge/propertylist/PropertyListMergeManager2Test.java