diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMetricObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMetricObject.java
index 108d225..a6d553e 100755
--- a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMetricObject.java
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMetricObject.java
@@ -1,230 +1,230 @@
-/*
- * 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.pcepio.protocol;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.pcepio.exceptions.PcepParseException;
-import org.onosproject.pcepio.types.PcepObjectHeader;
-
-/**
- * Abstraction of an entity providing PCEP Metric Object.
- */
-public interface PcepMetricObject {
-
-    /**
-     * Returns Metric value in Metric Object.
-     *
-     * @return Metric value
-     */
-    int getMetricVal();
-
-    /**
-     * Sets Metric value in Metric Object with specified value.
-     *
-     * @param value Metric value
-     */
-    void setMetricVal(int value);
-
-    /**
-     * Returns Y flag in Metric Object.
-     *
-     * @return Y flag in Metric Object
-     */
-    byte getYFlag();
-
-    /**
-     * Sets Y flag in Metric Object with specified value.
-     *
-     * @param value Y flag
-     */
-    void setYFlag(byte value);
-
-    /**
-     * Returns C flag in Metric Object.
-     *
-     * @return C flag in Metric Object
-     */
-    boolean getCFlag();
-
-    /**
-     * Sets C flag in Metric Object with specified value.
-     *
-     * @param value C flag
-     */
-    void setCFlag(boolean value);
-
-    /**
-     * Returns B flag in Metric Object.
-     *
-     * @return B flag in Metric Object
-     */
-    boolean getBFlag();
-
-    /**
-     * Sets B flag in Metric Object with specified value.
-     *
-     * @param value B flag
-     */
-    void setBFlag(boolean value);
-
-    /**
-     * Returns BType field in Metric Object.
-     *
-     * @return BType field in Metric Object
-     */
-    byte getBType();
-
-    /**
-     * Sets BType field in Metric Object with specified value.
-     *
-     * @param value BType field
-     */
-    void setBType(byte value);
-
-    /**
-     * Prints attributes of Metric object.
-     */
-    void print();
-
-    /**
-     * Writes the Metric Object into channel buffer.
-     *
-     * @param bb channel buffer
-     * @return Returns the writerIndex of this buffer
-     * @throws PcepParseException while writing METRIC object into Channel Buffer.
-     */
-    int write(ChannelBuffer bb) throws PcepParseException;
-
-    /**
-     * Builder interface with get and set functions to build Metric object.
-     */
-    public interface Builder {
-
-        /**
-         * Builds Metric Object.
-         *
-         * @return Metric Object
-         * @throws PcepParseException when mandatory object is not set
-         */
-        PcepMetricObject build() throws PcepParseException;
-
-        /**
-         * Returns Metric object header.
-         *
-         * @return Metric object header
-         */
-        PcepObjectHeader getMetricObjHeader();
-
-        /**
-         * Sets Metric object header and returns its builder.
-         *
-         * @param obj Metric object header
-         * @return Builder by setting Metric object header
-         */
-        Builder setMetricObjHeader(PcepObjectHeader obj);
-
-        /**
-         * Returns Metric value in Metric Object.
-         *
-         * @return Metric value
-         */
-        int getMetricVal();
-
-        /**
-         * Sets Metric Value in Metric Object and returns its builder.
-         *
-         * @param value Metric Value
-         * @return Builder by setting Metric Value
-         */
-        Builder setMetricVal(int value);
-
-        /**
-         * Returns Flags in Metric Object.
-         *
-         * @return Flags in Metric Object
-         */
-        byte getYFlag();
-
-        /**
-         * Sets Flags in Metric Object and returns its builder.
-         *
-         * @param value Flags
-         * @return Builder by setting Flags
-         */
-        Builder setYFlag(byte value);
-
-        /**
-         * Returns C flag in Metric Object.
-         *
-         * @return C flag in Metric Object
-         */
-        boolean getCFlag();
-
-        /**
-         * Sets C flag in Metric Object and returns its builder.
-         *
-         * @param value C flag
-         * @return Builder by setting C flag
-         */
-        Builder setCFlag(boolean value);
-
-        /**
-         * Returns B flag in Metric Object.
-         *
-         * @return B flag in Metric Object
-         */
-        boolean getBFlag();
-
-        /**
-         * Sets B flag in Metric Object and returns its builder.
-         *
-         * @param value B flag
-         * @return Builder by setting B flag
-         */
-        Builder setBFlag(boolean value);
-
-        /**
-         * Returns BType field in Metric Object.
-         *
-         * @return BType field in Metric Object
-         */
-        byte getBType();
-
-        /**
-         * Sets B Type field in Metric Object and returns its builder.
-         *
-         * @param value B Type field
-         * @return Builder by setting B Type field
-         */
-        Builder setBType(byte value);
-
-        /**
-         * Sets P flag in Metric object header and returns its builder.
-         *
-         * @param value boolean value to set P flag
-         * @return Builder by setting P flag
-         */
-        Builder setPFlag(boolean value);
-
-        /**
-         * Sets I flag in Metric object header and returns its builder.
-         *
-         * @param value boolean value to set I flag
-         * @return Builder by setting I flag
-         */
-        Builder setIFlag(boolean value);
-    }
-}
+/*
+ * 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP Metric Object.
+ */
+public interface PcepMetricObject {
+
+    /**
+     * Returns Metric value in Metric Object.
+     *
+     * @return Metric value
+     */
+    int getMetricVal();
+
+    /**
+     * Sets Metric value in Metric Object with specified value.
+     *
+     * @param value Metric value
+     */
+    void setMetricVal(int value);
+
+    /**
+     * Returns Y flag in Metric Object.
+     *
+     * @return Y flag in Metric Object
+     */
+    byte getYFlag();
+
+    /**
+     * Sets Y flag in Metric Object with specified value.
+     *
+     * @param value Y flag
+     */
+    void setYFlag(byte value);
+
+    /**
+     * Returns C flag in Metric Object.
+     *
+     * @return C flag in Metric Object
+     */
+    boolean getCFlag();
+
+    /**
+     * Sets C flag in Metric Object with specified value.
+     *
+     * @param value C flag
+     */
+    void setCFlag(boolean value);
+
+    /**
+     * Returns B flag in Metric Object.
+     *
+     * @return B flag in Metric Object
+     */
+    boolean getBFlag();
+
+    /**
+     * Sets B flag in Metric Object with specified value.
+     *
+     * @param value B flag
+     */
+    void setBFlag(boolean value);
+
+    /**
+     * Returns BType field in Metric Object.
+     *
+     * @return BType field in Metric Object
+     */
+    byte getBType();
+
+    /**
+     * Sets BType field in Metric Object with specified value.
+     *
+     * @param value BType field
+     */
+    void setBType(byte value);
+
+    /**
+     * Prints attributes of Metric object.
+     */
+    void print();
+
+    /**
+     * Writes the Metric Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing METRIC object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Metric object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds Metric Object.
+         *
+         * @return Metric Object
+         * @throws PcepParseException when mandatory object is not set
+         */
+        PcepMetricObject build() throws PcepParseException;
+
+        /**
+         * Returns Metric object header.
+         *
+         * @return Metric object header
+         */
+        PcepObjectHeader getMetricObjHeader();
+
+        /**
+         * Sets Metric object header and returns its builder.
+         *
+         * @param obj Metric object header
+         * @return Builder by setting Metric object header
+         */
+        Builder setMetricObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Metric value in Metric Object.
+         *
+         * @return Metric value
+         */
+        int getMetricVal();
+
+        /**
+         * Sets Metric Value in Metric Object and returns its builder.
+         *
+         * @param value Metric Value
+         * @return Builder by setting Metric Value
+         */
+        Builder setMetricVal(int value);
+
+        /**
+         * Returns Flags in Metric Object.
+         *
+         * @return Flags in Metric Object
+         */
+        byte getYFlag();
+
+        /**
+         * Sets Flags in Metric Object and returns its builder.
+         *
+         * @param value Flags
+         * @return Builder by setting Flags
+         */
+        Builder setYFlag(byte value);
+
+        /**
+         * Returns C flag in Metric Object.
+         *
+         * @return C flag in Metric Object
+         */
+        boolean getCFlag();
+
+        /**
+         * Sets C flag in Metric Object and returns its builder.
+         *
+         * @param value C flag
+         * @return Builder by setting C flag
+         */
+        Builder setCFlag(boolean value);
+
+        /**
+         * Returns B flag in Metric Object.
+         *
+         * @return B flag in Metric Object
+         */
+        boolean getBFlag();
+
+        /**
+         * Sets B flag in Metric Object and returns its builder.
+         *
+         * @param value B flag
+         * @return Builder by setting B flag
+         */
+        Builder setBFlag(boolean value);
+
+        /**
+         * Returns BType field in Metric Object.
+         *
+         * @return BType field in Metric Object
+         */
+        byte getBType();
+
+        /**
+         * Sets B Type field in Metric Object and returns its builder.
+         *
+         * @param value B Type field
+         * @return Builder by setting B Type field
+         */
+        Builder setBType(byte value);
+
+        /**
+         * Sets P flag in Metric object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Metric object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
