diff --git a/src/main/java/net/onrc/onos/registry/controller/StandaloneRegistry.java b/src/main/java/net/onrc/onos/registry/controller/StandaloneRegistry.java
index 7e82bf0..640a49d 100644
--- a/src/main/java/net/onrc/onos/registry/controller/StandaloneRegistry.java
+++ b/src/main/java/net/onrc/onos/registry/controller/StandaloneRegistry.java
@@ -118,12 +118,17 @@
 	
 	private long blockTop = 0L;
 	private static final long BLOCK_SIZE = 0x1000000L;
+	
+	/**
+	 * Returns a block of IDs which are unique and unused.
+	 * Range of IDs is fixed size and is assigned incrementally as this method called.
+	 */
 	@Override
-	public IdBlock allocateUniqueIdBlock(){
+	public synchronized IdBlock allocateUniqueIdBlock(){
 		long blockHead = blockTop;
 		long blockTail = blockTop + BLOCK_SIZE;
 		
-		IdBlock block = new IdBlock(blockHead, blockTail, BLOCK_SIZE);
+		IdBlock block = new IdBlock(blockHead, blockTail - 1, BLOCK_SIZE);
 		blockTop = blockTail;
 		
 		return block;
diff --git a/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java b/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java
index f9fb62e..2d2083f 100644
--- a/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java
+++ b/src/main/java/net/onrc/onos/registry/controller/ZookeeperRegistry.java
@@ -379,6 +379,12 @@
 		return data;
 	}
 	
+	/**
+	 * Returns a block of IDs which are unique and unused.
+	 * Range of IDs is fixed size and is assigned incrementally as this method called.
+	 * Since the range of IDs is managed by Zookeeper in distributed way, this method may block when
+	 * requests come up simultaneously.
+	 */
 	public IdBlock allocateUniqueIdBlock(){
 		try {
 			AtomicValue<Long> result = null;
diff --git a/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java b/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
index 5c42452..9b1c4d6 100644
--- a/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
@@ -6,7 +6,6 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -33,6 +32,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * Unit test for {@link LinkStorageImpl}.
+ * @author Naoki Shiota
+ *
+ */
 @RunWith(PowerMockRunner.class)
 @PrepareForTest({LinkStorageImpl.class, GraphDBConnection.class, GraphDBOperation.class})
 public class LinkStorageImplTest {
@@ -100,12 +104,14 @@
 	 */
 	@Before
 	public void setUp() throws Exception{
+		// Create mock GraphDBConnection (replace Singleton object to mock one)
 		PowerMock.mockStatic(GraphDBConnection.class);
 		PowerMock.suppress(PowerMock.constructor(GraphDBConnection.class));
-		conn = PowerMock.createNiceMock(GraphDBConnection.class);
+		conn = PowerMock.createMock(GraphDBConnection.class);
 		EasyMock.expect(GraphDBConnection.getInstance((String)EasyMock.anyObject())).andReturn(conn).anyTimes();
 		PowerMock.replay(GraphDBConnection.class);
 		
+		// Create mock GraphDBOperation
 		ope = createMockGraphDBOperation();
 		PowerMock.expectNew(GraphDBOperation.class, new Class<?>[] {GraphDBConnection.class}, EasyMock.anyObject(GraphDBConnection.class)).andReturn(ope).anyTimes();
 		PowerMock.replay(GraphDBOperation.class);
@@ -121,18 +127,16 @@
 	
 	/**
 	 * Closing code called after each tests.
-	 * Discard test graph data.
 	 * @throws Exception
 	 */
 	@After
 	public void tearDown() throws Exception {
-		// finish code
 		linkStorage.close();
 	}
 	
 	// TODO: remove @Ignore after UPDATE method is implemented
 	/**
-	 * Test if update() can correctly updates LinkInfo for a Link.
+	 * Test if {@link LinkStorageImpl#update(Link, LinkInfo, DM_OPERATION)} can correctly updates LinkInfo for a Link.
 	 */
 	@Ignore @Test
 	public void testUpdate_UpdateSingleLink() {
@@ -147,7 +151,7 @@
 	}
 	
 	/**
-	 * Test if update() can correctly creates a Link.
+	 * Test if {@link LinkStorageImpl#update(Link, DM_OPERATION)} can correctly creates a Link.
 	 */
 	@Test
 	public void testUpdate_CreateSingleLink() {
@@ -157,18 +161,10 @@
 		//Use the link storage API to add the link
 		linkStorage.update(linkToCreate, ILinkStorage.DM_OPERATION.CREATE);
 		doTestLinkExist(linkToVerify);
-
-		// Avoiding duplication is out of scope. DBOperation is responsible for this.
-//		// Add same link
-//		Link linkToCreateTwice = createFeasibleLink();
-//		linkStorage.update(linkToCreateTwice, ILinkStorage.DM_OPERATION.CREATE);
-//		
-//		// this occurs assertion failure if there are two links in titanGraph
-//		doTestLinkIsInGraph(linkToVerify);
 	}
 
 	/**
-	 * Test if update() can correctly inserts a Link.
+	 * Test if {@link LinkStorageImpl#update(Link, DM_OPERATION)}can correctly inserts a Link.
 	 */
 	@Test
 	public void testUpdate_InsertSingleLink(){
@@ -181,7 +177,7 @@
 	}
 	
 	/**
-	 * Test if update() can correctly deletes a Link.
+	 * Test if {@link LinkStorageImpl#update(Link, DM_OPERATION)} can correctly deletes a Link.
 	 */
 	@Test
 	public void testUpdate_DeleteSingleLink(){
@@ -194,7 +190,7 @@
 	}
 
 	/**
-	 * Test if update() can correctly creates multiple Links.
+	 * Test if {@link LinkStorageImpl#update(List, DM_OPERATION)} can correctly creates multiple Links.
 	 */
 	@Test
 	public void testUpdate_CreateLinks(){
@@ -206,34 +202,10 @@
 		for(Link l : linksToVerify) {
 			doTestLinkExist(l);
 		}
-	
-		// Out of scope: DBOperation is responsible for avoiding duplication.
-//		// Test creation of existing links
-//		linksToCreate = createFeasibleLinks();
-//		linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
-//		for(Link l : linksToVerify) {
-//			doTestLinkIsInGraph(l);
-//		}
-	}
-	
-	/**
-	 * Test if update() can handle mixture of normal/abnormal input for creation of Links.
-	 * Deprecated: DBOperation is responsible.
-	 */
-	@Ignore @Test
-	public void testUpdate_CreateLinks_Mixuture(){
-		List<Link> linksToCreate = new ArrayList<Link>();
-		linksToCreate.add(createFeasibleLink());
-		linksToCreate.add(createExistingLink());
-		
-		// Test creation of mixture of new/existing links
-		linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
-		doTestLinkExist(createFeasibleLink());
-		doTestLinkExist(createExistingLink());
 	}
 
 	/**
-	 * Test if update() can correctly inserts multiple Links.
+	 * Test if {@link LinkStorageImpl#update(List, DM_OPERATION)} can correctly inserts multiple Links.
 	 */
 	@Test
 	public void testUpdate_InsertLinks(){
@@ -248,22 +220,7 @@
 	}
 	
 	/**
-	 * Test if update() can handle mixture of normal/abnormal input for creation of Links.
-	 */
-	@Ignore @Test
-	public void testUpdate_InsertLinks_Mixuture(){
-		List<Link> linksToInsert = new ArrayList<Link>();
-		linksToInsert.add(createFeasibleLink());
-		linksToInsert.add(createExistingLink());
-		
-		// Test insertion of mixture of new/existing links
-		linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
-		doTestLinkExist(createFeasibleLink());
-		doTestLinkExist(createExistingLink());
-	}
-
-	/**
-	 * Test if update() can correctly deletes multiple Links.
+	 * Test if  {@link LinkStorageImpl#update(List, DM_OPERATION)} can correctly deletes multiple Links.
 	 */
 	@Test
 	public void testUpdate_DeleteLinks(){
@@ -277,24 +234,9 @@
 		}
 	}
 	
-	/**
-	 * Test if update() can handle mixture of normal/abnormal input for deletion of Links.
-	 */
-	@Ignore @Test
-	public void testUpdate_DeleteLinks_Mixuture(){
-		List<Link> linksToDelete = new ArrayList<Link>();
-		linksToDelete.add(createFeasibleLink());
-		linksToDelete.add(createExistingLink());
-		
-		// Test deletion of mixture of new/existing links
-		linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
-		doTestLinkNotExist(createFeasibleLink());
-		doTestLinkNotExist(createExistingLink());
-	}
-	
 	// TODO: remove @Ignore after UPDATE method is implemented
 	/**
-	 * Test if updateLink() can correctly updates LinkInfo for a Link.
+	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly updates LinkInfo for a Link.
 	 */
 	@Ignore @Test
 	public void testUpdateLink_Update() {
@@ -309,7 +251,7 @@
 	}
 	
 	/**
-	 * Test if updateLink() can correctly creates a Link.
+	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly creates a Link.
 	 */
 	@Test
 	public void testUpdateLink_Create() {
@@ -322,7 +264,7 @@
 	}
 	
 	/**
-	 * Test if updateLink() can correctly inserts a Link.
+	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly inserts a Link.
 	 */
 	@Test
 	public void testUpdateLink_Insert() {
@@ -337,7 +279,7 @@
 	
 	// TODO: Check if addOrUpdateLink() should accept DELETE operation. If not, remove this test.
 	/**
-	 * Test if updateLink() can correctly deletes a Link.
+	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly deletes a Link.
 	 */
 	@Ignore @Test
 	public void testUpdateLink_Delete() {
@@ -357,7 +299,7 @@
 	}
 	
 	/**
-	 * Test if getLinks() can correctly return Links connected to specific DPID and port.
+	 * Test if {@link LinkStorageImpl#getLinks(Long, short)} can correctly return Links connected to specific DPID and port.
 	 */
 	@Test
 	public void testGetLinks_ByDpidPort(){
@@ -383,7 +325,7 @@
 	}
 	
 	/**
-	 * Test if getLinks() can correctly return Links connected to specific MAC address.
+	 * Test if {@link LinkStorageImpl#getLinks(String)} can correctly return Links connected to specific MAC address.
 	 */
 	@Test
 	public void testGetLinks_ByString() {
@@ -398,7 +340,7 @@
 	}
 	
 	/**
-	 * Test if deleteLink() can correctly delete a Link.
+	 * Test if {@link LinkStorageImpl#deleteLink(Link)} can correctly delete a Link.
 	 */
 	@Test
 	public void testDeleteLink() {
@@ -411,7 +353,7 @@
 	}
 	
 	/**
-	 * Test if deleteLinks() can correctly delete Links.
+	 * Test if {@link LinkStorageImpl#deleteLinks(List)} can correctly delete Links.
 	 */
 	@Test
 	public void testDeleteLinks(){
@@ -423,24 +365,9 @@
 			doTestLinkNotExist(l);
 		}
 	}
-	
-	/**
-	 * Test if deleteLinks() can handle mixture of normal/abnormal input.
-	 */
-	@Ignore @Test
-	public void testDeleteLinks_Mixture(){
-		List<Link> linksToDelete = new ArrayList<Link>();
-		linksToDelete.add(createFeasibleLink());
-		linksToDelete.add(createExistingLink());
-		
-		// Test deletion of mixture of new/existing links
-		linkStorage.deleteLinks(linksToDelete);
-		doTestLinkNotExist(createFeasibleLink());
-		doTestLinkNotExist(createExistingLink());
-	}
 
 	/**
-	 * Test if getActiveLinks() can correctly return active Links.
+	 * Test if {@link LinkStorageImpl#getActiveLinks()} can correctly return active Links.
 	 */
 	@Test
 	public void testGetActiveLinks() {
@@ -454,7 +381,7 @@
 	}
 	
 	/**
-	 * Test if deleteLinksOnPort() can delete Links.
+	 * Test if {@link LinkStorageImpl#deleteLinksOnPort(Long, short)} can delete Links.
 	 */
 	@Test
 	public void testDeleteLinksOnPort() {
@@ -493,11 +420,12 @@
 	 * Test if titanGraph has specific Link with specific LinkInfo
 	 * @param link 
 	 */
+	// TODO: Fix me
 	private void doTestLinkHasStateOf(Link link, LinkInfo info) {
 	}
 	
 	/**
-	 * Class defines a function called back when IPortObject#removeLink is called.
+	 * Class defines a function called back when {@link IPortObject#removeLink(IPortObject)} is called.
 	 * @author Naoki Shiota
 	 *
 	 */
@@ -521,9 +449,8 @@
 	}
 	
 	/**
-	 * Class defines a function called back when IPortObject#setLinkPort is called.
+	 * Class defines a function called back when {@link IPortObject#setLinkPort(IPortObject)} is called.
 	 * @author Naoki Shiota
-	 *
 	 */
 	private class SetLinkPortCallback implements IAnswer<Object> {
 		private long dpid;
@@ -546,7 +473,7 @@
 	}
 	
 	/**
-	 * Class defines a function called back when IPortObject#getSwitch is called.
+	 * Class defines a function called back when {@link IPortObject#getSwitch()} is called.
 	 * @author Naoki Shiota
 	 *
 	 */
@@ -565,7 +492,7 @@
 	}
 	
 	/**
-	 * Class defines a function called back when IPortObject#getLinkedPorts is called.
+	 * Class defines a function called back when {@link IPortObject#getLinkedPorts()} is called.
 	 * @author Naoki Shiota
 	 *
 	 */
@@ -594,7 +521,7 @@
 	}
 
 	/**
-	 * Class defines a function called back when ISwitchObject#getPorts is called.
+	 * Class defines a function called back when {@link LinkStorageImplTest} is called.
 	 * @author Naoki Shiota
 	 *
 	 */
@@ -619,7 +546,7 @@
 
 	// ------------------------Creation of Mock-----------------------------
 	/**
-	 * Create a mock GraphDBOperation which hooks port-related methods.
+	 * Create a mock {@link GraphDBOperation} which hooks port-related methods.
 	 * @return EasyMock-wrapped GraphDBOperation object.
 	 */
 	@SuppressWarnings("serial")
@@ -692,8 +619,8 @@
 	}
 	
 	/**
-	 * Create a mock IPortObject using given DPID and port number.
-	 * IPortObject can't store DPID, so DPID is stored to mockToPortInfoMap for later use.
+	 * Create a mock {@link IPortObject} using given DPID and port number.
+	 * {@link IPortObject} can't store DPID, so DPID is stored to mockToPortInfoMap for later use.
 	 * Duplication is not checked.
 	 * @param dpid DPID of a port
 	 * @param number Port Number
@@ -725,7 +652,7 @@
 	}
 	
 	/**
-	 * Create a mock ISwitchObject using given DPID number.
+	 * Create a mock {@link ISwitchObject} using given DPID number.
 	 * Duplication is not checked.
 	 * @param dpid DPID of a switch
 	 * @return EasyMock-wrapped ISwitchObject
@@ -811,7 +738,7 @@
 	}
 	
 	/**
-	 * Returns new Link object of an existing link
+	 * Returns new {@link Link} object of an existing link
 	 * @return new Link object
 	 */
 	private Link createExistingLink() {
@@ -819,7 +746,7 @@
 	}
 	
 	/**
-	 * Returns new Link object of a not-existing but feasible link
+	 * Returns new {@link Link} object of a not-existing but feasible link
 	 * @return new Link object
 	 */
 	private Link createFeasibleLink() {
@@ -833,7 +760,7 @@
 	}
 
 	/**
-	 * Returns list of Link objects which all has information of existing link in titanGraph
+	 * Returns list of existing {@link Link} objects
 	 * @return ArrayList of new Link objects
 	 */
 	private List<Link> createExistingLinks() {
@@ -844,7 +771,7 @@
 	}
 	
 	/**
-	 * Returns list of Link objects which all has information of not-existing but feasible link
+	 * Returns list of {@link Link} objects that are all not-existing but feasible
 	 * @return ArrayList of new Link objects
 	 */
 	private List<Link> createFeasibleLinks() {
@@ -855,7 +782,7 @@
 	}
 	
 	/**
-	 * Returns new LinkInfo object with convenient values.
+	 * Returns new {@link LinkInfo} object with convenient values.
 	 * @return LinkInfo object
 	 */
 	private LinkInfo createFeasibleLinkInfo(long time) {
diff --git a/src/test/java/net/onrc/onos/registry/controller/StandaloneRegistryTest.java b/src/test/java/net/onrc/onos/registry/controller/StandaloneRegistryTest.java
index 802c137..7c4a1a0 100644
--- a/src/test/java/net/onrc/onos/registry/controller/StandaloneRegistryTest.java
+++ b/src/test/java/net/onrc/onos/registry/controller/StandaloneRegistryTest.java
@@ -20,7 +20,7 @@
 import org.openflow.util.HexString;
 
 /**
- * Unit test for StandaloneRegistry.
+ * Unit test for {@link StandaloneRegistry}.
  * @author Naoki Shiota
  *
  */
@@ -30,14 +30,13 @@
 	protected StandaloneRegistry registry;
 	
 	/**
-	 * Implementation of ControlChangeCallback which defines callback interfaces called by Registry.
+	 * Implementation of {@link ControlChangeCallback} which defines callback interfaces called by Registry.
 	 * This class remembers past callback parameters and provides methods to access them.
 	 * This class also provides CountDownLatch so one can wait until the callback be called
-	 * specific times (specified by constructor param). Particularly, the first time callback
+	 * specific times (specified by constructor parameter). Particularly, the first time callback
 	 * called is supposed for registration, this class has an independent latch to wait for
 	 * the first callback.
 	 * @author Naoki Shiota
-	 *
 	 */
 	public static class LoggingCallback implements ControlChangeCallback {
 		private LinkedList<Long> dpidsCalledback = new LinkedList<Long>();
@@ -135,7 +134,7 @@
 	}
 	
 	/**
-	 * Test if registerController() can run without error.
+	 * Test if {@link StandaloneRegistry#registerController(String)} can run without error.
 	 */
 	@Test
 	public void testRegisterController() {
@@ -157,7 +156,7 @@
 	}
 	
 	/**
-	 * Test if getControllerId() can return correct ID.
+	 * Test if {@link StandaloneRegistry#getControllerId()} can return correct ID.
 	 * @throws RegistryException
 	 */
 	@Test
@@ -178,7 +177,7 @@
 	}
 
 	/**
-	 * Test if getAllControllers() can return correct list of controllers.
+	 * Test if {@link StandaloneRegistry#getAllControllers()} can return correct list of controllers.
 	 * @throws RegistryException
 	 */
 	@Test
@@ -208,7 +207,7 @@
 	}
 
 	/**
-	 * Test if requestControl() can correctly take control for switch so that callback is called.
+	 * Test if {@link StandaloneRegistry#requestControl(long, ControlChangeCallback)} can correctly take control for switch so that callback is called.
 	 * @throws RegistryException
 	 * @throws InterruptedException
 	 */
