diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sIpam.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sIpam.java
new file mode 100644
index 0000000..cb488b3
--- /dev/null
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sIpam.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.k8snetworking.api;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import org.onlab.packet.IpAddress;
+
+/**
+ * Default implementation of kubernetes IPAM instance.
+ */
+public final class DefaultK8sIpam implements K8sIpam {
+
+    private final IpAddress ipAddress;
+    private final String networkId;
+
+    // private constructor not intended for external invocation
+    public DefaultK8sIpam(IpAddress ipAddress, String networkId) {
+        this.ipAddress = ipAddress;
+        this.networkId = networkId;
+    }
+
+    @Override
+    public IpAddress ipAddress() {
+        return ipAddress;
+    }
+
+    @Override
+    public String networkId() {
+        return networkId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        DefaultK8sIpam that = (DefaultK8sIpam) o;
+        return Objects.equal(ipAddress, that.ipAddress) &&
+                Objects.equal(networkId, that.networkId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(ipAddress, networkId);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("ipAddress", ipAddress)
+                .add("networkId", networkId)
+                .toString();
+    }
+}
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sNetwork.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sNetwork.java
new file mode 100644
index 0000000..3ac1230
--- /dev/null
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sNetwork.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.k8snetworking.api;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import org.onlab.packet.IpAddress;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Default implementation of kubernetes network.
+ */
+public final class DefaultK8sNetwork implements K8sNetwork {
+
+    private static final int DEFAULT_MTU = 1500;
+
+    private final String networkId;
+    private final Type type;
+    private final Integer mtu;
+    private final String segmentId;
+    private final IpAddress gatewayIp;
+    private final String cidr;
+
+    private static final String NOT_NULL_MSG = "Network % cannot be null";
+
+    // private constructor not intended for external invocation
+    private DefaultK8sNetwork(String networkId, Type type, Integer mtu,
+                              String segmentId, IpAddress gatewayIp, String cidr) {
+        this.networkId = networkId;
+        this.type = type;
+        this.mtu = mtu;
+        this.segmentId = segmentId;
+        this.gatewayIp = gatewayIp;
+        this.cidr = cidr;
+    }
+
+    @Override
+    public String networkId() {
+        return networkId;
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    @Override
+    public Integer mtu() {
+        return mtu;
+    }
+
+    @Override
+    public String segmentId() {
+        return segmentId;
+    }
+
+    @Override
+    public IpAddress gatewayIp() {
+        return gatewayIp;
+    }
+
+    @Override
+    public String cidr() {
+        return cidr;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        DefaultK8sNetwork that = (DefaultK8sNetwork) o;
+        return Objects.equal(networkId, that.networkId) &&
+                type == that.type &&
+                Objects.equal(mtu, that.mtu) &&
+                Objects.equal(segmentId, that.segmentId) &&
+                Objects.equal(gatewayIp, that.gatewayIp) &&
+                Objects.equal(cidr, that.cidr);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(networkId, type, mtu, segmentId, gatewayIp, cidr);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("networkId", networkId)
+                .add("type", type)
+                .add("mtu", mtu)
+                .add("segmentId", segmentId)
+                .add("gatewayIp", gatewayIp)
+                .add("cidr", cidr)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return kubernetes network builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Default implementation of kubernetes network builder.
+     */
+    public static final class Builder implements K8sNetwork.Builder {
+
+        private String networkId;
+        private Type type;
+        private Integer mtu;
+        private String segmentId;
+        private IpAddress gatewayIp;
+        private String cidr;
+
+        @Override
+        public K8sNetwork build() {
+            checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
+            checkArgument(type != null, NOT_NULL_MSG, "type");
+            checkArgument(segmentId != null, NOT_NULL_MSG, "segmentId");
+            checkArgument(gatewayIp != null, NOT_NULL_MSG, "gatewayIp");
+            checkArgument(cidr != null, NOT_NULL_MSG, "cidr");
+
+            if (mtu == null) {
+                mtu = DEFAULT_MTU;
+            }
+
+            return new DefaultK8sNetwork(networkId, type, mtu, segmentId, gatewayIp, cidr);
+        }
+
+        @Override
+        public Builder networkId(String networkId) {
+            this.networkId = networkId;
+            return this;
+        }
+
+        @Override
+        public Builder type(Type type) {
+            this.type = type;
+            return this;
+        }
+
+        @Override
+        public Builder mtu(Integer mtu) {
+            this.mtu = mtu;
+            return this;
+        }
+
+        @Override
+        public Builder segmentId(String segmentId) {
+            this.segmentId = segmentId;
+            return this;
+        }
+
+        @Override
+        public Builder gatewayIp(IpAddress ipAddress) {
+            this.gatewayIp = ipAddress;
+            return this;
+        }
+
+        @Override
+        public Builder cidr(String cidr) {
+            this.cidr = cidr;
+            return this;
+        }
+    }
+}
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sPort.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sPort.java
new file mode 100644
index 0000000..e545f69
--- /dev/null
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sPort.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.k8snetworking.api;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Default implementation of kubernetes port.
+ */
+public final class DefaultK8sPort implements K8sPort {
+
+    private static final String NOT_NULL_MSG = "Port % cannot be null";
+
+    private final String networkId;
+    private final String portId;
+    private final MacAddress macAddress;
+    private final IpAddress ipAddress;
+    private final DeviceId deviceId;
+    private final PortNumber portNumber;
+    private final State state;
+
+    // private constructor not intended for external invocation
+    private DefaultK8sPort(String networkId, String portId, MacAddress macAddress,
+                           IpAddress ipAddress, DeviceId deviceId,
+                           PortNumber portNumber, State state) {
+        this.networkId = networkId;
+        this.portId = portId;
+        this.macAddress = macAddress;
+        this.ipAddress = ipAddress;
+        this.deviceId = deviceId;
+        this.portNumber = portNumber;
+        this.state = state;
+    }
+
+    @Override
+    public String networkId() {
+        return networkId;
+    }
+
+    @Override
+    public String portId() {
+        return portId;
+    }
+
+    @Override
+    public MacAddress macAddress() {
+        return macAddress;
+    }
+
+    @Override
+    public IpAddress ipAddress() {
+        return ipAddress;
+    }
+
+    @Override
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    @Override
+    public PortNumber portNumber() {
+        return portNumber;
+    }
+
+    @Override
+    public State state() {
+        return state;
+    }
+
+    @Override
+    public K8sPort updateState(State newState) {
+        return new Builder()
+                .networkId(networkId)
+                .portId(portId)
+                .macAddress(macAddress)
+                .ipAddress(ipAddress)
+                .deviceId(deviceId)
+                .portNumber(portNumber)
+                .state(newState)
+                .build();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        DefaultK8sPort that = (DefaultK8sPort) o;
+        return Objects.equal(networkId, that.networkId) &&
+                Objects.equal(portId, that.portId) &&
+                Objects.equal(macAddress, that.macAddress) &&
+                Objects.equal(ipAddress, that.ipAddress) &&
+                Objects.equal(deviceId, that.deviceId) &&
+                Objects.equal(portNumber, that.portNumber) &&
+                state == that.state;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(networkId, portId, macAddress, ipAddress,
+                deviceId, portNumber, state);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("networkId", networkId)
+                .add("portId", portId)
+                .add("macAddress", macAddress)
+                .add("ipAddress", ipAddress)
+                .add("deviceId", deviceId)
+                .add("portNumber", portNumber)
+                .add("state", state)
+                .toString();
+    }
+
+    /**
+     * Returns new builder instance.
+     *
+     * @return kubernetes port builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Default builder implementation.
+     */
+    public static final class Builder implements K8sPort.Builder {
+
+        private String networkId;
+        private String portId;
+        private MacAddress macAddress;
+        private IpAddress ipAddress;
+        private DeviceId deviceId;
+        private PortNumber portNumber;
+        private State state;
+
+        // private constructor not intended to use from external
+        private Builder() {
+        }
+
+        @Override
+        public K8sPort build() {
+            checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
+            checkArgument(portId != null, NOT_NULL_MSG, "portId");
+            checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
+            checkArgument(ipAddress != null, NOT_NULL_MSG, "ipAddress");
+            checkArgument(deviceId != null, NOT_NULL_MSG, "deviceId");
+            checkArgument(portNumber != null, NOT_NULL_MSG, "portNumber");
+            checkArgument(state != null, NOT_NULL_MSG, "state");
+
+            return new DefaultK8sPort(networkId, portId, macAddress, ipAddress,
+                    deviceId, portNumber, state);
+        }
+
+        @Override
+        public Builder networkId(String networkId) {
+            this.networkId = networkId;
+            return this;
+        }
+
+        @Override
+        public Builder portId(String portId) {
+            this.portId = portId;
+            return this;
+        }
+
+        @Override
+        public Builder macAddress(MacAddress macAddress) {
+            this.macAddress = macAddress;
+            return this;
+        }
+
+        @Override
+        public Builder ipAddress(IpAddress ipAddress) {
+            this.ipAddress = ipAddress;
+            return this;
+        }
+
+        @Override
+        public Builder deviceId(DeviceId deviceId) {
+            this.deviceId = deviceId;
+            return this;
+        }
+
+        @Override
+        public Builder portNumber(PortNumber portNumber) {
+            this.portNumber = portNumber;
+            return this;
+        }
+
+        @Override
+        public Builder state(State state) {
+            this.state = state;
+            return this;
+        }
+    }
+}
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java
index 57f2130..9969f30 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java
@@ -27,7 +27,7 @@
      *
      * @return IP address
      */
-    IpAddress ipaddress();
+    IpAddress ipAddress();
 
     /**
      * Returns the kubernetes network ID.
