diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
index d94cdfa..96ea216 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/NodeWritable.java
@@ -171,7 +171,8 @@
             BtoA &= DIR_MASK;
             BtoC &= DIR_MASK;
             byte AtoB = mirrorEdge(BtoA);
-            // two rules apply: 
+            // a valid path must exist from A to C
+            // specifically, two rules apply for AtoB and BtoC
             //      1) the internal letters must be the same (so FF, RF will be an error)
             //      2) the final direction is the 1st letter of AtoB + 2nd letter of BtoC
             // TODO? maybe we could use the string version to resolve this following above rules
diff --git a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
index 085c825..d24d208 100644
--- a/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
+++ b/genomix/genomix-pregelix/src/main/java/edu/uci/ics/genomix/pregelix/operator/pathmerge/P4ForPathMergeVertex.java
@@ -30,7 +30,7 @@
 public class P4ForPathMergeVertex extends
     BasicPathMergeVertex<VertexValueWritable, PathMergeMessageWritable> {
     
-    private static final Logger LOG = Logger.getLogger(P4ForPathMergeVertex.class.getName());
+//    private static final Logger LOG = Logger.getLogger(P4ForPathMergeVertex.class.getName());
     
     private static long randSeed = 1; //static for save memory
     private float probBeingRandomHead = -1;
@@ -91,18 +91,32 @@
     public void restrictNeighbors() {
         EnumSet<DIR> dirsToRestrict;
         VertexValueWritable vertex = getVertexValue();
+        short state = vertex.getState();
+        boolean updated = false;
         if(isTandemRepeat(vertex)) {
             // tandem repeats are not allowed to merge at all
             dirsToRestrict = EnumSet.of(DIR.NEXT, DIR.PREVIOUS);
+            state |= DIR.NEXT.get() | DIR.PREVIOUS.get();  // tandem repeats are excluded from any merging
+            updated = true;
         }
         else {
             // degree > 1 can't merge in that direction
             dirsToRestrict = EnumSet.noneOf(DIR.class);
             for (DIR dir : DIR.values()) {
-                if (vertex.getDegree(dir) > 1)
+                if (vertex.getDegree(dir) > 1 || vertex.getDegree(dir) == 0) {
                     dirsToRestrict.add(dir);
+                    state |= dir.get();
+                    updated = true;
+                }
             }
         }
+        if (updated) {
+            vertex.setState(state);
+            if (DIR.enumSetFromByte(state).containsAll(EnumSet.allOf(DIR.class)))
+            	voteToHalt();
+            else 
+            	activate();
+        }
         
         // send a message to each neighbor indicating they can't merge towards me
         for (DIR dir : dirsToRestrict) {
@@ -111,7 +125,7 @@
                     outgoingMsg.reset();
 //                    outgoingMsg.setFlag(dir.mirror().get());
                     outgoingMsg.setFlag(DirectionFlag.dirFromEdgeType(DirectionFlag.mirrorEdge(d)).get());
-                    LOG.info("send restriction from " + getVertexId() + " to " + destId + " in my " + d + " and their " + DirectionFlag.mirrorEdge(d) + " (" + DirectionFlag.dirFromEdgeType(DirectionFlag.mirrorEdge(d)) + "); I am " + getVertexValue());
+//                    LOG.info("send restriction from " + getVertexId() + " to " + destId + " in my " + d + " and their " + DirectionFlag.mirrorEdge(d) + " (" + DirectionFlag.dirFromEdgeType(DirectionFlag.mirrorEdge(d)) + "); I am " + getVertexValue());
                     sendMsg(destId, outgoingMsg);
                 }
             }
@@ -122,19 +136,19 @@
      * initiate head, rear and path node
      */
     public void recieveRestrictions(Iterator<PathMergeMessageWritable> msgIterator) {
-        short restrictedDirs = 0;
+        short restrictedDirs = 0;  // the directions (NEXT/PREVIOUS) that I'm not allowed to merge in
         while (msgIterator.hasNext()) {
-            LOG.info("before restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
+//            LOG.info("before restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
             incomingMsg = msgIterator.next();
             restrictedDirs |= incomingMsg.getFlag();
-            LOG.info("after restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
+//            LOG.info("after restriction " + getVertexId() + ": " + DIR.fromByte(restrictedDirs));
             activate();
         }
         // special case: tandem repeats cannot merge at all
         if (isTandemRepeat(getVertexValue())) {
             restrictedDirs |= DIR.PREVIOUS.get();
             restrictedDirs |= DIR.NEXT.get();
-            LOG.info("after tandem repeat restriction: " + DIR.fromByte(restrictedDirs));
+//            LOG.info("after tandem repeat restriction: " + DIR.fromByte(restrictedDirs));
             voteToHalt();
         }
         getVertexValue().setState(restrictedDirs);
@@ -157,7 +171,7 @@
         VertexValueWritable vertex = getVertexValue();
         EnumSet<DIR> restrictedDirs = DIR.enumSetFromByte(vertex.getState());
         // NEXT restricted by neighbor or by my edges? 
-        if (restrictedDirs.contains(DIR.NEXT) || vertex.outDegree() != 1) {
+        if (restrictedDirs.contains(DIR.NEXT) || vertex.outDegree() != 1) { // TODO should I restrict based on degree in the first iteration?
             hasNext = false;
         } else {
             hasNext = true;
@@ -220,11 +234,11 @@
                 }
             }
         }
-        if ((getVertexValue().getState() & P4State.MERGE) == 0) {
-            LOG.info("No merge for " + getVertexId());
-        } else {
-            LOG.info("Merge from " + getVertexId() + " towards " + (getVertexValue().getState() & DirectionFlag.DIR_MASK) + "; node is " + getVertexValue());
-        }
+//        if ((getVertexValue().getState() & P4State.MERGE) == 0) {
+//            LOG.info("No merge for " + getVertexId());
+//        } else {
+//            LOG.info("Merge from " + getVertexId() + " towards " + (getVertexValue().getState() & DirectionFlag.DIR_MASK) + "; node is " + getVertexValue());
+//        }
     }
     
     public void updateNeighbors() {
@@ -238,7 +252,7 @@
         byte[] mergeEdges = NodeWritable.edgeTypesInDir(mergeDir);
         
         DIR updateDir = mergeDir.mirror();
-        byte[] updateEdges = NodeWritable.edgeTypesInDir(updateDir);
+        byte[] updateEdges = NodeWritable.edgeTypesInDir(updateDir); // 
         
         // prepare the update message s.t. the receiver can do a simple unionupdate
         // that means we figure out any hops and place our merge-dir edges in the appropriate list of the outgoing msg
@@ -253,7 +267,7 @@
             
             // send the update to all kmers in this list // TODO perhaps we could skip all this if there are no neighbors here
             for (VKmerBytesWritable dest : vertex.getEdgeList(updateEdge).getKeys()) {
-                LOG.info("send update message from " + getVertexId() + " to " + dest + ": " + outgoingMsg);
+//                LOG.info("send update message from " + getVertexId() + " to " + dest + ": " + outgoingMsg);
                 sendMsg(dest, outgoingMsg);
             }
         }
@@ -263,7 +277,7 @@
         VertexValueWritable vertex = getVertexValue(); 
         NodeWritable node = vertex.getNode();
         while (msgIterator.hasNext()) {
-            LOG.info("before update from neighbor: " + getVertexValue());
+//            LOG.info("before update from neighbor: " + getVertexValue());
             incomingMsg = msgIterator.next();
             // remove the edge to the node that will merge elsewhere
             node.getEdgeList((byte)(incomingMsg.getFlag() & DirectionFlag.DIR_MASK)).remove(incomingMsg.getSourceVertexId());
@@ -271,7 +285,7 @@
             for (byte dir : DirectionFlag.values) {
                 node.getEdgeList(dir).unionUpdate(incomingMsg.getEdgeList(dir));
             }
-            LOG.info("after update from neighbor: " + getVertexValue());
+//            LOG.info("after update from neighbor: " + getVertexValue());
         }
         checkNeighbors();
         if (!hasNext && !hasPrev)
@@ -295,10 +309,10 @@
             if (vertex.getDegree(DirectionFlag.dirFromEdgeType(mergeDir)) != 1)
                 throw new IllegalStateException("Merge attempted in node with degree in " + mergeDir + " direction != 1!\n" + vertex);
             VKmerBytesWritable dest = vertex.getEdgeList(mergeDir).get(0).getKey();
-            LOG.info("send merge mesage from " + getVertexId() + " to " + dest + ": " + outgoingMsg + "; my restrictions are: " + DIR.enumSetFromByte(vertex.getState()) + ", their restrictions are: " + DIR.enumSetFromByte(outgoingMsg.getFlag()));
+//            LOG.info("send merge mesage from " + getVertexId() + " to " + dest + ": " + outgoingMsg + "; my restrictions are: " + DIR.enumSetFromByte(vertex.getState()) + ", their restrictions are: " + DIR.enumSetFromByte(outgoingMsg.getFlag()));
             sendMsg(dest, outgoingMsg);
             
-            LOG.info("killing self: " + getVertexId());
+//            LOG.info("killing self: " + getVertexId());
             deleteVertex(getVertexId());
         }
     }
@@ -313,13 +327,13 @@
         byte senderDir;
         int numMerged = 0;
         while (msgIterator.hasNext()) {
-            LOG.info("before merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
+//            LOG.info("before merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
             incomingMsg = msgIterator.next();
             senderDir = (byte) (incomingMsg.getFlag() & DirectionFlag.DIR_MASK);
             node.mergeWithNode(senderDir, incomingMsg.getNode());
             state |= (byte) (incomingMsg.getFlag() & DIR.MASK);  // update incoming restricted directions
             numMerged++;
-            LOG.info("after merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
+//            LOG.info("after merge: " + getVertexValue() + " restrictions: " + DIR.enumSetFromByte(state));
         }
         if(isTandemRepeat(getVertexValue())) {
             state |= (DIR.NEXT.get() | DIR.PREVIOUS.get());  // tandem repeats can't merge anymore
@@ -333,9 +347,9 @@
     @Override
     public void compute(Iterator<PathMergeMessageWritable> msgIterator) {
         initVertex();
-        if (getSuperstep() >= 4) {
-            LOG.info("test");
-        }
+//        if (getSuperstep() >= 4) {
+//            LOG.info("test");
+//        }
             
         if (getSuperstep() == 1) {
             restrictNeighbors();
