diff --git a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/FileScanDescriptor.java b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/FileScanDescriptor.java
index d8f0122..ec71111 100644
--- a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/FileScanDescriptor.java
+++ b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/FileScanDescriptor.java
@@ -5,6 +5,8 @@
 import java.io.FileInputStream;
 import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.hadoop.fs.Path;
 
@@ -30,7 +32,6 @@
 
 	private static final long serialVersionUID = 1L;
 	private int k;
-	private Path[] filesplit = null;
 	private String pathSurfix;
 	private int byteNum;
 
@@ -52,7 +53,6 @@
 			Path[] inputPaths) {
 		super(jobSpec, 0, 1);
 		this.k = kmers;
-		this.filesplit = inputPaths;
 		this.pathSurfix = inputPaths[0].toString();
 		// recordDescriptors[0] = news RecordDescriptor(
 		// new ISerializerDeserializer[] {
@@ -75,7 +75,6 @@
 			private ByteBuffer outputBuffer;
 			private FrameTupleAppender outputAppender;
 
-			@SuppressWarnings("resource")
 			@Override
 			public void initialize() {
 
@@ -101,13 +100,12 @@
 						while (read != null) {
 							read = readsfile.readLine();
 							// if(count % 4 == 1)
-							SplitReads(read.getBytes(),writer);
-							// read.getBytes();
-							read = readsfile.readLine();
-
-							read = readsfile.readLine();
-
-							read = readsfile.readLine();
+							Pattern genePattern = Pattern.compile("[AGCT]+");
+							Matcher geneMatcher = genePattern.matcher(read);
+							boolean isValid = geneMatcher.matches();
+							if (isValid) {
+								SplitReads(read.getBytes(),writer);
+							}
 							// count += 1;
 							// System.err.println(count);
 						}
diff --git a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/ReadsKeyValueParserFactory.java b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/ReadsKeyValueParserFactory.java
index bc65204..1f0cd73 100644
--- a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/ReadsKeyValueParserFactory.java
+++ b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/ReadsKeyValueParserFactory.java
@@ -34,8 +34,6 @@
 	@Override
 	public IKeyValueParser<LongWritable, Text> createKeyValueParser(
 			final IHyracksTaskContext ctx) {
-		;
-
 		final ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(2);
 		final ByteBuffer outputBuffer = ctx.allocateFrame();
 		final FrameTupleAppender outputAppender = new FrameTupleAppender(
diff --git a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/Tester.java b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/Tester.java
index 35702cf..6256f86 100644
--- a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/Tester.java
+++ b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/Tester.java
@@ -140,30 +140,30 @@
 		nc1 = new NodeControllerService(ncConfig1);
 		nc1.start();
 
-		NCConfig ncConfig2 = new NCConfig();
-		ncConfig2.ccHost = "localhost";
-		ncConfig2.ccPort = 39001;
-		ncConfig2.clusterNetIPAddress = "127.0.0.1";
-		ncConfig2.dataIPAddress = "127.0.0.1";
-		ncConfig2.nodeId = NC2_ID;
-		nc2 = new NodeControllerService(ncConfig2);
-		nc2.start();
-		NCConfig ncConfig3 = new NCConfig();
-		ncConfig3.ccHost = "localhost";
-		ncConfig3.ccPort = 39001;
-		ncConfig3.clusterNetIPAddress = "127.0.0.1";
-		ncConfig3.dataIPAddress = "127.0.0.1";
-		ncConfig3.nodeId = NC3_ID;
-		nc3 = new NodeControllerService(ncConfig3);
-		nc3.start();
-		NCConfig ncConfig4 = new NCConfig();
-		ncConfig4.ccHost = "localhost";
-		ncConfig4.ccPort = 39001;
-		ncConfig4.clusterNetIPAddress = "127.0.0.1";
-		ncConfig4.dataIPAddress = "127.0.0.1";
-		ncConfig4.nodeId = NC4_ID;
-		nc4 = new NodeControllerService(ncConfig4);
-		nc4.start();
+//		NCConfig ncConfig2 = new NCConfig();
+//		ncConfig2.ccHost = "localhost";
+//		ncConfig2.ccPort = 39001;
+//		ncConfig2.clusterNetIPAddress = "127.0.0.1";
+//		ncConfig2.dataIPAddress = "127.0.0.1";
+//		ncConfig2.nodeId = NC2_ID;
+//		nc2 = new NodeControllerService(ncConfig2);
+//		nc2.start();
+//		NCConfig ncConfig3 = new NCConfig();
+//		ncConfig3.ccHost = "localhost";
+//		ncConfig3.ccPort = 39001;
+//		ncConfig3.clusterNetIPAddress = "127.0.0.1";
+//		ncConfig3.dataIPAddress = "127.0.0.1";
+//		ncConfig3.nodeId = NC3_ID;
+//		nc3 = new NodeControllerService(ncConfig3);
+//		nc3.start();
+//		NCConfig ncConfig4 = new NCConfig();
+//		ncConfig4.ccHost = "localhost";
+//		ncConfig4.ccPort = 39001;
+//		ncConfig4.clusterNetIPAddress = "127.0.0.1";
+//		ncConfig4.dataIPAddress = "127.0.0.1";
+//		ncConfig4.nodeId = NC4_ID;
+//		nc4 = new NodeControllerService(ncConfig4);
+//		nc4.start();
 
 		hcc = new HyracksConnection(ccConfig.clientNetIpAddress,
 				ccConfig.clientNetPort);
@@ -181,10 +181,10 @@
 		spec.setFrameSize(32768);
 
 		FileScanDescriptor scan = new FileScanDescriptor(spec, k, filename);
-		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, scan,
-				NC1_ID, NC2_ID, NC3_ID, NC4_ID);
-		// PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, scan,
-		// NC1_ID);
+//		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, scan,
+//				NC1_ID, NC2_ID, NC3_ID, NC4_ID);
+		 PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, scan,
+		 NC1_ID);
 
 		RecordDescriptor outputRec = new RecordDescriptor(
 				new ISerializerDeserializer[] { null,
@@ -319,30 +319,30 @@
 					new DistributedMergeLmerAggregateFactory(), outputRec, true);
 		}
 
-		// PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
-		// single_grouper, NC1_ID);
-		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
-				single_grouper, NC1_ID, NC2_ID, NC3_ID, NC4_ID);
+		 PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
+		 single_grouper, NC1_ID);
+//		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
+//				single_grouper, NC1_ID, NC2_ID, NC3_ID, NC4_ID);
 
 		IConnectorDescriptor readfileConn = new OneToOneConnectorDescriptor(
 				spec);
 		spec.connect(readfileConn, scan, 0, single_grouper, 0);
 