@@ -237,7 +236,7 @@
 	}
 
 	/**
-	 * Test if releaseControl() can correctly release the control so that callback is called.
+	 * Test if {@link StandaloneRegistry#releaseControl(long)} can correctly release the control so that callback is called.
 	 * @throws InterruptedException
 	 * @throws RegistryException
 	 */
@@ -262,7 +261,7 @@
 	}
 
 	/**
-	 * Test if hasControl() returns correct status.
+	 * Test if {@link StandaloneRegistry#hasControl(long)} returns correct status.
 	 * @throws InterruptedException
 	 * @throws RegistryException
 	 */
@@ -292,7 +291,7 @@
 	}
 
 	/**
-	 * Test if getControllerForSwitch() returns correct controller ID.
+	 * Test if {@link StandaloneRegistry#getControllerForSwitch(long)} returns correct controller ID.
 	 * @throws InterruptedException
 	 * @throws RegistryException
 	 */
@@ -339,7 +338,7 @@
 	}
 
 	/**
-	 * Test if getAllSwitches() returns correct list of switches.
+	 * Test if {@link StandaloneRegistry#getAllSwitches()} returns correct list of switches.
 	 * @throws InterruptedException
 	 * @throws RegistryException
 	 */
@@ -382,7 +381,7 @@
 	}
 
 	/**
-	 * Test if getSwitchesControlledByController() returns correct list of switches.
+	 * Test if {@link StandaloneRegistry#getSwitchesControlledByController(String)} returns correct list of switches.
 	 * @throws InterruptedException
 	 * @throws RegistryException
 	 */
