diff --git a/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java b/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java
index 8cd3c32..f93e4ae 100755
--- a/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java
+++ b/src/main/java/net/onrc/onos/intent/runtime/PathCalcRuntimeModule.java
@@ -174,10 +174,31 @@
 			// change states of high-level intents
 			IntentStateList states = new IntentStateList();
 			for (IntentOperation op : list) {
-				if (op.intent.getState().equals(IntentState.INST_ACK))
-					states.put(op.intent.getId(), IntentState.REROUTE_REQ);
-				if (op.intent.getState().equals(IntentState.CREATED))
-					states.put(op.intent.getId(), IntentState.INST_REQ); // XXX
+				switch (op.operator) {
+				case ADD:
+					switch (op.intent.getState()) {
+					case CREATED:
+						states.put(op.intent.getId(), IntentState.INST_REQ);
+						break;
+					case INST_ACK:
+						states.put(op.intent.getId(), IntentState.REROUTE_REQ);
+						break;
+					default:
+						break;
+					}
+					break;
+				case REMOVE:
+					switch (op.intent.getState()) {
+					case CREATED:
+						states.put(op.intent.getId(), IntentState.DEL_REQ);
+						break;
+					default:
+						break;
+					}
+					break;
+				default:
+					break;
+				}
 			}
 			highLevelIntents.changeStates(states);
 			p.log("end_updateInMemoryIntents");
diff --git a/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java b/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java
index f24fc99..5ac6027 100755
--- a/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java
+++ b/src/test/java/net/onrc/onos/intent/runtime/UseCaseTest.java
@@ -261,4 +261,41 @@
 		showResult((PathIntentMap) runtime1.getPathIntents());
 		// TODO: show results of plan computation
 	}
+
+
+	@Test
+	public void createAndRemoveShortestPaths() throws FloodlightModuleException {
+		// create shortest path intents
+		IntentOperationList opList = new IntentOperationList();
+		opList.add(Operator.ADD, new ShortestPathIntent("1", 1L, 12L, LOCAL_PORT, 2L, 21L, LOCAL_PORT));
+		opList.add(Operator.ADD, new ShortestPathIntent("2", 1L, 14L, LOCAL_PORT, 4L, 41L, LOCAL_PORT));
+		opList.add(Operator.ADD, new ShortestPathIntent("3", 2L, 23L, LOCAL_PORT, 3L, 32L, LOCAL_PORT));
+
+		// compile high-level intent operations into low-level intent operations (calculate paths)
+		PathCalcRuntimeModule runtime1 = new PathCalcRuntimeModule();
+		runtime1.init(modContext);
+		runtime1.startUp(modContext);
+		IntentOperationList pathIntentOpList = runtime1.executeIntentOperations(opList);
+
+		// compile low-level intents into flow entry installation plan
+		PlanCalcRuntime runtime2 = new PlanCalcRuntime();
+		List<Set<FlowEntry>> plan = runtime2.computePlan(pathIntentOpList);
+
+		// show results
+		showResult((PathIntentMap) runtime1.getPathIntents());
+		System.out.println(plan);
+
+		// create remove operations
+		opList.clear();
+		opList.add(Operator.REMOVE, new Intent("1"));
+		opList.add(Operator.REMOVE, new Intent("2"));
+
+		// compile
+		runtime1.executeIntentOperations(opList);
+
+		// show results
+		showResult((PathIntentMap) runtime1.getPathIntents());
+		System.out.println(plan);
+	}
+
 }
