diff --git a/src/main/java/net/onrc/onos/datastore/RCObject.java b/src/main/java/net/onrc/onos/datastore/RCObject.java
index 100cbd9..23a2139 100644
--- a/src/main/java/net/onrc/onos/datastore/RCObject.java
+++ b/src/main/java/net/onrc/onos/datastore/RCObject.java
@@ -367,6 +367,10 @@
 	public OPS getOp() {
 	    return op;
 	}
+
+	public STATUS getStatus() {
+	    return status;
+	}
     }
 
     public static boolean multiWrite(Collection<WriteOp> objects) {
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java b/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java
index 08fe458..a431490 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java
@@ -57,6 +57,27 @@
 	        .array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	byte[] mac = getMacFromKey(key);
+	return "D" + ByteArrayUtil.toHexStringBuffer(mac, ":");
+    }
+
     public static byte[] getMacFromKey(byte[] key) {
 	ByteBuffer keyBuf = ByteBuffer.wrap(key);
 	if (keyBuf.getChar() != 'D') {
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCLink.java b/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
index eec6a10..caf446d 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
@@ -1,10 +1,12 @@
 package net.onrc.onos.datastore.topology;
 
 import java.nio.ByteBuffer;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
+import org.openflow.util.HexString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,6 +86,28 @@
 	        .put(RCPort.getPortID(dst_dpid, dst_port_no)).array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	long[] tuple = getLinkTupleFromKey(key);
+	return "L" + "S" + HexString.toHexString(tuple[0]) + "P" + tuple[1]
+	        + "S" + HexString.toHexString(tuple[2]) + "P" + tuple[3];
+    }
+
     public static long[] getLinkTupleFromKey(byte[] key) {
 	return getLinkTupleFromKey(ByteBuffer.wrap(key));
     }
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCPort.java b/src/main/java/net/onrc/onos/datastore/topology/RCPort.java
index 1bbb3eb..b1f3bef 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCPort.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCPort.java
@@ -10,6 +10,7 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.openflow.util.HexString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,6 +82,27 @@
 	        .putChar('P').putLong(number).array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	long[] pair = getPortPairFromKey(key);
+	return "S" + HexString.toHexString(pair[0]) + "P" + pair[1];
+    }
+
     public static long[] getPortPairFromKey(byte[] key) {
 	return getPortPairFromKey(ByteBuffer.wrap(key));
 
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java b/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
index 6858e68..2b4fb07 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
@@ -14,6 +14,7 @@
 import net.onrc.onos.datastore.RCTable;
 import net.onrc.onos.datastore.utils.ByteArrayComparator;
 
+import org.openflow.util.HexString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,6 +77,26 @@
 	        .array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	return "S" + HexString.toHexString(getDpidFromKey(key));
+    }
+
     public static long getDpidFromKey(byte[] key) {
 	return getDpidFromKey(ByteBuffer.wrap(key));
     }
@@ -326,7 +347,8 @@
 	sw1.addPortId(sw1p2.getId());
 	try {
 	    sw1.update();
-	    log.debug("Update {} - {}", sw1, sw1.getAllPortIds());
+	    log.debug("Update {} - {}", sw1,
+		    RCPort.keysToSB(sw1.getAllPortIds()));
 	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.error("Switch update failed", e);
 	}
@@ -364,11 +386,17 @@
 	d2.addPortId(sw2p2.getId());
 	sw2p2.addDeviceId(d2.getId());
 