@@ -426,7 +425,8 @@
 	}
 
 	/**
-	 * Test if allocateUniqueIdBlock() returns appropriate object.
+	 * Test if {@link StandaloneRegistry#allocateUniqueIdBlock()} returns appropriate object.
+	 * Get bulk of IdBlocks and check if they do have unique range of IDs.
 	 */
 	@Test
 	public void testAllocateUniqueIdBlock() {
@@ -454,7 +454,7 @@
 				
 				assertTrue(lower.getSize() > 0L);
 				assertTrue(higher.getSize() > 0L);
-				assertTrue(lower.getEnd() <= higher.getStart());
+				assertTrue(lower.getEnd() < higher.getStart());
 			}
 		}
 	}
diff --git a/src/test/java/net/onrc/onos/registry/controller/ZookeeperRegistryTest.java b/src/test/java/net/onrc/onos/registry/controller/ZookeeperRegistryTest.java
index f557663..3314ad2 100644
--- a/src/test/java/net/onrc/onos/registry/controller/ZookeeperRegistryTest.java
+++ b/src/test/java/net/onrc/onos/registry/controller/ZookeeperRegistryTest.java
@@ -41,8 +41,8 @@
 import com.netflix.curator.x.discovery.ServiceInstance;
 
 /**
- * Unit test for ZookeeperRegistry.
- * NOTE: FloodlightTestCase conflicts with PowerMock. If FloodLight-related methods need to be tested,
+ * Unit test for {@link ZookeeperRegistry}.
+ * NOTE: {@link FloodlightTestCase} conflicts with PowerMock. If FloodLight-related methods need to be tested,
  *       implement another test class to test them.
  * @author Naoki Shiota
  *
@@ -61,8 +61,8 @@
 	protected final String CONTROLLER_ID = "controller2013";
 
 	/**
-	 * Initialize ZookeeperRegistry Object and inject initial value with init() method.
-	 * This setup code also tests init() method itself.
+	 * Initialize {@link ZookeeperRegistry} Object and inject initial value with {@link ZookeeperRegistry#init(FloodlightModuleContext)} method.
+	 * This setup code also tests {@link ZookeeperRegistry#init(FloodlightModuleContext)} method itself.
 	 */
 	@Before
 	public void setUp() throws Exception {
@@ -97,8 +97,8 @@
 	}
 
 	/**
-	 * Test if registerController() method can go through without exception.
-	 * (Exceptions are usually out of test target, but registerController() throws an exception in case of invalid registration.)
+	 * Test if {@link ZookeeperRegistry#registerController(String)} method can go through without exception.
+	 * (Exceptions are usually out of test target, but {@link ZookeeperRegistry#registerController(String)} throws an exception in case of invalid registration.)
 	 */
 	@Test
 	public void testRegisterController() {
@@ -113,7 +113,7 @@
 	}
 
 	/**
-	 * Test if getControllerId() correctly returns registered ID.
+	 * Test if {@link ZookeeperRegistry#getControllerId()} correctly returns registered ID.
 	 * @throws Exception
 	 */
 	@Test