-		// PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
-		// cross_grouper, NC1_ID);
-		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
-				cross_grouper, NC1_ID, NC2_ID, NC3_ID, NC4_ID);
+		 PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
+		 cross_grouper, NC1_ID);
+//		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
+//				cross_grouper, NC1_ID, NC2_ID, NC3_ID, NC4_ID);
 		spec.connect(conn_partition, single_grouper, 0, cross_grouper, 0);
 
 		// PrinterOperatorDescriptor printer = new
 		// PrinterOperatorDescriptor(spec);
 		PrinterOperatorDescriptor printer = new PrinterOperatorDescriptor(spec,
 				"result");
-		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer,
-				NC1_ID, NC2_ID, NC3_ID, NC4_ID);
-		// PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
-		// printer,
-		// NC1_ID);
+//		PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer,
+//				NC1_ID, NC2_ID, NC3_ID, NC4_ID);
+		 PartitionConstraintHelper.addAbsoluteLocationConstraint(spec,
+		 printer,
+		 NC1_ID);
 
 		IConnectorDescriptor printConn = new OneToOneConnectorDescriptor(spec);
 		spec.connect(printConn, cross_grouper, 0, printer, 0);
diff --git a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/DistributedMergeLmerAggregateFactory.java b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/DistributedMergeLmerAggregateFactory.java
index ba61d18..00f4256 100644
--- a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/DistributedMergeLmerAggregateFactory.java
+++ b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/DistributedMergeLmerAggregateFactory.java
@@ -2,7 +2,6 @@
 
 import java.io.DataOutput;
 import java.io.IOException;
