diff --git a/osam-common/pom.xml b/osam-common/pom.xml
new file mode 100644
index 0000000..c2311ce
--- /dev/null
+++ b/osam-common/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--/*-
+        * ============LICENSE_START=======================================================
+        * OSAM Core
+        * ================================================================================
+        * Copyright (C) 2018 Netsia
+        * ================================================================================
+        * 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.
+        * ============LICENSE_END=========================================================
+        */-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <groupId>org.onap.osam</groupId>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>osam-common</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <properties>
+        <swagger.version>2.8.0</swagger.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.9.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.16.22</version>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/osam-common/src/main/java/org/onap/osam/common/dto/AccessPodDTO.java b/osam-common/src/main/java/org/onap/osam/common/dto/AccessPodDTO.java
new file mode 100644
index 0000000..6041d58
--- /dev/null
+++ b/osam-common/src/main/java/org/onap/osam/common/dto/AccessPodDTO.java
@@ -0,0 +1,81 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 01.10.2018.
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonRootName("AccessPod")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel
+public class AccessPodDTO {
+    @ApiModelProperty(hidden = true)
+    private Long id;
+    @ApiModelProperty(required = true)
+    private String pnfId;
+    @ApiModelProperty(required = true, value="IP address of Abstract OLT for this POD")
+    private String ip;
+    @ApiModelProperty(required = true, value="GRPC Port of Abstract OLT for this POD")
+    private String port;
+    @ApiModelProperty(required = true, value="IP address of a SEBA POD")
+    private String coreIp;
+    @ApiModelProperty(required = true, value="Port of a SEBA POD")
+    private String corePort;
+    @ApiModelProperty(required = true, value="XOS Username of a SEBA POD")
+    private String username;
+    @ApiModelProperty(required = true, value="XOS Password of a SEBA POD")
+    private String password;
+    @ApiModelProperty(hidden = true)
+    private List<ChassisDTO> chassises;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("AccessPodDTO{");
+        sb.append("id=").append(id);
+        sb.append(", pnfId='").append(pnfId).append('\'');
+        sb.append(", ip='").append(ip).append('\'');
+        sb.append(", port='").append(port).append('\'');
+        sb.append(", coreIp='").append(coreIp).append('\'');
+        sb.append(", corePort='").append(corePort).append('\'');
+        sb.append(", username='").append(username).append('\'');
+        sb.append(", password='").append(password).append('\'');
+        sb.append(", chassises=").append(chassises);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-common/src/main/java/org/onap/osam/common/dto/ChassisDTO.java b/osam-common/src/main/java/org/onap/osam/common/dto/ChassisDTO.java
new file mode 100644
index 0000000..9f7d561
--- /dev/null
+++ b/osam-common/src/main/java/org/onap/osam/common/dto/ChassisDTO.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonRootName("Chassis")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel
+public class ChassisDTO {
+    @ApiModelProperty(hidden = true)
+    private Long id;
+    @ApiModelProperty(required = true, value="CLLI of the chassis")
+    private String clli;
+    @ApiModelProperty(required = true, value="PNF ID of the POD on top of which this chassis is registered")
+    private String pnfId;
+    @ApiModelProperty(required = true, value="Shelf number for this chassis")
+    private int shelf;
+    @ApiModelProperty(required = true, value="Rack number for this chassis")
+    private int rack;
+    @ApiModelProperty(hidden = true)
+    private List<OLTChassisDTO> olts;
+}
diff --git a/osam-common/src/main/java/org/onap/osam/common/dto/OLTChassisDTO.java b/osam-common/src/main/java/org/onap/osam/common/dto/OLTChassisDTO.java
new file mode 100644
index 0000000..a7bae08
--- /dev/null
+++ b/osam-common/src/main/java/org/onap/osam/common/dto/OLTChassisDTO.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.nio.file.AccessMode;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonRootName("OLT")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel
+public class OLTChassisDTO {
+    @ApiModelProperty(hidden = true)
+    private Long id;
+    @ApiModelProperty(required = true, value="CLLI of the chassis on top of which this OLT-specific chassis is registered")
+    private String clli;
+    @ApiModelProperty(required = true, allowableValues = "OPENOLT, ASFVOLT16, ADTRAN, TIBITS", value="OLT Driver for this OLT-specific chassis")
+    private String oltDriver;
+    @ApiModelProperty(required = true, allowableValues = "EDGECORE, ADTRAN, TIBITS", value="OLT Type for this OLT-specific chassis")
+    private String oltType;
+    @ApiModelProperty(required = true, value="Number of ports for this OLT-specific chassis")
+    private int portNumber;
+    @ApiModelProperty(required = true, value="IP address of this OLT-specific chassis")
+    private String ipAddress;
+    @ApiModelProperty(required = true, value="Name of this OLT-specific chassis")
+    private String name;
+    @ApiModelProperty(hidden = true)
+    private List<OLTPortDTO> oltPorts;
+}
diff --git a/osam-common/src/main/java/org/onap/osam/common/dto/OLTPortDTO.java b/osam-common/src/main/java/org/onap/osam/common/dto/OLTPortDTO.java
new file mode 100644
index 0000000..5ad32f6
--- /dev/null
+++ b/osam-common/src/main/java/org/onap/osam/common/dto/OLTPortDTO.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+//import org.onap.osam.model.dao.ActivityState;
+//import org.onap.osam.model.dao.AdminState;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 03.10.2018.
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonRootName("OLTPort")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class OLTPortDTO {
+    private Long id;
+    private Integer portNumber;
+    private /*ActivityState*/ String portAuthState;
+    private /*AdminState*/ String adminState;
+    private List<ONTDTO> ontDevices;
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("OLTPortDTO{");
+        sb.append("id=").append(id);
+        sb.append(", portNumber=").append(portNumber);
+        sb.append(", portAuthState=").append(portAuthState);
+        sb.append(", adminState=").append(adminState);
+        sb.append(", ontDevices=").append(ontDevices);
+        sb.append('}');
+        return sb.toString();
+    }
+}
diff --git a/osam-common/src/main/java/org/onap/osam/common/dto/ONTDTO.java b/osam-common/src/main/java/org/onap/osam/common/dto/ONTDTO.java
new file mode 100644
index 0000000..6800bae
--- /dev/null
+++ b/osam-common/src/main/java/org/onap/osam/common/dto/ONTDTO.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * OSAM Core
+ * ================================================================================
+ * Copyright (C) 2018 Netsia
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+
+
+package org.onap.osam.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonRootName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonRootName("ONTDevice")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@ApiModel
+public class ONTDTO {
+    @ApiModelProperty(hidden = true)
+    private Long id;
+    @ApiModelProperty(required = true, value="CLLI of the chassis on top of which this ONT device is registered")
+    private String clli;
+    @ApiModelProperty(required = true, value="Serial number of this ONT device")
+    private String serialNumber;
+    @ApiModelProperty(required = true, value="OLT Slot number of this ONT device")
+    private int slotNumber;
+    @ApiModelProperty(required = true, value="OLT Port number of this ONT device")
+    private int portNumber;
+    private int ontNumber;
+    private int stag;
+    private int ctag;
+    private String nasPortId;
+    private String circuitId;
+    private String technologyProfile;
+    private String speedProfile;
+}