@@ -134,9 +134,9 @@
 	}
 
 	/**
-	 * Test if getAllControllers() returns all controllers.
-	 * Controllers are injected while setup. See createCuratorFrameworkMock() to what controllers
-	 * are injected using ServiceCache Mock.
+	 * Test if {@link ZookeeperRegistry#getAllControllers()} returns all controllers.
+	 * Controllers to be returned are injected while setup. See {@link ZookeeperRegistryTest#createCuratorFrameworkMock()}
+	 * to what controllers are injected using mock {@link ServiceCache}.
 	 * @throws Exception
 	 */
 	@Test
@@ -144,7 +144,6 @@
 		String controllerIdRegistered = "controller1";
 		String controllerIdNotRegistered = "controller2013";
 
-		// Test registered controller
 		try {
 			Collection<String> ctrls = registry.getAllControllers();
 			assertTrue(ctrls.contains(controllerIdRegistered));
@@ -156,13 +155,14 @@
 	}
 
 	/**
-	 * Test if requestControl() correctly take control of specific switch.
-	 * Because requestControl() doesn't return values, inject mock LeaderLatch object and verify latch is correctly set up.
+	 * Test if {@link ZookeeperRegistry#requestControl(long, net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback)}
+	 * correctly take control of specific switch. Because {@link ZookeeperRegistry#requestControl(long, net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback)}
+	 * doesn't return values, inject mock {@link LeaderLatch} object and verify latch is correctly set up.
 	 * @throws Exception
 	 */
 	@Test
 	public void testRequestControl() throws Exception {
-		// Mock of LeaderLatch
+		// Mock LeaderLatch
 		LeaderLatch latch = EasyMock.createMock(LeaderLatch.class);
 		latch.addListener(EasyMock.anyObject(SwitchLeaderListener.class));
 		EasyMock.expectLastCall().once();
@@ -172,7 +172,7 @@
 		
 		PowerMock.expectNew(LeaderLatch.class,
 				EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
-				.andReturn(latch);
+				.andReturn(latch).once();
 		PowerMock.replay(LeaderLatch.class);
 		
 		String controllerId = "controller2013";
@@ -192,8 +192,9 @@
 	}
 
 	/**
-	 * Test if releaseControl() correctly release control of specific switch.
-	 * Because releaseControl() doesn't return values, inject mock LeaderLatch object and verify latch is correctly set up.
+	 * Test if {@link ZookeeperRegistry#releaseControl(long)} correctly release control of specific switch.
+	 * Because {@link ZookeeperRegistry#releaseControl(long)} doesn't return values, inject mock
+	 * {@link LeaderLatch} object and verify latch is correctly set up.
 	 * @throws Exception
 	 */
 	@Test
@@ -212,25 +213,23 @@
 		
 		PowerMock.expectNew(LeaderLatch.class,
 				EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
-				.andReturn(latch);
+				.andReturn(latch).once();
 		PowerMock.replay(LeaderLatch.class);
 		
 		String controllerId = "controller2013";
 		registry.registerController(controllerId);
 		
-		long dpidToRequest = 1000L;
+		long dpidToRequest = 2000L;
 		LoggingCallback callback = new LoggingCallback(1);
 		
-		// to request and wait to take control
 		registry.requestControl(dpidToRequest, callback);
 		registry.releaseControl(dpidToRequest);
 		
-		// verify
 		EasyMock.verify(latch);
 	}
 
 	/**
-	 * Test if hasControl() returns correct status whether controller has control of specific switch.
+	 * Test if {@link ZookeeperRegistry#hasControl(long)} returns correct status whether controller has control of specific switch.
 	 * @throws Exception
 	 */
 	@Test
@@ -276,8 +275,8 @@
 	}
 
 	/**
-	 * Test if getControllerForSwitch() correctly returns controller ID of specific switch.
-	 * Relation between controllers and switches are defined by setPathChildrenCache() function.
+	 * Test if {@link ZookeeperRegistry#getControllerForSwitch(long)} correctly returns controller ID of specific switch.
+	 * Relation between controllers and switches are defined by {@link ZookeeperRegistryTest#setPathChildrenCache()} function.
 	 * @throws Throwable
 	 */
 	@Test
