@Test
	public void testAddStringProperty2() throws Exception {
		mtf.initialize("DiffTestPgm1", new OriginalProgramModifierListener() {

			@Override
			public void modifyOriginal(ProgramDB program) throws Exception {
				PropertyMapManager pmm = program.getUsrPropertyManager();
				try {
					StringPropertyMap spm = pmm.createStringPropertyMap("testString1");
					spm.add(addr(program, "0x1002100"), "A");
					spm.add(addr(program, "0x1002166"), "B");

					spm = pmm.createStringPropertyMap("testString2");
					spm.add(addr(program, "0x1002200"), "C");
					spm.add(addr(program, "0x1002266"), "D");
				}
				catch (DuplicateNameException e) {
					e.printStackTrace();
				}
			}

			@Override
			public void modifyPrivate(ProgramDB program) {
				PropertyMapManager pmm = program.getUsrPropertyManager();
				try {
					StringPropertyMap spm = pmm.createStringPropertyMap("testString3");
					spm.add(addr(program, "0x1002381"), "E");
					spm.add(addr(program, "0x1002366"), "F");

					// Add to existing map removed in latest (conflict)
					// NOTE: In the absence of property conflict handling this
					// will cause testString1 properties removed in latest to be
					// re-introduced into result

					// TODO: improve property conflict handling

					spm = pmm.getStringPropertyMap("testString1");
					spm.add(addr(program, "0x1002500"), "G");
					spm.add(addr(program, "0x1002566"), "H");
				}
				catch (DuplicateNameException e) {
					e.printStackTrace();
				}
			}

			@Override
			public void modifyLatest(ProgramDB program) {
				PropertyMapManager pmm = program.getUsrPropertyManager();
				try {
					StringPropertyMap spm = pmm.createStringPropertyMap("testString4");
					spm.add(addr(program, "0x1002500"), "I");
					spm.add(addr(program, "0x1002566"), "J");

					pmm.removePropertyMap("testString1");

				}
				catch (DuplicateNameException e) {
					e.printStackTrace();
				}
			}

		});

		executeMerge(ASK_USER);
		waitForMergeCompletion();

		PropertyMapManager pmm = resultProgram.getUsrPropertyManager();

		StringPropertyMap spm = pmm.getStringPropertyMap("testString1");
		Address address = resultProgram.getMinAddress();

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002500"), address);
		assertEquals("G", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002566"), address);
		assertEquals("H", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertNull(address);

		spm = pmm.getStringPropertyMap("testString2");
		address = resultProgram.getMinAddress();

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002200"), address);
		assertEquals("C", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002266"), address);
		assertEquals("D", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertNull(address);

		spm = pmm.getStringPropertyMap("testString3");
		address = resultProgram.getMinAddress();

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002366"), address);
		assertEquals("F", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002381"), address);
		assertEquals("E", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertNull(address);

		spm = pmm.getStringPropertyMap("testString4");
		address = resultProgram.getMinAddress();

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002500"), address);
		assertEquals("I", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertEquals(addr("0x1002566"), address);
		assertEquals("J", spm.getString(address));

		address = spm.getNextPropertyAddress(address);
		assertNull(address);
	}
Test the merge of the versioned program's listing.
Ghidra/Features/Base/src/test.slow/java/ghidra/app/merge/listing/UserDefinedPropertyMergeManagerTest.java