diff --git a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/node/ConnectivityMatrix.java b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/node/ConnectivityMatrix.java
new file mode 100644
index 0000000..3a4313b
--- /dev/null
+++ b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/node/ConnectivityMatrix.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2016 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.tetopology.management.api.node;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.onosproject.tetopology.management.api.link.ElementType;
+import org.onosproject.tetopology.management.api.link.TePathAttributes;
+import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
+
+import java.util.BitSet;
+import java.util.List;
+
+/**
+ * Represents node's switching limitations.
+ */
+public class ConnectivityMatrix extends AbstractConnectivity {
+    /**
+     * Indicates that switching is disallowed.
+     */
+    public static final short BIT_DISALLOWED = 0;
+
+    /**
+     * Indicates that an alternative switching connection path
+     * is available.
+     */
+    public static final short BIT_ALTERNATIVE_PATH_AVAILABLE = 1;
+
+    /**
+     * Indicates that switching in this node is disabled.
+     */
+    public static final short BIT_DISABLED = 2;
+
+    private final long key;
+    private final ElementType from;
+    // list of elements that can be merged with the "from" element
+    private final List<ElementType> mergingList;
+
+    /**
+     * Creates a connectivity matrix instance.
+     *
+     * @param key                  the connectivity matrix key
+     * @param from                 the "from" element (e.g. TE link id or
+     *                             label) in the matrix
+     * @param mergingList          the list of elements that can be merged
+     *                             with the "from" element
+     * @param constrainingElements the list of elements that can be constrained
+     *                             or connected to the "from" element
+     * @param flags                the indicator whether this connectivity
+     *                             matrix is usable
+     * @param teAttributes         the connectivity TE attributes of this matrix
+     * @param underlayPath         the underlay path of the matrix
+     */
+    public ConnectivityMatrix(long key,
+                              ElementType from,
+                              List<ElementType> mergingList,
+                              List<ElementType> constrainingElements,
+                              BitSet flags,
+                              TePathAttributes teAttributes,
+                              UnderlayAbstractPath underlayPath) {
+        super(constrainingElements, flags, teAttributes, underlayPath);
+        this.key = key;
+        this.from = from;
+        this.mergingList = mergingList != null ?
+                Lists.newArrayList(mergingList) : null;
+    }
+
+    /**
+     * Returns the key.
+     *
+     * @return connectivity matrix key
+     */
+    public long key() {
+        return key;
+    }
+
+    /**
+     * Returns the "from" element of a connectivity matrix.
+     *
+     * @return the "from" of the connectivity matrix
+     */
+    public ElementType from() {
+        return from;
+    }
+
+    /**
+     * Returns the "merging list" can be merged with the "from" element.
+     *
+     * @return the "merging list" of the connectivity matrix
+     */
+    public List<ElementType> mergingList() {
+        if (mergingList == null) {
+            return null;
+        }
+        return ImmutableList.copyOf(mergingList);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(key, from, mergingList, super.hashCode());
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (object instanceof ConnectivityMatrix) {
+            if (!super.equals(object)) {
+                return false;
+            }
+            ConnectivityMatrix that = (ConnectivityMatrix) object;
+            return Objects.equal(this.key, that.key) &&
+                    Objects.equal(this.from, that.from) &&
+                    Objects.equal(this.mergingList, that.mergingList);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("key", key)
+                .add("from", from)
+                .add("mergingList", mergingList)
+                .add("constrainingElements", constrainingElements())
+                .add("flags", flags())
+                .add("teAttributes", teAttributes())
+                .toString();
+    }
+}
