Adding mode base model and unit tests stuff.
diff --git a/net/api/src/main/java/org/onlab/onos/net/AbstractElement.java b/net/api/src/main/java/org/onlab/onos/net/AbstractElement.java
new file mode 100644
index 0000000..01341a5
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/AbstractElement.java
@@ -0,0 +1,28 @@
+package org.onlab.onos.net;
+
+import org.onlab.onos.net.provider.ProviderId;
+
+/**
+ * Base implementation of network elements, i.e. devices or hosts.
+ */
+public class AbstractElement extends AbstractModel implements Element {
+
+    protected final ElementId id;
+
+    /**
+     * Creates a network element attributed to the specified provider.
+     *
+     * @param providerId identity of the provider
+     * @param id         element identifier
+     */
+    protected AbstractElement(ProviderId providerId, ElementId id) {
+        super(providerId);
+        this.id = id;
+    }
+
+    @Override
+    public ElementId id() {
+        return id;
+    }
+
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/AbstractModel.java b/net/api/src/main/java/org/onlab/onos/net/AbstractModel.java
new file mode 100644
index 0000000..e195fde
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/AbstractModel.java
@@ -0,0 +1,26 @@
+package org.onlab.onos.net;
+
+import org.onlab.onos.net.provider.ProviderId;
+
+/**
+ * Base implementation of a network model entity.
+ */
+public class AbstractModel implements Provided {
+
+    private final ProviderId providerId;
+
+    /**
+     * Creates a model entity attributed to the specified provider.
+     *
+     * @param providerId identity of the provider
+     */
+    protected AbstractModel(ProviderId providerId) {
+        this.providerId = providerId;
+    }
+
+    @Override
+    public ProviderId providerId() {
+        return providerId;
+    }
+
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/DefaultDevice.java b/net/api/src/main/java/org/onlab/onos/net/DefaultDevice.java
new file mode 100644
index 0000000..42a3526
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/DefaultDevice.java
@@ -0,0 +1,103 @@
+package org.onlab.onos.net;
+
+import org.onlab.onos.net.provider.ProviderId;
+
+import java.util.Objects;
+
+import static com.google.common.base.Objects.toStringHelper;
+
+/**
+ * Default device model implementation.
+ */
+public class DefaultDevice extends AbstractElement implements Device {
+
+    private final Type type;
+    private final String manufacturer;
+    private final String serialNumber;
+    private final String hwVersion;
+    private final String swVersion;
+
+    /**
+     * Creates a network element attributed to the specified provider.
+     *
+     * @param providerId   identity of the provider
+     * @param id           device identifier
+     * @param type         device type
+     * @param manufacturer device manufacturer
+     * @param hwVersion    device HW version
+     * @param swVersion    device SW version
+     * @param serialNumber device serial number
+     */
+    public DefaultDevice(ProviderId providerId, DeviceId id, Type type,
+                         String manufacturer, String hwVersion, String swVersion,
+                         String serialNumber) {
+        super(providerId, id);
+        this.type = type;
+        this.manufacturer = manufacturer;
+        this.hwVersion = hwVersion;
+        this.swVersion = swVersion;
+        this.serialNumber = serialNumber;
+    }
+
+    @Override
+    public DeviceId id() {
+        return (DeviceId) super.id();
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    @Override
+    public String manufacturer() {
+        return manufacturer;
+    }
+
+    @Override
+    public String hwVersion() {
+        return hwVersion;
+    }
+
+    @Override
+    public String swVersion() {
+        return swVersion;
+    }
+
+    @Override
+    public String serialNumber() {
+        return serialNumber;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, type, manufacturer, hwVersion, swVersion, serialNumber);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof DefaultDevice) {
+            final DefaultDevice other = (DefaultDevice) obj;
+            return Objects.equals(this.id, other.id) &&
+                    Objects.equals(this.type, other.type) &&
+                    Objects.equals(this.manufacturer, other.manufacturer) &&
+                    Objects.equals(this.hwVersion, other.hwVersion) &&
+                    Objects.equals(this.swVersion, other.swVersion) &&
+                    Objects.equals(this.serialNumber, other.serialNumber);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("id", id)
+                .add("type", type)
+                .add("manufacturer", manufacturer)
+                .add("hwVersion", hwVersion)
+                .add("swVersion", swVersion)
+                .add("serialNumber", serialNumber)
+                .toString();
+    }
+
+}
diff --git a/net/api/src/test/java/org/onlab/onos/net/DefaultDeviceTest.java b/net/api/src/test/java/org/onlab/onos/net/DefaultDeviceTest.java
new file mode 100644
index 0000000..1d174ca
--- /dev/null
+++ b/net/api/src/test/java/org/onlab/onos/net/DefaultDeviceTest.java
@@ -0,0 +1,54 @@
+package org.onlab.onos.net;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+import org.onlab.onos.net.provider.ProviderId;
+
+import java.net.URI;
+
+import static org.junit.Assert.assertEquals;
+import static org.onlab.onos.net.Device.Type.SWITCH;
+
+/**
+ * Test of the default device model entity.
+ */
+public class DefaultDeviceTest {
+
+    private static final ProviderId PID = new ProviderId("foo");
+    private static final DeviceId DID1 = new DeviceId(URI.create("of:foo"));
+    private static final DeviceId DID2 = new DeviceId(URI.create("of:bar"));
+    private static final String MFR = "whitebox";
+    private static final String HW = "1.1.x";
+    private static final String SW = "3.9.1";
+    private static final String SN1 = "43311-12345";
+    private static final String SN2 = "42346-43512";
+
+
+    @Test
+    public void testEquality() {
+        Device d1 = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1);
+        Device d2 = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1);
+        Device d3 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN2);
+        Device d4 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN2);
+        Device d5 = new DefaultDevice(PID, DID2, SWITCH, MFR, HW, SW, SN1);
+
+        new EqualsTester().addEqualityGroup(d1, d2)
+                .addEqualityGroup(d3, d4)
+                .addEqualityGroup(d5)
+                .testEquals();
+    }
+
+    @Test
+    public void basics() {
+        Device device = new DefaultDevice(PID, DID1, SWITCH, MFR, HW, SW, SN1);
+        assertEquals("incorrect provider", PID, device.providerId());
+        assertEquals("incorrect id", DID1, device.id());
+        assertEquals("incorrect type", SWITCH, device.type());
+        assertEquals("incorrect manufacturer", MFR, device.manufacturer());
+        assertEquals("incorrect hw", HW, device.hwVersion());
+        assertEquals("incorrect sw", SW, device.swVersion());
+        assertEquals("incorrect serial", SN1, device.serialNumber());
+        assertEquals("incorrect serial", SN1, device.serialNumber());
+    }
+
+}
diff --git a/net/api/src/test/java/org/onlab/onos/net/device/DefaultDeviceDescriptionTest.java b/net/api/src/test/java/org/onlab/onos/net/device/DefaultDeviceDescriptionTest.java
new file mode 100644
index 0000000..9d06edf
--- /dev/null
+++ b/net/api/src/test/java/org/onlab/onos/net/device/DefaultDeviceDescriptionTest.java
@@ -0,0 +1,36 @@
+package org.onlab.onos.net.device;
+
+import org.junit.Test;
+
+import java.net.URI;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.onlab.onos.net.Device.Type.SWITCH;
+
+/**
+ * Test of the default device description.
+ */
+public class DefaultDeviceDescriptionTest {
+
+    private static final URI DURI = URI.create("of:foo");
+    private static final String MFR = "whitebox";
+    private static final String HW = "1.1.x";
+    private static final String SW = "3.9.1";
+    private static final String SN = "43311-12345";
+
+
+    @Test
+    public void basics() {
+        DeviceDescription device =
+                new DefaultDeviceDescription(DURI, SWITCH, MFR, HW, SW, SN);
+        assertEquals("incorrect uri", DURI, device.deviceURI());
+        assertEquals("incorrect type", SWITCH, device.type());
+        assertEquals("incorrect manufacturer", MFR, device.manufacturer());
+        assertEquals("incorrect hw", HW, device.hwVersion());
+        assertEquals("incorrect sw", SW, device.swVersion());
+        assertEquals("incorrect serial", SN, device.serialNumber());
+        assertTrue("incorrect toString", device.toString().contains("uri=of:foo"));
+    }
+
+}