-import java.nio.ByteBuffer;
 
 import edu.uci.ics.genomix.data.serde.ByteSerializerDeserializer;
 import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor;
@@ -21,7 +20,7 @@
 public class DistributedMergeLmerAggregateFactory implements
 		IAggregatorDescriptorFactory {
 	private static final long serialVersionUID = 1L;
-	private static final int max = 127;
+	private static final int MAX = 127;
 
 	public DistributedMergeLmerAggregateFactory() {
 	}
@@ -50,6 +49,17 @@
 				});
 			}
 
+			private byte getField(IFrameTupleAccessor accessor, int tIndex,
+					int fieldId) {
+				int tupleOffset = accessor.getTupleStartOffset(tIndex);
+				int fieldStart = accessor.getFieldStartOffset(tIndex, fieldId);
+				int offset = tupleOffset + fieldStart
+						+ accessor.getFieldSlotsLength();
+				byte data = ByteSerializerDeserializer.getByte(accessor
+						.getBuffer().array(), offset);
+				return data;
+			}
+
 			/**
 			 * met a new kmer
 			 */
@@ -57,23 +67,9 @@
 			public void init(ArrayTupleBuilder tupleBuilder,
 					IFrameTupleAccessor accessor, int tIndex,
 					AggregateState state) throws HyracksDataException {
-				byte bitmap = 0;
-				byte count = 0;
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldStart = accessor.getFieldStartOffset(tIndex, 1);
-				bitmap |= ByteSerializerDeserializer.getByte(accessor
-						.getBuffer().array(),
-						tupleOffset + accessor.getFieldSlotsLength()
-								+ fieldStart);
 
-				tupleOffset = accessor.getTupleStartOffset(tIndex);
-				fieldStart = accessor.getFieldStartOffset(tIndex, 2);
-				int offset = tupleOffset + fieldStart
-						+ accessor.getFieldSlotsLength();
-
-				count += ByteSerializerDeserializer.getByte(accessor
-						.getBuffer().array(), offset);
-
+				byte bitmap = getField(accessor, tIndex, 1);
+				byte count = getField(accessor, tIndex, 2);
 				DataOutput fieldOutput = tupleBuilder.getDataOutput();
 				try {
 					fieldOutput.writeByte(bitmap);
@@ -84,31 +80,14 @@
 					throw new HyracksDataException(
 							"I/O exception when initializing the aggregator.");
 				}
-
 			}
 
 			@Override
 			public void aggregate(IFrameTupleAccessor accessor, int tIndex,
 					IFrameTupleAccessor stateAccessor, int stateTupleIndex,
 					AggregateState state) throws HyracksDataException {
-				// TODO Auto-generated method stub
-
-				byte bitmap = 0;
-				byte count = 0;
-
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldStart = accessor.getFieldStartOffset(tIndex, 1);
-				int offset = tupleOffset + accessor.getFieldSlotsLength()
-						+ fieldStart;
-				bitmap |= ByteSerializerDeserializer.getByte(accessor
-						.getBuffer().array(), offset);
-
-				tupleOffset = accessor.getTupleStartOffset(tIndex);
-				fieldStart = accessor.getFieldStartOffset(tIndex, 2);
-				offset = tupleOffset + fieldStart
-						+ accessor.getFieldSlotsLength();
-				count = ByteSerializerDeserializer.getByte(accessor.getBuffer()
-						.array(), offset);
+				byte bitmap = getField(accessor, tIndex, 1);
+				byte count = getField(accessor, tIndex, 2);
 
 				int statetupleOffset = stateAccessor
 						.getTupleStartOffset(stateTupleIndex);
@@ -116,39 +95,25 @@
 						stateTupleIndex, 1);
 				int stateoffset = statetupleOffset
 						+ stateAccessor.getFieldSlotsLength() + statefieldStart;