@@ -295,11 +294,11 @@
 	}
 
 	/**
-	 * Test if getSwitchesControlledByController() returns correct list of switches controlled by
-	 * a controller.
+	 * Test if {@link ZookeeperRegistry#getSwitchesControlledByController(String)} returns correct list of
+	 * switches controlled by a controller.
 	 * @throws Exception
 	 */
-	// TODO: Test after implementation of getSwitch() is done.
+	// TODO: Test after getSwitchesControlledByController() is implemented.
 	@Ignore @Test
 	public void testGetSwitchesControlledByController() throws Exception {
 		String controllerIdRegistered = "controller1";
@@ -316,8 +315,8 @@
 	}
 
 	/**
-	 * Test if getAllSwitches() returns correct list of all switches.
-	 * Switches are injected in setPathChildrenCache() function.
+	 * Test if {@link ZookeeperRegistry#getAllSwitches()} returns correct list of all switches.
+	 * Switches are injected in {@link ZookeeperRegistryTest#setPathChildrenCache()} function.
 	 * @throws Exception
 	 */
 	@Test
@@ -339,7 +338,7 @@
 	}
 
 	/**
-	 * Test if allocateUniqueIdBlock() can assign IdBlock without duplication.
+	 * Test if {@link ZookeeperRegistry#allocateUniqueIdBlock()} can assign IdBlock without duplication.
 	 */
 	@Test
 	public void testAllocateUniqueIdBlock() {
@@ -374,20 +373,21 @@
 		}
 	}
 	
