diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java
index c14d00c..27521f9 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java
@@ -128,12 +128,14 @@
 	if ( measureONOSFlowTimeProp ) {
 		startSettingFlowPathProps = System.nanoTime();
 	}
+
+	FlowPathProperty flowProp = new FlowPathProperty(dbHandler, flowObj);
+
 	//
 	// Set the Flow key:
 	// - flowId
 	//
-	flowObj.setFlowId(flowPath.flowId().toString());
-	flowObj.setType("flow");
+	flowProp.setFlowId(flowPath.flowId().toString());
 	if ( measureONOSFlowTimeProp ) {
 	    numPropsSet += 2;
 	}
@@ -161,101 +163,103 @@
 	// - flowPath.matchDstTcpUdpPort()
 	// - flowPath.flowEntryActions()
 	//
-	flowObj.setInstallerId(flowPath.installerId().toString());
-	flowObj.setFlowPathType(flowPath.flowPathType().toString());
-	flowObj.setFlowPathUserState(flowPath.flowPathUserState().toString());
-	flowObj.setFlowPathFlags(flowPath.flowPathFlags().flags());
-	flowObj.setIdleTimeout(flowPath.idleTimeout());
-	flowObj.setHardTimeout(flowPath.hardTimeout());
-	flowObj.setSrcSwitch(flowPath.dataPath().srcPort().dpid().toString());
-	flowObj.setSrcPort(flowPath.dataPath().srcPort().port().value());
-	flowObj.setDstSwitch(flowPath.dataPath().dstPort().dpid().toString());
-	flowObj.setDstPort(flowPath.dataPath().dstPort().port().value());
+	flowProp.setInstallerId(flowPath.installerId().toString());
+	flowProp.setFlowPathType(flowPath.flowPathType().toString());
+	flowProp.setFlowPathUserState(flowPath.flowPathUserState().toString());
+	flowProp.setFlowPathFlags(flowPath.flowPathFlags().flags());
+	flowProp.setIdleTimeout(flowPath.idleTimeout());
+	flowProp.setHardTimeout(flowPath.hardTimeout());
+	flowProp.setSrcSwitch(flowPath.dataPath().srcPort().dpid().toString());
+	flowProp.setSrcPort(flowPath.dataPath().srcPort().port().value());
+	flowProp.setDstSwitch(flowPath.dataPath().dstPort().dpid().toString());
+	flowProp.setDstPort(flowPath.dataPath().dstPort().port().value());
 	if ( measureONOSFlowTimeProp ) {
 	    numPropsSet += 10;
 	}
 
 	if (flowPath.flowEntryMatch().matchSrcMac()) {
-	    flowObj.setMatchSrcMac(flowPath.flowEntryMatch().srcMac().toString());
+	    flowProp.setMatchSrcMac(flowPath.flowEntryMatch().srcMac().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchDstMac()) {
-	    flowObj.setMatchDstMac(flowPath.flowEntryMatch().dstMac().toString());
+	    flowProp.setMatchDstMac(flowPath.flowEntryMatch().dstMac().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchEthernetFrameType()) {
-	    flowObj.setMatchEthernetFrameType(flowPath.flowEntryMatch().ethernetFrameType());
+	    flowProp.setMatchEthernetFrameType(flowPath.flowEntryMatch().ethernetFrameType());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchVlanId()) {
-	    flowObj.setMatchVlanId(flowPath.flowEntryMatch().vlanId());
+	    flowProp.setMatchVlanId(flowPath.flowEntryMatch().vlanId());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchVlanPriority()) {
-	    flowObj.setMatchVlanPriority(flowPath.flowEntryMatch().vlanPriority());
+	    flowProp.setMatchVlanPriority(flowPath.flowEntryMatch().vlanPriority());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchSrcIPv4Net()) {
-	    flowObj.setMatchSrcIPv4Net(flowPath.flowEntryMatch().srcIPv4Net().toString());
+	    flowProp.setMatchSrcIPv4Net(flowPath.flowEntryMatch().srcIPv4Net().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchDstIPv4Net()) {
-	    flowObj.setMatchDstIPv4Net(flowPath.flowEntryMatch().dstIPv4Net().toString());
+	    flowProp.setMatchDstIPv4Net(flowPath.flowEntryMatch().dstIPv4Net().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchIpProto()) {
-	    flowObj.setMatchIpProto(flowPath.flowEntryMatch().ipProto());
+	    flowProp.setMatchIpProto(flowPath.flowEntryMatch().ipProto());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchIpToS()) {
-	    flowObj.setMatchIpToS(flowPath.flowEntryMatch().ipToS());
+	    flowProp.setMatchIpToS(flowPath.flowEntryMatch().ipToS());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchSrcTcpUdpPort()) {
-	    flowObj.setMatchSrcTcpUdpPort(flowPath.flowEntryMatch().srcTcpUdpPort());
+	    flowProp.setMatchSrcTcpUdpPort(flowPath.flowEntryMatch().srcTcpUdpPort());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchDstTcpUdpPort()) {
-	    flowObj.setMatchDstTcpUdpPort(flowPath.flowEntryMatch().dstTcpUdpPort());
+	    flowProp.setMatchDstTcpUdpPort(flowPath.flowEntryMatch().dstTcpUdpPort());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (! flowPath.flowEntryActions().actions().isEmpty()) {
-	    flowObj.setActions(flowPath.flowEntryActions().toString());
+	    flowProp.setActions(flowPath.flowEntryActions().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
-	flowObj.setDataPathSummary(flowPath.dataPath().dataPathSummary());
+	flowProp.setDataPathSummary(flowPath.dataPath().dataPathSummary());
 	if ( measureONOSFlowTimeProp ) {
 	    ++numPropsSet;
 	}
 
 	if (found)
-	    flowObj.setFlowPathUserState("FP_USER_MODIFY");
+	    flowProp.setFlowPathUserState("FP_USER_MODIFY");
 	else
-	    flowObj.setFlowPathUserState("FP_USER_ADD");
+	    flowProp.setFlowPathUserState("FP_USER_ADD");
+
+	flowProp.commitProperties();
 
 	if ( measureONOSFlowTimeProp ) {
 	    ++numPropsSet;
@@ -852,6 +856,7 @@
 	//
 	// Extract the Flow state
 	//
+    log.info("extractFlowPath: start");
 	String flowIdStr = flowObj.getFlowId();
 	String installerIdStr = flowObj.getInstallerId();
 	String flowPathType = flowObj.getFlowPathType();
@@ -875,7 +880,8 @@
 	    (srcPortShort == null) ||
 	    (dstSwitchStr == null) ||
 	    (dstPortShort == null)) {
-	    // TODO: A work-around, becauuse of some bogus database objects
+	    // TODO: A work-around, because of some bogus database objects
+	    log.error("extractFlowPath: wrong properties");
 	    return null;
 	}
 
@@ -954,6 +960,7 @@
 	    flowPath.dataPath().flowEntries().add(flowEntry);
 	}
 
+    log.info("extractFlowPath: end");
 	return flowPath;
     }
 
@@ -964,9 +971,12 @@
      * @return the extracted Flow Entry State.
      */
     public static FlowEntry extractFlowEntry(IFlowEntry flowEntryObj) {
+	log.info("extractFlowEntry: start");
 	IFlowPath flowObj = flowEntryObj.getFlow();
-	if (flowObj == null)
+	if (flowObj == null) {
+		log.error("extractFlowEntry: no flowPath exists");
 	    return null;
+	}
 
 	String flowIdStr = flowObj.getFlowId();
 	//
@@ -985,6 +995,7 @@
 	    (userState == null) ||
 	    (switchState == null)) {
 	    // TODO: A work-around, because of some bogus database objects
+		log.error("extractFlowEntry: wrong properties");
 	    return null;
 	}
 
@@ -1050,6 +1061,7 @@
 	//
 	// TODO: Take care of FlowEntryErrorState.
 	//
+	log.info("extractFlowEntry: end");
 	return flowEntry;
     }
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowPathProperty.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowPathProperty.java
new file mode 100644
index 0000000..c6a2b98
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowPathProperty.java
@@ -0,0 +1,126 @@
+package net.onrc.onos.ofcontroller.flowmanager;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.onrc.onos.graph.DBOperation;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
+
+public class FlowPathProperty {
+	private Map<String, Object> map = new HashMap<>();
+	private DBOperation dbhandler;
+	private IFlowPath flowPath;
+
+	public FlowPathProperty(DBOperation dbHandler, IFlowPath flowPath) {
+		this.dbhandler = dbHandler;
+		this.flowPath = flowPath;
+	}
+
+	public void setType(String typeStr) {
+		map.put("type", typeStr);
+	}
+
+	public void setFlowId(String flowId) {
+		map.put("flow_id", flowId);
+	}
+
+	public void setInstallerId(String installerId) {
+		map.put("installer_id", installerId);
+	}
+
+	public void setFlowPathType(String flowPathType) {
+		map.put("flow_path_type", flowPathType);
+	}
+
+	public void setFlowPathUserState(String userState) {
+		map.put("user_state", userState);
+	}
+
+	public void setFlowPathFlags(Long flowPathFlags) {
+		map.put("flow_path_flags", flowPathFlags);
+	}
+
+	public void setIdleTimeout(Integer idleTimeout) {
+		map.put("idle_timeout", idleTimeout);
+	}
+
+	public void setHardTimeout(Integer hardTimeout) {
+		map.put("hard_timeout", hardTimeout);
+	}
+
+	public void setSrcSwitch(String srcSwitch) {
+		map.put("src_switch", srcSwitch);
+	}
+
+	public void setSrcPort(Short srcPort) {
+		map.put("src_port", srcPort);
+	}
+
+	public void setDstSwitch(String dstSwitch) {
+		map.put("dst_switch", dstSwitch);
+	}
+
+	public void setDstPort(Short dstPort) {
+		map.put("dst_port", dstPort);
+	}
+
+	public void setDataPathSummary(String dataPathSummary) {
+		map.put("data_path_summary", dataPathSummary);
+	}
+
+	public void setMatchSrcMac(String matchSrcMac) {
+		map.put("matchSrcMac", matchSrcMac);
+	}
+
+	public void setMatchDstMac(String matchDstMac) {
+		map.put("matchDstMac", matchDstMac);
+	}
+
+	public void setMatchEthernetFrameType(Short matchEthernetFrameType) {
+		map.put("matchEthernetFrameType", matchEthernetFrameType);
+	}
+
+	public void setMatchVlanId(Short matchVlanId) {
+		map.put("matchVlanId", matchVlanId);
+	}
+
+	public void setMatchVlanPriority(Byte matchVlanPriority) {
+		map.put("matchVlanPriority", matchVlanPriority);
+	}
+
+	public void setMatchSrcIPv4Net(String matchSrcIPv4Net) {
+		map.put("matchSrcIPv4Net", matchSrcIPv4Net);
+	}
+
+	public void setMatchDstIPv4Net(String matchDstIPv4Net) {
+		map.put("matchDstIPv4Net", matchDstIPv4Net);
+	}
+
+	public void setMatchIpProto(Byte matchIpProto) {
+		map.put("matchIpProto", matchIpProto);
+	}
+
+	public void setMatchIpToS(Byte matchIpToS) {
+		map.put("matchIpToS", matchIpToS);
+	}
+
+	public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort) {
+		map.put("matchSrcTcpUdpPort", matchSrcTcpUdpPort);
+	}
+
+	public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort) {
+		map.put("matchDstTcpUdpPort", matchDstTcpUdpPort);
+	}
+
+	public void setActions(String actionsStr) {
+		map.put("actions", actionsStr);
+	}
+    
+    /**
+     *
+     * @param dbhandler
+     */
+    public void commitProperties() {
+        dbhandler.setVertexProperties(flowPath.asVertex() ,map);
+    }
+}
