diff --git a/core/api/src/main/java/org/onosproject/net/group/DefaultGroupDescription.java b/core/api/src/main/java/org/onosproject/net/group/DefaultGroupDescription.java
index a5b8e94..1580d83 100644
--- a/core/api/src/main/java/org/onosproject/net/group/DefaultGroupDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/group/DefaultGroupDescription.java
@@ -181,7 +181,7 @@
         if (this == obj) {
             return true;
         }
-       if (obj instanceof DefaultGroupDescription) {
+        if (obj instanceof DefaultGroupDescription) {
             DefaultGroupDescription that = (DefaultGroupDescription) obj;
             return Objects.equals(deviceId, that.deviceId) &&
                     Objects.equals(type, that.type) &&
@@ -201,4 +201,4 @@
                 .add("givenGroupId", givenGroupId)
                 .toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/api/src/test/java/org/onosproject/net/group/DefaultGroupDescriptionTest.java b/core/api/src/test/java/org/onosproject/net/group/DefaultGroupDescriptionTest.java
new file mode 100644
index 0000000..66b0089
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/group/DefaultGroupDescriptionTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.net.group;
+
+import org.junit.Test;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficTreatment;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
+import static org.onosproject.net.NetTestTools.APP_ID;
+import static org.onosproject.net.NetTestTools.did;
+
+/**
+ * Default group description unit tests.
+ */
+public class DefaultGroupDescriptionTest {
+    byte[] keyData = "abcdefg".getBytes();
+    private final GroupKey key = new DefaultGroupKey(keyData);
+    private final TrafficTreatment treatment =
+            DefaultTrafficTreatment.emptyTreatment();
+    private final GroupBucket bucket =
+            DefaultGroupBucket.createSelectGroupBucket(treatment);
+    private final GroupBuckets groupBuckets =
+            new GroupBuckets(ImmutableList.of(bucket));
+    private final DefaultGroupDescription d1 =
+            new DefaultGroupDescription(did("2"),
+                    GroupDescription.Type.FAILOVER,
+                    groupBuckets);
+    private final DefaultGroupDescription sameAsD1 =
+            new DefaultGroupDescription(d1);
+    private final DefaultGroupDescription d2 =
+            new DefaultGroupDescription(did("2"),
+                    GroupDescription.Type.INDIRECT,
+                    groupBuckets);
+    private final DefaultGroupDescription d3 =
+            new DefaultGroupDescription(did("3"),
+                    GroupDescription.Type.FAILOVER,
+                    groupBuckets,
+                    key,
+                    711,
+                    APP_ID);
+
+    /**
+     * Checks that the Default group description class is immutable and can be
+     * inherited from.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutableBaseClass(DefaultGroupDescription.class);
+    }
+
+    /**
+     * Tests for proper operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void checkEquals() {
+        new EqualsTester()
+                .addEqualityGroup(d1, sameAsD1)
+                .addEqualityGroup(d2)
+                .addEqualityGroup(d3)
+                .testEquals();
+    }
+
+    /**
+     * Checks that construction of an object was correct.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(d3.deviceId(), is(did("3")));
+        assertThat(d3.type(), is(GroupDescription.Type.FAILOVER));
+        assertThat(d3.buckets(), is(groupBuckets));
+        assertThat(d3.appId(), is(APP_ID));
+        assertThat(d3.givenGroupId(), is(711));
+        assertThat(key.key(), is(keyData));
+        assertThat(d3.appCookie().key(), is(keyData));
+    }
+}
+