+	
+	//-------------------------- Creation of mock objects --------------------------
 	/**
-	 * Create mock CuratorFramework object with initial value below.
-	 *   [Ctrl ID]    : [DPID]
-	 * controller1    :  1000
-	 * controller2    :  1001
-	 * controller2    :  1002
+	 * Create mock {@link CuratorFramework} object with initial value below.<br>
+	 *   [Ctrl ID]    : [DPID]<br>
+	 * controller1    :  1000<br>
+	 * controller2    :  1001<br>
+	 * controller2    :  1002<br>
 	 * controller2013 : nothing
 	 * @return Created mock object
 	 * @throws Exception
 	 */
-	@SuppressWarnings("serial")
+	@SuppressWarnings({ "serial", "unchecked" })
 	private CuratorFramework createCuratorFrameworkMock() throws Exception {
 		// Mock of AtomicValue
-		@SuppressWarnings("unchecked")
 		AtomicValue<Long> atomicValue = EasyMock.createMock(AtomicValue.class);
 		EasyMock.expect(atomicValue.succeeded()).andReturn(true).anyTimes();
 		EasyMock.expect(atomicValue.preValue()).andAnswer(new IAnswer<Long>() {
@@ -408,7 +408,7 @@
 		}).anyTimes();
 		EasyMock.replay(atomicValue);
 		
-		// Mock of DistributedAtomicLong
+		// Mock DistributedAtomicLong
 		DistributedAtomicLong daLong = EasyMock.createMock(DistributedAtomicLong.class);
 		EasyMock.expect(daLong.add(EasyMock.anyLong())).andReturn(atomicValue).anyTimes();
 		EasyMock.replay(daLong);
@@ -418,8 +418,7 @@
 				andReturn(daLong).anyTimes();
 		PowerMock.replay(DistributedAtomicLong.class);
 		
-		// Mock of ListenerContainer
-		@SuppressWarnings("unchecked")
+		// Mock ListenerContainer
 		ListenerContainer<PathChildrenCacheListener> listenerContainer = EasyMock.createMock(ListenerContainer.class);
 		listenerContainer.addListener(EasyMock.anyObject(PathChildrenCacheListener.class));
 		EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
@@ -431,13 +430,13 @@
 		}).once();
 		EasyMock.replay(listenerContainer);
 
