diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactories.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactories.java
index eb18c7d..32f5c48 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactories.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/BgpFactories.java
@@ -1,82 +1,82 @@
-/*
- * 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.onosproject.bgpio.protocol;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.bgpio.exceptions.BgpParseException;
-import org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4;
-import org.onosproject.bgpio.types.BgpHeader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Abstraction to provide the version for BGP.
- */
-public final class BgpFactories {
-
-    protected static final Logger log = LoggerFactory.getLogger(BgpFactories.class);
-
-    private static final GenericReader GENERIC_READER = new GenericReader();
-
-    private BgpFactories() {
-    }
-
-    /**
-     * Returns the instance of BGP Version.
-     *
-     * @param version BGP version
-     * @return BGP version
-     */
-    public static BgpFactory getFactory(BgpVersion version) {
-        switch (version) {
-        case BGP_4:
-            return BgpFactoryVer4.INSTANCE;
-        default:
-            throw new IllegalArgumentException("[BgpFactory:]Unknown version: " + version);
-        }
-    }
-
-    /**
-     * Reader class for reading BGP messages from channel buffer.
-     *
-     */
-    private static class GenericReader implements BgpMessageReader<BgpMessage> {
-
-        @Override
-        public BgpMessage readFrom(ChannelBuffer bb, BgpHeader bgpHeader)
-                throws BgpParseException {
-            BgpFactory factory;
-
-            if (!bb.readable()) {
-                log.error("Empty message received");
-                throw new BgpParseException("Empty message received");
-            }
-            // TODO: Currently only BGP version 4 is supported
-            factory = org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4.INSTANCE;
-            return factory.getReader().readFrom(bb, bgpHeader);
-        }
-    }
-
-    /**
-     * Returns BGP messsage generic reader.
-     *
-     * @return bgp message generic reader
-     */
-    public static BgpMessageReader<BgpMessage> getGenericReader() {
-        return GENERIC_READER;
-    }
-}
+/*
+ * 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.onosproject.bgpio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.bgpio.exceptions.BgpParseException;
+import org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4;
+import org.onosproject.bgpio.types.BgpHeader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Abstraction to provide the version for BGP.
+ */
+public final class BgpFactories {
+
+    protected static final Logger log = LoggerFactory.getLogger(BgpFactories.class);
+
+    private static final GenericReader GENERIC_READER = new GenericReader();
+
+    private BgpFactories() {
+    }
+
+    /**
+     * Returns the instance of BGP Version.
+     *
+     * @param version BGP version
+     * @return BGP version
+     */
+    public static BgpFactory getFactory(BgpVersion version) {
+        switch (version) {
+        case BGP_4:
+            return BgpFactoryVer4.INSTANCE;
+        default:
+            throw new IllegalArgumentException("[BgpFactory:]Unknown version: " + version);
+        }
+    }
+
+    /**
+     * Reader class for reading BGP messages from channel buffer.
+     *
+     */
+    private static class GenericReader implements BgpMessageReader<BgpMessage> {
+
+        @Override
+        public BgpMessage readFrom(ChannelBuffer bb, BgpHeader bgpHeader)
+                throws BgpParseException {
+            BgpFactory factory;
+
+            if (!bb.readable()) {
+                log.error("Empty message received");
+                throw new BgpParseException("Empty message received");
+            }
+            // TODO: Currently only BGP version 4 is supported
+            factory = org.onosproject.bgpio.protocol.ver4.BgpFactoryVer4.INSTANCE;
+            return factory.getReader().readFrom(bb, bgpHeader);
+        }
+    }
+
+    /**
+     * Returns BGP messsage generic reader.
+     *
+     * @return bgp message generic reader
+     */
+    public static BgpMessageReader<BgpMessage> getGenericReader() {
+        return GENERIC_READER;
+    }
+}