-
+				
 				byte[] data = stateAccessor.getBuffer().array();
 
-				ByteBuffer buf = ByteBuffer.wrap(data);
-				bitmap |= buf.getChar(stateoffset);
-				buf.position(stateoffset + 1);
-				count += buf.get();
-
-				if (count > max) {
-					count = (byte) max;
+				bitmap |= data[stateoffset];
+				count += data[stateoffset + 1];
+				if (count >= MAX) {
+					count = (byte) MAX;
 				}
-
-				buf.put(stateoffset, bitmap);
-				buf.put(stateoffset + 1, count);
+				data[stateoffset] = bitmap;
+				data[stateoffset + 1] = (byte) count;
 			}
 
 			@Override
 			public void outputPartialResult(ArrayTupleBuilder tupleBuilder,
 					IFrameTupleAccessor accessor, int tIndex,
 					AggregateState state) throws HyracksDataException {
-				// TODO Auto-generated method stub
-				byte bitmap;
-				byte count;
+				byte bitmap = getField(accessor, tIndex, 1);
+				byte count = getField(accessor, tIndex, 2);
 				DataOutput fieldOutput = tupleBuilder.getDataOutput();
-				byte[] data = accessor.getBuffer().array();
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldOffset = accessor.getFieldStartOffset(tIndex, 1);
-
-				int offset = fieldOffset + accessor.getFieldSlotsLength()
-						+ tupleOffset;
-				bitmap = ByteSerializerDeserializer.getByte(data, offset);
-
-				count = ByteSerializerDeserializer.getByte(data, offset + 1);
 				try {
 					fieldOutput.writeByte(bitmap);
 					tupleBuilder.addFieldEndOffset();
@@ -165,29 +130,7 @@
 			public void outputFinalResult(ArrayTupleBuilder tupleBuilder,
 					IFrameTupleAccessor accessor, int tIndex,
 					AggregateState state) throws HyracksDataException {
-				// TODO Auto-generated method stub
-				byte bitmap;
-				byte count;
-
-				byte[] data = accessor.getBuffer().array();
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldOffset = accessor.getFieldStartOffset(tIndex, 1);
-				int offset = tupleOffset + accessor.getFieldSlotsLength()
-						+ fieldOffset;
-
-				bitmap = ByteSerializerDeserializer.getByte(data, offset);
-				count = ByteSerializerDeserializer.getByte(data, offset + 1);
-
-				DataOutput fieldOutput = tupleBuilder.getDataOutput();
-				try {
-					fieldOutput.writeByte(bitmap);
-					tupleBuilder.addFieldEndOffset();
-					fieldOutput.writeByte(count);
-					tupleBuilder.addFieldEndOffset();
-				} catch (IOException e) {
-					throw new HyracksDataException(
-							"I/O exception when writing aggregation to the output buffer.");
-				}
+				outputPartialResult(tupleBuilder, accessor, tIndex, state);
 			}
 
 		};
diff --git a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/MergeKmerAggregateFactory.java b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/MergeKmerAggregateFactory.java
index 427ad4f..32c50bb 100644
--- a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/MergeKmerAggregateFactory.java
+++ b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/dataflow/aggregators/MergeKmerAggregateFactory.java
@@ -2,7 +2,6 @@
 
 import java.io.DataOutput;
 import java.io.IOException;
-import java.nio.ByteBuffer;
 
 import edu.uci.ics.genomix.data.serde.ByteSerializerDeserializer;
 import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor;
@@ -20,7 +19,7 @@
  */
 public class MergeKmerAggregateFactory implements IAggregatorDescriptorFactory {
 	private static final long serialVersionUID = 1L;
-	private static final int max = 127;
+	private static final int MAX = 127;
 
 	public MergeKmerAggregateFactory() {
 	}
@@ -49,20 +48,23 @@
 				});
 			}
 