-		// Mock of PathChildrenCache
+		// Mock PathChildrenCache
 		PathChildrenCache pathChildrenCacheMain = createPathChildrenCacheMock(CONTROLLER_ID, new String[] {"/switches"}, listenerContainer);
 		PathChildrenCache pathChildrenCache1 = createPathChildrenCacheMock("controller1", new String[] {HexString.toHexString(1000L)}, listenerContainer);
 		PathChildrenCache pathChildrenCache2 = createPathChildrenCacheMock("controller2", new String[] { 
 			HexString.toHexString(1001L), HexString.toHexString(1002L) },listenerContainer);
 		
-		// Mock of PathChildrenCache constructor
+		// Mock PathChildrenCache constructor
 		PowerMock.expectNew(PathChildrenCache.class,
 				EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyBoolean()).
 				andReturn(pathChildrenCacheMain).once();
@@ -449,8 +448,7 @@
 				andReturn(pathChildrenCache2).anyTimes();
 		PowerMock.replay(PathChildrenCache.class);
 		
-		// Mock of ServiceCache
-		@SuppressWarnings("unchecked")
+		// Mock ServiceCache
 		ServiceCache<ControllerService> serviceCache = EasyMock.createMock(ServiceCache.class);
 		serviceCache.start();
 		EasyMock.expectLastCall().once();
@@ -460,15 +458,13 @@
 		}}).anyTimes();
 		EasyMock.replay(serviceCache);
 		
-		// Mock of ServiceCacheBuilder
-		@SuppressWarnings("unchecked")
+		// Mock ServiceCacheBuilder
 		ServiceCacheBuilder<ControllerService> serviceCacheBuilder = EasyMock.createMock(ServiceCacheBuilder.class);
 		EasyMock.expect(serviceCacheBuilder.name(EasyMock.anyObject(String.class))).andReturn(serviceCacheBuilder).once();
 		EasyMock.expect(serviceCacheBuilder.build()).andReturn(serviceCache).once();
 		EasyMock.replay(serviceCacheBuilder);
 
-		// Mock of ServiceDiscovery
-		@SuppressWarnings("unchecked")
+		// Mock ServiceDiscovery
 		ServiceDiscovery<ControllerService> serviceDiscovery = EasyMock.createMock(ServiceDiscovery.class);
 		serviceDiscovery.start();
 		EasyMock.expectLastCall().once();