-	boolean failed = RCObject.multiWrite(Arrays.asList(
+	// XXX Collection created by Arrays.asList needs to be stored, so that
+	// which operation failed
+	Collection<WriteOp> groupOp = Arrays.asList(
 	        RCObject.WriteOp.Create(sw2), RCObject.WriteOp.Create(sw2p1),
-	        RCObject.WriteOp.Create(sw2p2), RCObject.WriteOp.Create(d2)));
+	        RCObject.WriteOp.Create(sw2p2), RCObject.WriteOp.Create(d2));
+	boolean failed = RCObject.multiWrite(groupOp);
 	if (failed) {
-	    log.error("One of Switch/Port/Device creation failed");
+	    log.error("Some of Switch/Port/Device creation failed");
+	    for ( WriteOp op : groupOp ) {
+		log.debug("{} - Result:{}", op.getObject(), op.getStatus() );
+	    }
 	} else {
 	    log.debug("Create {} Version:{}", sw2, sw2.getVersion());
 	    log.debug("Create {} Version:{}", sw2p1, sw2p1.getVersion());
@@ -426,16 +454,16 @@
 	    try {
 		port.read();
 		assert (port.getDpid() == 0x1L);
-		log.debug("{} - LinkIDs:{} DeviceIDs:{}",
-		        port, port.getAllLinkIds(),
-		        port.getAllDeviceIds());
+		log.debug("{} - LinkIDs:{} DeviceIDs:{}", port,
+		        RCLink.keysToSB(port.getAllLinkIds()),
+		        RCDevice.keysToSB(port.getAllDeviceIds()));
 
 		for (byte[] deviceId : port.getAllDeviceIds()) {
 		    RCDevice device = RCDevice.createFromKey(deviceId);
 		    try {
 			device.read();
 			log.debug("{} - PortIDs:{}", device,
-			        device.getAllPortIds());
+			        RCPort.keysToSB(device.getAllPortIds()));
 		    } catch (ObjectDoesntExistException e) {
 			log.error("Reading Device failed", e);
 		    }
@@ -472,16 +500,16 @@
 	    try {
 		port.read();
 		assert (port.getDpid() == 0x2L);
-		log.debug("{} - LinkIDs:{} DeviceIDs:{}",
-		        port, port.getAllLinkIds(),
-		        port.getAllDeviceIds());
+		log.debug("{} - LinkIDs:{} DeviceIDs:{}", port,
+		        RCLink.keysToSB(port.getAllLinkIds()),
+		        RCDevice.keysToSB(port.getAllDeviceIds()));
 
 		for (byte[] deviceId : port.getAllDeviceIds()) {
 		    RCDevice device = RCDevice.createFromKey(deviceId);
 		    try {
 			device.read();
 			log.debug("{} - PortIDs:{}", device,
-			        device.getAllPortIds());
+			        RCPort.keysToSB(device.getAllPortIds()));
 		    } catch (ObjectDoesntExistException e) {
 			log.error("Reading Device failed", e);
 		    }
@@ -509,72 +537,40 @@
     private static void topology_delete() {
 	log.debug("topology_delete start.");
 
-	// TODO implement get all kind of API
-	RCSwitch sw1 = new RCSwitch(0x1L);
-	RCPort sw1p1 = new RCPort(0x1L, 1L);
-	RCPort sw1p2 = new RCPort(0x1L, 2L);
-	RCDevice d1 = new RCDevice(new byte[] { 0, 1, 2, 3, 4, 5, 6 });
-	RCLink l1 = new RCLink(0x1L, 2L, 0x2L, 1L);
-	RCSwitch sw2 = new RCSwitch(0x2L);
-	RCPort sw2p1 = new RCPort(0x2L, 1L);
-	RCPort sw2p2 = new RCPort(0x2L, 2L);
-	RCDevice d2 = new RCDevice(new byte[] { 6, 5, 4, 3, 2, 1, 0 });
-
-	try {
-	    sw1.read();
-	    sw1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Switch Failed", e);
-	}
-	try {
-	    sw1p1.read();
-	    sw1p1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    sw1p2.read();
-	    sw1p2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    d1.read();
-	    d1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Device Failed", e);
+	for (RCSwitch sw : RCSwitch.getAllSwitches()) {
+	    try {
+		sw.read();
+		sw.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Switch Failed", e);
+	    }
 	}
 
-	try {
-	    l1.read();
-	    l1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Link Failed", e);
+	for (RCPort p : RCPort.getAllPorts()) {
+	    try {
+		p.read();
+		p.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Port Failed", e);
+	    }
 	}
 
-	try {
-	    sw2.read();
-	    sw2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Switch Failed", e);
+	for (RCDevice d : RCDevice.getAllDevices()) {
+	    try {
+		d.read();
+		d.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Device Failed", e);
+	    }
 	}
-	try {
-	    sw2p1.read();
-	    sw2p1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    sw2p2.read();
-	    sw2p2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    d2.read();
-	    d2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Device Failed", e);
+
+	for (RCLink l : RCLink.getAllLinks()) {
+	    try {
+		l.read();
+		l.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Link Failed", e);
+	    }
 	}
 
 	log.debug("topology_delete end.");