+			private byte getField(IFrameTupleAccessor accessor, int tIndex,
+					int fieldId) {
+				int tupleOffset = accessor.getTupleStartOffset(tIndex);
+				int fieldStart = accessor.getFieldStartOffset(tIndex, fieldId);
+				int offset = tupleOffset + fieldStart
+						+ accessor.getFieldSlotsLength();
+				byte data = ByteSerializerDeserializer.getByte(accessor
+						.getBuffer().array(), offset);
+				return data;
+			}
+
 			@Override
 			public void init(ArrayTupleBuilder tupleBuilder,
 					IFrameTupleAccessor accessor, int tIndex,
 					AggregateState state) throws HyracksDataException {
-				byte bitmap = 0;
-				byte count = 0;
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldStart = accessor.getFieldStartOffset(tIndex, 1);
-
-				bitmap |= accessor.getBuffer().get(
-						tupleOffset + accessor.getFieldSlotsLength()
-								+ fieldStart);
-
-				count += 1;
+				byte bitmap = getField(accessor, tIndex, 1);
+				byte count = 1;
 
 				DataOutput fieldOutput = tupleBuilder.getDataOutput();
 				try {
@@ -81,16 +83,8 @@
 			public void aggregate(IFrameTupleAccessor accessor, int tIndex,
 					IFrameTupleAccessor stateAccessor, int stateTupleIndex,
 					AggregateState state) throws HyracksDataException {
-				// TODO Auto-generated method stub
-				byte bitmap = 0;
-				byte count = 0;
-
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldStart = accessor.getFieldStartOffset(tIndex, 1);
-
-				bitmap |= accessor.getBuffer().get(
-						tupleOffset + accessor.getFieldSlotsLength()
-								+ fieldStart);
+				byte bitmap = getField(accessor, tIndex, 1);
+				short count = 1;
 
 				int statetupleOffset = stateAccessor
 						.getTupleStartOffset(stateTupleIndex);
@@ -99,42 +93,24 @@
 				int stateoffset = statetupleOffset
 						+ stateAccessor.getFieldSlotsLength() + statefieldStart;
 
-				count += 1;
-				if (count > max) {
-					count = max;
-				}
-
 				byte[] data = stateAccessor.getBuffer().array();
 
-				ByteBuffer buf = ByteBuffer.wrap(data);
-				bitmap |= buf.getChar(stateoffset);
-				buf.position(stateoffset + 1);
-				count += buf.get();
-
-				if (count > max) {
-					count = (byte) max;
+				bitmap |= data[stateoffset];
+				count += data[stateoffset + 1];
+				if (count >= MAX) {
+					count = (byte) MAX;
 				}
-
-				buf.put(stateoffset, bitmap);
-				buf.put(stateoffset + 1, count);
+				data[stateoffset] = bitmap;
+				data[stateoffset + 1] = (byte) count;
 			}
 
 			@Override
 			public void outputPartialResult(ArrayTupleBuilder tupleBuilder,
 					IFrameTupleAccessor accessor, int tIndex,
 					AggregateState state) throws HyracksDataException {
-				// TODO Auto-generated method stub
-				byte bitmap;
-				byte count;
+				byte bitmap = getField(accessor, tIndex, 1);
+				byte count = getField(accessor, tIndex, 2);
 				DataOutput fieldOutput = tupleBuilder.getDataOutput();
-				byte[] data = accessor.getBuffer().array();
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldOffset = accessor.getFieldStartOffset(tIndex, 1);
-
-				int offset = fieldOffset + accessor.getFieldSlotsLength()
-						+ tupleOffset;
-				bitmap = ByteSerializerDeserializer.getByte(data, offset);
-				count = ByteSerializerDeserializer.getByte(data, offset + 1);
 				try {
 					fieldOutput.writeByte(bitmap);
 					tupleBuilder.addFieldEndOffset();
@@ -151,29 +127,7 @@
 			public void outputFinalResult(ArrayTupleBuilder tupleBuilder,
 					IFrameTupleAccessor accessor, int tIndex,
 					AggregateState state) throws HyracksDataException {
-				// TODO Auto-generated method stub
-				byte bitmap;
-				byte count;
-
-				byte[] data = accessor.getBuffer().array();
-				int tupleOffset = accessor.getTupleStartOffset(tIndex);
-				int fieldOffset = accessor.getFieldStartOffset(tIndex, 1);
-				int offset = tupleOffset + accessor.getFieldSlotsLength()
-						+ fieldOffset;
-
-				bitmap = ByteSerializerDeserializer.getByte(data, offset);
-				count = ByteSerializerDeserializer.getByte(data, offset + 1);
-
-				DataOutput fieldOutput = tupleBuilder.getDataOutput();
-				try {
-					fieldOutput.writeByte(bitmap);
-					tupleBuilder.addFieldEndOffset();
-					fieldOutput.writeByte(count);
-					tupleBuilder.addFieldEndOffset();
-				} catch (IOException e) {
-					throw new HyracksDataException(
-							"I/O exception when writing aggregation to the output buffer.");
-				}
+				outputPartialResult(tupleBuilder, accessor, tIndex, state);
 			}
 
 		};
diff --git a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/job/JobGenBrujinGraph.java b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/job/JobGenBrujinGraph.java
index baffdcb..95562a6 100644
--- a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/job/JobGenBrujinGraph.java
+++ b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/job/JobGenBrujinGraph.java
@@ -91,7 +91,7 @@
 			System.arraycopy(nodes, 0, ncNodeNames, i * nodes.length,
 					nodes.length);
 		}
-		LOG.info("nc nodes:" + ncNodeNames.length + ncNodeNames.toString());
+		LOG.info("nc nodes:" + ncNodeNames.length + " " + ncNodeNames.toString());
 	}
 
 	private ExternalGroupOperatorDescriptor newExternalGroupby(
@@ -190,6 +190,7 @@
 			InputSplit[] splits = job.getInputFormat().getSplits(job,
 					ncNodeNames.length);
 
+			LOG.info("HDFS read into " + splits.length + " splits");
 			String[] readSchedule = scheduler.getLocationConstraints(splits);
 			return new HDFSReadOperatorDescriptor(jobSpec, readOutputRec, job,
 					splits, readSchedule, new ReadsKeyValueParserFactory(kmers));
@@ -299,6 +300,12 @@
 			outputFormat = OutputFormat.BINARY;
 		}
 		job = new JobConf(conf);
+		LOG.info("Genomix Graph Build Configuration");
+		LOG.info("Kmer:" + kmers);
+		LOG.info("Groupby type:" + type);
+		LOG.info("Output format:" + output);
+		LOG.info("Frame limit" + frameLimits);
+		LOG.info("Frame size" + frameSize);
 	}
 
 }
