diff --git a/osam-core/core/pom.xml b/osam-core/core/pom.xml
new file mode 100644
index 0000000..1db7193
--- /dev/null
+++ b/osam-core/core/pom.xml
@@ -0,0 +1,39 @@
+<?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">
+    <parent>
+        <artifactId>osam-core</artifactId>
+        <groupId>org.onap.osam</groupId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>core</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.osam</groupId>
+            <artifactId>external</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java
new file mode 100644
index 0000000..ef69df9
--- /dev/null
+++ b/osam-core/core/src/main/java/org/onap/osam/core/AbstractBaseServiceImpl.java
@@ -0,0 +1,72 @@
+/*-
+ * ============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.core;
+
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.model.dao.BaseEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.repository.CrudRepository;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+
+public abstract class AbstractBaseServiceImpl {
+
+    protected Logger log = LoggerFactory.getLogger(this.getClass());
+
+    protected <T extends BaseEntity> T add(T t, CrudRepository<T, Long> repository) {
+        t = repository.save(t);
+        log.info("{} is added",t);
+        return t;
+    }
+
+    protected <T extends BaseEntity> void remove(Long id, CrudRepository<T, Long> repository, Class classz) {
+        repository.deleteById(id);
+        log.info("{} is deleted for {}", id, classz.getName());
+    }
+
+    protected <T extends BaseEntity> T get(Long id, CrudRepository<T, Long> repository) {
+        Optional<T> optional = repository.findById(id);
+        if (!optional.isPresent()) {
+            throw new NotFoundException("id:"+id+" is not found");
+        }
+        return optional.get();
+    }
+
+    protected <T extends BaseEntity> List<T> getAll(CrudRepository<T, Long> repository) {
+        List<T> ts = new ArrayList<>();
+        repository.findAll().iterator().forEachRemaining(ts::add);
+        return Collections.unmodifiableList(ts);
+    }
+
+    protected <T extends BaseEntity> Long count(CrudRepository<T, Long> repository) {
+        return repository.count();
+    }
+}
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
new file mode 100644
index 0000000..b3e00c5
--- /dev/null
+++ b/osam-core/core/src/main/java/org/onap/osam/core/AccessPodServiceImpl.java
@@ -0,0 +1,95 @@
+/*-
+ * ============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.core;
+
+import org.onap.osam.external.aai.AaiClient;
+import org.onap.osam.external.aai.model.PNF;
+import org.onap.osam.model.dao.AccessPod;
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.model.repository.AccessPodRepository;
+import org.onap.osam.api.service.AccessPodService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by cemturker on 26.09.2018.
+ */
+@Service
+public class AccessPodServiceImpl extends AbstractBaseServiceImpl implements AccessPodService {
+
+    private AccessPodRepository accessPodRepository;
+
+    private AaiClient aaiClient;
+
+    @Autowired
+    public AccessPodServiceImpl(AccessPodRepository accessPodRepository, AaiClient aaiClient) {
+        this.accessPodRepository = accessPodRepository;
+        this.aaiClient = aaiClient;
+    }
+
+
+    @Override
+    public AccessPod addOrUpdate(AccessPod value) {
+        PNF pnf = aaiClient.queryPnf(value.getPnfId());
+        Optional<AccessPod> accessPodOptional = accessPodRepository.findByPnfId(pnf.getPnfId());
+        if (accessPodOptional.isPresent()) {
+            AccessPod tmp = accessPodOptional.get();
+            value.setId(tmp.getId());
+        }
+        add(value,accessPodRepository);
+        //TODO need to update connection to grpc!!
+        return value;
+    }
+
+    @Override
+    public void removeById(Long key) {
+        remove(key,accessPodRepository,AccessPod.class);
+    }
+
+    @Override
+    public AccessPod getById(Long key) {
+        return get(key,accessPodRepository);
+    }
+
+    @Override
+    public List<AccessPod> getAll() {
+        return getAll(accessPodRepository);
+    }
+
+    @Override
+    public AccessPod findByPnfId(String pnfId) {
+        Optional<AccessPod> accessPodOp = accessPodRepository.findByPnfId(pnfId);
+        if (!accessPodOp.isPresent()) {
+            throw new NotFoundException("pnfId:"+pnfId+ " is not found");
+        }
+        return accessPodOp.get();
+    }
+
+    @Override
+    public void removeByPnfId(String pnfId) {
+        accessPodRepository.removeByPnfId(pnfId);
+    }
+}
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java
new file mode 100644
index 0000000..57aa5f1
--- /dev/null
+++ b/osam-core/core/src/main/java/org/onap/osam/core/AlarmServiceImpl.java
@@ -0,0 +1,78 @@
+/*-
+ * ============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.core;
+
+import org.onap.osam.model.dao.AlarmsAndEvents;
+import org.onap.osam.api.service.AlarmService;
+import org.onap.osam.common.exception.UnknownTypeException;
+import org.onap.osam.model.dao.ActiveAlarmsAndEvents;
+import org.onap.osam.model.dao.HistoricalAlarmsAndEvents;
+import org.onap.osam.model.repository.ActiveAlarmsAndEventsRepository;
+import org.onap.osam.model.repository.HistoricalAlarmsAndEventsRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class AlarmServiceImpl extends AbstractBaseServiceImpl implements AlarmService {
+
+    ActiveAlarmsAndEventsRepository activeAlarmsAndEventsRepository;
+    HistoricalAlarmsAndEventsRepository historicalAlarmsAndEventsRepository;
+
+    @Autowired
+    public AlarmServiceImpl(ActiveAlarmsAndEventsRepository activeAlarmsAndEventsRepository,
+                            HistoricalAlarmsAndEventsRepository historicalAlarmsAndEventsRepository){
+        this.activeAlarmsAndEventsRepository = activeAlarmsAndEventsRepository;
+        this.historicalAlarmsAndEventsRepository = historicalAlarmsAndEventsRepository;
+    }
+
+    @Override
+    public List<ActiveAlarmsAndEvents> getActiveAlarmsAndEventsByDate(Date startDate, Date endDate) {
+        return activeAlarmsAndEventsRepository.findAllActiveAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual
+                (endDate,startDate);
+    }
+
+    @Override
+    public List<HistoricalAlarmsAndEvents> getHistoricalAlarmsAndEventsByDate(Date startDate, Date endDate) {
+        return historicalAlarmsAndEventsRepository.findAllHistoricalAlarmsAndEventsByDateLessThanEqualAndDateGreaterThanEqual(endDate,startDate);
+
+    }
+
+    @Override
+    public void addOrUpdate(AlarmsAndEvents alarmsAndEvents) {
+       switch (alarmsAndEvents.getAlarmStatus()){
+           case ACTIVE:
+               add(new ActiveAlarmsAndEvents(alarmsAndEvents),activeAlarmsAndEventsRepository);
+               add(new HistoricalAlarmsAndEvents(alarmsAndEvents),historicalAlarmsAndEventsRepository);
+               break;
+           case DEACTIVE:
+               remove(alarmsAndEvents.getId(),activeAlarmsAndEventsRepository,AlarmsAndEvents.class);
+               add(new HistoricalAlarmsAndEvents(alarmsAndEvents) ,historicalAlarmsAndEventsRepository);
+               break;
+           default:
+               throw new UnknownTypeException("alarm status is unknown" + alarmsAndEvents.getAlarmStatus());
+       }
+    }
+}
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java
new file mode 100644
index 0000000..fa0fdbc
--- /dev/null
+++ b/osam-core/core/src/main/java/org/onap/osam/core/BroadBandServiceImpl.java
@@ -0,0 +1,115 @@
+/*-
+ * ============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.core;
+
+import org.onap.osam.model.dao.SpeedProfile;
+import org.onap.osam.model.dao.Service;
+import org.onap.osam.model.dao.TechnologyProfile;
+import org.onap.osam.model.repository.ServiceRepository;
+import org.onap.osam.model.repository.SpeedProfileRepository;
+import org.onap.osam.model.repository.TechnologyProfileRepository;
+import org.onap.osam.api.service.BroadBandService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@org.springframework.stereotype.Service
+public class BroadBandServiceImpl extends AbstractBaseServiceImpl implements BroadBandService {
+    private SpeedProfileRepository speedProfileRepository;
+    private TechnologyProfileRepository technologyProfileRepository;
+    private ServiceRepository serviceRepository;
+
+    @Autowired
+    public BroadBandServiceImpl(SpeedProfileRepository speedProfileRepository,
+                                TechnologyProfileRepository technologyProfileRepository,
+                                ServiceRepository serviceRepository) {
+        super();
+        this.speedProfileRepository = speedProfileRepository;
+        this.technologyProfileRepository = technologyProfileRepository;
+        this.serviceRepository = serviceRepository;
+    }
+
+    @Override
+    public SpeedProfile addSpeedProfile(SpeedProfile speedProfile) {
+        return add(speedProfile, speedProfileRepository);
+    }
+
+    @Override
+    public TechnologyProfile addTechnologyProfile(TechnologyProfile technologyProfile) {
+        return add(technologyProfile,technologyProfileRepository);
+    }
+
+    @Override
+    public Service addService(Service service) {
+        return add(service,serviceRepository);
+    }
+
+    @Override
+    public void removeSpeedProfile(Long id) {
+        remove(id, speedProfileRepository, SpeedProfile.class);
+
+    }
+
+    @Override
+    public void removeTechnologyProfile(Long id) {
+        remove(id, technologyProfileRepository, TechnologyProfile.class);
+    }
+
+    @Override
+    public void removeService(Long id) {
+        remove(id, serviceRepository, Service.class);
+    }
+
+    @Override
+    public SpeedProfile getSpeedProfile(Long id) {
+        return get(id, speedProfileRepository);
+    }
+
+    @Override
+    public TechnologyProfile getTechnologyProfile(Long id) {
+        return get(id, technologyProfileRepository);
+    }
+
+    @Override
+    public Service getService(Long id) {
+        return get(id, serviceRepository);
+    }
+
+    @Override
+    public List<SpeedProfile> getSpeedProfiles() {
+        return getAll(speedProfileRepository);
+    }
+
+    @Override
+    public List<TechnologyProfile> getTechnologyProfiles() {
+        return getAll(technologyProfileRepository);
+    }
+
+    @Override
+    public List<Service> getServices() {
+        return getAll(serviceRepository);
+    }
+}
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
new file mode 100644
index 0000000..610e217
--- /dev/null
+++ b/osam-core/core/src/main/java/org/onap/osam/core/DeviceServiceImpl.java
@@ -0,0 +1,274 @@
+/*-
+ * ============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.core;
+
+import com.google.common.collect.Lists;
+import org.onap.osam.api.service.AccessPodService;
+import org.onap.osam.common.exception.InvalidOperationException;
+import org.onap.osam.common.exception.NotFoundException;
+import org.onap.osam.api.service.DeviceService;
+import org.onap.osam.external.grpc.AbstractOLTClient;
+import org.onap.osam.model.dao.*;
+import org.onap.osam.model.repository.ChassisRepository;
+import org.onap.osam.model.repository.OLTPortRepository;
+import org.onap.osam.model.repository.OLTSlotRepository;
+import org.onap.osam.model.repository.ONTDeviceRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Created by Zafer Kaban on 18.09.2018.
+ */
+@Service
+public class DeviceServiceImpl extends AbstractBaseServiceImpl implements DeviceService {
+
+    private ChassisRepository chassisRepository;
+    private OLTPortRepository oltPortRepository;
+    private OLTSlotRepository oltSlotRepository;
+    private ONTDeviceRepository ontDeviceRepository;
+    private AbstractOLTClient abstractOLTClient;
+    private AccessPodService accessPodService;
+
+    public static int NUMBER_OF_OLT_PORTS   = 16;
+    public static int NUMBER_OF_ONT_DEVICES = 64;
+
+    @Autowired
+    public DeviceServiceImpl(ChassisRepository chassisRepository,
+                             OLTPortRepository oltPortRepository,
+                             OLTSlotRepository oltSlotRepository,
+                             ONTDeviceRepository ontDeviceRepository,
+                             AbstractOLTClient abstractOLTClient,
+                             AccessPodService accessPodService) {
+        this.chassisRepository = chassisRepository;
+        this.oltPortRepository = oltPortRepository;
+        this.oltSlotRepository = oltSlotRepository;
+        this.ontDeviceRepository = ontDeviceRepository;
+        this.abstractOLTClient = abstractOLTClient;
+        this.accessPodService = accessPodService;
+    }
+
+    @Override
+    public Chassis addChassis(Chassis chassis) {
+        AccessPod accessPod = accessPodService.findByPnfId(chassis.getAccessPod().getPnfId());
+        chassis.setAccessPod(accessPod);
+        String deviceId = abstractOLTClient.createChassis(chassis);
+        if (deviceId != null) {
+            return add(chassis, chassisRepository);
+        }
+        return null;
+    }
+
+    @Override
+    public void deleteChassis(Long id) {
+        remove(id, chassisRepository,Chassis.class);
+    }
+
+    public void deleteChassisByClli(String clli) {
+        Optional<Chassis> chassis = chassisRepository.findByClli(clli);
+        if (chassis.isPresent()){
+            Long id = chassis.get().getId();
+            remove(id, chassisRepository,Chassis.class);
+        }
+    }
+
+    @Override
+    public Chassis getChassisById(Long id) {
+        Optional<Chassis> chassis = chassisRepository.findById(id);
+        if (chassis.isPresent()) {
+            return chassis.get();
+        }
+        return null;
+    }
+
+    @Override
+    public Chassis getChassisByClli(String clli) {
+        Optional<Chassis> chassis = chassisRepository.findByClli(clli);
+        if (chassis.isPresent()) {
+            return chassis.get();
+        }
+        return null;
+    }
+
+    @Override
+    public Long getChassisCount() {
+        return chassisRepository.count();
+    }
+
+    @Override
+    public List<Chassis> getByPnfId(String pnfId) {
+        Optional<List<Chassis>> chassisList = chassisRepository.findByAccessPodPnfId(pnfId);
+        if (!chassisList.isPresent()) {
+            throw new NotFoundException("Chassis is not found with "+pnfId + ":pnfId");
+        }
+        return chassisList.get();
+    }
+
+    @Override
+    public List<Chassis> getAllChassis() {
+        return Lists.newArrayList(chassisRepository.findAll());
+    }
+
+    @Override
+    public OLTSlot addOLTSlot(OLTSlot oltSlot, Chassis chassis) {
+        Set<OLTSlot> oltSlots = chassis.getOltSlots();
+        int size = oltSlots.size();
+        if (size == NUMBER_OF_OLT_PORTS) {
+            throw new InvalidOperationException("Maximum number of OLTs exceeded");
+        }
+        oltSlot.setNumber(size+1);
+        oltSlot.setAdminState(AdminState.ENABLED);
+        oltSlot.setOperationalState(ActivityState.ACTIVE);
+        oltSlot.setPortAuthState(ActivityState.ACTIVE);
+        String deviceId = abstractOLTClient.createOLTChassis(oltSlot);
+        if (deviceId != null) {
+            oltSlot.setChassis(chassis);
+            add(oltSlot, oltSlotRepository);
+            for (int j = 0; j < 16 ; j++) {
+                OLTPort oltPort = new OLTPort();
+                oltPort.setOltSlot(oltSlot);
+                oltPort.setPortNumber(j+1);
+                oltPort.setAdminState(AdminState.ENABLED);
+                oltPort.setPortAuthState(ActivityState.ACTIVE);
+                add(oltPort, oltPortRepository);
+            }
+            if (oltSlots.isEmpty()) {
+                oltSlots = new HashSet<>();
+            }
+            oltSlots.add(oltSlot);
+            chassis.setOltSlots(oltSlots);
+            chassisRepository.save(chassis);
+        }
+        return oltSlot;
+    }
+
+    @Override
+    public void deleteOLTSlot(Long id) {
+        oltSlotRepository.deleteById(id);
+    }
+
+    @Override
+    public OLTSlot getOLTSlotById(Long id) {
+        Optional<OLTSlot> oltSlot = oltSlotRepository.findById(id);
+        if (oltSlot.isPresent()) {
+            return oltSlot.get();
+        }
+        return null;
+    }
+
+    @Override
+    public OLTSlot getOLTSlotBySerialNumber(String serialNumber) {
+        Optional<OLTSlot> oltSlot = oltSlotRepository.findBySerialNumber(serialNumber);
+        if (oltSlot.isPresent()) {
+            return oltSlot.get();
+        }
+        return null;
+    }
+
+    @Override
+    public List<OLTSlot> getAllOLTSlots() {
+        return Lists.newArrayList(oltSlotRepository.findAll());
+    }
+
+    @Override
+    public void deleteOLTPort(Long id) {
+        oltPortRepository.deleteById(id);
+    }
+
+    @Override
+    public OLTPort getOLTPortById(Long id) {
+        Optional<OLTPort> oltPort = oltPortRepository.findById(id);
+        if (oltPort.isPresent()) {
+            return oltPort.get();
+        }
+        return null;
+    }
+
+    @Override
+    public ONTDevice addONTDevice(String clli, int slotNumber, int portNumber, String serialNumber){
+        ONTDevice ont = null;
+        Optional<OLTPort> thePort = oltPortRepository.findByPortNumberAndOltSlot_NumberAndOltSlot_ChassisClli(portNumber,slotNumber,clli);
+        if (thePort.isPresent()) {
+            OLTPort port = thePort.get();
+            log.info("Port found : {}", thePort);
+            Set<ONTDevice> ontDevices = port.getOntDevices();
+            int size = ontDevices.size();
+            if (size == NUMBER_OF_ONT_DEVICES) {
+                throw new InvalidOperationException("Maximum number of ONTs exceeded");
+            }
+            int ontNumber = size+1;
+            boolean result =  abstractOLTClient.provisionONT(clli, slotNumber, portNumber,ontNumber,serialNumber);
+            if (result){
+                ont = new ONTDevice();
+                ont.setSerialNumber(serialNumber);
+                ont.setNumber(ontNumber);
+                ont.setOLTPort(port);
+                ont.setAdminState(AdminState.ENABLED);
+                ont.setOperationalState(ActivityState.ACTIVE);
+                ont.setPortAuthState(ActivityState.ACTIVE);
+                add(ont,ontDeviceRepository);
+                ontDevices.add(ont);
+                oltPortRepository.save(port);
+            } else {
+                log.error("Error rpc failed");
+                throw new NotFoundException("Operation failed");
+            }
+        } else {
+            log.error("Port not found");
+            throw new NotFoundException("Operation failed");
+        }
+        return ont;
+    }
+
+    @Override
+    public void deleteONTDevice(Long id) {
+        ontDeviceRepository.deleteById(id);
+    }
+
+    @Override
+    public ONTDevice getONTDeviceById(Long id) {
+        Optional<ONTDevice> ontDevice = ontDeviceRepository.findById(id);
+        if (ontDevice.isPresent()) {
+            ontDevice.get();
+        }
+        return null;
+    }
+
+    @Override
+    public ONTDevice getONTDeviceBySerialNumber(String serialNumber) {
+        Optional<ONTDevice> ontDevice = ontDeviceRepository.findBySerialNumber(serialNumber);
+        if (ontDevice.isPresent()) {
+            ontDevice.get();
+        }
+        return null;
+    }
+
+    @Override
+    public List<ONTDevice> getAllONTDevices() {
+        return Lists.newArrayList(ontDeviceRepository.findAll());
+    }
+}
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java
new file mode 100644
index 0000000..b1e3f29
--- /dev/null
+++ b/osam-core/core/src/main/java/org/onap/osam/core/PmConfigsServiceImpl.java
@@ -0,0 +1,104 @@
+/*-
+ * ============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.core;
+
+import org.onap.osam.model.repository.PmConfigsRepository;
+import org.onap.osam.model.dao.PmConfig;
+import org.onap.osam.model.dao.PmConfigs;
+import org.onap.osam.model.dao.PmGroupConfig;
+import org.onap.osam.model.repository.PmConfigRepository;
+import org.onap.osam.model.repository.PmGroupConfigRepository;
+import org.onap.osam.api.service.PmConfigsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class PmConfigsServiceImpl extends AbstractBaseServiceImpl implements PmConfigsService{
+
+    protected PmConfigRepository pmConfigRepository;
+    protected PmConfigsRepository pmConfigsRepository;
+    protected PmGroupConfigRepository pmGroupConfigRepository;
+
+    @Autowired
+    public PmConfigsServiceImpl(PmConfigRepository pmConfigRepository,PmConfigsRepository pmConfigsRepository,
+                                PmGroupConfigRepository pmGroupConfigRepository){
+
+        this.pmConfigRepository=pmConfigRepository;
+        this.pmGroupConfigRepository=pmGroupConfigRepository;
+        this.pmConfigsRepository=pmConfigsRepository;
+    }
+
+
+    @Override
+    public List<PmConfig> getPmConfigByPmConfigsId(Long pmConfigsId) {
+        return pmConfigRepository.getByPmConfigs_Id(pmConfigsId);
+    }
+
+    @Override
+    public List<PmConfig> getPmConfigByPmConfigGroupId(Long pmGroupConfigsId) {
+        return pmConfigRepository.getByPmGroupConfig_Id(pmGroupConfigsId);
+    }
+
+    @Override
+    public void addPmGroupConfig(PmConfig pmConfig) {
+        add(pmConfig,pmConfigRepository);
+    }
+
+    @Override
+    public void addPmGroupConfig(PmGroupConfig pmGroupConfig) {
+        add(pmGroupConfig,pmGroupConfigRepository);
+    }
+
+    @Override
+    public void removePmConfig(Long pmConfigId) {
+        remove(pmConfigId,pmConfigRepository,PmConfig.class);
+    }
+
+    @Override
+    public void removeGroupPmConfig(Long pmGroupConfigId) {
+        remove(pmGroupConfigId,pmGroupConfigRepository,PmGroupConfig.class);
+    }
+
+
+    @Override
+    public PmConfigs addOrUpdate(PmConfigs value) {
+        return add(value,pmConfigsRepository);
+    }
+
+    @Override
+    public void removeById(Long key) {
+        remove(key,pmConfigsRepository,PmConfigs.class);
+    }
+
+    @Override
+    public PmConfigs getById(Long key) {
+        return get(key,pmConfigsRepository);
+    }
+
+    @Override
+    public List<PmConfigs> getAll() {
+        return getAll(pmConfigsRepository);
+    }
+}
diff --git a/osam-core/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java b/osam-core/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java
new file mode 100644
index 0000000..e295655
--- /dev/null
+++ b/osam-core/core/src/main/java/org/onap/osam/core/SubscriberServiceImpl.java
@@ -0,0 +1,71 @@
+/*-
+ * ============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.core;
+
+import org.onap.osam.model.dao.Subscriber;
+import org.onap.osam.model.repository.SubscriberRepository;
+import org.onap.osam.api.service.SubscriberService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Created by cemturker on 18.09.2018.
+ */
+@Service
+public class SubscriberServiceImpl extends AbstractBaseServiceImpl implements SubscriberService {
+
+    private SubscriberRepository subscriberRepository;
+
+    @Autowired
+    public SubscriberServiceImpl(SubscriberRepository subscriberRepository) {
+        this.subscriberRepository = subscriberRepository;
+    }
+
+    @Override
+    public Subscriber addOrUpdate(Subscriber subscriber) {
+        //TODO Add Check the devices.....
+        return add(subscriber, subscriberRepository);
+    }
+
+    @Override
+    public void removeById(Long id) {
+        remove(id, subscriberRepository, Subscriber.class);
+    }
+
+    @Override
+    public Subscriber getById(Long id) {
+        return get(id, subscriberRepository);
+    }
+
+    @Override
+    public List<Subscriber> getAll() {
+        return getAll(subscriberRepository);
+    }
+
+    @Override
+    public Subscriber getBySubscriberIdentifier(String userIdentifier) {
+        return subscriberRepository.findByUserIdentifier(userIdentifier);
+    }
+}
