diff --git a/utils/misc/src/main/java/org/onlab/util/HexDump.java b/utils/misc/src/main/java/org/onlab/util/HexDump.java
index b40cf6e..fdb696b 100755
--- a/utils/misc/src/main/java/org/onlab/util/HexDump.java
+++ b/utils/misc/src/main/java/org/onlab/util/HexDump.java
@@ -1,54 +1,54 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onlab.util;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * HexDump class an utility to dump buffer in hex format.
- */
-public final class HexDump {
-    protected static final Logger log = LoggerFactory.getLogger(HexDump.class);
-
-    private HexDump() {
-    }
-
-    /**
-     * Dump the buffer content in hex format.
-     *
-     * @param buff buffer content to dump in hex format
-     */
-    public static void dump(ChannelBuffer buff) {
-        buff.markReaderIndex();
-        try {
-            do {
-                StringBuilder sb = new StringBuilder();
-                for (int k = 0; (k < 16) && (buff.readableBytes() != 0); ++k) {
-                    if (0 == k % 4) {
-                        sb.append(String.format(" ")); // blank after 4 bytes
-                    }
-                    sb.append(String.format("%02X ", buff.readByte()));
-                }
-                log.debug(sb.toString());
-            } while (buff.readableBytes() != 0);
-        } catch (Exception e) {
-            log.error("[HexDump] Invalid buffer: " + e.toString());
-        }
-        buff.resetReaderIndex();
-    }
-}
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onlab.util;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * HexDump class an utility to dump buffer in hex format.
+ */
+public final class HexDump {
+    protected static final Logger log = LoggerFactory.getLogger(HexDump.class);
+
+    private HexDump() {
+    }
+
+    /**
+     * Dump the buffer content in hex format.
+     *
+     * @param buff buffer content to dump in hex format
+     */
+    public static void dump(ChannelBuffer buff) {
+        buff.markReaderIndex();
+        try {
+            do {
+                StringBuilder sb = new StringBuilder();
+                for (int k = 0; (k < 16) && (buff.readableBytes() != 0); ++k) {
+                    if (0 == k % 4) {
+                        sb.append(String.format(" ")); // blank after 4 bytes
+                    }
+                    sb.append(String.format("%02X ", buff.readByte()));
+                }
+                log.debug(sb.toString());
+            } while (buff.readableBytes() != 0);
+        } catch (Exception e) {
+            log.error("[HexDump] Invalid buffer: " + e.toString());
+        }
+        buff.resetReaderIndex();
+    }
+}