diff --git a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/type/Kmer.java b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/type/Kmer.java
index 1fbcc22..7dd310c 100644
--- a/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/type/Kmer.java
+++ b/genomix/genomix-core/src/main/java/edu/uci/ics/genomix/type/Kmer.java
@@ -69,7 +69,7 @@
 		}
 
 		public static byte mergePreNextAdj(byte pre, byte next) {
-			return (byte) (pre << 4 | next & 0x0f);
+			return (byte) (pre << 4 | (next & 0x0f));
 		}
 
 		public static String getSymbolFromBitMap(byte code) {
@@ -149,7 +149,7 @@
 	 * @return the shiftout gene, in gene code format
 	 */
 	public static byte MoveKmer(int k, byte[] kmer, byte c) {
-		int byteNum = (byte) Math.ceil((double) k / 4.0);
+		int byteNum = kmer.length;
 		byte output = (byte) (kmer[byteNum - 1] & 0x03);
 		for (int i = byteNum - 1; i > 0; i--) {
 			byte in = (byte) (kmer[i - 1] & 0x03);
@@ -158,7 +158,7 @@
 
 		int pos = ((k - 1) % 4) * 2;
 		byte code = (byte) (GENE_CODE.getCodeFromSymbol(c) << pos);
-		kmer[0] = (byte) ((kmer[0] >>> 2) | code);
+		kmer[0] = (byte) (((kmer[0] >>> 2) & 0x3f) | code);
 		return (byte) (1 << output);
 	}
 