@@ -477,15 +473,14 @@
 		EasyMock.expectLastCall().once();
 		EasyMock.replay(serviceDiscovery);
 		
-		// Mock of CuratorFramework
+		// Mock CuratorFramework
 		CuratorFramework client = EasyMock.createMock(CuratorFramework.class);
 		client.start();
 		EasyMock.expectLastCall().once();
 		EasyMock.expect(client.usingNamespace(EasyMock.anyObject(String.class))).andReturn(client);
 		EasyMock.replay(client);
 
-		// Mock of ServiceDiscoveryBuilder
-		@SuppressWarnings("unchecked")
+		// Mock ServiceDiscoveryBuilder
 		ServiceDiscoveryBuilder<ControllerService> builder = EasyMock.createMock(ServiceDiscoveryBuilder.class);
 		EasyMock.expect(builder.client(client)).andReturn(builder).once();
 		EasyMock.expect(builder.basePath(EasyMock.anyObject(String.class))).andReturn(builder);
@@ -500,9 +495,9 @@
 	}
 	
 	/**
-	 * Create mock ServiceInstance object using given controller ID.
-	 * @param controllerId Controller ID to represent instance's payload (ControllerSeervice).
-	 * @return
+	 * Create mock {@link ServiceInstance} object using given controller ID.
+	 * @param controllerId Controller ID to represent instance's payload (ControllerService).
+	 * @return Mock ServiceInstance object
 	 */
 	private ServiceInstance<ControllerService> createServiceInstanceMock(String controllerId) {
 		ControllerService controllerService = EasyMock.createMock(ControllerService.class);
@@ -518,11 +513,11 @@
 	}
 	
 	/**
-	 * Create mock PathChildrenCache using given controller ID and DPIDs.
+	 * Create mock {@link PathChildrenCache} using given controller ID and DPIDs.
 	 * @param controllerId Controller ID to represent current data.
 	 * @param paths List of HexString indicating switch's DPID.
 	 * @param listener Callback object to be set as Listenable.
-	 * @return
+	 * @return Mock PathChildrenCache object
 	 * @throws Exception
 	 */
 	private PathChildrenCache createPathChildrenCacheMock(final String controllerId, final String [] paths,
@@ -549,11 +544,11 @@
 	}
 	
 	/**
-	 * Create mock ChildData for {@link PathChildrenCache#getCurrentData()} return value.
+	 * Create mock {@link ChildData} for {@link PathChildrenCache#getCurrentData()} return value.
 	 * This object need to include 'sequence number' in tail of path string. ("-0" means 0th sequence)
 	 * @param controllerId Controller ID
 	 * @param path HexString indicating switch's DPID
-	 * @return
+	 * @return Mock ChildData object
 	 */
 	private ChildData createChildDataMockForCurrentData(String controllerId, String path) {
 		ChildData data = EasyMock.createMock(ChildData.class);
@@ -570,21 +565,21 @@
 	 */
 	private void setPathChildrenCache() throws Exception {
 		pathChildrenCacheListener.childEvent(client,
-				createChildDataEventMock("controller1", HexString.toHexString(1000L), PathChildrenCacheEvent.Type.CHILD_ADDED));
+				createChildrenCacheEventMock("controller1", HexString.toHexString(1000L), PathChildrenCacheEvent.Type.CHILD_ADDED));
 		pathChildrenCacheListener.childEvent(client,
-				createChildDataEventMock("controller2", HexString.toHexString(1001L), PathChildrenCacheEvent.Type.CHILD_ADDED));
+				createChildrenCacheEventMock("controller2", HexString.toHexString(1001L), PathChildrenCacheEvent.Type.CHILD_ADDED));
 		pathChildrenCacheListener.childEvent(client,
-				createChildDataEventMock("controller2", HexString.toHexString(1002L), PathChildrenCacheEvent.Type.CHILD_ADDED));
+				createChildrenCacheEventMock("controller2", HexString.toHexString(1002L), PathChildrenCacheEvent.Type.CHILD_ADDED));
 	}
 
 	/**
-	 * Create mock ChildDataEvent object using given controller ID and DPID.
+	 * Create mock {@link PathChildrenCacheEvent} object using given controller ID and DPID.
 	 * @param controllerId Controller ID.
 	 * @param path HexString of DPID.
 	 * @param type Event type to be set to mock object.
-	 * @return
+	 * @return Mock PathChildrenCacheEvent object
 	 */
-	private PathChildrenCacheEvent createChildDataEventMock(String controllerId, String path,
+	private PathChildrenCacheEvent createChildrenCacheEventMock(String controllerId, String path,
 			PathChildrenCacheEvent.Type type) {
 		PathChildrenCacheEvent event = EasyMock.createMock(PathChildrenCacheEvent.class);
 		ChildData data = EasyMock.createMock(ChildData.class);
